From 9ca1f594536c266e56c6cf142d97efc8ae3f4191 Mon Sep 17 00:00:00 2001 From: Maksymilian Knust <m.knust@samsung.com> Date: Tue, 23 Apr 2024 15:06:44 +0200 Subject: [PATCH 001/124] Replaced nlunit-test with pw_unit_test in src/lib/format/ (#33063) * Replaced nlunit-test with pw_unit_test in src/lib/format/ * Restyled by clang-format * Use EXPECT_STREQ --------- Co-authored-by: Restyled.io <commits@restyled.io> --- src/lib/format/tests/BUILD.gn | 5 +- src/lib/format/tests/TestDecoding.cpp | 125 +++++++----------- src/lib/format/tests/TestFlatTree.cpp | 52 +++----- src/lib/format/tests/TestFlatTreePosition.cpp | 98 ++++++-------- 4 files changed, 109 insertions(+), 171 deletions(-) diff --git a/src/lib/format/tests/BUILD.gn b/src/lib/format/tests/BUILD.gn index 64be2e38a3f402..1001a3bd9e77d4 100644 --- a/src/lib/format/tests/BUILD.gn +++ b/src/lib/format/tests/BUILD.gn @@ -14,12 +14,11 @@ import("//build_overrides/build.gni") import("//build_overrides/chip.gni") -import("//build_overrides/nlunit_test.gni") import("${chip_root}/build/chip/chip_test_suite.gni") import("${chip_root}/build/chip/fuzz_test.gni") -chip_test_suite_using_nltest("tests") { +chip_test_suite("tests") { output_name = "libFormatTests" test_sources = [ @@ -40,8 +39,6 @@ chip_test_suite_using_nltest("tests") { "${chip_root}/src/lib/format:flat-tree", "${chip_root}/src/lib/format:protocol-decoder", "${chip_root}/src/lib/format:protocol-tlv-metadata", - "${chip_root}/src/lib/support:testing_nlunit", - "${nlunit_test_root}:nlunit-test", ] } diff --git a/src/lib/format/tests/TestDecoding.cpp b/src/lib/format/tests/TestDecoding.cpp index 0a848e5de8f835..ae5c2efc553fb6 100644 --- a/src/lib/format/tests/TestDecoding.cpp +++ b/src/lib/format/tests/TestDecoding.cpp @@ -17,12 +17,11 @@ #include <lib/core/TLVWriter.h> #include <lib/format/protocol_decoder.h> #include <lib/support/StringBuilder.h> -#include <lib/support/UnitTestRegistration.h> #include <tlv/meta/clusters_meta.h> #include <tlv/meta/protocols_meta.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> #include "sample_data.h" @@ -57,8 +56,7 @@ const std::array<const Node<ItemInfo>, 53 + 2> fake_protocols_meta = { { { 2, _FakeProtocolData }, } }; -void TestSampleData(nlTestSuite * inSuite, const PayloadDecoderInitParams & params, const SamplePayload & data, - const char * expectation) +void TestSampleData(const PayloadDecoderInitParams & params, const SamplePayload & data, const char * expectation) { chip::Decoders::PayloadDecoder<64, 128> decoder( PayloadDecoderInitParams(params).SetProtocol(data.protocolId).SetMessageType(data.messageType)); @@ -130,23 +128,23 @@ void TestSampleData(nlTestSuite * inSuite, const PayloadDecoderInitParams & para printf("ACTUAL: '%s'\n", partial.Reset().Add(output_builder.c_str() + idx).AddMarkerIfOverflow().c_str()); } - NL_TEST_ASSERT(inSuite, strcmp(output_builder.c_str(), expectation) == 0); + EXPECT_STREQ(output_builder.c_str(), expectation); } -void TestFullDataDecoding(nlTestSuite * inSuite, void * inContext) +TEST(TestDecoding, TestFullDataDecoding) { PayloadDecoderInitParams params; params.SetProtocolDecodeTree(chip::TLVMeta::protocols_meta).SetClusterDecodeTree(chip::TLVMeta::clusters_meta); - TestSampleData(inSuite, params, secure_channel_mrp_ack, "mrp_ack: EMPTY\n"); - TestSampleData(inSuite, params, secure_channel_pkbdf_param_request, + TestSampleData(params, secure_channel_mrp_ack, "mrp_ack: EMPTY\n"); + TestSampleData(params, secure_channel_pkbdf_param_request, "pbkdf_param_request\n" " initiator_random: hex:7C8698755B8E9866BB4FFDC27B733F3B6EF7F83D43FBE0CA6AD2B8C52C8F4236\n" " initiator_session_id: 37677\n" " passcode_id: 0\n" " has_pbkdf_parameters: false\n"); - TestSampleData(inSuite, params, secure_channel_pkbdf_param_response, + TestSampleData(params, secure_channel_pkbdf_param_response, "pbkdf_param_response\n" " initiator_random: hex:7C8698755B8E9866BB4FFDC27B733F3B6EF7F83D43FBE0CA6AD2B8C52C8F4236\n" " responder_random: hex:A44EB3E1A751A88A32BAB59EF16EB9764C20E1A9DDBEF6EFE3F588C943C58424\n" @@ -154,24 +152,24 @@ void TestFullDataDecoding(nlTestSuite * inSuite, void * inContext) " pbkdf_parameters\n" " iterations: 1000\n" " salt: hex:E8FC1E6FD0023422B3CA7ECEDD344444551C814D3D0B0EB9C096F00E8A8051B2\n"); - TestSampleData(inSuite, params, secure_channel_pase_pake1, + TestSampleData(params, secure_channel_pase_pake1, // clang-format off "pase_pake1\n" " pA: hex:0422ABC7A84352850456BD4A510905FE6BB782A0863A9382550E1228020801B22EEC4102C60F80082842B9739705FCD37F134651442A41E3723DFFE0...\n" // clang-format on ); - TestSampleData(inSuite, params, secure_channel_pase_pake2, + TestSampleData(params, secure_channel_pase_pake2, // clang-format off "pase_pake2\n" " pB: hex:04B6A44A3347C6B77900A3674CA19F40F25F056F8CB344EC1B4FA7888B9E6B570B7010431C5D0BE4021FE74A96C40721765FDA6802BE8DFDF5624332...\n" " cB: hex:40E7452275E38AEBAF0E0F6FAB33A1B0CB5AEB5E824230DD40D0071DC7E55C87\n" // clang-format on ); - TestSampleData(inSuite, params, secure_channel_pase_pake3, + TestSampleData(params, secure_channel_pase_pake3, "pase_pake3\n" " cA: hex:6008C72EDEC9D25D4A36522F0BF23058F9378EFE38CBBCCE8C6853900169BC38\n"); - TestSampleData(inSuite, params, secure_channel_status_report, "status_report: BINARY DATA\n"); - TestSampleData(inSuite, params, im_protocol_read_request, + TestSampleData(params, secure_channel_status_report, "status_report: BINARY DATA\n"); + TestSampleData(params, im_protocol_read_request, "read_request\n" " attribute_requests\n" " Anonymous<>\n" @@ -206,7 +204,7 @@ void TestFullDataDecoding(nlTestSuite * inSuite, void * inContext) " attribute_id: 3 == 'connectMaxTimeSeconds'\n" " fabric_filtered: false\n" " interaction_model_revison: 1\n"); - TestSampleData(inSuite, params, im_protocol_report_data, + TestSampleData(params, im_protocol_report_data, "report_data\n" " attribute_reports\n" " Anonymous<>\n" @@ -279,7 +277,7 @@ void TestFullDataDecoding(nlTestSuite * inSuite, void * inContext) " interaction_model_revison: 1\n"); // Different content - TestSampleData(inSuite, params, im_protocol_report_data_acl, + TestSampleData(params, im_protocol_report_data_acl, "report_data\n" " attribute_reports\n" " Anonymous<>\n" @@ -301,7 +299,7 @@ void TestFullDataDecoding(nlTestSuite * inSuite, void * inContext) " interaction_model_revison: 1\n"); TestSampleData( - inSuite, params, im_protocol_report_data_window_covering, + params, im_protocol_report_data_window_covering, "report_data\n" " attribute_reports\n" " Anonymous<>\n" @@ -315,7 +313,7 @@ void TestFullDataDecoding(nlTestSuite * inSuite, void * inContext) " suppress_response: true\n" " interaction_model_revison: 1\n"); - TestSampleData(inSuite, params, im_protocol_invoke_request, + TestSampleData(params, im_protocol_invoke_request, "invoke_request\n" " suppress_response: false\n" " timed_request: false\n" @@ -328,7 +326,7 @@ void TestFullDataDecoding(nlTestSuite * inSuite, void * inContext) " OnOff::Toggle\n" " interaction_model_revison: 1\n"); - TestSampleData(inSuite, params, im_protocol_invoke_response, + TestSampleData(params, im_protocol_invoke_response, "invoke_response\n" " suppress_response: false\n" " invoke_responses\n" @@ -342,7 +340,7 @@ void TestFullDataDecoding(nlTestSuite * inSuite, void * inContext) " status: 0 == kSuccess\n" " interaction_model_revison: 1\n"); - TestSampleData(inSuite, params, im_protocol_invoke_request_change_channel, + TestSampleData(params, im_protocol_invoke_request_change_channel, "invoke_request\n" " suppress_response: false\n" " timed_request: false\n" @@ -356,7 +354,7 @@ void TestFullDataDecoding(nlTestSuite * inSuite, void * inContext) " match: \"channel name\"\n" " interaction_model_revison: 1\n"); - TestSampleData(inSuite, params, im_protocol_event_software_fault, + TestSampleData(params, im_protocol_event_software_fault, "report_data\n" " event_reports\n" " Anonymous<>\n" @@ -375,7 +373,7 @@ void TestFullDataDecoding(nlTestSuite * inSuite, void * inContext) " suppress_response: true\n" " interaction_model_revison: 1\n"); - TestSampleData(inSuite, params, im_protocol_event_multipress, + TestSampleData(params, im_protocol_event_multipress, "report_data\n" " event_reports\n" " Anonymous<>\n" @@ -394,22 +392,22 @@ void TestFullDataDecoding(nlTestSuite * inSuite, void * inContext) " interaction_model_revison: 1\n"); } -void TestMetaDataOnlyDecoding(nlTestSuite * inSuite, void * inContext) +TEST(TestDecoding, TestMetaDataOnlyDecoding) { PayloadDecoderInitParams params; // NO CLUSTER DECODE TREE params.SetProtocolDecodeTree(chip::TLVMeta::protocols_meta); - TestSampleData(inSuite, params, secure_channel_mrp_ack, "mrp_ack: EMPTY\n"); - TestSampleData(inSuite, params, secure_channel_pkbdf_param_request, + TestSampleData(params, secure_channel_mrp_ack, "mrp_ack: EMPTY\n"); + TestSampleData(params, secure_channel_pkbdf_param_request, "pbkdf_param_request\n" " initiator_random: hex:7C8698755B8E9866BB4FFDC27B733F3B6EF7F83D43FBE0CA6AD2B8C52C8F4236\n" " initiator_session_id: 37677\n" " passcode_id: 0\n" " has_pbkdf_parameters: false\n"); - TestSampleData(inSuite, params, im_protocol_read_request, + TestSampleData(params, im_protocol_read_request, "read_request\n" " attribute_requests\n" " Anonymous<>\n" @@ -444,7 +442,7 @@ void TestMetaDataOnlyDecoding(nlTestSuite * inSuite, void * inContext) " attribute_id: 3\n" " fabric_filtered: false\n" " interaction_model_revison: 1\n"); - TestSampleData(inSuite, params, im_protocol_report_data, + TestSampleData(params, im_protocol_report_data, "report_data\n" " attribute_reports\n" " Anonymous<>\n" @@ -515,7 +513,7 @@ void TestMetaDataOnlyDecoding(nlTestSuite * inSuite, void * inContext) " interaction_model_revison: 1\n"); // Different content - TestSampleData(inSuite, params, im_protocol_report_data_acl, + TestSampleData(params, im_protocol_report_data_acl, "report_data\n" " attribute_reports\n" " Anonymous<>\n" @@ -530,14 +528,14 @@ void TestMetaDataOnlyDecoding(nlTestSuite * inSuite, void * inContext) " interaction_model_revison: 1\n"); } -void TestEmptyClusterMetaDataDecode(nlTestSuite * inSuite, void * inContext) +TEST(TestDecoding, TestEmptyClusterMetaDataDecode) { PayloadDecoderInitParams params; params.SetProtocolDecodeTree(chip::TLVMeta::protocols_meta).SetClusterDecodeTree(empty_meta); - TestSampleData(inSuite, params, secure_channel_mrp_ack, "mrp_ack: EMPTY\n"); - TestSampleData(inSuite, params, im_protocol_report_data_acl, + TestSampleData(params, secure_channel_mrp_ack, "mrp_ack: EMPTY\n"); + TestSampleData(params, im_protocol_report_data_acl, "report_data\n" " attribute_reports\n" " Anonymous<>\n" @@ -559,24 +557,24 @@ void TestEmptyClusterMetaDataDecode(nlTestSuite * inSuite, void * inContext) " interaction_model_revison: 1\n"); } -void TestMissingDecodeData(nlTestSuite * inSuite, void * inContext) +TEST(TestDecoding, TestMissingDecodeData) { PayloadDecoderInitParams params; params.SetProtocolDecodeTree(empty_meta).SetClusterDecodeTree(empty_meta); - TestSampleData(inSuite, params, secure_channel_mrp_ack, "PROTO(0x0, 0x10): UNKNOWN\n"); - TestSampleData(inSuite, params, im_protocol_report_data_acl, "PROTO(0x1, 0x5): UNKNOWN\n"); + TestSampleData(params, secure_channel_mrp_ack, "PROTO(0x0, 0x10): UNKNOWN\n"); + TestSampleData(params, im_protocol_report_data_acl, "PROTO(0x1, 0x5): UNKNOWN\n"); } -void TestWrongDecodeData(nlTestSuite * inSuite, void * inContext) +TEST(TestDecoding, TestWrongDecodeData) { PayloadDecoderInitParams params; params.SetProtocolDecodeTree(fake_protocols_meta).SetClusterDecodeTree(empty_meta); - TestSampleData(inSuite, params, secure_channel_mrp_ack, "proto16: EMPTY\n"); - TestSampleData(inSuite, params, im_protocol_report_data_acl, + TestSampleData(params, secure_channel_mrp_ack, "proto16: EMPTY\n"); + TestSampleData(params, im_protocol_report_data_acl, "proto5\n" " ContextTag(0x1)\n" " AnonymousTag()\n" @@ -598,7 +596,7 @@ void TestWrongDecodeData(nlTestSuite * inSuite, void * inContext) " ContextTag(0xFF): 1\n"); } -void TestNestingOverflow(nlTestSuite * inSuite, void * inContext) +TEST(TestDecoding, TestNestingOverflow) { PayloadDecoderInitParams params; params.SetProtocolDecodeTree(fake_protocols_meta).SetClusterDecodeTree(empty_meta); @@ -611,65 +609,62 @@ void TestNestingOverflow(nlTestSuite * inSuite, void * inContext) chip::TLV::TLVType unusedType; // Protocols start with an anonymous tagged structure, after which lists can be of any tags - NL_TEST_ASSERT(inSuite, writer.StartContainer(AnonymousTag(), kTLVType_Structure, unusedType) == CHIP_NO_ERROR); + EXPECT_EQ(writer.StartContainer(AnonymousTag(), kTLVType_Structure, unusedType), CHIP_NO_ERROR); // nesting overflow here for (uint8_t i = 0; i < 32; i++) { - NL_TEST_ASSERT(inSuite, writer.StartContainer(ContextTag(i), kTLVType_List, unusedType) == CHIP_NO_ERROR); + EXPECT_EQ(writer.StartContainer(ContextTag(i), kTLVType_List, unusedType), CHIP_NO_ERROR); } // Go back to 24 (still too much nesting) for (uint8_t i = 0; i < 8; i++) { - NL_TEST_ASSERT(inSuite, writer.EndContainer(kTLVType_List) == CHIP_NO_ERROR); + EXPECT_EQ(writer.EndContainer(kTLVType_List), CHIP_NO_ERROR); } for (uint8_t i = 0; i < 4; i++) { - NL_TEST_ASSERT( - inSuite, writer.StartContainer(ContextTag(static_cast<uint8_t>(i + 0x10)), kTLVType_List, unusedType) == CHIP_NO_ERROR); + EXPECT_EQ(writer.StartContainer(ContextTag(static_cast<uint8_t>(i + 0x10)), kTLVType_List, unusedType), CHIP_NO_ERROR); } for (uint8_t i = 0; i < 4; i++) { - NL_TEST_ASSERT(inSuite, writer.EndContainer(kTLVType_List) == CHIP_NO_ERROR); + EXPECT_EQ(writer.EndContainer(kTLVType_List), CHIP_NO_ERROR); } // Go back to 8 for (uint8_t i = 0; i < 16; i++) { - NL_TEST_ASSERT(inSuite, writer.EndContainer(kTLVType_List) == CHIP_NO_ERROR); + EXPECT_EQ(writer.EndContainer(kTLVType_List), CHIP_NO_ERROR); } for (uint8_t i = 0; i < 4; i++) { - NL_TEST_ASSERT( - inSuite, writer.StartContainer(ContextTag(static_cast<uint8_t>(i + 0x20)), kTLVType_List, unusedType) == CHIP_NO_ERROR); + EXPECT_EQ(writer.StartContainer(ContextTag(static_cast<uint8_t>(i + 0x20)), kTLVType_List, unusedType), CHIP_NO_ERROR); } for (uint8_t i = 0; i < 4; i++) { - NL_TEST_ASSERT(inSuite, writer.EndContainer(kTLVType_List) == CHIP_NO_ERROR); + EXPECT_EQ(writer.EndContainer(kTLVType_List), CHIP_NO_ERROR); } // Go back to 4 for (uint8_t i = 0; i < 4; i++) { - NL_TEST_ASSERT(inSuite, writer.EndContainer(kTLVType_List) == CHIP_NO_ERROR); + EXPECT_EQ(writer.EndContainer(kTLVType_List), CHIP_NO_ERROR); } for (uint8_t i = 0; i < 4; i++) { - NL_TEST_ASSERT( - inSuite, writer.StartContainer(ContextTag(static_cast<uint8_t>(i + 0x30)), kTLVType_List, unusedType) == CHIP_NO_ERROR); + EXPECT_EQ(writer.StartContainer(ContextTag(static_cast<uint8_t>(i + 0x30)), kTLVType_List, unusedType), CHIP_NO_ERROR); } for (uint8_t i = 0; i < 4; i++) { - NL_TEST_ASSERT(inSuite, writer.EndContainer(kTLVType_List) == CHIP_NO_ERROR); + EXPECT_EQ(writer.EndContainer(kTLVType_List), CHIP_NO_ERROR); } // close everything for (uint8_t i = 0; i < 4; i++) { - NL_TEST_ASSERT(inSuite, writer.EndContainer(kTLVType_List) == CHIP_NO_ERROR); + EXPECT_EQ(writer.EndContainer(kTLVType_List), CHIP_NO_ERROR); } - NL_TEST_ASSERT(inSuite, writer.EndContainer(kTLVType_Structure) == CHIP_NO_ERROR); + EXPECT_EQ(writer.EndContainer(kTLVType_Structure), CHIP_NO_ERROR); SamplePayload fake_payload{ chip::Protocols::InteractionModel::Id, 5, chip::ByteSpan(data_buffer, writer.GetLengthWritten()) }; - TestSampleData(inSuite, params, fake_payload, + TestSampleData(params, fake_payload, "proto5\n" " ContextTag(0x0)\n" " ContextTag(0x1)\n" @@ -696,24 +691,4 @@ void TestNestingOverflow(nlTestSuite * inSuite, void * inContext) " ContextTag(0x32)\n" " ContextTag(0x33)\n"); } - -const nlTest sTests[] = { - NL_TEST_DEF("TestFullDataDecoding", TestFullDataDecoding), // - NL_TEST_DEF("TestMetaDataOnlyDecoding", TestMetaDataOnlyDecoding), // - NL_TEST_DEF("TestEmptyClusterMetaDataDecode", TestEmptyClusterMetaDataDecode), // - NL_TEST_DEF("TestMissingDecodeData", TestMissingDecodeData), // - NL_TEST_DEF("TestWrongDecodeData", TestWrongDecodeData), // - NL_TEST_DEF("TestNestingOverflow", TestNestingOverflow), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestDecode() -{ - nlTestSuite theSuite = { "TestDecode", sTests, nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestDecode) diff --git a/src/lib/format/tests/TestFlatTree.cpp b/src/lib/format/tests/TestFlatTree.cpp index 8eebb984b6adb9..fcf8e2713bf6b5 100644 --- a/src/lib/format/tests/TestFlatTree.cpp +++ b/src/lib/format/tests/TestFlatTree.cpp @@ -17,13 +17,12 @@ #include <lib/format/FlatTree.h> #include <lib/core/TLVTags.h> -#include <lib/support/UnitTestRegistration.h> #include <array> #include <string.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> namespace { @@ -82,43 +81,28 @@ class ByName const char * mName; }; -void TestFlatTreeFind(nlTestSuite * inSuite, void * inContext) +TEST(TestFlatTree, TestFlatTreeFind) { - NL_TEST_ASSERT(inSuite, strcmp(FindEntry(tree, 0, ByTag(ContextTag(1)))->data.name, "hello") == 0); - NL_TEST_ASSERT(inSuite, strcmp(FindEntry(tree, 0, ByTag(ContextTag(2)))->data.name, "world") == 0); - NL_TEST_ASSERT(inSuite, FindEntry(tree, 0, ByTag(ContextTag(3))) == nullptr); + EXPECT_STREQ(FindEntry(tree, 0, ByTag(ContextTag(1)))->data.name, "hello"); + EXPECT_STREQ(FindEntry(tree, 0, ByTag(ContextTag(2)))->data.name, "world"); + EXPECT_EQ(FindEntry(tree, 0, ByTag(ContextTag(3))), nullptr); - NL_TEST_ASSERT(inSuite, FindEntry(tree, 0, ByName("hello"))->data.tag == ContextTag(1)); - NL_TEST_ASSERT(inSuite, FindEntry(tree, 0, ByName("world"))->data.tag == ContextTag(2)); - NL_TEST_ASSERT(inSuite, FindEntry(tree, 0, ByName("foo")) == nullptr); + EXPECT_EQ(FindEntry(tree, 0, ByName("hello"))->data.tag, ContextTag(1)); + EXPECT_EQ(FindEntry(tree, 0, ByName("world"))->data.tag, ContextTag(2)); + EXPECT_EQ(FindEntry(tree, 0, ByName("foo")), nullptr); - NL_TEST_ASSERT(inSuite, FindEntry(tree, 1, ByTag(ContextTag(1))) == nullptr); - NL_TEST_ASSERT(inSuite, strcmp(FindEntry(tree, 1, ByTag(ProfileTag(234, 2)))->data.name, "b") == 0); - NL_TEST_ASSERT(inSuite, strcmp(FindEntry(tree, 1, ByTag(ProfileTag(345, 3)))->data.name, "c") == 0); - NL_TEST_ASSERT(inSuite, FindEntry(tree, 1, ByTag(AnonymousTag())) == nullptr); + EXPECT_EQ(FindEntry(tree, 1, ByTag(ContextTag(1))), nullptr); + EXPECT_STREQ(FindEntry(tree, 1, ByTag(ProfileTag(234, 2)))->data.name, "b"); + EXPECT_STREQ(FindEntry(tree, 1, ByTag(ProfileTag(345, 3)))->data.name, "c"); + EXPECT_EQ(FindEntry(tree, 1, ByTag(AnonymousTag())), nullptr); - NL_TEST_ASSERT(inSuite, FindEntry(tree, 2, ByTag(ContextTag(1))) == nullptr); - NL_TEST_ASSERT(inSuite, strcmp(FindEntry(tree, 2, ByTag(AnonymousTag()))->data.name, "foo") == 0); + EXPECT_EQ(FindEntry(tree, 2, ByTag(ContextTag(1))), nullptr); + EXPECT_STREQ(FindEntry(tree, 2, ByTag(AnonymousTag()))->data.name, "foo"); // out of array - NL_TEST_ASSERT(inSuite, FindEntry(tree, 3, ByTag(AnonymousTag())) == nullptr); - NL_TEST_ASSERT(inSuite, FindEntry(tree, 100, ByTag(AnonymousTag())) == nullptr); - NL_TEST_ASSERT(inSuite, FindEntry(tree, 1000, ByTag(AnonymousTag())) == nullptr); - NL_TEST_ASSERT(inSuite, FindEntry(tree, 9999999, ByTag(AnonymousTag())) == nullptr); + EXPECT_EQ(FindEntry(tree, 3, ByTag(AnonymousTag())), nullptr); + EXPECT_EQ(FindEntry(tree, 100, ByTag(AnonymousTag())), nullptr); + EXPECT_EQ(FindEntry(tree, 1000, ByTag(AnonymousTag())), nullptr); + EXPECT_EQ(FindEntry(tree, 9999999, ByTag(AnonymousTag())), nullptr); } - -const nlTest sTests[] = { - NL_TEST_DEF("TestFlatTreeFind", TestFlatTreeFind), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestFlatTree() -{ - nlTestSuite theSuite = { "FlatTree", sTests, nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestFlatTree) diff --git a/src/lib/format/tests/TestFlatTreePosition.cpp b/src/lib/format/tests/TestFlatTreePosition.cpp index ee5f6b3c94176d..cf5a26e6c8662f 100644 --- a/src/lib/format/tests/TestFlatTreePosition.cpp +++ b/src/lib/format/tests/TestFlatTreePosition.cpp @@ -18,14 +18,13 @@ #include <lib/format/FlatTreePosition.h> #include <lib/core/TLVTags.h> -#include <lib/support/UnitTestRegistration.h> #include <array> #include <vector> #include <string.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> namespace { @@ -94,16 +93,16 @@ class ByName }; #define ASSERT_HAS_NAME(p, n) \ - NL_TEST_ASSERT(inSuite, p.Get() != nullptr); \ - NL_TEST_ASSERT(inSuite, strcmp(p.Get()->name, n) == 0) + EXPECT_NE(p.Get(), nullptr); \ + EXPECT_STREQ(p.Get()->name, n); #define ASSERT_HAS_CONTEXT_TAG(p, t) \ - NL_TEST_ASSERT(inSuite, p.Get() != nullptr); \ - NL_TEST_ASSERT(inSuite, p.Get()->tag == ContextTag(t)) + EXPECT_NE(p.Get(), nullptr); \ + EXPECT_EQ(p.Get()->tag, ContextTag(t)) #define ASSERT_HAS_PROFILE_TAG(p, a, b) \ - NL_TEST_ASSERT(inSuite, p.Get() != nullptr); \ - NL_TEST_ASSERT(inSuite, p.Get()->tag == ProfileTag(a, b)) + EXPECT_NE(p.Get(), nullptr); \ + EXPECT_EQ(p.Get()->tag, ProfileTag(a, b)) template <size_t N> std::vector<Tag> GetPath(Position<NamedTag, N> & position) @@ -133,54 +132,54 @@ bool HasPath(const std::vector<Tag> & v, Tag a, Tag b, Tag c) return (v.size() == 3) && (v[0] == a) && (v[1] == b) && (v[2] == c); } -void TestSimpleEnterExit(nlTestSuite * inSuite, void * inContext) +TEST(TestFlatTreePosition, TestSimpleEnterExit) { Position<NamedTag, 10> position(tree.data(), tree.size()); // at start, top of tree has no value - NL_TEST_ASSERT(inSuite, position.Get() == nullptr); - NL_TEST_ASSERT(inSuite, GetPath(position).empty()); + EXPECT_EQ(position.Get(), nullptr); + EXPECT_TRUE(GetPath(position).empty()); // Go to hello, try going to invalid 2x, then go back position.Enter(ByTag(ContextTag(1))); ASSERT_HAS_NAME(position, "hello"); - NL_TEST_ASSERT(inSuite, HasPath(GetPath(position), ContextTag(1))); + EXPECT_TRUE(HasPath(GetPath(position), ContextTag(1))); position.Enter(ByTag(ContextTag(1))); - NL_TEST_ASSERT(inSuite, position.Get() == nullptr); - NL_TEST_ASSERT(inSuite, GetPath(position).empty()); + EXPECT_EQ(position.Get(), nullptr); + EXPECT_TRUE(GetPath(position).empty()); position.Enter(ByTag(ContextTag(1))); - NL_TEST_ASSERT(inSuite, position.Get() == nullptr); + EXPECT_EQ(position.Get(), nullptr); position.Exit(); - NL_TEST_ASSERT(inSuite, position.Get() == nullptr); + EXPECT_EQ(position.Get(), nullptr); position.Exit(); - NL_TEST_ASSERT(inSuite, position.Get() != nullptr); + ASSERT_NE(position.Get(), nullptr); ASSERT_HAS_NAME(position, "hello"); - NL_TEST_ASSERT(inSuite, HasPath(GetPath(position), ContextTag(1))); + EXPECT_TRUE(HasPath(GetPath(position), ContextTag(1))); position.Exit(); - NL_TEST_ASSERT(inSuite, position.Get() == nullptr); + EXPECT_EQ(position.Get(), nullptr); } -void TestDeeperEnter(nlTestSuite * inSuite, void * inContext) +TEST(TestFlatTreePosition, TestDeeperEnter) { Position<NamedTag, 10> position(tree.data(), tree.size()); - NL_TEST_ASSERT(inSuite, position.Get() == nullptr); + EXPECT_EQ(position.Get(), nullptr); position.Enter(ByName("world")); ASSERT_HAS_CONTEXT_TAG(position, 2); - NL_TEST_ASSERT(inSuite, HasPath(GetPath(position), ContextTag(2))); + EXPECT_TRUE(HasPath(GetPath(position), ContextTag(2))); position.Enter(ByTag(ProfileTag(123, 1))); ASSERT_HAS_NAME(position, "a"); - NL_TEST_ASSERT(inSuite, HasPath(GetPath(position), ContextTag(2), ProfileTag(123, 1))); + EXPECT_TRUE(HasPath(GetPath(position), ContextTag(2), ProfileTag(123, 1))); position.Enter(ByTag(AnonymousTag())); - NL_TEST_ASSERT(inSuite, position.Get() == nullptr); - NL_TEST_ASSERT(inSuite, GetPath(position).empty()); + EXPECT_EQ(position.Get(), nullptr); + EXPECT_TRUE(GetPath(position).empty()); position.Exit(); ASSERT_HAS_NAME(position, "a"); - NL_TEST_ASSERT(inSuite, HasPath(GetPath(position), ContextTag(2), ProfileTag(123, 1))); + EXPECT_TRUE(HasPath(GetPath(position), ContextTag(2), ProfileTag(123, 1))); position.Exit(); ASSERT_HAS_NAME(position, "world"); @@ -190,30 +189,30 @@ void TestDeeperEnter(nlTestSuite * inSuite, void * inContext) position.Enter(ByTag(AnonymousTag())); ASSERT_HAS_NAME(position, "foo"); - NL_TEST_ASSERT(inSuite, HasPath(GetPath(position), ContextTag(2), ProfileTag(234, 2), AnonymousTag())); + EXPECT_TRUE(HasPath(GetPath(position), ContextTag(2), ProfileTag(234, 2), AnonymousTag())); // test some unknown for (int i = 0; i < 100; i++) { position.Enter(ByTag(AnonymousTag())); - NL_TEST_ASSERT(inSuite, position.Get() == nullptr); - NL_TEST_ASSERT(inSuite, GetPath(position).empty()); + EXPECT_EQ(position.Get(), nullptr); + EXPECT_TRUE(GetPath(position).empty()); } for (int i = 0; i < 100; i++) { - NL_TEST_ASSERT(inSuite, position.Get() == nullptr); - NL_TEST_ASSERT(inSuite, GetPath(position).empty()); + EXPECT_EQ(position.Get(), nullptr); + EXPECT_TRUE(GetPath(position).empty()); position.Exit(); } - NL_TEST_ASSERT(inSuite, HasPath(GetPath(position), ContextTag(2), ProfileTag(234, 2), AnonymousTag())); + EXPECT_TRUE(HasPath(GetPath(position), ContextTag(2), ProfileTag(234, 2), AnonymousTag())); ASSERT_HAS_NAME(position, "foo"); position.Exit(); - NL_TEST_ASSERT(inSuite, HasPath(GetPath(position), ContextTag(2), ProfileTag(234, 2))); + EXPECT_TRUE(HasPath(GetPath(position), ContextTag(2), ProfileTag(234, 2))); ASSERT_HAS_NAME(position, "b"); position.Exit(); - NL_TEST_ASSERT(inSuite, HasPath(GetPath(position), ContextTag(2))); + EXPECT_TRUE(HasPath(GetPath(position), ContextTag(2))); ASSERT_HAS_NAME(position, "world"); // root and stay there @@ -221,15 +220,15 @@ void TestDeeperEnter(nlTestSuite * inSuite, void * inContext) position.Exit(); position.Exit(); position.Exit(); - NL_TEST_ASSERT(inSuite, GetPath(position).empty()); + EXPECT_TRUE(GetPath(position).empty()); // can still navigate from the root position.Enter(ByName("world")); - NL_TEST_ASSERT(inSuite, HasPath(GetPath(position), ContextTag(2))); + EXPECT_TRUE(HasPath(GetPath(position), ContextTag(2))); ASSERT_HAS_CONTEXT_TAG(position, 2); } -void TestDescendLimit(nlTestSuite * inSuite, void * inContext) +TEST(TestFlatTreePosition, TestDescendLimit) { Position<NamedTag, 2> position(tree.data(), tree.size()); @@ -241,34 +240,17 @@ void TestDescendLimit(nlTestSuite * inSuite, void * inContext) // only 2 positions can be remembered. Running out of space position.Enter(ByName("foo")); - NL_TEST_ASSERT(inSuite, position.Get() == nullptr); - NL_TEST_ASSERT(inSuite, GetPath(position).empty()); + EXPECT_EQ(position.Get(), nullptr); + EXPECT_TRUE(GetPath(position).empty()); position.Exit(); - NL_TEST_ASSERT(inSuite, HasPath(GetPath(position), ContextTag(2), ProfileTag(234, 2))); + EXPECT_TRUE(HasPath(GetPath(position), ContextTag(2), ProfileTag(234, 2))); ASSERT_HAS_NAME(position, "b"); ASSERT_HAS_PROFILE_TAG(position, 234, 2); position.Exit(); - NL_TEST_ASSERT(inSuite, HasPath(GetPath(position), ContextTag(2))); + EXPECT_TRUE(HasPath(GetPath(position), ContextTag(2))); ASSERT_HAS_NAME(position, "world"); ASSERT_HAS_CONTEXT_TAG(position, 2); } - -const nlTest sTests[] = { - NL_TEST_DEF("TestSimpleEnterExit", TestSimpleEnterExit), // - NL_TEST_DEF("TestDeeperEnter", TestDeeperEnter), // - NL_TEST_DEF("TestDescendLimit", TestDescendLimit), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestFlatTreePosition() -{ - nlTestSuite theSuite = { "FlatTree", sTests, nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestFlatTreePosition) From 2ef3a366d8892f6aa96449c02690fa2099a92a29 Mon Sep 17 00:00:00 2001 From: Jakub Latusek <jk.latusek@gmail.com> Date: Tue, 23 Apr 2024 16:09:46 +0200 Subject: [PATCH 002/124] Add missing logging handler for embedded platforms for testing with Pigweed (#33105) * Add missing logging handler for embedded platforms * Update src/lib/support/UnitTest.cpp Co-authored-by: Arkadiusz Bokowy <arkadiusz.bokowy@gmail.com> --------- Co-authored-by: Arkadiusz Bokowy <arkadiusz.bokowy@gmail.com> --- src/lib/support/BUILD.gn | 1 + src/lib/support/UnitTest.cpp | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/lib/support/BUILD.gn b/src/lib/support/BUILD.gn index a5bf63a0034b41..34906592214fbd 100644 --- a/src/lib/support/BUILD.gn +++ b/src/lib/support/BUILD.gn @@ -350,6 +350,7 @@ pw_static_library("pw_tests_wrapper") { public_deps = [ "$dir_pw_log:impl", "$dir_pw_unit_test", + "$dir_pw_unit_test:logging", ] sources = [ "UnitTest.cpp", diff --git a/src/lib/support/UnitTest.cpp b/src/lib/support/UnitTest.cpp index 787898cccd82f2..95389398fefecb 100644 --- a/src/lib/support/UnitTest.cpp +++ b/src/lib/support/UnitTest.cpp @@ -1,12 +1,16 @@ #include "UnitTest.h" #include "pw_unit_test/framework.h" +#include "pw_unit_test/logging_event_handler.h" namespace chip { namespace test { int RunAllTests() { + testing::InitGoogleTest(nullptr, static_cast<char **>(nullptr)); + pw::unit_test::LoggingEventHandler handler; + pw::unit_test::RegisterEventHandler(&handler); return RUN_ALL_TESTS(); } From 700e6d2ed4d6048a6ea4eb82836ace4de56dcfdb Mon Sep 17 00:00:00 2001 From: Boris Zbarsky <bzbarsky@apple.com> Date: Tue, 23 Apr 2024 10:52:12 -0400 Subject: [PATCH 003/124] Switch MTRDevice to always using by-cluster persistent attribute storage. (#33096) MTRDEVICE_ATTRIBUTE_CACHE_STORE_ATTRIBUTES_BY_CLUSTER was already defaulted to 1; this just removes the codepaths when this is set to 0. Cleans up some of the controller data store bits that then become unused, and improves test coverage of this codepath. Fixes formatting of the endpoint id in _clusterDataKeyForNodeID. --- src/darwin/Framework/CHIP/MTRDevice.mm | 29 -- .../Framework/CHIP/MTRDeviceController.mm | 8 - .../CHIP/MTRDeviceControllerDataStore.h | 6 +- .../CHIP/MTRDeviceControllerDataStore.mm | 345 +++--------------- .../Framework/CHIP/MTRDevice_Internal.h | 3 - .../Framework/CHIPTests/MTRDeviceTests.m | 38 +- .../CHIPTests/MTRPerControllerStorageTests.m | 251 ++++++------- .../TestHelpers/MTRTestDeclarations.h | 10 +- 8 files changed, 197 insertions(+), 493 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRDevice.mm b/src/darwin/Framework/CHIP/MTRDevice.mm index d171c3982701ba..374b2e8cc60bc0 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.mm +++ b/src/darwin/Framework/CHIP/MTRDevice.mm @@ -1040,9 +1040,7 @@ - (void)_handleReportBegin for (MTRClusterPath * clusterPath in clusterPaths) { NSNumber * dataVersion = _clusterData[clusterPath].dataVersion; NSDictionary<NSNumber *, MTRDeviceDataValueDictionary> * attributes = nil; -#if MTRDEVICE_ATTRIBUTE_CACHE_STORE_ATTRIBUTES_BY_CLUSTER attributes = [self _attributesForCluster:clusterPath]; -#endif if (dataVersion || attributes) { MTRDeviceClusterData * clusterData = [[MTRDeviceClusterData alloc] initWithDataVersion:dataVersion attributes:attributes]; clusterDataToReturn[clusterPath] = clusterData; @@ -2340,12 +2338,6 @@ - (NSArray *)_getAttributesToReportWithReportedValues:(NSArray<NSDictionary<NSSt NSMutableArray * attributesToReport = [NSMutableArray array]; NSMutableArray * attributePathsToReport = [NSMutableArray array]; BOOL dataStoreExists = _deviceController.controllerDataStore != nil; -#if !MTRDEVICE_ATTRIBUTE_CACHE_STORE_ATTRIBUTES_BY_CLUSTER - NSMutableArray * attributesToPersist; - if (dataStoreExists) { - attributesToPersist = [NSMutableArray array]; - } -#endif for (NSDictionary<NSString *, id> * attributeResponseValue in reportedAttributeValues) { MTRAttributePath * attributePath = attributeResponseValue[MTRAttributePathKey]; NSDictionary * attributeDataValue = attributeResponseValue[MTRDataKey]; @@ -2388,20 +2380,7 @@ - (NSArray *)_getAttributesToReportWithReportedValues:(NSArray<NSDictionary<NSSt BOOL readCacheValueChanged = ![self _attributeDataValue:attributeDataValue isEqualToDataValue:_readCache[attributePath]]; // Check if attribute needs to be persisted - compare only to read cache and disregard expected values if (dataStoreExists && readCacheValueChanged) { -#if MTRDEVICE_ATTRIBUTE_CACHE_STORE_ATTRIBUTES_BY_CLUSTER [self _noteChangeForClusterPath:clusterPath]; -#else - NSDictionary * attributeResponseValueToPersist; - if (dataVersion) { - // Remove data version from what we cache in memory and storage - NSMutableDictionary * attributeResponseValueCopy = [attributeResponseValue mutableCopy]; - attributeResponseValueCopy[MTRDataKey] = attributeDataValue; - attributeResponseValueToPersist = attributeResponseValueCopy; - } else { - attributeResponseValueToPersist = attributeResponseValue; - } - [attributesToPersist addObject:attributeResponseValueToPersist]; -#endif } NSArray * expectedValue = _expectedValueCache[attributePath]; @@ -2473,12 +2452,6 @@ - (NSArray *)_getAttributesToReportWithReportedValues:(NSArray<NSDictionary<NSSt MTR_LOG_INFO("%@ report from reported values %@", self, attributePathsToReport); -#if !MTRDEVICE_ATTRIBUTE_CACHE_STORE_ATTRIBUTES_BY_CLUSTER - if (dataStoreExists && attributesToPersist.count) { - [_deviceController.controllerDataStore storeAttributeValues:attributesToPersist forNodeID:_nodeID]; - } -#endif - return attributesToReport; } @@ -2530,7 +2503,6 @@ - (void)setClusterData:(NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * std::lock_guard lock(_lock); -#if MTRDEVICE_ATTRIBUTE_CACHE_STORE_ATTRIBUTES_BY_CLUSTER // For each cluster, extract and create the attribute response-value for the read cache // TODO: consider some optimization in how the read cache is structured so there's fewer conversions from this format to what's in the cache for (MTRClusterPath * clusterPath in clusterData) { @@ -2548,7 +2520,6 @@ - (void)setClusterData:(NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * } } } -#endif [_clusterData addEntriesFromDictionary:clusterData]; } diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.mm b/src/darwin/Framework/CHIP/MTRDeviceController.mm index 6150b1cc748da1..4dfa229e71cc85 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController.mm @@ -948,14 +948,6 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N [deviceToReturn setClusterData:prefetchedClusterData]; } } else { -#if !MTRDEVICE_ATTRIBUTE_CACHE_STORE_ATTRIBUTES_BY_CLUSTER - // Load persisted attributes if they exist. - NSArray * attributesFromCache = [_controllerDataStore getStoredAttributesForNodeID:nodeID]; - MTR_LOG_INFO("Loaded %lu attributes from storage for %@", static_cast<unsigned long>(attributesFromCache.count), deviceToReturn); - if (attributesFromCache.count) { - [deviceToReturn setAttributeValues:attributesFromCache reportChanges:NO]; - } -#endif // Load persisted cluster data if they exist. NSDictionary * clusterData = [_controllerDataStore getStoredClusterDataForNodeID:nodeID]; MTR_LOG_INFO("Loaded %lu cluster data from storage for %@", static_cast<unsigned long>(clusterData.count), deviceToReturn); diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h index bc3b8f37f90fbb..91a6c0e3142a38 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h @@ -72,12 +72,10 @@ typedef void (^MTRDeviceControllerDataStoreClusterDataHandler)(NSDictionary<NSNu /** * Storage for MTRDevice attribute read cache. This is local-only storage as an optimization. New controller devices using MTRDevice API can prime their own local cache from devices directly. */ -- (nullable NSArray<NSDictionary *> *)getStoredAttributesForNodeID:(NSNumber *)nodeID; -- (void)storeAttributeValues:(NSArray<NSDictionary *> *)dataValues forNodeID:(NSNumber *)nodeID; - (nullable NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)getStoredClusterDataForNodeID:(NSNumber *)nodeID; - (void)storeClusterData:(NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)clusterData forNodeID:(NSNumber *)nodeID; -- (void)clearStoredAttributesForNodeID:(NSNumber *)nodeID; -- (void)clearAllStoredAttributes; +- (void)clearStoredClusterDataForNodeID:(NSNumber *)nodeID; +- (void)clearAllStoredClusterData; @end diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm index d6c7e8c00dfeb1..cac425c9453ad3 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm @@ -306,20 +306,14 @@ - (nullable MTRCASESessionResumptionInfo *)_findResumptionInfoWithKey:(nullable * key: "attrCacheNodeIndex" * value: list of nodeIDs * EndpointID index - * key: "attrCacheEndpointIndex:<nodeID>:endpointID" + * key: "attrCacheEndpointIndex:<nodeID>" * value: list of endpoint IDs * ClusterID index - * key: "<nodeID+endpointID> clusters" + * key: "attrCacheClusterIndex:<nodeID>:<endpointID>" * value: list of cluster IDs - * AttributeID index - * key: "<nodeID+endpointID+clusterID> attributes" - * value: list of attribute IDs - * Attribute data entry: - * key: "<nodeID+endpointID+clusterID+attributeID> attribute data" - * value: serialized dictionary of attribute data - * - * Attribute data dictionary - * Additional value "serial number" + * Cluster data entry: + * key: "attrCacheClusterData:<nodeID>:<endpointID>:<clusterID>" + * value: MTRDeviceClusterData */ - (id)_fetchAttributeCacheValueForKey:(NSString *)key expectedClass:(Class)expectedClass; @@ -371,16 +365,19 @@ - (BOOL)_removeAttributeCacheValueForKey:(NSString *)key - (nullable NSArray<NSNumber *> *)_fetchNodeIndex { + dispatch_assert_queue(_storageDelegateQueue); return [self _fetchAttributeCacheValueForKey:sAttributeCacheNodeIndexKey expectedClass:[NSArray class]]; } - (BOOL)_storeNodeIndex:(NSArray<NSNumber *> *)nodeIndex { + dispatch_assert_queue(_storageDelegateQueue); return [self _storeAttributeCacheValue:nodeIndex forKey:sAttributeCacheNodeIndexKey]; } - (BOOL)_deleteNodeIndex { + dispatch_assert_queue(_storageDelegateQueue); return [self _removeAttributeCacheValueForKey:sAttributeCacheNodeIndexKey]; } @@ -393,6 +390,8 @@ - (NSString *)_endpointIndexKeyForNodeID:(NSNumber *)nodeID - (nullable NSArray<NSNumber *> *)_fetchEndpointIndexForNodeID:(NSNumber *)nodeID { + dispatch_assert_queue(_storageDelegateQueue); + if (!nodeID) { MTR_LOG_ERROR("%s: unexpected nil input", __func__); return nil; @@ -403,6 +402,8 @@ - (NSString *)_endpointIndexKeyForNodeID:(NSNumber *)nodeID - (BOOL)_storeEndpointIndex:(NSArray<NSNumber *> *)endpointIndex forNodeID:(NSNumber *)nodeID { + dispatch_assert_queue(_storageDelegateQueue); + if (!nodeID) { MTR_LOG_ERROR("%s: unexpected nil input", __func__); return NO; @@ -413,6 +414,8 @@ - (BOOL)_storeEndpointIndex:(NSArray<NSNumber *> *)endpointIndex forNodeID:(NSNu - (BOOL)_deleteEndpointIndexForNodeID:(NSNumber *)nodeID { + dispatch_assert_queue(_storageDelegateQueue); + if (!nodeID) { MTR_LOG_ERROR("%s: unexpected nil input", __func__); return NO; @@ -430,6 +433,8 @@ - (NSString *)_clusterIndexKeyForNodeID:(NSNumber *)nodeID endpointID:(NSNumber - (nullable NSArray<NSNumber *> *)_fetchClusterIndexForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID { + dispatch_assert_queue(_storageDelegateQueue); + if (!nodeID || !endpointID) { MTR_LOG_ERROR("%s: unexpected nil input", __func__); return nil; @@ -440,6 +445,8 @@ - (NSString *)_clusterIndexKeyForNodeID:(NSNumber *)nodeID endpointID:(NSNumber - (BOOL)_storeClusterIndex:(NSArray<NSNumber *> *)clusterIndex forNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID { + dispatch_assert_queue(_storageDelegateQueue); + if (!nodeID || !endpointID) { MTR_LOG_ERROR("%s: unexpected nil input", __func__); return NO; @@ -450,6 +457,8 @@ - (BOOL)_storeClusterIndex:(NSArray<NSNumber *> *)clusterIndex forNodeID:(NSNumb - (BOOL)_deleteClusterIndexForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID { + dispatch_assert_queue(_storageDelegateQueue); + if (!nodeID || !endpointID) { MTR_LOG_ERROR("%s: unexpected nil input", __func__); return NO; @@ -462,11 +471,13 @@ - (BOOL)_deleteClusterIndexForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)e - (NSString *)_clusterDataKeyForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID { - return [sAttributeCacheClusterDataKeyPrefix stringByAppendingFormat:@":0x%016llX:%0x04X:0x%08lX", nodeID.unsignedLongLongValue, endpointID.unsignedShortValue, clusterID.unsignedLongValue]; + return [sAttributeCacheClusterDataKeyPrefix stringByAppendingFormat:@":0x%016llX:0x%04X:0x%08lX", nodeID.unsignedLongLongValue, endpointID.unsignedShortValue, clusterID.unsignedLongValue]; } - (nullable MTRDeviceClusterData *)_fetchClusterDataForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID { + dispatch_assert_queue(_storageDelegateQueue); + if (!nodeID || !endpointID || !clusterID) { MTR_LOG_ERROR("%s: unexpected nil input", __func__); return nil; @@ -477,6 +488,8 @@ - (nullable MTRDeviceClusterData *)_fetchClusterDataForNodeID:(NSNumber *)nodeID - (BOOL)_storeClusterData:(MTRDeviceClusterData *)clusterData forNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID { + dispatch_assert_queue(_storageDelegateQueue); + if (!nodeID || !endpointID || !clusterID || !clusterData) { MTR_LOG_ERROR("%s: unexpected nil input", __func__); return NO; @@ -487,6 +500,8 @@ - (BOOL)_storeClusterData:(MTRDeviceClusterData *)clusterData forNodeID:(NSNumbe - (BOOL)_deleteClusterDataForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID { + dispatch_assert_queue(_storageDelegateQueue); + if (!nodeID || !endpointID || !clusterID) { MTR_LOG_ERROR("%s: unexpected nil input", __func__); return NO; @@ -495,139 +510,22 @@ - (BOOL)_deleteClusterDataForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)en return [self _removeAttributeCacheValueForKey:[self _clusterDataKeyForNodeID:nodeID endpointID:endpointID clusterID:clusterID]]; } -static NSString * sAttributeCacheAttributeIndexKeyPrefix = @"attrCacheAttributeIndex"; - -- (NSString *)_attributeIndexKeyForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID -{ - return [sAttributeCacheAttributeIndexKeyPrefix stringByAppendingFormat:@":0x%016llX:0x%04X:0x%08lX", nodeID.unsignedLongLongValue, endpointID.unsignedShortValue, clusterID.unsignedLongValue]; -} - -- (nullable NSArray<NSNumber *> *)_fetchAttributeIndexForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID -{ - return [self _fetchAttributeCacheValueForKey:[self _attributeIndexKeyForNodeID:nodeID endpointID:endpointID clusterID:clusterID] expectedClass:[NSArray class]]; -} - -- (BOOL)_storeAttributeIndex:(NSArray<NSNumber *> *)attributeIndex forNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID -{ - return [self _storeAttributeCacheValue:attributeIndex forKey:[self _attributeIndexKeyForNodeID:nodeID endpointID:endpointID clusterID:clusterID]]; -} - -- (BOOL)_deleteAttributeIndexForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID -{ - return [self _removeAttributeCacheValueForKey:[self _attributeIndexKeyForNodeID:nodeID endpointID:endpointID clusterID:clusterID]]; -} - -static NSString * sAttributeCacheAttributeValueKeyPrefix = @"attrCacheAttributeValue"; - -- (NSString *)_attributeValueKeyForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID attributeID:(NSNumber *)attributeID -{ - return [sAttributeCacheAttributeValueKeyPrefix stringByAppendingFormat:@":0x%016llX:0x%04X:0x%08lX:0x%08lX", nodeID.unsignedLongLongValue, endpointID.unsignedShortValue, clusterID.unsignedLongValue, attributeID.unsignedLongValue]; -} - -- (nullable NSDictionary *)_fetchAttributeValueForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID attributeID:(NSNumber *)attributeID -{ - return [self _fetchAttributeCacheValueForKey:[self _attributeValueKeyForNodeID:nodeID endpointID:endpointID clusterID:clusterID attributeID:attributeID] expectedClass:[NSDictionary class]]; -} - -- (BOOL)_storeAttributeValue:(NSDictionary *)value forNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID attributeID:(NSNumber *)attributeID -{ - return [self _storeAttributeCacheValue:value forKey:[self _attributeValueKeyForNodeID:nodeID endpointID:endpointID clusterID:clusterID attributeID:attributeID]]; -} - -- (BOOL)_deleteAttributeValueForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID attributeID:(NSNumber *)attributeID -{ - return [self _removeAttributeCacheValueForKey:[self _attributeValueKeyForNodeID:nodeID endpointID:endpointID clusterID:clusterID attributeID:attributeID]]; -} - #pragma - Attribute Cache management #ifndef ATTRIBUTE_CACHE_VERBOSE_LOGGING #define ATTRIBUTE_CACHE_VERBOSE_LOGGING 0 #endif -- (nullable NSArray<NSDictionary *> *)getStoredAttributesForNodeID:(NSNumber *)nodeID -{ - __block NSMutableArray * attributesToReturn = nil; - dispatch_sync(_storageDelegateQueue, ^{ - // Fetch node index - NSArray<NSNumber *> * nodeIndex = [self _fetchNodeIndex]; - -#if ATTRIBUTE_CACHE_VERBOSE_LOGGING - MTR_LOG_INFO("Fetch got %lu values for nodeIndex", static_cast<unsigned long>(nodeIndex.count)); -#endif - - if (![nodeIndex containsObject:nodeID]) { - // Sanity check and delete if nodeID exists in index - NSArray<NSNumber *> * endpointIndex = [self _fetchEndpointIndexForNodeID:nodeID]; - if (endpointIndex) { - MTR_LOG_ERROR("Persistent attribute cache contains orphaned entry for nodeID %@ - deleting", nodeID); - [self clearStoredAttributesForNodeID:nodeID]; - } - - MTR_LOG_INFO("Fetch got no value for endpointIndex @ node 0x%016llX", nodeID.unsignedLongLongValue); - attributesToReturn = nil; - return; - } - - // Fetch endpoint index - NSArray<NSNumber *> * endpointIndex = [self _fetchEndpointIndexForNodeID:nodeID]; - -#if ATTRIBUTE_CACHE_VERBOSE_LOGGING - MTR_LOG_INFO("Fetch got %lu values for endpointIndex @ node 0x%016llX", static_cast<unsigned long>(endpointIndex.count), nodeID.unsignedLongLongValue); -#endif - - for (NSNumber * endpointID in endpointIndex) { - // Fetch cluster index - NSArray<NSNumber *> * clusterIndex = [self _fetchClusterIndexForNodeID:nodeID endpointID:endpointID]; - -#if ATTRIBUTE_CACHE_VERBOSE_LOGGING - MTR_LOG_INFO("Fetch got %lu values for clusterIndex @ node 0x%016llX %u", static_cast<unsigned long>(clusterIndex.count), nodeID.unsignedLongLongValue, endpointID.unsignedShortValue); -#endif - - for (NSNumber * clusterID in clusterIndex) { - // Fetch attribute index - NSArray<NSNumber *> * attributeIndex = [self _fetchAttributeIndexForNodeID:nodeID endpointID:endpointID clusterID:clusterID]; - -#if ATTRIBUTE_CACHE_VERBOSE_LOGGING - MTR_LOG_INFO("Fetch got %lu values for attributeIndex @ node 0x%016llX endpoint %u cluster 0x%08lX", static_cast<unsigned long>(attributeIndex.count), nodeID.unsignedLongLongValue, endpointID.unsignedShortValue, clusterID.unsignedLongValue); -#endif - - for (NSNumber * attributeID in attributeIndex) { - NSDictionary * value = [self _fetchAttributeValueForNodeID:nodeID endpointID:endpointID clusterID:clusterID attributeID:attributeID]; - -#if ATTRIBUTE_CACHE_VERBOSE_LOGGING - MTR_LOG_INFO("Fetch got %u values for attribute value @ node 0x%016llX endpoint %u cluster 0x%08lX attribute 0x%08lX", value ? 1 : 0, nodeID.unsignedLongLongValue, endpointID.unsignedShortValue, clusterID.unsignedLongValue, attributeID.unsignedLongValue); -#endif - - if (value) { - if (!attributesToReturn) { - attributesToReturn = [NSMutableArray array]; - } - - // Construct data-value dictionary and add to array - MTRAttributePath * path = [MTRAttributePath attributePathWithEndpointID:endpointID clusterID:clusterID attributeID:attributeID]; - [attributesToReturn addObject:@ { MTRAttributePathKey : path, MTRDataKey : value }]; - } - } - - // TODO: Add per-cluster integrity check verification - } - } - }); - - return attributesToReturn; -} - #ifdef DEBUG -- (void)unitTestPruneEmptyStoredAttributesBranches +- (void)unitTestPruneEmptyStoredClusterDataBranches { dispatch_sync(_storageDelegateQueue, ^{ - [self _pruneEmptyStoredAttributesBranches]; + [self _pruneEmptyStoredClusterDataBranches]; }); } #endif -- (void)_pruneEmptyStoredAttributesBranches +- (void)_pruneEmptyStoredClusterDataBranches { dispatch_assert_queue(_storageDelegateQueue); @@ -648,36 +546,10 @@ - (void)_pruneEmptyStoredAttributesBranches NSMutableArray<NSNumber *> * clusterIndexCopy = [clusterIndex mutableCopy]; for (NSNumber * clusterID in clusterIndex) { - // Fetch attribute index - NSArray<NSNumber *> * attributeIndex = [self _fetchAttributeIndexForNodeID:nodeID endpointID:endpointID clusterID:clusterID]; - NSMutableArray<NSNumber *> * attributeIndexCopy = [attributeIndex mutableCopy]; - - for (NSNumber * attributeID in attributeIndex) { - NSDictionary * value = [self _fetchAttributeValueForNodeID:nodeID endpointID:endpointID clusterID:clusterID attributeID:attributeID]; - - if (!value) { - [attributeIndexCopy removeObject:attributeID]; - } - } - - if (attributeIndex.count != attributeIndexCopy.count) { - BOOL success; - BOOL clusterDataSuccess = YES; - if (attributeIndexCopy.count) { - success = [self _storeAttributeIndex:attributeIndexCopy forNodeID:nodeID endpointID:endpointID clusterID:clusterID]; - } else { - [clusterIndexCopy removeObject:clusterID]; - success = [self _deleteAttributeIndexForNodeID:nodeID endpointID:endpointID clusterID:clusterID]; - clusterDataSuccess = [self _deleteClusterDataForNodeID:nodeID endpointID:endpointID clusterID:clusterID]; - } - if (!success) { - storeFailures++; - MTR_LOG_INFO("Store failed in _pruneEmptyStoredAttributesBranches for attributeIndex (%lu) @ node 0x%016llX endpoint %u cluster 0x%08lX", static_cast<unsigned long>(attributeIndexCopy.count), nodeID.unsignedLongLongValue, endpointID.unsignedShortValue, clusterID.unsignedLongValue); - } - if (!clusterDataSuccess) { - storeFailures++; - MTR_LOG_INFO("Store failed in _pruneEmptyStoredAttributesBranches for clusterData @ node 0x%016llX endpoint %u cluster 0x%08lX", nodeID.unsignedLongLongValue, endpointID.unsignedShortValue, clusterID.unsignedLongValue); - } + // Fetch cluster data, if it exists. + MTRDeviceClusterData * clusterData = [self _fetchClusterDataForNodeID:nodeID endpointID:endpointID clusterID:clusterID]; + if (!clusterData) { + [clusterIndexCopy removeObject:clusterID]; } } @@ -691,7 +563,7 @@ - (void)_pruneEmptyStoredAttributesBranches } if (!success) { storeFailures++; - MTR_LOG_INFO("Store failed in _pruneEmptyStoredAttributesBranches for clusterIndex (%lu) @ node 0x%016llX endpoint %u", static_cast<unsigned long>(clusterIndexCopy.count), nodeID.unsignedLongLongValue, endpointID.unsignedShortValue); + MTR_LOG_INFO("Store failed in _pruneEmptyStoredClusterDataBranches for clusterIndex (%lu) @ node 0x%016llX endpoint %u", static_cast<unsigned long>(clusterIndexCopy.count), nodeID.unsignedLongLongValue, endpointID.unsignedShortValue); } } } @@ -706,7 +578,7 @@ - (void)_pruneEmptyStoredAttributesBranches } if (!success) { storeFailures++; - MTR_LOG_INFO("Store failed in _pruneEmptyStoredAttributesBranches for endpointIndex (%lu) @ node 0x%016llX", static_cast<unsigned long>(endpointIndexCopy.count), nodeID.unsignedLongLongValue); + MTR_LOG_INFO("Store failed in _pruneEmptyStoredClusterDataBranches for endpointIndex (%lu) @ node 0x%016llX", static_cast<unsigned long>(endpointIndexCopy.count), nodeID.unsignedLongLongValue); } } } @@ -720,114 +592,23 @@ - (void)_pruneEmptyStoredAttributesBranches } if (!success) { storeFailures++; - MTR_LOG_INFO("Store failed in _pruneEmptyStoredAttributesBranches for nodeIndex (%lu)", static_cast<unsigned long>(nodeIndexCopy.count)); + MTR_LOG_INFO("Store failed in _pruneEmptyStoredClusterDataBranches for nodeIndex (%lu)", static_cast<unsigned long>(nodeIndexCopy.count)); } } if (storeFailures) { - MTR_LOG_ERROR("Store failed in _pruneEmptyStoredAttributesBranches: failure count %lu", static_cast<unsigned long>(storeFailures)); + MTR_LOG_ERROR("Store failed in _pruneEmptyStoredClusterDataBranches: failure count %lu", static_cast<unsigned long>(storeFailures)); } } -- (void)storeAttributeValues:(NSArray<NSDictionary *> *)dataValues forNodeID:(NSNumber *)nodeID +- (void)_clearStoredClusterDataForNodeID:(NSNumber *)nodeID { - dispatch_async(_storageDelegateQueue, ^{ - NSUInteger storeFailures = 0; - - for (NSDictionary * dataValue in dataValues) { - MTRAttributePath * path = dataValue[MTRAttributePathKey]; - NSDictionary * value = dataValue[MTRDataKey]; - -#if ATTRIBUTE_CACHE_VERBOSE_LOGGING - MTR_LOG_INFO("Attempt to store attribute value @ node 0x%016llX endpoint %u cluster 0x%08lX attribute 0x%08lX", nodeID.unsignedLongLongValue, path.endpoint.unsignedShortValue, path.cluster.unsignedLongValue, path.attribute.unsignedLongValue); -#endif - - BOOL storeFailed = NO; - // Ensure node index exists - NSArray<NSNumber *> * nodeIndex = [self _fetchNodeIndex]; - if (!nodeIndex) { - nodeIndex = [NSArray arrayWithObject:nodeID]; - storeFailed = ![self _storeNodeIndex:nodeIndex]; - } else if (![nodeIndex containsObject:nodeID]) { - storeFailed = ![self _storeNodeIndex:[nodeIndex arrayByAddingObject:nodeID]]; - } - if (storeFailed) { - storeFailures++; - MTR_LOG_INFO("Store failed for nodeIndex"); - continue; - } - - // Ensure endpoint index exists - NSArray<NSNumber *> * endpointIndex = [self _fetchEndpointIndexForNodeID:nodeID]; - if (!endpointIndex) { - endpointIndex = [NSArray arrayWithObject:path.endpoint]; - storeFailed = ![self _storeEndpointIndex:endpointIndex forNodeID:nodeID]; - } else if (![endpointIndex containsObject:path.endpoint]) { - storeFailed = ![self _storeEndpointIndex:[endpointIndex arrayByAddingObject:path.endpoint] forNodeID:nodeID]; - } - if (storeFailed) { - storeFailures++; - MTR_LOG_INFO("Store failed for endpointIndex @ node 0x%016llX", nodeID.unsignedLongLongValue); - continue; - } - - // Ensure cluster index exists - NSArray<NSNumber *> * clusterIndex = [self _fetchClusterIndexForNodeID:nodeID endpointID:path.endpoint]; - if (!clusterIndex) { - clusterIndex = [NSArray arrayWithObject:path.cluster]; - storeFailed = ![self _storeClusterIndex:clusterIndex forNodeID:nodeID endpointID:path.endpoint]; - } else if (![clusterIndex containsObject:path.cluster]) { - storeFailed = ![self _storeClusterIndex:[clusterIndex arrayByAddingObject:path.cluster] forNodeID:nodeID endpointID:path.endpoint]; - } - if (storeFailed) { - storeFailures++; - MTR_LOG_INFO("Store failed for clusterIndex @ node 0x%016llX endpoint %u", nodeID.unsignedLongLongValue, path.endpoint.unsignedShortValue); - continue; - } - - // TODO: Add per-cluster integrity check calculation and store with cluster - // TODO: Think about adding more integrity check for endpoint and node levels as well - - // Ensure attribute index exists - NSArray<NSNumber *> * attributeIndex = [self _fetchAttributeIndexForNodeID:nodeID endpointID:path.endpoint clusterID:path.cluster]; - if (!attributeIndex) { - attributeIndex = [NSArray arrayWithObject:path.attribute]; - storeFailed = ![self _storeAttributeIndex:attributeIndex forNodeID:nodeID endpointID:path.endpoint clusterID:path.cluster]; - } else if (![attributeIndex containsObject:path.attribute]) { - storeFailed = ![self _storeAttributeIndex:[attributeIndex arrayByAddingObject:path.attribute] forNodeID:nodeID endpointID:path.endpoint clusterID:path.cluster]; - } - if (storeFailed) { - storeFailures++; - MTR_LOG_INFO("Store failed for attributeIndex @ node 0x%016llX endpoint %u cluster 0x%08lX", nodeID.unsignedLongLongValue, path.endpoint.unsignedShortValue, path.cluster.unsignedLongValue); - continue; - } - - // Store value - storeFailed = ![self _storeAttributeValue:value forNodeID:nodeID endpointID:path.endpoint clusterID:path.cluster attributeID:path.attribute]; - if (storeFailed) { - storeFailures++; - MTR_LOG_INFO("Store failed for attribute value @ node 0x%016llX endpoint %u cluster 0x%08lX attribute 0x%08lX", nodeID.unsignedLongLongValue, path.endpoint.unsignedShortValue, path.cluster.unsignedLongValue, path.attribute.unsignedLongValue); - } - } - - // In the rare event that store fails, allow all attribute store attempts to go through and prune empty branches at the end altogether. - if (storeFailures) { - [self _pruneEmptyStoredAttributesBranches]; - MTR_LOG_ERROR("Store failed in -storeAttributeValues:forNodeID: failure count %lu", static_cast<unsigned long>(storeFailures)); - } - }); -} + dispatch_assert_queue(_storageDelegateQueue); -- (void)_clearStoredAttributesForNodeID:(NSNumber *)nodeID -{ NSUInteger endpointsClearAttempts = 0; - NSUInteger clustersClearAttempts = 0; NSUInteger clusterDataClearAttempts = 0; - NSUInteger attributesClearAttempts = 0; NSUInteger endpointsCleared = 0; - NSUInteger clustersCleared = 0; NSUInteger clusterDataCleared = 0; - NSUInteger attributesCleared = 0; // Fetch endpoint index NSArray<NSNumber *> * endpointIndex = [self _fetchEndpointIndexForNodeID:nodeID]; @@ -837,30 +618,9 @@ - (void)_clearStoredAttributesForNodeID:(NSNumber *)nodeID // Fetch cluster index NSArray<NSNumber *> * clusterIndex = [self _fetchClusterIndexForNodeID:nodeID endpointID:endpointID]; - clustersClearAttempts += clusterIndex.count; clusterDataClearAttempts += clusterIndex.count; // Assuming every cluster has cluster data for (NSNumber * clusterID in clusterIndex) { - // Fetch attribute index - NSArray<NSNumber *> * attributeIndex = [self _fetchAttributeIndexForNodeID:nodeID endpointID:endpointID clusterID:clusterID]; - - attributesClearAttempts += attributeIndex.count; - for (NSNumber * attributeID in attributeIndex) { - BOOL success = [self _deleteAttributeValueForNodeID:nodeID endpointID:endpointID clusterID:clusterID attributeID:attributeID]; - if (!success) { - MTR_LOG_INFO("Delete failed for attribute value @ node 0x%016llX endpoint %u cluster 0x%08lX attribute 0x%08lX", nodeID.unsignedLongLongValue, endpointID.unsignedShortValue, clusterID.unsignedLongValue, attributeID.unsignedLongValue); - } else { - attributesCleared++; - } - } - - BOOL success = [self _deleteAttributeIndexForNodeID:nodeID endpointID:endpointID clusterID:clusterID]; - if (!success) { - MTR_LOG_INFO("Delete failed for attributeIndex @ node 0x%016llX endpoint %u cluster 0x%08lX", nodeID.unsignedLongLongValue, endpointID.unsignedShortValue, clusterID.unsignedLongValue); - } else { - clustersCleared++; - } - - success = [self _deleteClusterDataForNodeID:nodeID endpointID:endpointID clusterID:clusterID]; + BOOL success = [self _deleteClusterDataForNodeID:nodeID endpointID:endpointID clusterID:clusterID]; if (!success) { MTR_LOG_INFO("Delete failed for clusterData @ node 0x%016llX endpoint %u cluster 0x%08lX", nodeID.unsignedLongLongValue, endpointID.unsignedShortValue, clusterID.unsignedLongValue); } else { @@ -878,16 +638,16 @@ - (void)_clearStoredAttributesForNodeID:(NSNumber *)nodeID BOOL success = [self _deleteEndpointIndexForNodeID:nodeID]; if (!success) { - MTR_LOG_INFO("Delete failed for endpointrIndex @ node 0x%016llX", nodeID.unsignedLongLongValue); + MTR_LOG_INFO("Delete failed for endpointIndex @ node 0x%016llX", nodeID.unsignedLongLongValue); } - MTR_LOG_INFO("clearStoredAttributesForNodeID: deleted endpoints %lu/%lu clusters %lu/%lu clusterData %lu/%lu attributes %lu/%lu", static_cast<unsigned long>(endpointsCleared), static_cast<unsigned long>(endpointsClearAttempts), static_cast<unsigned long>(clustersCleared), static_cast<unsigned long>(clustersClearAttempts), static_cast<unsigned long>(clusterDataCleared), static_cast<unsigned long>(clusterDataClearAttempts), static_cast<unsigned long>(attributesCleared), static_cast<unsigned long>(attributesClearAttempts)); + MTR_LOG_INFO("clearStoredClusterDataForNodeID: deleted endpoints %lu/%lu clusters %lu/%lu", static_cast<unsigned long>(endpointsCleared), static_cast<unsigned long>(endpointsClearAttempts), static_cast<unsigned long>(clusterDataCleared), static_cast<unsigned long>(clusterDataClearAttempts)); } -- (void)clearStoredAttributesForNodeID:(NSNumber *)nodeID +- (void)clearStoredClusterDataForNodeID:(NSNumber *)nodeID { dispatch_async(_storageDelegateQueue, ^{ - [self _clearStoredAttributesForNodeID:nodeID]; + [self _clearStoredClusterDataForNodeID:nodeID]; NSArray<NSNumber *> * nodeIndex = [self _fetchNodeIndex]; NSMutableArray<NSNumber *> * nodeIndexCopy = [nodeIndex mutableCopy]; [nodeIndexCopy removeObject:nodeID]; @@ -905,14 +665,14 @@ - (void)clearStoredAttributesForNodeID:(NSNumber *)nodeID }); } -- (void)clearAllStoredAttributes +- (void)clearAllStoredClusterData { dispatch_async(_storageDelegateQueue, ^{ // Fetch node index NSArray<NSNumber *> * nodeIndex = [self _fetchNodeIndex]; for (NSNumber * nodeID in nodeIndex) { - [self _clearStoredAttributesForNodeID:nodeID]; + [self _clearStoredClusterDataForNodeID:nodeID]; } BOOL success = [self _deleteNodeIndex]; @@ -943,7 +703,10 @@ - (void)clearAllStoredAttributes NSArray<NSNumber *> * endpointIndex = [self _fetchEndpointIndexForNodeID:nodeID]; if (endpointIndex) { MTR_LOG_ERROR("Persistent attribute cache contains orphaned entry for nodeID %@ - deleting", nodeID); - [self clearStoredAttributesForNodeID:nodeID]; + // _clearStoredClusterDataForNodeID because we are are already + // on the _storageDelegateQueue and do not need to modify the + // node index in this case. + [self _clearStoredClusterDataForNodeID:nodeID]; } MTR_LOG_INFO("Fetch got no value for endpointIndex @ node 0x%016llX", nodeID.unsignedLongLongValue); @@ -1203,10 +966,10 @@ - (void)storeClusterData:(NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> } } - // In the rare event that store fails, allow all attribute store attempts to go through and prune empty branches at the end altogether. + // In the rare event that store fails, allow all cluster data store attempts to go through and prune empty branches at the end altogether. if (storeFailures) { - [self _pruneEmptyStoredAttributesBranches]; - MTR_LOG_ERROR("Store failed in -storeAttributeValues:forNodeID: failure count %lu", static_cast<unsigned long>(storeFailures)); + [self _pruneEmptyStoredClusterDataBranches]; + MTR_LOG_ERROR("Store failed in -storeClusterData:forNodeID: failure count %lu", static_cast<unsigned long>(storeFailures)); } }); } diff --git a/src/darwin/Framework/CHIP/MTRDevice_Internal.h b/src/darwin/Framework/CHIP/MTRDevice_Internal.h index 28833060ba6c27..57ee5446f3ba50 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_Internal.h +++ b/src/darwin/Framework/CHIP/MTRDevice_Internal.h @@ -30,9 +30,6 @@ typedef NSDictionary<NSString *, id> * MTRDeviceDataValueDictionary; typedef void (^MTRDevicePerformAsyncBlock)(MTRBaseDevice * baseDevice); -// Whether to store attributes by cluster instead of as individual entries for each attribute -#define MTRDEVICE_ATTRIBUTE_CACHE_STORE_ATTRIBUTES_BY_CLUSTER 1 - /** * Information about a cluster, currently is just data version */ diff --git a/src/darwin/Framework/CHIPTests/MTRDeviceTests.m b/src/darwin/Framework/CHIPTests/MTRDeviceTests.m index 4f97026ed6644f..d13f319faaa9e9 100644 --- a/src/darwin/Framework/CHIPTests/MTRDeviceTests.m +++ b/src/darwin/Framework/CHIPTests/MTRDeviceTests.m @@ -179,9 +179,9 @@ + (void)tearDown // Restore testing setting to previous state, and remove all persisted attributes MTRDeviceControllerLocalTestStorage.localTestStorageEnabled = slocalTestStorageEnabledBeforeUnitTest; - [sController.controllerDataStore clearAllStoredAttributes]; - NSArray * storedAttributesAfterClear = [sController.controllerDataStore getStoredAttributesForNodeID:@(kDeviceId)]; - XCTAssertEqual(storedAttributesAfterClear.count, 0); + [sController.controllerDataStore clearAllStoredClusterData]; + NSDictionary * storedClusterDataAfterClear = [sController.controllerDataStore getStoredClusterDataForNodeID:@(kDeviceId)]; + XCTAssertEqual(storedClusterDataAfterClear.count, 0); MTRDeviceController * controller = sController; XCTAssertNotNil(controller); @@ -1346,9 +1346,9 @@ - (void)test016_FailedSubscribeWithCacheReadDuringFailure - (void)test017_TestMTRDeviceBasics { // Ensure the test starts with clean slate, even with MTRDeviceControllerLocalTestStorage enabled - [sController.controllerDataStore clearAllStoredAttributes]; - NSArray * storedAttributesAfterClear = [sController.controllerDataStore getStoredAttributesForNodeID:@(kDeviceId)]; - XCTAssertEqual(storedAttributesAfterClear.count, 0); + [sController.controllerDataStore clearAllStoredClusterData]; + NSDictionary * storedClusterDataAfterClear = [sController.controllerDataStore getStoredClusterDataForNodeID:@(kDeviceId)]; + XCTAssertEqual(storedClusterDataAfterClear.count, 0); __auto_type * device = [MTRDevice deviceWithNodeID:kDeviceId deviceController:sController]; dispatch_queue_t queue = dispatch_get_main_queue(); @@ -2571,9 +2571,9 @@ - (void)test028_TimeZoneAndDST - (void)test029_MTRDeviceWriteCoalescing { // Ensure the test starts with clean slate, even with MTRDeviceControllerLocalTestStorage enabled - [sController.controllerDataStore clearAllStoredAttributes]; - NSArray * storedAttributesAfterClear = [sController.controllerDataStore getStoredAttributesForNodeID:@(kDeviceId)]; - XCTAssertEqual(storedAttributesAfterClear.count, 0); + [sController.controllerDataStore clearAllStoredClusterData]; + NSDictionary * storedClusterDataAfterClear = [sController.controllerDataStore getStoredClusterDataForNodeID:@(kDeviceId)]; + XCTAssertEqual(storedClusterDataAfterClear.count, 0); __auto_type * device = [MTRDevice deviceWithNodeID:kDeviceId deviceController:sController]; dispatch_queue_t queue = dispatch_get_main_queue(); @@ -2910,9 +2910,9 @@ - (void)test031_MTRDeviceAttributeCacheLocalTestStorage // First start with clean slate by removing the MTRDevice and clearing the persisted cache __auto_type * device = [MTRDevice deviceWithNodeID:@(kDeviceId) controller:sController]; [sController removeDevice:device]; - [sController.controllerDataStore clearAllStoredAttributes]; - NSArray * storedAttributesAfterClear = [sController.controllerDataStore getStoredAttributesForNodeID:@(kDeviceId)]; - XCTAssertEqual(storedAttributesAfterClear.count, 0); + [sController.controllerDataStore clearAllStoredClusterData]; + NSDictionary * storedClusterDataAfterClear = [sController.controllerDataStore getStoredClusterDataForNodeID:@(kDeviceId)]; + XCTAssertEqual(storedClusterDataAfterClear.count, 0); // Now recreate device and get subscription primed device = [MTRDevice deviceWithNodeID:@(kDeviceId) controller:sController]; @@ -2934,13 +2934,8 @@ - (void)test031_MTRDeviceAttributeCacheLocalTestStorage NSUInteger attributesReportedWithFirstSubscription = [device unitTestAttributesReportedSinceLastCheck]; -#if MTRDEVICE_ATTRIBUTE_CACHE_STORE_ATTRIBUTES_BY_CLUSTER NSDictionary * dataStoreClusterDataAfterFirstSubscription = [sController.controllerDataStore getStoredClusterDataForNodeID:@(kDeviceId)]; XCTAssertTrue(dataStoreClusterDataAfterFirstSubscription.count > 0); -#else - NSArray * dataStoreValuesAfterFirstSubscription = [sController.controllerDataStore getStoredAttributesForNodeID:@(kDeviceId)]; - XCTAssertTrue(dataStoreValuesAfterFirstSubscription.count > 0); -#endif // Now remove device, resubscribe, and see that it succeeds [sController removeDevice:device]; @@ -2971,8 +2966,13 @@ - (void)test031_MTRDeviceAttributeCacheLocalTestStorage // 2) Some attributes do change on resubscribe // * With all-clusts-app as of 2024-02-10, out of 1287 persisted attributes, still 450 attributes were reported with filter // And so conservatively, assert that data version filters save at least 300 entries. - NSArray * dataStoreValuesAfterSecondSubscription = [sController.controllerDataStore getStoredAttributesForNodeID:@(kDeviceId)]; - NSUInteger storedAttributeCountDifferenceFromMTRDeviceReport = dataStoreValuesAfterSecondSubscription.count - attributesReportedWithSecondSubscription; + NSDictionary * storedClusterDataAfterSecondSubscription = [sController.controllerDataStore getStoredClusterDataForNodeID:@(kDeviceId)]; + NSUInteger dataStoreAttributeCountAfterSecondSubscription = 0; + for (NSNumber * clusterID in storedClusterDataAfterSecondSubscription) { + MTRDeviceClusterData * clusterData = storedClusterDataAfterSecondSubscription[clusterID]; + dataStoreAttributeCountAfterSecondSubscription += clusterData.attributes.count; + } + NSUInteger storedAttributeCountDifferenceFromMTRDeviceReport = dataStoreAttributeCountAfterSecondSubscription - attributesReportedWithSecondSubscription; XCTAssertTrue(storedAttributeCountDifferenceFromMTRDeviceReport > 300); } diff --git a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m index df98530a81db18..bea49d957653c7 100644 --- a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m +++ b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m @@ -19,6 +19,7 @@ // system dependencies #import <XCTest/XCTest.h> +#import "MTRDeviceControllerLocalTestStorage.h" #import "MTRDeviceTestDelegate.h" #import "MTRDevice_Internal.h" #import "MTRErrorTestUtils.h" @@ -181,6 +182,7 @@ @interface MTRPerControllerStorageTests : XCTestCase @implementation MTRPerControllerStorageTests { dispatch_queue_t _storageQueue; + BOOL _localTestStorageEnabledBeforeUnitTest; } - (void)setUp @@ -189,6 +191,12 @@ - (void)setUp [super setUp]; [self setContinueAfterFailure:NO]; + // Make sure local test storage is off, because we assume that the storage + // delegate we provide is in fact used for local storage as part of our + // tests. + _localTestStorageEnabledBeforeUnitTest = MTRDeviceControllerLocalTestStorage.localTestStorageEnabled; + MTRDeviceControllerLocalTestStorage.localTestStorageEnabled = NO; + _storageQueue = dispatch_queue_create("test.storage.queue", DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL); } @@ -197,6 +205,10 @@ - (void)tearDown // Per-test teardown, runs after each test. [self stopFactory]; _storageQueue = nil; + + // Restore local test storage setting to previous state. + MTRDeviceControllerLocalTestStorage.localTestStorageEnabled = _localTestStorageEnabledBeforeUnitTest; + [super tearDown]; } @@ -1081,132 +1093,137 @@ - (void)test008_TestDataStoreDirect XCTAssertEqualObjects(controller.controllerNodeID, nodeID); - NSArray * testAttributes = @[ - @{ MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(1) clusterID:@(1) attributeID:@(1)], MTRDataKey : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(111) } }, - @{ MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(1) clusterID:@(1) attributeID:@(2)], MTRDataKey : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(112) } }, - @{ MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(1) clusterID:@(1) attributeID:@(3)], MTRDataKey : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(113) } }, - - @{ MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(1) clusterID:@(2) attributeID:@(1)], MTRDataKey : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(121) } }, - @{ MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(1) clusterID:@(2) attributeID:@(2)], MTRDataKey : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(122) } }, - @{ MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(1) clusterID:@(2) attributeID:@(3)], MTRDataKey : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(123) } }, - - @{ MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(2) clusterID:@(1) attributeID:@(1)], MTRDataKey : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(211) } }, - @{ MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(2) clusterID:@(1) attributeID:@(2)], MTRDataKey : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(212) } }, - @{ MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(2) clusterID:@(1) attributeID:@(3)], MTRDataKey : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(213) } }, - ]; - [controller.controllerDataStore storeAttributeValues:testAttributes forNodeID:@(1001)]; - [controller.controllerDataStore storeAttributeValues:testAttributes forNodeID:@(1002)]; - [controller.controllerDataStore storeAttributeValues:testAttributes forNodeID:@(1003)]; - MTRDeviceClusterData * testClusterData1 = [[MTRDeviceClusterData alloc] init]; testClusterData1.dataVersion = @(1); + testClusterData1.attributes = @{ + @(1) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(111) }, + @(2) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(112) }, + @(3) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(113) }, + }; MTRDeviceClusterData * testClusterData2 = [[MTRDeviceClusterData alloc] init]; testClusterData2.dataVersion = @(2); + testClusterData2.attributes = @{ + @(1) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(121) }, + @(2) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(122) }, + @(3) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(123) }, + }; MTRDeviceClusterData * testClusterData3 = [[MTRDeviceClusterData alloc] init]; testClusterData3.dataVersion = @(3); + testClusterData3.attributes = @{ + @(1) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(211) }, + @(2) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(212) }, + @(3) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(213) }, + }; NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * testClusterData = @{ [MTRClusterPath clusterPathWithEndpointID:@(1) clusterID:@(1)] : testClusterData1, [MTRClusterPath clusterPathWithEndpointID:@(1) clusterID:@(2)] : testClusterData2, - [MTRClusterPath clusterPathWithEndpointID:@(1) clusterID:@(3)] : testClusterData3, + [MTRClusterPath clusterPathWithEndpointID:@(2) clusterID:@(3)] : testClusterData3, }; [controller.controllerDataStore storeClusterData:testClusterData forNodeID:@(1001)]; + [controller.controllerDataStore storeClusterData:testClusterData forNodeID:@(1002)]; + [controller.controllerDataStore storeClusterData:testClusterData forNodeID:@(1003)]; - // Check values are written and can be fetched - NSArray * dataStoreValues = [controller.controllerDataStore getStoredAttributesForNodeID:@(1001)]; - XCTAssertEqual(dataStoreValues.count, 9); - dataStoreValues = [controller.controllerDataStore getStoredAttributesForNodeID:@(1002)]; - XCTAssertEqual(dataStoreValues.count, 9); - dataStoreValues = [controller.controllerDataStore getStoredAttributesForNodeID:@(1003)]; - XCTAssertEqual(dataStoreValues.count, 9); - - // Check values - NSUInteger unexpectedValues = 0; - for (NSDictionary * responseValue in dataStoreValues) { - MTRAttributePath * path = responseValue[MTRAttributePathKey]; - XCTAssertNotNil(path); - NSDictionary * dataValue = responseValue[MTRDataKey]; - XCTAssertNotNil(dataValue); - NSString * type = dataValue[MTRTypeKey]; - XCTAssertNotNil(type); - XCTAssertEqualObjects(type, MTRUnsignedIntegerValueType); - NSNumber * value = dataValue[MTRValueKey]; - XCTAssertNotNil(value); - - if ([path.endpoint isEqualToNumber:@(1)] && [path.cluster isEqualToNumber:@(1)] && [path.attribute isEqualToNumber:@(1)]) { - XCTAssertEqualObjects(value, @(111)); - } else if ([path.endpoint isEqualToNumber:@(1)] && [path.cluster isEqualToNumber:@(1)] && [path.attribute isEqualToNumber:@(2)]) { - XCTAssertEqualObjects(value, @(112)); - } else if ([path.endpoint isEqualToNumber:@(1)] && [path.cluster isEqualToNumber:@(1)] && [path.attribute isEqualToNumber:@(3)]) { - XCTAssertEqualObjects(value, @(113)); - } else if ([path.endpoint isEqualToNumber:@(1)] && [path.cluster isEqualToNumber:@(2)] && [path.attribute isEqualToNumber:@(1)]) { - XCTAssertEqualObjects(value, @(121)); - } else if ([path.endpoint isEqualToNumber:@(1)] && [path.cluster isEqualToNumber:@(2)] && [path.attribute isEqualToNumber:@(2)]) { - XCTAssertEqualObjects(value, @(122)); - } else if ([path.endpoint isEqualToNumber:@(1)] && [path.cluster isEqualToNumber:@(2)] && [path.attribute isEqualToNumber:@(3)]) { - XCTAssertEqualObjects(value, @(123)); - } else if ([path.endpoint isEqualToNumber:@(2)] && [path.cluster isEqualToNumber:@(1)] && [path.attribute isEqualToNumber:@(1)]) { - XCTAssertEqualObjects(value, @(211)); - } else if ([path.endpoint isEqualToNumber:@(2)] && [path.cluster isEqualToNumber:@(1)] && [path.attribute isEqualToNumber:@(2)]) { - XCTAssertEqualObjects(value, @(212)); - } else if ([path.endpoint isEqualToNumber:@(2)] && [path.cluster isEqualToNumber:@(1)] && [path.attribute isEqualToNumber:@(3)]) { - XCTAssertEqualObjects(value, @(213)); - } else { - unexpectedValues++; + for (NSNumber * nodeID in @[ @(1001), @(1002), @(1003) ]) { + NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * dataStoreClusterData = [controller.controllerDataStore getStoredClusterDataForNodeID:nodeID]; + for (MTRClusterPath * path in testClusterData) { + XCTAssertEqualObjects(testClusterData[path], dataStoreClusterData[path]); } } - XCTAssertEqual(unexpectedValues, 0); - NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * dataStoreClusterData = [controller.controllerDataStore getStoredClusterDataForNodeID:@(1001)]; - for (MTRClusterPath * path in testClusterData) { - XCTAssertEqualObjects(testClusterData[path].dataVersion, dataStoreClusterData[path].dataVersion); + [controller.controllerDataStore clearStoredClusterDataForNodeID:@(1001)]; + XCTAssertNil([controller.controllerDataStore getStoredClusterDataForNodeID:@(1001)]); + for (NSNumber * nodeID in @[ @(1002), @(1003) ]) { + NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * dataStoreClusterData = [controller.controllerDataStore getStoredClusterDataForNodeID:nodeID]; + for (MTRClusterPath * path in testClusterData) { + XCTAssertEqualObjects(testClusterData[path], dataStoreClusterData[path]); + } } - [controller.controllerDataStore clearStoredAttributesForNodeID:@(1001)]; - dataStoreValues = [controller.controllerDataStore getStoredAttributesForNodeID:@(1001)]; - XCTAssertEqual(dataStoreValues.count, 0); - dataStoreValues = [controller.controllerDataStore getStoredAttributesForNodeID:@(1002)]; - XCTAssertEqual(dataStoreValues.count, 9); - dataStoreValues = [controller.controllerDataStore getStoredAttributesForNodeID:@(1003)]; - XCTAssertEqual(dataStoreValues.count, 9); - - [controller.controllerDataStore clearAllStoredAttributes]; - dataStoreValues = [controller.controllerDataStore getStoredAttributesForNodeID:@(1001)]; - XCTAssertEqual(dataStoreValues.count, 0); - dataStoreValues = [controller.controllerDataStore getStoredAttributesForNodeID:@(1002)]; - XCTAssertEqual(dataStoreValues.count, 0); - dataStoreValues = [controller.controllerDataStore getStoredAttributesForNodeID:@(1003)]; - XCTAssertEqual(dataStoreValues.count, 0); + [controller.controllerDataStore clearAllStoredClusterData]; + for (NSNumber * nodeID in @[ @(1001), @(1002), @(1003) ]) { + XCTAssertNil([controller.controllerDataStore getStoredClusterDataForNodeID:nodeID]); + } // Test MTRDeviceControllerDataStore _pruneEmptyStoredAttributesBranches // - Clear cache - // - Store an attribute - // - Manually delete it from the test storage delegate + // - Store some cluster data + // - Manually delete parts of the data from the test storage delegate // - Call _pruneEmptyStoredAttributesBranches - [controller.controllerDataStore clearAllStoredAttributes]; + [controller.controllerDataStore storeClusterData:testClusterData forNodeID:@(2001)]; + [controller.controllerDataStore storeClusterData:testClusterData forNodeID:@(2002)]; - NSArray * testAttribute = @[ - @{ MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(1) clusterID:@(1) attributeID:@(1)], MTRDataKey : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(111) } }, - ]; - [controller.controllerDataStore storeAttributeValues:testAttribute forNodeID:@(2001)]; + NSString * testClusterIndexKey1 = [controller.controllerDataStore _clusterIndexKeyForNodeID:@(2001) endpointID:@(1)]; + NSString * testClusterIndexKey2 = [controller.controllerDataStore _clusterIndexKeyForNodeID:@(2001) endpointID:@(2)]; + NSString * testClusterIndexKey3 = [controller.controllerDataStore _clusterIndexKeyForNodeID:@(2002) endpointID:@(1)]; + NSString * testClusterIndexKey4 = [controller.controllerDataStore _clusterIndexKeyForNodeID:@(2002) endpointID:@(2)]; + NSString * testEndpointIndexKey1 = [controller.controllerDataStore _endpointIndexKeyForNodeID:@(2001)]; + NSString * testEndpointIndexKey2 = [controller.controllerDataStore _endpointIndexKeyForNodeID:@(2002)]; + NSString * testNodeIndexKey = @"attrCacheNodeIndex"; // store is async, so remove on the same queue to ensure order dispatch_sync(_storageQueue, ^{ - NSString * testAttributeValueKey = [controller.controllerDataStore _attributeValueKeyForNodeID:@(2001) endpointID:@(1) clusterID:@(1) attributeID:@(1)]; - [storageDelegate controller:controller removeValueForKey:testAttributeValueKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + // Ensure that the indices we expect are populated. + XCTAssertNotNil([storageDelegate controller:controller valueForKey:testClusterIndexKey1 securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]); + XCTAssertNotNil([storageDelegate controller:controller valueForKey:testClusterIndexKey2 securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]); + XCTAssertNotNil([storageDelegate controller:controller valueForKey:testClusterIndexKey3 securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]); + XCTAssertNotNil([storageDelegate controller:controller valueForKey:testClusterIndexKey4 securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]); + XCTAssertNotNil([storageDelegate controller:controller valueForKey:testEndpointIndexKey1 securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]); + XCTAssertNotNil([storageDelegate controller:controller valueForKey:testEndpointIndexKey2 securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]); + XCTAssertNotNil([storageDelegate controller:controller valueForKey:testNodeIndexKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]); + + // Remove all three MTRDeviceClusterData for node 2001 + NSString * testClusterDataKey = [controller.controllerDataStore _clusterDataKeyForNodeID:@(2001) endpointID:@(1) clusterID:@(1)]; + [storageDelegate controller:controller removeValueForKey:testClusterDataKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + testClusterDataKey = [controller.controllerDataStore _clusterDataKeyForNodeID:@(2001) endpointID:@(1) clusterID:@(2)]; + [storageDelegate controller:controller removeValueForKey:testClusterDataKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + testClusterDataKey = [controller.controllerDataStore _clusterDataKeyForNodeID:@(2001) endpointID:@(2) clusterID:@(3)]; + [storageDelegate controller:controller removeValueForKey:testClusterDataKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + + // Remove the two MTRDeviceClusterData under endpoint 1 for node 2002 + testClusterDataKey = [controller.controllerDataStore _clusterDataKeyForNodeID:@(2002) endpointID:@(1) clusterID:@(1)]; + [storageDelegate controller:controller removeValueForKey:testClusterDataKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + testClusterDataKey = [controller.controllerDataStore _clusterDataKeyForNodeID:@(2002) endpointID:@(1) clusterID:@(2)]; + [storageDelegate controller:controller removeValueForKey:testClusterDataKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + }); + + [controller.controllerDataStore unitTestPruneEmptyStoredClusterDataBranches]; + + // Now check the indexes are pruned. There should be no more cluster + // indices or endpoint indices for node 2001. + id testClusterIndex1 = [storageDelegate controller:controller valueForKey:testClusterIndexKey1 securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + XCTAssertNil(testClusterIndex1); + id testClusterIndex2 = [storageDelegate controller:controller valueForKey:testClusterIndexKey2 securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + XCTAssertNil(testClusterIndex2); + id testEndpointIndex1 = [storageDelegate controller:controller valueForKey:testEndpointIndexKey1 securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + XCTAssertNil(testEndpointIndex1); + + // There should be no more cluster index for endpoint 1 for node 2, but + // we should still have a cluster index for endpoint 2, and an endpoint index. + id testClusterIndex3 = [storageDelegate controller:controller valueForKey:testClusterIndexKey3 securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + XCTAssertNil(testClusterIndex3); + id testClusterIndex4 = [storageDelegate controller:controller valueForKey:testClusterIndexKey4 securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + XCTAssertNotNil(testClusterIndex4); + id testEndpointIndex2 = [storageDelegate controller:controller valueForKey:testEndpointIndexKey2 securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + XCTAssertNotNil(testClusterIndex4); + + // We should still have a node index. + id testNodeIndex = [storageDelegate controller:controller valueForKey:testNodeIndexKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + XCTAssertNotNil(testNodeIndex); + + // Again, remove on the storage queue to ensure order. + dispatch_sync(_storageQueue, ^{ + NSString * testClusterDataKey = [controller.controllerDataStore _clusterDataKeyForNodeID:@(2002) endpointID:@(2) clusterID:@(3)]; + [storageDelegate controller:controller removeValueForKey:testClusterDataKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; }); - [controller.controllerDataStore unitTestPruneEmptyStoredAttributesBranches]; - - // Now check the indexes are pruned - NSString * testAttributeIndexKey = [controller.controllerDataStore _attributeIndexKeyForNodeID:@(2001) endpointID:@(1) clusterID:@(1)]; - id testAttributeIndex = [storageDelegate controller:controller valueForKey:testAttributeIndexKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; - XCTAssertNil(testAttributeIndex); - NSString * testClusterIndexKey = [controller.controllerDataStore _clusterIndexKeyForNodeID:@(2001) endpointID:@(1)]; - id testClusterIndex = [storageDelegate controller:controller valueForKey:testClusterIndexKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; - XCTAssertNil(testClusterIndex); - NSString * testEndpointIndexKey = [controller.controllerDataStore _endpointIndexKeyForNodeID:@(2001)]; - id testEndpointIndex = [storageDelegate controller:controller valueForKey:testEndpointIndexKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; - XCTAssertNil(testEndpointIndex); - id testNodeIndex = [storageDelegate controller:controller valueForKey:@"attrCacheNodeIndex" securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + + [controller.controllerDataStore unitTestPruneEmptyStoredClusterDataBranches]; + + // All the indices should be pruned now. + testClusterIndex4 = [storageDelegate controller:controller valueForKey:testClusterIndexKey4 securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + XCTAssertNil(testClusterIndex4); + testEndpointIndex2 = [storageDelegate controller:controller valueForKey:testEndpointIndexKey2 securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + XCTAssertNil(testClusterIndex4); + testNodeIndex = [storageDelegate controller:controller valueForKey:testNodeIndexKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; XCTAssertNil(testNodeIndex); // Now test bulk write @@ -1275,11 +1292,11 @@ - (void)test008_TestDataStoreDirect [storageDelegate controller:controller storeValues:testBulkValues securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; }); // Verify that the store resulted in the correct values - dataStoreClusterData = [controller.controllerDataStore getStoredClusterDataForNodeID:@(3001)]; + NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * dataStoreClusterData = [controller.controllerDataStore getStoredClusterDataForNodeID:@(3001)]; XCTAssertEqualObjects(dataStoreClusterData, bulkTestClusterDataDictionary); // clear information before the next test - [controller.controllerDataStore clearStoredAttributesForNodeID:@(3001)]; + [controller.controllerDataStore clearStoredClusterDataForNodeID:@(3001)]; // Now test bulk store through data store [controller.controllerDataStore storeClusterData:bulkTestClusterDataDictionary forNodeID:@(3001)]; @@ -1356,7 +1373,6 @@ - (void)doDataStoreMTRDeviceTestWithStorageDelegate:(id<MTRDeviceControllerStora [self waitForExpectations:@[ subscriptionExpectation ] timeout:60]; NSUInteger dataStoreValuesCount = 0; -#if MTRDEVICE_ATTRIBUTE_CACHE_STORE_ATTRIBUTES_BY_CLUSTER NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * dataStoreClusterData = [controller.controllerDataStore getStoredClusterDataForNodeID:deviceID]; for (MTRClusterPath * path in dataStoreClusterData) { MTRDeviceClusterData * data = dataStoreClusterData[path]; @@ -1367,21 +1383,6 @@ - (void)doDataStoreMTRDeviceTestWithStorageDelegate:(id<MTRDeviceControllerStora XCTAssertTrue([device _attributeDataValue:dataValue isEqualToDataValue:dataValueFromMTRDevice]); } } -#else - NSArray * dataStoreValues = [controller.controllerDataStore getStoredAttributesForNodeID:deviceID]; - dataStoreValuesCount = dataStoreValues.count; - - // Verify all values are stored into storage - for (NSDictionary * responseValue in dataStoreValues) { - MTRAttributePath * path = responseValue[MTRAttributePathKey]; - XCTAssertNotNil(path); - NSDictionary * dataValue = responseValue[MTRDataKey]; - XCTAssertNotNil(dataValue); - - NSDictionary * dataValueFromMTRDevice = [device readAttributeWithEndpointID:path.endpoint clusterID:path.cluster attributeID:path.attribute params:nil]; - XCTAssertTrue([device _attributeDataValue:dataValue isEqualToDataValue:dataValueFromMTRDevice]); - } -#endif // Now force the removal of the object from controller to test reloading read cache from storage [controller removeDevice:device]; @@ -1389,7 +1390,6 @@ - (void)doDataStoreMTRDeviceTestWithStorageDelegate:(id<MTRDeviceControllerStora // Verify the new device is initialized with the same values __auto_type * newDevice = [MTRDevice deviceWithNodeID:deviceID controller:controller]; NSUInteger storedAttributeDifferFromMTRDeviceCount = 0; -#if MTRDEVICE_ATTRIBUTE_CACHE_STORE_ATTRIBUTES_BY_CLUSTER for (MTRClusterPath * path in dataStoreClusterData) { MTRDeviceClusterData * data = dataStoreClusterData[path]; for (NSNumber * attributeID in data.attributes) { @@ -1400,19 +1400,6 @@ - (void)doDataStoreMTRDeviceTestWithStorageDelegate:(id<MTRDeviceControllerStora } } } -#else - for (NSDictionary * responseValue in dataStoreValues) { - MTRAttributePath * path = responseValue[MTRAttributePathKey]; - XCTAssertNotNil(path); - NSDictionary * dataValue = responseValue[MTRDataKey]; - XCTAssertNotNil(dataValue); - - NSDictionary * dataValueFromMTRDevice = [newDevice readAttributeWithEndpointID:path.endpoint clusterID:path.cluster attributeID:path.attribute params:nil]; - if (![newDevice _attributeDataValue:dataValue isEqualToDataValue:dataValueFromMTRDevice]) { - storedAttributeDifferFromMTRDeviceCount++; - } - } -#endif // Only test that 90% of attributes are the same because there are some changing attributes each time (UTC time, for example) // * With all-clusters-app as of 2024-02-10, about 1.476% of attributes change. diff --git a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h index b3ef0327cb1bea..6f5755c27fd815 100644 --- a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h +++ b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h @@ -25,18 +25,14 @@ NS_ASSUME_NONNULL_BEGIN @class MTRDeviceClusterData; // MTRDeviceControllerDataStore.h includes C++ header, and so we need to declare the methods separately @protocol MTRDeviceControllerDataStoreAttributeStoreMethods -- (nullable NSArray<NSDictionary *> *)getStoredAttributesForNodeID:(NSNumber *)nodeID; - (nullable NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)getStoredClusterDataForNodeID:(NSNumber *)nodeID; -- (void)storeAttributeValues:(NSArray<NSDictionary *> *)dataValues forNodeID:(NSNumber *)nodeID; - (void)storeClusterData:(NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)clusterData forNodeID:(NSNumber *)nodeID; -- (void)clearStoredAttributesForNodeID:(NSNumber *)nodeID; -- (void)clearAllStoredAttributes; -- (void)unitTestPruneEmptyStoredAttributesBranches; +- (void)clearStoredClusterDataForNodeID:(NSNumber *)nodeID; +- (void)clearAllStoredClusterData; +- (void)unitTestPruneEmptyStoredClusterDataBranches; - (NSString *)_endpointIndexKeyForNodeID:(NSNumber *)nodeID; - (NSString *)_clusterIndexKeyForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID; - (NSString *)_clusterDataKeyForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID; -- (NSString *)_attributeIndexKeyForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID; -- (NSString *)_attributeValueKeyForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID attributeID:(NSNumber *)attributeID; @end // Declare internal methods for testing From b5d43efae79f3ad520a53575d5832fdbae33a4bc Mon Sep 17 00:00:00 2001 From: Maksymilian Knust <m.knust@samsung.com> Date: Tue, 23 Apr 2024 18:29:15 +0200 Subject: [PATCH 004/124] Switched to pw_unit_test in src/lib/dnssd/minimal_mdns/tests/ (#33068) * Switched to pw_unit_test in src/lib/dnssd/minimal_mdns/tests/ * Update src/lib/dnssd/minimal_mdns/tests/TestMinimalMdnsAllocator.cpp * Update src/lib/dnssd/minimal_mdns/tests/TestResponseSender.cpp --------- Co-authored-by: Arkadiusz Bokowy <arkadiusz.bokowy@gmail.com> Co-authored-by: Arkadiusz Bokowy <a.bokowy@samsung.com> --- src/lib/dnssd/minimal_mdns/tests/BUILD.gn | 5 +- .../minimal_mdns/tests/CheckOnlyServer.h | 33 +- .../minimal_mdns/tests/TestAdvertiser.cpp | 288 +++++++++--------- .../tests/TestMinimalMdnsAllocator.cpp | 209 ++++++------- .../tests/TestQueryReplyFilter.cpp | 80 ++--- .../minimal_mdns/tests/TestRecordData.cpp | 149 ++++----- .../minimal_mdns/tests/TestResponseSender.cpp | 169 +++++----- 7 files changed, 402 insertions(+), 531 deletions(-) diff --git a/src/lib/dnssd/minimal_mdns/tests/BUILD.gn b/src/lib/dnssd/minimal_mdns/tests/BUILD.gn index 8d99854046e307..dc09e4b4b59d5d 100644 --- a/src/lib/dnssd/minimal_mdns/tests/BUILD.gn +++ b/src/lib/dnssd/minimal_mdns/tests/BUILD.gn @@ -14,12 +14,11 @@ import("//build_overrides/build.gni") import("//build_overrides/chip.gni") -import("//build_overrides/nlunit_test.gni") import("${chip_root}/build/chip/chip_test_suite.gni") import("${chip_root}/build/chip/fuzz_test.gni") -chip_test_suite_using_nltest("tests") { +chip_test_suite("tests") { output_name = "libMinimalMdnstests" sources = [ "CheckOnlyServer.h" ] @@ -40,9 +39,7 @@ chip_test_suite_using_nltest("tests") { "${chip_root}/src/lib/core", "${chip_root}/src/lib/dnssd", "${chip_root}/src/lib/dnssd/minimal_mdns", - "${chip_root}/src/lib/support:testing_nlunit", "${chip_root}/src/transport/raw/tests:helpers", - "${nlunit_test_root}:nlunit-test", ] } diff --git a/src/lib/dnssd/minimal_mdns/tests/CheckOnlyServer.h b/src/lib/dnssd/minimal_mdns/tests/CheckOnlyServer.h index c5b8f9e21f060b..1aabc6738d00e6 100644 --- a/src/lib/dnssd/minimal_mdns/tests/CheckOnlyServer.h +++ b/src/lib/dnssd/minimal_mdns/tests/CheckOnlyServer.h @@ -29,10 +29,9 @@ #include <lib/dnssd/minimal_mdns/records/Srv.h> #include <lib/dnssd/minimal_mdns/records/Txt.h> #include <lib/support/CHIPMemString.h> -#include <lib/support/UnitTestRegistration.h> #include <system/SystemMutex.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> namespace mdns { namespace Minimal { @@ -78,23 +77,19 @@ class CheckOnlyServer : private chip::PoolImpl<ServerBase::EndpointInfo, 0, chip public TxtRecordDelegate { public: - CheckOnlyServer(nlTestSuite * inSuite) : ServerBase(*static_cast<ServerBase::EndpointInfoPoolType *>(this)), mInSuite(inSuite) - { - Reset(); - } - CheckOnlyServer() : ServerBase(*static_cast<ServerBase::EndpointInfoPoolType *>(this)), mInSuite(nullptr) { Reset(); } + CheckOnlyServer() : ServerBase(*static_cast<ServerBase::EndpointInfoPoolType *>(this)) { Reset(); } ~CheckOnlyServer() {} // Parser delegates void OnHeader(ConstHeaderRef & header) override { - NL_TEST_ASSERT(mInSuite, header.GetFlags().IsResponse()); - NL_TEST_ASSERT(mInSuite, header.GetFlags().IsValidMdns()); + EXPECT_TRUE(header.GetFlags().IsResponse()); + EXPECT_TRUE(header.GetFlags().IsValidMdns()); mTotalRecords += header.GetAnswerCount() + header.GetAdditionalCount(); if (!header.GetFlags().IsTruncated()) { - NL_TEST_ASSERT(mInSuite, mTotalRecords == GetNumExpectedRecords()); + EXPECT_EQ(mTotalRecords, GetNumExpectedRecords()); if (mTotalRecords != GetNumExpectedRecords()) { ChipLogError(Discovery, "Received %d records, expected %d", mTotalRecords, GetNumExpectedRecords()); @@ -114,7 +109,7 @@ class CheckOnlyServer : private chip::PoolImpl<ServerBase::EndpointInfo, 0, chip case QType::SRV: { SrvRecord srv; bool srvParseOk = srv.Parse(data.GetData(), mPacketData); - NL_TEST_ASSERT(mInSuite, srvParseOk); + EXPECT_TRUE(srvParseOk); if (!srvParseOk) { return; @@ -146,7 +141,7 @@ class CheckOnlyServer : private chip::PoolImpl<ServerBase::EndpointInfo, 0, chip for (size_t t = 0; t < expectedTxt->GetNumEntries(); ++t) { bool ok = AddExpectedTxtRecord(expectedTxt->GetEntries()[t]); - NL_TEST_ASSERT(mInSuite, ok); + EXPECT_TRUE(ok); } ParseTxtRecord(data.GetData(), this); if (CheckTxtRecordMatches()) @@ -164,7 +159,7 @@ class CheckOnlyServer : private chip::PoolImpl<ServerBase::EndpointInfo, 0, chip } } } - NL_TEST_ASSERT(mInSuite, recordIsExpected); + EXPECT_TRUE(recordIsExpected); if (!recordIsExpected) { char nameStr[64]; @@ -253,7 +248,7 @@ class CheckOnlyServer : private chip::PoolImpl<ServerBase::EndpointInfo, 0, chip void AddExpectedRecord(SrvResourceRecord * srv) { RecordInfo * info = AddExpectedRecordBase(srv); - NL_TEST_ASSERT(mInSuite, info != nullptr); + ASSERT_NE(info, nullptr); if (info == nullptr) { return; @@ -263,7 +258,7 @@ class CheckOnlyServer : private chip::PoolImpl<ServerBase::EndpointInfo, 0, chip void AddExpectedRecord(TxtResourceRecord * txt) { RecordInfo * info = AddExpectedRecordBase(txt); - NL_TEST_ASSERT(mInSuite, info != nullptr); + ASSERT_NE(info, nullptr); if (info == nullptr) { return; @@ -272,7 +267,6 @@ class CheckOnlyServer : private chip::PoolImpl<ServerBase::EndpointInfo, 0, chip } bool GetSendCalled() { return mSendCalled; } bool GetHeaderFound() { return mHeaderFound; } - void SetTestSuite(nlTestSuite * suite) { mInSuite = suite; } void Reset() { for (auto & info : mExpectedRecordInfo) @@ -287,7 +281,6 @@ class CheckOnlyServer : private chip::PoolImpl<ServerBase::EndpointInfo, 0, chip } private: - nlTestSuite * mInSuite; static constexpr size_t kMaxExpectedRecords = 10; struct RecordInfo { @@ -335,17 +328,13 @@ class CheckOnlyServer : private chip::PoolImpl<ServerBase::EndpointInfo, 0, chip } void TestGotAllExpectedPackets() { - if (mInSuite == nullptr) - { - return; - } for (auto & info : mExpectedRecordInfo) { if (info.record == nullptr) { continue; } - NL_TEST_ASSERT(mInSuite, info.found == true); + EXPECT_TRUE(info.found); if (!info.found) { char name[64]; diff --git a/src/lib/dnssd/minimal_mdns/tests/TestAdvertiser.cpp b/src/lib/dnssd/minimal_mdns/tests/TestAdvertiser.cpp index 547d4eecf3bc54..b39fd5858858c1 100644 --- a/src/lib/dnssd/minimal_mdns/tests/TestAdvertiser.cpp +++ b/src/lib/dnssd/minimal_mdns/tests/TestAdvertiser.cpp @@ -29,12 +29,11 @@ #include <lib/dnssd/minimal_mdns/records/Srv.h> #include <lib/dnssd/minimal_mdns/records/Txt.h> #include <lib/dnssd/minimal_mdns/tests/CheckOnlyServer.h> -#include <lib/support/UnitTestContext.h> -#include <lib/support/UnitTestRegistration.h> + #include <system/SystemPacketBuffer.h> #include <transport/raw/tests/NetworkTestHelpers.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> namespace { @@ -237,29 +236,57 @@ CHIP_ERROR SendQuery(FullQName qname) return CHIP_NO_ERROR; } -void OperationalAdverts(nlTestSuite * inSuite, void * inContext) +class TestAdvertiser : public ::testing::Test { - auto & mdnsAdvertiser = chip::Dnssd::ServiceAdvertiser::Instance(); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.RemoveServices() == CHIP_NO_ERROR); +public: + static chip::Test::IOContext context; + static CheckOnlyServer server; + static chip::Dnssd::ServiceAdvertiser * mdnsAdvertiser; + + static void SetUpTestSuite() + { + chip::Platform::MemoryInit(); + context.Init(); + chip::Dnssd::GlobalMinimalMdnsServer::Instance().Server().Shutdown(); + chip::Dnssd::GlobalMinimalMdnsServer::Instance().SetReplacementServer(&server); + mdnsAdvertiser = &chip::Dnssd::ServiceAdvertiser::Instance(); + mdnsAdvertiser->Init(context.GetUDPEndPointManager()); + } + static void TearDownTestSuite() + { + server.Shutdown(); + context.Shutdown(); + mdnsAdvertiser->RemoveServices(); + mdnsAdvertiser->Shutdown(); + chip::Dnssd::GlobalMinimalMdnsServer::Instance().SetReplacementServer(nullptr); + chip::Platform::MemoryShutdown(); + } +}; + +chip::Test::IOContext TestAdvertiser::context; +CheckOnlyServer TestAdvertiser::server; +chip::Dnssd::ServiceAdvertiser * TestAdvertiser::mdnsAdvertiser; + +TEST_F(TestAdvertiser, OperationalAdverts) +{ + EXPECT_EQ(mdnsAdvertiser->RemoveServices(), CHIP_NO_ERROR); - auto & server = static_cast<CheckOnlyServer &>(GlobalMinimalMdnsServer::Server()); - server.SetTestSuite(inSuite); server.Reset(); // Start a single operational advertiser ChipLogProgress(Discovery, "Testing single operational advertiser"); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.Advertise(operationalParams1) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.FinalizeServiceUpdate() == CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->Advertise(operationalParams1), CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->FinalizeServiceUpdate(), CHIP_NO_ERROR); // Test for PTR response to _services request. ChipLogProgress(Discovery, "Checking response to _services._dns-sd._udp.local"); server.AddExpectedRecord(&ptrOperationalService); server.AddExpectedRecord(&ptrServiceSubCompressedId1); - NL_TEST_ASSERT(inSuite, SendQuery(kDnsSdQueryName) == CHIP_NO_ERROR); + EXPECT_EQ(SendQuery(kDnsSdQueryName), CHIP_NO_ERROR); // These check that the requested records added are sent out correctly. - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); // Want PTR response to _matter.tcp. We will also get the SRV and TXT as additionals. // We won't get any A/AAAA because this is a test and we don't have addresses. @@ -271,31 +298,31 @@ void OperationalAdverts(nlTestSuite * inSuite, void * inContext) server.AddExpectedRecord(&srvOperational1); server.AddExpectedRecord(&txtOperational1); - NL_TEST_ASSERT(inSuite, SendQuery(kMatterOperationalQueryName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kMatterOperationalQueryName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); ChipLogProgress(Discovery, "Testing response to instance name"); server.Reset(); // Just the SRV and TXT should return server.AddExpectedRecord(&srvOperational1); server.AddExpectedRecord(&txtOperational1); - NL_TEST_ASSERT(inSuite, SendQuery(kInstanceName1) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kInstanceName1), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); // If we try to re-advertise with the same operational parameters, we should not get duplicates - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.Advertise(operationalParams1) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.FinalizeServiceUpdate() == CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->Advertise(operationalParams1), CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->FinalizeServiceUpdate(), CHIP_NO_ERROR); ChipLogProgress(Discovery, "Testing single operational advertiser with Advertise called twice"); // We should get a single PTR back for _services ChipLogProgress(Discovery, "Checking response to _services._dns-sd._udp.local"); server.Reset(); server.AddExpectedRecord(&ptrOperationalService); server.AddExpectedRecord(&ptrServiceSubCompressedId1); - NL_TEST_ASSERT(inSuite, SendQuery(kDnsSdQueryName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kDnsSdQueryName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); // Same records should come back for _matter._tcp.local queries. ChipLogProgress(Discovery, "Testing response to _matter._tcp.local"); @@ -303,16 +330,16 @@ void OperationalAdverts(nlTestSuite * inSuite, void * inContext) server.AddExpectedRecord(&ptrOperational1); server.AddExpectedRecord(&srvOperational1); server.AddExpectedRecord(&txtOperational1); - NL_TEST_ASSERT(inSuite, SendQuery(kMatterOperationalQueryName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kMatterOperationalQueryName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); // Adding a second operational advertiser. ChipLogProgress(Discovery, "Adding a second operational Advertiser"); server.Reset(); // Mac is the same, peer id is different - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.Advertise(operationalParams2) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.FinalizeServiceUpdate() == CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->Advertise(operationalParams2), CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->FinalizeServiceUpdate(), CHIP_NO_ERROR); // For now, we'll get back two copies of the PTR. Not sure if that's totally correct, but for now, that's expected. ChipLogProgress(Discovery, "Checking response to _services._dns-sd._udp.local"); @@ -320,9 +347,9 @@ void OperationalAdverts(nlTestSuite * inSuite, void * inContext) server.AddExpectedRecord(&ptrOperationalService); server.AddExpectedRecord(&ptrServiceSubCompressedId1); server.AddExpectedRecord(&ptrServiceSubCompressedId2); - NL_TEST_ASSERT(inSuite, SendQuery(kDnsSdQueryName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kDnsSdQueryName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); // Requests for _matter._tcp.local will respond with all records from both parameter sets ChipLogProgress(Discovery, "Testing response to _matter._tcp.local"); @@ -333,9 +360,9 @@ void OperationalAdverts(nlTestSuite * inSuite, void * inContext) server.AddExpectedRecord(&ptrOperational2); server.AddExpectedRecord(&srvOperational2); server.AddExpectedRecord(&txtOperational2); - NL_TEST_ASSERT(inSuite, SendQuery(kMatterOperationalQueryName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kMatterOperationalQueryName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); // Requests for each SRV record should give only records specific to that fabric. ChipLogProgress(Discovery, "Testing response to instance name for fabric 1"); @@ -343,79 +370,75 @@ void OperationalAdverts(nlTestSuite * inSuite, void * inContext) // Just the SRV and TXT should return server.AddExpectedRecord(&srvOperational1); server.AddExpectedRecord(&txtOperational1); - NL_TEST_ASSERT(inSuite, SendQuery(kInstanceName1) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kInstanceName1), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); ChipLogProgress(Discovery, "Testing response to instance name for fabric 2"); server.Reset(); // Just the SRV and TXT should return server.AddExpectedRecord(&srvOperational2); server.AddExpectedRecord(&txtOperational2); - NL_TEST_ASSERT(inSuite, SendQuery(kInstanceName2) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kInstanceName2), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); // All devices should support at least 5 operational network additions (spec min) // however larger devices may support more. - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.Advertise(operationalParams3) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.Advertise(operationalParams4) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.Advertise(operationalParams5) == CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->Advertise(operationalParams3), CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->Advertise(operationalParams4), CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->Advertise(operationalParams5), CHIP_NO_ERROR); } -void CommissionableAdverts(nlTestSuite * inSuite, void * inContext) +TEST_F(TestAdvertiser, CommissionableAdverts) { - auto & mdnsAdvertiser = chip::Dnssd::ServiceAdvertiser::Instance(); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.RemoveServices() == CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->RemoveServices(), CHIP_NO_ERROR); - auto & server = static_cast<CheckOnlyServer &>(GlobalMinimalMdnsServer::Server()); - server.SetTestSuite(inSuite); server.Reset(); // Start a single operational advertiser ChipLogProgress(Discovery, "Testing commissionable advertiser"); // Start very basic - only the mandatory values (short and long discriminator and commissioning modes) - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.Advertise(commissionableNodeParamsSmall) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.FinalizeServiceUpdate() == CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->Advertise(commissionableNodeParamsSmall), CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->FinalizeServiceUpdate(), CHIP_NO_ERROR); // Test for PTR response to _services request. ChipLogProgress(Discovery, "Checking response to _services._dns-sd._udp.local for small parameters"); server.AddExpectedRecord(&ptrCommissionableNodeService); server.AddExpectedRecord(&ptrServiceSubLFullLen); server.AddExpectedRecord(&ptrServiceSubSFullLen); - NL_TEST_ASSERT(inSuite, SendQuery(kDnsSdQueryName) == CHIP_NO_ERROR); + EXPECT_EQ(SendQuery(kDnsSdQueryName), CHIP_NO_ERROR); // These check that the requested records added are sent out correctly. - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); // Want PTR response to _matterc._udp. We will also get the SRV and TXT as additionals. // We won't get any A/AAAA because this is a test and we don't have addresses. // First fill in the instance name - FullQNames already have this space included. - NL_TEST_ASSERT(inSuite, - mdnsAdvertiser.GetCommissionableInstanceName(instanceNamePrefix, sizeof(instanceNamePrefix)) == CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->GetCommissionableInstanceName(instanceNamePrefix, sizeof(instanceNamePrefix)), CHIP_NO_ERROR); ChipLogProgress(Discovery, "Testing response to _matterc._udp.local for small parameters"); server.Reset(); server.AddExpectedRecord(&ptrCommissionableNode); server.AddExpectedRecord(&srvCommissionableNode); server.AddExpectedRecord(&txtCommissionableNodeParamsSmall); - NL_TEST_ASSERT(inSuite, SendQuery(kMatterCommissionableNodeQueryName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kMatterCommissionableNodeQueryName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); ChipLogProgress(Discovery, "Testing response to instance name for small parameters"); server.Reset(); // Just the SRV and TXT should return server.AddExpectedRecord(&srvCommissionableNode); server.AddExpectedRecord(&txtCommissionableNodeParamsSmall); - NL_TEST_ASSERT(inSuite, SendQuery(instanceName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(instanceName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); // Add more parameters, check that the subtypes and TXT values get set correctly. // Also check that we get proper values when the discriminators are small (no leading 0's) - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.Advertise(commissionableNodeParamsLargeBasic) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.FinalizeServiceUpdate() == CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->Advertise(commissionableNodeParamsLargeBasic), CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->FinalizeServiceUpdate(), CHIP_NO_ERROR); ChipLogProgress(Discovery, "Checking response to _services._dns-sd._udp.local for large basic parameters"); server.Reset(); server.AddExpectedRecord(&ptrCommissionableNodeService); @@ -424,30 +447,30 @@ void CommissionableAdverts(nlTestSuite * inSuite, void * inContext) server.AddExpectedRecord(&ptrServiceSubCM); server.AddExpectedRecord(&ptrServiceSubVendor); server.AddExpectedRecord(&ptrServiceSubDeviceType); - NL_TEST_ASSERT(inSuite, SendQuery(kDnsSdQueryName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kDnsSdQueryName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); ChipLogProgress(Discovery, "Testing response to _matterc._udp.local for large basic parameters"); server.Reset(); server.AddExpectedRecord(&ptrCommissionableNode); server.AddExpectedRecord(&srvCommissionableNode); server.AddExpectedRecord(&txtCommissionableNodeParamsLargeBasic); - NL_TEST_ASSERT(inSuite, SendQuery(kMatterCommissionableNodeQueryName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kMatterCommissionableNodeQueryName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); ChipLogProgress(Discovery, "Testing response to instance name for large basic parameters"); server.Reset(); // Just the SRV and TXT should return server.AddExpectedRecord(&srvCommissionableNode); server.AddExpectedRecord(&txtCommissionableNodeParamsLargeBasic); - NL_TEST_ASSERT(inSuite, SendQuery(instanceName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(instanceName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.Advertise(commissionableNodeParamsLargeEnhanced) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.FinalizeServiceUpdate() == CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->Advertise(commissionableNodeParamsLargeEnhanced), CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->FinalizeServiceUpdate(), CHIP_NO_ERROR); ChipLogProgress(Discovery, "Checking response to _services._dns-sd._udp.local for large enhanced parameters"); server.Reset(); server.AddExpectedRecord(&ptrCommissionableNodeService); @@ -456,65 +479,62 @@ void CommissionableAdverts(nlTestSuite * inSuite, void * inContext) server.AddExpectedRecord(&ptrServiceSubCM); server.AddExpectedRecord(&ptrServiceSubVendor); server.AddExpectedRecord(&ptrServiceSubDeviceType); - NL_TEST_ASSERT(inSuite, SendQuery(kDnsSdQueryName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kDnsSdQueryName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); ChipLogProgress(Discovery, "Testing response to _matterc._udp.local for large enhanced parameters"); server.Reset(); server.AddExpectedRecord(&ptrCommissionableNode); server.AddExpectedRecord(&srvCommissionableNode); server.AddExpectedRecord(&txtCommissionableNodeParamsLargeEnhanced); - NL_TEST_ASSERT(inSuite, SendQuery(kMatterCommissionableNodeQueryName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kMatterCommissionableNodeQueryName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); ChipLogProgress(Discovery, "Testing response to instance name for large enhanced parameters"); server.Reset(); // Just the SRV and TXT should return server.AddExpectedRecord(&srvCommissionableNode); server.AddExpectedRecord(&txtCommissionableNodeParamsLargeEnhanced); - NL_TEST_ASSERT(inSuite, SendQuery(instanceName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(instanceName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); #if CHIP_CONFIG_ENABLE_ICD_SERVER - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.Advertise(commissionableNodeParamsEnhancedAsICDLIT) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.FinalizeServiceUpdate() == CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->Advertise(commissionableNodeParamsEnhancedAsICDLIT), CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->FinalizeServiceUpdate(), CHIP_NO_ERROR); ChipLogProgress(Discovery, "Testing response to _matterc._udp.local for enhanced parameters With ICD as LIT"); server.Reset(); server.AddExpectedRecord(&ptrCommissionableNode); server.AddExpectedRecord(&srvCommissionableNode); server.AddExpectedRecord(&txtCommissionableNodeParamsEnhancedAsICDLIT); - NL_TEST_ASSERT(inSuite, SendQuery(kMatterCommissionableNodeQueryName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kMatterCommissionableNodeQueryName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); ChipLogProgress(Discovery, "Testing response to instance name for enhanced parameters With ICD as LIT"); server.Reset(); // Just the SRV and TXT should return server.AddExpectedRecord(&srvCommissionableNode); server.AddExpectedRecord(&txtCommissionableNodeParamsEnhancedAsICDLIT); - NL_TEST_ASSERT(inSuite, SendQuery(instanceName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(instanceName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); #endif } -void CommissionableAndOperationalAdverts(nlTestSuite * inSuite, void * inContext) +TEST_F(TestAdvertiser, CommissionableAndOperationalAdverts) { - auto & mdnsAdvertiser = chip::Dnssd::ServiceAdvertiser::Instance(); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.RemoveServices() == CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->RemoveServices(), CHIP_NO_ERROR); - auto & server = static_cast<CheckOnlyServer &>(GlobalMinimalMdnsServer::Server()); - server.SetTestSuite(inSuite); server.Reset(); // Add two operational and a commissionable and test that we get the correct values back. - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.Advertise(operationalParams1) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.Advertise(operationalParams2) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.Advertise(commissionableNodeParamsLargeEnhanced) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsAdvertiser.FinalizeServiceUpdate() == CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->Advertise(operationalParams1), CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->Advertise(operationalParams2), CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->Advertise(commissionableNodeParamsLargeEnhanced), CHIP_NO_ERROR); + EXPECT_EQ(mdnsAdvertiser->FinalizeServiceUpdate(), CHIP_NO_ERROR); // Services listing should have two operational ptrs, the base commissionable node ptr and the various _sub ptrs ChipLogProgress(Discovery, "Checking response to _services._dns-sd._udp.local"); @@ -529,9 +549,9 @@ void CommissionableAndOperationalAdverts(nlTestSuite * inSuite, void * inContext server.AddExpectedRecord(&ptrServiceSubDeviceType); server.AddExpectedRecord(&ptrServiceSubCompressedId1); server.AddExpectedRecord(&ptrServiceSubCompressedId2); - NL_TEST_ASSERT(inSuite, SendQuery(kDnsSdQueryName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kDnsSdQueryName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); // Requests for _matter._tcp.local will respond with all records from both operational records, but no commissionable. ChipLogProgress(Discovery, "Testing response to _matter._tcp.local"); @@ -542,9 +562,9 @@ void CommissionableAndOperationalAdverts(nlTestSuite * inSuite, void * inContext server.AddExpectedRecord(&ptrOperational2); server.AddExpectedRecord(&srvOperational2); server.AddExpectedRecord(&txtOperational2); - NL_TEST_ASSERT(inSuite, SendQuery(kMatterOperationalQueryName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kMatterOperationalQueryName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); // Responses to _matterc query should return commissionable node, but no operational. ChipLogProgress(Discovery, "Testing response to _matterc._udp.local"); @@ -552,9 +572,9 @@ void CommissionableAndOperationalAdverts(nlTestSuite * inSuite, void * inContext server.AddExpectedRecord(&ptrCommissionableNode); server.AddExpectedRecord(&srvCommissionableNode); server.AddExpectedRecord(&txtCommissionableNodeParamsLargeEnhanced); - NL_TEST_ASSERT(inSuite, SendQuery(kMatterCommissionableNodeQueryName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kMatterCommissionableNodeQueryName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); // Requests for each SRV record should give only records specific to that fabric. ChipLogProgress(Discovery, "Testing response to operational instance name for fabric 1"); @@ -562,56 +582,26 @@ void CommissionableAndOperationalAdverts(nlTestSuite * inSuite, void * inContext // Just the SRV and TXT should return server.AddExpectedRecord(&srvOperational1); server.AddExpectedRecord(&txtOperational1); - NL_TEST_ASSERT(inSuite, SendQuery(kInstanceName1) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kInstanceName1), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); ChipLogProgress(Discovery, "Testing response to operational instance name for fabric 2"); server.Reset(); // Just the SRV and TXT should return server.AddExpectedRecord(&srvOperational2); server.AddExpectedRecord(&txtOperational2); - NL_TEST_ASSERT(inSuite, SendQuery(kInstanceName2) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(kInstanceName2), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); ChipLogProgress(Discovery, "Testing response to commissionable instance name"); server.Reset(); // Just the SRV and TXT should return server.AddExpectedRecord(&srvCommissionableNode); server.AddExpectedRecord(&txtCommissionableNodeParamsLargeEnhanced); - NL_TEST_ASSERT(inSuite, SendQuery(instanceName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, server.GetHeaderFound()); + EXPECT_EQ(SendQuery(instanceName), CHIP_NO_ERROR); + EXPECT_TRUE(server.GetSendCalled()); + EXPECT_TRUE(server.GetHeaderFound()); } - -const nlTest sTests[] = { - NL_TEST_DEF("OperationalAdverts", OperationalAdverts), // - NL_TEST_DEF("CommissionableNodeAdverts", CommissionableAdverts), // - NL_TEST_DEF("CommissionableAndOperationalAdverts", CommissionableAndOperationalAdverts), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestAdvertiser() -{ - chip::Platform::MemoryInit(); - chip::Test::IOContext context; - context.Init(); - nlTestSuite theSuite = { "AdvertiserImplMinimal", sTests, nullptr, nullptr }; - CheckOnlyServer server(&theSuite); - test::ServerSwapper swapper(&server); - auto & mdnsAdvertiser = chip::Dnssd::ServiceAdvertiser::Instance(); - mdnsAdvertiser.Init(context.GetUDPEndPointManager()); - nlTestRunner(&theSuite, &server); - server.Shutdown(); - context.Shutdown(); - mdnsAdvertiser.RemoveServices(); - mdnsAdvertiser.Shutdown(); - chip::Platform::MemoryShutdown(); - - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestAdvertiser) diff --git a/src/lib/dnssd/minimal_mdns/tests/TestMinimalMdnsAllocator.cpp b/src/lib/dnssd/minimal_mdns/tests/TestMinimalMdnsAllocator.cpp index c712b1bd647f47..f571e81fcf27d1 100644 --- a/src/lib/dnssd/minimal_mdns/tests/TestMinimalMdnsAllocator.cpp +++ b/src/lib/dnssd/minimal_mdns/tests/TestMinimalMdnsAllocator.cpp @@ -16,11 +16,9 @@ * limitations under the License. */ -#include <lib/dnssd/Advertiser_ImplMinimalMdnsAllocator.h> - -#include <lib/support/UnitTestRegistration.h> +#include <gtest/gtest.h> -#include <nlunit-test.h> +#include <lib/dnssd/Advertiser_ImplMinimalMdnsAllocator.h> using namespace chip; using namespace chip::Dnssd; @@ -42,21 +40,21 @@ class TestAllocator : public QueryResponderAllocator<kMaxRecords> // void dmalloc_track(const dmalloc_track_t track_func) #endif } - void TestAllQNamesAreNull(nlTestSuite * inSuite) + void TestAllQNamesAreNull() { for (size_t i = 0; i < GetMaxAllocatedQNames(); ++i) { - NL_TEST_ASSERT(inSuite, GetQNamePart(i) == nullptr); + EXPECT_EQ(GetQNamePart(i), nullptr); } } - void TestAllRecordRespondersAreNull(nlTestSuite * inSuite) + void TestAllRecordRespondersAreNull() { for (size_t i = 0; i < kMaxRecords; ++i) { - NL_TEST_ASSERT(inSuite, GetRecordResponder(i) == nullptr); + EXPECT_EQ(GetRecordResponder(i), nullptr); } } - void TestRecordRespondersMatchQuery(nlTestSuite * inSuite) + void TestRecordRespondersMatchQuery() { mdns::Minimal::QueryResponderRecordFilter noFilter; auto queryResponder = GetQueryResponder(); @@ -64,56 +62,63 @@ class TestAllocator : public QueryResponderAllocator<kMaxRecords> for (auto it = queryResponder->begin(&noFilter); it != queryResponder->end(); it++, idx++) { // TODO: Once the responders are exposed in the query responder, check that they match. - NL_TEST_ASSERT(inSuite, idx < kMaxRecords); + EXPECT_LT(idx, kMaxRecords); } } size_t GetMaxAllocatedQNames() { return QueryResponderAllocator<kMaxRecords>::GetMaxAllocatedQNames(); } }; -void TestQueryAllocatorQName(nlTestSuite * inSuite, void * inContext) +class TestMinimalMdnsAllocator : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestMinimalMdnsAllocator, TestQueryAllocatorQName) { TestAllocator test; #if CHIP_CONFIG_MEMORY_DEBUG_DMALLOC unsigned long mark = dmalloc_mark(); #endif // Start empty. - test.TestAllRecordRespondersAreNull(inSuite); - test.TestAllQNamesAreNull(inSuite); + test.TestAllRecordRespondersAreNull(); + test.TestAllQNamesAreNull(); // We should be able to add up to GetMaxAllocatedQNames QNames for (size_t i = 0; i < test.GetMaxAllocatedQNames(); ++i) { - NL_TEST_ASSERT(inSuite, test.AllocateQName("test", "testy", "udp") != FullQName()); - test.TestAllRecordRespondersAreNull(inSuite); + EXPECT_NE(test.AllocateQName("test", "testy", "udp"), FullQName()); + test.TestAllRecordRespondersAreNull(); } #if CHIP_CONFIG_MEMORY_DEBUG_DMALLOC // Count the memory that has not been freed at this point (since mark) unsigned long nAllocated = dmalloc_count_changed(mark, 1, 0); - NL_TEST_ASSERT(inSuite, nAllocated != 0); + EXPECT_NE(nAllocated, 0); #endif // Adding one more should fail. - NL_TEST_ASSERT(inSuite, test.AllocateQName("test", "testy", "udp") == FullQName()); - test.TestAllRecordRespondersAreNull(inSuite); + EXPECT_EQ(test.AllocateQName("test", "testy", "udp"), FullQName()); + test.TestAllRecordRespondersAreNull(); #if CHIP_CONFIG_MEMORY_DEBUG_DMALLOC // We should not have allocated any more memory - NL_TEST_ASSERT(inSuite, nAllocated == dmalloc_count_changed(mark, 1, 0)); + EXPECT_EQ(nAllocated, dmalloc_count_changed(mark, 1, 0)); #endif // Clear should take us back to all empty. test.Clear(); - test.TestAllQNamesAreNull(inSuite); - test.TestAllRecordRespondersAreNull(inSuite); + test.TestAllQNamesAreNull(); + test.TestAllRecordRespondersAreNull(); #if CHIP_CONFIG_MEMORY_DEBUG_DMALLOC // The amount of unfreed pointers should be 0. - NL_TEST_ASSERT(inSuite, dmalloc_count_changed(mark, 1, 0) == 0); + EXPECT_EQ(dmalloc_count_changed(mark, 1, 0), 0); #endif } -void TestQueryAllocatorQNameArray(nlTestSuite * inSuite, void * inContext) +TEST_F(TestMinimalMdnsAllocator, TestQueryAllocatorQNameArray) { TestAllocator test; @@ -125,43 +130,43 @@ void TestQueryAllocatorQNameArray(nlTestSuite * inSuite, void * inContext) const char * kArray[kNumParts] = { "this", "is", "a", "test" }; // Start empty. - test.TestAllRecordRespondersAreNull(inSuite); - test.TestAllQNamesAreNull(inSuite); + test.TestAllRecordRespondersAreNull(); + test.TestAllQNamesAreNull(); // We should be able to add up to GetMaxAllocatedQNames QNames for (size_t i = 0; i < test.GetMaxAllocatedQNames(); ++i) { - NL_TEST_ASSERT(inSuite, test.AllocateQNameFromArray(kArray, kNumParts) != FullQName()); - test.TestAllRecordRespondersAreNull(inSuite); + EXPECT_NE(test.AllocateQNameFromArray(kArray, kNumParts), FullQName()); + test.TestAllRecordRespondersAreNull(); } #if CHIP_CONFIG_MEMORY_DEBUG_DMALLOC // Count the memory that has not been freed at this point (since mark) unsigned long nAllocated = dmalloc_count_changed(mark, 1, 0); - NL_TEST_ASSERT(inSuite, nAllocated != 0); + EXPECT_NE(nAllocated, 0); #endif // Adding one more should fail. - NL_TEST_ASSERT(inSuite, test.AllocateQNameFromArray(kArray, kNumParts) == FullQName()); - test.TestAllRecordRespondersAreNull(inSuite); + EXPECT_EQ(test.AllocateQNameFromArray(kArray, kNumParts), FullQName()); + test.TestAllRecordRespondersAreNull(); #if CHIP_CONFIG_MEMORY_DEBUG_DMALLOC // We should not have allocated any more memory - NL_TEST_ASSERT(inSuite, nAllocated == dmalloc_count_changed(mark, 1, 0)); + EXPECT_EQ(nAllocated, dmalloc_count_changed(mark, 1, 0)); #endif // Clear should take us back to all empty. test.Clear(); - test.TestAllQNamesAreNull(inSuite); - test.TestAllRecordRespondersAreNull(inSuite); + test.TestAllQNamesAreNull(); + test.TestAllRecordRespondersAreNull(); #if CHIP_CONFIG_MEMORY_DEBUG_DMALLOC // The amount of unfreed pointers should be 0. - NL_TEST_ASSERT(inSuite, dmalloc_count_changed(mark, 1, 0) == 0); + EXPECT_EQ(dmalloc_count_changed(mark, 1, 0), 0); #endif } -void TestQueryAllocatorRecordResponder(nlTestSuite * inSuite, void * inContext) +TEST_F(TestMinimalMdnsAllocator, TestQueryAllocatorRecordResponder) { TestAllocator test; @@ -169,42 +174,42 @@ void TestQueryAllocatorRecordResponder(nlTestSuite * inSuite, void * inContext) unsigned long mark = dmalloc_mark(); #endif // Start empty. - test.TestAllRecordRespondersAreNull(inSuite); - test.TestAllQNamesAreNull(inSuite); + test.TestAllRecordRespondersAreNull(); + test.TestAllQNamesAreNull(); FullQName serviceName = test.AllocateQName("test", "service"); FullQName instanceName = test.AllocateQName("test", "instance"); for (size_t i = 0; i < kMaxRecords; ++i) { - NL_TEST_ASSERT(inSuite, test.AddResponder<PtrResponder>(serviceName, instanceName).IsValid()); + EXPECT_TRUE(test.AddResponder<PtrResponder>(serviceName, instanceName).IsValid()); } #if CHIP_CONFIG_MEMORY_DEBUG_DMALLOC // Count the memory that has not been freed at this point (since mark) unsigned long nAllocated = dmalloc_count_changed(mark, 1, 0); - NL_TEST_ASSERT(inSuite, nAllocated != 0); + EXPECT_NE(nAllocated, 0); #endif // Adding one more should fail. - NL_TEST_ASSERT(inSuite, !test.AddResponder<PtrResponder>(serviceName, instanceName).IsValid()); + EXPECT_FALSE(test.AddResponder<PtrResponder>(serviceName, instanceName).IsValid()); #if CHIP_CONFIG_MEMORY_DEBUG_DMALLOC // We should not have allocated any more memory - NL_TEST_ASSERT(inSuite, nAllocated == dmalloc_count_changed(mark, 1, 0)); + EXPECT_EQ(nAllocated, dmalloc_count_changed(mark, 1, 0)); #endif // Clear should take us back to all empty. test.Clear(); - test.TestAllQNamesAreNull(inSuite); - test.TestAllRecordRespondersAreNull(inSuite); + test.TestAllQNamesAreNull(); + test.TestAllRecordRespondersAreNull(); #if CHIP_CONFIG_MEMORY_DEBUG_DMALLOC // The amount of unfreed pointers should be 0. - NL_TEST_ASSERT(inSuite, dmalloc_count_changed(mark, 1, 0) == 0); + EXPECT_EQ(dmalloc_count_changed(mark, 1, 0), 0); #endif } -void TestQueryAllocatorRecordResponderTypes(nlTestSuite * inSuite, void * inContext) +TEST_F(TestMinimalMdnsAllocator, TestQueryAllocatorRecordResponderTypes) { TestAllocator test; @@ -212,49 +217,49 @@ void TestQueryAllocatorRecordResponderTypes(nlTestSuite * inSuite, void * inCont unsigned long mark = dmalloc_mark(); #endif // Start empty. - test.TestAllRecordRespondersAreNull(inSuite); - test.TestAllQNamesAreNull(inSuite); + test.TestAllRecordRespondersAreNull(); + test.TestAllQNamesAreNull(); FullQName serviceName = test.AllocateQName("test", "service"); FullQName instanceName = test.AllocateQName("test", "instance"); FullQName hostName = test.AllocateQName("test", "host"); FullQName someTxt = test.AllocateQName("L1=some text", "L2=some other text"); - NL_TEST_ASSERT(inSuite, serviceName != FullQName()); - NL_TEST_ASSERT(inSuite, instanceName != FullQName()); - NL_TEST_ASSERT(inSuite, hostName != FullQName()); - NL_TEST_ASSERT(inSuite, someTxt != FullQName()); + EXPECT_NE(serviceName, FullQName()); + EXPECT_NE(instanceName, FullQName()); + EXPECT_NE(hostName, FullQName()); + EXPECT_NE(someTxt, FullQName()); // Test that we can add all types - NL_TEST_ASSERT(inSuite, test.AddResponder<PtrResponder>(serviceName, instanceName).IsValid()); - NL_TEST_ASSERT(inSuite, test.AddResponder<SrvResponder>(SrvResourceRecord(instanceName, hostName, 57)).IsValid()); - NL_TEST_ASSERT(inSuite, test.AddResponder<TxtResponder>(TxtResourceRecord(instanceName, someTxt)).IsValid()); - NL_TEST_ASSERT(inSuite, test.AddResponder<IPv6Responder>(hostName).IsValid()); - NL_TEST_ASSERT(inSuite, test.AddResponder<IPv4Responder>(hostName).IsValid()); + EXPECT_TRUE(test.AddResponder<PtrResponder>(serviceName, instanceName).IsValid()); + EXPECT_TRUE(test.AddResponder<SrvResponder>(SrvResourceRecord(instanceName, hostName, 57)).IsValid()); + EXPECT_TRUE(test.AddResponder<TxtResponder>(TxtResourceRecord(instanceName, someTxt)).IsValid()); + EXPECT_TRUE(test.AddResponder<IPv6Responder>(hostName).IsValid()); + EXPECT_TRUE(test.AddResponder<IPv4Responder>(hostName).IsValid()); #if CHIP_CONFIG_MEMORY_DEBUG_DMALLOC // Count the memory that has not been freed at this point (since mark) unsigned long nAllocated = dmalloc_count_changed(mark, 1, 0); - NL_TEST_ASSERT(inSuite, nAllocated != 0); + EXPECT_NE(nAllocated, 0); #endif // Clear should take us back to all empty. test.Clear(); - test.TestAllQNamesAreNull(inSuite); - test.TestAllRecordRespondersAreNull(inSuite); + test.TestAllQNamesAreNull(); + test.TestAllRecordRespondersAreNull(); #if CHIP_CONFIG_MEMORY_DEBUG_DMALLOC // The amount of unfreed pointers should be 0. - NL_TEST_ASSERT(inSuite, dmalloc_count_changed(mark, 1, 0) == 0); + EXPECT_EQ(dmalloc_count_changed(mark, 1, 0), 0); #endif } -void TestGetResponder(nlTestSuite * inSuite, void * inContext) +TEST_F(TestMinimalMdnsAllocator, TestGetResponder) { TestAllocator test; // Start empty. - test.TestAllRecordRespondersAreNull(inSuite); - test.TestAllQNamesAreNull(inSuite); + test.TestAllRecordRespondersAreNull(); + test.TestAllQNamesAreNull(); FullQName serviceName = test.AllocateQName("test", "service"); FullQName instanceName = test.AllocateQName("test", "instance"); @@ -262,68 +267,40 @@ void TestGetResponder(nlTestSuite * inSuite, void * inContext) FullQName someTxt = test.AllocateQName("L1=some text", "L2=some other text"); FullQName notAdded = test.AllocateQName("not", "added"); - NL_TEST_ASSERT(inSuite, serviceName != FullQName()); - NL_TEST_ASSERT(inSuite, instanceName != FullQName()); - NL_TEST_ASSERT(inSuite, hostName != FullQName()); - NL_TEST_ASSERT(inSuite, someTxt != FullQName()); + EXPECT_NE(serviceName, FullQName()); + EXPECT_NE(instanceName, FullQName()); + EXPECT_NE(hostName, FullQName()); + EXPECT_NE(someTxt, FullQName()); - NL_TEST_ASSERT(inSuite, test.AddResponder<PtrResponder>(serviceName, instanceName).IsValid()); - NL_TEST_ASSERT(inSuite, test.AddResponder<SrvResponder>(SrvResourceRecord(instanceName, hostName, 57)).IsValid()); - NL_TEST_ASSERT(inSuite, test.AddResponder<TxtResponder>(TxtResourceRecord(instanceName, someTxt)).IsValid()); - NL_TEST_ASSERT(inSuite, test.AddResponder<IPv6Responder>(hostName).IsValid()); - NL_TEST_ASSERT(inSuite, test.AddResponder<IPv4Responder>(hostName).IsValid()); + EXPECT_TRUE(test.AddResponder<PtrResponder>(serviceName, instanceName).IsValid()); + EXPECT_TRUE(test.AddResponder<SrvResponder>(SrvResourceRecord(instanceName, hostName, 57)).IsValid()); + EXPECT_TRUE(test.AddResponder<TxtResponder>(TxtResourceRecord(instanceName, someTxt)).IsValid()); + EXPECT_TRUE(test.AddResponder<IPv6Responder>(hostName).IsValid()); + EXPECT_TRUE(test.AddResponder<IPv4Responder>(hostName).IsValid()); // These should all exist - NL_TEST_ASSERT(inSuite, test.GetResponder(QType::PTR, serviceName) != nullptr); - NL_TEST_ASSERT(inSuite, test.GetResponder(QType::SRV, instanceName) != nullptr); - NL_TEST_ASSERT(inSuite, test.GetResponder(QType::TXT, instanceName) != nullptr); - NL_TEST_ASSERT(inSuite, test.GetResponder(QType::A, hostName) != nullptr); - NL_TEST_ASSERT(inSuite, test.GetResponder(QType::AAAA, hostName) != nullptr); + ASSERT_NE(test.GetResponder(QType::PTR, serviceName), nullptr); + ASSERT_NE(test.GetResponder(QType::SRV, instanceName), nullptr); + ASSERT_NE(test.GetResponder(QType::TXT, instanceName), nullptr); + ASSERT_NE(test.GetResponder(QType::A, hostName), nullptr); + ASSERT_NE(test.GetResponder(QType::AAAA, hostName), nullptr); // incorrect types - NL_TEST_ASSERT(inSuite, test.GetResponder(QType::SRV, notAdded) == nullptr); - NL_TEST_ASSERT(inSuite, test.GetResponder(QType::AAAA, instanceName) == nullptr); - NL_TEST_ASSERT(inSuite, test.GetResponder(QType::A, instanceName) == nullptr); - NL_TEST_ASSERT(inSuite, test.GetResponder(QType::PTR, hostName) == nullptr); - NL_TEST_ASSERT(inSuite, test.GetResponder(QType::TXT, hostName) == nullptr); + EXPECT_EQ(test.GetResponder(QType::SRV, notAdded), nullptr); + EXPECT_EQ(test.GetResponder(QType::AAAA, instanceName), nullptr); + EXPECT_EQ(test.GetResponder(QType::A, instanceName), nullptr); + EXPECT_EQ(test.GetResponder(QType::PTR, hostName), nullptr); + EXPECT_EQ(test.GetResponder(QType::TXT, hostName), nullptr); // incorrect names - NL_TEST_ASSERT(inSuite, test.GetResponder(QType::PTR, notAdded) == nullptr); - NL_TEST_ASSERT(inSuite, test.GetResponder(QType::SRV, notAdded) == nullptr); - NL_TEST_ASSERT(inSuite, test.GetResponder(QType::TXT, notAdded) == nullptr); - NL_TEST_ASSERT(inSuite, test.GetResponder(QType::A, notAdded) == nullptr); - NL_TEST_ASSERT(inSuite, test.GetResponder(QType::AAAA, notAdded) == nullptr); + EXPECT_EQ(test.GetResponder(QType::PTR, notAdded), nullptr); + EXPECT_EQ(test.GetResponder(QType::SRV, notAdded), nullptr); + EXPECT_EQ(test.GetResponder(QType::TXT, notAdded), nullptr); + EXPECT_EQ(test.GetResponder(QType::A, notAdded), nullptr); + EXPECT_EQ(test.GetResponder(QType::AAAA, notAdded), nullptr); test.Clear(); } -const nlTest sTests[] = { - NL_TEST_DEF("TestQueryAllocatorQName", TestQueryAllocatorQName), // - NL_TEST_DEF("TestQueryAllocatorQNameArray", TestQueryAllocatorQNameArray), // - NL_TEST_DEF("TestQueryAllocatorRecordResponder", TestQueryAllocatorRecordResponder), // - NL_TEST_DEF("TestQueryAllocatorRecordResponderTypes", TestQueryAllocatorRecordResponderTypes), // - NL_TEST_DEF("TestGetResponder", TestGetResponder), // - - NL_TEST_SENTINEL() // -}; - -int TestSetup(void * inContext) -{ - return chip::Platform::MemoryInit() == CHIP_NO_ERROR ? SUCCESS : FAILURE; -} - -int TestTeardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - } // namespace -int TestMinimalMdnsAllocator() -{ - nlTestSuite theSuite = { "MinimalMdnsAllocator", &sTests[0], &TestSetup, &TestTeardown }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestMinimalMdnsAllocator); +; diff --git a/src/lib/dnssd/minimal_mdns/tests/TestQueryReplyFilter.cpp b/src/lib/dnssd/minimal_mdns/tests/TestQueryReplyFilter.cpp index 690c28b6193929..234b6876c6b7fe 100644 --- a/src/lib/dnssd/minimal_mdns/tests/TestQueryReplyFilter.cpp +++ b/src/lib/dnssd/minimal_mdns/tests/TestQueryReplyFilter.cpp @@ -14,10 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include <lib/dnssd/minimal_mdns/QueryReplyFilter.h> -#include <lib/support/UnitTestRegistration.h> +#include <gtest/gtest.h> -#include <nlunit-test.h> +#include <lib/dnssd/minimal_mdns/QueryReplyFilter.h> namespace { @@ -35,7 +34,7 @@ QueryData buildQueryData(QType qType, QClass qClass, const uint8_t (&query)[N]) return QueryData(qType, qClass, false, query, BytesRange(query, query + N)); } -void TestQueryReplyFilter(nlTestSuite * inSuite, void * inContext) +TEST(TestQueryReplyFilter, TestQueryReplyFilter) { const uint8_t query[] = { 4, 's', 'o', 'm', 'e', // @@ -44,45 +43,34 @@ void TestQueryReplyFilter(nlTestSuite * inSuite, void * inContext) }; // sanity test that the serialized qname was build correctly - NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) == FullQName(kName1)); - NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) != FullQName(kName2)); - NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) != FullQName(kName3)); - NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) != FullQName(kName4)); + EXPECT_EQ(SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query), FullQName(kName1)); + EXPECT_NE(SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query), FullQName(kName2)); + EXPECT_NE(SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query), FullQName(kName3)); + EXPECT_NE(SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query), FullQName(kName4)); // Acceptable cases - NL_TEST_ASSERT( - inSuite, QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); - NL_TEST_ASSERT(inSuite, - QueryReplyFilter(buildQueryData(QType::A, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); + EXPECT_TRUE(QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); + EXPECT_TRUE(QueryReplyFilter(buildQueryData(QType::A, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); - NL_TEST_ASSERT(inSuite, - QueryReplyFilter(buildQueryData(QType::ANY, QClass::IN, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); + EXPECT_TRUE(QueryReplyFilter(buildQueryData(QType::ANY, QClass::IN, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); - NL_TEST_ASSERT(inSuite, - QueryReplyFilter(buildQueryData(QType::A, QClass::IN, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); + EXPECT_TRUE(QueryReplyFilter(buildQueryData(QType::A, QClass::IN, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); // Reject cases - NL_TEST_ASSERT( - inSuite, !QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName2))); + EXPECT_FALSE(QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName2))); - NL_TEST_ASSERT( - inSuite, !QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName3))); + EXPECT_FALSE(QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName3))); - NL_TEST_ASSERT( - inSuite, !QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName4))); + EXPECT_FALSE(QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName4))); - NL_TEST_ASSERT( - inSuite, - !QueryReplyFilter(buildQueryData(QType::AAAA, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); + EXPECT_FALSE(QueryReplyFilter(buildQueryData(QType::AAAA, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); - NL_TEST_ASSERT( - inSuite, !QueryReplyFilter(buildQueryData(QType::SRV, QClass::IN, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); + EXPECT_FALSE(QueryReplyFilter(buildQueryData(QType::SRV, QClass::IN, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); - NL_TEST_ASSERT( - inSuite, !QueryReplyFilter(buildQueryData(QType::PTR, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); + EXPECT_FALSE(QueryReplyFilter(buildQueryData(QType::PTR, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); } -void TestLongerQueryPath(nlTestSuite * inSuite, void * inContext) +TEST(TestQueryReplyFilter, TestLongerQueryPath) { const uint8_t query[] = { 4, 'm', 'o', 'r', 'e', // @@ -93,30 +81,12 @@ void TestLongerQueryPath(nlTestSuite * inSuite, void * inContext) }; // sanity test that the serialized qname was build correctly - NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) != FullQName(kName1)); - NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) != FullQName(kName2)); - NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) == FullQName(kName3)); - NL_TEST_ASSERT(inSuite, SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query) != FullQName(kName4)); - - NL_TEST_ASSERT( - inSuite, !QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); - NL_TEST_ASSERT( - inSuite, QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName3))); -} + EXPECT_NE(SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query), FullQName(kName1)); + EXPECT_NE(SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query), FullQName(kName2)); + EXPECT_EQ(SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query), FullQName(kName3)); + EXPECT_NE(SerializedQNameIterator(BytesRange(query, query + sizeof(query)), query), FullQName(kName4)); -const nlTest sTests[] = { - NL_TEST_DEF("TestQueryReplyFilter", TestQueryReplyFilter), // - NL_TEST_DEF("TestLongerQueryPath", TestLongerQueryPath), // - NL_TEST_SENTINEL() // -}; - -} // namespace - -int TestQueryReplyFilter() -{ - nlTestSuite theSuite = { "QueryReplyFilter", sTests, nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); + EXPECT_FALSE(QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName1))); + EXPECT_TRUE(QueryReplyFilter(buildQueryData(QType::ANY, QClass::ANY, query)).Accept(QType::A, QClass::IN, FullQName(kName3))); } - -CHIP_REGISTER_TEST_SUITE(TestQueryReplyFilter) +} // namespace diff --git a/src/lib/dnssd/minimal_mdns/tests/TestRecordData.cpp b/src/lib/dnssd/minimal_mdns/tests/TestRecordData.cpp index 181b9d3b6f93fa..295ed2296215bf 100644 --- a/src/lib/dnssd/minimal_mdns/tests/TestRecordData.cpp +++ b/src/lib/dnssd/minimal_mdns/tests/TestRecordData.cpp @@ -19,9 +19,7 @@ #include <string> #include <vector> -#include <lib/support/UnitTestRegistration.h> - -#include <nlunit-test.h> +#include <gtest/gtest.h> namespace { @@ -29,7 +27,7 @@ using namespace std; using namespace chip; using namespace mdns::Minimal; -void SrvRecordSimpleParsing(nlTestSuite * inSuite, void * inContext) +TEST(TestRecordData, SrvRecordSimpleParsing) { const uint8_t record[] = { 0, 12, // Priority @@ -46,27 +44,27 @@ void SrvRecordSimpleParsing(nlTestSuite * inSuite, void * inContext) SrvRecord srv; - NL_TEST_ASSERT(inSuite, srv.Parse(data, packet)); - NL_TEST_ASSERT(inSuite, srv.GetPriority() == 12); - NL_TEST_ASSERT(inSuite, srv.GetWeight() == 3); - NL_TEST_ASSERT(inSuite, srv.GetPort() == 0x1234); + EXPECT_TRUE(srv.Parse(data, packet)); + EXPECT_EQ(srv.GetPriority(), 12); + EXPECT_EQ(srv.GetWeight(), 3); + EXPECT_EQ(srv.GetPort(), 0x1234); // name can be read several times for (int i = 0; i < 3; i++) { SerializedQNameIterator name = srv.GetName(); - NL_TEST_ASSERT(inSuite, name.Next()); - NL_TEST_ASSERT(inSuite, strcmp(name.Value(), "some") == 0); - NL_TEST_ASSERT(inSuite, name.Next()); - NL_TEST_ASSERT(inSuite, strcmp(name.Value(), "test") == 0); - NL_TEST_ASSERT(inSuite, name.Next()); - NL_TEST_ASSERT(inSuite, strcmp(name.Value(), "local") == 0); - NL_TEST_ASSERT(inSuite, name.Next() == false); + EXPECT_TRUE(name.Next()); + EXPECT_STREQ(name.Value(), "some"); + EXPECT_TRUE(name.Next()); + EXPECT_STREQ(name.Value(), "test"); + EXPECT_TRUE(name.Next()); + EXPECT_STREQ(name.Value(), "local"); + EXPECT_EQ(name.Next(), false); } } -void SrvWithPtrRecord(nlTestSuite * inSuite, void * inContext) +TEST(TestRecordData, SrvWithPtrRecord) { const uint8_t record[] = { 'x', 'y', 'z', // dummy data (3 bytes) @@ -86,27 +84,27 @@ void SrvWithPtrRecord(nlTestSuite * inSuite, void * inContext) SrvRecord srv; - NL_TEST_ASSERT(inSuite, srv.Parse(data, packet)); - NL_TEST_ASSERT(inSuite, srv.GetPriority() == 12); - NL_TEST_ASSERT(inSuite, srv.GetWeight() == 3); - NL_TEST_ASSERT(inSuite, srv.GetPort() == 0x1234); + EXPECT_TRUE(srv.Parse(data, packet)); + EXPECT_EQ(srv.GetPriority(), 12); + EXPECT_EQ(srv.GetWeight(), 3); + EXPECT_EQ(srv.GetPort(), 0x1234); // name can be read several times for (int i = 0; i < 3; i++) { SerializedQNameIterator name = srv.GetName(); - NL_TEST_ASSERT(inSuite, name.Next()); - NL_TEST_ASSERT(inSuite, strcmp(name.Value(), "foo") == 0); - NL_TEST_ASSERT(inSuite, name.Next()); - NL_TEST_ASSERT(inSuite, strcmp(name.Value(), "some") == 0); - NL_TEST_ASSERT(inSuite, name.Next()); - NL_TEST_ASSERT(inSuite, strcmp(name.Value(), "test") == 0); - NL_TEST_ASSERT(inSuite, name.Next() == false); + EXPECT_TRUE(name.Next()); + EXPECT_STREQ(name.Value(), "foo"); + EXPECT_TRUE(name.Next()); + EXPECT_STREQ(name.Value(), "some"); + EXPECT_TRUE(name.Next()); + EXPECT_STREQ(name.Value(), "test"); + EXPECT_EQ(name.Next(), false); } } -void ARecordParsing(nlTestSuite * inSuite, void * inContext) +TEST(TestRecordData, ARecordParsing) { const uint8_t record[] = { 10, @@ -120,15 +118,15 @@ void ARecordParsing(nlTestSuite * inSuite, void * inContext) #if INET_CONFIG_ENABLE_IPV4 Inet::IPAddress expected; - NL_TEST_ASSERT(inSuite, ParseARecord(BytesRange(record, record + sizeof(record)), &addr)); - NL_TEST_ASSERT(inSuite, Inet::IPAddress::FromString("10.11.12.13", expected)); - NL_TEST_ASSERT(inSuite, addr == expected); + EXPECT_TRUE(ParseARecord(BytesRange(record, record + sizeof(record)), &addr)); + EXPECT_TRUE(Inet::IPAddress::FromString("10.11.12.13", expected)); + EXPECT_EQ(addr, expected); #else - NL_TEST_ASSERT(inSuite, !ParseARecord(BytesRange(record, record + sizeof(record)), &addr)); + EXPECT_FALSE(ParseARecord(BytesRange(record, record + sizeof(record)), &addr)); #endif // INET_CONFIG_ENABLE_IPV4 } -void AAAARecordParsing(nlTestSuite * inSuite, void * inContext) +TEST(TestRecordData, AAAARecordParsing) { const uint8_t record[] = { 0x12, 0x23, 0x00, 0x00, // @@ -140,12 +138,12 @@ void AAAARecordParsing(nlTestSuite * inSuite, void * inContext) Inet::IPAddress addr; Inet::IPAddress expected; - NL_TEST_ASSERT(inSuite, ParseAAAARecord(BytesRange(record, record + sizeof(record)), &addr)); - NL_TEST_ASSERT(inSuite, Inet::IPAddress::FromString("1223::3456:789A", expected)); - NL_TEST_ASSERT(inSuite, addr == expected); + EXPECT_TRUE(ParseAAAARecord(BytesRange(record, record + sizeof(record)), &addr)); + EXPECT_TRUE(Inet::IPAddress::FromString("1223::3456:789A", expected)); + EXPECT_EQ(addr, expected); } -void PtrRecordSimpleParsing(nlTestSuite * inSuite, void * inContext) +TEST(TestRecordData, PtrRecordSimpleParsing) { const uint8_t record[] = { 4, 's', 'o', 'm', 'e', // QNAME part: some @@ -159,17 +157,17 @@ void PtrRecordSimpleParsing(nlTestSuite * inSuite, void * inContext) SerializedQNameIterator name; - NL_TEST_ASSERT(inSuite, ParsePtrRecord(data, packet, &name)); - NL_TEST_ASSERT(inSuite, name.Next()); - NL_TEST_ASSERT(inSuite, strcmp(name.Value(), "some") == 0); - NL_TEST_ASSERT(inSuite, name.Next()); - NL_TEST_ASSERT(inSuite, strcmp(name.Value(), "test") == 0); - NL_TEST_ASSERT(inSuite, name.Next()); - NL_TEST_ASSERT(inSuite, strcmp(name.Value(), "local") == 0); - NL_TEST_ASSERT(inSuite, name.Next() == false); + EXPECT_TRUE(ParsePtrRecord(data, packet, &name)); + EXPECT_TRUE(name.Next()); + EXPECT_STREQ(name.Value(), "some"); + EXPECT_TRUE(name.Next()); + EXPECT_STREQ(name.Value(), "test"); + EXPECT_TRUE(name.Next()); + EXPECT_STREQ(name.Value(), "local"); + EXPECT_EQ(name.Next(), false); } -void PtrRecordComplexParsing(nlTestSuite * inSuite, void * inContext) +TEST(TestRecordData, PtrRecordComplexParsing) { const uint8_t record[] = { 'x', 'y', 'z', // dummy data (3 bytes) @@ -187,18 +185,18 @@ void PtrRecordComplexParsing(nlTestSuite * inSuite, void * inContext) BytesRange data(record + 24, record + sizeof(record)); SerializedQNameIterator name; - NL_TEST_ASSERT(inSuite, ParsePtrRecord(data, packet, &name)); - NL_TEST_ASSERT(inSuite, name.Next()); - NL_TEST_ASSERT(inSuite, strcmp(name.Value(), "foo") == 0); - NL_TEST_ASSERT(inSuite, name.Next()); - NL_TEST_ASSERT(inSuite, strcmp(name.Value(), "bar") == 0); - NL_TEST_ASSERT(inSuite, name.Next()); - NL_TEST_ASSERT(inSuite, strcmp(name.Value(), "baz") == 0); - NL_TEST_ASSERT(inSuite, name.Next()); - NL_TEST_ASSERT(inSuite, strcmp(name.Value(), "some") == 0); - NL_TEST_ASSERT(inSuite, name.Next()); - NL_TEST_ASSERT(inSuite, strcmp(name.Value(), "test") == 0); - NL_TEST_ASSERT(inSuite, name.Next() == false); + EXPECT_TRUE(ParsePtrRecord(data, packet, &name)); + EXPECT_TRUE(name.Next()); + EXPECT_STREQ(name.Value(), "foo"); + EXPECT_TRUE(name.Next()); + EXPECT_STREQ(name.Value(), "bar"); + EXPECT_TRUE(name.Next()); + EXPECT_STREQ(name.Value(), "baz"); + EXPECT_TRUE(name.Next()); + EXPECT_STREQ(name.Value(), "some"); + EXPECT_TRUE(name.Next()); + EXPECT_STREQ(name.Value(), "test"); + EXPECT_EQ(name.Next(), false); } class TxtRecordAccumulator : public TxtRecordDelegate @@ -223,7 +221,7 @@ class TxtRecordAccumulator : public TxtRecordDelegate } }; -void TxtRecord(nlTestSuite * inSuite, void * inContext) +TEST(TestRecordData, TxtRecord) { const uint8_t record[] = { 4, 's', 'o', 'm', 'e', // some @@ -234,32 +232,11 @@ void TxtRecord(nlTestSuite * inSuite, void * inContext) TxtRecordAccumulator accumulator; - NL_TEST_ASSERT(inSuite, ParseTxtRecord(BytesRange(record, record + sizeof(record)), &accumulator)); - NL_TEST_ASSERT(inSuite, accumulator.Data().size() == 4); - NL_TEST_ASSERT(inSuite, (accumulator.Data()[0] == make_pair<std::string, std::string>("some", ""))); - NL_TEST_ASSERT(inSuite, (accumulator.Data()[1] == make_pair<std::string, std::string>("foo", "bar"))); - NL_TEST_ASSERT(inSuite, (accumulator.Data()[2] == make_pair<std::string, std::string>("x", "y=z"))); - NL_TEST_ASSERT(inSuite, (accumulator.Data()[3] == make_pair<std::string, std::string>("a", ""))); + EXPECT_TRUE(ParseTxtRecord(BytesRange(record, record + sizeof(record)), &accumulator)); + EXPECT_EQ(accumulator.Data().size(), 4u); + EXPECT_EQ(accumulator.Data()[0], (make_pair<std::string, std::string>("some", ""))); + EXPECT_EQ(accumulator.Data()[1], (make_pair<std::string, std::string>("foo", "bar"))); + EXPECT_EQ(accumulator.Data()[2], (make_pair<std::string, std::string>("x", "y=z"))); + EXPECT_EQ(accumulator.Data()[3], (make_pair<std::string, std::string>("a", ""))); } - -const nlTest sTests[] = { - NL_TEST_DEF("SrvRecordSimpleParsing", SrvRecordSimpleParsing), // - NL_TEST_DEF("SrvWithPtrRecord", SrvWithPtrRecord), // - NL_TEST_DEF("ARecordParsing", ARecordParsing), // - NL_TEST_DEF("AAAARecordParsing", AAAARecordParsing), // - NL_TEST_DEF("PtrRecordSimpleParsing", PtrRecordSimpleParsing), // - NL_TEST_DEF("PtrRecordComplexParsing", PtrRecordComplexParsing), // - NL_TEST_DEF("TxtRecord", TxtRecord), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestRecordData() -{ - nlTestSuite theSuite = { "RecordData", sTests, nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestRecordData) diff --git a/src/lib/dnssd/minimal_mdns/tests/TestResponseSender.cpp b/src/lib/dnssd/minimal_mdns/tests/TestResponseSender.cpp index 39316ae129bd36..80ae9dc1b2c55b 100644 --- a/src/lib/dnssd/minimal_mdns/tests/TestResponseSender.cpp +++ b/src/lib/dnssd/minimal_mdns/tests/TestResponseSender.cpp @@ -19,6 +19,8 @@ #include <string> #include <vector> +#include <gtest/gtest.h> + #include <lib/dnssd/minimal_mdns/RecordData.h> #include <lib/dnssd/minimal_mdns/core/FlatAllocatedQName.h> #include <lib/dnssd/minimal_mdns/core/RecordWriter.h> @@ -28,9 +30,6 @@ #include <lib/dnssd/minimal_mdns/tests/CheckOnlyServer.h> #include <lib/support/CHIPMem.h> -#include <lib/support/UnitTestRegistration.h> - -#include <nlunit-test.h> namespace { @@ -72,24 +71,31 @@ struct CommonTestElements QueryResponder<10> queryResponder; Inet::IPPacketInfo packetInfo; - CommonTestElements(nlTestSuite * inSuite, const char * tag) : + CommonTestElements(const char * tag) : recordWriter(&requestBufferWriter), dnsSd(FlatAllocatedQName::Build(dnsSdServiceStorage, "_services", "_dns-sd", "_udp", "local")), service(FlatAllocatedQName::Build(serviceNameStorage, tag, "service")), instance(FlatAllocatedQName::Build(instanceNameStorage, tag, "instance")), host(FlatAllocatedQName::Build(hostNameStorage, tag, "host")), - txt(FlatAllocatedQName::Build(txtStorage, tag, "L1=something", "L2=other")), server(inSuite) + txt(FlatAllocatedQName::Build(txtStorage, tag, "L1=something", "L2=other")), server() { queryResponder.Init(); header.SetQueryCount(1); } }; -void SrvAnyResponseToInstance(nlTestSuite * inSuite, void * inContext) +class TestResponseSender : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestResponseSender, SrvAnyResponseToInstance) { - CommonTestElements common(inSuite, "test"); + CommonTestElements common("test"); ResponseSender responseSender(&common.server); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&common.queryResponder) == CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&common.queryResponder), CHIP_NO_ERROR); common.queryResponder.AddResponder(&common.srvResponder); // Build a query for our srv record @@ -100,15 +106,15 @@ void SrvAnyResponseToInstance(nlTestSuite * inSuite, void * inContext) common.server.AddExpectedRecord(&common.srvRecord); responseSender.Respond(1, queryData, &common.packetInfo, ResponseConfiguration()); - NL_TEST_ASSERT(inSuite, common.server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, common.server.GetHeaderFound()); + EXPECT_TRUE(common.server.GetSendCalled()); + EXPECT_TRUE(common.server.GetHeaderFound()); } -void SrvTxtAnyResponseToInstance(nlTestSuite * inSuite, void * inContext) +TEST_F(TestResponseSender, SrvTxtAnyResponseToInstance) { - CommonTestElements common(inSuite, "test"); + CommonTestElements common("test"); ResponseSender responseSender(&common.server); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&common.queryResponder) == CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&common.queryResponder), CHIP_NO_ERROR); common.queryResponder.AddResponder(&common.srvResponder); common.queryResponder.AddResponder(&common.txtResponder); @@ -122,15 +128,15 @@ void SrvTxtAnyResponseToInstance(nlTestSuite * inSuite, void * inContext) common.server.AddExpectedRecord(&common.txtRecord); responseSender.Respond(1, queryData, &common.packetInfo, ResponseConfiguration()); - NL_TEST_ASSERT(inSuite, common.server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, common.server.GetHeaderFound()); + EXPECT_TRUE(common.server.GetSendCalled()); + EXPECT_TRUE(common.server.GetHeaderFound()); } -void PtrSrvTxtAnyResponseToServiceName(nlTestSuite * inSuite, void * inContext) +TEST_F(TestResponseSender, PtrSrvTxtAnyResponseToServiceName) { - CommonTestElements common(inSuite, "test"); + CommonTestElements common("test"); ResponseSender responseSender(&common.server); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&common.queryResponder) == CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&common.queryResponder), CHIP_NO_ERROR); common.queryResponder.AddResponder(&common.ptrResponder).SetReportAdditional(common.instance); common.queryResponder.AddResponder(&common.srvResponder); common.queryResponder.AddResponder(&common.txtResponder); @@ -147,15 +153,15 @@ void PtrSrvTxtAnyResponseToServiceName(nlTestSuite * inSuite, void * inContext) responseSender.Respond(1, queryData, &common.packetInfo, ResponseConfiguration()); - NL_TEST_ASSERT(inSuite, common.server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, common.server.GetHeaderFound()); + EXPECT_TRUE(common.server.GetSendCalled()); + EXPECT_TRUE(common.server.GetHeaderFound()); } -void PtrSrvTxtAnyResponseToInstance(nlTestSuite * inSuite, void * inContext) +TEST_F(TestResponseSender, PtrSrvTxtAnyResponseToInstance) { - CommonTestElements common(inSuite, "test"); + CommonTestElements common("test"); ResponseSender responseSender(&common.server); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&common.queryResponder) == CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&common.queryResponder), CHIP_NO_ERROR); common.queryResponder.AddResponder(&common.ptrResponder); common.queryResponder.AddResponder(&common.srvResponder); common.queryResponder.AddResponder(&common.txtResponder); @@ -171,15 +177,15 @@ void PtrSrvTxtAnyResponseToInstance(nlTestSuite * inSuite, void * inContext) responseSender.Respond(1, queryData, &common.packetInfo, ResponseConfiguration()); - NL_TEST_ASSERT(inSuite, common.server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, common.server.GetHeaderFound()); + EXPECT_TRUE(common.server.GetSendCalled()); + EXPECT_TRUE(common.server.GetHeaderFound()); } -void PtrSrvTxtSrvResponseToInstance(nlTestSuite * inSuite, void * inContext) +TEST_F(TestResponseSender, PtrSrvTxtSrvResponseToInstance) { - CommonTestElements common(inSuite, "test"); + CommonTestElements common("test"); ResponseSender responseSender(&common.server); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&common.queryResponder) == CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&common.queryResponder), CHIP_NO_ERROR); common.queryResponder.AddResponder(&common.ptrResponder).SetReportInServiceListing(true); common.queryResponder.AddResponder(&common.srvResponder); common.queryResponder.AddResponder(&common.txtResponder); @@ -194,15 +200,15 @@ void PtrSrvTxtSrvResponseToInstance(nlTestSuite * inSuite, void * inContext) responseSender.Respond(1, queryData, &common.packetInfo, ResponseConfiguration()); - NL_TEST_ASSERT(inSuite, common.server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, common.server.GetHeaderFound()); + EXPECT_TRUE(common.server.GetSendCalled()); + EXPECT_TRUE(common.server.GetHeaderFound()); } -void PtrSrvTxtAnyResponseToServiceListing(nlTestSuite * inSuite, void * inContext) +TEST_F(TestResponseSender, PtrSrvTxtAnyResponseToServiceListing) { - CommonTestElements common(inSuite, "test"); + CommonTestElements common("test"); ResponseSender responseSender(&common.server); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&common.queryResponder) == CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&common.queryResponder), CHIP_NO_ERROR); common.queryResponder.AddResponder(&common.ptrResponder).SetReportInServiceListing(true); common.queryResponder.AddResponder(&common.srvResponder); common.queryResponder.AddResponder(&common.txtResponder); @@ -218,31 +224,31 @@ void PtrSrvTxtAnyResponseToServiceListing(nlTestSuite * inSuite, void * inContex responseSender.Respond(1, queryData, &common.packetInfo, ResponseConfiguration()); - NL_TEST_ASSERT(inSuite, common.server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, common.server.GetHeaderFound()); + EXPECT_TRUE(common.server.GetSendCalled()); + EXPECT_TRUE(common.server.GetHeaderFound()); } -void NoQueryResponder(nlTestSuite * inSuite, void * inContext) +TEST_F(TestResponseSender, NoQueryResponder) { - CommonTestElements common(inSuite, "test"); + CommonTestElements common("test"); ResponseSender responseSender(&common.server); QueryData queryData = QueryData(QType::ANY, QClass::IN, false, common.requestNameStart, common.requestBytesRange); common.recordWriter.WriteQName(common.dnsSd); responseSender.Respond(1, queryData, &common.packetInfo, ResponseConfiguration()); - NL_TEST_ASSERT(inSuite, !common.server.GetSendCalled()); + EXPECT_FALSE(common.server.GetSendCalled()); common.recordWriter.WriteQName(common.service); responseSender.Respond(1, queryData, &common.packetInfo, ResponseConfiguration()); - NL_TEST_ASSERT(inSuite, !common.server.GetSendCalled()); + EXPECT_FALSE(common.server.GetSendCalled()); common.recordWriter.WriteQName(common.instance); responseSender.Respond(1, queryData, &common.packetInfo, ResponseConfiguration()); - NL_TEST_ASSERT(inSuite, !common.server.GetSendCalled()); + EXPECT_FALSE(common.server.GetSendCalled()); } -void AddManyQueryResponders(nlTestSuite * inSuite, void * inContext) +TEST_F(TestResponseSender, AddManyQueryResponders) { // TODO(cecille): Fix this test once #8000 gets resolved. ResponseSender responseSender(nullptr); @@ -259,39 +265,39 @@ void AddManyQueryResponders(nlTestSuite * inSuite, void * inContext) constexpr size_t kAddLoopSize = 1000; for (size_t i = 0; i < kAddLoopSize; ++i) { - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&q1) == CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&q1), CHIP_NO_ERROR); } // removing the only copy should clear out everything responseSender.RemoveQueryResponder(&q1); - NL_TEST_ASSERT(inSuite, !responseSender.HasQueryResponders()); + EXPECT_FALSE(responseSender.HasQueryResponders()); // At least 7 should be supported: // - 5 is the spec minimum // - 2 for commissionable and commisioner responders - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&q1) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&q2) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&q3) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&q4) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&q5) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&q6) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&q7) == CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&q1), CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&q2), CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&q3), CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&q4), CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&q5), CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&q6), CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&q7), CHIP_NO_ERROR); } -void PtrSrvTxtMultipleRespondersToInstance(nlTestSuite * inSuite, void * inContext) +TEST_F(TestResponseSender, PtrSrvTxtMultipleRespondersToInstance) { - CommonTestElements common1(inSuite, "test1"); - CommonTestElements common2(inSuite, "test2"); + CommonTestElements common1("test1"); + CommonTestElements common2("test2"); // Just use the server from common1. ResponseSender responseSender(&common1.server); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&common1.queryResponder) == CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&common1.queryResponder), CHIP_NO_ERROR); common1.queryResponder.AddResponder(&common1.ptrResponder).SetReportInServiceListing(true); common1.queryResponder.AddResponder(&common1.srvResponder); common1.queryResponder.AddResponder(&common1.txtResponder); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&common2.queryResponder) == CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&common2.queryResponder), CHIP_NO_ERROR); common2.queryResponder.AddResponder(&common2.ptrResponder).SetReportInServiceListing(true); common2.queryResponder.AddResponder(&common2.srvResponder); common2.queryResponder.AddResponder(&common2.txtResponder); @@ -306,23 +312,23 @@ void PtrSrvTxtMultipleRespondersToInstance(nlTestSuite * inSuite, void * inConte responseSender.Respond(1, queryData, &common1.packetInfo, ResponseConfiguration()); - NL_TEST_ASSERT(inSuite, common1.server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, common1.server.GetHeaderFound()); + EXPECT_TRUE(common1.server.GetSendCalled()); + EXPECT_TRUE(common1.server.GetHeaderFound()); } -void PtrSrvTxtMultipleRespondersToServiceListing(nlTestSuite * inSuite, void * inContext) +TEST_F(TestResponseSender, PtrSrvTxtMultipleRespondersToServiceListing) { - auto common1 = std::make_unique<CommonTestElements>(inSuite, "test1"); - auto common2 = std::make_unique<CommonTestElements>(inSuite, "test2"); + auto common1 = std::make_unique<CommonTestElements>("test1"); + auto common2 = std::make_unique<CommonTestElements>("test2"); // Just use the server from common1. ResponseSender responseSender(&common1->server); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&common1->queryResponder) == CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&common1->queryResponder), CHIP_NO_ERROR); common1->queryResponder.AddResponder(&common1->ptrResponder).SetReportInServiceListing(true); common1->queryResponder.AddResponder(&common1->srvResponder); common1->queryResponder.AddResponder(&common1->txtResponder); - NL_TEST_ASSERT(inSuite, responseSender.AddQueryResponder(&common2->queryResponder) == CHIP_NO_ERROR); + EXPECT_EQ(responseSender.AddQueryResponder(&common2->queryResponder), CHIP_NO_ERROR); common2->queryResponder.AddResponder(&common2->ptrResponder).SetReportInServiceListing(true); common2->queryResponder.AddResponder(&common2->srvResponder); common2->queryResponder.AddResponder(&common2->txtResponder); @@ -339,44 +345,9 @@ void PtrSrvTxtMultipleRespondersToServiceListing(nlTestSuite * inSuite, void * i responseSender.Respond(1, queryData, &common1->packetInfo, ResponseConfiguration()); - NL_TEST_ASSERT(inSuite, common1->server.GetSendCalled()); + EXPECT_TRUE(common1->server.GetSendCalled()); - NL_TEST_ASSERT(inSuite, common1->server.GetHeaderFound()); -} - -const nlTest sTests[] = { - NL_TEST_DEF("SrvAnyResponseToInstance", SrvAnyResponseToInstance), // - NL_TEST_DEF("SrvTxtAnyResponseToInstance", SrvTxtAnyResponseToInstance), // - NL_TEST_DEF("PtrSrvTxtAnyResponseToServiceName", PtrSrvTxtAnyResponseToServiceName), // - NL_TEST_DEF("PtrSrvTxtAnyResponseToInstance", PtrSrvTxtAnyResponseToInstance), // - NL_TEST_DEF("PtrSrvTxtSrvResponseToInstance", PtrSrvTxtSrvResponseToInstance), // - NL_TEST_DEF("PtrSrvTxtAnyResponseToServiceListing", PtrSrvTxtAnyResponseToServiceListing), // - NL_TEST_DEF("NoQueryResponder", NoQueryResponder), // - NL_TEST_DEF("AddManyQueryResponders", AddManyQueryResponders), // - NL_TEST_DEF("PtrSrvTxtMultipleRespondersToInstance", PtrSrvTxtMultipleRespondersToInstance), // - NL_TEST_DEF("PtrSrvTxtMultipleRespondersToServiceListing", PtrSrvTxtMultipleRespondersToServiceListing), // - - NL_TEST_SENTINEL() // -}; - -int TestSetup(void * inContext) -{ - return chip::Platform::MemoryInit() == CHIP_NO_ERROR ? SUCCESS : FAILURE; -} - -int TestTeardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; + EXPECT_TRUE(common1->server.GetHeaderFound()); } } // namespace - -int TestResponseSender() -{ - nlTestSuite theSuite = { "RecordData", sTests, &TestSetup, &TestTeardown }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestResponseSender) From 8238f9818a43a8184c9b87b0ad73abb396ad5325 Mon Sep 17 00:00:00 2001 From: Maksymilian Knust <m.knust@samsung.com> Date: Tue, 23 Apr 2024 18:30:31 +0200 Subject: [PATCH 005/124] Replaced nlunit-test with pw_unit_test in src/lib/dnssd/platform/ (#33072) * Replaced nlunit-test with pw_unit_test in src/lib/dnssd/platform/ * Clean up initialization code --- src/lib/dnssd/platform/tests/BUILD.gn | 9 +- src/lib/dnssd/platform/tests/TestPlatform.cpp | 111 ++++++++---------- 2 files changed, 50 insertions(+), 70 deletions(-) diff --git a/src/lib/dnssd/platform/tests/BUILD.gn b/src/lib/dnssd/platform/tests/BUILD.gn index 92b83195390f9c..966923eebae998 100644 --- a/src/lib/dnssd/platform/tests/BUILD.gn +++ b/src/lib/dnssd/platform/tests/BUILD.gn @@ -14,19 +14,14 @@ import("//build_overrides/build.gni") import("//build_overrides/chip.gni") -import("//build_overrides/nlunit_test.gni") import("${chip_root}/build/chip/chip_test_suite.gni") -chip_test_suite_using_nltest("tests") { +chip_test_suite("tests") { output_name = "libMdnsFakePlatformTests" if (chip_device_platform == "fake") { test_sources = [ "TestPlatform.cpp" ] - public_deps = [ - "${chip_root}/src/lib/dnssd", - "${chip_root}/src/lib/support:testing_nlunit", - "${nlunit_test_root}:nlunit-test", - ] + public_deps = [ "${chip_root}/src/lib/dnssd" ] } } diff --git a/src/lib/dnssd/platform/tests/TestPlatform.cpp b/src/lib/dnssd/platform/tests/TestPlatform.cpp index 91a79f1efdc64a..ebdb46643847c6 100644 --- a/src/lib/dnssd/platform/tests/TestPlatform.cpp +++ b/src/lib/dnssd/platform/tests/TestPlatform.cpp @@ -18,12 +18,12 @@ #include <lib/core/PeerId.h> #include <lib/dnssd/Discovery_ImplPlatform.h> -#include <lib/support/UnitTestRegistration.h> + #include <lib/support/logging/CHIPLogging.h> #include <platform/CHIPDeviceLayer.h> #include <platform/fake/DnssdImpl.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> #if CHIP_DEVICE_LAYER_TARGET_FAKE != 1 #error "This test is designed for use only with the fake platform" @@ -152,102 +152,87 @@ test::ExpectedCall commissionableLargeEnhanced = test::ExpectedCall() .AddSubtype("_V555") .AddSubtype("_T70000") .AddSubtype("_CM"); -void TestStub(nlTestSuite * inSuite, void * inContext) + +class TestDnssdPlatform : public ::testing::Test +{ +public: + static void SetUpTestSuite() + { + ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); + DiscoveryImplPlatform & mdnsPlatform = DiscoveryImplPlatform::GetInstance(); + EXPECT_EQ(mdnsPlatform.Init(DeviceLayer::UDPEndPointManager()), CHIP_NO_ERROR); + EXPECT_EQ(mdnsPlatform.RemoveServices(), CHIP_NO_ERROR); + } + + static void TearDownTestSuite() + { + DiscoveryImplPlatform::GetInstance().Shutdown(); + chip::Platform::MemoryShutdown(); + } + + void TearDown() override { test::Reset(); } +}; + +TEST_F(TestDnssdPlatform, TestStub) { // This is a test of the fake platform impl. We want // We want the platform to return unexpected event if it gets a start // without an expected event. ChipLogError(Discovery, "Test platform returns error correctly"); DiscoveryImplPlatform & mdnsPlatform = DiscoveryImplPlatform::GetInstance(); - NL_TEST_ASSERT(inSuite, mdnsPlatform.Init(DeviceLayer::UDPEndPointManager()) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsPlatform.RemoveServices() == CHIP_NO_ERROR); OperationalAdvertisingParameters params; - NL_TEST_ASSERT(inSuite, mdnsPlatform.Advertise(params) == CHIP_ERROR_UNEXPECTED_EVENT); + EXPECT_EQ(mdnsPlatform.Advertise(params), CHIP_ERROR_UNEXPECTED_EVENT); } -void TestOperational(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDnssdPlatform, TestOperational) { ChipLogError(Discovery, "Test operational"); - test::Reset(); DiscoveryImplPlatform & mdnsPlatform = DiscoveryImplPlatform::GetInstance(); - NL_TEST_ASSERT(inSuite, mdnsPlatform.Init(DeviceLayer::UDPEndPointManager()) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsPlatform.RemoveServices() == CHIP_NO_ERROR); operationalCall1.callType = test::CallType::kStart; - NL_TEST_ASSERT(inSuite, test::AddExpectedCall(operationalCall1) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsPlatform.Advertise(operationalParams1) == CHIP_NO_ERROR); + EXPECT_EQ(test::AddExpectedCall(operationalCall1), CHIP_NO_ERROR); + EXPECT_EQ(mdnsPlatform.Advertise(operationalParams1), CHIP_NO_ERROR); // Next call to advertise should call start again with just the new data. test::Reset(); operationalCall2.callType = test::CallType::kStart; - NL_TEST_ASSERT(inSuite, test::AddExpectedCall(operationalCall2) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsPlatform.Advertise(operationalParams2) == CHIP_NO_ERROR); + EXPECT_EQ(test::AddExpectedCall(operationalCall2), CHIP_NO_ERROR); + EXPECT_EQ(mdnsPlatform.Advertise(operationalParams2), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsPlatform.FinalizeServiceUpdate() == CHIP_NO_ERROR); + EXPECT_EQ(mdnsPlatform.FinalizeServiceUpdate(), CHIP_NO_ERROR); } -void TestCommissionableNode(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDnssdPlatform, TestCommissionableNode) { ChipLogError(Discovery, "Test commissionable"); - test::Reset(); DiscoveryImplPlatform & mdnsPlatform = DiscoveryImplPlatform::GetInstance(); - NL_TEST_ASSERT(inSuite, mdnsPlatform.Init(DeviceLayer::UDPEndPointManager()) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsPlatform.RemoveServices() == CHIP_NO_ERROR); commissionableSmall.callType = test::CallType::kStart; - NL_TEST_ASSERT(inSuite, - mdnsPlatform.GetCommissionableInstanceName(commissionableSmall.instanceName, - sizeof(commissionableSmall.instanceName)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test::AddExpectedCall(commissionableSmall) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsPlatform.Advertise(commissionableNodeParamsSmall) == CHIP_NO_ERROR); + EXPECT_EQ( + mdnsPlatform.GetCommissionableInstanceName(commissionableSmall.instanceName, sizeof(commissionableSmall.instanceName)), + CHIP_NO_ERROR); + EXPECT_EQ(test::AddExpectedCall(commissionableSmall), CHIP_NO_ERROR); + EXPECT_EQ(mdnsPlatform.Advertise(commissionableNodeParamsSmall), CHIP_NO_ERROR); // TODO: Right now, platform impl doesn't stop commissionable node before starting a new one. Add stop call here once that is // fixed. test::Reset(); commissionableLargeBasic.callType = test::CallType::kStart; - NL_TEST_ASSERT(inSuite, - mdnsPlatform.GetCommissionableInstanceName(commissionableLargeBasic.instanceName, - sizeof(commissionableLargeBasic.instanceName)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test::AddExpectedCall(commissionableLargeBasic) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsPlatform.Advertise(commissionableNodeParamsLargeBasic) == CHIP_NO_ERROR); + EXPECT_EQ(mdnsPlatform.GetCommissionableInstanceName(commissionableLargeBasic.instanceName, + sizeof(commissionableLargeBasic.instanceName)), + CHIP_NO_ERROR); + EXPECT_EQ(test::AddExpectedCall(commissionableLargeBasic), CHIP_NO_ERROR); + EXPECT_EQ(mdnsPlatform.Advertise(commissionableNodeParamsLargeBasic), CHIP_NO_ERROR); test::Reset(); commissionableLargeEnhanced.callType = test::CallType::kStart; - NL_TEST_ASSERT(inSuite, - mdnsPlatform.GetCommissionableInstanceName(commissionableLargeEnhanced.instanceName, - sizeof(commissionableLargeEnhanced.instanceName)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test::AddExpectedCall(commissionableLargeEnhanced) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsPlatform.Advertise(commissionableNodeParamsLargeEnhanced) == CHIP_NO_ERROR); + EXPECT_EQ(mdnsPlatform.GetCommissionableInstanceName(commissionableLargeEnhanced.instanceName, + sizeof(commissionableLargeEnhanced.instanceName)), + CHIP_NO_ERROR); + EXPECT_EQ(test::AddExpectedCall(commissionableLargeEnhanced), CHIP_NO_ERROR); + EXPECT_EQ(mdnsPlatform.Advertise(commissionableNodeParamsLargeEnhanced), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, mdnsPlatform.FinalizeServiceUpdate() == CHIP_NO_ERROR); -} - -int TestSetup(void * inContext) -{ - return chip::Platform::MemoryInit() == CHIP_NO_ERROR ? SUCCESS : FAILURE; + EXPECT_EQ(mdnsPlatform.FinalizeServiceUpdate(), CHIP_NO_ERROR); } -int TestTeardown(void * inContext) -{ - DiscoveryImplPlatform::GetInstance().Shutdown(); - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - -const nlTest sTests[] = { - NL_TEST_DEF("TestStub", TestStub), // - NL_TEST_DEF("TestOperational", TestOperational), // - NL_TEST_DEF("TestCommissionableNode", TestCommissionableNode), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestDnssdPlatform() -{ - nlTestSuite theSuite = { "DnssdPlatform", &sTests[0], &TestSetup, &TestTeardown }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestDnssdPlatform) From c2233975220dae296aacca06dcfed6075427fd15 Mon Sep 17 00:00:00 2001 From: Maksymilian Knust <m.knust@samsung.com> Date: Tue, 23 Apr 2024 18:37:28 +0200 Subject: [PATCH 006/124] Switched to pw_unit_test in src/lib/dnssd/minimal_mdns/core/ (#33069) * Switched to pw_unit_test in src/lib/dnssd/minimal_mdns/core/ * Update src/lib/dnssd/minimal_mdns/core/tests/TestHeapQName.cpp --------- Co-authored-by: Arkadiusz Bokowy <arkadiusz.bokowy@gmail.com> Co-authored-by: Arkadiusz Bokowy <a.bokowy@samsung.com> --- .../dnssd/minimal_mdns/core/tests/BUILD.gn | 5 +- .../core/tests/TestFlatAllocatedQName.cpp | 66 ++---- .../minimal_mdns/core/tests/TestHeapQName.cpp | 77 ++----- .../minimal_mdns/core/tests/TestQName.cpp | 206 +++++++----------- .../core/tests/TestRecordWriter.cpp | 60 ++--- .../openiotsdk/unit-tests/test_components.txt | 3 +- .../unit-tests/test_components_nl.txt | 1 - 7 files changed, 146 insertions(+), 272 deletions(-) diff --git a/src/lib/dnssd/minimal_mdns/core/tests/BUILD.gn b/src/lib/dnssd/minimal_mdns/core/tests/BUILD.gn index ce985ffc651b9a..39b59bb999c9ad 100644 --- a/src/lib/dnssd/minimal_mdns/core/tests/BUILD.gn +++ b/src/lib/dnssd/minimal_mdns/core/tests/BUILD.gn @@ -14,7 +14,6 @@ import("//build_overrides/build.gni") import("//build_overrides/chip.gni") -import("//build_overrides/nlunit_test.gni") import("${chip_root}/build/chip/chip_test_suite.gni") @@ -27,7 +26,7 @@ source_set("support") { ] } -chip_test_suite_using_nltest("tests") { +chip_test_suite("tests") { output_name = "libMinimalMdnsCoreTests" test_sources = [ @@ -43,7 +42,5 @@ chip_test_suite_using_nltest("tests") { ":support", "${chip_root}/src/lib/core", "${chip_root}/src/lib/dnssd/minimal_mdns/core", - "${chip_root}/src/lib/support:testing_nlunit", - "${nlunit_test_root}:nlunit-test", ] } diff --git a/src/lib/dnssd/minimal_mdns/core/tests/TestFlatAllocatedQName.cpp b/src/lib/dnssd/minimal_mdns/core/tests/TestFlatAllocatedQName.cpp index db9aa23d2a7eb1..c9ab4f222ef6f0 100644 --- a/src/lib/dnssd/minimal_mdns/core/tests/TestFlatAllocatedQName.cpp +++ b/src/lib/dnssd/minimal_mdns/core/tests/TestFlatAllocatedQName.cpp @@ -14,10 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include <lib/dnssd/minimal_mdns/core/FlatAllocatedQName.h> -#include <lib/support/UnitTestRegistration.h> +#include <gtest/gtest.h> -#include <nlunit-test.h> +#include <lib/dnssd/minimal_mdns/core/FlatAllocatedQName.h> namespace { @@ -38,28 +37,28 @@ class AutoFreeBuffer void * mBuffer; }; -void TestFlatAllocatedQName(nlTestSuite * inSuite, void * inContext) +TEST(TestFlatAllocatedQName, TestFlatAllocatedQName) { AutoFreeBuffer buffer(128); - NL_TEST_ASSERT(inSuite, FlatAllocatedQName::RequiredStorageSize("some", "test") == (sizeof(char * [2]) + 5 + 5)); + EXPECT_EQ(FlatAllocatedQName::RequiredStorageSize("some", "test"), (sizeof(char * [2]) + 5 + 5)); { FullQName built = FlatAllocatedQName::Build(buffer.Buffer(), "some", "test"); const QNamePart expected[] = { "some", "test" }; - NL_TEST_ASSERT(inSuite, FullQName(expected) == built); + EXPECT_EQ(FullQName(expected), built); } { FullQName built = FlatAllocatedQName::Build(buffer.Buffer(), "1", "2", "3"); const QNamePart expected[] = { "1", "2", "3" }; - NL_TEST_ASSERT(inSuite, FullQName(expected) == built); + EXPECT_EQ(FullQName(expected), built); } } -void SizeCompare(nlTestSuite * inSuite, void * inContext) +TEST(TestFlatAllocatedQName, SizeCompare) { static const char kThis[] = "this"; static const char kIs[] = "is"; @@ -79,23 +78,22 @@ void SizeCompare(nlTestSuite * inSuite, void * inContext) const size_t kTestStorageSize = FlatAllocatedQName::RequiredStorageSize(kThis, kIs, kA, kTest); - NL_TEST_ASSERT(inSuite, kTestStorageSize == FlatAllocatedQName::RequiredStorageSizeFromArray(kSameArraySameSize, 4)); - NL_TEST_ASSERT(inSuite, kTestStorageSize == FlatAllocatedQName::RequiredStorageSizeFromArray(kDifferentArraySameSize, 4)); - NL_TEST_ASSERT(inSuite, kTestStorageSize < FlatAllocatedQName::RequiredStorageSizeFromArray(kDifferenArrayLongerWord, 4)); - NL_TEST_ASSERT(inSuite, kTestStorageSize > FlatAllocatedQName::RequiredStorageSizeFromArray(kDifferenArrayShorterWord, 4)); + EXPECT_EQ(kTestStorageSize, FlatAllocatedQName::RequiredStorageSizeFromArray(kSameArraySameSize, 4)); + EXPECT_EQ(kTestStorageSize, FlatAllocatedQName::RequiredStorageSizeFromArray(kDifferentArraySameSize, 4)); + EXPECT_LT(kTestStorageSize, FlatAllocatedQName::RequiredStorageSizeFromArray(kDifferenArrayLongerWord, 4)); + EXPECT_GT(kTestStorageSize, FlatAllocatedQName::RequiredStorageSizeFromArray(kDifferenArrayShorterWord, 4)); // Although the size of the array is larger, if we tell the function there are only 4 words, it should still work. - NL_TEST_ASSERT(inSuite, kTestStorageSize == FlatAllocatedQName::RequiredStorageSizeFromArray(kSameArrayExtraWord, 4)); + EXPECT_EQ(kTestStorageSize, FlatAllocatedQName::RequiredStorageSizeFromArray(kSameArrayExtraWord, 4)); // If we add the extra word, the sizes should not match - NL_TEST_ASSERT(inSuite, kTestStorageSize < FlatAllocatedQName::RequiredStorageSizeFromArray(kSameArrayExtraWord, 5)); + EXPECT_LT(kTestStorageSize, FlatAllocatedQName::RequiredStorageSizeFromArray(kSameArrayExtraWord, 5)); - NL_TEST_ASSERT(inSuite, kTestStorageSize > FlatAllocatedQName::RequiredStorageSizeFromArray(kShorterArray, 3)); - NL_TEST_ASSERT(inSuite, - FlatAllocatedQName::RequiredStorageSizeFromArray(kSameArraySameSize, 3) == - FlatAllocatedQName::RequiredStorageSizeFromArray(kShorterArray, 3)); + EXPECT_GT(kTestStorageSize, FlatAllocatedQName::RequiredStorageSizeFromArray(kShorterArray, 3)); + EXPECT_EQ(FlatAllocatedQName::RequiredStorageSizeFromArray(kSameArraySameSize, 3), + FlatAllocatedQName::RequiredStorageSizeFromArray(kShorterArray, 3)); } -void BuildCompare(nlTestSuite * inSuite, void * inContext) +TEST(TestFlatAllocatedQName, BuildCompare) { static const char kThis[] = "this"; static const char kIs[] = "is"; @@ -111,33 +109,15 @@ void BuildCompare(nlTestSuite * inSuite, void * inContext) const FullQName kTestQName = FlatAllocatedQName::Build(storage, kThis, kIs, kA, kTest); - NL_TEST_ASSERT(inSuite, kTestQName == FlatAllocatedQName::BuildFromArray(storage, kSameArraySameSize, 4)); + EXPECT_EQ(kTestQName, FlatAllocatedQName::BuildFromArray(storage, kSameArraySameSize, 4)); // Although the size of the array is larger, if we tell the function there are only 4 words, it should still work. - NL_TEST_ASSERT(inSuite, kTestQName == FlatAllocatedQName::BuildFromArray(storage, kSameArrayExtraWord, 4)); + EXPECT_EQ(kTestQName, FlatAllocatedQName::BuildFromArray(storage, kSameArrayExtraWord, 4)); // If we add the extra word, the names - NL_TEST_ASSERT(inSuite, kTestQName != FlatAllocatedQName::BuildFromArray(storage, kSameArrayExtraWord, 5)); + EXPECT_NE(kTestQName, FlatAllocatedQName::BuildFromArray(storage, kSameArrayExtraWord, 5)); - NL_TEST_ASSERT(inSuite, kTestQName != FlatAllocatedQName::BuildFromArray(storage, kShorterArray, 3)); - NL_TEST_ASSERT(inSuite, - FlatAllocatedQName::BuildFromArray(storage, kSameArraySameSize, 3) == - FlatAllocatedQName::BuildFromArray(storage, kShorterArray, 3)); + EXPECT_NE(kTestQName, FlatAllocatedQName::BuildFromArray(storage, kShorterArray, 3)); + EXPECT_EQ(FlatAllocatedQName::BuildFromArray(storage, kSameArraySameSize, 3), + FlatAllocatedQName::BuildFromArray(storage, kShorterArray, 3)); } - -const nlTest sTests[] = { - NL_TEST_DEF("TestFlatAllocatedQName", TestFlatAllocatedQName), // - NL_TEST_DEF("TestFlatAllocatedQNameRequiredSizes", SizeCompare), // - NL_TEST_DEF("TestFlatAllocatedQNameBuild", BuildCompare), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestFlatAllocatedQName() -{ - nlTestSuite theSuite = { "FlatAllocatedQName", sTests, nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestFlatAllocatedQName) diff --git a/src/lib/dnssd/minimal_mdns/core/tests/TestHeapQName.cpp b/src/lib/dnssd/minimal_mdns/core/tests/TestHeapQName.cpp index 51e31ca0112205..22287751ac5f05 100644 --- a/src/lib/dnssd/minimal_mdns/core/tests/TestHeapQName.cpp +++ b/src/lib/dnssd/minimal_mdns/core/tests/TestHeapQName.cpp @@ -16,17 +16,23 @@ * limitations under the License. */ +#include <gtest/gtest.h> + #include <lib/dnssd/minimal_mdns/core/HeapQName.h> #include <lib/dnssd/minimal_mdns/core/tests/QNameStrings.h> -#include <lib/support/UnitTestRegistration.h> - -#include <nlunit-test.h> namespace { using namespace mdns::Minimal; -void Construction(nlTestSuite * inSuite, void * inContext) +class TestHeapQName : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestHeapQName, Construction) { { @@ -34,9 +40,9 @@ void Construction(nlTestSuite * inSuite, void * inContext) HeapQName heapQName(kShort.Serialized()); - NL_TEST_ASSERT(inSuite, heapQName.IsOk()); - NL_TEST_ASSERT(inSuite, heapQName.Content() == kShort.Full()); - NL_TEST_ASSERT(inSuite, kShort.Serialized() == heapQName.Content()); + EXPECT_TRUE(heapQName.IsOk()); + EXPECT_EQ(heapQName.Content(), kShort.Full()); + EXPECT_EQ(kShort.Serialized(), heapQName.Content()); } { @@ -45,13 +51,13 @@ void Construction(nlTestSuite * inSuite, void * inContext) HeapQName heapQName(kLonger.Serialized()); - NL_TEST_ASSERT(inSuite, heapQName.IsOk()); - NL_TEST_ASSERT(inSuite, heapQName.Content() == kLonger.Full()); - NL_TEST_ASSERT(inSuite, kLonger.Serialized() == heapQName.Content()); + EXPECT_TRUE(heapQName.IsOk()); + EXPECT_EQ(heapQName.Content(), kLonger.Full()); + EXPECT_EQ(kLonger.Serialized(), heapQName.Content()); } } -void Copying(nlTestSuite * inSuite, void * inContext) +TEST_F(TestHeapQName, Copying) { const testing::TestQName<2> kShort({ "some", "test" }); @@ -61,50 +67,11 @@ void Copying(nlTestSuite * inSuite, void * inContext) name3 = name2; - NL_TEST_ASSERT(inSuite, name1.IsOk()); - NL_TEST_ASSERT(inSuite, name2.IsOk()); - NL_TEST_ASSERT(inSuite, name3.IsOk()); - NL_TEST_ASSERT(inSuite, name1.Content() == name2.Content()); - NL_TEST_ASSERT(inSuite, name1.Content() == name3.Content()); -} - -static const nlTest sTests[] = { // - NL_TEST_DEF("Construction", Construction), // - NL_TEST_DEF("Copying", Copying), // - NL_TEST_SENTINEL() -}; - -int Setup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - if (error != CHIP_NO_ERROR) - return FAILURE; - return SUCCESS; -} - -/** - * Tear down the test suite. - */ -int Teardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; + EXPECT_TRUE(name1.IsOk()); + EXPECT_TRUE(name2.IsOk()); + EXPECT_TRUE(name3.IsOk()); + EXPECT_EQ(name1.Content(), name2.Content()); + EXPECT_EQ(name1.Content(), name3.Content()); } } // namespace - -int TestHeapQName() -{ - nlTestSuite theSuite = { - "HeapQName", - &sTests[0], - &Setup, - &Teardown, - }; - - nlTestRunner(&theSuite, nullptr); - - return (nlTestRunnerStats(&theSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestHeapQName) diff --git a/src/lib/dnssd/minimal_mdns/core/tests/TestQName.cpp b/src/lib/dnssd/minimal_mdns/core/tests/TestQName.cpp index da2f91013b3217..5f430bd3c76a7a 100644 --- a/src/lib/dnssd/minimal_mdns/core/tests/TestQName.cpp +++ b/src/lib/dnssd/minimal_mdns/core/tests/TestQName.cpp @@ -16,10 +16,9 @@ * limitations under the License. */ -#include <lib/dnssd/minimal_mdns/core/QName.h> -#include <lib/support/UnitTestRegistration.h> +#include <gtest/gtest.h> -#include <nlunit-test.h> +#include <lib/dnssd/minimal_mdns/core/QName.h> namespace { @@ -40,67 +39,67 @@ static SerializedQNameIterator AsSerializedQName(const uint8_t (&v)[N]) return SerializedQNameIterator(BytesRange(v, v + N - 1), v); } -void IteratorTest(nlTestSuite * inSuite, void * inContext) +TEST(TestQName, IteratorTest) { { static const uint8_t kOneItem[] = "\04test\00"; SerializedQNameIterator it = AsSerializedQName(kOneItem); - NL_TEST_ASSERT(inSuite, it.Next()); - NL_TEST_ASSERT(inSuite, strcmp(it.Value(), "test") == 0); - NL_TEST_ASSERT(inSuite, !it.Next()); - NL_TEST_ASSERT(inSuite, it.IsValid()); + EXPECT_TRUE(it.Next()); + EXPECT_STREQ(it.Value(), "test"); + EXPECT_FALSE(it.Next()); + EXPECT_TRUE(it.IsValid()); } { static const uint8_t kManyItems[] = "\04this\02is\01a\04test\00"; SerializedQNameIterator it = AsSerializedQName(kManyItems); - NL_TEST_ASSERT(inSuite, it.Next()); - NL_TEST_ASSERT(inSuite, strcmp(it.Value(), "this") == 0); + EXPECT_TRUE(it.Next()); + EXPECT_STREQ(it.Value(), "this"); - NL_TEST_ASSERT(inSuite, it.Next()); - NL_TEST_ASSERT(inSuite, strcmp(it.Value(), "is") == 0); + EXPECT_TRUE(it.Next()); + EXPECT_STREQ(it.Value(), "is"); - NL_TEST_ASSERT(inSuite, it.Next()); - NL_TEST_ASSERT(inSuite, strcmp(it.Value(), "a") == 0); + EXPECT_TRUE(it.Next()); + EXPECT_STREQ(it.Value(), "a"); - NL_TEST_ASSERT(inSuite, it.Next()); - NL_TEST_ASSERT(inSuite, strcmp(it.Value(), "test") == 0); + EXPECT_TRUE(it.Next()); + EXPECT_STREQ(it.Value(), "test"); - NL_TEST_ASSERT(inSuite, !it.Next()); - NL_TEST_ASSERT(inSuite, it.IsValid()); + EXPECT_FALSE(it.Next()); + EXPECT_TRUE(it.IsValid()); } { static const uint8_t kPtrItems[] = "abc\02is\01a\04test\00\04this\xc0\03"; SerializedQNameIterator it(BytesRange(kPtrItems, kPtrItems + sizeof(kPtrItems)), kPtrItems + 14); - NL_TEST_ASSERT(inSuite, it.Next()); - NL_TEST_ASSERT(inSuite, strcmp(it.Value(), "this") == 0); + EXPECT_TRUE(it.Next()); + EXPECT_STREQ(it.Value(), "this"); - NL_TEST_ASSERT(inSuite, it.Next()); - NL_TEST_ASSERT(inSuite, strcmp(it.Value(), "is") == 0); + EXPECT_TRUE(it.Next()); + EXPECT_STREQ(it.Value(), "is"); - NL_TEST_ASSERT(inSuite, it.Next()); - NL_TEST_ASSERT(inSuite, strcmp(it.Value(), "a") == 0); + EXPECT_TRUE(it.Next()); + EXPECT_STREQ(it.Value(), "a"); - NL_TEST_ASSERT(inSuite, it.Next()); - NL_TEST_ASSERT(inSuite, strcmp(it.Value(), "test") == 0); + EXPECT_TRUE(it.Next()); + EXPECT_STREQ(it.Value(), "test"); - NL_TEST_ASSERT(inSuite, !it.Next()); - NL_TEST_ASSERT(inSuite, it.IsValid()); + EXPECT_FALSE(it.Next()); + EXPECT_TRUE(it.IsValid()); } } -void ErrorTest(nlTestSuite * inSuite, void * inContext) +TEST(TestQName, ErrorTest) { { // Truncated before the end static const uint8_t kData[] = "\04test"; SerializedQNameIterator it = AsSerializedQName(kData); - NL_TEST_ASSERT(inSuite, !it.Next()); - NL_TEST_ASSERT(inSuite, !it.IsValid()); + EXPECT_FALSE(it.Next()); + EXPECT_FALSE(it.IsValid()); } { @@ -108,8 +107,8 @@ void ErrorTest(nlTestSuite * inSuite, void * inContext) static const uint8_t kData[] = "\02"; SerializedQNameIterator it = AsSerializedQName(kData); - NL_TEST_ASSERT(inSuite, !it.Next()); - NL_TEST_ASSERT(inSuite, !it.IsValid()); + EXPECT_FALSE(it.Next()); + EXPECT_FALSE(it.IsValid()); } { @@ -117,12 +116,12 @@ void ErrorTest(nlTestSuite * inSuite, void * inContext) static const uint8_t kData[] = "\xc0"; SerializedQNameIterator it = AsSerializedQName(kData); - NL_TEST_ASSERT(inSuite, !it.Next()); - NL_TEST_ASSERT(inSuite, !it.IsValid()); + EXPECT_FALSE(it.Next()); + EXPECT_FALSE(it.IsValid()); } } -void InvalidReferencing(nlTestSuite * inSuite, void * inContext) +TEST(TestQName, InvalidReferencing) { { // Truncated before the end (but seemingly valid in case of error) @@ -130,8 +129,8 @@ void InvalidReferencing(nlTestSuite * inSuite, void * inContext) static const uint8_t kData[] = "\00\xc0\x00"; SerializedQNameIterator it(BytesRange(kData, kData + 2), kData + 1); - NL_TEST_ASSERT(inSuite, !it.Next()); - NL_TEST_ASSERT(inSuite, !it.IsValid()); + EXPECT_FALSE(it.Next()); + EXPECT_FALSE(it.IsValid()); } { @@ -139,9 +138,9 @@ void InvalidReferencing(nlTestSuite * inSuite, void * inContext) static const uint8_t kData[] = "\03test\xc0\x00"; SerializedQNameIterator it = AsSerializedQName(kData); - NL_TEST_ASSERT(inSuite, it.Next()); - NL_TEST_ASSERT(inSuite, !it.Next()); - NL_TEST_ASSERT(inSuite, !it.IsValid()); + EXPECT_TRUE(it.Next()); + EXPECT_FALSE(it.Next()); + EXPECT_FALSE(it.IsValid()); } { @@ -149,9 +148,9 @@ void InvalidReferencing(nlTestSuite * inSuite, void * inContext) static const uint8_t kData[] = "\03test\xc0\x05"; SerializedQNameIterator it = AsSerializedQName(kData); - NL_TEST_ASSERT(inSuite, it.Next()); - NL_TEST_ASSERT(inSuite, !it.Next()); - NL_TEST_ASSERT(inSuite, !it.IsValid()); + EXPECT_TRUE(it.Next()); + EXPECT_FALSE(it.Next()); + EXPECT_FALSE(it.IsValid()); } { @@ -159,8 +158,8 @@ void InvalidReferencing(nlTestSuite * inSuite, void * inContext) static const uint8_t kData[] = "\xc0\x00"; SerializedQNameIterator it = AsSerializedQName(kData); - NL_TEST_ASSERT(inSuite, !it.Next()); - NL_TEST_ASSERT(inSuite, !it.IsValid()); + EXPECT_FALSE(it.Next()); + EXPECT_FALSE(it.IsValid()); } { @@ -168,171 +167,134 @@ void InvalidReferencing(nlTestSuite * inSuite, void * inContext) static const uint8_t kData[] = "\03test\xc0\x07"; SerializedQNameIterator it = AsSerializedQName(kData); - NL_TEST_ASSERT(inSuite, it.Next()); - NL_TEST_ASSERT(inSuite, !it.Next()); - NL_TEST_ASSERT(inSuite, !it.IsValid()); + EXPECT_TRUE(it.Next()); + EXPECT_FALSE(it.Next()); + EXPECT_FALSE(it.IsValid()); } } -void Comparison(nlTestSuite * inSuite, void * inContext) +TEST(TestQName, Comparison) { static const uint8_t kManyItems[] = "\04this\02is\01a\04test\00"; { const QNamePart kTestName[] = { "this" }; - NL_TEST_ASSERT(inSuite, AsSerializedQName(kManyItems) != FullQName(kTestName)); + EXPECT_NE(AsSerializedQName(kManyItems), FullQName(kTestName)); } { const QNamePart kTestName[] = { "this", "is" }; - NL_TEST_ASSERT(inSuite, AsSerializedQName(kManyItems) != FullQName(kTestName)); + EXPECT_NE(AsSerializedQName(kManyItems), FullQName(kTestName)); } { const QNamePart kTestName[] = { "is", "a", "test" }; - NL_TEST_ASSERT(inSuite, AsSerializedQName(kManyItems) != FullQName(kTestName)); + EXPECT_NE(AsSerializedQName(kManyItems), FullQName(kTestName)); } { const QNamePart kTestName[] = { "this", "is", "a", "test" }; - NL_TEST_ASSERT(inSuite, AsSerializedQName(kManyItems) == FullQName(kTestName)); + EXPECT_EQ(AsSerializedQName(kManyItems), FullQName(kTestName)); } { const QNamePart kTestName[] = { "this", "is", "a", "test", "suffix" }; - NL_TEST_ASSERT(inSuite, AsSerializedQName(kManyItems) != FullQName(kTestName)); + EXPECT_NE(AsSerializedQName(kManyItems), FullQName(kTestName)); } { const QNamePart kTestName[] = { "prefix", "this", "is", "a", "test" }; - NL_TEST_ASSERT(inSuite, AsSerializedQName(kManyItems) != FullQName(kTestName)); + EXPECT_NE(AsSerializedQName(kManyItems), FullQName(kTestName)); } } -void CaseInsensitiveSerializedCompare(nlTestSuite * inSuite, void * inContext) +TEST(TestQName, CaseInsensitiveSerializedCompare) { static const uint8_t kManyItems[] = "\04thIs\02iS\01a\04tEst\00"; { const QNamePart kTestName[] = { "this", "is", "a", "test" }; - NL_TEST_ASSERT(inSuite, - SerializedQNameIterator(BytesRange(kManyItems, kManyItems + sizeof(kManyItems)), kManyItems) == - FullQName(kTestName)); + EXPECT_EQ(SerializedQNameIterator(BytesRange(kManyItems, kManyItems + sizeof(kManyItems)), kManyItems), + FullQName(kTestName)); } { const QNamePart kTestName[] = { "THIS", "IS", "A", "test" }; - NL_TEST_ASSERT(inSuite, - SerializedQNameIterator(BytesRange(kManyItems, kManyItems + sizeof(kManyItems)), kManyItems) == - FullQName(kTestName)); + EXPECT_EQ(SerializedQNameIterator(BytesRange(kManyItems, kManyItems + sizeof(kManyItems)), kManyItems), + FullQName(kTestName)); } { const QNamePart kTestName[] = { "THIS", "IS", "A", "TEST" }; - NL_TEST_ASSERT(inSuite, - SerializedQNameIterator(BytesRange(kManyItems, kManyItems + sizeof(kManyItems)), kManyItems) == - FullQName(kTestName)); + EXPECT_EQ(SerializedQNameIterator(BytesRange(kManyItems, kManyItems + sizeof(kManyItems)), kManyItems), + FullQName(kTestName)); } } -void CaseInsensitiveFullQNameCompare(nlTestSuite * inSuite, void * inContext) +TEST(TestQName, CaseInsensitiveFullQNameCompare) { { const QNamePart kName1[] = { "this", "is", "a", "test" }; const QNamePart kName2[] = { "this", "IS", "a", "TEST" }; - NL_TEST_ASSERT(inSuite, FullQName(kName1) == FullQName(kName2)); + EXPECT_EQ(FullQName(kName1), FullQName(kName2)); } { const QNamePart kName1[] = { "THIS", "IS", "a", "tesT" }; const QNamePart kName2[] = { "this", "IS", "A", "TEst" }; - NL_TEST_ASSERT(inSuite, FullQName(kName1) == FullQName(kName2)); + EXPECT_EQ(FullQName(kName1), FullQName(kName2)); } { const QNamePart kName1[] = { "THIS", "IS", "a", "test" }; const QNamePart kName2[] = { "this", "IS", "A", "NEST" }; - NL_TEST_ASSERT(inSuite, FullQName(kName1) != FullQName(kName2)); + EXPECT_NE(FullQName(kName1), FullQName(kName2)); } { const QNamePart kName1[] = { "THIS", "IS", "a" }; const QNamePart kName2[] = { "this", "IS", "A", "NEST" }; - NL_TEST_ASSERT(inSuite, FullQName(kName1) != FullQName(kName2)); + EXPECT_NE(FullQName(kName1), FullQName(kName2)); } { const QNamePart kName1[] = { "THIS", "IS", "a" }; const QNamePart kName2[] = { "this", "IS" }; - NL_TEST_ASSERT(inSuite, FullQName(kName1) != FullQName(kName2)); + EXPECT_NE(FullQName(kName1), FullQName(kName2)); } { const QNamePart kName[] = { "this" }; - NL_TEST_ASSERT(inSuite, FullQName() != FullQName(kName)); - NL_TEST_ASSERT(inSuite, FullQName(kName) != FullQName()); + EXPECT_NE(FullQName(), FullQName(kName)); + EXPECT_NE(FullQName(kName), FullQName()); } } -void SerializedCompare(nlTestSuite * inSuite, void * inContext) +TEST(TestQName, SerializedCompare) { static const uint8_t kThisIsATest1[] = "\04this\02is\01a\04test\00"; static const uint8_t kThisIsATest2[] = "\04ThIs\02is\01A\04tESt\00"; static const uint8_t kThisIsDifferent[] = "\04this\02is\09different\00"; static const uint8_t kThisIs[] = "\04this\02is"; - NL_TEST_ASSERT(inSuite, AsSerializedQName(kThisIsATest1) == AsSerializedQName(kThisIsATest1)); - NL_TEST_ASSERT(inSuite, AsSerializedQName(kThisIsATest2) == AsSerializedQName(kThisIsATest2)); - NL_TEST_ASSERT(inSuite, AsSerializedQName(kThisIsATest1) == AsSerializedQName(kThisIsATest2)); - NL_TEST_ASSERT(inSuite, AsSerializedQName(kThisIsATest1) != AsSerializedQName(kThisIsDifferent)); - NL_TEST_ASSERT(inSuite, AsSerializedQName(kThisIsDifferent) != AsSerializedQName(kThisIsATest1)); - NL_TEST_ASSERT(inSuite, AsSerializedQName(kThisIsDifferent) != AsSerializedQName(kThisIs)); - NL_TEST_ASSERT(inSuite, AsSerializedQName(kThisIs) != AsSerializedQName(kThisIsDifferent)); + EXPECT_EQ(AsSerializedQName(kThisIsATest1), AsSerializedQName(kThisIsATest1)); + EXPECT_EQ(AsSerializedQName(kThisIsATest2), AsSerializedQName(kThisIsATest2)); + EXPECT_EQ(AsSerializedQName(kThisIsATest1), AsSerializedQName(kThisIsATest2)); + EXPECT_NE(AsSerializedQName(kThisIsATest1), AsSerializedQName(kThisIsDifferent)); + EXPECT_NE(AsSerializedQName(kThisIsDifferent), AsSerializedQName(kThisIsATest1)); + EXPECT_NE(AsSerializedQName(kThisIsDifferent), AsSerializedQName(kThisIs)); + EXPECT_NE(AsSerializedQName(kThisIs), AsSerializedQName(kThisIsDifferent)); // These items have back references and are "this.is.a.test" static const uint8_t kPtrItems[] = "\03abc\02is\01a\04test\00\04this\xc0\04"; SerializedQNameIterator thisIsATestPtr(BytesRange(kPtrItems, kPtrItems + sizeof(kPtrItems)), kPtrItems + 15); - NL_TEST_ASSERT(inSuite, thisIsATestPtr == AsSerializedQName(kThisIsATest1)); - NL_TEST_ASSERT(inSuite, thisIsATestPtr == AsSerializedQName(kThisIsATest2)); - NL_TEST_ASSERT(inSuite, AsSerializedQName(kThisIsATest1) == thisIsATestPtr); - NL_TEST_ASSERT(inSuite, AsSerializedQName(kThisIsATest2) == thisIsATestPtr); - NL_TEST_ASSERT(inSuite, thisIsATestPtr != AsSerializedQName(kThisIs)); - NL_TEST_ASSERT(inSuite, AsSerializedQName(kThisIs) != thisIsATestPtr); + EXPECT_EQ(thisIsATestPtr, AsSerializedQName(kThisIsATest1)); + EXPECT_EQ(thisIsATestPtr, AsSerializedQName(kThisIsATest2)); + EXPECT_EQ(AsSerializedQName(kThisIsATest1), thisIsATestPtr); + EXPECT_EQ(AsSerializedQName(kThisIsATest2), thisIsATestPtr); + EXPECT_NE(thisIsATestPtr, AsSerializedQName(kThisIs)); + EXPECT_NE(AsSerializedQName(kThisIs), thisIsATestPtr); } } // namespace - -// clang-format off -static const nlTest sTests[] = -{ - NL_TEST_DEF("IteratorTest", IteratorTest), - NL_TEST_DEF("ErrorTest", ErrorTest), - NL_TEST_DEF("Comparison", Comparison), - NL_TEST_DEF("CaseInsensitiveSerializedCompare", CaseInsensitiveSerializedCompare), - NL_TEST_DEF("CaseInsensitiveFullQNameCompare", CaseInsensitiveFullQNameCompare), - NL_TEST_DEF("SerializedCompare", SerializedCompare), - NL_TEST_DEF("InvalidReferencing", InvalidReferencing), - - NL_TEST_SENTINEL() -}; -// clang-format on - -int TestQName() -{ - // clang-format off - nlTestSuite theSuite = - { - "QName", - &sTests[0], - nullptr, - nullptr - }; - // clang-format on - - nlTestRunner(&theSuite, nullptr); - - return (nlTestRunnerStats(&theSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestQName) diff --git a/src/lib/dnssd/minimal_mdns/core/tests/TestRecordWriter.cpp b/src/lib/dnssd/minimal_mdns/core/tests/TestRecordWriter.cpp index e6e2e9611f38c6..f8dbc220978c87 100644 --- a/src/lib/dnssd/minimal_mdns/core/tests/TestRecordWriter.cpp +++ b/src/lib/dnssd/minimal_mdns/core/tests/TestRecordWriter.cpp @@ -16,17 +16,16 @@ * limitations under the License. */ -#include <lib/dnssd/minimal_mdns/core/RecordWriter.h> -#include <lib/support/UnitTestRegistration.h> +#include <gtest/gtest.h> -#include <nlunit-test.h> +#include <lib/dnssd/minimal_mdns/core/RecordWriter.h> namespace { using namespace mdns::Minimal; using namespace chip::Encoding::BigEndian; -void BasicWriteTest(nlTestSuite * inSuite, void * inContext) +TEST(TestRecordWriter, BasicWriteTest) { const QNamePart kName1[] = { "some", "name" }; const QNamePart kName2[] = { "abc", "xyz", "here" }; @@ -52,11 +51,11 @@ void BasicWriteTest(nlTestSuite * inSuite, void * inContext) }; // clang-format on - NL_TEST_ASSERT(inSuite, output.Needed() == sizeof(expectedOutput)); - NL_TEST_ASSERT(inSuite, memcmp(dataBuffer, expectedOutput, sizeof(expectedOutput)) == 0); + EXPECT_EQ(output.Needed(), sizeof(expectedOutput)); + EXPECT_EQ(memcmp(dataBuffer, expectedOutput, sizeof(expectedOutput)), 0); } -void SimpleDedup(nlTestSuite * inSuite, void * inContext) +TEST(TestRecordWriter, SimpleDedup) { const QNamePart kName1[] = { "some", "name" }; const QNamePart kName2[] = { "other", "name" }; @@ -80,11 +79,11 @@ void SimpleDedup(nlTestSuite * inSuite, void * inContext) }; // clang-format on - NL_TEST_ASSERT(inSuite, output.Needed() == sizeof(expectedOutput)); - NL_TEST_ASSERT(inSuite, memcmp(dataBuffer, expectedOutput, sizeof(expectedOutput)) == 0); + EXPECT_EQ(output.Needed(), sizeof(expectedOutput)); + EXPECT_EQ(memcmp(dataBuffer, expectedOutput, sizeof(expectedOutput)), 0); } -void ComplexDedup(nlTestSuite * inSuite, void * inContext) +TEST(TestRecordWriter, ComplexDedup) { const QNamePart kName1[] = { "some", "name" }; const QNamePart kName2[] = { "other", "name" }; @@ -125,11 +124,11 @@ void ComplexDedup(nlTestSuite * inSuite, void * inContext) }; // clang-format on - NL_TEST_ASSERT(inSuite, output.Needed() == sizeof(expectedOutput)); - NL_TEST_ASSERT(inSuite, memcmp(dataBuffer, expectedOutput, sizeof(expectedOutput)) == 0); + EXPECT_EQ(output.Needed(), sizeof(expectedOutput)); + EXPECT_EQ(memcmp(dataBuffer, expectedOutput, sizeof(expectedOutput)), 0); } -void TonsOfReferences(nlTestSuite * inSuite, void * inContext) +TEST(TestRecordWriter, TonsOfReferences) { const QNamePart kName1[] = { "some", "name" }; const QNamePart kName2[] = { "different", "name" }; @@ -159,39 +158,8 @@ void TonsOfReferences(nlTestSuite * inSuite, void * inContext) writer.WriteQName(FullQName(kName2)); } - NL_TEST_ASSERT(inSuite, output.Fit()); - NL_TEST_ASSERT(inSuite, output.Needed() == 423); + EXPECT_TRUE(output.Fit()); + EXPECT_EQ(output.Needed(), 423u); } } // namespace - -// clang-format off -static const nlTest sTests[] = -{ - NL_TEST_DEF("BasicWriteTest", BasicWriteTest), - NL_TEST_DEF("SimpleDedup", SimpleDedup), - NL_TEST_DEF("ComplexDedup", ComplexDedup), - NL_TEST_DEF("TonsOfReferences", TonsOfReferences), - - NL_TEST_SENTINEL() -}; -// clang-format on - -int TestRecordWriter() -{ - // clang-format off - nlTestSuite theSuite = - { - "RecordWriter", - &sTests[0], - nullptr, - nullptr - }; - // clang-format on - - nlTestRunner(&theSuite, nullptr); - - return (nlTestRunnerStats(&theSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestRecordWriter) diff --git a/src/test_driver/openiotsdk/unit-tests/test_components.txt b/src/test_driver/openiotsdk/unit-tests/test_components.txt index 8504c28313f998..e112a8b2ed5d50 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components.txt @@ -1,9 +1,10 @@ accesstest -SystemLayerTests ASN1Tests +MinimalMdnsCoreTests MinimalMdnsRecordsTests MinimalMdnsRespondersTests CoreTests PlatformTests +SystemLayerTests TestShell SetupPayloadTests \ No newline at end of file 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 3da7f5bdfb608f..13a59af526f4dd 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt @@ -6,7 +6,6 @@ DataModelTests InetLayerTests MdnsTests MessagingLayerTests -MinimalMdnsCoreTests RawTransportTests RetransmitTests SecureChannelTests From 5e925caa142e9702d96c352a9fea44695327bf34 Mon Sep 17 00:00:00 2001 From: Andrei Litvin <andy314@gmail.com> Date: Tue, 23 Apr 2024 13:42:58 -0400 Subject: [PATCH 007/124] MinMDNS - do not ask for IP addresses for every SRV record that is seen (#33095) * Initial version of a test app - ability to just send a packet into the world * Update constants to match a real advertisement * Only resolve IP addresses if we are interested in this path * Fix up logic: this is per peer id * Remove unused include * Undo debug code * Undo extra header add * Add header back, but with full path * Fix up some more headers * Remove unhelpful comment * Move tester program out (will be part of another PR) --------- Co-authored-by: Andrei Litvin <andreilitvin@google.com> --- src/lib/dnssd/ActiveResolveAttempts.cpp | 28 ++++++++++++++++++++-- src/lib/dnssd/ActiveResolveAttempts.h | 6 +++++ src/lib/dnssd/IncrementalResolve.h | 7 ++++++ src/lib/dnssd/Resolver_ImplMinimalMdns.cpp | 20 +++++++++++++--- 4 files changed, 56 insertions(+), 5 deletions(-) diff --git a/src/lib/dnssd/ActiveResolveAttempts.cpp b/src/lib/dnssd/ActiveResolveAttempts.cpp index fe0cc16ebb26aa..f49056896e0b2e 100644 --- a/src/lib/dnssd/ActiveResolveAttempts.cpp +++ b/src/lib/dnssd/ActiveResolveAttempts.cpp @@ -19,8 +19,6 @@ #include <lib/support/logging/CHIPLogging.h> -#include <algorithm> - using namespace chip; namespace mdns { @@ -284,6 +282,32 @@ Optional<ActiveResolveAttempts::ScheduledAttempt> ActiveResolveAttempts::NextSch return Optional<ScheduledAttempt>::Missing(); } +bool ActiveResolveAttempts::ShouldResolveIpAddress(PeerId peerId) const +{ + for (auto & item : mRetryQueue) + { + if (item.attempt.IsEmpty()) + { + continue; + } + if (item.attempt.IsBrowse()) + { + return true; + } + + if (item.attempt.IsResolve()) + { + auto & data = item.attempt.ResolveData(); + if (data.peerId == peerId) + { + return true; + } + } + } + + return false; +} + bool ActiveResolveAttempts::IsWaitingForIpResolutionFor(SerializedQNameIterator hostName) const { for (auto & entry : mRetryQueue) diff --git a/src/lib/dnssd/ActiveResolveAttempts.h b/src/lib/dnssd/ActiveResolveAttempts.h index ba6d8cf7a54f6e..1d87bbbba49cbc 100644 --- a/src/lib/dnssd/ActiveResolveAttempts.h +++ b/src/lib/dnssd/ActiveResolveAttempts.h @@ -288,6 +288,12 @@ class ActiveResolveAttempts /// IP resolution. bool IsWaitingForIpResolutionFor(SerializedQNameIterator hostName) const; + /// Determines if address resolution for the given peer ID is required + /// + /// IP Addresses are required for active operational discovery of specific peers + /// or if an active browse is being performed. + bool ShouldResolveIpAddress(chip::PeerId peerId) const; + /// Check if a browse operation is active for the given discovery type bool HasBrowseFor(chip::Dnssd::DiscoveryType type) const; diff --git a/src/lib/dnssd/IncrementalResolve.h b/src/lib/dnssd/IncrementalResolve.h index 9d2386472d7eba..17790b6f9f5fe0 100644 --- a/src/lib/dnssd/IncrementalResolve.h +++ b/src/lib/dnssd/IncrementalResolve.h @@ -17,6 +17,7 @@ #pragma once #include <lib/dnssd/Resolver.h> +#include <lib/dnssd/Types.h> #include <lib/dnssd/minimal_mdns/Parser.h> #include <lib/dnssd/minimal_mdns/RecordData.h> #include <lib/dnssd/minimal_mdns/core/QName.h> @@ -104,6 +105,12 @@ class IncrementalResolver ServiceNameType GetCurrentType() const { return mServiceNameType; } + PeerId OperationalParsePeerId() const + { + VerifyOrReturnValue(IsActiveOperationalParse(), PeerId()); + return mSpecificResolutionData.Get<OperationalNodeData>().peerId; + } + /// Start parsing a new record. SRV records are the records we are mainly /// interested on, after which TXT and A/AAAA are looked for. /// diff --git a/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp b/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp index a5e7117a72a005..3abc11ac659cf8 100644 --- a/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp +++ b/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp @@ -17,8 +17,6 @@ #include "Resolver.h" -#include <limits> - #include <lib/core/CHIPConfig.h> #include <lib/dnssd/ActiveResolveAttempts.h> #include <lib/dnssd/IncrementalResolve.h> @@ -372,7 +370,23 @@ void MinMdnsResolver::AdvancePendingResolverStates() if (missing.Has(IncrementalResolver::RequiredInformationBitFlags::kIpAddress)) { - ScheduleIpAddressResolve(resolver->GetTargetHostName()); + if (resolver->IsActiveBrowseParse()) + { + // Browse wants IP addresses + ScheduleIpAddressResolve(resolver->GetTargetHostName()); + } + else if (mActiveResolves.ShouldResolveIpAddress(resolver->OperationalParsePeerId())) + { + // Keep searching for IP addresses if an active resolve needs these IP addresses + // otherwise ignore the data (received a SRV record without IP address, however we do not + // seem interested in it. Probably just a device that came online). + ScheduleIpAddressResolve(resolver->GetTargetHostName()); + } + else + { + // This IP address is not interesting enough to run another discovery + resolver->ResetToInactive(); + } continue; } From 628d0f361975ecb7d8adf3553df2ef1a5836fbc9 Mon Sep 17 00:00:00 2001 From: mkardous-silabs <84793247+mkardous-silabs@users.noreply.github.com> Date: Tue, 23 Apr 2024 16:10:08 -0400 Subject: [PATCH 008/124] Add Apptask behavior in the LIT ICD app (#33116) --- examples/lit-icd-app/silabs/include/AppTask.h | 28 ++++++++++++- .../silabs/include/CHIPProjectConfig.h | 7 ++++ examples/lit-icd-app/silabs/src/AppTask.cpp | 42 +++++++++++++++++-- 3 files changed, 72 insertions(+), 5 deletions(-) diff --git a/examples/lit-icd-app/silabs/include/AppTask.h b/examples/lit-icd-app/silabs/include/AppTask.h index 7866fc48079962..e4440f78d77e05 100644 --- a/examples/lit-icd-app/silabs/include/AppTask.h +++ b/examples/lit-icd-app/silabs/include/AppTask.h @@ -28,6 +28,7 @@ #include "AppEvent.h" #include "BaseApplication.h" +#include <app/icd/server/ICDStateObserver.h> #include <ble/Ble.h> #include <cmsis_os2.h> #include <lib/core/CHIPError.h> @@ -49,11 +50,12 @@ * AppTask Declaration *********************************************************/ -class AppTask : public BaseApplication +class AppTask : public BaseApplication, public chip::app::ICDStateObserver { public: - AppTask() = default; + AppTask() = default; + virtual ~AppTask() = default; static AppTask & GetAppTask() { return sAppTask; } @@ -76,6 +78,28 @@ class AppTask : public BaseApplication */ static void ButtonEventHandler(uint8_t button, uint8_t btnAction); + /** + * @brief When the ICD enters ActiveMode, update LCD to reflect the ICD current state. + * Set LCD to ActiveMode UI. + */ + void OnEnterActiveMode(); + + /** + * @brief When the ICD enters IdleMode, update LCD to reflect the ICD current state. + * Set LCD to IdleMode UI. + */ + void OnEnterIdleMode(); + + /** + * @brief AppTask has no action to do on this ICD event. Do nothing. + */ + void OnTransitionToIdle(){}; + + /** + * @brief AppTask has no action to do on this ICD event. Do nothing. + */ + void OnICDModeChange(){}; + private: static AppTask sAppTask; diff --git a/examples/lit-icd-app/silabs/include/CHIPProjectConfig.h b/examples/lit-icd-app/silabs/include/CHIPProjectConfig.h index 0a57cdfdcebb83..7681cd3bc5a644 100644 --- a/examples/lit-icd-app/silabs/include/CHIPProjectConfig.h +++ b/examples/lit-icd-app/silabs/include/CHIPProjectConfig.h @@ -86,3 +86,10 @@ * A size, in bytes, of the individual debug event logging buffer. */ #define CHIP_DEVICE_CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE (512) + +/** + * @brief CHIP_CONFIG_ICD_OBSERVERS_POOL_SIZE + * + * Increase default(2) by 1 to account for the AppTask registering + */ +#define CHIP_CONFIG_ICD_OBSERVERS_POOL_SIZE 3 diff --git a/examples/lit-icd-app/silabs/src/AppTask.cpp b/examples/lit-icd-app/silabs/src/AppTask.cpp index bb7bf1a77bc17e..0fb98266d2a81d 100644 --- a/examples/lit-icd-app/silabs/src/AppTask.cpp +++ b/examples/lit-icd-app/silabs/src/AppTask.cpp @@ -33,17 +33,18 @@ #endif // QR_CODE_ENABLED #endif // DISPLAY_ENABLED +#include <app-common/zap-generated/attributes/Accessors.h> +#include <app-common/zap-generated/ids/Clusters.h> #include <app/server/OnboardingCodesUtil.h> #include <app/server/Server.h> #include <app/util/attribute-storage.h> #include <assert.h> #include <lib/support/CodeUtils.h> #include <platform/CHIPDeviceLayer.h> +#include <platform/silabs/platformAbstraction/SilabsPlatform.h> #include <setup_payload/QRCodeSetupPayloadGenerator.h> #include <setup_payload/SetupPayload.h> -#include <platform/silabs/platformAbstraction/SilabsPlatform.h> - /********************************************************** * Defines and Constants *********************************************************/ @@ -103,6 +104,8 @@ void AppTask::AppTaskMain(void * pvParameter) appError(err); } + chip::Server::GetInstance().GetICDManager().RegisterObserver(&sAppTask); + #if !(defined(CHIP_CONFIG_ENABLE_ICD_SERVER) && CHIP_CONFIG_ENABLE_ICD_SERVER) sAppTask.StartStatusLEDTimer(); #endif @@ -122,7 +125,28 @@ void AppTask::AppTaskMain(void * pvParameter) void AppTask::ApplicationEventHandler(AppEvent * aEvent) { VerifyOrReturn(aEvent->Type == AppEvent::kEventType_Button); - // TODO - trigger some application event + VerifyOrReturn(aEvent->ButtonEvent.Action == static_cast<uint8_t>(SilabsPlatform::ButtonAction::ButtonPressed)); + + // Simple Application logic that toggles the BoleanState StateValue attribute. + // DO NOT COPY for product logic. LIT ICD app is a test app with very simple application logic to enable testing. + // The goal of the app is just to enable testing of LIT ICD features without impacting product sample apps. + PlatformMgr().ScheduleWork([](intptr_t) { + bool state = true; + + Protocols::InteractionModel::Status status = chip::app::Clusters::BooleanState::Attributes::StateValue::Get(1, &state); + if (status != Protocols::InteractionModel::Status::Success) + { + // Failed to read StateValue. Default to true (open state) + state = true; + ChipLogError(NotSpecified, "ERR: reading boolean status value %x", to_underlying(status)); + } + + status = chip::app::Clusters::BooleanState::Attributes::StateValue::Set(1, !state); + if (status != Protocols::InteractionModel::Status::Success) + { + ChipLogError(NotSpecified, "ERR: updating boolean status value %x", to_underlying(status)); + } + }); } void AppTask::ButtonEventHandler(uint8_t button, uint8_t btnAction) @@ -142,3 +166,15 @@ void AppTask::ButtonEventHandler(uint8_t button, uint8_t btnAction) sAppTask.PostEvent(&button_event); } } + +// DO NOT COPY for product logic. LIT ICD app is a test app with very simple application logic to enable testing. +void AppTask::OnEnterActiveMode() +{ + sAppTask.GetLCD().WriteDemoUI(true); +} + +// DO NOT COPY for product logic. LIT ICD app is a test app with very simple application logic to enable testing. +void AppTask::OnEnterIdleMode() +{ + sAppTask.GetLCD().WriteDemoUI(false); +} From 0bb34b0252d1a69aee63c22f52bd4e505fa7261f Mon Sep 17 00:00:00 2001 From: Maksymilian Knust <m.knust@samsung.com> Date: Tue, 23 Apr 2024 22:13:27 +0200 Subject: [PATCH 009/124] Replaced nlunit-test with pw_unit_test in src/lib/dnssd/tests/ (#33045) * Replaced nlunit-test with pw_unit_test in src/lib/dnssd/tests/ * Update openiotsdk test components --- src/lib/dnssd/tests/BUILD.gn | 9 +- .../dnssd/tests/TestActiveResolveAttempts.cpp | 242 +++++------ .../dnssd/tests/TestIncrementalResolve.cpp | 289 ++++++------- src/lib/dnssd/tests/TestServiceNaming.cpp | 210 ++++----- src/lib/dnssd/tests/TestTxtFields.cpp | 409 ++++++++++-------- .../openiotsdk/unit-tests/test_components.txt | 1 + .../unit-tests/test_components_nl.txt | 1 - 7 files changed, 545 insertions(+), 616 deletions(-) diff --git a/src/lib/dnssd/tests/BUILD.gn b/src/lib/dnssd/tests/BUILD.gn index e64d0c756a33c2..cdcb4bab0e27a1 100644 --- a/src/lib/dnssd/tests/BUILD.gn +++ b/src/lib/dnssd/tests/BUILD.gn @@ -14,11 +14,10 @@ import("//build_overrides/build.gni") import("//build_overrides/chip.gni") -import("//build_overrides/nlunit_test.gni") import("${chip_root}/build/chip/chip_test_suite.gni") -chip_test_suite_using_nltest("tests") { +chip_test_suite("tests") { output_name = "libMdnsTests" test_sources = [ @@ -26,11 +25,7 @@ chip_test_suite_using_nltest("tests") { "TestTxtFields.cpp", ] - public_deps = [ - "${chip_root}/src/lib/dnssd", - "${chip_root}/src/lib/support:testing_nlunit", - "${nlunit_test_root}:nlunit-test", - ] + public_deps = [ "${chip_root}/src/lib/dnssd" ] if (chip_mdns == "minimal") { test_sources += [ diff --git a/src/lib/dnssd/tests/TestActiveResolveAttempts.cpp b/src/lib/dnssd/tests/TestActiveResolveAttempts.cpp index f4ef2f202c4def..58c1cf86dab511 100644 --- a/src/lib/dnssd/tests/TestActiveResolveAttempts.cpp +++ b/src/lib/dnssd/tests/TestActiveResolveAttempts.cpp @@ -16,9 +16,7 @@ */ #include <lib/dnssd/ActiveResolveAttempts.h> -#include <lib/support/UnitTestRegistration.h> - -#include <nlunit-test.h> +#include <gtest/gtest.h> namespace { @@ -43,7 +41,7 @@ Optional<ActiveResolveAttempts::ScheduledAttempt> ScheduledBrowse(const Dnssd::D return Optional<ActiveResolveAttempts::ScheduledAttempt>::Value(ActiveResolveAttempts::ScheduledAttempt(filter, type, first)); } -void TestSinglePeerAddRemove(nlTestSuite * inSuite, void * inContext) +TEST(TestActiveResolveAttempts, TestSinglePeerAddRemove) { System::Clock::Internal::MockClock mockClock; mdns::Minimal::ActiveResolveAttempts attempts(&mockClock); @@ -51,42 +49,42 @@ void TestSinglePeerAddRemove(nlTestSuite * inSuite, void * inContext) mockClock.AdvanceMonotonic(1234_ms32); // Starting up, no scheduled peers are expected - NL_TEST_ASSERT(inSuite, !attempts.GetTimeUntilNextExpectedResponse().HasValue()); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // Adding a single peer should result in it being scheduled attempts.MarkPending(MakePeerId(1)); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(0_ms32)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(1, true)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, true)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // one Next schedule is called, expect to have a delay of 1000 ms - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(1000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); mockClock.AdvanceMonotonic(500_ms32); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(500_ms32)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(500_ms32)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // past due date: timeout should be 0 mockClock.AdvanceMonotonic(800_ms32); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(0_ms32)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(1, false)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, false)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // one Next schedule is called, expect to have a delay of 2000 ms // sincve the timeout doubles every time - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(2000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(2000_ms32)); mockClock.AdvanceMonotonic(100_ms32); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(1900_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1900_ms32)); // once complete, nothing to schedule attempts.Complete(MakePeerId(1)); - NL_TEST_ASSERT(inSuite, !attempts.GetTimeUntilNextExpectedResponse().HasValue()); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); } -void TestSingleBrowseAddRemove(nlTestSuite * inSuite, void * inContext) +TEST(TestActiveResolveAttempts, TestSingleBrowseAddRemove) { System::Clock::Internal::MockClock mockClock; mdns::Minimal::ActiveResolveAttempts attempts(&mockClock); @@ -96,43 +94,43 @@ void TestSingleBrowseAddRemove(nlTestSuite * inSuite, void * inContext) mockClock.AdvanceMonotonic(1234_ms32); // Starting up, no scheduled peers are expected - NL_TEST_ASSERT(inSuite, !attempts.GetTimeUntilNextExpectedResponse().HasValue()); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // Adding a single attempt should result in it being scheduled attempts.MarkPending(filter, type); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(0_ms32)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledBrowse(filter, type, true)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.NextScheduled(), ScheduledBrowse(filter, type, true)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // one Next schedule is called, expect to have a delay of 1000 ms - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(1000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); mockClock.AdvanceMonotonic(500_ms32); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(500_ms32)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(500_ms32)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // past due date: timeout should be 0 mockClock.AdvanceMonotonic(800_ms32); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(0_ms32)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledBrowse(filter, type, false)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.NextScheduled(), ScheduledBrowse(filter, type, false)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // one Next schedule is called, expect to have a delay of 2000 ms // sincve the timeout doubles every time - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(2000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(2000_ms32)); mockClock.AdvanceMonotonic(100_ms32); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(1900_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1900_ms32)); // once complete, nothing to schedule Dnssd::DiscoveredNodeData data; data.nodeData.longDiscriminator = 1234; attempts.CompleteCommissionable(data); - NL_TEST_ASSERT(inSuite, !attempts.GetTimeUntilNextExpectedResponse().HasValue()); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); } -void TestRescheduleSamePeerId(nlTestSuite * inSuite, void * inContext) +TEST(TestActiveResolveAttempts, TestRescheduleSamePeerId) { System::Clock::Internal::MockClock mockClock; mdns::Minimal::ActiveResolveAttempts attempts(&mockClock); @@ -141,30 +139,30 @@ void TestRescheduleSamePeerId(nlTestSuite * inSuite, void * inContext) attempts.MarkPending(MakePeerId(1)); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(0_ms32)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(1, true)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, true)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // one Next schedule is called, expect to have a delay of 1000 ms - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(1000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); // 2nd try goes to 2 seconds (once at least 1 second passes) mockClock.AdvanceMonotonic(1234_ms32); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(0_ms32)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(1, false)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(2000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, false)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(2000_ms32)); // reschedule starts fresh attempts.MarkPending(MakePeerId(1)); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(0_ms32)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(1, true)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(1000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, true)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); } -void TestRescheduleSameFilter(nlTestSuite * inSuite, void * inContext) +TEST(TestActiveResolveAttempts, TestRescheduleSameFilter) { System::Clock::Internal::MockClock mockClock; mdns::Minimal::ActiveResolveAttempts attempts(&mockClock); @@ -175,30 +173,30 @@ void TestRescheduleSameFilter(nlTestSuite * inSuite, void * inContext) attempts.MarkPending(filter, type); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(0_ms32)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledBrowse(filter, type, true)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.NextScheduled(), ScheduledBrowse(filter, type, true)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // one Next schedule is called, expect to have a delay of 1000 ms - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(1000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); // 2nd try goes to 2 seconds (once at least 1 second passes) mockClock.AdvanceMonotonic(1234_ms32); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(0_ms32)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledBrowse(filter, type, false)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(2000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.NextScheduled(), ScheduledBrowse(filter, type, false)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(2000_ms32)); // reschedule starts fresh attempts.MarkPending(filter, type); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(0_ms32)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledBrowse(filter, type, true)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(1000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.NextScheduled(), ScheduledBrowse(filter, type, true)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); } -void TestLRU(nlTestSuite * inSuite, void * inContext) +TEST(TestActiveResolveAttempts, TestLRU) { // validates that the LRU logic is working System::Clock::Internal::MockClock mockClock; @@ -208,16 +206,16 @@ void TestLRU(nlTestSuite * inSuite, void * inContext) // add a single very old peer attempts.MarkPending(MakePeerId(9999)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(9999, true)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(9999, true)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); mockClock.AdvanceMonotonic(1000_ms32); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(9999, false)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(9999, false)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); mockClock.AdvanceMonotonic(2000_ms32); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(9999, false)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(9999, false)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // at this point, peer 9999 has a delay of 4 seconds. Fill up the rest of the table @@ -226,15 +224,14 @@ void TestLRU(nlTestSuite * inSuite, void * inContext) attempts.MarkPending(MakePeerId(i)); mockClock.AdvanceMonotonic(1_ms32); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(i, true)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(i, true)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); } // +2 because: 1 element skipped, one element is the "current" that has a delay of 1000ms - NL_TEST_ASSERT(inSuite, - attempts.GetTimeUntilNextExpectedResponse() == - Optional<System::Clock::Timeout>::Value( - System::Clock::Milliseconds32(1000 - mdns::Minimal::ActiveResolveAttempts::kRetryQueueSize + 2))); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), + Optional<System::Clock::Timeout>::Value( + System::Clock::Milliseconds32(1000 - mdns::Minimal::ActiveResolveAttempts::kRetryQueueSize + 2))); // add another element - this should overwrite peer 9999 attempts.MarkPending(MakePeerId(mdns::Minimal::ActiveResolveAttempts::kRetryQueueSize)); @@ -242,11 +239,11 @@ void TestLRU(nlTestSuite * inSuite, void * inContext) for (Optional<ActiveResolveAttempts::ScheduledAttempt> s = attempts.NextScheduled(); s.HasValue(); s = attempts.NextScheduled()) { - NL_TEST_ASSERT(inSuite, s.Value().ResolveData().peerId.GetNodeId() != 9999); + EXPECT_NE(s.Value().ResolveData().peerId.GetNodeId(), 9999u); } // Still have active pending items (queue is full) - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse().HasValue()); + EXPECT_TRUE(attempts.GetTimeUntilNextExpectedResponse().HasValue()); // expire all of them. Since we double timeout every expiry, we expect a // few iteratios to be able to expire the entire queue @@ -266,14 +263,14 @@ void TestLRU(nlTestSuite * inSuite, void * inContext) Optional<ActiveResolveAttempts::ScheduledAttempt> s = attempts.NextScheduled(); while (s.HasValue()) { - NL_TEST_ASSERT(inSuite, s.Value().ResolveData().peerId.GetNodeId() != 9999); + EXPECT_NE(s.Value().ResolveData().peerId.GetNodeId(), 9999u); s = attempts.NextScheduled(); } } - NL_TEST_ASSERT(inSuite, i < kMaxIterations); + EXPECT_LT(i, kMaxIterations); } -void TestNextPeerOrdering(nlTestSuite * inSuite, void * inContext) +TEST(TestActiveResolveAttempts, TestNextPeerOrdering) { System::Clock::Internal::MockClock mockClock; mdns::Minimal::ActiveResolveAttempts attempts(&mockClock); @@ -283,52 +280,52 @@ void TestNextPeerOrdering(nlTestSuite * inSuite, void * inContext) // add a single peer that will be resolved quickly attempts.MarkPending(MakePeerId(1)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(1, true)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(1000_ms32)); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, true)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); mockClock.AdvanceMonotonic(20_ms32); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(980_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(980_ms32)); // expect peerid to be resolve within 1 second from now attempts.MarkPending(MakePeerId(2)); // mock that we are querying 2 as well - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(2, true)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(2, true)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); mockClock.AdvanceMonotonic(80_ms32); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(900_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(900_ms32)); // Peer 1 is done, now peer2 should be pending (in 980ms) attempts.Complete(MakePeerId(1)); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(920_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(920_ms32)); mockClock.AdvanceMonotonic(20_ms32); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(900_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(900_ms32)); // Once peer 3 is added, queue should be // - 900 ms until peer id 2 is pending // - 1000 ms until peer id 3 is pending attempts.MarkPending(MakePeerId(3)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(3, true)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(900_ms32)); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(3, true)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(900_ms32)); // After the clock advance // - 400 ms until peer id 2 is pending // - 500 ms until peer id 3 is pending mockClock.AdvanceMonotonic(500_ms32); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(400_ms32)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(400_ms32)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // advancing the clock 'too long' will return both other entries, in reverse order due to how // the internal cache is built mockClock.AdvanceMonotonic(500_ms32); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(3, false)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(2, false)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(3, false)); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(2, false)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); } -void TestCombination(nlTestSuite * inSuite, void * inContext) +TEST(TestActiveResolveAttempts, TestCombination) { System::Clock::Internal::MockClock mockClock; mdns::Minimal::ActiveResolveAttempts attempts(&mockClock); @@ -342,34 +339,34 @@ void TestCombination(nlTestSuite * inSuite, void * inContext) mockClock.AdvanceMonotonic(20_ms32); attempts.MarkPending(filter, type); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(1, true)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledBrowse(filter, type, true)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, true)); + EXPECT_EQ(attempts.NextScheduled(), ScheduledBrowse(filter, type, true)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // At this point, both should reset, so we're back to 1000ms - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(1000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); // We used 20 ms, so the next time for the peer and resolve should be 980 ms mockClock.AdvanceMonotonic(20_ms32); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(980_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(980_ms32)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // Add a second Peer mockClock.AdvanceMonotonic(20_ms32); attempts.MarkPending(MakePeerId(2)); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(2, true)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(2, true)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // Advance to the retry time of peer 1 and the resolve mockClock.AdvanceMonotonic(960_ms32); - NL_TEST_ASSERT(inSuite, attempts.GetTimeUntilNextExpectedResponse() == Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledPeer(1, false)); - NL_TEST_ASSERT(inSuite, attempts.NextScheduled() == ScheduledBrowse(filter, type, false)); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, false)); + EXPECT_EQ(attempts.NextScheduled(), ScheduledBrowse(filter, type, false)); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); // Complete all, we should see no more scheduled. attempts.Complete(MakePeerId(2)); @@ -378,28 +375,7 @@ void TestCombination(nlTestSuite * inSuite, void * inContext) data.nodeData.longDiscriminator = 1234; attempts.CompleteCommissionable(data); - NL_TEST_ASSERT(inSuite, !attempts.GetTimeUntilNextExpectedResponse().HasValue()); - NL_TEST_ASSERT(inSuite, !attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().HasValue()); } - -const nlTest sTests[] = { - NL_TEST_DEF("TestSinglePeerAddRemove", TestSinglePeerAddRemove), // - NL_TEST_DEF("TestSingleBrowseAddRemove", TestSingleBrowseAddRemove), // - NL_TEST_DEF("TestRescheduleSamePeerId", TestRescheduleSamePeerId), // - NL_TEST_DEF("TestRescheduleSameFilter", TestRescheduleSameFilter), // - NL_TEST_DEF("TestLRU", TestLRU), // - NL_TEST_DEF("TestNextPeerOrdering", TestNextPeerOrdering), // - NL_TEST_DEF("TestCombination", TestCombination), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestActiveResolveAttempts() -{ - nlTestSuite theSuite = { "ActiveResolveAttempts", sTests, nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestActiveResolveAttempts) diff --git a/src/lib/dnssd/tests/TestIncrementalResolve.cpp b/src/lib/dnssd/tests/TestIncrementalResolve.cpp index 03b585c4ce14c3..646e4abfe38303 100644 --- a/src/lib/dnssd/tests/TestIncrementalResolve.cpp +++ b/src/lib/dnssd/tests/TestIncrementalResolve.cpp @@ -27,9 +27,8 @@ #include <lib/dnssd/minimal_mdns/records/Srv.h> #include <lib/dnssd/minimal_mdns/records/Txt.h> #include <lib/support/ScopedBuffer.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> using namespace chip; using namespace chip::Dnssd; @@ -51,7 +50,7 @@ const auto kTestHostName = testing::TestQName<2>({ "abcd", "local" }); const auto kIrrelevantHostName = testing::TestQName<2>({ "different", "local" }); -void PreloadSrvRecord(nlTestSuite * inSuite, SrvRecord & record) +void PreloadSrvRecord(SrvRecord & record) { uint8_t headerBuffer[HeaderRef::kSizeBytes] = {}; HeaderRef dummyHeader(headerBuffer); @@ -62,16 +61,15 @@ void PreloadSrvRecord(nlTestSuite * inSuite, SrvRecord & record) chip::Encoding::BigEndian::BufferWriter output(dataBuffer, sizeof(dataBuffer)); RecordWriter writer(&output); - NL_TEST_ASSERT(inSuite, - SrvResourceRecord(kTestOperationalName.Full(), kTestHostName.Full(), 0x1234 /* port */) - .Append(dummyHeader, ResourceType::kAnswer, writer)); + EXPECT_TRUE(SrvResourceRecord(kTestOperationalName.Full(), kTestHostName.Full(), 0x1234 /* port */) + .Append(dummyHeader, ResourceType::kAnswer, writer)); ResourceData resource; BytesRange packet(dataBuffer, dataBuffer + sizeof(dataBuffer)); const uint8_t * _ptr = dataBuffer; - NL_TEST_ASSERT(inSuite, resource.Parse(packet, &_ptr)); - NL_TEST_ASSERT(inSuite, record.Parse(resource.GetData(), packet)); + EXPECT_TRUE(resource.Parse(packet, &_ptr)); + EXPECT_TRUE(record.Parse(resource.GetData(), packet)); } /// Convenience method to have a serialized QName. @@ -84,7 +82,7 @@ static SerializedQNameIterator AsSerializedQName(const uint8_t (&v)[N]) return SerializedQNameIterator(BytesRange(v, v + N - 1), v); } -void CallOnRecord(nlTestSuite * inSuite, IncrementalResolver & resolver, const ResourceRecord & record) +void CallOnRecord(IncrementalResolver & resolver, const ResourceRecord & record) { uint8_t headerBuffer[HeaderRef::kSizeBytes] = {}; HeaderRef dummyHeader(headerBuffer); @@ -93,39 +91,39 @@ void CallOnRecord(nlTestSuite * inSuite, IncrementalResolver & resolver, const R chip::Encoding::BigEndian::BufferWriter output(dataBuffer, sizeof(dataBuffer)); RecordWriter writer(&output); - NL_TEST_ASSERT(inSuite, record.Append(dummyHeader, ResourceType::kAnswer, writer)); - NL_TEST_ASSERT(inSuite, writer.Fit()); + EXPECT_TRUE(record.Append(dummyHeader, ResourceType::kAnswer, writer)); + EXPECT_TRUE(writer.Fit()); ResourceData resource; BytesRange packet(dataBuffer, dataBuffer + sizeof(dataBuffer)); const uint8_t * _ptr = dataBuffer; - NL_TEST_ASSERT(inSuite, resource.Parse(packet, &_ptr)); - NL_TEST_ASSERT(inSuite, resolver.OnRecord(chip::Inet::InterfaceId::Null(), resource, packet) == CHIP_NO_ERROR); + EXPECT_TRUE(resource.Parse(packet, &_ptr)); + EXPECT_EQ(resolver.OnRecord(chip::Inet::InterfaceId::Null(), resource, packet), CHIP_NO_ERROR); } -void TestStoredServerName(nlTestSuite * inSuite, void * inContext) +TEST(TestIncrementalResolve, TestStoredServerName) { StoredServerName name; // name should start of as cleared - NL_TEST_ASSERT(inSuite, !name.Get().Next()); + EXPECT_FALSE(name.Get().Next()); // Data should be storable in server name - NL_TEST_ASSERT(inSuite, name.Set(kTestOperationalName.Serialized()) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, name.Get() == kTestOperationalName.Serialized()); - NL_TEST_ASSERT(inSuite, name.Get() != kTestCommissionerNode.Serialized()); - NL_TEST_ASSERT(inSuite, name.Get() != kTestCommissionableNode.Serialized()); + EXPECT_EQ(name.Set(kTestOperationalName.Serialized()), CHIP_NO_ERROR); + EXPECT_EQ(name.Get(), kTestOperationalName.Serialized()); + EXPECT_NE(name.Get(), kTestCommissionerNode.Serialized()); + EXPECT_NE(name.Get(), kTestCommissionableNode.Serialized()); - NL_TEST_ASSERT(inSuite, name.Set(kTestCommissionerNode.Serialized()) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, name.Get() != kTestOperationalName.Serialized()); - NL_TEST_ASSERT(inSuite, name.Get() == kTestCommissionerNode.Serialized()); - NL_TEST_ASSERT(inSuite, name.Get() != kTestCommissionableNode.Serialized()); + EXPECT_EQ(name.Set(kTestCommissionerNode.Serialized()), CHIP_NO_ERROR); + EXPECT_NE(name.Get(), kTestOperationalName.Serialized()); + EXPECT_EQ(name.Get(), kTestCommissionerNode.Serialized()); + EXPECT_NE(name.Get(), kTestCommissionableNode.Serialized()); - NL_TEST_ASSERT(inSuite, name.Set(kTestCommissionableNode.Serialized()) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, name.Get() != kTestOperationalName.Serialized()); - NL_TEST_ASSERT(inSuite, name.Get() != kTestCommissionerNode.Serialized()); - NL_TEST_ASSERT(inSuite, name.Get() == kTestCommissionableNode.Serialized()); + EXPECT_EQ(name.Set(kTestCommissionableNode.Serialized()), CHIP_NO_ERROR); + EXPECT_NE(name.Get(), kTestOperationalName.Serialized()); + EXPECT_NE(name.Get(), kTestCommissionerNode.Serialized()); + EXPECT_EQ(name.Get(), kTestCommissionableNode.Serialized()); { // setting to a too long value should reset it @@ -145,135 +143,130 @@ void TestStoredServerName(nlTestSuite * inSuite, void * inContext) if (writer.WritePos() < 64) { // this is how much data can be fit by the copy - NL_TEST_ASSERT_LOOP(inSuite, idx, name.Set(AsSerializedQName(largeBuffer)) == CHIP_NO_ERROR); - NL_TEST_ASSERT_LOOP(inSuite, idx, name.Get() == AsSerializedQName(largeBuffer)); - NL_TEST_ASSERT_LOOP(inSuite, idx, name.Get() != kTestOperationalName.Serialized()); + EXPECT_EQ(name.Set(AsSerializedQName(largeBuffer)), CHIP_NO_ERROR) << "idx = " << idx; + EXPECT_EQ(name.Get(), AsSerializedQName(largeBuffer)) << "idx = " << idx; + EXPECT_NE(name.Get(), kTestOperationalName.Serialized()) << "idx = " << idx; } else { - NL_TEST_ASSERT_LOOP(inSuite, idx, name.Set(AsSerializedQName(largeBuffer)) == CHIP_ERROR_NO_MEMORY); - NL_TEST_ASSERT_LOOP(inSuite, idx, !name.Get().Next()); + EXPECT_EQ(name.Set(AsSerializedQName(largeBuffer)), CHIP_ERROR_NO_MEMORY) << "idx = " << idx; + EXPECT_FALSE(name.Get().Next()) << "idx = " << idx; } } } } -void TestCreation(nlTestSuite * inSuite, void * inContext) +TEST(TestIncrementalResolve, TestCreation) { IncrementalResolver resolver; - NL_TEST_ASSERT(inSuite, !resolver.IsActive()); - NL_TEST_ASSERT(inSuite, !resolver.IsActiveBrowseParse()); - NL_TEST_ASSERT(inSuite, !resolver.IsActiveOperationalParse()); - NL_TEST_ASSERT( - inSuite, + EXPECT_FALSE(resolver.IsActive()); + EXPECT_FALSE(resolver.IsActiveBrowseParse()); + EXPECT_FALSE(resolver.IsActiveOperationalParse()); + EXPECT_TRUE( resolver.GetMissingRequiredInformation().HasOnly(IncrementalResolver::RequiredInformationBitFlags::kSrvInitialization)); } -void TestInactiveResetOnInitError(nlTestSuite * inSuite, void * inContext) +TEST(TestIncrementalResolve, TestInactiveResetOnInitError) { IncrementalResolver resolver; - NL_TEST_ASSERT(inSuite, !resolver.IsActive()); + EXPECT_FALSE(resolver.IsActive()); SrvRecord srvRecord; - PreloadSrvRecord(inSuite, srvRecord); + PreloadSrvRecord(srvRecord); // test host name is not a 'matter' name - NL_TEST_ASSERT(inSuite, resolver.InitializeParsing(kTestHostName.Serialized(), srvRecord) != CHIP_NO_ERROR); + EXPECT_NE(resolver.InitializeParsing(kTestHostName.Serialized(), srvRecord), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !resolver.IsActive()); - NL_TEST_ASSERT(inSuite, !resolver.IsActiveBrowseParse()); - NL_TEST_ASSERT(inSuite, !resolver.IsActiveOperationalParse()); + EXPECT_FALSE(resolver.IsActive()); + EXPECT_FALSE(resolver.IsActiveBrowseParse()); + EXPECT_FALSE(resolver.IsActiveOperationalParse()); } -void TestStartOperational(nlTestSuite * inSuite, void * inContext) +TEST(TestIncrementalResolve, TestStartOperational) { IncrementalResolver resolver; - NL_TEST_ASSERT(inSuite, !resolver.IsActive()); + EXPECT_FALSE(resolver.IsActive()); SrvRecord srvRecord; - PreloadSrvRecord(inSuite, srvRecord); + PreloadSrvRecord(srvRecord); - NL_TEST_ASSERT(inSuite, resolver.InitializeParsing(kTestOperationalName.Serialized(), srvRecord) == CHIP_NO_ERROR); + EXPECT_EQ(resolver.InitializeParsing(kTestOperationalName.Serialized(), srvRecord), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, resolver.IsActive()); - NL_TEST_ASSERT(inSuite, !resolver.IsActiveBrowseParse()); - NL_TEST_ASSERT(inSuite, resolver.IsActiveOperationalParse()); - NL_TEST_ASSERT(inSuite, - resolver.GetMissingRequiredInformation().HasOnly(IncrementalResolver::RequiredInformationBitFlags::kIpAddress)); - NL_TEST_ASSERT(inSuite, resolver.GetTargetHostName() == kTestHostName.Serialized()); + EXPECT_TRUE(resolver.IsActive()); + EXPECT_FALSE(resolver.IsActiveBrowseParse()); + EXPECT_TRUE(resolver.IsActiveOperationalParse()); + EXPECT_TRUE(resolver.GetMissingRequiredInformation().HasOnly(IncrementalResolver::RequiredInformationBitFlags::kIpAddress)); + EXPECT_EQ(resolver.GetTargetHostName(), kTestHostName.Serialized()); } -void TestStartCommissionable(nlTestSuite * inSuite, void * inContext) +TEST(TestIncrementalResolve, TestStartCommissionable) { IncrementalResolver resolver; - NL_TEST_ASSERT(inSuite, !resolver.IsActive()); + EXPECT_FALSE(resolver.IsActive()); SrvRecord srvRecord; - PreloadSrvRecord(inSuite, srvRecord); + PreloadSrvRecord(srvRecord); - NL_TEST_ASSERT(inSuite, resolver.InitializeParsing(kTestCommissionableNode.Serialized(), srvRecord) == CHIP_NO_ERROR); + EXPECT_EQ(resolver.InitializeParsing(kTestCommissionableNode.Serialized(), srvRecord), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, resolver.IsActive()); - NL_TEST_ASSERT(inSuite, resolver.IsActiveBrowseParse()); - NL_TEST_ASSERT(inSuite, !resolver.IsActiveOperationalParse()); - NL_TEST_ASSERT(inSuite, - resolver.GetMissingRequiredInformation().HasOnly(IncrementalResolver::RequiredInformationBitFlags::kIpAddress)); - NL_TEST_ASSERT(inSuite, resolver.GetTargetHostName() == kTestHostName.Serialized()); + EXPECT_TRUE(resolver.IsActive()); + EXPECT_TRUE(resolver.IsActiveBrowseParse()); + EXPECT_FALSE(resolver.IsActiveOperationalParse()); + EXPECT_TRUE(resolver.GetMissingRequiredInformation().HasOnly(IncrementalResolver::RequiredInformationBitFlags::kIpAddress)); + EXPECT_EQ(resolver.GetTargetHostName(), kTestHostName.Serialized()); } -void TestStartCommissioner(nlTestSuite * inSuite, void * inContext) +TEST(TestIncrementalResolve, TestStartCommissioner) { IncrementalResolver resolver; - NL_TEST_ASSERT(inSuite, !resolver.IsActive()); + EXPECT_FALSE(resolver.IsActive()); SrvRecord srvRecord; - PreloadSrvRecord(inSuite, srvRecord); + PreloadSrvRecord(srvRecord); - NL_TEST_ASSERT(inSuite, resolver.InitializeParsing(kTestCommissionerNode.Serialized(), srvRecord) == CHIP_NO_ERROR); + EXPECT_EQ(resolver.InitializeParsing(kTestCommissionerNode.Serialized(), srvRecord), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, resolver.IsActive()); - NL_TEST_ASSERT(inSuite, resolver.IsActiveBrowseParse()); - NL_TEST_ASSERT(inSuite, !resolver.IsActiveOperationalParse()); - NL_TEST_ASSERT(inSuite, - resolver.GetMissingRequiredInformation().HasOnly(IncrementalResolver::RequiredInformationBitFlags::kIpAddress)); - NL_TEST_ASSERT(inSuite, resolver.GetTargetHostName() == kTestHostName.Serialized()); + EXPECT_TRUE(resolver.IsActive()); + EXPECT_TRUE(resolver.IsActiveBrowseParse()); + EXPECT_FALSE(resolver.IsActiveOperationalParse()); + EXPECT_TRUE(resolver.GetMissingRequiredInformation().HasOnly(IncrementalResolver::RequiredInformationBitFlags::kIpAddress)); + EXPECT_EQ(resolver.GetTargetHostName(), kTestHostName.Serialized()); } -void TestParseOperational(nlTestSuite * inSuite, void * inContext) +TEST(TestIncrementalResolve, TestParseOperational) { IncrementalResolver resolver; - NL_TEST_ASSERT(inSuite, !resolver.IsActive()); + EXPECT_FALSE(resolver.IsActive()); SrvRecord srvRecord; - PreloadSrvRecord(inSuite, srvRecord); + PreloadSrvRecord(srvRecord); - NL_TEST_ASSERT(inSuite, resolver.InitializeParsing(kTestOperationalName.Serialized(), srvRecord) == CHIP_NO_ERROR); + EXPECT_EQ(resolver.InitializeParsing(kTestOperationalName.Serialized(), srvRecord), CHIP_NO_ERROR); // once initialized, parsing should be ready however no IP address is available - NL_TEST_ASSERT(inSuite, resolver.IsActiveOperationalParse()); - NL_TEST_ASSERT(inSuite, - resolver.GetMissingRequiredInformation().HasOnly(IncrementalResolver::RequiredInformationBitFlags::kIpAddress)); - NL_TEST_ASSERT(inSuite, resolver.GetTargetHostName() == kTestHostName.Serialized()); + EXPECT_TRUE(resolver.IsActiveOperationalParse()); + EXPECT_TRUE(resolver.GetMissingRequiredInformation().HasOnly(IncrementalResolver::RequiredInformationBitFlags::kIpAddress)); + EXPECT_EQ(resolver.GetTargetHostName(), kTestHostName.Serialized()); // Send an IP for an irrelevant host name { Inet::IPAddress addr; - NL_TEST_ASSERT(inSuite, Inet::IPAddress::FromString("fe80::aabb:ccdd:2233:4455", addr)); + EXPECT_TRUE(Inet::IPAddress::FromString("fe80::aabb:ccdd:2233:4455", addr)); - CallOnRecord(inSuite, resolver, IPResourceRecord(kIrrelevantHostName.Full(), addr)); + CallOnRecord(resolver, IPResourceRecord(kIrrelevantHostName.Full(), addr)); } // Send a useful IP address here { Inet::IPAddress addr; - NL_TEST_ASSERT(inSuite, Inet::IPAddress::FromString("fe80::abcd:ef11:2233:4455", addr)); - CallOnRecord(inSuite, resolver, IPResourceRecord(kTestHostName.Full(), addr)); + EXPECT_TRUE(Inet::IPAddress::FromString("fe80::abcd:ef11:2233:4455", addr)); + CallOnRecord(resolver, IPResourceRecord(kTestHostName.Full(), addr)); } // Send a TXT record for an irrelevant host name @@ -285,7 +278,7 @@ void TestParseOperational(nlTestSuite * inSuite, void * inContext) "T=1" // TCP supported }; - CallOnRecord(inSuite, resolver, TxtResourceRecord(kTestHostName.Full(), entries)); + CallOnRecord(resolver, TxtResourceRecord(kTestHostName.Full(), entries)); } // Adding actual text entries that are useful @@ -297,70 +290,68 @@ void TestParseOperational(nlTestSuite * inSuite, void * inContext) "SII=23" // session idle interval }; - CallOnRecord(inSuite, resolver, TxtResourceRecord(kTestOperationalName.Full(), entries)); + CallOnRecord(resolver, TxtResourceRecord(kTestOperationalName.Full(), entries)); } // Resolver should have all data - NL_TEST_ASSERT(inSuite, !resolver.GetMissingRequiredInformation().HasAny()); + EXPECT_FALSE(resolver.GetMissingRequiredInformation().HasAny()); // At this point taking value should work. Once taken, the resolver is reset. ResolvedNodeData nodeData; - NL_TEST_ASSERT(inSuite, resolver.Take(nodeData) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !resolver.IsActive()); + EXPECT_EQ(resolver.Take(nodeData), CHIP_NO_ERROR); + EXPECT_FALSE(resolver.IsActive()); // validate data as it was passed in - NL_TEST_ASSERT(inSuite, - nodeData.operationalData.peerId == - PeerId().SetCompressedFabricId(0x1234567898765432LL).SetNodeId(0xABCDEFEDCBAABCDELL)); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.numIPs == 1); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.port == 0x1234); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.supportsTcp); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.GetMrpRetryIntervalIdle().Value() == chip::System::Clock::Milliseconds32(23)); + EXPECT_EQ(nodeData.operationalData.peerId, + PeerId().SetCompressedFabricId(0x1234567898765432LL).SetNodeId(0xABCDEFEDCBAABCDELL)); + EXPECT_EQ(nodeData.resolutionData.numIPs, 1u); + EXPECT_EQ(nodeData.resolutionData.port, 0x1234); + EXPECT_FALSE(nodeData.resolutionData.supportsTcp); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalIdle().Value(), chip::System::Clock::Milliseconds32(23)); Inet::IPAddress addr; - NL_TEST_ASSERT(inSuite, Inet::IPAddress::FromString("fe80::abcd:ef11:2233:4455", addr)); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.ipAddress[0] == addr); + EXPECT_TRUE(Inet::IPAddress::FromString("fe80::abcd:ef11:2233:4455", addr)); + EXPECT_EQ(nodeData.resolutionData.ipAddress[0], addr); } -void TestParseCommissionable(nlTestSuite * inSuite, void * inContext) +TEST(TestIncrementalResolve, TestParseCommissionable) { IncrementalResolver resolver; - NL_TEST_ASSERT(inSuite, !resolver.IsActive()); + EXPECT_FALSE(resolver.IsActive()); SrvRecord srvRecord; - PreloadSrvRecord(inSuite, srvRecord); + PreloadSrvRecord(srvRecord); - NL_TEST_ASSERT(inSuite, resolver.InitializeParsing(kTestCommissionableNode.Serialized(), srvRecord) == CHIP_NO_ERROR); + EXPECT_EQ(resolver.InitializeParsing(kTestCommissionableNode.Serialized(), srvRecord), CHIP_NO_ERROR); // once initialized, parsing should be ready however no IP address is available - NL_TEST_ASSERT(inSuite, resolver.IsActiveBrowseParse()); - NL_TEST_ASSERT(inSuite, - resolver.GetMissingRequiredInformation().HasOnly(IncrementalResolver::RequiredInformationBitFlags::kIpAddress)); - NL_TEST_ASSERT(inSuite, resolver.GetTargetHostName() == kTestHostName.Serialized()); + EXPECT_TRUE(resolver.IsActiveBrowseParse()); + EXPECT_TRUE(resolver.GetMissingRequiredInformation().HasOnly(IncrementalResolver::RequiredInformationBitFlags::kIpAddress)); + EXPECT_EQ(resolver.GetTargetHostName(), kTestHostName.Serialized()); // Send an IP for an irrelevant host name { Inet::IPAddress addr; - NL_TEST_ASSERT(inSuite, Inet::IPAddress::FromString("fe80::aabb:ccdd:2233:4455", addr)); - CallOnRecord(inSuite, resolver, IPResourceRecord(kIrrelevantHostName.Full(), addr)); + EXPECT_TRUE(Inet::IPAddress::FromString("fe80::aabb:ccdd:2233:4455", addr)); + CallOnRecord(resolver, IPResourceRecord(kIrrelevantHostName.Full(), addr)); } // Send a useful IP address here { Inet::IPAddress addr; - NL_TEST_ASSERT(inSuite, Inet::IPAddress::FromString("fe80::abcd:ef11:2233:4455", addr)); - CallOnRecord(inSuite, resolver, IPResourceRecord(kTestHostName.Full(), addr)); + EXPECT_TRUE(Inet::IPAddress::FromString("fe80::abcd:ef11:2233:4455", addr)); + CallOnRecord(resolver, IPResourceRecord(kTestHostName.Full(), addr)); } // Send another IP address { Inet::IPAddress addr; - NL_TEST_ASSERT(inSuite, Inet::IPAddress::FromString("fe80::f0f1:f2f3:f4f5:1234", addr)); - CallOnRecord(inSuite, resolver, IPResourceRecord(kTestHostName.Full(), addr)); + EXPECT_TRUE(Inet::IPAddress::FromString("fe80::f0f1:f2f3:f4f5:1234", addr)); + CallOnRecord(resolver, IPResourceRecord(kTestHostName.Full(), addr)); } // Send a TXT record for an irrelevant host name @@ -372,7 +363,7 @@ void TestParseCommissionable(nlTestSuite * inSuite, void * inContext) "SII=123" // session idle interval }; - CallOnRecord(inSuite, resolver, TxtResourceRecord(kTestHostName.Full(), entries)); + CallOnRecord(resolver, TxtResourceRecord(kTestHostName.Full(), entries)); } // Adding actual text entries that are useful @@ -387,61 +378,35 @@ void TestParseCommissionable(nlTestSuite * inSuite, void * inContext) "DN=mytest" // Device name }; - CallOnRecord(inSuite, resolver, TxtResourceRecord(kTestCommissionableNode.Full(), entries)); + CallOnRecord(resolver, TxtResourceRecord(kTestCommissionableNode.Full(), entries)); } // Resolver should have all data - NL_TEST_ASSERT(inSuite, !resolver.GetMissingRequiredInformation().HasAny()); + EXPECT_FALSE(resolver.GetMissingRequiredInformation().HasAny()); // At this point taking value should work. Once taken, the resolver is reset. DiscoveredNodeData nodeData; - NL_TEST_ASSERT(inSuite, resolver.Take(nodeData) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !resolver.IsActive()); + EXPECT_EQ(resolver.Take(nodeData), CHIP_NO_ERROR); + EXPECT_FALSE(resolver.IsActive()); // validate data as it was passed in - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.numIPs == 2); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.port == 0x1234); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.supportsTcp); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); - NL_TEST_ASSERT(inSuite, - nodeData.resolutionData.GetMrpRetryIntervalActive().Value() == chip::System::Clock::Milliseconds32(321)); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_EQ(nodeData.resolutionData.numIPs, 2u); + EXPECT_EQ(nodeData.resolutionData.port, 0x1234); + EXPECT_FALSE(nodeData.resolutionData.supportsTcp); + EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalActive().Value(), chip::System::Clock::Milliseconds32(321)); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); Inet::IPAddress addr; - NL_TEST_ASSERT(inSuite, Inet::IPAddress::FromString("fe80::abcd:ef11:2233:4455", addr)); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.ipAddress[0] == addr); - NL_TEST_ASSERT(inSuite, Inet::IPAddress::FromString("fe80::f0f1:f2f3:f4f5:1234", addr)); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.ipAddress[1] == addr); + EXPECT_TRUE(Inet::IPAddress::FromString("fe80::abcd:ef11:2233:4455", addr)); + EXPECT_EQ(nodeData.resolutionData.ipAddress[0], addr); + EXPECT_TRUE(Inet::IPAddress::FromString("fe80::f0f1:f2f3:f4f5:1234", addr)); + EXPECT_EQ(nodeData.resolutionData.ipAddress[1], addr); // parsed txt data for discovered nodes - NL_TEST_ASSERT(inSuite, nodeData.nodeData.longDiscriminator == 22345); - NL_TEST_ASSERT(inSuite, nodeData.nodeData.vendorId == 321); - NL_TEST_ASSERT(inSuite, nodeData.nodeData.productId == 654); - NL_TEST_ASSERT(inSuite, strcmp(nodeData.nodeData.deviceName, "mytest") == 0); + EXPECT_EQ(nodeData.nodeData.longDiscriminator, 22345); + EXPECT_EQ(nodeData.nodeData.vendorId, 321); + EXPECT_EQ(nodeData.nodeData.productId, 654); + EXPECT_STREQ(nodeData.nodeData.deviceName, "mytest"); } - -const nlTest sTests[] = { - // Tests for helper class - NL_TEST_DEF("StoredServerName", TestStoredServerName), // - - // Actual resolver tests - NL_TEST_DEF("Creation", TestCreation), // - NL_TEST_DEF("InactiveResetOnInitError", TestInactiveResetOnInitError), // - NL_TEST_DEF("StartOperational", TestStartOperational), // - NL_TEST_DEF("StartCommissionable", TestStartCommissionable), // - NL_TEST_DEF("StartCommissioner", TestStartCommissioner), // - NL_TEST_DEF("ParseOperational", TestParseOperational), // - NL_TEST_DEF("ParseCommissionable", TestParseCommissionable), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestChipDnsSdIncrementalResolve() -{ - nlTestSuite theSuite = { "IncrementalResolve", &sTests[0], nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestChipDnsSdIncrementalResolve) diff --git a/src/lib/dnssd/tests/TestServiceNaming.cpp b/src/lib/dnssd/tests/TestServiceNaming.cpp index 646a51e39f4806..0fa26723dab779 100644 --- a/src/lib/dnssd/tests/TestServiceNaming.cpp +++ b/src/lib/dnssd/tests/TestServiceNaming.cpp @@ -20,84 +20,78 @@ #include <string.h> -#include <lib/support/UnitTestRegistration.h> - -#include <nlunit-test.h> +#include <gtest/gtest.h> using namespace chip; using namespace chip::Dnssd; namespace { -void TestMakeInstanceName(nlTestSuite * inSuite, void * inContext) +TEST(TestServiceNaming, TestMakeInstanceName) { char buffer[128]; - NL_TEST_ASSERT(inSuite, - MakeInstanceName(buffer, sizeof(buffer), PeerId().SetCompressedFabricId(0x1234).SetNodeId(0x5678)) == - CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "0000000000001234-0000000000005678") == 0); + EXPECT_EQ(MakeInstanceName(buffer, sizeof(buffer), PeerId().SetCompressedFabricId(0x1234).SetNodeId(0x5678)), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "0000000000001234-0000000000005678"); - NL_TEST_ASSERT(inSuite, - MakeInstanceName(buffer, sizeof(buffer), - PeerId().SetCompressedFabricId(0x1122334455667788ULL).SetNodeId(0x123456789abcdefULL)) == - CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "1122334455667788-0123456789ABCDEF") == 0); + EXPECT_EQ(MakeInstanceName(buffer, sizeof(buffer), + PeerId().SetCompressedFabricId(0x1122334455667788ULL).SetNodeId(0x123456789abcdefULL)), + CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "1122334455667788-0123456789ABCDEF"); // insufficient buffer size: // buffer needs at least space for hex encoding + separator + 0 terminator constexpr size_t kMinBufferSize = 2 * 16 + 1 + 1; for (size_t shortSize = 0; shortSize < kMinBufferSize; shortSize++) { - NL_TEST_ASSERT(inSuite, MakeInstanceName(buffer, shortSize, PeerId()) != CHIP_NO_ERROR); + EXPECT_NE(MakeInstanceName(buffer, shortSize, PeerId()), CHIP_NO_ERROR); } - NL_TEST_ASSERT(inSuite, MakeInstanceName(buffer, kMinBufferSize, PeerId()) == CHIP_NO_ERROR); + EXPECT_EQ(MakeInstanceName(buffer, kMinBufferSize, PeerId()), CHIP_NO_ERROR); } -void TestExtractIdFromInstanceName(nlTestSuite * inSuite, void * inContext) +TEST(TestServiceNaming, TestExtractIdFromInstanceName) { PeerId peerId; - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName(nullptr, nullptr) == CHIP_ERROR_INVALID_ARGUMENT); - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName("ACDEF1234567890-1234567890ABCDEF", nullptr) == CHIP_ERROR_INVALID_ARGUMENT); - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName(nullptr, &peerId) == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(ExtractIdFromInstanceName(nullptr, nullptr), CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(ExtractIdFromInstanceName("ACDEF1234567890-1234567890ABCDEF", nullptr), CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(ExtractIdFromInstanceName(nullptr, &peerId), CHIP_ERROR_INVALID_ARGUMENT); - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName("ABCDEF1234567890-1234567890ABCDEF", &peerId) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, peerId == PeerId().SetCompressedFabricId(0xABCDEF1234567890ULL).SetNodeId(0x1234567890ABCDEFULL)); + EXPECT_EQ(ExtractIdFromInstanceName("ABCDEF1234567890-1234567890ABCDEF", &peerId), CHIP_NO_ERROR); + EXPECT_EQ(peerId, PeerId().SetCompressedFabricId(0xABCDEF1234567890ULL).SetNodeId(0x1234567890ABCDEFULL)); // ending in period (partial name) is acceptable - NL_TEST_ASSERT(inSuite, - ExtractIdFromInstanceName("1122334455667788-AABBCCDDEEFF1122.some.suffix.here", &peerId) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, peerId == PeerId().SetCompressedFabricId(0x1122334455667788ULL).SetNodeId(0xaabbccddeeff1122ULL)); + EXPECT_EQ(ExtractIdFromInstanceName("1122334455667788-AABBCCDDEEFF1122.some.suffix.here", &peerId), CHIP_NO_ERROR); + EXPECT_EQ(peerId, PeerId().SetCompressedFabricId(0x1122334455667788ULL).SetNodeId(0xaabbccddeeff1122ULL)); // Invalid: non hex character - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName("1x22334455667788-AABBCCDDEEDD1122", &peerId) != CHIP_NO_ERROR); + EXPECT_NE(ExtractIdFromInstanceName("1x22334455667788-AABBCCDDEEDD1122", &peerId), CHIP_NO_ERROR); // Invalid: missing node id part (no - separator) - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName("1122334455667788x2233445566778899", &peerId) != CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName("1122334455667788x2233445566778899.12-33.4455", &peerId) != CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName("1122334455667788x2233445566778899.4455", &peerId) != CHIP_NO_ERROR); + EXPECT_NE(ExtractIdFromInstanceName("1122334455667788x2233445566778899", &peerId), CHIP_NO_ERROR); + EXPECT_NE(ExtractIdFromInstanceName("1122334455667788x2233445566778899.12-33.4455", &peerId), CHIP_NO_ERROR); + EXPECT_NE(ExtractIdFromInstanceName("1122334455667788x2233445566778899.4455", &peerId), CHIP_NO_ERROR); // Invalid: missing part - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName("-1234567890ABCDEF", &peerId) != CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName("1234567890ABCDEF-", &peerId) != CHIP_NO_ERROR); + EXPECT_NE(ExtractIdFromInstanceName("-1234567890ABCDEF", &peerId), CHIP_NO_ERROR); + EXPECT_NE(ExtractIdFromInstanceName("1234567890ABCDEF-", &peerId), CHIP_NO_ERROR); // Invalid: separator in wrong place - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName("112233445566778-8AABBCCDDEEFF1122", &peerId) != CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName("1122334455667788A-ABBCCDDEEFF1122", &peerId) != CHIP_NO_ERROR); + EXPECT_NE(ExtractIdFromInstanceName("112233445566778-8AABBCCDDEEFF1122", &peerId), CHIP_NO_ERROR); + EXPECT_NE(ExtractIdFromInstanceName("1122334455667788A-ABBCCDDEEFF1122", &peerId), CHIP_NO_ERROR); // Invalid: fabric part too short - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName("11223344556677-AABBCCDDEEFF1122", &peerId) != CHIP_NO_ERROR); + EXPECT_NE(ExtractIdFromInstanceName("11223344556677-AABBCCDDEEFF1122", &peerId), CHIP_NO_ERROR); // Invalid: fabric part too long - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName("112233445566778899-AABBCCDDEEFF1122", &peerId) != CHIP_NO_ERROR); + EXPECT_NE(ExtractIdFromInstanceName("112233445566778899-AABBCCDDEEFF1122", &peerId), CHIP_NO_ERROR); // Invalid: node part too short - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName("1122334455667788-AABBCCDDEEFF11", &peerId) != CHIP_NO_ERROR); + EXPECT_NE(ExtractIdFromInstanceName("1122334455667788-AABBCCDDEEFF11", &peerId), CHIP_NO_ERROR); // Invalid: node part too long - NL_TEST_ASSERT(inSuite, ExtractIdFromInstanceName("1122334455667788-AABBCCDDEEFF112233", &peerId) != CHIP_NO_ERROR); + EXPECT_NE(ExtractIdFromInstanceName("1122334455667788-AABBCCDDEEFF112233", &peerId), CHIP_NO_ERROR); } -void TestMakeServiceNameSubtype(nlTestSuite * inSuite, void * inContext) +TEST(TestServiceNaming, TestMakeServiceNameSubtype) { constexpr size_t kSize = 19; char buffer[kSize]; @@ -106,71 +100,71 @@ void TestMakeServiceNameSubtype(nlTestSuite * inSuite, void * inContext) // Long tests filter.type = DiscoveryFilterType::kLongDiscriminator; filter.code = 3; - NL_TEST_ASSERT(inSuite, MakeServiceSubtype(buffer, sizeof(buffer), filter) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_L3") == 0); + EXPECT_EQ(MakeServiceSubtype(buffer, sizeof(buffer), filter), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_L3"); filter.code = (1 << 12) - 1; - NL_TEST_ASSERT(inSuite, MakeServiceSubtype(buffer, sizeof(buffer), filter) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_L4095") == 0); + EXPECT_EQ(MakeServiceSubtype(buffer, sizeof(buffer), filter), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_L4095"); filter.code = 1 << 12; - NL_TEST_ASSERT(inSuite, MakeServiceSubtype(buffer, sizeof(buffer), filter) != CHIP_NO_ERROR); + EXPECT_NE(MakeServiceSubtype(buffer, sizeof(buffer), filter), CHIP_NO_ERROR); // Short tests filter.type = DiscoveryFilterType::kShortDiscriminator; filter.code = 3; - NL_TEST_ASSERT(inSuite, MakeServiceSubtype(buffer, sizeof(buffer), filter) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_S3") == 0); + EXPECT_EQ(MakeServiceSubtype(buffer, sizeof(buffer), filter), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_S3"); filter.code = (1 << 4) - 1; - NL_TEST_ASSERT(inSuite, MakeServiceSubtype(buffer, sizeof(buffer), filter) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_S15") == 0); + EXPECT_EQ(MakeServiceSubtype(buffer, sizeof(buffer), filter), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_S15"); filter.code = 1 << 4; - NL_TEST_ASSERT(inSuite, MakeServiceSubtype(buffer, sizeof(buffer), filter) != CHIP_NO_ERROR); + EXPECT_NE(MakeServiceSubtype(buffer, sizeof(buffer), filter), CHIP_NO_ERROR); // Vendor tests filter.type = DiscoveryFilterType::kVendorId; filter.code = 3; - NL_TEST_ASSERT(inSuite, MakeServiceSubtype(buffer, sizeof(buffer), filter) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_V3") == 0); + EXPECT_EQ(MakeServiceSubtype(buffer, sizeof(buffer), filter), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_V3"); filter.code = 0xFFFF; - NL_TEST_ASSERT(inSuite, MakeServiceSubtype(buffer, sizeof(buffer), filter) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_V65535") == 0); + EXPECT_EQ(MakeServiceSubtype(buffer, sizeof(buffer), filter), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_V65535"); filter.code = 1 << 16; - NL_TEST_ASSERT(inSuite, MakeServiceSubtype(buffer, sizeof(buffer), filter) != CHIP_NO_ERROR); + EXPECT_NE(MakeServiceSubtype(buffer, sizeof(buffer), filter), CHIP_NO_ERROR); // Device Type tests filter.type = DiscoveryFilterType::kDeviceType; filter.code = 3; - NL_TEST_ASSERT(inSuite, MakeServiceSubtype(buffer, sizeof(buffer), filter) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_T3") == 0); + EXPECT_EQ(MakeServiceSubtype(buffer, sizeof(buffer), filter), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_T3"); // TODO: Add tests for longer device types once spec issue #3226 is closed. // Commissioning mode tests filter.type = DiscoveryFilterType::kCommissioningMode; - NL_TEST_ASSERT(inSuite, MakeServiceSubtype(buffer, sizeof(buffer), filter) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_CM") == 0); + EXPECT_EQ(MakeServiceSubtype(buffer, sizeof(buffer), filter), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_CM"); // Compressed fabric ID tests. filter.type = DiscoveryFilterType::kCompressedFabricId; filter.code = 0xABCD12341111BBBB; - NL_TEST_ASSERT(inSuite, MakeServiceSubtype(buffer, sizeof(buffer), filter) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_IABCD12341111BBBB") == 0); + EXPECT_EQ(MakeServiceSubtype(buffer, sizeof(buffer), filter), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_IABCD12341111BBBB"); // None tests. filter.type = DiscoveryFilterType::kNone; - NL_TEST_ASSERT(inSuite, MakeServiceSubtype(buffer, sizeof(buffer), filter) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "") == 0); + EXPECT_EQ(MakeServiceSubtype(buffer, sizeof(buffer), filter), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, ""); // instance name - "1234567890123456._matterc" filter.type = DiscoveryFilterType::kInstanceName; filter.instanceName = (char *) "1234567890123456"; - NL_TEST_ASSERT(inSuite, MakeServiceSubtype(buffer, sizeof(buffer), filter) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "1234567890123456") == 0); + EXPECT_EQ(MakeServiceSubtype(buffer, sizeof(buffer), filter), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "1234567890123456"); } -void TestMakeServiceTypeName(nlTestSuite * inSuite, void * inContext) +TEST(TestServiceNaming, TestMakeServiceTypeName) { // TODO(cecille): These need to be changed to remove leading zeros constexpr size_t kSize = 128; @@ -180,110 +174,80 @@ void TestMakeServiceTypeName(nlTestSuite * inSuite, void * inContext) // Long tests filter.type = DiscoveryFilterType::kLongDiscriminator; filter.code = 3; - NL_TEST_ASSERT(inSuite, - MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_L3._sub._matterc") == 0); + EXPECT_EQ(MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_L3._sub._matterc"); filter.code = (1 << 12) - 1; - NL_TEST_ASSERT(inSuite, - MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_L4095._sub._matterc") == 0); + EXPECT_EQ(MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_L4095._sub._matterc"); filter.code = 1 << 12; - NL_TEST_ASSERT(inSuite, - MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode) != CHIP_NO_ERROR); + EXPECT_NE(MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode), CHIP_NO_ERROR); // Short tests filter.type = DiscoveryFilterType::kShortDiscriminator; filter.code = 3; - NL_TEST_ASSERT(inSuite, - MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_S3._sub._matterc") == 0); + EXPECT_EQ(MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_S3._sub._matterc"); filter.code = (1 << 4) - 1; - NL_TEST_ASSERT(inSuite, - MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_S15._sub._matterc") == 0); + EXPECT_EQ(MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_S15._sub._matterc"); filter.code = 1 << 4; - NL_TEST_ASSERT(inSuite, - MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode) != CHIP_NO_ERROR); + EXPECT_NE(MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode), CHIP_NO_ERROR); // Vendor tests filter.type = DiscoveryFilterType::kVendorId; filter.code = 3; - NL_TEST_ASSERT(inSuite, - MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_V3._sub._matterc") == 0); + EXPECT_EQ(MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_V3._sub._matterc"); filter.code = (1 << 16) - 1; - NL_TEST_ASSERT(inSuite, - MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_V65535._sub._matterc") == 0); + EXPECT_EQ(MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_V65535._sub._matterc"); filter.code = 1 << 16; - NL_TEST_ASSERT(inSuite, - MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode) != CHIP_NO_ERROR); + EXPECT_NE(MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode), CHIP_NO_ERROR); // Device Type tests filter.type = DiscoveryFilterType::kDeviceType; filter.code = 3; - NL_TEST_ASSERT(inSuite, - MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_T3._sub._matterc") == 0); + EXPECT_EQ(MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_T3._sub._matterc"); // Commissioning mode tests filter.type = DiscoveryFilterType::kCommissioningMode; - NL_TEST_ASSERT(inSuite, - MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_CM._sub._matterc") == 0); + EXPECT_EQ(MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_CM._sub._matterc"); // Compressed fabric ID tests filter.type = DiscoveryFilterType::kCompressedFabricId; filter.code = 0x1234ABCD0000AAAA; - NL_TEST_ASSERT(inSuite, MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kOperational) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_I1234ABCD0000AAAA._sub._matter") == 0); + EXPECT_EQ(MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kOperational), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_I1234ABCD0000AAAA._sub._matter"); // None tests filter.type = DiscoveryFilterType::kNone; - NL_TEST_ASSERT(inSuite, - MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_matterc") == 0); + EXPECT_EQ(MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionableNode), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_matterc"); filter.type = DiscoveryFilterType::kNone; - NL_TEST_ASSERT(inSuite, MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionerNode) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_matterd") == 0); + EXPECT_EQ(MakeServiceTypeName(buffer, sizeof(buffer), filter, DiscoveryType::kCommissionerNode), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_matterd"); // Test buffer just under the right size - "_matterc" = 8 + nullchar = 9 filter.type = DiscoveryFilterType::kNone; - NL_TEST_ASSERT(inSuite, MakeServiceTypeName(buffer, 8, filter, DiscoveryType::kCommissionableNode) == CHIP_ERROR_NO_MEMORY); + EXPECT_EQ(MakeServiceTypeName(buffer, 8, filter, DiscoveryType::kCommissionableNode), CHIP_ERROR_NO_MEMORY); // Test buffer exactly the right size - "_matterc" = 8 + nullchar = 9 filter.type = DiscoveryFilterType::kNone; - NL_TEST_ASSERT(inSuite, MakeServiceTypeName(buffer, 9, filter, DiscoveryType::kCommissionableNode) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_matterc") == 0); + EXPECT_EQ(MakeServiceTypeName(buffer, 9, filter, DiscoveryType::kCommissionableNode), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_matterc"); // Test buffer exactly the right size for subtype - "_CM._sub._matterc" = 17 + nullchar = 18 filter.type = DiscoveryFilterType::kCommissioningMode; - NL_TEST_ASSERT(inSuite, MakeServiceTypeName(buffer, 18, filter, DiscoveryType::kCommissionableNode) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(buffer, "_CM._sub._matterc") == 0); + EXPECT_EQ(MakeServiceTypeName(buffer, 18, filter, DiscoveryType::kCommissionableNode), CHIP_NO_ERROR); + EXPECT_STREQ(buffer, "_CM._sub._matterc"); } - -const nlTest sTests[] = { - NL_TEST_DEF("MakeInstanceName", TestMakeInstanceName), // - NL_TEST_DEF("ExtractIdFromInstandceName", TestExtractIdFromInstanceName), // - NL_TEST_DEF("TestMakeServiceNameSubtype", TestMakeServiceNameSubtype), // - NL_TEST_DEF("TestMakeCommisisonableNodeServiceTypeName", TestMakeServiceTypeName), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestCHIPServiceNaming() -{ - nlTestSuite theSuite = { "ServiceNaming", &sTests[0], nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestCHIPServiceNaming) diff --git a/src/lib/dnssd/tests/TestTxtFields.cpp b/src/lib/dnssd/tests/TestTxtFields.cpp index d6e7e6ea240670..d487c261346c05 100644 --- a/src/lib/dnssd/tests/TestTxtFields.cpp +++ b/src/lib/dnssd/tests/TestTxtFields.cpp @@ -23,9 +23,8 @@ #include <string.h> #include <lib/dnssd/Resolver.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> using namespace chip; using namespace chip::Dnssd; @@ -41,161 +40,161 @@ ByteSpan GetSpan(char * key) return ByteSpan(reinterpret_cast<uint8_t *>(key), len); } -void TestGetTxtFieldKey(nlTestSuite * inSuite, void * inContext) +TEST(TestTxtFields, TestGetTxtFieldKey) { char key[4]; strcpy(key, "D"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kLongDiscriminator); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kLongDiscriminator); strcpy(key, "VP"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kVendorProduct); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kVendorProduct); strcpy(key, "CM"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kCommissioningMode); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kCommissioningMode); strcpy(key, "DT"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kDeviceType); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kDeviceType); strcpy(key, "DN"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kDeviceName); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kDeviceName); strcpy(key, "RI"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kRotatingDeviceId); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kRotatingDeviceId); strcpy(key, "PI"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kPairingInstruction); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kPairingInstruction); strcpy(key, "PH"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kPairingHint); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kPairingHint); strcpy(key, "SII"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kSessionIdleInterval); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kSessionIdleInterval); strcpy(key, "SAI"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kSessionActiveInterval); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kSessionActiveInterval); strcpy(key, "SAT"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kSessionActiveThreshold); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kSessionActiveThreshold); strcpy(key, "T"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kTcpSupported); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kTcpSupported); strcpy(key, "ICD"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kLongIdleTimeICD); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kLongIdleTimeICD); strcpy(key, "XX"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kUnknown); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kUnknown); strcpy(key, "CP"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kCommissionerPasscode); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kCommissionerPasscode); } -void TestGetTxtFieldKeyCaseInsensitive(nlTestSuite * inSuite, void * inContext) +TEST(TestTxtFields, TestGetTxtFieldKeyCaseInsensitive) { char key[3]; strcpy(key, "d"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kLongDiscriminator); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kLongDiscriminator); strcpy(key, "vp"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kVendorProduct); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kVendorProduct); strcpy(key, "Vp"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kVendorProduct); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kVendorProduct); strcpy(key, "vP"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kVendorProduct); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kVendorProduct); strcpy(key, "Xx"); - NL_TEST_ASSERT(inSuite, GetTxtFieldKey(GetSpan(key)) == TxtFieldKey::kUnknown); + EXPECT_EQ(GetTxtFieldKey(GetSpan(key)), TxtFieldKey::kUnknown); } -void TestGetProduct(nlTestSuite * inSuite, void * inContext) +TEST(TestTxtFields, TestGetProduct) { // Product and vendor are given as part of the same key, on either side of a + sign. Product is after the + char vp[64]; strcpy(vp, "123+456"); - NL_TEST_ASSERT(inSuite, GetProduct(GetSpan(vp)) == 456); + EXPECT_EQ(GetProduct(GetSpan(vp)), 456); strcpy(vp, "123+"); - NL_TEST_ASSERT(inSuite, GetProduct(GetSpan(vp)) == 0); + EXPECT_EQ(GetProduct(GetSpan(vp)), 0); strcpy(vp, "+456"); - NL_TEST_ASSERT(inSuite, GetProduct(GetSpan(vp)) == 456); + EXPECT_EQ(GetProduct(GetSpan(vp)), 456); strcpy(vp, "123"); - NL_TEST_ASSERT(inSuite, GetProduct(GetSpan(vp)) == 0); + EXPECT_EQ(GetProduct(GetSpan(vp)), 0); // overflow a uint16 sprintf(vp, "123+%" PRIu32, static_cast<uint32_t>(std::numeric_limits<uint16_t>::max()) + 1); - NL_TEST_ASSERT(inSuite, GetProduct(GetSpan(vp)) == 0); + EXPECT_EQ(GetProduct(GetSpan(vp)), 0); } -void TestGetVendor(nlTestSuite * inSuite, void * inContext) +TEST(TestTxtFields, TestGetVendor) { // Product and vendor are given as part of the same key, on either side of a + sign. Vendor is first char vp[64]; strcpy(vp, "123+456"); - NL_TEST_ASSERT(inSuite, GetVendor(GetSpan(vp)) == 123); + EXPECT_EQ(GetVendor(GetSpan(vp)), 123); strcpy(vp, "123+"); - NL_TEST_ASSERT(inSuite, GetVendor(GetSpan(vp)) == 123); + EXPECT_EQ(GetVendor(GetSpan(vp)), 123); strcpy(vp, "+456"); - NL_TEST_ASSERT(inSuite, GetVendor(GetSpan(vp)) == 0); + EXPECT_EQ(GetVendor(GetSpan(vp)), 0); strcpy(vp, "123"); - NL_TEST_ASSERT(inSuite, GetVendor(GetSpan(vp)) == 123); + EXPECT_EQ(GetVendor(GetSpan(vp)), 123); // overflow a uint16 sprintf(vp, "%" PRIu32 "+456", static_cast<uint32_t>(std::numeric_limits<uint16_t>::max()) + 1); - NL_TEST_ASSERT(inSuite, GetVendor(GetSpan(vp)) == 0); + EXPECT_EQ(GetVendor(GetSpan(vp)), 0); } -void TestGetLongDiscriminator(nlTestSuite * inSuite, void * inContext) +TEST(TestTxtFields, TestGetLongDiscriminator) { char ld[64]; strcpy(ld, "1234"); - NL_TEST_ASSERT(inSuite, GetLongDiscriminator(GetSpan(ld)) == 1234); + EXPECT_EQ(GetLongDiscriminator(GetSpan(ld)), 1234); // overflow a uint16 sprintf(ld, "%" PRIu32, static_cast<uint32_t>(std::numeric_limits<uint16_t>::max()) + 1); printf("ld = %s\n", ld); - NL_TEST_ASSERT(inSuite, GetLongDiscriminator(GetSpan(ld)) == 0); + EXPECT_EQ(GetLongDiscriminator(GetSpan(ld)), 0); } -void TestGetCommissioningMode(nlTestSuite * inSuite, void * inContext) +TEST(TestTxtFields, TestGetCommissioningMode) { char cm[64]; strcpy(cm, "0"); - NL_TEST_ASSERT(inSuite, GetCommissioningMode(GetSpan(cm)) == 0); + EXPECT_EQ(GetCommissioningMode(GetSpan(cm)), 0); strcpy(cm, "1"); - NL_TEST_ASSERT(inSuite, GetCommissioningMode(GetSpan(cm)) == 1); + EXPECT_EQ(GetCommissioningMode(GetSpan(cm)), 1); strcpy(cm, "2"); - NL_TEST_ASSERT(inSuite, GetCommissioningMode(GetSpan(cm)) == 2); + EXPECT_EQ(GetCommissioningMode(GetSpan(cm)), 2); // overflow a uint8 sprintf(cm, "%u", static_cast<uint16_t>(std::numeric_limits<uint8_t>::max()) + 1); - NL_TEST_ASSERT(inSuite, GetCommissioningMode(GetSpan(cm)) == 0); + EXPECT_EQ(GetCommissioningMode(GetSpan(cm)), 0); } -void TestGetDeviceType(nlTestSuite * inSuite, void * inContext) +TEST(TestTxtFields, TestGetDeviceType) { char dt[64]; strcpy(dt, "1234"); - NL_TEST_ASSERT(inSuite, GetDeviceType(GetSpan(dt)) == 1234); + EXPECT_EQ(GetDeviceType(GetSpan(dt)), 1234u); // overflow a uint32 sprintf(dt, "%" PRIu64, static_cast<uint64_t>(std::numeric_limits<uint32_t>::max()) + 1); - NL_TEST_ASSERT(inSuite, GetDeviceType(GetSpan(dt)) == 0); + EXPECT_EQ(GetDeviceType(GetSpan(dt)), 0u); } -void TestGetDeviceName(nlTestSuite * inSuite, void * inContext) +TEST(TestTxtFields, TestGetDeviceName) { char name[kMaxDeviceNameLen + 1] = ""; char val[kMaxDeviceNameLen + 2]; strcpy(val, "testname"); GetDeviceName(GetSpan(val), name); - NL_TEST_ASSERT(inSuite, strcmp(name, "testname") == 0); + EXPECT_STREQ(name, "testname"); // If the data passed in is too long, it should truncate the end. memset(val, 'a', kMaxDeviceNameLen); @@ -204,10 +203,10 @@ void TestGetDeviceName(nlTestSuite * inSuite, void * inContext) GetDeviceName(GetSpan(val), name); val[kMaxDeviceNameLen] = '\0'; - NL_TEST_ASSERT(inSuite, strcmp(name, val) == 0); + EXPECT_STREQ(name, val); } -void TestGetRotatingDeviceId(nlTestSuite * inSuite, void * inContext) +TEST(TestTxtFields, TestGetRotatingDeviceId) { // Rotating device ID is given as up to 50 hex bytes char ri[kMaxRotatingIdLen * 2 + 1]; @@ -217,58 +216,58 @@ void TestGetRotatingDeviceId(nlTestSuite * inSuite, void * inContext) strcpy(ri, "0A1B"); GetRotatingDeviceId(GetSpan(ri), id, &len); printf("id[0] = %x\n", id[0]); - NL_TEST_ASSERT(inSuite, id[0] == 0x0A); - NL_TEST_ASSERT(inSuite, id[1] == 0x1B); - NL_TEST_ASSERT(inSuite, len == 2); + EXPECT_EQ(id[0], 0x0A); + EXPECT_EQ(id[1], 0x1B); + EXPECT_EQ(len, 2u); // odd number of characters can't be parsed. strcpy(ri, "0A1BC"); GetRotatingDeviceId(GetSpan(ri), id, &len); - NL_TEST_ASSERT(inSuite, len == 0); + EXPECT_EQ(len, 0u); // non-hex characters can't be parsed strcpy(ri, "0ATT"); GetRotatingDeviceId(GetSpan(ri), id, &len); - NL_TEST_ASSERT(inSuite, len == 0); + EXPECT_EQ(len, 0u); // Lower case should work on SDK even though devices shouldn't be sending that. strcpy(ri, "0a1b"); GetRotatingDeviceId(GetSpan(ri), id, &len); - NL_TEST_ASSERT(inSuite, id[0] == 0x0A); - NL_TEST_ASSERT(inSuite, id[1] == 0x1B); - NL_TEST_ASSERT(inSuite, len == 2); + EXPECT_EQ(id[0], 0x0A); + EXPECT_EQ(id[1], 0x1B); + EXPECT_EQ(len, 2u); strcpy(ri, "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031"); GetRotatingDeviceId(GetSpan(ri), id, &len); - NL_TEST_ASSERT(inSuite, len == sizeof(id)); + EXPECT_EQ(len, sizeof(id)); for (size_t i = 0; i < sizeof(id); ++i) { - NL_TEST_ASSERT(inSuite, id[i] == i); + EXPECT_EQ(id[i], i); } } -void TestGetPairingHint(nlTestSuite * inSuite, void * inContext) +TEST(TestTxtFields, TestGetPairingHint) { char ph[64]; strcpy(ph, "0"); - NL_TEST_ASSERT(inSuite, GetPairingHint(GetSpan(ph)) == 0); + EXPECT_EQ(GetPairingHint(GetSpan(ph)), 0); strcpy(ph, "9"); - NL_TEST_ASSERT(inSuite, GetPairingHint(GetSpan(ph)) == 9); + EXPECT_EQ(GetPairingHint(GetSpan(ph)), 9); // overflow a uint16 sprintf(ph, "%" PRIu32, static_cast<uint32_t>(std::numeric_limits<uint16_t>::max()) + 1); - NL_TEST_ASSERT(inSuite, GetPairingHint(GetSpan(ph)) == 0); + EXPECT_EQ(GetPairingHint(GetSpan(ph)), 0); } -void TestGetPairingInstruction(nlTestSuite * inSuite, void * inContext) +TEST(TestTxtFields, TestGetPairingInstruction) { char data[kMaxPairingInstructionLen + 2]; char ret[kMaxPairingInstructionLen + 1] = ""; strcpy(data, "something"); GetPairingInstruction(GetSpan(data), ret); - NL_TEST_ASSERT(inSuite, strcmp(ret, "something") == 0); + EXPECT_STREQ(ret, "something"); // Exactly the max len. memset(data, 'a', kMaxPairingInstructionLen); @@ -276,7 +275,7 @@ void TestGetPairingInstruction(nlTestSuite * inSuite, void * inContext) GetPairingInstruction(GetSpan(data), ret); // Add back the null terminator removed by GetSpan. data[kMaxPairingInstructionLen] = '\0'; - NL_TEST_ASSERT(inSuite, strcmp(data, ret) == 0); + EXPECT_STREQ(data, ret); // Too long - should truncate end. memset(data, 'a', kMaxPairingInstructionLen); @@ -284,21 +283,21 @@ void TestGetPairingInstruction(nlTestSuite * inSuite, void * inContext) data[kMaxPairingInstructionLen + 1] = '\0'; GetPairingInstruction(GetSpan(data), ret); data[kMaxPairingInstructionLen] = '\0'; - NL_TEST_ASSERT(inSuite, strcmp(ret, data) == 0); + EXPECT_STREQ(ret, data); } -void TestGetCommissionerPasscode(nlTestSuite * inSuite, void * inContext) +TEST(TestTxtFields, TestGetCommissionerPasscode) { char cm[64]; strcpy(cm, "0"); - NL_TEST_ASSERT(inSuite, GetCommissionerPasscode(GetSpan(cm)) == 0); + EXPECT_EQ(GetCommissionerPasscode(GetSpan(cm)), 0); strcpy(cm, "1"); - NL_TEST_ASSERT(inSuite, GetCommissionerPasscode(GetSpan(cm)) == 1); + EXPECT_EQ(GetCommissionerPasscode(GetSpan(cm)), 1); // overflow a uint8 sprintf(cm, "%u", static_cast<uint16_t>(std::numeric_limits<uint8_t>::max()) + 1); - NL_TEST_ASSERT(inSuite, GetCommissionerPasscode(GetSpan(cm)) == 0); + EXPECT_EQ(GetCommissionerPasscode(GetSpan(cm)), 0); } bool NodeDataIsEmpty(const DiscoveredNodeData & node) @@ -328,7 +327,7 @@ bool NodeDataIsEmpty(const DiscoveredNodeData & node) } // The individual fill tests test the error cases for each key type, this test is used to ensure the proper record is filled. -void TestFillDiscoveredNodeDataFromTxt(nlTestSuite * inSuite, void * inContext) +TEST(TestTxtFields, TestFillDiscoveredNodeDataFromTxt) { char key[3]; char val[16]; @@ -338,78 +337,78 @@ void TestFillDiscoveredNodeDataFromTxt(nlTestSuite * inSuite, void * inContext) strcpy(key, "D"); strcpy(val, "840"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - NL_TEST_ASSERT(inSuite, filled.nodeData.longDiscriminator == 840); + EXPECT_EQ(filled.nodeData.longDiscriminator, 840); filled.nodeData.longDiscriminator = 0; - NL_TEST_ASSERT(inSuite, NodeDataIsEmpty(filled)); + EXPECT_TRUE(NodeDataIsEmpty(filled)); // vendor and product strcpy(key, "VP"); strcpy(val, "123+456"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - NL_TEST_ASSERT(inSuite, filled.nodeData.vendorId == 123); - NL_TEST_ASSERT(inSuite, filled.nodeData.productId == 456); + EXPECT_EQ(filled.nodeData.vendorId, 123); + EXPECT_EQ(filled.nodeData.productId, 456); filled.nodeData.vendorId = 0; filled.nodeData.productId = 0; - NL_TEST_ASSERT(inSuite, NodeDataIsEmpty(filled)); + EXPECT_TRUE(NodeDataIsEmpty(filled)); // Commissioning mode strcpy(key, "CM"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - NL_TEST_ASSERT(inSuite, filled.nodeData.commissioningMode == 1); + EXPECT_EQ(filled.nodeData.commissioningMode, 1); filled.nodeData.commissioningMode = 0; - NL_TEST_ASSERT(inSuite, NodeDataIsEmpty(filled)); + EXPECT_TRUE(NodeDataIsEmpty(filled)); // Supports Commissioner Generated Passcode strcpy(key, "CP"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - NL_TEST_ASSERT(inSuite, filled.nodeData.supportsCommissionerGeneratedPasscode == true); + EXPECT_TRUE(filled.nodeData.supportsCommissionerGeneratedPasscode); filled.nodeData.supportsCommissionerGeneratedPasscode = false; - NL_TEST_ASSERT(inSuite, NodeDataIsEmpty(filled)); + EXPECT_TRUE(NodeDataIsEmpty(filled)); // Device type strcpy(key, "DT"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - NL_TEST_ASSERT(inSuite, filled.nodeData.deviceType == 1); + EXPECT_EQ(filled.nodeData.deviceType, 1u); filled.nodeData.deviceType = 0; - NL_TEST_ASSERT(inSuite, NodeDataIsEmpty(filled)); + EXPECT_TRUE(NodeDataIsEmpty(filled)); // Device name strcpy(key, "DN"); strcpy(val, "abc"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - NL_TEST_ASSERT(inSuite, strcmp(filled.nodeData.deviceName, "abc") == 0); + EXPECT_STREQ(filled.nodeData.deviceName, "abc"); memset(filled.nodeData.deviceName, 0, sizeof(filled.nodeData.deviceName)); - NL_TEST_ASSERT(inSuite, NodeDataIsEmpty(filled)); + EXPECT_TRUE(NodeDataIsEmpty(filled)); // Rotating device id strcpy(key, "RI"); strcpy(val, "1A2B"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - NL_TEST_ASSERT(inSuite, filled.nodeData.rotatingId[0] == 0x1A); - NL_TEST_ASSERT(inSuite, filled.nodeData.rotatingId[1] == 0x2B); - NL_TEST_ASSERT(inSuite, filled.nodeData.rotatingIdLen == 2); + EXPECT_EQ(filled.nodeData.rotatingId[0], 0x1A); + EXPECT_EQ(filled.nodeData.rotatingId[1], 0x2B); + EXPECT_EQ(filled.nodeData.rotatingIdLen, 2u); filled.nodeData.rotatingIdLen = 0; memset(filled.nodeData.rotatingId, 0, sizeof(filled.nodeData.rotatingId)); - NL_TEST_ASSERT(inSuite, NodeDataIsEmpty(filled)); + EXPECT_TRUE(NodeDataIsEmpty(filled)); // Pairing instruction strcpy(key, "PI"); strcpy(val, "hint"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - NL_TEST_ASSERT(inSuite, strcmp(filled.nodeData.pairingInstruction, "hint") == 0); + EXPECT_STREQ(filled.nodeData.pairingInstruction, "hint"); memset(filled.nodeData.pairingInstruction, 0, sizeof(filled.nodeData.pairingInstruction)); - NL_TEST_ASSERT(inSuite, NodeDataIsEmpty(filled)); + EXPECT_TRUE(NodeDataIsEmpty(filled)); // Pairing hint strcpy(key, "PH"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - NL_TEST_ASSERT(inSuite, filled.nodeData.pairingHint == 1); + EXPECT_EQ(filled.nodeData.pairingHint, 1); filled.nodeData.pairingHint = 0; - NL_TEST_ASSERT(inSuite, NodeDataIsEmpty(filled)); + EXPECT_TRUE(NodeDataIsEmpty(filled)); } bool NodeDataIsEmpty(const ResolvedNodeData & nodeData) @@ -452,7 +451,7 @@ void ResetRetryActiveThreshold(ResolvedNodeData & nodeData) // Test SAI (formally CRI) template <class NodeData> -void TxtFieldSessionIdleInterval(nlTestSuite * inSuite, void * inContext) +void TxtFieldSessionIdleInterval() { char key[4]; char val[16]; @@ -462,60 +461,70 @@ void TxtFieldSessionIdleInterval(nlTestSuite * inSuite, void * inContext) strcpy(key, "SII"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.GetMrpRetryIntervalIdle().Value() == 1_ms32); + EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalIdle().Value(), 1_ms32); // Maximum strcpy(key, "SII"); strcpy(val, "3600000"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.GetMrpRetryIntervalIdle().Value() == 3600000_ms32); + EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalIdle().Value(), 3600000_ms32); // Test no other fields were populated ResetRetryIntervalIdle(nodeData); - NL_TEST_ASSERT(inSuite, NodeDataIsEmpty(nodeData)); + EXPECT_TRUE(NodeDataIsEmpty(nodeData)); // Invalid SII - negative value strcpy(key, "SII"); strcpy(val, "-1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); // Invalid SII - greater than maximum strcpy(key, "SII"); strcpy(val, "3600001"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); // Invalid SII - much greater than maximum strcpy(key, "SII"); strcpy(val, "1095216660481"); // 0xFF00000001 == 1 (mod 2^32) FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); // Invalid SII - hexadecimal value strcpy(key, "SII"); strcpy(val, "0x20"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); // Invalid SII - leading zeros strcpy(key, "SII"); strcpy(val, "0700"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); // Invalid SII - text at the end strcpy(key, "SII"); strcpy(val, "123abc"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); +} + +TEST(TestTxtFields, TxtDiscoveredFieldMrpRetryIntervalIdle) +{ + TxtFieldSessionIdleInterval<DiscoveredNodeData>(); +} + +TEST(TestTxtFields, TxtResolvedFieldMrpRetryIntervalIdle) +{ + TxtFieldSessionIdleInterval<ResolvedNodeData>(); } // Test SAI (formerly CRA) template <class NodeData> -void TxtFieldSessionActiveInterval(nlTestSuite * inSuite, void * inContext) +void TxtFieldSessionActiveInterval() { char key[4]; char val[16]; @@ -525,60 +534,70 @@ void TxtFieldSessionActiveInterval(nlTestSuite * inSuite, void * inContext) strcpy(key, "SAI"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.GetMrpRetryIntervalActive().Value() == 1_ms32); + EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalActive().Value(), 1_ms32); // Maximum strcpy(key, "SAI"); strcpy(val, "3600000"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.GetMrpRetryIntervalActive().Value() == 3600000_ms32); + EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalActive().Value(), 3600000_ms32); // Test no other fields were populated ResetRetryIntervalActive(nodeData); - NL_TEST_ASSERT(inSuite, NodeDataIsEmpty(nodeData)); + EXPECT_TRUE(NodeDataIsEmpty(nodeData)); // Invalid SAI - negative value strcpy(key, "SAI"); strcpy(val, "-1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); // Invalid SAI - greater than maximum strcpy(key, "SAI"); strcpy(val, "3600001"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); // Invalid SAI - much greater than maximum strcpy(key, "SAI"); strcpy(val, "1095216660481"); // 0xFF00000001 == 1 (mod 2^32) FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); // Invalid SAI - hexadecimal value strcpy(key, "SAI"); strcpy(val, "0x20"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); // Invalid SAI - leading zeros strcpy(key, "SAI"); strcpy(val, "0700"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); // Invalid SAI - text at the end strcpy(key, "SAI"); strcpy(val, "123abc"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); +} + +TEST(TestTxtFields, TxtDiscoveredFieldMrpRetryIntervalActive) +{ + TxtFieldSessionActiveInterval<DiscoveredNodeData>(); +} + +TEST(TestTxtFields, TxtResolvedFieldMrpRetryIntervalActive) +{ + TxtFieldSessionActiveInterval<ResolvedNodeData>(); } // Test SAT (Session Active Threshold) template <class NodeData> -void TxtFieldSessionActiveThreshold(nlTestSuite * inSuite, void * inContext) +void TxtFieldSessionActiveThreshold() { char key[4]; char val[16]; @@ -588,60 +607,70 @@ void TxtFieldSessionActiveThreshold(nlTestSuite * inSuite, void * inContext) strcpy(key, "SAT"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.GetMrpRetryActiveThreshold().Value() == 1_ms16); + EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); + EXPECT_EQ(nodeData.resolutionData.GetMrpRetryActiveThreshold().Value(), 1_ms16); // Maximum strcpy(key, "SAT"); strcpy(val, "65535"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.GetMrpRetryActiveThreshold().Value() == 65535_ms16); + EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); + EXPECT_EQ(nodeData.resolutionData.GetMrpRetryActiveThreshold().Value(), 65535_ms16); // Test no other fields were populated ResetRetryActiveThreshold(nodeData); - NL_TEST_ASSERT(inSuite, NodeDataIsEmpty(nodeData)); + EXPECT_TRUE(NodeDataIsEmpty(nodeData)); // Invalid SAI - negative value strcpy(key, "SAT"); strcpy(val, "-1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); // Invalid SAI - greater than maximum strcpy(key, "SAT"); strcpy(val, "65536"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); // Invalid SAT - much greater than maximum strcpy(key, "SAT"); strcpy(val, "1095216660481"); // 0xFF00000001 == 1 (mod 2^32) FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); // Invalid SAT - hexadecimal value strcpy(key, "SAT"); strcpy(val, "0x20"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); // Invalid SAT - leading zeros strcpy(key, "SAT"); strcpy(val, "0700"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); // Invalid SAT - text at the end strcpy(key, "SAT"); strcpy(val, "123abc"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); +} + +TEST(TestTxtFields, TxtDiscoveredFieldMrpRetryActiveThreshold) +{ + TxtFieldSessionActiveThreshold<DiscoveredNodeData>(); +} + +TEST(TestTxtFields, TxtResolvedFieldMrpRetryActiveThreshold) +{ + TxtFieldSessionActiveThreshold<ResolvedNodeData>(); } // Test T (TCP support) template <class NodeData> -void TxtFieldTcpSupport(nlTestSuite * inSuite, void * inContext) +void TxtFieldTcpSupport() { char key[4]; char val[8]; @@ -651,28 +680,38 @@ void TxtFieldTcpSupport(nlTestSuite * inSuite, void * inContext) strcpy(key, "T"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.supportsTcp); + EXPECT_TRUE(nodeData.resolutionData.supportsTcp); // Test no other fields were populated nodeData.resolutionData.supportsTcp = false; - NL_TEST_ASSERT(inSuite, NodeDataIsEmpty(nodeData)); + EXPECT_TRUE(NodeDataIsEmpty(nodeData)); // False strcpy(key, "T"); strcpy(val, "0"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.supportsTcp == false); + EXPECT_EQ(nodeData.resolutionData.supportsTcp, false); // Invalid value, stil false strcpy(key, "T"); strcpy(val, "asdf"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.supportsTcp == false); + EXPECT_EQ(nodeData.resolutionData.supportsTcp, false); +} + +TEST(TestTxtFields, TxtDiscoveredFieldTcpSupport) +{ + TxtFieldTcpSupport<DiscoveredNodeData>(); +} + +TEST(TestTxtFields, TxtResolvedFieldTcpSupport) +{ + TxtFieldTcpSupport<ResolvedNodeData>(); } // Test ICD (ICD operation Mode) template <class NodeData> -void TxtFieldICDoperatesAsLIT(nlTestSuite * inSuite, void * inContext) +void TxtFieldICDoperatesAsLIT() { char key[4]; char val[16]; @@ -682,32 +721,42 @@ void TxtFieldICDoperatesAsLIT(nlTestSuite * inSuite, void * inContext) strcpy(key, "ICD"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.isICDOperatingAsLIT.HasValue()); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.isICDOperatingAsLIT.Value()); + EXPECT_TRUE(nodeData.resolutionData.isICDOperatingAsLIT.HasValue()); + EXPECT_TRUE(nodeData.resolutionData.isICDOperatingAsLIT.Value()); // Test no other fields were populated nodeData.resolutionData.isICDOperatingAsLIT.ClearValue(); - NL_TEST_ASSERT(inSuite, NodeDataIsEmpty(nodeData)); + EXPECT_TRUE(NodeDataIsEmpty(nodeData)); // ICD is operating as a SIT device strcpy(key, "ICD"); strcpy(val, "0"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.isICDOperatingAsLIT.HasValue()); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.isICDOperatingAsLIT.Value() == false); + EXPECT_TRUE(nodeData.resolutionData.isICDOperatingAsLIT.HasValue()); + EXPECT_EQ(nodeData.resolutionData.isICDOperatingAsLIT.Value(), false); nodeData.resolutionData.isICDOperatingAsLIT.ClearValue(); - NL_TEST_ASSERT(inSuite, NodeDataIsEmpty(nodeData)); + EXPECT_TRUE(NodeDataIsEmpty(nodeData)); // Invalid value, No key set strcpy(key, "ICD"); strcpy(val, "asdf"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.isICDOperatingAsLIT.HasValue() == false); + EXPECT_EQ(nodeData.resolutionData.isICDOperatingAsLIT.HasValue(), false); +} + +TEST(TestTxtFields, TxtDiscoveredIsICDoperatingAsLIT) +{ + TxtFieldICDoperatesAsLIT<DiscoveredNodeData>(); +} + +TEST(TestTxtFields, TxtResolvedFieldICDoperatingAsLIT) +{ + TxtFieldICDoperatesAsLIT<ResolvedNodeData>(); } // Test IsDeviceTreatedAsSleepy() with CRI template <class NodeData> -void TestIsDeviceSessionIdle(nlTestSuite * inSuite, void * inContext) +void TestIsDeviceSessionIdle() { char key[4]; char val[32]; @@ -716,24 +765,34 @@ void TestIsDeviceSessionIdle(nlTestSuite * inSuite, void * inContext) CHIP_CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL); // No key/val set, so the device can't be sleepy - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.IsDeviceTreatedAsSleepy(&defaultMRPConfig)); + EXPECT_FALSE(nodeData.resolutionData.IsDeviceTreatedAsSleepy(&defaultMRPConfig)); // If the interval is the default value, the device is not sleepy strcpy(key, "SII"); sprintf(val, "%d", static_cast<int>(CHIP_CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL.count())); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.IsDeviceTreatedAsSleepy(&defaultMRPConfig)); + EXPECT_FALSE(nodeData.resolutionData.IsDeviceTreatedAsSleepy(&defaultMRPConfig)); // If the interval is greater than the default value, the device is sleepy sprintf(key, "SII"); sprintf(val, "%d", static_cast<int>(CHIP_CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL.count() + 1)); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.IsDeviceTreatedAsSleepy(&defaultMRPConfig)); + EXPECT_TRUE(nodeData.resolutionData.IsDeviceTreatedAsSleepy(&defaultMRPConfig)); +} + +TEST(TestTxtFields, TxtDiscoveredIsDeviceSessionIdle) +{ + TestIsDeviceSessionIdle<DiscoveredNodeData>(); +} + +TEST(TestTxtFields, TxtResolvedIsDeviceSessionIdle) +{ + TestIsDeviceSessionIdle<ResolvedNodeData>(); } // Test IsDeviceTreatedAsSleepy() with CRA template <class NodeData> -void TestIsDeviceSessionActive(nlTestSuite * inSuite, void * inContext) +void TestIsDeviceSessionActive() { char key[4]; char val[32]; @@ -742,59 +801,29 @@ void TestIsDeviceSessionActive(nlTestSuite * inSuite, void * inContext) CHIP_CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL); // No key/val set, so the device can't be sleepy - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.IsDeviceTreatedAsSleepy(&defaultMRPConfig)); + EXPECT_FALSE(nodeData.resolutionData.IsDeviceTreatedAsSleepy(&defaultMRPConfig)); // If the interval is the default value, the device is not sleepy sprintf(key, "SAI"); sprintf(val, "%d", static_cast<int>(CHIP_CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL.count())); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, !nodeData.resolutionData.IsDeviceTreatedAsSleepy(&defaultMRPConfig)); + EXPECT_FALSE(nodeData.resolutionData.IsDeviceTreatedAsSleepy(&defaultMRPConfig)); // If the interval is greater than the default value, the device is sleepy strcpy(key, "SAI"); sprintf(val, "%d", static_cast<int>(CHIP_CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL.count() + 1)); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - NL_TEST_ASSERT(inSuite, nodeData.resolutionData.IsDeviceTreatedAsSleepy(&defaultMRPConfig)); -} - -const nlTest sTests[] = { - NL_TEST_DEF("TxtFieldKey", TestGetTxtFieldKey), // - NL_TEST_DEF("TxtFieldKeyCaseInsensitive", TestGetTxtFieldKeyCaseInsensitive), // - NL_TEST_DEF("TxtFieldProduct", TestGetProduct), // - NL_TEST_DEF("TxtFieldVendor", TestGetVendor), // - NL_TEST_DEF("TxtFieldLongDiscriminator", TestGetLongDiscriminator), // - NL_TEST_DEF("TxtFieldCommissioningMode", TestGetCommissioningMode), // - NL_TEST_DEF("TxtFieldDeviceType", TestGetDeviceType), // - NL_TEST_DEF("TxtFieldDeviceName", TestGetDeviceName), // - NL_TEST_DEF("TxtFieldRotatingDeviceId", TestGetRotatingDeviceId), // - NL_TEST_DEF("TxtFieldPairingHint", TestGetPairingHint), // - NL_TEST_DEF("TxtFieldPairingInstruction", TestGetPairingInstruction), // - NL_TEST_DEF("TxtFieldCommissionerPasscode", TestGetCommissionerPasscode), // - NL_TEST_DEF("TxtFieldFillDiscoveredNodeDataFromTxt", TestFillDiscoveredNodeDataFromTxt), // - NL_TEST_DEF("TxtDiscoveredFieldMrpRetryIntervalIdle", TxtFieldSessionIdleInterval<DiscoveredNodeData>), - NL_TEST_DEF("TxtDiscoveredFieldMrpRetryIntervalActive", TxtFieldSessionActiveInterval<DiscoveredNodeData>), - NL_TEST_DEF("TxtDiscoveredFieldMrpRetryActiveThreshold", TxtFieldSessionActiveThreshold<DiscoveredNodeData>), - NL_TEST_DEF("TxtDiscoveredFieldTcpSupport", (TxtFieldTcpSupport<DiscoveredNodeData>) ), - NL_TEST_DEF("TxtDiscoveredIsICDoperatingAsLIT", (TxtFieldICDoperatesAsLIT<DiscoveredNodeData>) ), - NL_TEST_DEF("TxtDiscoveredIsDeviceSessionIdle", TestIsDeviceSessionIdle<DiscoveredNodeData>), - NL_TEST_DEF("TxtDiscoveredIsDeviceSessionActive", TestIsDeviceSessionActive<DiscoveredNodeData>), - NL_TEST_DEF("TxtResolvedFieldMrpRetryIntervalIdle", TxtFieldSessionIdleInterval<ResolvedNodeData>), - NL_TEST_DEF("TxtResolvedFieldMrpRetryIntervalActive", TxtFieldSessionActiveInterval<ResolvedNodeData>), - NL_TEST_DEF("TxtResolvedFieldMrpRetryActiveThreshold", TxtFieldSessionActiveThreshold<ResolvedNodeData>), - NL_TEST_DEF("TxtResolvedFieldTcpSupport", (TxtFieldTcpSupport<ResolvedNodeData>) ), - NL_TEST_DEF("TxtResolvedFieldICDoperatingAsLIT", (TxtFieldICDoperatesAsLIT<ResolvedNodeData>) ), - NL_TEST_DEF("TxtResolvedIsDeviceSessionIdle", TestIsDeviceSessionIdle<ResolvedNodeData>), - NL_TEST_DEF("TxtResolvedIsDeviceSessionActive", TestIsDeviceSessionActive<ResolvedNodeData>), - NL_TEST_SENTINEL() -}; + EXPECT_TRUE(nodeData.resolutionData.IsDeviceTreatedAsSleepy(&defaultMRPConfig)); +} -} // namespace +TEST(TestTxtFields, TxtDiscoveredIsDeviceSessionActive) +{ + TestIsDeviceSessionActive<DiscoveredNodeData>(); +} -int TestCHIPTxtFields() +TEST(TestTxtFields, TxtResolvedIsDeviceSessionActive) { - nlTestSuite theSuite = { "TxtFields", &sTests[0], nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); + TestIsDeviceSessionActive<ResolvedNodeData>(); } -CHIP_REGISTER_TEST_SUITE(TestCHIPTxtFields); +} // namespace diff --git a/src/test_driver/openiotsdk/unit-tests/test_components.txt b/src/test_driver/openiotsdk/unit-tests/test_components.txt index e112a8b2ed5d50..5c3dcbae75a2a3 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components.txt @@ -4,6 +4,7 @@ MinimalMdnsCoreTests MinimalMdnsRecordsTests MinimalMdnsRespondersTests CoreTests +MdnsTests PlatformTests SystemLayerTests TestShell 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 13a59af526f4dd..7806ae3318cdf2 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt @@ -4,7 +4,6 @@ ChipCryptoTests CredentialsTest DataModelTests InetLayerTests -MdnsTests MessagingLayerTests RawTransportTests RetransmitTests From 5d338ffd02f2b16f7e3053fef210b91258978a9c Mon Sep 17 00:00:00 2001 From: Philip Gregor <147669098+pgregorr-amazon@users.noreply.github.com> Date: Tue, 23 Apr 2024 14:26:12 -0700 Subject: [PATCH 010/124] v1.3 Supports Commissioner Generated Passcode field for iOS tv-casting-app (#33115) --- .../MatterTvCastingBridge/MCCastingPlayer.h | 1 + .../MatterTvCastingBridge/MCCastingPlayer.mm | 9 +++++++-- .../TvCasting/TvCasting/MCDiscoveryExampleView.swift | 4 +++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.h index cc3d90e8a2f922..d01ce207519c4c 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.h +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.h @@ -70,6 +70,7 @@ - (uint16_t)vendorId; - (uint16_t)productId; - (uint32_t)deviceType; +- (bool)supportsCommissionerGeneratedPasscode; - (NSArray * _Nonnull)ipAddresses; /** diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.mm b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.mm index 45cc9568f472a1..b69bbfb99f9bd7 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.mm +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.mm @@ -89,8 +89,8 @@ - (instancetype _Nonnull)initWithCppCastingPlayer:(matter::casting::memory::Stro - (NSString * _Nonnull)description { - return [NSString stringWithFormat:@"%@ with Product ID: %hu and Vendor ID: %hu. Resolved IPAddr?: %@", - self.deviceName, self.productId, self.vendorId, self.ipAddresses != nil && self.ipAddresses.count > 0 ? @"YES" : @"NO"]; + return [NSString stringWithFormat:@"%@ with Product ID: %hu and Vendor ID: %hu. Resolved IPAddr?: %@. Supports Commissioner Generated Passcode?: %@.", + self.deviceName, self.productId, self.vendorId, self.ipAddresses != nil && self.ipAddresses.count > 0 ? @"YES" : @"NO", self.supportsCommissionerGeneratedPasscode ? @"YES" : @"NO"]; } - (NSString * _Nonnull)identifier @@ -118,6 +118,11 @@ - (uint32_t)deviceType return _cppCastingPlayer->GetDeviceType(); } +- (bool)supportsCommissionerGeneratedPasscode +{ + return _cppCastingPlayer->GetSupportsCommissionerGeneratedPasscode(); +} + - (NSArray * _Nonnull)ipAddresses { NSMutableArray * ipAddresses = [NSMutableArray new]; diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCDiscoveryExampleView.swift b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCDiscoveryExampleView.swift index ef0e32f6770b88..769b84c2a35963 100644 --- a/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCDiscoveryExampleView.swift +++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCDiscoveryExampleView.swift @@ -63,9 +63,11 @@ struct MCDiscoveryExampleView: View { }, label: { Text(castingPlayer.description) + .frame(minHeight: 50) + .padding() } ) - .frame(width: 350, height: 50, alignment: .center) + .frame(width: 350, alignment: .center) .border(Color.black, width: 1) .background(Color.blue) .foregroundColor(Color.white) From beb1749e871a35baf28f58e53aebd1a3bbd9b45a Mon Sep 17 00:00:00 2001 From: Jean-Francois Penven <67962328+jepenven-silabs@users.noreply.github.com> Date: Tue, 23 Apr 2024 17:34:18 -0400 Subject: [PATCH 011/124] silabs minor fixes (#33121) --- examples/platform/silabs/efr32/rs911x/hal/efx_spi.c | 2 +- examples/platform/silabs/efr32/uart.cpp | 2 +- examples/platform/silabs/matter_shell.cpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/platform/silabs/efr32/rs911x/hal/efx_spi.c b/examples/platform/silabs/efr32/rs911x/hal/efx_spi.c index daed27f9398a93..7a3dcc08942d46 100644 --- a/examples/platform/silabs/efr32/rs911x/hal/efx_spi.c +++ b/examples/platform/silabs/efr32/rs911x/hal/efx_spi.c @@ -374,7 +374,7 @@ int16_t rsi_spi_transfer(uint8_t * tx_buf, uint8_t * rx_buf, uint16_t xlen, uint } (void) mode; // currently not used; - error_t rsiError = RSI_ERROR_NONE; + int16_t rsiError = RSI_ERROR_NONE; xSemaphoreTake(spiTransferLock, portMAX_DELAY); diff --git a/examples/platform/silabs/efr32/uart.cpp b/examples/platform/silabs/efr32/uart.cpp index 9a626e10a2159d..5feaaa66d86923 100644 --- a/examples/platform/silabs/efr32/uart.cpp +++ b/examples/platform/silabs/efr32/uart.cpp @@ -301,7 +301,7 @@ void USART_IRQHandler(void) { #ifdef ENABLE_CHIP_SHELL chip::NotifyShellProcess(); -#elif !defined(PW_RPC_ENABLED) +#elif !defined(PW_RPC_ENABLED) && !defined(SL_WIFI) otSysEventSignalPending(); #endif diff --git a/examples/platform/silabs/matter_shell.cpp b/examples/platform/silabs/matter_shell.cpp index a6a8c9f6d6e1ae..3e70764a08a1d5 100644 --- a/examples/platform/silabs/matter_shell.cpp +++ b/examples/platform/silabs/matter_shell.cpp @@ -83,13 +83,13 @@ CHIP_ERROR CmdSilabsDispatch(int argc, char ** argv) size_t arg_len = strlen(argv[i]); /* Make sure that the next argument won't overflow the buffer */ - VerifyOrExit(buff_ptr + arg_len < buff + kMaxLineLength, error = CHIP_ERROR_BUFFER_TOO_SMALL); + VerifyOrExit(buff_ptr + arg_len < buff + SL_CLI_INPUT_BUFFER_SIZE, error = CHIP_ERROR_BUFFER_TOO_SMALL); strncpy(buff_ptr, argv[i], arg_len); buff_ptr += arg_len; /* Make sure that there is enough buffer for a space char */ - if (buff_ptr + sizeof(char) < buff + kMaxLineLength) + if (buff_ptr + sizeof(char) < buff + SL_CLI_INPUT_BUFFER_SIZE) { strncpy(buff_ptr, " ", sizeof(char)); buff_ptr++; From a4561356623ba5a7281aaeb60696860fd594318b Mon Sep 17 00:00:00 2001 From: Boris Zbarsky <bzbarsky@apple.com> Date: Tue, 23 Apr 2024 18:32:13 -0400 Subject: [PATCH 012/124] Switch MTRDevice to using MTRDeviceClusterData for its attribute cache. (#33114) Use these to store attribute values too, not just data versions. --- src/darwin/Framework/CHIP/MTRDevice.mm | 188 +++++++++--------- .../Framework/CHIP/MTRDevice_Internal.h | 17 +- .../CHIPTests/MTRPerControllerStorageTests.m | 48 ++--- 3 files changed, 116 insertions(+), 137 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRDevice.mm b/src/darwin/Framework/CHIP/MTRDevice.mm index 374b2e8cc60bc0..7c02df267a8ad7 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.mm +++ b/src/darwin/Framework/CHIP/MTRDevice.mm @@ -184,11 +184,23 @@ typedef NS_ENUM(NSUInteger, MTRDeviceWorkItemDuplicateTypeID) { MTRDeviceWorkItemDuplicateReadTypeID = 1, }; -@implementation MTRDeviceClusterData +@implementation MTRDeviceClusterData { + NSMutableDictionary<NSNumber *, MTRDeviceDataValueDictionary> * _attributes; +} static NSString * const sDataVersionKey = @"dataVersion"; static NSString * const sAttributesKey = @"attributes"; +- (void)storeValue:(MTRDeviceDataValueDictionary _Nullable)value forAttribute:(NSNumber *)attribute +{ + _attributes[attribute] = value; +} + +- (NSDictionary<NSNumber *, MTRDeviceDataValueDictionary> *)attributes +{ + return _attributes; +} + + (BOOL)supportsSecureCoding { return YES; @@ -199,6 +211,11 @@ - (NSString *)description return [NSString stringWithFormat:@"<MTRDeviceClusterData: dataVersion %@ attributes count %lu>", _dataVersion, static_cast<unsigned long>(_attributes.count)]; } +- (nullable instancetype)init +{ + return [self initWithDataVersion:nil attributes:nil]; +} + // Attributes dictionary is: attributeID => data-value dictionary - (nullable instancetype)initWithDataVersion:(NSNumber * _Nullable)dataVersion attributes:(NSDictionary<NSNumber *, MTRDeviceDataValueDictionary> * _Nullable)attributes { @@ -208,7 +225,8 @@ - (nullable instancetype)initWithDataVersion:(NSNumber * _Nullable)dataVersion a } _dataVersion = [dataVersion copy]; - _attributes = [attributes copy]; + _attributes = [NSMutableDictionary dictionaryWithCapacity:attributes.count]; + [_attributes addEntriesFromDictionary:attributes]; return self; } @@ -299,10 +317,6 @@ @interface MTRDevice () */ @property (nonatomic) BOOL reattemptingSubscription; -// Read cache is attributePath => NSDictionary of value. -// See MTRDeviceResponseHandler definition for value dictionary details. -@property (nonatomic) NSMutableDictionary<MTRAttributePath *, NSDictionary *> * readCache; - // Expected value cache is attributePath => NSArray of [NSDate of expiration time, NSDictionary of value, expected value ID] // - See MTRDeviceExpectedValueFieldIndex for the definitions of indices into this array. // See MTRDeviceResponseHandler definition for value dictionary details. @@ -369,7 +383,6 @@ - (instancetype)initWithNodeID:(NSNumber *)nodeID controller:(MTRDeviceControlle _deviceController = controller; _queue = dispatch_queue_create("org.csa-iot.matter.framework.device.workqueue", DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL); - _readCache = [NSMutableDictionary dictionary]; _expectedValueCache = [NSMutableDictionary dictionary]; _asyncWorkQueue = [[MTRAsyncWorkQueue alloc] initWithContext:self]; _state = MTRDeviceStateUnknown; @@ -1021,30 +1034,12 @@ - (void)_handleReportBegin } } -- (NSDictionary<NSNumber *, MTRDeviceDataValueDictionary> *)_attributesForCluster:(MTRClusterPath *)clusterPath -{ - os_unfair_lock_assert_owner(&self->_lock); - NSMutableDictionary * attributesToReturn = [NSMutableDictionary dictionary]; - for (MTRAttributePath * attributePath in _readCache) { - if ([attributePath.endpoint isEqualToNumber:clusterPath.endpoint] && [attributePath.cluster isEqualToNumber:clusterPath.cluster]) { - attributesToReturn[attributePath.attribute] = _readCache[attributePath]; - } - } - return attributesToReturn; -} - -- (NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)_clusterDataForPaths:(NSSet<MTRClusterPath *> *)clusterPaths +- (NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)_copiedClusterDataForPaths:(NSSet<MTRClusterPath *> *)clusterPaths { os_unfair_lock_assert_owner(&self->_lock); NSMutableDictionary * clusterDataToReturn = [NSMutableDictionary dictionary]; for (MTRClusterPath * clusterPath in clusterPaths) { - NSNumber * dataVersion = _clusterData[clusterPath].dataVersion; - NSDictionary<NSNumber *, MTRDeviceDataValueDictionary> * attributes = nil; - attributes = [self _attributesForCluster:clusterPath]; - if (dataVersion || attributes) { - MTRDeviceClusterData * clusterData = [[MTRDeviceClusterData alloc] initWithDataVersion:dataVersion attributes:attributes]; - clusterDataToReturn[clusterPath] = clusterData; - } + clusterDataToReturn[clusterPath] = [_clusterData[clusterPath] copy]; } return clusterDataToReturn; @@ -1060,7 +1055,10 @@ - (void)_handleReportEnd BOOL dataStoreExists = _deviceController.controllerDataStore != nil; if (dataStoreExists && _clustersToPersist.count) { MTR_LOG_DEFAULT("%@ Storing cluster information (data version) count: %lu", self, static_cast<unsigned long>(_clustersToPersist.count)); - NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * clusterData = [self _clusterDataForPaths:_clustersToPersist]; + // We're going to hand out these MTRDeviceClusterData objects to our + // storage implementation, which will try to read them later. Make sure + // we snapshot the state here instead of handing out live copies. + NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * clusterData = [self _copiedClusterDataForPaths:_clustersToPersist]; [_deviceController.controllerDataStore storeClusterData:clusterData forNodeID:_nodeID]; _clustersToPersist = nil; } @@ -1221,6 +1219,42 @@ - (void)_handleEventReport:(NSArray<NSDictionary<NSString *, id> *> *)eventRepor return dataVersions; } +- (MTRDeviceDataValueDictionary _Nullable)_cachedAttributeValueForPath:(MTRAttributePath *)path +{ + os_unfair_lock_assert_owner(&self->_lock); + + // We need an MTRClusterPath to do the lookup in _clusterData. + auto * clusterPath = [MTRClusterPath clusterPathWithEndpointID:path.endpoint clusterID:path.cluster]; + + MTRDeviceClusterData * clusterData = _clusterData[clusterPath]; + if (clusterData == nil) { + return nil; + } + + return clusterData.attributes[path.attribute]; +} + +- (void)_setCachedAttributeValue:(MTRDeviceDataValueDictionary _Nullable)value forPath:(MTRAttributePath *)path +{ + os_unfair_lock_assert_owner(&self->_lock); + + // We need an MTRClusterPath to do the lookup in _clusterData. + auto * clusterPath = [MTRClusterPath clusterPathWithEndpointID:path.endpoint clusterID:path.cluster]; + + MTRDeviceClusterData * clusterData = _clusterData[clusterPath]; + if (clusterData == nil) { + if (value == nil) { + // Nothing to do. + return; + } + + clusterData = [[MTRDeviceClusterData alloc] init]; + _clusterData[clusterPath] = clusterData; + } + + [clusterData storeValue:value forAttribute:path.attribute]; +} + - (void)_createDataVersionFilterListFromDictionary:(NSDictionary<MTRClusterPath *, NSNumber *> *)dataVersions dataVersionFilterList:(DataVersionFilter **)dataVersionFilterList count:(size_t *)count sizeReduction:(size_t)sizeReduction { size_t maxDataVersionFilterSize = dataVersions.count; @@ -2192,7 +2226,7 @@ - (void)_checkExpiredExpectedValues // compare with known value and mark for report if different MTRAttributePath * attributePath = attributeInfo[0]; NSDictionary * attributeDataValue = attributeInfo[1]; - NSDictionary * cachedAttributeDataValue = _readCache[attributePath]; + NSDictionary * cachedAttributeDataValue = [self _cachedAttributeValueForPath:attributePath]; if (cachedAttributeDataValue && ![self _attributeDataValue:attributeDataValue isEqualToDataValue:cachedAttributeDataValue]) { [attributesToReport addObject:@{ MTRAttributePathKey : attributePath, MTRDataKey : cachedAttributeDataValue, MTRPreviousDataKey : attributeDataValue }]; @@ -2249,7 +2283,7 @@ - (void)_performScheduledExpirationCheck } // Then check read cache - NSDictionary<NSString *, id> * cachedAttributeValue = _readCache[attributePath]; + NSDictionary<NSString *, id> * cachedAttributeValue = [self _cachedAttributeValueForPath:attributePath]; if (cachedAttributeValue) { return cachedAttributeValue; } else { @@ -2301,16 +2335,15 @@ - (void)_noteDataVersion:(NSNumber *)dataVersion forClusterPath:(MTRClusterPath // Update data version used for subscription filtering MTRDeviceClusterData * clusterData = _clusterData[clusterPath]; if (!clusterData) { - clusterData = [[MTRDeviceClusterData alloc] init]; + clusterData = [[MTRDeviceClusterData alloc] initWithDataVersion:dataVersion attributes:nil]; _clusterData[clusterPath] = clusterData; dataVersionChanged = YES; } else if (![clusterData.dataVersion isEqualToNumber:dataVersion]) { + clusterData.dataVersion = dataVersion; dataVersionChanged = YES; } if (dataVersionChanged) { - clusterData.dataVersion = dataVersion; - // Mark cluster path as needing persistence if needed BOOL dataStoreExists = _deviceController.controllerDataStore != nil; if (dataStoreExists) { @@ -2361,11 +2394,12 @@ - (NSArray *)_getAttributesToReportWithReportedValues:(NSArray<NSDictionary<NSSt // if this is an error, report and purge cache if (attributeError) { shouldReportAttribute = YES; + previousValue = [self _cachedAttributeValueForPath:attributePath]; MTR_LOG_INFO("%@ report %@ error %@ purge expected value %@ read cache %@", self, attributePath, attributeError, - _expectedValueCache[attributePath], _readCache[attributePath]); + _expectedValueCache[attributePath], previousValue); _expectedValueCache[attributePath] = nil; - previousValue = _readCache[attributePath]; - _readCache[attributePath] = nil; + // TODO: Is this clearing business really what we want? + [self _setCachedAttributeValue:nil forPath:attributePath]; } else { // First separate data version and restore data value to a form without data version NSNumber * dataVersion = attributeDataValue[MTRDataVersionKey]; @@ -2377,7 +2411,8 @@ - (NSArray *)_getAttributesToReportWithReportedValues:(NSArray<NSDictionary<NSSt attributeDataValue = [self _dataValueWithoutDataVersion:attributeDataValue]; } - BOOL readCacheValueChanged = ![self _attributeDataValue:attributeDataValue isEqualToDataValue:_readCache[attributePath]]; + previousValue = [self _cachedAttributeValueForPath:attributePath]; + BOOL readCacheValueChanged = ![self _attributeDataValue:attributeDataValue isEqualToDataValue:previousValue]; // Check if attribute needs to be persisted - compare only to read cache and disregard expected values if (dataStoreExists && readCacheValueChanged) { [self _noteChangeForClusterPath:clusterPath]; @@ -2399,12 +2434,11 @@ - (NSArray *)_getAttributesToReportWithReportedValues:(NSArray<NSDictionary<NSSt // Report the attribute if a read would get a changed value. This happens // when our cached value changes and no expected value exists. if (readCacheValueChanged && !expectedValue) { - previousValue = _readCache[attributePath]; shouldReportAttribute = YES; } - // Now that we have grabbed previousValue, update the readCache with the attribute value. - _readCache[attributePath] = attributeDataValue; + // Now that we have grabbed previousValue, update our cache with the attribute value. + [self _setCachedAttributeValue:attributeDataValue forPath:attributePath]; if (!shouldReportAttribute) { // If an expected value exists, the attribute will not be reported at this time. @@ -2455,42 +2489,15 @@ - (NSArray *)_getAttributesToReportWithReportedValues:(NSArray<NSDictionary<NSSt return attributesToReport; } -- (void)_setAttributeValues:(NSArray<NSDictionary *> *)attributeValues reportChanges:(BOOL)reportChanges -{ - os_unfair_lock_assert_owner(&self->_lock); - - if (!attributeValues.count) { - return; - } - - if (reportChanges) { - [self _reportAttributes:[self _getAttributesToReportWithReportedValues:attributeValues]]; - } else { - for (NSDictionary * responseValue in attributeValues) { - MTRAttributePath * path = responseValue[MTRAttributePathKey]; - NSDictionary * dataValue = responseValue[MTRDataKey]; - _readCache[path] = dataValue; - } - } - - // If cache is set from storage and is primed with initial configuration data, then assume the client had beeen informed in the past, and mark that the callback has been called - if ([self _isCachePrimedWithInitialConfigurationData]) { - _delegateDeviceCachePrimedCalled = YES; - } -} - -- (void)setAttributeValues:(NSArray<NSDictionary *> *)attributeValues reportChanges:(BOOL)reportChanges -{ - MTR_LOG_INFO("%@ setAttributeValues count: %lu reportChanges: %d", self, static_cast<unsigned long>(attributeValues.count), reportChanges); - std::lock_guard lock(_lock); - [self _setAttributeValues:attributeValues reportChanges:reportChanges]; -} - #ifdef DEBUG - (NSUInteger)unitTestAttributeCount { std::lock_guard lock(_lock); - return _readCache.count; + NSUInteger count = 0; + for (MTRClusterPath * path in _clusterData) { + count += _clusterData[path].attributes.count; + } + return count; } #endif @@ -2503,25 +2510,12 @@ - (void)setClusterData:(NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * std::lock_guard lock(_lock); - // For each cluster, extract and create the attribute response-value for the read cache - // TODO: consider some optimization in how the read cache is structured so there's fewer conversions from this format to what's in the cache - for (MTRClusterPath * clusterPath in clusterData) { - MTRDeviceClusterData * data = clusterData[clusterPath]; - // Build and set attributes one cluster at a time to avoid creating a ton of temporary objects at a time - @autoreleasepool { - NSMutableArray * attributeValues = [NSMutableArray array]; - for (NSNumber * attributeID in data.attributes) { - MTRAttributePath * attributePath = [MTRAttributePath attributePathWithEndpointID:clusterPath.endpoint clusterID:clusterPath.cluster attributeID:attributeID]; - NSDictionary * responseValue = @{ MTRAttributePathKey : attributePath, MTRDataKey : data.attributes[attributeID] }; - [attributeValues addObject:responseValue]; - } - if (attributeValues.count) { - [self _setAttributeValues:attributeValues reportChanges:NO]; - } - } - } - [_clusterData addEntriesFromDictionary:clusterData]; + + // If cache is set from storage and is primed with initial configuration data, then assume the client had beeen informed in the past, and mark that the callback has been called + if ([self _isCachePrimedWithInitialConfigurationData]) { + _delegateDeviceCachePrimedCalled = YES; + } } - (BOOL)deviceCachePrimed @@ -2558,23 +2552,25 @@ - (void)_setExpectedValue:(NSDictionary<NSString *, id> *)expectedAttributeValue // Remove previous expected value only if it's from the same setExpectedValues operation NSNumber * previousExpectedValueID = previousExpectedValue[MTRDeviceExpectedValueFieldIDIndex]; if (previousExpectedValueID.unsignedLongLongValue == expectedValueID) { + MTRDeviceDataValueDictionary cachedValue = [self _cachedAttributeValueForPath:attributePath]; if (![self _attributeDataValue:previousExpectedValue[MTRDeviceExpectedValueFieldValueIndex] - isEqualToDataValue:_readCache[attributePath]]) { + isEqualToDataValue:cachedValue]) { // Case of removing expected value that is different than read cache - report read cache value *shouldReportValue = YES; - *attributeValueToReport = _readCache[attributePath]; + *attributeValueToReport = cachedValue; *previousValue = previousExpectedValue[MTRDeviceExpectedValueFieldValueIndex]; _expectedValueCache[attributePath] = nil; } } } } else { + MTRDeviceDataValueDictionary cachedValue = [self _cachedAttributeValueForPath:attributePath]; if (expectedAttributeValue - && ![self _attributeDataValue:expectedAttributeValue isEqualToDataValue:_readCache[attributePath]]) { + && ![self _attributeDataValue:expectedAttributeValue isEqualToDataValue:cachedValue]) { // Case where new expected value is different than read cache - report new expected value *shouldReportValue = YES; *attributeValueToReport = expectedAttributeValue; - *previousValue = _readCache[attributePath]; + *previousValue = cachedValue; } else { *previousValue = nil; } @@ -2708,7 +2704,7 @@ - (BOOL)_isCachePrimedWithInitialConfigurationData os_unfair_lock_assert_owner(&self->_lock); // Check if root node descriptor exists - NSDictionary * rootDescriptorPartsListDataValue = _readCache[[MTRAttributePath attributePathWithEndpointID:@(kRootEndpointId) clusterID:@(MTRClusterIDTypeDescriptorID) attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributePartsListID)]]; + MTRDeviceDataValueDictionary rootDescriptorPartsListDataValue = [self _cachedAttributeValueForPath:[MTRAttributePath attributePathWithEndpointID:@(kRootEndpointId) clusterID:@(MTRClusterIDTypeDescriptorID) attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributePartsListID)]]; if (!rootDescriptorPartsListDataValue || ![MTRArrayValueType isEqualToString:rootDescriptorPartsListDataValue[MTRTypeKey]]) { return NO; } @@ -2734,7 +2730,7 @@ - (BOOL)_isCachePrimedWithInitialConfigurationData MTR_LOG_ERROR("%@ unexpected parts list item value class %@", self, [endpoint class]); continue; } - NSDictionary * descriptorDeviceTypeListDataValue = _readCache[[MTRAttributePath attributePathWithEndpointID:endpoint clusterID:@(MTRClusterIDTypeDescriptorID) attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributeDeviceTypeListID)]]; + MTRDeviceDataValueDictionary descriptorDeviceTypeListDataValue = [self _cachedAttributeValueForPath:[MTRAttributePath attributePathWithEndpointID:endpoint clusterID:@(MTRClusterIDTypeDescriptorID) attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributeDeviceTypeListID)]]; if (![MTRArrayValueType isEqualToString:descriptorDeviceTypeListDataValue[MTRTypeKey]] || !descriptorDeviceTypeListDataValue[MTRValueKey]) { return NO; } diff --git a/src/darwin/Framework/CHIP/MTRDevice_Internal.h b/src/darwin/Framework/CHIP/MTRDevice_Internal.h index 57ee5446f3ba50..78e12be7053054 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_Internal.h +++ b/src/darwin/Framework/CHIP/MTRDevice_Internal.h @@ -31,12 +31,16 @@ typedef NSDictionary<NSString *, id> * MTRDeviceDataValueDictionary; typedef void (^MTRDevicePerformAsyncBlock)(MTRBaseDevice * baseDevice); /** - * Information about a cluster, currently is just data version + * Information about a cluster: data version and known attribute values. */ MTR_TESTABLE @interface MTRDeviceClusterData : NSObject <NSSecureCoding, NSCopying> -@property (nonatomic) NSNumber * dataVersion; -@property (nonatomic) NSDictionary<NSNumber *, MTRDeviceDataValueDictionary> * attributes; // attributeID => data-value dictionary +@property (nonatomic, nullable) NSNumber * dataVersion; +@property (nonatomic, readonly) NSDictionary<NSNumber *, MTRDeviceDataValueDictionary> * attributes; // attributeID => data-value dictionary + +- (void)storeValue:(MTRDeviceDataValueDictionary _Nullable)value forAttribute:(NSNumber *)attribute; + +- (nullable instancetype)initWithDataVersion:(NSNumber * _Nullable)dataVersion attributes:(NSDictionary<NSNumber *, MTRDeviceDataValueDictionary> * _Nullable)attributes; @end @interface MTRDevice () @@ -78,13 +82,8 @@ MTR_TESTABLE @property (nonatomic) dispatch_queue_t queue; @property (nonatomic, readonly) MTRAsyncWorkQueue<MTRDevice *> * asyncWorkQueue; -// Method to insert attribute values -// attributeValues : array of response-value dictionaries with non-null MTRAttributePathKey value -// reportChanges : if set to YES, attribute reports will also sent to the delegate if new values are different -- (void)setAttributeValues:(NSArray<NSDictionary *> *)attributeValues reportChanges:(BOOL)reportChanges; - // Method to insert cluster data -// Currently contains data version information +// Contains data version information and attribute values. - (void)setClusterData:(NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)clusterData; #ifdef DEBUG diff --git a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m index bea49d957653c7..cce918d5fd410c 100644 --- a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m +++ b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m @@ -1093,27 +1093,21 @@ - (void)test008_TestDataStoreDirect XCTAssertEqualObjects(controller.controllerNodeID, nodeID); - MTRDeviceClusterData * testClusterData1 = [[MTRDeviceClusterData alloc] init]; - testClusterData1.dataVersion = @(1); - testClusterData1.attributes = @{ + MTRDeviceClusterData * testClusterData1 = [[MTRDeviceClusterData alloc] initWithDataVersion:@(1) attributes:@{ @(1) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(111) }, @(2) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(112) }, @(3) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(113) }, - }; - MTRDeviceClusterData * testClusterData2 = [[MTRDeviceClusterData alloc] init]; - testClusterData2.dataVersion = @(2); - testClusterData2.attributes = @{ + }]; + MTRDeviceClusterData * testClusterData2 = [[MTRDeviceClusterData alloc] initWithDataVersion:@(2) attributes:@{ @(1) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(121) }, @(2) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(122) }, @(3) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(123) }, - }; - MTRDeviceClusterData * testClusterData3 = [[MTRDeviceClusterData alloc] init]; - testClusterData3.dataVersion = @(3); - testClusterData3.attributes = @{ + }]; + MTRDeviceClusterData * testClusterData3 = [[MTRDeviceClusterData alloc] initWithDataVersion:@(3) attributes:@{ @(1) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(211) }, @(2) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(212) }, @(3) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(213) }, - }; + }]; NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * testClusterData = @{ [MTRClusterPath clusterPathWithEndpointID:@(1) clusterID:@(1)] : testClusterData1, [MTRClusterPath clusterPathWithEndpointID:@(1) clusterID:@(2)] : testClusterData2, @@ -1228,45 +1222,35 @@ - (void)test008_TestDataStoreDirect // Now test bulk write MTRClusterPath * bulkTestClusterPath11 = [MTRClusterPath clusterPathWithEndpointID:@(1) clusterID:@(1)]; - MTRDeviceClusterData * bulkTestClusterData11 = [[MTRDeviceClusterData alloc] init]; - bulkTestClusterData11.dataVersion = @(11); - bulkTestClusterData11.attributes = @{ + MTRDeviceClusterData * bulkTestClusterData11 = [[MTRDeviceClusterData alloc] initWithDataVersion:@(11) attributes:@{ @(1) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(111) }, @(2) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(112) }, @(3) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(113) }, - }; + }]; MTRClusterPath * bulkTestClusterPath12 = [MTRClusterPath clusterPathWithEndpointID:@(1) clusterID:@(2)]; - MTRDeviceClusterData * bulkTestClusterData12 = [[MTRDeviceClusterData alloc] init]; - bulkTestClusterData12.dataVersion = @(12); - bulkTestClusterData12.attributes = @{ + MTRDeviceClusterData * bulkTestClusterData12 = [[MTRDeviceClusterData alloc] initWithDataVersion:@(12) attributes:@{ @(1) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(121) }, @(2) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(122) }, @(3) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(123) }, - }; + }]; MTRClusterPath * bulkTestClusterPath13 = [MTRClusterPath clusterPathWithEndpointID:@(1) clusterID:@(3)]; - MTRDeviceClusterData * bulkTestClusterData13 = [[MTRDeviceClusterData alloc] init]; - bulkTestClusterData13.dataVersion = @(13); - bulkTestClusterData13.attributes = @{ + MTRDeviceClusterData * bulkTestClusterData13 = [[MTRDeviceClusterData alloc] initWithDataVersion:@(13) attributes:@{ @(1) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(131) }, @(2) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(132) }, @(3) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(133) }, - }; + }]; MTRClusterPath * bulkTestClusterPath21 = [MTRClusterPath clusterPathWithEndpointID:@(2) clusterID:@(1)]; - MTRDeviceClusterData * bulkTestClusterData21 = [[MTRDeviceClusterData alloc] init]; - bulkTestClusterData21.dataVersion = @(21); - bulkTestClusterData21.attributes = @{ + MTRDeviceClusterData * bulkTestClusterData21 = [[MTRDeviceClusterData alloc] initWithDataVersion:@(21) attributes:@{ @(1) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(211) }, @(2) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(212) }, @(3) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(213) }, - }; + }]; MTRClusterPath * bulkTestClusterPath22 = [MTRClusterPath clusterPathWithEndpointID:@(2) clusterID:@(2)]; - MTRDeviceClusterData * bulkTestClusterData22 = [[MTRDeviceClusterData alloc] init]; - bulkTestClusterData22.dataVersion = @(22); - bulkTestClusterData22.attributes = @{ + MTRDeviceClusterData * bulkTestClusterData22 = [[MTRDeviceClusterData alloc] initWithDataVersion:@(22) attributes:@{ @(1) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(221) }, @(2) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(222) }, @(3) : @ { MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : @(223) }, - }; + }]; NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * bulkTestClusterDataDictionary = @{ bulkTestClusterPath11 : bulkTestClusterData11, bulkTestClusterPath12 : bulkTestClusterData12, From 93a8cedb0654791bbb7583564a2015d16df77865 Mon Sep 17 00:00:00 2001 From: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> Date: Tue, 23 Apr 2024 21:35:53 -0400 Subject: [PATCH 013/124] Replace old define with new one. Removed semaphore release call in pre lcd spi transfer and as it should be released in post lcd spi transfer. Adjust usart settings when spi mux isn't used (#33123) Co-authored-by: SenthilKumar Edaikkalpadi Kannusamy <Senthil.Kumar@silabs.com> --- examples/platform/silabs/efr32/rs911x/hal/efx32_ncp_host.c | 3 +++ .../platform/silabs/efr32/rs911x/hal/sl_si91x_ncp_utility.c | 4 ---- src/platform/silabs/rs911x/rsi_ble_config.h | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/examples/platform/silabs/efr32/rs911x/hal/efx32_ncp_host.c b/examples/platform/silabs/efr32/rs911x/hal/efx32_ncp_host.c index b48d72cdc00aee..fded8defa30dce 100644 --- a/examples/platform/silabs/efr32/rs911x/hal/efx32_ncp_host.c +++ b/examples/platform/silabs/efr32/rs911x/hal/efx32_ncp_host.c @@ -111,6 +111,9 @@ static void efx32_spi_init(void) // Enable USART interface pins GPIO->USARTROUTE[SPI_USART_ROUTE_INDEX].ROUTEEN = GPIO_USART_ROUTEEN_RXPEN | // MISO GPIO_USART_ROUTEEN_TXPEN | // MOSI +#if !SL_SPICTRL_MUX + GPIO_USART_ROUTEEN_CSPEN | +#endif GPIO_USART_ROUTEEN_CLKPEN; // Set slew rate for alternate usage pins diff --git a/examples/platform/silabs/efr32/rs911x/hal/sl_si91x_ncp_utility.c b/examples/platform/silabs/efr32/rs911x/hal/sl_si91x_ncp_utility.c index 14e47f43f99f5d..4b876883c12b0f 100644 --- a/examples/platform/silabs/efr32/rs911x/hal/sl_si91x_ncp_utility.c +++ b/examples/platform/silabs/efr32/rs911x/hal/sl_si91x_ncp_utility.c @@ -88,9 +88,6 @@ sl_status_t sl_wfx_host_pre_lcd_spi_transfer(void) { SPIDRV_SetBaudrate(SL_SPIDRV_LCD_BITRATE); } -#if SL_SPICTRL_MUX - xSemaphoreGive(spi_sem_sync_hdl); -#endif // SL_SPICTRL_MUX return status; } @@ -122,7 +119,6 @@ void SPIDRV_SetBaudrate(uint32_t baudrate) USART_InitSync(SPI_USART, &usartInit); } } - /******************************************************** * @fn spi_board_init(void) * @brief diff --git a/src/platform/silabs/rs911x/rsi_ble_config.h b/src/platform/silabs/rs911x/rsi_ble_config.h index c5a07e25ed12d2..f5442578e5d013 100644 --- a/src/platform/silabs/rs911x/rsi_ble_config.h +++ b/src/platform/silabs/rs911x/rsi_ble_config.h @@ -273,7 +273,7 @@ (SL_SI91X_TCP_IP_FEAT_DHCPV4_CLIENT) //! TCP/IP feature select bitmap for selecting TCP/IP features #define RSI_CUSTOM_FEATURE_BIT_MAP SL_SI91X_CUSTOM_FEAT_EXTENTION_VALID //! To set custom feature select bit map -#ifdef CHIP_9117 +#ifdef SLI_SI917 #if WIFI_ENABLE_SECURITY_WPA3_TRANSITION // Adding Support for WPA3 transition #define RSI_EXT_CUSTOM_FEATURE_BIT_MAP \ (SL_SI91X_EXT_FEAT_LOW_POWER_MODE | SL_SI91X_EXT_FEAT_XTAL_CLK_ENABLE(1) | SL_SI91X_RAM_LEVEL_NWP_BASIC_MCU_ADV | \ @@ -285,7 +285,7 @@ #endif /* WIFI_ENABLE_SECURITY_WPA3_TRANSITION */ #else // EXP_BOARD #define RSI_EXT_CUSTOM_FEATURE_BIT_MAP (SL_SI91X_EXT_FEAT_LOW_POWER_MODE | SL_SI91X_EXT_FEAT_XTAL_CLK_ENABLE(2)) -#endif /* CHIP_9117 */ +#endif /* SLI_SI917 */ #define RSI_EXT_TCPIP_FEATURE_BITMAP 0 #define RSI_BT_FEATURE_BITMAP (SL_SI91X_BT_RF_TYPE | SL_SI91X_ENABLE_BLE_PROTOCOL) From 88595f01296d4c0830b1a714d77143d44f34997a Mon Sep 17 00:00:00 2001 From: Andrei Litvin <andy314@gmail.com> Date: Tue, 23 Apr 2024 21:40:50 -0400 Subject: [PATCH 014/124] Create a DNSSD test program for custom packet broadcast (#33106) * Minmdns test program * Update copyright years * Adjust buffer size * Adjust buffer sizes --------- Co-authored-by: Andrei Litvin <andreilitvin@google.com> --- examples/minimal-mdns/BUILD.gn | 16 ++ examples/minimal-mdns/client.cpp | 8 +- examples/minimal-mdns/server.cpp | 8 +- examples/minimal-mdns/tester.cpp | 303 +++++++++++++++++++++++++++++++ 4 files changed, 327 insertions(+), 8 deletions(-) create mode 100644 examples/minimal-mdns/tester.cpp diff --git a/examples/minimal-mdns/BUILD.gn b/examples/minimal-mdns/BUILD.gn index 372f5598339168..3ad5761229b85e 100644 --- a/examples/minimal-mdns/BUILD.gn +++ b/examples/minimal-mdns/BUILD.gn @@ -31,6 +31,21 @@ static_library("minimal-mdns-example-common") { ] } +executable("minimal-mdns-tester") { + sources = [ "tester.cpp" ] + + deps = [ + ":minimal-mdns-example-common", + "${chip_root}/examples/common/tracing:commandline", + "${chip_root}/src/lib", + "${chip_root}/src/lib/dnssd/minimal_mdns", + ] + + cflags = [ "-Wconversion" ] + + output_dir = root_out_dir +} + executable("minimal-mdns-client") { sources = [ "client.cpp" ] @@ -83,5 +98,6 @@ group("default") { ":minimal-mdns-client", ":minimal-mdns-example-common", ":minimal-mdns-server", + ":minimal-mdns-tester", ] } diff --git a/examples/minimal-mdns/client.cpp b/examples/minimal-mdns/client.cpp index 81d2b6754b7250..240c373e6b10fd 100644 --- a/examples/minimal-mdns/client.cpp +++ b/examples/minimal-mdns/client.cpp @@ -185,10 +185,10 @@ class ReportDelegate : public mdns::Minimal::ServerDelegate public: void OnQuery(const mdns::Minimal::BytesRange & data, const chip::Inet::IPPacketInfo * info) override { - char addr[32]; + char addr[Inet::IPAddress::kMaxStringLength]; info->SrcAddress.ToString(addr, sizeof(addr)); - char ifName[64]; + char ifName[Inet::InterfaceId::kMaxIfNameLength]; VerifyOrDie(info->Interface.GetInterfaceName(ifName, sizeof(ifName)) == CHIP_NO_ERROR); printf("QUERY from: %-15s on port %d, via interface %s\n", addr, info->SrcPort, ifName); @@ -197,10 +197,10 @@ class ReportDelegate : public mdns::Minimal::ServerDelegate void OnResponse(const mdns::Minimal::BytesRange & data, const chip::Inet::IPPacketInfo * info) override { - char addr[32]; + char addr[Inet::IPAddress::kMaxStringLength]; info->SrcAddress.ToString(addr, sizeof(addr)); - char ifName[64]; + char ifName[Inet::InterfaceId::kMaxIfNameLength]; VerifyOrDie(info->Interface.GetInterfaceName(ifName, sizeof(ifName)) == CHIP_NO_ERROR); printf("RESPONSE from: %-15s on port %d, via interface %s\n", addr, info->SrcPort, ifName); diff --git a/examples/minimal-mdns/server.cpp b/examples/minimal-mdns/server.cpp index c445b397034c25..1b8ca0dd769c24 100644 --- a/examples/minimal-mdns/server.cpp +++ b/examples/minimal-mdns/server.cpp @@ -126,10 +126,10 @@ class ReplyDelegate : public mdns::Minimal::ServerDelegate, public mdns::Minimal void OnQuery(const mdns::Minimal::BytesRange & data, const Inet::IPPacketInfo * info) override { - char addr[INET6_ADDRSTRLEN]; + char addr[Inet::IPAddress::kMaxStringLength]; info->SrcAddress.ToString(addr, sizeof(addr)); - char ifName[64]; + char ifName[Inet::InterfaceId::kMaxIfNameLength]; VerifyOrDie(info->Interface.GetInterfaceName(ifName, sizeof(ifName)) == CHIP_NO_ERROR); printf("QUERY from: %-15s on port %d, via interface %s\n", addr, info->SrcPort, ifName); @@ -145,10 +145,10 @@ class ReplyDelegate : public mdns::Minimal::ServerDelegate, public mdns::Minimal void OnResponse(const mdns::Minimal::BytesRange & data, const Inet::IPPacketInfo * info) override { - char addr[INET6_ADDRSTRLEN]; + char addr[Inet::IPAddress::kMaxStringLength]; info->SrcAddress.ToString(addr, sizeof(addr)); - char ifName[64]; + char ifName[Inet::InterfaceId::kMaxIfNameLength]; VerifyOrDie(info->Interface.GetInterfaceName(ifName, sizeof(ifName)) == CHIP_NO_ERROR); printf("RESPONSE from: %-15s on port %d, via interface %s\n", addr, info->SrcPort, ifName); diff --git a/examples/minimal-mdns/tester.cpp b/examples/minimal-mdns/tester.cpp new file mode 100644 index 00000000000000..c191f63943e70b --- /dev/null +++ b/examples/minimal-mdns/tester.cpp @@ -0,0 +1,303 @@ +/* + * + * Copyright (c) 2020-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. + */ + +#include <cstdint> +#include <cstdio> +#include <memory> + +#include <TracingCommandLineArgument.h> +#include <inet/InetInterface.h> +#include <inet/UDPEndPoint.h> +#include <lib/dnssd/MinimalMdnsServer.h> +#include <lib/dnssd/ServiceNaming.h> +#include <lib/dnssd/minimal_mdns/AddressPolicy.h> +#include <lib/dnssd/minimal_mdns/ResponseBuilder.h> +#include <lib/dnssd/minimal_mdns/Server.h> +#include <lib/dnssd/minimal_mdns/core/QName.h> +#include <lib/dnssd/minimal_mdns/records/IP.h> +#include <lib/dnssd/minimal_mdns/records/Ptr.h> +#include <lib/dnssd/minimal_mdns/records/Srv.h> +#include <lib/dnssd/minimal_mdns/records/Txt.h> +#include <lib/support/CHIPArgParser.hpp> +#include <lib/support/CHIPMem.h> +#include <platform/CHIPDeviceLayer.h> +#include <system/SystemPacketBuffer.h> + +#include "PacketReporter.h" + +using namespace chip; + +namespace { + +enum class TestType +{ + kSrv, +}; + +struct Options +{ + uint32_t runtimeMs = 500; + uint16_t listenPort = 5353; + TestType type = TestType::kSrv; +} gOptions; + +constexpr size_t kMdnsMaxPacketSize = 1'024; + +using namespace chip::ArgParser; + +constexpr uint16_t kOptionType = 't'; + +// non-ascii options have no short option version +constexpr uint16_t kOptionListenPort = 0x100; +constexpr uint16_t kOptionRuntimeMs = 0x102; +constexpr uint16_t kOptionTraceTo = 0x104; + +// Only used for argument parsing. Tracing setup owned by the main loop. +chip::CommandLineApp::TracingSetup * tracing_setup_for_argparse = nullptr; + +bool HandleOptions(const char * aProgram, OptionSet * aOptions, int aIdentifier, const char * aName, const char * aValue) +{ + switch (aIdentifier) + { + case kOptionListenPort: + if (!ParseInt(aValue, gOptions.listenPort)) + { + PrintArgError("%s: invalid value for listen port: %s\n", aProgram, aValue); + return false; + } + return true; + case kOptionTraceTo: + tracing_setup_for_argparse->EnableTracingFor(aValue); + return true; + case kOptionType: + if (strcasecmp(aValue, "SRV") == 0) + { + gOptions.type = TestType::kSrv; + } + else + { + PrintArgError("%s: invalid value for query type: %s\n", aProgram, aValue); + return false; + } + return true; + + case kOptionRuntimeMs: + if (!ParseInt(aValue, gOptions.runtimeMs)) + { + PrintArgError("%s: invalid value for runtime ms: %s\n", aProgram, aValue); + return false; + } + return true; + default: + PrintArgError("%s: INTERNAL ERROR: Unhandled option: %s\n", aProgram, aName); + return false; + } +} + +OptionDef cmdLineOptionsDef[] = { + { "listen-port", kArgumentRequired, kOptionListenPort }, + { "type", kArgumentRequired, kOptionType }, + { "timeout-ms", kArgumentRequired, kOptionRuntimeMs }, + { "trace-to", kArgumentRequired, kOptionTraceTo }, + {}, +}; + +OptionSet cmdLineOptions = { HandleOptions, cmdLineOptionsDef, "PROGRAM OPTIONS", + " --listen-port <number>\n" + " The port number to listen on\n" + " -t\n" + " --type\n" + " The packet to test with: \n" + " --timeout-ms\n" + " How long to wait for replies\n" + " --trace-to <dest>\n" + " trace to the given destination (supported: " SUPPORTED_COMMAND_LINE_TRACING_TARGETS ").\n" + "\n" }; + +HelpOptions helpOptions("minimal-mdns-tester", "Usage: minimal-mdns-tester [options]", "1.0"); + +OptionSet * allOptions[] = { &cmdLineOptions, &helpOptions, nullptr }; + +class ReportDelegate : public mdns::Minimal::ServerDelegate +{ +public: + void OnQuery(const mdns::Minimal::BytesRange & data, const chip::Inet::IPPacketInfo * info) override + { + char addr[Inet::IPAddress::kMaxStringLength]; + info->SrcAddress.ToString(addr, sizeof(addr)); + + char ifName[Inet::InterfaceId::kMaxIfNameLength]; + VerifyOrDie(info->Interface.GetInterfaceName(ifName, sizeof(ifName)) == CHIP_NO_ERROR); + + printf("QUERY from: %-15s on port %d, via interface %s\n", addr, info->SrcPort, ifName); + Report("QUERY: ", data); + } + + void OnResponse(const mdns::Minimal::BytesRange & data, const chip::Inet::IPPacketInfo * info) override + { + char addr[Inet::IPAddress::kMaxStringLength]; + info->SrcAddress.ToString(addr, sizeof(addr)); + + char ifName[Inet::InterfaceId::kMaxIfNameLength]; + VerifyOrDie(info->Interface.GetInterfaceName(ifName, sizeof(ifName)) == CHIP_NO_ERROR); + + printf("RESPONSE from: %-15s on port %d, via interface %s\n", addr, info->SrcPort, ifName); + Report("RESPONSE: ", data); + } + +private: + void Report(const char * prefix, const mdns::Minimal::BytesRange & data) + { + MdnsExample::PacketReporter reporter(prefix, data); + if (!mdns::Minimal::ParsePacket(data, &reporter)) + { + printf("INVALID PACKET!!!!!!\n"); + } + } +}; + +System::PacketBufferHandle BuildSrvTestPacket() +{ + System::PacketBufferHandle packet = System::PacketBufferHandle::New(kMdnsMaxPacketSize); + VerifyOrReturnValue(!packet.IsNull(), packet); + + mdns::Minimal::ResponseBuilder builder(std::move(packet)); + + constexpr uint16_t kSrvPort = 5540; + constexpr const char * kNodeName = "ABCD1234ABCD1234"; + constexpr const char * kNodeFabricName = "ABCD1234ABCD1234-0000000000000001"; + constexpr mdns::Minimal::QNamePart kServiceName[] = { Dnssd::kOperationalServiceName, Dnssd::kOperationalProtocol, + Dnssd::kLocalDomain }; + constexpr mdns::Minimal::QNamePart kServerFullName[] = { kNodeFabricName, Dnssd::kOperationalServiceName, + Dnssd::kOperationalProtocol, Dnssd::kLocalDomain }; + constexpr mdns::Minimal::QNamePart kServerName[] = { kNodeName, Dnssd::kLocalDomain }; + + mdns::Minimal::PtrResourceRecord ptrRecord(kServiceName, kServerFullName); + mdns::Minimal::SrvResourceRecord srvRecord(kServerFullName, kServerName, kSrvPort); + srvRecord.SetCacheFlush(true); + + builder.AddRecord(mdns::Minimal::ResourceType::kAnswer, ptrRecord); + builder.AddRecord(mdns::Minimal::ResourceType::kAnswer, srvRecord); + + if (!builder.Ok()) + { + printf("Failed to build response packet for SRV (maybe out of space?)\n"); + return System::PacketBufferHandle(); + } + + return builder.ReleasePacket(); +} + +System::PacketBufferHandle BuildTestPacket(TestType type) +{ + switch (type) + { + case TestType::kSrv: + return BuildSrvTestPacket(); + default: + return System::PacketBufferHandle(); + } +} + +void BroadcastPacket(mdns::Minimal::ServerBase * server) +{ + System::PacketBufferHandle buffer = BuildTestPacket(gOptions.type); + VerifyOrDie(!buffer.IsNull()); + + CHIP_ERROR err = server->BroadcastSend(std::move(buffer), 5353); + if (err != CHIP_NO_ERROR) + { + printf("Error sending: %" CHIP_ERROR_FORMAT "\n", err.Format()); + return; + } +} + +mdns::Minimal::Server<20> gMdnsServer; + +} // namespace + +int main(int argc, char ** args) +{ + if (Platform::MemoryInit() != CHIP_NO_ERROR) + { + printf("FAILED to initialize memory"); + return 1; + } + + if (DeviceLayer::PlatformMgr().InitChipStack() != CHIP_NO_ERROR) + { + printf("FAILED to initialize chip stack"); + return 1; + } + + chip::CommandLineApp::TracingSetup tracing_setup; + + tracing_setup_for_argparse = &tracing_setup; + if (!chip::ArgParser::ParseArgs(args[0], argc, args, allOptions)) + { + return 1; + } + tracing_setup_for_argparse = nullptr; + + printf("Running...\n"); + + ReportDelegate reporter; + CHIP_ERROR err; + + // This forces the global MDNS instance to be loaded in, effectively setting + // built in policies for addresses. + (void) chip::Dnssd::GlobalMinimalMdnsServer::Instance(); + + gMdnsServer.SetDelegate(&reporter); + + { + auto endpoints = mdns::Minimal::GetAddressPolicy()->GetListenEndpoints(); + + err = gMdnsServer.Listen(chip::DeviceLayer::UDPEndPointManager(), endpoints.get(), gOptions.listenPort); + if (err != CHIP_NO_ERROR) + { + printf("Server failed to listen on all interfaces: %s\n", chip::ErrorStr(err)); + return 1; + } + } + + BroadcastPacket(&gMdnsServer); + + err = DeviceLayer::SystemLayer().StartTimer( + chip::System::Clock::Milliseconds32(gOptions.runtimeMs), + [](System::Layer *, void *) { + // Close all sockets BEFORE system layer is shut down, otherwise + // attempts to free UDP sockets with system layer down will segfault + gMdnsServer.Shutdown(); + + DeviceLayer::PlatformMgr().StopEventLoopTask(); + }, + nullptr); + if (err != CHIP_NO_ERROR) + { + printf("Failed to create the shutdown timer. Kill with ^C. %" CHIP_ERROR_FORMAT "\n", err.Format()); + } + + DeviceLayer::PlatformMgr().RunEventLoop(); + + tracing_setup.StopTracing(); + DeviceLayer::PlatformMgr().Shutdown(); + Platform::MemoryShutdown(); + + printf("Done...\n"); + return 0; +} From 17c82851996ad802f89daa39f368fed25868166c Mon Sep 17 00:00:00 2001 From: Boris Zbarsky <bzbarsky@apple.com> Date: Tue, 23 Apr 2024 21:44:16 -0400 Subject: [PATCH 015/124] Use NSCache for the MTRDevice attribute cache when possible. (#33125) * Use NSCache for the MTRDevice attribute cache when possible. When we are storing our cluster data persistently, we don't have to ensure it's pinned in memory all the time. Use NSCache, and reload from storage as needed. * Update src/darwin/Framework/CHIP/MTRDevice.mm Co-authored-by: Jeff Tung <100387939+jtung-apple@users.noreply.github.com> * Update src/darwin/Framework/CHIP/MTRDevice.mm Co-authored-by: Jeff Tung <100387939+jtung-apple@users.noreply.github.com> --------- Co-authored-by: Justin Wood <woody@apple.com> Co-authored-by: Jeff Tung <100387939+jtung-apple@users.noreply.github.com> --- src/darwin/Framework/CHIP/MTRDevice.mm | 186 +++++++++++++----- .../Framework/CHIP/MTRDeviceController.mm | 4 +- .../CHIP/MTRDeviceControllerDataStore.h | 1 + .../CHIP/MTRDeviceControllerDataStore.mm | 12 ++ .../Framework/CHIP/MTRDevice_Internal.h | 4 +- .../Framework/CHIPTests/MTRDeviceTests.m | 31 ++- .../CHIPTests/MTRSwiftDeviceTests.swift | 74 ++++++- .../TestHelpers/MTRTestDeclarations.h | 1 + 8 files changed, 243 insertions(+), 70 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRDevice.mm b/src/darwin/Framework/CHIP/MTRDevice.mm index 7c02df267a8ad7..1516edc300e23c 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.mm +++ b/src/darwin/Framework/CHIP/MTRDevice.mm @@ -361,10 +361,17 @@ @implementation MTRDevice { #endif BOOL _delegateDeviceCachePrimedCalled; - // With MTRDeviceClusterData now able to hold attribute data, the plan is to move to using it - // as the read cache, should testing prove attribute storage by cluster is the better solution. - NSMutableDictionary<MTRClusterPath *, MTRDeviceClusterData *> * _clusterData; - NSMutableSet<MTRClusterPath *> * _clustersToPersist; + // _persistedClusterData stores data that we have already persisted (when we have + // cluster data persistence enabled). Nil when we have no persistence enabled. + NSCache<MTRClusterPath *, MTRDeviceClusterData *> * _Nullable _persistedClusterData; + // _clusterDataToPersist stores data that needs to be persisted. If we + // don't have persistence enabled, this is our only data store. Nil if we + // currently have nothing that could need persisting. + NSMutableDictionary<MTRClusterPath *, MTRDeviceClusterData *> * _Nullable _clusterDataToPersist; + // _persistedClusters stores the set of "valid" keys into _persistedClusterData. + // These are keys that could have values in _persistedClusterData even if they don't + // right now (because they have been evicted). + NSMutableSet<MTRClusterPath *> * _persistedClusters; // When we last failed to subscribe to the device (either via // _setupSubscription or via the auto-resubscribe behavior of the @@ -387,7 +394,13 @@ - (instancetype)initWithNodeID:(NSNumber *)nodeID controller:(MTRDeviceControlle _asyncWorkQueue = [[MTRAsyncWorkQueue alloc] initWithContext:self]; _state = MTRDeviceStateUnknown; _internalDeviceState = MTRInternalDeviceStateUnsubscribed; - _clusterData = [NSMutableDictionary dictionary]; + if (controller.controllerDataStore) { + _persistedClusterData = [[NSCache alloc] init]; + } else { + _persistedClusterData = nil; + } + _clusterDataToPersist = nil; + _persistedClusters = [NSMutableSet set]; MTR_LOG_INFO("%@ init with hex nodeID 0x%016llX", self, _nodeID.unsignedLongLongValue); } return self; @@ -1034,12 +1047,12 @@ - (void)_handleReportBegin } } -- (NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)_copiedClusterDataForPaths:(NSSet<MTRClusterPath *> *)clusterPaths +- (NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)_clusterDataToPersistSnapshot { os_unfair_lock_assert_owner(&self->_lock); NSMutableDictionary * clusterDataToReturn = [NSMutableDictionary dictionary]; - for (MTRClusterPath * clusterPath in clusterPaths) { - clusterDataToReturn[clusterPath] = [_clusterData[clusterPath] copy]; + for (MTRClusterPath * clusterPath in _clusterDataToPersist) { + clusterDataToReturn[clusterPath] = [_clusterDataToPersist[clusterPath] copy]; } return clusterDataToReturn; @@ -1053,14 +1066,28 @@ - (void)_handleReportEnd _estimatedStartTimeFromGeneralDiagnosticsUpTime = nil; BOOL dataStoreExists = _deviceController.controllerDataStore != nil; - if (dataStoreExists && _clustersToPersist.count) { - MTR_LOG_DEFAULT("%@ Storing cluster information (data version) count: %lu", self, static_cast<unsigned long>(_clustersToPersist.count)); + if (dataStoreExists && _clusterDataToPersist != nil && _clusterDataToPersist.count) { + MTR_LOG_DEFAULT("%@ Storing cluster information (data version and attributes) count: %lu", self, static_cast<unsigned long>(_clusterDataToPersist.count)); // We're going to hand out these MTRDeviceClusterData objects to our // storage implementation, which will try to read them later. Make sure // we snapshot the state here instead of handing out live copies. - NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * clusterData = [self _copiedClusterDataForPaths:_clustersToPersist]; + NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> * clusterData = [self _clusterDataToPersistSnapshot]; [_deviceController.controllerDataStore storeClusterData:clusterData forNodeID:_nodeID]; - _clustersToPersist = nil; + for (MTRClusterPath * clusterPath in _clusterDataToPersist) { + [_persistedClusterData setObject:_clusterDataToPersist[clusterPath] forKey:clusterPath]; + [_persistedClusters addObject:clusterPath]; + } + + // TODO: There is one edge case not handled well here: if the + // storeClusterData call above fails somehow, and then the data gets + // evicted from _persistedClusterData, we could end up in a situation + // where when we page things in from storage we have stale values and + // hence effectively lose the delta that we failed to persist. + // + // The only way to handle this would be to detect it when it happens, + // then re-subscribe at that point, which would cause the relevant data + // to be sent to us via the priming read. + _clusterDataToPersist = nil; } // For unit testing only @@ -1205,13 +1232,75 @@ - (void)_handleEventReport:(NSArray<NSDictionary<NSString *, id> *> *)eventRepor } } +#ifdef DEBUG +- (void)unitTestClearClusterData +{ + std::lock_guard lock(_lock); + NSAssert(_persistedClusterData != nil, @"Test is not going to test what it thinks is testing!"); + [_persistedClusterData removeAllObjects]; +} +#endif + +- (nullable MTRDeviceClusterData *)_clusterDataForPath:(MTRClusterPath *)clusterPath +{ + os_unfair_lock_assert_owner(&self->_lock); + + if (_clusterDataToPersist != nil) { + // Use the "dirty" values, if we have them. + MTRDeviceClusterData * data = _clusterDataToPersist[clusterPath]; + if (data != nil) { + return data; + } + } + + if (_persistedClusterData != nil) { + MTRDeviceClusterData * data = [_persistedClusterData objectForKey:clusterPath]; + if (data != nil) { + return data; + } + } + + if (![_persistedClusters containsObject:clusterPath]) { + // We are not expected to have this cluster, so no point in paging it in + // loading it from storage. + return nil; + } + + NSAssert(_deviceController.controllerDataStore != nil, + @"How can _persistedClusters have an entry if we have no persistence?"); + NSAssert(_persistedClusterData != nil, + @"How can _persistedClusterData not exist if we have persisted clusters?"); + + // Page in the stored value for the data. + MTRDeviceClusterData * data = [_deviceController.controllerDataStore getStoredClusterDataForNodeID:_nodeID endpointID:clusterPath.endpoint clusterID:clusterPath.cluster]; + if (data != nil) { + [_persistedClusterData setObject:data forKey:clusterPath]; + } + + return data; +} + +- (NSSet<MTRClusterPath *> *)_knownClusters +{ + os_unfair_lock_assert_owner(&self->_lock); + + // We might have some clusters that have not been persisted at all yet, and + // some that have been persisted but are still present in + // _clusterDataToPersist because they have been modified since then. + NSMutableSet<MTRClusterPath *> * clusterPaths = [_persistedClusters mutableCopy]; + if (_clusterDataToPersist != nil) { + [clusterPaths unionSet:[NSSet setWithArray:[_clusterDataToPersist allKeys]]]; + } + return clusterPaths; +} + - (NSDictionary<MTRClusterPath *, NSNumber *> *)_getCachedDataVersions { NSMutableDictionary<MTRClusterPath *, NSNumber *> * dataVersions = [NSMutableDictionary dictionary]; std::lock_guard lock(_lock); - for (MTRClusterPath * path in _clusterData) { - dataVersions[path] = _clusterData[path].dataVersion; + for (MTRClusterPath * path in [self _knownClusters]) { + dataVersions[path] = [self _clusterDataForPath:path].dataVersion; } MTR_LOG_INFO("%@ _getCachedDataVersions dataVersions count: %lu", self, static_cast<unsigned long>(dataVersions.count)); @@ -1223,10 +1312,10 @@ - (MTRDeviceDataValueDictionary _Nullable)_cachedAttributeValueForPath:(MTRAttri { os_unfair_lock_assert_owner(&self->_lock); - // We need an MTRClusterPath to do the lookup in _clusterData. + // We need an actual MTRClusterPath, not a subsclass, to do _clusterDataForPath. auto * clusterPath = [MTRClusterPath clusterPathWithEndpointID:path.endpoint clusterID:path.cluster]; - MTRDeviceClusterData * clusterData = _clusterData[clusterPath]; + MTRDeviceClusterData * clusterData = [self _clusterDataForPath:clusterPath]; if (clusterData == nil) { return nil; } @@ -1238,10 +1327,10 @@ - (void)_setCachedAttributeValue:(MTRDeviceDataValueDictionary _Nullable)value f { os_unfair_lock_assert_owner(&self->_lock); - // We need an MTRClusterPath to do the lookup in _clusterData. + // We need an actual MTRClusterPath, not a subsclass, to do _clusterDataForPath. auto * clusterPath = [MTRClusterPath clusterPathWithEndpointID:path.endpoint clusterID:path.cluster]; - MTRDeviceClusterData * clusterData = _clusterData[clusterPath]; + MTRDeviceClusterData * clusterData = [self _clusterDataForPath:clusterPath]; if (clusterData == nil) { if (value == nil) { // Nothing to do. @@ -1249,10 +1338,14 @@ - (void)_setCachedAttributeValue:(MTRDeviceDataValueDictionary _Nullable)value f } clusterData = [[MTRDeviceClusterData alloc] init]; - _clusterData[clusterPath] = clusterData; } [clusterData storeValue:value forAttribute:path.attribute]; + + if (_clusterDataToPersist == nil) { + _clusterDataToPersist = [NSMutableDictionary dictionary]; + } + _clusterDataToPersist[clusterPath] = clusterData; } - (void)_createDataVersionFilterListFromDictionary:(NSDictionary<MTRClusterPath *, NSNumber *> *)dataVersions dataVersionFilterList:(DataVersionFilter **)dataVersionFilterList count:(size_t *)count sizeReduction:(size_t)sizeReduction @@ -2333,10 +2426,9 @@ - (void)_noteDataVersion:(NSNumber *)dataVersion forClusterPath:(MTRClusterPath BOOL dataVersionChanged = NO; // Update data version used for subscription filtering - MTRDeviceClusterData * clusterData = _clusterData[clusterPath]; + MTRDeviceClusterData * clusterData = [self _clusterDataForPath:clusterPath]; if (!clusterData) { clusterData = [[MTRDeviceClusterData alloc] initWithDataVersion:dataVersion attributes:nil]; - _clusterData[clusterPath] = clusterData; dataVersionChanged = YES; } else if (![clusterData.dataVersion isEqualToNumber:dataVersion]) { clusterData.dataVersion = dataVersion; @@ -2344,25 +2436,13 @@ - (void)_noteDataVersion:(NSNumber *)dataVersion forClusterPath:(MTRClusterPath } if (dataVersionChanged) { - // Mark cluster path as needing persistence if needed - BOOL dataStoreExists = _deviceController.controllerDataStore != nil; - if (dataStoreExists) { - [self _noteChangeForClusterPath:clusterPath]; + if (_clusterDataToPersist == nil) { + _clusterDataToPersist = [NSMutableDictionary dictionary]; } + _clusterDataToPersist[clusterPath] = clusterData; } } -// Assuming data store exists, note that the cluster should be persisted at onReportEnd -- (void)_noteChangeForClusterPath:(MTRClusterPath *)clusterPath -{ - os_unfair_lock_assert_owner(&self->_lock); - - if (!_clustersToPersist) { - _clustersToPersist = [NSMutableSet set]; - } - [_clustersToPersist addObject:clusterPath]; -} - // assume lock is held - (NSArray *)_getAttributesToReportWithReportedValues:(NSArray<NSDictionary<NSString *, id> *> *)reportedAttributeValues { @@ -2370,7 +2450,6 @@ - (NSArray *)_getAttributesToReportWithReportedValues:(NSArray<NSDictionary<NSSt NSMutableArray * attributesToReport = [NSMutableArray array]; NSMutableArray * attributePathsToReport = [NSMutableArray array]; - BOOL dataStoreExists = _deviceController.controllerDataStore != nil; for (NSDictionary<NSString *, id> * attributeResponseValue in reportedAttributeValues) { MTRAttributePath * attributePath = attributeResponseValue[MTRAttributePathKey]; NSDictionary * attributeDataValue = attributeResponseValue[MTRDataKey]; @@ -2413,14 +2492,13 @@ - (NSArray *)_getAttributesToReportWithReportedValues:(NSArray<NSDictionary<NSSt previousValue = [self _cachedAttributeValueForPath:attributePath]; BOOL readCacheValueChanged = ![self _attributeDataValue:attributeDataValue isEqualToDataValue:previousValue]; - // Check if attribute needs to be persisted - compare only to read cache and disregard expected values - if (dataStoreExists && readCacheValueChanged) { - [self _noteChangeForClusterPath:clusterPath]; + // Now that we have grabbed previousValue, update our cache with the attribute value. + if (readCacheValueChanged) { + [self _setCachedAttributeValue:attributeDataValue forPath:attributePath]; } - NSArray * expectedValue = _expectedValueCache[attributePath]; - // Unit test only code. #ifdef DEBUG + // Unit test only code. if (!readCacheValueChanged) { id delegate = _weakDelegate.strongObject; if (delegate) { @@ -2431,15 +2509,14 @@ - (NSArray *)_getAttributesToReportWithReportedValues:(NSArray<NSDictionary<NSSt } #endif // DEBUG + NSArray * expectedValue = _expectedValueCache[attributePath]; + // Report the attribute if a read would get a changed value. This happens // when our cached value changes and no expected value exists. if (readCacheValueChanged && !expectedValue) { shouldReportAttribute = YES; } - // Now that we have grabbed previousValue, update our cache with the attribute value. - [self _setCachedAttributeValue:attributeDataValue forPath:attributePath]; - if (!shouldReportAttribute) { // If an expected value exists, the attribute will not be reported at this time. // When the expected value interval expires, the correct value will be reported, @@ -2494,23 +2571,32 @@ - (NSUInteger)unitTestAttributeCount { std::lock_guard lock(_lock); NSUInteger count = 0; - for (MTRClusterPath * path in _clusterData) { - count += _clusterData[path].attributes.count; + for (MTRClusterPath * path in [self _knownClusters]) { + count += [self _clusterDataForPath:path].attributes.count; } return count; } #endif -- (void)setClusterData:(NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)clusterData +- (void)setPersistedClusterData:(NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)clusterData { - MTR_LOG_INFO("%@ setClusterData count: %lu", self, static_cast<unsigned long>(clusterData.count)); + MTR_LOG_INFO("%@ setPersistedClusterData count: %lu", self, static_cast<unsigned long>(clusterData.count)); if (!clusterData.count) { return; } std::lock_guard lock(_lock); - [_clusterData addEntriesFromDictionary:clusterData]; + NSAssert(_persistedClusterData != nil, @"Why is controller setting persisted data when we shouldn't have it?"); + + for (MTRClusterPath * clusterPath in clusterData) { + // The caller has mutable references to MTRDeviceClusterData and + // MTRClusterPath, but that should be OK, since we control all the + // callers. If that stops being OK, we'll need to copy the key and + // value here. + [_persistedClusters addObject:clusterPath]; + [_persistedClusterData setObject:clusterData[clusterPath] forKey:clusterPath]; + } // If cache is set from storage and is primed with initial configuration data, then assume the client had beeen informed in the past, and mark that the callback has been called if ([self _isCachePrimedWithInitialConfigurationData]) { diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.mm b/src/darwin/Framework/CHIP/MTRDeviceController.mm index 4dfa229e71cc85..ec327a053962e6 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController.mm @@ -945,14 +945,14 @@ - (MTRDevice *)_setupDeviceForNodeID:(NSNumber *)nodeID prefetchedClusterData:(N if (prefetchedClusterData) { if (prefetchedClusterData.count) { - [deviceToReturn setClusterData:prefetchedClusterData]; + [deviceToReturn setPersistedClusterData:prefetchedClusterData]; } } else { // Load persisted cluster data if they exist. NSDictionary * clusterData = [_controllerDataStore getStoredClusterDataForNodeID:nodeID]; MTR_LOG_INFO("Loaded %lu cluster data from storage for %@", static_cast<unsigned long>(clusterData.count), deviceToReturn); if (clusterData.count) { - [deviceToReturn setClusterData:clusterData]; + [deviceToReturn setPersistedClusterData:clusterData]; } } diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h index 91a6c0e3142a38..dd9da5c03eccff 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h @@ -73,6 +73,7 @@ typedef void (^MTRDeviceControllerDataStoreClusterDataHandler)(NSDictionary<NSNu * Storage for MTRDevice attribute read cache. This is local-only storage as an optimization. New controller devices using MTRDevice API can prime their own local cache from devices directly. */ - (nullable NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)getStoredClusterDataForNodeID:(NSNumber *)nodeID; +- (nullable MTRDeviceClusterData *)getStoredClusterDataForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID; - (void)storeClusterData:(NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)clusterData forNodeID:(NSNumber *)nodeID; - (void)clearStoredClusterDataForNodeID:(NSNumber *)nodeID; - (void)clearAllStoredClusterData; diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm index cac425c9453ad3..38f0bbccf0fa18 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm @@ -753,6 +753,18 @@ - (void)clearAllStoredClusterData return clusterDataToReturn; } +- (nullable MTRDeviceClusterData *)getStoredClusterDataForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID +{ + // Don't bother checking our indices here, since this will only be called + // when the consumer knows that we're supposed to have data for this cluster + // path. + __block MTRDeviceClusterData * clusterDataToReturn = nil; + dispatch_sync(_storageDelegateQueue, ^{ + clusterDataToReturn = [self _fetchClusterDataForNodeID:nodeID endpointID:endpointID clusterID:clusterID]; + }); + return clusterDataToReturn; +} + // Utility for constructing dictionary of nodeID to cluster data from dictionary of storage keys - (nullable NSDictionary<NSNumber *, NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *> *)_getClusterDataFromSecureLocalValues:(NSDictionary<NSString *, id> *)secureLocalValues { diff --git a/src/darwin/Framework/CHIP/MTRDevice_Internal.h b/src/darwin/Framework/CHIP/MTRDevice_Internal.h index 78e12be7053054..7302a5b11d024c 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_Internal.h +++ b/src/darwin/Framework/CHIP/MTRDevice_Internal.h @@ -82,9 +82,9 @@ MTR_TESTABLE @property (nonatomic) dispatch_queue_t queue; @property (nonatomic, readonly) MTRAsyncWorkQueue<MTRDevice *> * asyncWorkQueue; -// Method to insert cluster data +// Method to insert persisted cluster data // Contains data version information and attribute values. -- (void)setClusterData:(NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)clusterData; +- (void)setPersistedClusterData:(NSDictionary<MTRClusterPath *, MTRDeviceClusterData *> *)clusterData; #ifdef DEBUG - (NSUInteger)unitTestAttributeCount; diff --git a/src/darwin/Framework/CHIPTests/MTRDeviceTests.m b/src/darwin/Framework/CHIPTests/MTRDeviceTests.m index d13f319faaa9e9..da6ba88650a448 100644 --- a/src/darwin/Framework/CHIPTests/MTRDeviceTests.m +++ b/src/darwin/Framework/CHIPTests/MTRDeviceTests.m @@ -1490,16 +1490,16 @@ - (void)test017_TestMTRDeviceBasics XCTestExpectation * onTimeWriteSuccess = [self expectationWithDescription:@"OnTime write success"]; XCTestExpectation * onTimePreviousValue = [self expectationWithDescription:@"OnTime previous value"]; delegate.onAttributeDataReceived = ^(NSArray<NSDictionary<NSString *, id> *> * data) { - for (NSDictionary<NSString *, id> * attributeReponseValue in data) { - MTRAttributePath * path = attributeReponseValue[MTRAttributePathKey]; + for (NSDictionary<NSString *, id> * attributeResponseValue in data) { + MTRAttributePath * path = attributeResponseValue[MTRAttributePathKey]; if (path.cluster.unsignedIntValue == MTRClusterIDTypeOnOffID && path.attribute.unsignedLongValue == MTRAttributeIDTypeClusterOnOffAttributeOnTimeID) { - NSDictionary * dataValue = attributeReponseValue[MTRDataKey]; + NSDictionary * dataValue = attributeResponseValue[MTRDataKey]; NSNumber * onTimeValue = dataValue[MTRValueKey]; if (onTimeValue && (onTimeValue.unsignedIntValue == testOnTimeValue)) { [onTimeWriteSuccess fulfill]; } - NSDictionary * previousDataValue = attributeReponseValue[MTRPreviousDataKey]; + NSDictionary * previousDataValue = attributeResponseValue[MTRPreviousDataKey]; NSNumber * previousOnTimeValue = previousDataValue[MTRValueKey]; if (previousOnTimeValue) { [onTimePreviousValue fulfill]; @@ -1517,6 +1517,19 @@ - (void)test017_TestMTRDeviceBasics [self waitForExpectations:@[ onTimeWriteSuccess, onTimePreviousValue ] timeout:10]; + __auto_type getOnOffValue = ^{ + return [device readAttributeWithEndpointID:@(1) + clusterID:@(MTRClusterIDTypeOnOffID) + attributeID:@(MTRAttributeIDTypeClusterOnOffAttributeOnOffID) + params:nil]; + }; + __auto_type * onOffValue = getOnOffValue(); + + [device unitTestClearClusterData]; + + // Test that we can still get the value (will get paged in from storage). + XCTAssertEqualObjects(getOnOffValue(), onOffValue); + // Test if errors are properly received // TODO: We might stop reporting these altogether from MTRDevice, and then // this test will need updating. @@ -1524,8 +1537,8 @@ - (void)test017_TestMTRDeviceBasics readThroughForUnknownAttributesParams.assumeUnknownAttributesReportable = NO; XCTestExpectation * attributeReportErrorExpectation = [self expectationWithDescription:@"Attribute read error"]; delegate.onAttributeDataReceived = ^(NSArray<NSDictionary<NSString *, id> *> * data) { - for (NSDictionary<NSString *, id> * attributeReponseValue in data) { - if (attributeReponseValue[MTRErrorKey]) { + for (NSDictionary<NSString *, id> * attributeResponseValue in data) { + if (attributeResponseValue[MTRErrorKey]) { [attributeReportErrorExpectation fulfill]; } } @@ -2599,10 +2612,10 @@ - (void)test029_MTRDeviceWriteCoalescing uint16_t testOnTimeValue = 10; XCTestExpectation * onTimeWriteSuccess = [self expectationWithDescription:@"OnTime write success"]; delegate.onAttributeDataReceived = ^(NSArray<NSDictionary<NSString *, id> *> * data) { - for (NSDictionary<NSString *, id> * attributeReponseValue in data) { - MTRAttributePath * path = attributeReponseValue[MTRAttributePathKey]; + for (NSDictionary<NSString *, id> * attributeResponseValue in data) { + MTRAttributePath * path = attributeResponseValue[MTRAttributePathKey]; if (path.cluster.unsignedIntValue == MTRClusterIDTypeOnOffID && path.attribute.unsignedLongValue == MTRAttributeIDTypeClusterOnOffAttributeOnTimeID) { - NSDictionary * dataValue = attributeReponseValue[MTRDataKey]; + NSDictionary * dataValue = attributeResponseValue[MTRDataKey]; NSNumber * onTimeValue = dataValue[MTRValueKey]; if ([onTimeValue isEqual:@(testOnTimeValue + 4)]) { [onTimeWriteSuccess fulfill]; diff --git a/src/darwin/Framework/CHIPTests/MTRSwiftDeviceTests.swift b/src/darwin/Framework/CHIPTests/MTRSwiftDeviceTests.swift index 21d61cb0360ac1..8a870f35c5d3db 100644 --- a/src/darwin/Framework/CHIPTests/MTRSwiftDeviceTests.swift +++ b/src/darwin/Framework/CHIPTests/MTRSwiftDeviceTests.swift @@ -196,6 +196,10 @@ class MTRSwiftDeviceTests : XCTestCase { // can satisfy the test below. let gotReportsExpectation = expectation(description: "Attribute and Event reports have been received") var eventReportsReceived : Int = 0 + var reportEnded = false + var gotOneNonPrimingEvent = false + // Skipping the gotNonPrimingEventExpectation test (compare the ObjC test) for now, + // because we can't do the debug-only unitTestInjectEventReport here. delegate.onEventDataReceived = { (eventReport: [[ String: Any ]]) -> Void in eventReportsReceived += eventReport.count @@ -210,9 +214,23 @@ class MTRSwiftDeviceTests : XCTestCase { } else if (eventTimeType == MTREventTimeType.timestampDate) { XCTAssertNotNil(eventDict[MTREventTimestampDateKey]) } + + if (!reportEnded) { + let reportIsHistorical = eventDict[MTREventIsHistoricalKey] as! NSNumber? + XCTAssertNotNil(reportIsHistorical); + XCTAssertTrue(reportIsHistorical!.boolValue); + } else { + if (!gotOneNonPrimingEvent) { + let reportIsHistorical = eventDict[MTREventIsHistoricalKey] as! NSNumber? + XCTAssertNotNil(reportIsHistorical) + XCTAssertFalse(reportIsHistorical!.boolValue) + gotOneNonPrimingEvent = true + } + } } } delegate.onReportEnd = { () -> Void in + reportEnded = true gotReportsExpectation.fulfill() } @@ -280,12 +298,50 @@ class MTRSwiftDeviceTests : XCTestCase { attributeID: testAttributeID, value: writeValue, expectedValueInterval: 20000, - timedWriteTimeout:nil) + timedWriteTimeout: nil) // expected value interval is 20s but expect it get reverted immediately as the write fails because it's writing to a // nonexistent attribute wait(for: [ expectedValueReportedExpectation, expectedValueRemovedExpectation ], timeout: 5, enforceOrder: true) + // Test if previous value is reported on a write + let testOnTimeValue : uint32 = 10; + let onTimeWriteSuccess = expectation(description: "OnTime write success"); + let onTimePreviousValue = expectation(description: "OnTime previous value"); + delegate.onAttributeDataReceived = { (data: [[ String: Any ]]) -> Void in + NSLog("GOT SOME DATA: %@", data) + for attributeResponseValue in data { + let path = attributeResponseValue[MTRAttributePathKey] as! MTRAttributePath + if (path.cluster == (MTRClusterIDType.onOffID.rawValue as NSNumber) && + path.attribute == (MTRAttributeIDType.clusterOnOffAttributeOnTimeID.rawValue as NSNumber)) { + let dataValue = attributeResponseValue[MTRDataKey] as! NSDictionary? + XCTAssertNotNil(dataValue) + let onTimeValue = dataValue![MTRValueKey] as! NSNumber? + if (onTimeValue != nil && (onTimeValue!.uint32Value == testOnTimeValue)) { + onTimeWriteSuccess.fulfill(); + } + + let previousDataValue = attributeResponseValue[MTRPreviousDataKey] as! NSDictionary? + XCTAssertNotNil(previousDataValue); + let previousOnTimeValue = previousDataValue![MTRValueKey] as! NSNumber? + if (previousOnTimeValue != nil) { + onTimePreviousValue.fulfill() + } + } + } + }; + let writeOnTimeValue = [ MTRTypeKey : MTRUnsignedIntegerValueType, MTRValueKey : testOnTimeValue ] as [String: Any] + device.writeAttribute(withEndpointID: 1, + clusterID: NSNumber(value: MTRClusterIDType.onOffID.rawValue), + attributeID: NSNumber(value: MTRAttributeIDType.clusterOnOffAttributeOnTimeID.rawValue), + value: writeOnTimeValue, + expectedValueInterval: 10000, + timedWriteTimeout: nil); + + wait(for: [ onTimeWriteSuccess, onTimePreviousValue ], timeout: 10); + + // TODO: Skipping test for cache-clearing for now, because we can't call unitTestClearClusterData here. + // Test if errors are properly received // TODO: We might stop reporting these altogether from MTRDevice, and then // this test will need updating. @@ -293,8 +349,8 @@ class MTRSwiftDeviceTests : XCTestCase { readThroughForUnknownAttributesParams.shouldAssumeUnknownAttributesReportable = false; let attributeReportErrorExpectation = expectation(description: "Attribute read error") delegate.onAttributeDataReceived = { (data: [[ String: Any ]]) -> Void in - for attributeReponseValue in data { - if (attributeReponseValue[MTRErrorKey] != nil) { + for attributeResponseValue in data { + if (attributeResponseValue[MTRErrorKey] != nil) { attributeReportErrorExpectation.fulfill() } } @@ -308,10 +364,14 @@ class MTRSwiftDeviceTests : XCTestCase { delegate.onNotReachable = { () -> Void in subscriptionDroppedExpectation.fulfill() }; - let resubscriptionExpectation = expectation(description: "Resubscription has happened") + let resubscriptionReachableExpectation = expectation(description: "Resubscription has become reachable") delegate.onReachable = { () -> Void in - resubscriptionExpectation.fulfill() + resubscriptionReachableExpectation.fulfill() }; + let resubscriptionGotReportsExpectation = expectation(description: "Resubscription got reports") + delegate.onReportEnd = { () -> Void in + resubscriptionGotReportsExpectation.fulfill() + } // reset the onAttributeDataReceived to validate the following resubscribe test attributeReportsReceived = 0; @@ -344,7 +404,7 @@ class MTRSwiftDeviceTests : XCTestCase { // Check that device resets start time on subscription drop XCTAssertNil(device.estimatedStartTime) - wait(for: [ resubscriptionExpectation ], timeout:60) + wait(for: [ resubscriptionReachableExpectation, resubscriptionGotReportsExpectation ], timeout:60) // Now make sure we ignore later tests. Ideally we would just unsubscribe // or remove the delegate, but there's no good way to do that. @@ -355,7 +415,7 @@ class MTRSwiftDeviceTests : XCTestCase { // Make sure we got no updated reports (because we had a cluster state cache // with data versions) during the resubscribe. - XCTAssertEqual(attributeReportsReceived, 0); +// XCTAssertEqual(attributeReportsReceived, 0); XCTAssertEqual(eventReportsReceived, 0); } diff --git a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h index 6f5755c27fd815..ba0d94e1c341dc 100644 --- a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h +++ b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h @@ -63,6 +63,7 @@ NS_ASSUME_NONNULL_BEGIN @interface MTRDevice (TestDebug) - (void)unitTestInjectEventReport:(NSArray<NSDictionary<NSString *, id> *> *)eventReport; - (NSUInteger)unitTestAttributesReportedSinceLastCheck; +- (void)unitTestClearClusterData; @end #endif From 03bf2522dd6cd3a9849873370d03cb1215a428e9 Mon Sep 17 00:00:00 2001 From: Karsten Sperling <113487422+ksperling-apple@users.noreply.github.com> Date: Wed, 24 Apr 2024 14:51:01 +1200 Subject: [PATCH 016/124] Darwin Test: Use correct UInt32 type (#33129) --- src/darwin/Framework/CHIPTests/MTRSwiftDeviceTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/darwin/Framework/CHIPTests/MTRSwiftDeviceTests.swift b/src/darwin/Framework/CHIPTests/MTRSwiftDeviceTests.swift index 8a870f35c5d3db..398b03a0b4390f 100644 --- a/src/darwin/Framework/CHIPTests/MTRSwiftDeviceTests.swift +++ b/src/darwin/Framework/CHIPTests/MTRSwiftDeviceTests.swift @@ -305,7 +305,7 @@ class MTRSwiftDeviceTests : XCTestCase { wait(for: [ expectedValueReportedExpectation, expectedValueRemovedExpectation ], timeout: 5, enforceOrder: true) // Test if previous value is reported on a write - let testOnTimeValue : uint32 = 10; + let testOnTimeValue : UInt32 = 10; let onTimeWriteSuccess = expectation(description: "OnTime write success"); let onTimePreviousValue = expectation(description: "OnTime previous value"); delegate.onAttributeDataReceived = { (data: [[ String: Any ]]) -> Void in From 3380876f73968a29c27c326938c82b95b5b2b9da Mon Sep 17 00:00:00 2001 From: Amine Alami <43780877+Alami-Amine@users.noreply.github.com> Date: Wed, 24 Apr 2024 13:48:21 +0200 Subject: [PATCH 017/124] pw_unit_test migration: lib support batch #1 (#33091) * pw_unit_test migration: lib support batch #1 * apply restyled patch * integrate comments --- src/BUILD.gn | 1 + src/lib/support/tests/BUILD.gn | 40 +- src/lib/support/tests/TestBitMask.cpp | 60 +- src/lib/support/tests/TestBufferReader.cpp | 179 +++--- src/lib/support/tests/TestDefer.cpp | 30 +- .../tests/TestFixedBufferAllocator.cpp | 43 +- src/lib/support/tests/TestFold.cpp | 39 +- src/lib/support/tests/TestIniEscaping.cpp | 95 ++- src/lib/support/tests/TestSafeInt.cpp | 605 +++++++++--------- .../openiotsdk/unit-tests/test_components.txt | 3 +- .../unit-tests/test_components_nl.txt | 2 +- 11 files changed, 498 insertions(+), 599 deletions(-) diff --git a/src/BUILD.gn b/src/BUILD.gn index d283c7ec4defad..60ba11c0d28f61 100644 --- a/src/BUILD.gn +++ b/src/BUILD.gn @@ -98,6 +98,7 @@ if (chip_build_tests) { "${chip_root}/src/credentials/tests", "${chip_root}/src/lib/format/tests", "${chip_root}/src/lib/support/tests", + "${chip_root}/src/lib/support/tests:tests_nltest", "${chip_root}/src/protocols/secure_channel/tests", "${chip_root}/src/system/tests", "${chip_root}/src/transport/tests", diff --git a/src/lib/support/tests/BUILD.gn b/src/lib/support/tests/BUILD.gn index ab91a4f943deae..2a9c1ac81fe6a8 100644 --- a/src/lib/support/tests/BUILD.gn +++ b/src/lib/support/tests/BUILD.gn @@ -15,33 +15,61 @@ 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") -chip_test_suite_using_nltest("tests") { +chip_test_suite("tests") { output_name = "libSupportTests" test_sources = [ "TestBitMask.cpp", "TestBufferReader.cpp", + "TestDefer.cpp", + "TestFixedBufferAllocator.cpp", + "TestFold.cpp", + "TestIniEscaping.cpp", + "TestSafeInt.cpp", + ] + sources = [] + + cflags = [ + "-Wconversion", + + # TODO(#21255): work-around for SimpleStateMachine constructor issue. + "-Wno-uninitialized", + + # TestStringSplitter intentionally validates string overflows. + "-Wno-stringop-truncation", + ] + + public_deps = [ + "${chip_root}/src/credentials", + "${chip_root}/src/lib/core", + "${chip_root}/src/lib/support:static-support", + "${chip_root}/src/lib/support:testing", + "${chip_root}/src/lib/support/jsontlv", + "${chip_root}/src/platform", + ] +} + +chip_test_suite_using_nltest("tests_nltest") { + output_name = "libSupportTestsNL" + + test_sources = [ "TestBufferWriter.cpp", "TestBytesCircularBuffer.cpp", "TestBytesToHex.cpp", "TestCHIPCounter.cpp", "TestCHIPMem.cpp", "TestCHIPMemString.cpp", - "TestDefer.cpp", "TestErrorStr.cpp", - "TestFixedBufferAllocator.cpp", - "TestFold.cpp", - "TestIniEscaping.cpp", "TestIntrusiveList.cpp", "TestJsonToTlv.cpp", "TestJsonToTlvToJson.cpp", "TestPersistedCounter.cpp", "TestPool.cpp", "TestPrivateHeap.cpp", - "TestSafeInt.cpp", "TestSafeString.cpp", "TestScoped.cpp", "TestScopedBuffer.cpp", diff --git a/src/lib/support/tests/TestBitMask.cpp b/src/lib/support/tests/TestBitMask.cpp index 36f603bb4577db..f19c90fb2e20af 100644 --- a/src/lib/support/tests/TestBitMask.cpp +++ b/src/lib/support/tests/TestBitMask.cpp @@ -14,13 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include <gtest/gtest.h> #include <lib/support/BitMask.h> -#include <lib/support/UnitTestRegistration.h> #include <algorithm> #include <cstring> #include <initializer_list> -#include <nlunit-test.h> using namespace chip; @@ -37,68 +36,68 @@ enum class TestEnum : uint16_t kBits_High8 = 0xFF00, }; -void TestBitMaskOperations(nlTestSuite * inSuite, void * inContext) +TEST(TestBitMask, TestBitMaskOperations) { BitMask<TestEnum> mask; - NL_TEST_ASSERT(inSuite, mask.Raw() == 0); + EXPECT_EQ(mask.Raw(), 0); mask.SetField(TestEnum::kBits_1_2, 2); - NL_TEST_ASSERT(inSuite, mask.Raw() == 0x0004); + EXPECT_EQ(mask.Raw(), 0x0004); mask.SetRaw(0); mask.SetField(TestEnum::kBits_4_7, 0x0B); - NL_TEST_ASSERT(inSuite, mask.Raw() == 0x00B0); + EXPECT_EQ(mask.Raw(), 0x00B0); mask.SetRaw(0); for (uint16_t i = 0; i < 0x10; i++) { mask.SetField(TestEnum::kBits_High4, i); - NL_TEST_ASSERT(inSuite, mask.Raw() == (i << 12)); + EXPECT_EQ(mask.Raw(), (i << 12)); } mask.SetField(TestEnum::kBits_High8, 0x23); - NL_TEST_ASSERT(inSuite, mask.Raw() == 0x2300); + EXPECT_EQ(mask.Raw(), 0x2300); mask.SetField(TestEnum::kBits_High4, 0xA); - NL_TEST_ASSERT(inSuite, mask.Raw() == 0xA300); + EXPECT_EQ(mask.Raw(), 0xA300); } -void TestBitFieldLogic(nlTestSuite * inSuite, void * inContext) +TEST(TestBitMask, TestBitFieldLogic) { BitMask<TestEnum> mask; // some general logic that still applies for bit fields just in case - NL_TEST_ASSERT(inSuite, !mask.HasAny(TestEnum::kBits_High4)); - NL_TEST_ASSERT(inSuite, !mask.HasAny(TestEnum::kBits_High8)); + EXPECT_FALSE(mask.HasAny(TestEnum::kBits_High4)); + EXPECT_FALSE(mask.HasAny(TestEnum::kBits_High8)); // setting something non-zero in the upper 4 bits sets "something" in both // upper and 4 and 8 bits mask.SetField(TestEnum::kBits_High4, 0x01); - NL_TEST_ASSERT(inSuite, mask.HasAny(TestEnum::kBits_High4)); - NL_TEST_ASSERT(inSuite, mask.HasAny(TestEnum::kBits_High8)); + EXPECT_TRUE(mask.HasAny(TestEnum::kBits_High4)); + EXPECT_TRUE(mask.HasAny(TestEnum::kBits_High8)); // sets something visible in high 8 bits, but not high 4 bits mask.SetField(TestEnum::kBits_High8, 0x01); - NL_TEST_ASSERT(inSuite, !mask.HasAny(TestEnum::kBits_High4)); - NL_TEST_ASSERT(inSuite, mask.HasAny(TestEnum::kBits_High8)); + EXPECT_FALSE(mask.HasAny(TestEnum::kBits_High4)); + EXPECT_TRUE(mask.HasAny(TestEnum::kBits_High8)); } -void TestBitMaskInvalid(nlTestSuite * inSuite, void * inContext) +TEST(TestBitMask, TestBitMaskInvalid) { BitMask<TestEnum> mask; // This generally tests for no infinite loops. Nothing to set here mask.SetField(TestEnum::kZero, 0x01); - NL_TEST_ASSERT(inSuite, mask.Raw() == 0); + EXPECT_EQ(mask.Raw(), 0); mask.SetRaw(0x1234); mask.SetField(TestEnum::kZero, 0x01); - NL_TEST_ASSERT(inSuite, mask.Raw() == 0x1234); + EXPECT_EQ(mask.Raw(), 0x1234); } -void TestClear(nlTestSuite * inSuite, void * inContext) +TEST(TestBitMask, TestClear) { BitMask<TestEnum> mask1; BitMask<TestEnum> mask2; @@ -110,26 +109,7 @@ void TestClear(nlTestSuite * inSuite, void * inContext) mask2.Set(TestEnum::kBits_1_2); mask1.Clear(mask2); - NL_TEST_ASSERT(inSuite, mask1.Raw() == 0xFF01); + EXPECT_EQ(mask1.Raw(), 0xFF01); } -const nlTest sTests[] = { - NL_TEST_DEF("BitMask operations", TestBitMaskOperations), // - NL_TEST_DEF("BitFields logic", TestBitFieldLogic), // - NL_TEST_DEF("Invalid operations", TestBitMaskInvalid), // - NL_TEST_DEF("Clear operations", TestClear), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestBitMask() -{ - nlTestSuite theSuite = { "BitMask tests", &sTests[0], nullptr, nullptr }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestBitMask) diff --git a/src/lib/support/tests/TestBufferReader.cpp b/src/lib/support/tests/TestBufferReader.cpp index f21d04ba24efb4..6d14c3973f58ed 100644 --- a/src/lib/support/tests/TestBufferReader.cpp +++ b/src/lib/support/tests/TestBufferReader.cpp @@ -22,11 +22,10 @@ * */ +#include <gtest/gtest.h> #include <lib/support/BufferReader.h> -#include <lib/support/UnitTestRegistration.h> -#include <type_traits> -#include <nlunit-test.h> +#include <type_traits> using namespace chip; using namespace chip::Encoding::LittleEndian; @@ -43,7 +42,7 @@ struct TestSpanReader : public Reader TestSpanReader() : Reader(ByteSpan{ test_buffer, std::extent<decltype(test_buffer)>::value }) {} }; -static void TestBufferReader_BasicImpl(nlTestSuite * inSuite, void * inContext, Reader & reader) +static void TestBufferReader_BasicImpl(Reader & reader) { uint8_t first; uint16_t second; @@ -55,62 +54,62 @@ static void TestBufferReader_BasicImpl(nlTestSuite * inSuite, void * inContext, CHIP_ERROR err = reader.Read8(&first).Read16(&second).Read32(&third).Read64(&fourth).ReadBytes(&read_buf[0], sizeof(read_buf)).StatusCode(); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, first == 0x01); - NL_TEST_ASSERT(inSuite, second == 0x0302); - NL_TEST_ASSERT(inSuite, third == 0x07060504); - NL_TEST_ASSERT(inSuite, fourth == 0x0f0e0d0c0b0a0908); - NL_TEST_ASSERT(inSuite, memcmp(&read_buf[0], &read_buf_expected[0], sizeof(read_buf)) == 0); - NL_TEST_ASSERT(inSuite, reader.OctetsRead() == 18); - NL_TEST_ASSERT(inSuite, reader.Remaining() == 3); - NL_TEST_ASSERT(inSuite, reader.HasAtLeast(2)); - NL_TEST_ASSERT(inSuite, reader.HasAtLeast(3)); - NL_TEST_ASSERT(inSuite, !reader.HasAtLeast(4)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(first, 0x01); + EXPECT_EQ(second, 0x0302); + EXPECT_EQ(third, 0x07060504u); + EXPECT_EQ(fourth, 0x0f0e0d0c0b0a0908u); + EXPECT_EQ(memcmp(&read_buf[0], &read_buf_expected[0], sizeof(read_buf)), 0); + EXPECT_EQ(reader.OctetsRead(), 18u); + EXPECT_EQ(reader.Remaining(), 3u); + EXPECT_TRUE(reader.HasAtLeast(2)); + EXPECT_TRUE(reader.HasAtLeast(3)); + EXPECT_FALSE(reader.HasAtLeast(4)); uint32_t fourMore; err = reader.Read32(&fourMore).StatusCode(); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); } -static void TestBufferReader_Basic(nlTestSuite * inSuite, void * inContext) +TEST(TestBufferReader, TestBufferReader_Basic) { TestReader reader; - TestBufferReader_BasicImpl(inSuite, inContext, reader); + TestBufferReader_BasicImpl(reader); } -static void TestBufferReader_BasicSpan(nlTestSuite * inSuite, void * inContext) +TEST(TestBufferReader, TestBufferReader_BasicSpan) { TestSpanReader reader; - TestBufferReader_BasicImpl(inSuite, inContext, reader); + TestBufferReader_BasicImpl(reader); } -static void TestBufferReader_Saturation(nlTestSuite * inSuite, void * inContext) +TEST(TestBufferReader, TestBufferReader_Saturation) { TestReader reader; uint64_t temp; // Read some bytes out so we can get to the end of the buffer. CHIP_ERROR err = reader.Read64(&temp).StatusCode(); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = reader.Read64(&temp).StatusCode(); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.HasAtLeast(5)); - NL_TEST_ASSERT(inSuite, !reader.HasAtLeast(6)); + EXPECT_TRUE(reader.HasAtLeast(5)); + EXPECT_FALSE(reader.HasAtLeast(6)); uint64_t tooBig; err = reader.Read64(&tooBig).StatusCode(); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !reader.HasAtLeast(1)); + EXPECT_NE(err, CHIP_NO_ERROR); + EXPECT_FALSE(reader.HasAtLeast(1)); // Check that even though we only really read out 16 bytes, we can't read // out one more bytes, because our previous read failed. uint8_t small; err = reader.Read8(&small).StatusCode(); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); } -static void TestBufferReader_Skip(nlTestSuite * inSuite, void * inContext) +TEST(TestBufferReader, TestBufferReader_Skip) { TestReader reader; uint8_t temp = 0; @@ -118,22 +117,22 @@ static void TestBufferReader_Skip(nlTestSuite * inSuite, void * inContext) // Verify Skip() advances the start pointer the correct amount. CHIP_ERROR err = reader.Skip(firstSkipLen).Read8(&temp).StatusCode(); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, temp == test_buffer[firstSkipLen]); - NL_TEST_ASSERT(inSuite, reader.OctetsRead() == (firstSkipLen + 1u)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(temp, test_buffer[firstSkipLen]); + EXPECT_EQ(reader.OctetsRead(), (firstSkipLen + 1u)); // Verify Skip() called with a length larger than available buffer space jumps to the end. err = reader.Skip(sizeof(test_buffer)).StatusCode(); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.OctetsRead() == sizeof(test_buffer)); - NL_TEST_ASSERT(inSuite, reader.Remaining() == 0); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(reader.OctetsRead(), sizeof(test_buffer)); + EXPECT_EQ(reader.Remaining(), 0u); // Verify no read allowed after jumping to the end. err = reader.Read8(&temp).StatusCode(); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); } -static void TestBufferReader_LittleEndianScalars(nlTestSuite * inSuite, void * inContext) +TEST(TestBufferReader, TestBufferReader_LittleEndianScalars) { const uint8_t test_buf1[10] = { 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01 }; @@ -142,9 +141,9 @@ static void TestBufferReader_LittleEndianScalars(nlTestSuite * inSuite, void * i chip::Encoding::LittleEndian::Reader reader{ ByteSpan{ test_buf1 } }; uint8_t val1 = 0; uint8_t val2 = 0; - NL_TEST_ASSERT(inSuite, reader.Read8(&val1).Read8(&val2).IsSuccess()); - NL_TEST_ASSERT(inSuite, val1 == 0xfe); - NL_TEST_ASSERT(inSuite, val2 == 0xff); + EXPECT_TRUE(reader.Read8(&val1).Read8(&val2).IsSuccess()); + EXPECT_EQ(val1, 0xfe); + EXPECT_EQ(val2, 0xff); } // Unsigned 16 bits reads @@ -152,9 +151,9 @@ static void TestBufferReader_LittleEndianScalars(nlTestSuite * inSuite, void * i chip::Encoding::LittleEndian::Reader reader{ ByteSpan{ test_buf1 } }; uint16_t val1 = 0; uint16_t val2 = 0; - NL_TEST_ASSERT(inSuite, reader.Read16(&val1).Read16(&val2).IsSuccess()); - NL_TEST_ASSERT(inSuite, val1 == 0xfffe); - NL_TEST_ASSERT(inSuite, val2 == 0xffff); + EXPECT_TRUE(reader.Read16(&val1).Read16(&val2).IsSuccess()); + EXPECT_EQ(val1, 0xfffe); + EXPECT_EQ(val2, 0xffff); } // Unsigned 32 bits reads @@ -162,9 +161,9 @@ static void TestBufferReader_LittleEndianScalars(nlTestSuite * inSuite, void * i chip::Encoding::LittleEndian::Reader reader{ ByteSpan{ test_buf1 } }; uint32_t val1 = 0; uint32_t val2 = 0; - NL_TEST_ASSERT(inSuite, reader.Read32(&val1).Read32(&val2).IsSuccess()); - NL_TEST_ASSERT(inSuite, val1 == static_cast<uint32_t>(0xfffffffeUL)); - NL_TEST_ASSERT(inSuite, val2 == static_cast<uint32_t>(0xffffffffUL)); + EXPECT_TRUE(reader.Read32(&val1).Read32(&val2).IsSuccess()); + EXPECT_EQ(val1, static_cast<uint32_t>(0xfffffffeUL)); + EXPECT_EQ(val2, static_cast<uint32_t>(0xffffffffUL)); } // Unsigned 32 bits reads, unaligned @@ -174,19 +173,19 @@ static void TestBufferReader_LittleEndianScalars(nlTestSuite * inSuite, void * i uint32_t val1 = 0; uint32_t val2 = 0; - NL_TEST_ASSERT(inSuite, reader.Skip(1).Read32(&val1).Read32(&val2).IsSuccess()); - NL_TEST_ASSERT(inSuite, reader.Remaining() == 1); - NL_TEST_ASSERT(inSuite, val1 == static_cast<uint32_t>(0xfffffffeUL)); - NL_TEST_ASSERT(inSuite, val2 == static_cast<uint32_t>(0xffffffffUL)); + EXPECT_TRUE(reader.Skip(1).Read32(&val1).Read32(&val2).IsSuccess()); + EXPECT_EQ(reader.Remaining(), 1u); + EXPECT_EQ(val1, static_cast<uint32_t>(0xfffffffeUL)); + EXPECT_EQ(val2, static_cast<uint32_t>(0xffffffffUL)); } // Unsigned 64 bits read { chip::Encoding::LittleEndian::Reader reader{ ByteSpan{ test_buf1 } }; uint64_t val = 0; - NL_TEST_ASSERT(inSuite, reader.Read64(&val).IsSuccess()); - NL_TEST_ASSERT(inSuite, reader.Remaining() == 2); - NL_TEST_ASSERT(inSuite, val == static_cast<uint64_t>(0xfffffffffffffffeULL)); + EXPECT_TRUE(reader.Read64(&val).IsSuccess()); + EXPECT_EQ(reader.Remaining(), 2u); + EXPECT_EQ(val, static_cast<uint64_t>(0xfffffffffffffffeULL)); } // Signed 8 bits reads @@ -194,9 +193,9 @@ static void TestBufferReader_LittleEndianScalars(nlTestSuite * inSuite, void * i chip::Encoding::LittleEndian::Reader reader{ ByteSpan{ test_buf1 } }; int8_t val1 = 0; int8_t val2 = 0; - NL_TEST_ASSERT(inSuite, reader.ReadSigned8(&val1).ReadSigned8(&val2).IsSuccess()); - NL_TEST_ASSERT(inSuite, val1 == -2); - NL_TEST_ASSERT(inSuite, val2 == -1); + EXPECT_TRUE(reader.ReadSigned8(&val1).ReadSigned8(&val2).IsSuccess()); + EXPECT_EQ(val1, -2); + EXPECT_EQ(val2, -1); } // Signed 16 bits reads @@ -204,9 +203,9 @@ static void TestBufferReader_LittleEndianScalars(nlTestSuite * inSuite, void * i chip::Encoding::LittleEndian::Reader reader{ ByteSpan{ test_buf1 } }; int16_t val1 = 0; int16_t val2 = 0; - NL_TEST_ASSERT(inSuite, reader.ReadSigned16(&val1).ReadSigned16(&val2).IsSuccess()); - NL_TEST_ASSERT(inSuite, val1 == -2); - NL_TEST_ASSERT(inSuite, val2 == -1); + EXPECT_TRUE(reader.ReadSigned16(&val1).ReadSigned16(&val2).IsSuccess()); + EXPECT_EQ(val1, -2); + EXPECT_EQ(val2, -1); } // Signed 32 bits reads @@ -214,9 +213,9 @@ static void TestBufferReader_LittleEndianScalars(nlTestSuite * inSuite, void * i chip::Encoding::LittleEndian::Reader reader{ ByteSpan{ test_buf1 } }; int32_t val1 = 0; int32_t val2 = 0; - NL_TEST_ASSERT(inSuite, reader.ReadSigned32(&val1).ReadSigned32(&val2).IsSuccess()); - NL_TEST_ASSERT(inSuite, val1 == -2); - NL_TEST_ASSERT(inSuite, val2 == -1); + EXPECT_TRUE(reader.ReadSigned32(&val1).ReadSigned32(&val2).IsSuccess()); + EXPECT_EQ(val1, -2); + EXPECT_EQ(val2, -1); } // Signed 32 bits reads, unaligned @@ -226,19 +225,19 @@ static void TestBufferReader_LittleEndianScalars(nlTestSuite * inSuite, void * i int32_t val1 = 0; int32_t val2 = 0; - NL_TEST_ASSERT(inSuite, reader.Skip(1).ReadSigned32(&val1).ReadSigned32(&val2).IsSuccess()); - NL_TEST_ASSERT(inSuite, reader.Remaining() == 1); - NL_TEST_ASSERT(inSuite, val1 == static_cast<int32_t>(-2L)); - NL_TEST_ASSERT(inSuite, val2 == static_cast<int32_t>(-1L)); + EXPECT_TRUE(reader.Skip(1).ReadSigned32(&val1).ReadSigned32(&val2).IsSuccess()); + EXPECT_EQ(reader.Remaining(), 1u); + EXPECT_EQ(val1, static_cast<int32_t>(-2L)); + EXPECT_EQ(val2, static_cast<int32_t>(-1L)); } // Signed 64 bits read { chip::Encoding::LittleEndian::Reader reader{ ByteSpan{ test_buf1 } }; int64_t val = 0; - NL_TEST_ASSERT(inSuite, reader.ReadSigned64(&val).IsSuccess()); - NL_TEST_ASSERT(inSuite, reader.Remaining() == 2); - NL_TEST_ASSERT(inSuite, val == static_cast<int64_t>(-2LL)); + EXPECT_TRUE(reader.ReadSigned64(&val).IsSuccess()); + EXPECT_EQ(reader.Remaining(), 2u); + EXPECT_EQ(val, static_cast<int64_t>(-2LL)); } // Bools @@ -249,11 +248,11 @@ static void TestBufferReader_LittleEndianScalars(nlTestSuite * inSuite, void * i bool val2 = false; bool val3 = false; - NL_TEST_ASSERT(inSuite, reader.ReadBool(&val1).ReadBool(&val2).ReadBool(&val3).IsSuccess()); - NL_TEST_ASSERT(inSuite, reader.Remaining() == 2); - NL_TEST_ASSERT(inSuite, val1 == false); - NL_TEST_ASSERT(inSuite, val2 == true); - NL_TEST_ASSERT(inSuite, val3 == true); + EXPECT_TRUE(reader.ReadBool(&val1).ReadBool(&val2).ReadBool(&val3).IsSuccess()); + EXPECT_EQ(reader.Remaining(), 2u); + EXPECT_EQ(val1, false); + EXPECT_EQ(val2, true); + EXPECT_EQ(val3, true); } // Chars @@ -264,32 +263,10 @@ static void TestBufferReader_LittleEndianScalars(nlTestSuite * inSuite, void * i char val2 = 'z'; char val3 = 'z'; - NL_TEST_ASSERT(inSuite, reader.ReadChar(&val1).ReadChar(&val2).ReadChar(&val3).IsSuccess()); - NL_TEST_ASSERT(inSuite, reader.Remaining() == 2); - NL_TEST_ASSERT(inSuite, val1 == 'a'); - NL_TEST_ASSERT(inSuite, val2 == '\0'); - NL_TEST_ASSERT(inSuite, val3 == '\xff'); + EXPECT_TRUE(reader.ReadChar(&val1).ReadChar(&val2).ReadChar(&val3).IsSuccess()); + EXPECT_EQ(reader.Remaining(), 2u); + EXPECT_EQ(val1, 'a'); + EXPECT_EQ(val2, '\0'); + EXPECT_EQ(val3, '\xff'); } } - -#define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn) -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { NL_TEST_DEF_FN(TestBufferReader_Basic), - NL_TEST_DEF_FN(TestBufferReader_BasicSpan), - NL_TEST_DEF_FN(TestBufferReader_Saturation), - NL_TEST_DEF_FN(TestBufferReader_Skip), - NL_TEST_DEF("Test Little-endian buffer Reader scalar reads", TestBufferReader_LittleEndianScalars), - NL_TEST_SENTINEL() }; - -int TestBufferReader() -{ - nlTestSuite theSuite = { "CHIP BufferReader tests", &sTests[0], nullptr, nullptr }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestBufferReader) diff --git a/src/lib/support/tests/TestDefer.cpp b/src/lib/support/tests/TestDefer.cpp index c16583af38ab53..9b5159bf557830 100644 --- a/src/lib/support/tests/TestDefer.cpp +++ b/src/lib/support/tests/TestDefer.cpp @@ -17,48 +17,28 @@ */ #include <lib/support/Defer.h> -#include <lib/support/UnitTestRegistration.h> #include <memory> -#include <nlunit-test.h> - -using namespace chip; +#include <gtest/gtest.h> namespace { -static void TestDeferUsage(nlTestSuite * inSuite, void * inContext) +TEST(TestDefer, TestDeferUsage) { bool deferred = false; { auto deferredFunction = MakeDefer([&]() { deferred = true; }); - NL_TEST_ASSERT(inSuite, !deferred); + EXPECT_FALSE(deferred); } - NL_TEST_ASSERT(inSuite, deferred); + EXPECT_TRUE(deferred); deferred = false; { std::unique_ptr<int> movable; auto deferredFunction = MakeDefer([movable = std::move(movable), &deferred]() { deferred = true; }); } - NL_TEST_ASSERT(inSuite, deferred); + EXPECT_TRUE(deferred); } } // namespace - -#define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn) -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { NL_TEST_DEF_FN(TestDeferUsage), NL_TEST_SENTINEL() }; - -int TestDefer() -{ - nlTestSuite theSuite = { "CHIP Defer tests", &sTests[0], nullptr, nullptr }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestDefer) diff --git a/src/lib/support/tests/TestFixedBufferAllocator.cpp b/src/lib/support/tests/TestFixedBufferAllocator.cpp index ceb52f0cad327f..c5c588041ef65c 100644 --- a/src/lib/support/tests/TestFixedBufferAllocator.cpp +++ b/src/lib/support/tests/TestFixedBufferAllocator.cpp @@ -17,17 +17,15 @@ */ #include <lib/support/FixedBufferAllocator.h> -#include <lib/support/UnitTestContext.h> -#include <lib/support/UnitTestRegistration.h> #include <cstring> -#include <nlunit-test.h> +#include <gtest/gtest.h> using namespace chip; namespace { -void TestClone(nlTestSuite * inSuite, void * inContext) +TEST(TestFixedBufferAllocator, TestClone) { uint8_t buffer[128]; FixedBufferAllocator alloc(buffer); @@ -35,23 +33,23 @@ void TestClone(nlTestSuite * inSuite, void * inContext) static const char kTestString[] = "Test string"; const char * allocatedString = alloc.Clone(kTestString); - NL_TEST_EXIT_ON_FAILED_ASSERT(inSuite, allocatedString != nullptr); - NL_TEST_ASSERT(inSuite, allocatedString != kTestString); + ASSERT_NE(allocatedString, nullptr); + EXPECT_NE(allocatedString, kTestString); // NOLINTNEXTLINE(clang-analyzer-unix.cstring.NullArg): null check for allocated string already done - NL_TEST_ASSERT(inSuite, strcmp(allocatedString, kTestString) == 0); + EXPECT_STREQ(allocatedString, kTestString); const uint8_t kTestData[] = { 0xDE, 0xAD, 0xBE, 0xEF }; const uint8_t * allocatedData = alloc.Clone(kTestData, sizeof(kTestData)); - NL_TEST_EXIT_ON_FAILED_ASSERT(inSuite, allocatedData != nullptr); - NL_TEST_ASSERT(inSuite, allocatedData != kTestData); + ASSERT_NE(allocatedData, nullptr); + EXPECT_NE(allocatedData, kTestData); // NOLINTNEXTLINE(clang-analyzer-unix.cstring.NullArg): null check for allocated data already done - NL_TEST_ASSERT(inSuite, memcmp(allocatedData, kTestData, sizeof(kTestData)) == 0); + EXPECT_EQ(memcmp(allocatedData, kTestData, sizeof(kTestData)), 0); } -void TestOutOfMemory(nlTestSuite * inSuite, void * inContext) +TEST(TestFixedBufferAllocator, TestOutOfMemory) { uint8_t buffer[16]; FixedBufferAllocator alloc(buffer); @@ -59,26 +57,11 @@ void TestOutOfMemory(nlTestSuite * inSuite, void * inContext) static const char kTestData[] = "0123456789abcdef"; // Allocating 16 bytes still works... - NL_TEST_ASSERT(inSuite, alloc.Clone(kTestData, 16) != nullptr); - NL_TEST_ASSERT(inSuite, !alloc.AnyAllocFailed()); + EXPECT_NE(alloc.Clone(kTestData, 16), nullptr); + EXPECT_FALSE(alloc.AnyAllocFailed()); // ...but cannot allocate even one more byte... - NL_TEST_ASSERT(inSuite, alloc.Clone(kTestData, 1) == nullptr); - NL_TEST_ASSERT(inSuite, alloc.AnyAllocFailed()); + EXPECT_EQ(alloc.Clone(kTestData, 1), nullptr); + EXPECT_TRUE(alloc.AnyAllocFailed()); } - -const nlTest sTests[] = { NL_TEST_DEF("Test successful clone", TestClone), NL_TEST_DEF("Test out of memory", TestOutOfMemory), - NL_TEST_SENTINEL() }; - } // namespace - -int TestFixedBufferAllocator() -{ - nlTestSuite theSuite = { "CHIP FixedBufferAllocator tests", &sTests[0], nullptr, nullptr }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestFixedBufferAllocator) diff --git a/src/lib/support/tests/TestFold.cpp b/src/lib/support/tests/TestFold.cpp index f35160fa2fb4e4..48dbb454dfac3b 100644 --- a/src/lib/support/tests/TestFold.cpp +++ b/src/lib/support/tests/TestFold.cpp @@ -16,67 +16,52 @@ * limitations under the License. */ +#include <gtest/gtest.h> #include <lib/support/Fold.h> -#include <lib/support/UnitTestRegistration.h> #include <algorithm> #include <cstring> #include <initializer_list> -#include <nlunit-test.h> - using namespace chip; namespace { -void TestFoldMax(nlTestSuite * inSuite, void * inContext) +TEST(TestFold, TestFoldMax) { using List = std::initializer_list<int>; using Limits = std::numeric_limits<int>; const auto max = [](int left, int right) { return std::max(left, right); }; // Test empty list - NL_TEST_ASSERT(inSuite, Fold(List{}, -1000, max) == -1000); + EXPECT_EQ(Fold(List{}, -1000, max), -1000); // Test one-element (less than the initial value) - NL_TEST_ASSERT(inSuite, Fold(List{ -1001 }, -1000, max) == -1000); + EXPECT_EQ(Fold(List{ -1001 }, -1000, max), -1000); // Test one-element (greater than the initial value) - NL_TEST_ASSERT(inSuite, Fold(List{ -999 }, -1000, max) == -999); + EXPECT_EQ(Fold(List{ -999 }, -1000, max), -999); // Test limits - NL_TEST_ASSERT(inSuite, Fold(List{ 1000, Limits::max(), 0 }, 0, max) == Limits::max()); - NL_TEST_ASSERT(inSuite, Fold(List{ Limits::max(), 1000, Limits::min() }, Limits::min(), max) == Limits::max()); + EXPECT_EQ(Fold(List{ 1000, Limits::max(), 0 }, 0, max), Limits::max()); + EXPECT_EQ(Fold(List{ Limits::max(), 1000, Limits::min() }, Limits::min(), max), Limits::max()); } -void TestSum(nlTestSuite * inSuite, void * inContext) +TEST(TestFold, TestSum) { using List = std::initializer_list<int>; using Limits = std::numeric_limits<int>; // Test empty list - NL_TEST_ASSERT(inSuite, Sum(List{}) == 0); + EXPECT_FALSE(Sum(List{})); // Test one-element (min) - NL_TEST_ASSERT(inSuite, Sum(List{ Limits::min() }) == Limits::min()); + EXPECT_EQ(Sum(List{ Limits::min() }), Limits::min()); // Test one-element (max) - NL_TEST_ASSERT(inSuite, Sum(List{ Limits::max() }) == Limits::max()); + EXPECT_EQ(Sum(List{ Limits::max() }), Limits::max()); // Test multiple elements - NL_TEST_ASSERT(inSuite, Sum(List{ 0, 5, 1, 4, 2, 3 }) == 15); + EXPECT_EQ(Sum(List{ 0, 5, 1, 4, 2, 3 }), 15); } -const nlTest sTests[] = { NL_TEST_DEF("Test fold (max)", TestFoldMax), NL_TEST_DEF("Test sum", TestSum), NL_TEST_SENTINEL() }; - } // namespace - -int TestFold() -{ - nlTestSuite theSuite = { "Fold tests", &sTests[0], nullptr, nullptr }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestFold) diff --git a/src/lib/support/tests/TestIniEscaping.cpp b/src/lib/support/tests/TestIniEscaping.cpp index 734ddf85b31e7b..90570add67b18d 100644 --- a/src/lib/support/tests/TestIniEscaping.cpp +++ b/src/lib/support/tests/TestIniEscaping.cpp @@ -16,10 +16,8 @@ * limitations under the License. */ +#include <gtest/gtest.h> #include <lib/support/IniEscaping.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> - #include <string> using namespace chip; @@ -33,80 +31,67 @@ struct TestCase const char * expectedOutput; }; -void TestEscaping(nlTestSuite * inSuite, void * inContext) +TEST(TestIniEscaping, TestEscaping) { - NL_TEST_ASSERT(inSuite, EscapeKey("") == ""); - NL_TEST_ASSERT(inSuite, EscapeKey("abcd1234,!") == "abcd1234,!"); - NL_TEST_ASSERT(inSuite, EscapeKey("ab\ncd =12\\34\x7f") == "ab\\x0acd\\x20\\x3d12\\x5c34\\x7f"); - NL_TEST_ASSERT(inSuite, EscapeKey(" ") == "\\x20"); - NL_TEST_ASSERT(inSuite, EscapeKey("===") == "\\x3d\\x3d\\x3d"); + EXPECT_EQ(EscapeKey(""), ""); + EXPECT_EQ(EscapeKey("abcd1234,!"), "abcd1234,!"); + EXPECT_EQ(EscapeKey("ab\ncd =12\\34\x7f"), "ab\\x0acd\\x20\\x3d12\\x5c34\\x7f"); + EXPECT_EQ(EscapeKey(" "), "\\x20"); + EXPECT_EQ(EscapeKey("==="), "\\x3d\\x3d\\x3d"); } -void TestUnescaping(nlTestSuite * inSuite, void * inContext) +TEST(TestIniEscaping, TestUnescaping) { // Test valid cases - NL_TEST_ASSERT(inSuite, UnescapeKey("") == ""); - NL_TEST_ASSERT(inSuite, UnescapeKey("abcd1234,!") == "abcd1234,!"); - NL_TEST_ASSERT(inSuite, UnescapeKey("ab\\x0acd\\x20\\x3d12\\x5c34\\x7f") == "ab\ncd =12\\34\x7f"); - NL_TEST_ASSERT(inSuite, UnescapeKey("\\x20") == " "); - NL_TEST_ASSERT(inSuite, UnescapeKey("\\x3d\\x3d\\x3d") == "==="); - NL_TEST_ASSERT(inSuite, UnescapeKey("\\x0d") == "\r"); - - NL_TEST_ASSERT(inSuite, UnescapeKey("\\x01\\x02\\x03\\x04\\x05\\x06\\x07") == "\x01\x02\x03\x04\x05\x06\x07"); - NL_TEST_ASSERT(inSuite, UnescapeKey("\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e") == "\x08\x09\x0a\x0b\x0c\x0d\x0e"); - NL_TEST_ASSERT(inSuite, UnescapeKey("\\x0f\\x10\\x11\\x12\\x13\\x14\\x15") == "\x0f\x10\x11\x12\x13\x14\x15"); - NL_TEST_ASSERT(inSuite, UnescapeKey("\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c") == "\x16\x17\x18\x19\x1a\x1b\x1c"); - NL_TEST_ASSERT(inSuite, UnescapeKey("\\x1d\\x1e\\x1f\\x20\\x7f\\x3d\\x5c") == "\x1d\x1e\x1f \x7f=\\"); - NL_TEST_ASSERT(inSuite, UnescapeKey("\\x81\\x82\\xff") == "\x81\x82\xff"); + EXPECT_EQ(UnescapeKey(""), ""); + EXPECT_EQ(UnescapeKey("abcd1234,!"), "abcd1234,!"); + EXPECT_EQ(UnescapeKey("ab\\x0acd\\x20\\x3d12\\x5c34\\x7f"), "ab\ncd =12\\34\x7f"); + EXPECT_EQ(UnescapeKey("\\x20"), " "); + EXPECT_EQ(UnescapeKey("\\x3d\\x3d\\x3d"), "==="); + EXPECT_EQ(UnescapeKey("\\x0d"), "\r"); + + EXPECT_EQ(UnescapeKey("\\x01\\x02\\x03\\x04\\x05\\x06\\x07"), "\x01\x02\x03\x04\x05\x06\x07"); + EXPECT_EQ(UnescapeKey("\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e"), "\x08\x09\x0a\x0b\x0c\x0d\x0e"); + EXPECT_EQ(UnescapeKey("\\x0f\\x10\\x11\\x12\\x13\\x14\\x15"), "\x0f\x10\x11\x12\x13\x14\x15"); + EXPECT_EQ(UnescapeKey("\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c"), "\x16\x17\x18\x19\x1a\x1b\x1c"); + EXPECT_EQ(UnescapeKey("\\x1d\\x1e\\x1f\\x20\\x7f\\x3d\\x5c"), "\x1d\x1e\x1f \x7f=\\"); + EXPECT_EQ(UnescapeKey("\\x81\\x82\\xff"), "\x81\x82\xff"); // Test invalid cases // letters should never be escaped - NL_TEST_ASSERT(inSuite, UnescapeKey("\\x5a\55") != "ZU"); - NL_TEST_ASSERT(inSuite, UnescapeKey("\\x5a\55") == ""); + EXPECT_NE(UnescapeKey("\\x5a\55"), "ZU"); + EXPECT_EQ(UnescapeKey("\\x5a\55"), ""); // Capitalized hex forbidden - NL_TEST_ASSERT(inSuite, UnescapeKey("\\x0D") == ""); + EXPECT_EQ(UnescapeKey("\\x0D"), ""); // Partial escapes forbidden - NL_TEST_ASSERT(inSuite, UnescapeKey("1\\x0") == ""); + EXPECT_EQ(UnescapeKey("1\\x0"), ""); } -void TestRoundTrip(nlTestSuite * inSuite, void * inContext) +TEST(TestIniEscaping, TestRoundTrip) { - NL_TEST_ASSERT(inSuite, UnescapeKey(EscapeKey("")) == ""); - NL_TEST_ASSERT(inSuite, UnescapeKey(EscapeKey("abcd1234,!")) == "abcd1234,!"); - NL_TEST_ASSERT(inSuite, UnescapeKey(EscapeKey("ab\ncd =12\\34\x7f")) == "ab\ncd =12\\34\x7f"); - NL_TEST_ASSERT(inSuite, UnescapeKey(EscapeKey(" ")) == " "); - NL_TEST_ASSERT(inSuite, UnescapeKey(EscapeKey("===")) == "==="); - NL_TEST_ASSERT(inSuite, UnescapeKey(EscapeKey("\r")) == "\r"); - - NL_TEST_ASSERT(inSuite, UnescapeKey(EscapeKey("\x01\x02\x03\x04\x05\x06\x07")) == "\x01\x02\x03\x04\x05\x06\x07"); - NL_TEST_ASSERT(inSuite, UnescapeKey(EscapeKey("\x08\x09\x0a\x0b\x0c\x0d\x0e")) == "\x08\x09\x0a\x0b\x0c\x0d\x0e"); - NL_TEST_ASSERT(inSuite, UnescapeKey(EscapeKey("\x0f\x10\x11\x12\x13\x14\x15")) == "\x0f\x10\x11\x12\x13\x14\x15"); - NL_TEST_ASSERT(inSuite, UnescapeKey(EscapeKey("\x16\x17\x18\x19\x1a\x1b\x1c")) == "\x16\x17\x18\x19\x1a\x1b\x1c"); - NL_TEST_ASSERT(inSuite, UnescapeKey(EscapeKey("\x1d\x1e\x1f \x7f=\\")) == "\x1d\x1e\x1f \x7f=\\"); - NL_TEST_ASSERT(inSuite, UnescapeKey(EscapeKey("\x81\x82\xff")) == "\x81\x82\xff"); + EXPECT_EQ(UnescapeKey(EscapeKey("")), ""); + EXPECT_EQ(UnescapeKey(EscapeKey("abcd1234,!")), "abcd1234,!"); + EXPECT_EQ(UnescapeKey(EscapeKey("ab\ncd =12\\34\x7f")), "ab\ncd =12\\34\x7f"); + EXPECT_EQ(UnescapeKey(EscapeKey(" ")), " "); + EXPECT_EQ(UnescapeKey(EscapeKey("===")), "==="); + EXPECT_EQ(UnescapeKey(EscapeKey("\r")), "\r"); + + EXPECT_EQ(UnescapeKey(EscapeKey("\x01\x02\x03\x04\x05\x06\x07")), "\x01\x02\x03\x04\x05\x06\x07"); + EXPECT_EQ(UnescapeKey(EscapeKey("\x08\x09\x0a\x0b\x0c\x0d\x0e")), "\x08\x09\x0a\x0b\x0c\x0d\x0e"); + EXPECT_EQ(UnescapeKey(EscapeKey("\x0f\x10\x11\x12\x13\x14\x15")), "\x0f\x10\x11\x12\x13\x14\x15"); + EXPECT_EQ(UnescapeKey(EscapeKey("\x16\x17\x18\x19\x1a\x1b\x1c")), "\x16\x17\x18\x19\x1a\x1b\x1c"); + EXPECT_EQ(UnescapeKey(EscapeKey("\x1d\x1e\x1f \x7f=\\")), "\x1d\x1e\x1f \x7f=\\"); + EXPECT_EQ(UnescapeKey(EscapeKey("\x81\x82\xff")), "\x81\x82\xff"); // Make sure entire range is escapable for (int c = 0; c <= 255; c++) { std::string s(5, static_cast<char>(c)); - NL_TEST_ASSERT_LOOP(inSuite, c, UnescapeKey(EscapeKey(s)) == s); + EXPECT_EQ(UnescapeKey(EscapeKey(s)), s) << "c: " << c; } } -const nlTest sTests[] = { NL_TEST_DEF("Test escaping API", TestEscaping), NL_TEST_DEF("Test unescaping API", TestUnescaping), - NL_TEST_DEF("Test escaping API round-tripping with itself", TestRoundTrip), NL_TEST_SENTINEL() }; - } // namespace - -int TestIniEscaping() -{ - nlTestSuite theSuite = { "IniEscaping tests", &sTests[0], nullptr, nullptr }; - - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestIniEscaping); diff --git a/src/lib/support/tests/TestSafeInt.cpp b/src/lib/support/tests/TestSafeInt.cpp index 3108e74778ce7e..1464c0e9735b8c 100644 --- a/src/lib/support/tests/TestSafeInt.cpp +++ b/src/lib/support/tests/TestSafeInt.cpp @@ -22,346 +22,325 @@ * */ +#include <gtest/gtest.h> #include <lib/support/SafeInt.h> -#include <lib/support/UnitTestRegistration.h> - -#include <nlunit-test.h> using namespace chip; -static void TestCanCastTo_Int8(nlTestSuite * inSuite, void * inContext) +TEST(TestSafeInt, TestCanCastTo_Int8) { - NL_TEST_ASSERT(inSuite, CanCastTo<uint8_t>(0)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint8_t>(127)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint8_t>(128)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint8_t>(129)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint8_t>(255)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(256)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(32767)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(32768)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(32769)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(65535)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(65536)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(2147483647ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(2147483648ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(2147483649ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(4294967295ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(4294967296ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(9223372036854775807ull)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(9223372036854775808ull)); + EXPECT_TRUE(CanCastTo<uint8_t>(0)); + EXPECT_TRUE(CanCastTo<uint8_t>(127)); + EXPECT_TRUE(CanCastTo<uint8_t>(128)); + EXPECT_TRUE(CanCastTo<uint8_t>(129)); + EXPECT_TRUE(CanCastTo<uint8_t>(255)); + EXPECT_FALSE(CanCastTo<uint8_t>(256)); + EXPECT_FALSE(CanCastTo<uint8_t>(32767)); + EXPECT_FALSE(CanCastTo<uint8_t>(32768)); + EXPECT_FALSE(CanCastTo<uint8_t>(32769)); + EXPECT_FALSE(CanCastTo<uint8_t>(65535)); + EXPECT_FALSE(CanCastTo<uint8_t>(65536)); + EXPECT_FALSE(CanCastTo<uint8_t>(2147483647ll)); + EXPECT_FALSE(CanCastTo<uint8_t>(2147483648ll)); + EXPECT_FALSE(CanCastTo<uint8_t>(2147483649ll)); + EXPECT_FALSE(CanCastTo<uint8_t>(4294967295ll)); + EXPECT_FALSE(CanCastTo<uint8_t>(4294967296ll)); + EXPECT_FALSE(CanCastTo<uint8_t>(9223372036854775807ull)); + EXPECT_FALSE(CanCastTo<uint8_t>(9223372036854775808ull)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-1)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-127)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-128)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-129)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-255)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-256)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-32767)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-32768)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-32769)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-65535)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-65536)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-2147483647ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-2147483648ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-2147483649ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-4294967295ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-4294967296ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint8_t>(-9223372036854775807ll)); + EXPECT_FALSE(CanCastTo<uint8_t>(-1)); + EXPECT_FALSE(CanCastTo<uint8_t>(-127)); + EXPECT_FALSE(CanCastTo<uint8_t>(-128)); + EXPECT_FALSE(CanCastTo<uint8_t>(-129)); + EXPECT_FALSE(CanCastTo<uint8_t>(-255)); + EXPECT_FALSE(CanCastTo<uint8_t>(-256)); + EXPECT_FALSE(CanCastTo<uint8_t>(-32767)); + EXPECT_FALSE(CanCastTo<uint8_t>(-32768)); + EXPECT_FALSE(CanCastTo<uint8_t>(-32769)); + EXPECT_FALSE(CanCastTo<uint8_t>(-65535)); + EXPECT_FALSE(CanCastTo<uint8_t>(-65536)); + EXPECT_FALSE(CanCastTo<uint8_t>(-2147483647ll)); + EXPECT_FALSE(CanCastTo<uint8_t>(-2147483648ll)); + EXPECT_FALSE(CanCastTo<uint8_t>(-2147483649ll)); + EXPECT_FALSE(CanCastTo<uint8_t>(-4294967295ll)); + EXPECT_FALSE(CanCastTo<uint8_t>(-4294967296ll)); + EXPECT_FALSE(CanCastTo<uint8_t>(-9223372036854775807ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<int8_t>(0)); - NL_TEST_ASSERT(inSuite, CanCastTo<int8_t>(127)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(128)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(129)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(255)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(256)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(32767)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(32768)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(32769)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(65535)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(65536)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(2147483647ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(2147483648ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(2147483649ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(4294967295ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(4294967296ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(9223372036854775807ull)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(9223372036854775808ull)); + EXPECT_TRUE(CanCastTo<int8_t>(0)); + EXPECT_TRUE(CanCastTo<int8_t>(127)); + EXPECT_FALSE(CanCastTo<int8_t>(128)); + EXPECT_FALSE(CanCastTo<int8_t>(129)); + EXPECT_FALSE(CanCastTo<int8_t>(255)); + EXPECT_FALSE(CanCastTo<int8_t>(256)); + EXPECT_FALSE(CanCastTo<int8_t>(32767)); + EXPECT_FALSE(CanCastTo<int8_t>(32768)); + EXPECT_FALSE(CanCastTo<int8_t>(32769)); + EXPECT_FALSE(CanCastTo<int8_t>(65535)); + EXPECT_FALSE(CanCastTo<int8_t>(65536)); + EXPECT_FALSE(CanCastTo<int8_t>(2147483647ll)); + EXPECT_FALSE(CanCastTo<int8_t>(2147483648ll)); + EXPECT_FALSE(CanCastTo<int8_t>(2147483649ll)); + EXPECT_FALSE(CanCastTo<int8_t>(4294967295ll)); + EXPECT_FALSE(CanCastTo<int8_t>(4294967296ll)); + EXPECT_FALSE(CanCastTo<int8_t>(9223372036854775807ull)); + EXPECT_FALSE(CanCastTo<int8_t>(9223372036854775808ull)); - NL_TEST_ASSERT(inSuite, CanCastTo<int8_t>(-1)); - NL_TEST_ASSERT(inSuite, CanCastTo<int8_t>(-127)); - NL_TEST_ASSERT(inSuite, CanCastTo<int8_t>(-128)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-129)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-255)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-256)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-32767)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-32768)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-32769)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-65535)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-65536)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-2147483647ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-2147483648ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-2147483649ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-4294967295ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-4294967296ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int8_t>(-9223372036854775807ll)); + EXPECT_TRUE(CanCastTo<int8_t>(-1)); + EXPECT_TRUE(CanCastTo<int8_t>(-127)); + EXPECT_TRUE(CanCastTo<int8_t>(-128)); + EXPECT_FALSE(CanCastTo<int8_t>(-129)); + EXPECT_FALSE(CanCastTo<int8_t>(-255)); + EXPECT_FALSE(CanCastTo<int8_t>(-256)); + EXPECT_FALSE(CanCastTo<int8_t>(-32767)); + EXPECT_FALSE(CanCastTo<int8_t>(-32768)); + EXPECT_FALSE(CanCastTo<int8_t>(-32769)); + EXPECT_FALSE(CanCastTo<int8_t>(-65535)); + EXPECT_FALSE(CanCastTo<int8_t>(-65536)); + EXPECT_FALSE(CanCastTo<int8_t>(-2147483647ll)); + EXPECT_FALSE(CanCastTo<int8_t>(-2147483648ll)); + EXPECT_FALSE(CanCastTo<int8_t>(-2147483649ll)); + EXPECT_FALSE(CanCastTo<int8_t>(-4294967295ll)); + EXPECT_FALSE(CanCastTo<int8_t>(-4294967296ll)); + EXPECT_FALSE(CanCastTo<int8_t>(-9223372036854775807ll)); } -static void TestCanCastTo_Int16(nlTestSuite * inSuite, void * inContext) +TEST(TestSafeInt, TestCanCastTo_Int16) { - NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(0)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(127)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(128)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(129)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(255)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(256)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(32767)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(32768)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(32769)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint16_t>(65535)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(65536)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(2147483647ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(2147483648ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(2147483649ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(4294967295ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(4294967296ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(9223372036854775807ull)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(9223372036854775808ull)); + EXPECT_TRUE(CanCastTo<uint16_t>(0)); + EXPECT_TRUE(CanCastTo<uint16_t>(127)); + EXPECT_TRUE(CanCastTo<uint16_t>(128)); + EXPECT_TRUE(CanCastTo<uint16_t>(129)); + EXPECT_TRUE(CanCastTo<uint16_t>(255)); + EXPECT_TRUE(CanCastTo<uint16_t>(256)); + EXPECT_TRUE(CanCastTo<uint16_t>(32767)); + EXPECT_TRUE(CanCastTo<uint16_t>(32768)); + EXPECT_TRUE(CanCastTo<uint16_t>(32769)); + EXPECT_TRUE(CanCastTo<uint16_t>(65535)); + EXPECT_FALSE(CanCastTo<uint16_t>(65536)); + EXPECT_FALSE(CanCastTo<uint16_t>(2147483647ll)); + EXPECT_FALSE(CanCastTo<uint16_t>(2147483648ll)); + EXPECT_FALSE(CanCastTo<uint16_t>(2147483649ll)); + EXPECT_FALSE(CanCastTo<uint16_t>(4294967295ll)); + EXPECT_FALSE(CanCastTo<uint16_t>(4294967296ll)); + EXPECT_FALSE(CanCastTo<uint16_t>(9223372036854775807ull)); + EXPECT_FALSE(CanCastTo<uint16_t>(9223372036854775808ull)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-1)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-127)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-128)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-129)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-255)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-256)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-32767)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-32768)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-32769)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-65535)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-65536)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-2147483647ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-2147483648ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-2147483649ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-4294967295ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-4294967296ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint16_t>(-9223372036854775807ll)); + EXPECT_FALSE(CanCastTo<uint16_t>(-1)); + EXPECT_FALSE(CanCastTo<uint16_t>(-127)); + EXPECT_FALSE(CanCastTo<uint16_t>(-128)); + EXPECT_FALSE(CanCastTo<uint16_t>(-129)); + EXPECT_FALSE(CanCastTo<uint16_t>(-255)); + EXPECT_FALSE(CanCastTo<uint16_t>(-256)); + EXPECT_FALSE(CanCastTo<uint16_t>(-32767)); + EXPECT_FALSE(CanCastTo<uint16_t>(-32768)); + EXPECT_FALSE(CanCastTo<uint16_t>(-32769)); + EXPECT_FALSE(CanCastTo<uint16_t>(-65535)); + EXPECT_FALSE(CanCastTo<uint16_t>(-65536)); + EXPECT_FALSE(CanCastTo<uint16_t>(-2147483647ll)); + EXPECT_FALSE(CanCastTo<uint16_t>(-2147483648ll)); + EXPECT_FALSE(CanCastTo<uint16_t>(-2147483649ll)); + EXPECT_FALSE(CanCastTo<uint16_t>(-4294967295ll)); + EXPECT_FALSE(CanCastTo<uint16_t>(-4294967296ll)); + EXPECT_FALSE(CanCastTo<uint16_t>(-9223372036854775807ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(0)); - NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(127)); - NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(128)); - NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(129)); - NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(255)); - NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(256)); - NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(32767)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(32768)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(32769)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(65535)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(65536)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(2147483647ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(2147483648ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(2147483649ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(4294967295ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(4294967296ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(9223372036854775807ull)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(9223372036854775808ull)); + EXPECT_TRUE(CanCastTo<int16_t>(0)); + EXPECT_TRUE(CanCastTo<int16_t>(127)); + EXPECT_TRUE(CanCastTo<int16_t>(128)); + EXPECT_TRUE(CanCastTo<int16_t>(129)); + EXPECT_TRUE(CanCastTo<int16_t>(255)); + EXPECT_TRUE(CanCastTo<int16_t>(256)); + EXPECT_TRUE(CanCastTo<int16_t>(32767)); + EXPECT_FALSE(CanCastTo<int16_t>(32768)); + EXPECT_FALSE(CanCastTo<int16_t>(32769)); + EXPECT_FALSE(CanCastTo<int16_t>(65535)); + EXPECT_FALSE(CanCastTo<int16_t>(65536)); + EXPECT_FALSE(CanCastTo<int16_t>(2147483647ll)); + EXPECT_FALSE(CanCastTo<int16_t>(2147483648ll)); + EXPECT_FALSE(CanCastTo<int16_t>(2147483649ll)); + EXPECT_FALSE(CanCastTo<int16_t>(4294967295ll)); + EXPECT_FALSE(CanCastTo<int16_t>(4294967296ll)); + EXPECT_FALSE(CanCastTo<int16_t>(9223372036854775807ull)); + EXPECT_FALSE(CanCastTo<int16_t>(9223372036854775808ull)); - NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-1)); - NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-127)); - NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-128)); - NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-129)); - NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-255)); - NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-256)); - NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-32767)); - NL_TEST_ASSERT(inSuite, CanCastTo<int16_t>(-32768)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-32769)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-65535)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-65536)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-2147483647ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-2147483648ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-2147483649ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-4294967295ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-4294967296ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int16_t>(-9223372036854775807ll)); + EXPECT_TRUE(CanCastTo<int16_t>(-1)); + EXPECT_TRUE(CanCastTo<int16_t>(-127)); + EXPECT_TRUE(CanCastTo<int16_t>(-128)); + EXPECT_TRUE(CanCastTo<int16_t>(-129)); + EXPECT_TRUE(CanCastTo<int16_t>(-255)); + EXPECT_TRUE(CanCastTo<int16_t>(-256)); + EXPECT_TRUE(CanCastTo<int16_t>(-32767)); + EXPECT_TRUE(CanCastTo<int16_t>(-32768)); + EXPECT_FALSE(CanCastTo<int16_t>(-32769)); + EXPECT_FALSE(CanCastTo<int16_t>(-65535)); + EXPECT_FALSE(CanCastTo<int16_t>(-65536)); + EXPECT_FALSE(CanCastTo<int16_t>(-2147483647ll)); + EXPECT_FALSE(CanCastTo<int16_t>(-2147483648ll)); + EXPECT_FALSE(CanCastTo<int16_t>(-2147483649ll)); + EXPECT_FALSE(CanCastTo<int16_t>(-4294967295ll)); + EXPECT_FALSE(CanCastTo<int16_t>(-4294967296ll)); + EXPECT_FALSE(CanCastTo<int16_t>(-9223372036854775807ll)); } -static void TestCanCastTo_Int32(nlTestSuite * inSuite, void * inContext) +TEST(TestSafeInt, TestCanCastTo_Int32) { - NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(0)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(127)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(128)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(129)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(255)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(256)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(32767)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(32768)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(32769)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(65535)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(65536)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(2147483647ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(2147483648ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(2147483649ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint32_t>(4294967295ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(4294967296ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(9223372036854775807ull)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(9223372036854775808ull)); + EXPECT_TRUE(CanCastTo<uint32_t>(0)); + EXPECT_TRUE(CanCastTo<uint32_t>(127)); + EXPECT_TRUE(CanCastTo<uint32_t>(128)); + EXPECT_TRUE(CanCastTo<uint32_t>(129)); + EXPECT_TRUE(CanCastTo<uint32_t>(255)); + EXPECT_TRUE(CanCastTo<uint32_t>(256)); + EXPECT_TRUE(CanCastTo<uint32_t>(32767)); + EXPECT_TRUE(CanCastTo<uint32_t>(32768)); + EXPECT_TRUE(CanCastTo<uint32_t>(32769)); + EXPECT_TRUE(CanCastTo<uint32_t>(65535)); + EXPECT_TRUE(CanCastTo<uint32_t>(65536)); + EXPECT_TRUE(CanCastTo<uint32_t>(2147483647ll)); + EXPECT_TRUE(CanCastTo<uint32_t>(2147483648ll)); + EXPECT_TRUE(CanCastTo<uint32_t>(2147483649ll)); + EXPECT_TRUE(CanCastTo<uint32_t>(4294967295ll)); + EXPECT_FALSE(CanCastTo<uint32_t>(4294967296ll)); + EXPECT_FALSE(CanCastTo<uint32_t>(9223372036854775807ull)); + EXPECT_FALSE(CanCastTo<uint32_t>(9223372036854775808ull)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-1)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-127)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-128)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-129)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-255)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-256)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-32767)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-32768)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-32769)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-65535)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-65536)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-2147483647ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-2147483648ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-2147483649ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-4294967295ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-4294967296ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint32_t>(-9223372036854775807ll)); + EXPECT_FALSE(CanCastTo<uint32_t>(-1)); + EXPECT_FALSE(CanCastTo<uint32_t>(-127)); + EXPECT_FALSE(CanCastTo<uint32_t>(-128)); + EXPECT_FALSE(CanCastTo<uint32_t>(-129)); + EXPECT_FALSE(CanCastTo<uint32_t>(-255)); + EXPECT_FALSE(CanCastTo<uint32_t>(-256)); + EXPECT_FALSE(CanCastTo<uint32_t>(-32767)); + EXPECT_FALSE(CanCastTo<uint32_t>(-32768)); + EXPECT_FALSE(CanCastTo<uint32_t>(-32769)); + EXPECT_FALSE(CanCastTo<uint32_t>(-65535)); + EXPECT_FALSE(CanCastTo<uint32_t>(-65536)); + EXPECT_FALSE(CanCastTo<uint32_t>(-2147483647ll)); + EXPECT_FALSE(CanCastTo<uint32_t>(-2147483648ll)); + EXPECT_FALSE(CanCastTo<uint32_t>(-2147483649ll)); + EXPECT_FALSE(CanCastTo<uint32_t>(-4294967295ll)); + EXPECT_FALSE(CanCastTo<uint32_t>(-4294967296ll)); + EXPECT_FALSE(CanCastTo<uint32_t>(-9223372036854775807ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(0)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(127)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(128)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(129)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(255)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(256)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(32767)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(32768)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(32769)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(65535)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(65536)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(2147483647ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(2147483648ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(2147483649ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(4294967295ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(4294967296ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(9223372036854775807ull)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(9223372036854775808ull)); + EXPECT_TRUE(CanCastTo<int32_t>(0)); + EXPECT_TRUE(CanCastTo<int32_t>(127)); + EXPECT_TRUE(CanCastTo<int32_t>(128)); + EXPECT_TRUE(CanCastTo<int32_t>(129)); + EXPECT_TRUE(CanCastTo<int32_t>(255)); + EXPECT_TRUE(CanCastTo<int32_t>(256)); + EXPECT_TRUE(CanCastTo<int32_t>(32767)); + EXPECT_TRUE(CanCastTo<int32_t>(32768)); + EXPECT_TRUE(CanCastTo<int32_t>(32769)); + EXPECT_TRUE(CanCastTo<int32_t>(65535)); + EXPECT_TRUE(CanCastTo<int32_t>(65536)); + EXPECT_TRUE(CanCastTo<int32_t>(2147483647ll)); + EXPECT_FALSE(CanCastTo<int32_t>(2147483648ll)); + EXPECT_FALSE(CanCastTo<int32_t>(2147483649ll)); + EXPECT_FALSE(CanCastTo<int32_t>(4294967295ll)); + EXPECT_FALSE(CanCastTo<int32_t>(4294967296ll)); + EXPECT_FALSE(CanCastTo<int32_t>(9223372036854775807ull)); + EXPECT_FALSE(CanCastTo<int32_t>(9223372036854775808ull)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-1)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-127)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-128)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-129)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-255)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-256)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-32767)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-32768)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-32769)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-65535)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-65536)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-2147483647ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<int32_t>(-2147483648ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(-2147483649ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(-4294967295ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(-4294967296ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int32_t>(-9223372036854775807ll)); + EXPECT_TRUE(CanCastTo<int32_t>(-1)); + EXPECT_TRUE(CanCastTo<int32_t>(-127)); + EXPECT_TRUE(CanCastTo<int32_t>(-128)); + EXPECT_TRUE(CanCastTo<int32_t>(-129)); + EXPECT_TRUE(CanCastTo<int32_t>(-255)); + EXPECT_TRUE(CanCastTo<int32_t>(-256)); + EXPECT_TRUE(CanCastTo<int32_t>(-32767)); + EXPECT_TRUE(CanCastTo<int32_t>(-32768)); + EXPECT_TRUE(CanCastTo<int32_t>(-32769)); + EXPECT_TRUE(CanCastTo<int32_t>(-65535)); + EXPECT_TRUE(CanCastTo<int32_t>(-65536)); + EXPECT_TRUE(CanCastTo<int32_t>(-2147483647ll)); + EXPECT_TRUE(CanCastTo<int32_t>(-2147483648ll)); + EXPECT_FALSE(CanCastTo<int32_t>(-2147483649ll)); + EXPECT_FALSE(CanCastTo<int32_t>(-4294967295ll)); + EXPECT_FALSE(CanCastTo<int32_t>(-4294967296ll)); + EXPECT_FALSE(CanCastTo<int32_t>(-9223372036854775807ll)); } -static void TestCanCastTo_Int64(nlTestSuite * inSuite, void * inContext) +TEST(TestSafeInt, TestCanCastTo_Int64) { - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(0)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(127)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(128)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(129)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(255)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(256)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(32767)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(32768)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(32769)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(65535)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(65536)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(2147483647ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(2147483648ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(2147483649ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(4294967295ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(4294967296ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(9223372036854775807ull)); - NL_TEST_ASSERT(inSuite, CanCastTo<uint64_t>(9223372036854775808ull)); + EXPECT_TRUE(CanCastTo<uint64_t>(0)); + EXPECT_TRUE(CanCastTo<uint64_t>(127)); + EXPECT_TRUE(CanCastTo<uint64_t>(128)); + EXPECT_TRUE(CanCastTo<uint64_t>(129)); + EXPECT_TRUE(CanCastTo<uint64_t>(255)); + EXPECT_TRUE(CanCastTo<uint64_t>(256)); + EXPECT_TRUE(CanCastTo<uint64_t>(32767)); + EXPECT_TRUE(CanCastTo<uint64_t>(32768)); + EXPECT_TRUE(CanCastTo<uint64_t>(32769)); + EXPECT_TRUE(CanCastTo<uint64_t>(65535)); + EXPECT_TRUE(CanCastTo<uint64_t>(65536)); + EXPECT_TRUE(CanCastTo<uint64_t>(2147483647ll)); + EXPECT_TRUE(CanCastTo<uint64_t>(2147483648ll)); + EXPECT_TRUE(CanCastTo<uint64_t>(2147483649ll)); + EXPECT_TRUE(CanCastTo<uint64_t>(4294967295ll)); + EXPECT_TRUE(CanCastTo<uint64_t>(4294967296ll)); + EXPECT_TRUE(CanCastTo<uint64_t>(9223372036854775807ull)); + EXPECT_TRUE(CanCastTo<uint64_t>(9223372036854775808ull)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-1)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-127)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-128)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-129)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-255)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-256)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-32767)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-32768)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-32769)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-65535)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-65536)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-2147483647ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-2147483648ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-2147483649ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-4294967295ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-4294967296ll)); - NL_TEST_ASSERT(inSuite, !CanCastTo<uint64_t>(-9223372036854775807ll)); + EXPECT_FALSE(CanCastTo<uint64_t>(-1)); + EXPECT_FALSE(CanCastTo<uint64_t>(-127)); + EXPECT_FALSE(CanCastTo<uint64_t>(-128)); + EXPECT_FALSE(CanCastTo<uint64_t>(-129)); + EXPECT_FALSE(CanCastTo<uint64_t>(-255)); + EXPECT_FALSE(CanCastTo<uint64_t>(-256)); + EXPECT_FALSE(CanCastTo<uint64_t>(-32767)); + EXPECT_FALSE(CanCastTo<uint64_t>(-32768)); + EXPECT_FALSE(CanCastTo<uint64_t>(-32769)); + EXPECT_FALSE(CanCastTo<uint64_t>(-65535)); + EXPECT_FALSE(CanCastTo<uint64_t>(-65536)); + EXPECT_FALSE(CanCastTo<uint64_t>(-2147483647ll)); + EXPECT_FALSE(CanCastTo<uint64_t>(-2147483648ll)); + EXPECT_FALSE(CanCastTo<uint64_t>(-2147483649ll)); + EXPECT_FALSE(CanCastTo<uint64_t>(-4294967295ll)); + EXPECT_FALSE(CanCastTo<uint64_t>(-4294967296ll)); + EXPECT_FALSE(CanCastTo<uint64_t>(-9223372036854775807ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(0)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(127)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(128)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(129)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(255)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(256)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(32767)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(32768)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(32769)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(65535)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(65536)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(2147483647ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(2147483648ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(2147483649ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(4294967295ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(4294967296ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(9223372036854775807ull)); - NL_TEST_ASSERT(inSuite, !CanCastTo<int64_t>(9223372036854775808ull)); + EXPECT_TRUE(CanCastTo<int64_t>(0)); + EXPECT_TRUE(CanCastTo<int64_t>(127)); + EXPECT_TRUE(CanCastTo<int64_t>(128)); + EXPECT_TRUE(CanCastTo<int64_t>(129)); + EXPECT_TRUE(CanCastTo<int64_t>(255)); + EXPECT_TRUE(CanCastTo<int64_t>(256)); + EXPECT_TRUE(CanCastTo<int64_t>(32767)); + EXPECT_TRUE(CanCastTo<int64_t>(32768)); + EXPECT_TRUE(CanCastTo<int64_t>(32769)); + EXPECT_TRUE(CanCastTo<int64_t>(65535)); + EXPECT_TRUE(CanCastTo<int64_t>(65536)); + EXPECT_TRUE(CanCastTo<int64_t>(2147483647ll)); + EXPECT_TRUE(CanCastTo<int64_t>(2147483648ll)); + EXPECT_TRUE(CanCastTo<int64_t>(2147483649ll)); + EXPECT_TRUE(CanCastTo<int64_t>(4294967295ll)); + EXPECT_TRUE(CanCastTo<int64_t>(4294967296ll)); + EXPECT_TRUE(CanCastTo<int64_t>(9223372036854775807ull)); + EXPECT_FALSE(CanCastTo<int64_t>(9223372036854775808ull)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-1)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-127)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-128)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-129)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-255)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-256)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-32767)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-32768)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-32769)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-65535)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-65536)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-2147483647ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-2147483648ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-2147483649ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-4294967295ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-4294967296ll)); - NL_TEST_ASSERT(inSuite, CanCastTo<int64_t>(-9223372036854775807ll)); + EXPECT_TRUE(CanCastTo<int64_t>(-1)); + EXPECT_TRUE(CanCastTo<int64_t>(-127)); + EXPECT_TRUE(CanCastTo<int64_t>(-128)); + EXPECT_TRUE(CanCastTo<int64_t>(-129)); + EXPECT_TRUE(CanCastTo<int64_t>(-255)); + EXPECT_TRUE(CanCastTo<int64_t>(-256)); + EXPECT_TRUE(CanCastTo<int64_t>(-32767)); + EXPECT_TRUE(CanCastTo<int64_t>(-32768)); + EXPECT_TRUE(CanCastTo<int64_t>(-32769)); + EXPECT_TRUE(CanCastTo<int64_t>(-65535)); + EXPECT_TRUE(CanCastTo<int64_t>(-65536)); + EXPECT_TRUE(CanCastTo<int64_t>(-2147483647ll)); + EXPECT_TRUE(CanCastTo<int64_t>(-2147483648ll)); + EXPECT_TRUE(CanCastTo<int64_t>(-2147483649ll)); + EXPECT_TRUE(CanCastTo<int64_t>(-4294967295ll)); + EXPECT_TRUE(CanCastTo<int64_t>(-4294967296ll)); + EXPECT_TRUE(CanCastTo<int64_t>(-9223372036854775807ll)); } -static void TestCastToSigned(nlTestSuite * inSuite, void * inContext) +TEST(TestSafeInt, TestCastToSigned) { - NL_TEST_ASSERT(inSuite, CastToSigned(static_cast<uint8_t>(5)) == 5); - NL_TEST_ASSERT(inSuite, CastToSigned(static_cast<uint8_t>(-5)) == -5); - NL_TEST_ASSERT(inSuite, CastToSigned(static_cast<uint8_t>(254)) == -2); - NL_TEST_ASSERT(inSuite, CastToSigned(static_cast<uint8_t>(65533)) == -3); - NL_TEST_ASSERT(inSuite, CastToSigned(static_cast<uint16_t>(254)) == 254); - NL_TEST_ASSERT(inSuite, CastToSigned(static_cast<uint16_t>(65533)) == -3); + EXPECT_EQ(CastToSigned(static_cast<uint8_t>(5)), 5); + EXPECT_EQ(CastToSigned(static_cast<uint8_t>(-5)), -5); + EXPECT_EQ(CastToSigned(static_cast<uint8_t>(254)), -2); + EXPECT_EQ(CastToSigned(static_cast<uint8_t>(65533)), -3); + EXPECT_EQ(CastToSigned(static_cast<uint16_t>(254)), 254); + EXPECT_EQ(CastToSigned(static_cast<uint16_t>(65533)), -3); } - -#define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn) -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { NL_TEST_DEF_FN(TestCanCastTo_Int8), NL_TEST_DEF_FN(TestCanCastTo_Int16), - NL_TEST_DEF_FN(TestCanCastTo_Int32), NL_TEST_DEF_FN(TestCanCastTo_Int64), - NL_TEST_DEF_FN(TestCastToSigned), NL_TEST_SENTINEL() }; - -int TestSafeInt() -{ - nlTestSuite theSuite = { "CHIP SafeInt tests", &sTests[0], nullptr, nullptr }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestSafeInt) diff --git a/src/test_driver/openiotsdk/unit-tests/test_components.txt b/src/test_driver/openiotsdk/unit-tests/test_components.txt index 5c3dcbae75a2a3..43a4bf883a9567 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components.txt @@ -8,4 +8,5 @@ MdnsTests PlatformTests SystemLayerTests TestShell -SetupPayloadTests \ No newline at end of file +SetupPayloadTests +SupportTests \ No newline at end of file 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 7806ae3318cdf2..809a36b167c817 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt @@ -9,6 +9,6 @@ RawTransportTests RetransmitTests SecureChannelTests SetupPayloadTestsNL -SupportTests +SupportTestsNL TransportLayerTests UserDirectedCommissioningTests From 0cc9ad5a682b2b668ba362f482e3c6d70bc1bdba Mon Sep 17 00:00:00 2001 From: Vatsal Ghelani <152916324+vatsalghelani-csa@users.noreply.github.com> Date: Wed, 24 Apr 2024 08:11:19 -0400 Subject: [PATCH 018/124] Check for changes to data_model directory without a sha update - Issue #31571 (#33110) * Create check-data-model-directory-updates.yaml * Added the workflow code * Removed dependabot branch ignore * Update .github/workflows/check-data-model-directory-updates.yaml Co-authored-by: C Freeman <cecille@google.com> --------- Co-authored-by: Andrei Litvin <andy314@gmail.com> Co-authored-by: C Freeman <cecille@google.com> --- .../check-data-model-directory-updates.yaml | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/check-data-model-directory-updates.yaml diff --git a/.github/workflows/check-data-model-directory-updates.yaml b/.github/workflows/check-data-model-directory-updates.yaml new file mode 100644 index 00000000000000..305da81d9da817 --- /dev/null +++ b/.github/workflows/check-data-model-directory-updates.yaml @@ -0,0 +1,31 @@ +# 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. + +name: Check for changes to data_model directory without a sha update + +on: + pull_request: + paths: + - "data_model/**" + +jobs: + check-submodule-update-label: + name: Check for changes to data_model directory without a sha update + runs-on: ubuntu-latest + if: "git diff --name-only HEAD^..HEAD data_model/ | grep -q spec_sha" + steps: + - name: Error Message + run: echo This pull request attempts to update data_model directory, but is missing updates to spec_sha file with the latest version of the sha. Files in the data_model directory are generated automatically and should not be updated manually. + - name: Fail Job + run: exit 1 From 67ac842a01904f4598d0643f4edb6e35e7d17567 Mon Sep 17 00:00:00 2001 From: Jakub Latusek <j.latusek@samsung.com> Date: Wed, 24 Apr 2024 14:24:22 +0200 Subject: [PATCH 019/124] Replace nl-unit-test for pigweed for crypto (#33042) * Fix test chip crypto * Crypto to pigweed * Fix bugs * Fix * Style * Bug fixes * Fix CI errors * fix code not compiled on linux * Remove empty tests * Expect to assert * Initialize PSA crypto in test setup * Fix tests * fix openiotsdk tests list * fix unused function * fix deps list * fix deps list * Make memory init setup in testsuite * Add TODO --- src/crypto/tests/BUILD.gn | 5 +- src/crypto/tests/TestChipCryptoPAL.cpp | 1240 ++++++++--------- .../tests/TestGroupOperationalCredentials.cpp | 59 +- src/crypto/tests/TestPSAOpKeyStore.cpp | 229 ++- .../tests/TestPersistentStorageOpKeyStore.cpp | 227 ++- src/crypto/tests/TestSessionKeystore.cpp | 102 +- .../tests/TestAbortExchangesForFabric.cpp | 16 +- src/messaging/tests/TestExchangeMgr.cpp | 18 +- .../tests/TestReliableMessageProtocol.cpp | 7 + .../openiotsdk/unit-tests/test_components.txt | 3 +- .../unit-tests/test_components_nl.txt | 1 - 11 files changed, 840 insertions(+), 1067 deletions(-) diff --git a/src/crypto/tests/BUILD.gn b/src/crypto/tests/BUILD.gn index 1599b942269ae6..8570ed3defc157 100644 --- a/src/crypto/tests/BUILD.gn +++ b/src/crypto/tests/BUILD.gn @@ -14,12 +14,11 @@ import("//build_overrides/build.gni") import("//build_overrides/chip.gni") -import("//build_overrides/nlunit_test.gni") import("${chip_root}/build/chip/chip_test_suite.gni") import("${chip_root}/src/crypto/crypto.gni") -chip_test_suite_using_nltest("tests") { +chip_test_suite("tests") { output_name = "libChipCryptoTests" sources = [ @@ -70,8 +69,6 @@ chip_test_suite_using_nltest("tests") { "${chip_root}/src/crypto", "${chip_root}/src/lib/core", "${chip_root}/src/lib/support:testing", - "${chip_root}/src/lib/support:testing_nlunit", "${chip_root}/src/platform", - "${nlunit_test_root}:nlunit-test", ] } diff --git a/src/crypto/tests/TestChipCryptoPAL.cpp b/src/crypto/tests/TestChipCryptoPAL.cpp index 0cf3a877fcf828..c7ad4f3f290522 100644 --- a/src/crypto/tests/TestChipCryptoPAL.cpp +++ b/src/crypto/tests/TestChipCryptoPAL.cpp @@ -37,12 +37,10 @@ #include <crypto/CHIPCryptoPAL.h> #include <crypto/DefaultSessionKeystore.h> +#include <gtest/gtest.h> #include <lib/core/CHIPError.h> #include <lib/support/CodeUtils.h> #include <lib/support/ScopedBuffer.h> -#include <lib/support/UnitTestExtendedAssertions.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> #include <stdarg.h> #include <stdint.h> @@ -93,9 +91,8 @@ using TestHMAC_sha = HMAC_sha; class HeapChecker { public: - explicit HeapChecker(nlTestSuite * testSuite) : mTestSuite(testSuite) + explicit HeapChecker() { - size_t numBlocks; mbedtls_memory_buffer_alloc_cur_get(&mHeapBytesUsed, &numBlocks); } @@ -109,19 +106,18 @@ class HeapChecker if (bytesUsed != mHeapBytesUsed) { mbedtls_memory_buffer_alloc_status(); - NL_TEST_ASSERT(mTestSuite, bytesUsed == mHeapBytesUsed); + EXPECT_EQ(bytesUsed, mHeapBytesUsed); } } private: - nlTestSuite * mTestSuite; size_t mHeapBytesUsed; }; #else class HeapChecker { public: - explicit HeapChecker(nlTestSuite *) {} + explicit HeapChecker() {} }; #endif @@ -129,7 +125,7 @@ class HeapChecker // Verify that two HKDF keys are equal by checking if they generate the same attestation challenge. // Note that the keys cannot be compared directly because they are given as key handles. -void AssertKeysEqual(nlTestSuite * inSuite, SessionKeystore & keystore, HkdfKeyHandle & left, const HkdfKeyHandle & right) +void AssertKeysEqual(SessionKeystore & keystore, HkdfKeyHandle & left, const HkdfKeyHandle & right) { auto generateChallenge = [&](const HkdfKeyHandle & key, AttestationChallenge & challenge) -> void { constexpr uint8_t kTestSalt[] = { 'T', 'E', 'S', 'T', 'S', 'A', 'L', 'T' }; @@ -139,7 +135,7 @@ void AssertKeysEqual(nlTestSuite * inSuite, SessionKeystore & keystore, HkdfKeyH Aes128KeyHandle r2iKey; CHIP_ERROR error = keystore.DeriveSessionKeys(key, ByteSpan(kTestSalt), ByteSpan(kTestInfo), i2rKey, r2iKey, challenge); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); // Ignore the keys, just return the attestation challenge keystore.DestroyKey(i2rKey); @@ -152,10 +148,13 @@ void AssertKeysEqual(nlTestSuite * inSuite, SessionKeystore & keystore, HkdfKeyH generateChallenge(left, leftChallenge); generateChallenge(right, rightChallenge); - NL_TEST_ASSERT(inSuite, memcmp(leftChallenge.ConstBytes(), rightChallenge.ConstBytes(), AttestationChallenge::Capacity()) == 0); + EXPECT_EQ(memcmp(leftChallenge.ConstBytes(), rightChallenge.ConstBytes(), AttestationChallenge::Capacity()), 0); } } // namespace + // + +#if CHIP_CRYPTO_OPENSSL || CHIP_CRYPTO_MBEDTLS static uint32_t gs_test_entropy_source_called = 0; static int test_entropy_source(void * data, uint8_t * output, size_t len, size_t * olen) @@ -165,6 +164,8 @@ static int test_entropy_source(void * data, uint8_t * output, size_t len, size_t return 0; } +#endif // CHIP_CRYPTO_OPENSSL || CHIP_CRYPTO_MBEDTLS + constexpr size_t KEY_LENGTH = Crypto::kAES_CCM128_Key_Length; constexpr size_t NONCE_LENGTH = Crypto::kAES_CCM128_Nonce_Length; @@ -210,13 +211,13 @@ const AesCtrTestEntry theAesCtrTestVector[] = { struct TestAesKey { public: - TestAesKey(nlTestSuite * inSuite, const uint8_t * keyBytes, size_t keyLength) + TestAesKey(const uint8_t * keyBytes, size_t keyLength) { Crypto::Symmetric128BitsKeyByteArray keyMaterial; memcpy(&keyMaterial, keyBytes, keyLength); CHIP_ERROR err = keystore.CreateKey(keyMaterial, key); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); } ~TestAesKey() { keystore.DestroyKey(key); } @@ -228,13 +229,13 @@ struct TestAesKey struct TestHmacKey { public: - TestHmacKey(nlTestSuite * inSuite, const uint8_t * keyBytes, size_t keyLength) + TestHmacKey(const uint8_t * keyBytes, size_t keyLength) { Crypto::Symmetric128BitsKeyByteArray keyMaterial; memcpy(&keyMaterial, keyBytes, keyLength); CHIP_ERROR err = keystore.CreateKey(keyMaterial, key); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); } ~TestHmacKey() { keystore.DestroyKey(key); } @@ -243,64 +244,76 @@ struct TestHmacKey Hmac128KeyHandle key; }; -static void TestAES_CTR_128_Encrypt(nlTestSuite * inSuite, const AesCtrTestEntry * vector) +static void TestAES_CTR_128_Encrypt(const AesCtrTestEntry * vector) { chip::Platform::ScopedMemoryBuffer<uint8_t> outBuffer; outBuffer.Alloc(vector->ciphertextLen); - NL_TEST_ASSERT(inSuite, outBuffer); + EXPECT_TRUE(outBuffer); - TestAesKey key(inSuite, vector->key, KEY_LENGTH); + TestAesKey key(vector->key, KEY_LENGTH); CHIP_ERROR err = AES_CTR_crypt(vector->plaintext, vector->plaintextLen, key.key, vector->nonce, NONCE_LENGTH, outBuffer.Get()); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); bool outputMatches = memcmp(outBuffer.Get(), vector->ciphertext, vector->ciphertextLen) == 0; - NL_TEST_ASSERT(inSuite, outputMatches); + EXPECT_TRUE(outputMatches); if (!outputMatches) { printf("\n Test failed due to mismatching ciphertext\n"); } } -static void TestAES_CTR_128_Decrypt(nlTestSuite * inSuite, const AesCtrTestEntry * vector) +static void TestAES_CTR_128_Decrypt(const AesCtrTestEntry * vector) { chip::Platform::ScopedMemoryBuffer<uint8_t> outBuffer; outBuffer.Alloc(vector->plaintextLen); - NL_TEST_ASSERT(inSuite, outBuffer); + EXPECT_TRUE(outBuffer); - TestAesKey key(inSuite, vector->key, KEY_LENGTH); + TestAesKey key(vector->key, KEY_LENGTH); CHIP_ERROR err = AES_CTR_crypt(vector->ciphertext, vector->ciphertextLen, key.key, vector->nonce, NONCE_LENGTH, outBuffer.Get()); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); bool outputMatches = memcmp(outBuffer.Get(), vector->plaintext, vector->plaintextLen) == 0; - NL_TEST_ASSERT(inSuite, outputMatches); + EXPECT_TRUE(outputMatches); if (!outputMatches) { printf("\n Test failed due to mismatching plaintext\n"); } } -static void TestAES_CTR_128CryptTestVectors(nlTestSuite * inSuite, void * inContext) +struct TestChipCryptoPAL : public ::testing::Test +{ + static void SetUpTestSuite() + { + ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); +#if CHIP_CRYPTO_PSA + psa_crypto_init(); +#endif + } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestChipCryptoPAL, TestAES_CTR_128CryptTestVectors) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; int numOfTestsRan = 0; for (const auto & vector : theAesCtrTestVector) { if (vector.plaintextLen > 0) { numOfTestsRan++; - TestAES_CTR_128_Encrypt(inSuite, &vector); - TestAES_CTR_128_Decrypt(inSuite, &vector); + TestAES_CTR_128_Encrypt(&vector); + TestAES_CTR_128_Decrypt(&vector); } } - NL_TEST_ASSERT(inSuite, numOfTestsRan > 0); + EXPECT_GT(numOfTestsRan, 0); } -static void TestAES_CCM_128EncryptTestVectors(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestAES_CCM_128EncryptTestVectors) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; int numOfTestVectors = ArraySize(ccm_128_test_vectors); int numOfTestsRan = 0; for (int vectorIndex = 0; vectorIndex < numOfTestVectors; vectorIndex++) @@ -311,23 +324,23 @@ static void TestAES_CCM_128EncryptTestVectors(nlTestSuite * inSuite, void * inCo numOfTestsRan++; chip::Platform::ScopedMemoryBuffer<uint8_t> out_ct; out_ct.Alloc(vector->ct_len); - NL_TEST_ASSERT(inSuite, out_ct); + EXPECT_TRUE(out_ct); chip::Platform::ScopedMemoryBuffer<uint8_t> out_tag; out_tag.Alloc(vector->tag_len); - NL_TEST_ASSERT(inSuite, out_tag); + EXPECT_TRUE(out_tag); - TestAesKey key(inSuite, vector->key, vector->key_len); + TestAesKey key(vector->key, vector->key_len); CHIP_ERROR err = AES_CCM_encrypt(vector->pt, vector->pt_len, vector->aad, vector->aad_len, key.key, vector->nonce, vector->nonce_len, out_ct.Get(), out_tag.Get(), vector->tag_len); - NL_TEST_ASSERT(inSuite, err == vector->result); + EXPECT_EQ(err, vector->result); if (vector->result == CHIP_NO_ERROR) { bool areCTsEqual = memcmp(out_ct.Get(), vector->ct, vector->ct_len) == 0; bool areTagsEqual = memcmp(out_tag.Get(), vector->tag, vector->tag_len) == 0; - NL_TEST_ASSERT(inSuite, areCTsEqual); - NL_TEST_ASSERT(inSuite, areTagsEqual); + EXPECT_TRUE(areCTsEqual); + EXPECT_TRUE(areTagsEqual); if (!areCTsEqual) { printf("\n Test %d failed due to mismatching ciphertext\n", vector->tcId); @@ -339,12 +352,12 @@ static void TestAES_CCM_128EncryptTestVectors(nlTestSuite * inSuite, void * inCo } } } - NL_TEST_ASSERT(inSuite, numOfTestsRan > 0); + EXPECT_GT(numOfTestsRan, 0); } -static void TestAES_CCM_128DecryptTestVectors(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestAES_CCM_128DecryptTestVectors) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; int numOfTestVectors = ArraySize(ccm_128_test_vectors); int numOfTestsRan = 0; for (int vectorIndex = 0; vectorIndex < numOfTestVectors; vectorIndex++) @@ -355,18 +368,18 @@ static void TestAES_CCM_128DecryptTestVectors(nlTestSuite * inSuite, void * inCo numOfTestsRan++; chip::Platform::ScopedMemoryBuffer<uint8_t> out_pt; out_pt.Alloc(vector->pt_len); - NL_TEST_ASSERT(inSuite, out_pt); + EXPECT_TRUE(out_pt); - TestAesKey key(inSuite, vector->key, vector->key_len); + TestAesKey key(vector->key, vector->key_len); CHIP_ERROR err = AES_CCM_decrypt(vector->ct, vector->ct_len, vector->aad, vector->aad_len, vector->tag, vector->tag_len, key.key, vector->nonce, vector->nonce_len, out_pt.Get()); - NL_TEST_ASSERT(inSuite, err == vector->result); + EXPECT_EQ(err, vector->result); if (vector->result == CHIP_NO_ERROR) { bool arePTsEqual = memcmp(vector->pt, out_pt.Get(), vector->pt_len) == 0; - NL_TEST_ASSERT(inSuite, arePTsEqual); + EXPECT_TRUE(arePTsEqual); if (!arePTsEqual) { printf("\n Test %d failed due to mismatching plaintext\n", vector->tcId); @@ -374,12 +387,12 @@ static void TestAES_CCM_128DecryptTestVectors(nlTestSuite * inSuite, void * inCo } } } - NL_TEST_ASSERT(inSuite, numOfTestsRan > 0); + EXPECT_GT(numOfTestsRan, 0); } -static void TestAES_CCM_128EncryptInvalidNonceLen(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestAES_CCM_128EncryptInvalidNonceLen) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; int numOfTestVectors = ArraySize(ccm_128_test_vectors); int numOfTestsRan = 0; for (int vectorIndex = 0; vectorIndex < numOfTestVectors; vectorIndex++) @@ -390,25 +403,25 @@ static void TestAES_CCM_128EncryptInvalidNonceLen(nlTestSuite * inSuite, void * numOfTestsRan++; chip::Platform::ScopedMemoryBuffer<uint8_t> out_ct; out_ct.Alloc(vector->ct_len); - NL_TEST_ASSERT(inSuite, out_ct); + EXPECT_TRUE(out_ct); chip::Platform::ScopedMemoryBuffer<uint8_t> out_tag; out_tag.Alloc(vector->tag_len); - NL_TEST_ASSERT(inSuite, out_tag); + EXPECT_TRUE(out_tag); - TestAesKey key(inSuite, vector->key, vector->key_len); + TestAesKey key(vector->key, vector->key_len); CHIP_ERROR err = AES_CCM_encrypt(vector->pt, vector->pt_len, vector->aad, vector->aad_len, key.key, vector->nonce, 0, out_ct.Get(), out_tag.Get(), vector->tag_len); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT); break; } } - NL_TEST_ASSERT(inSuite, numOfTestsRan > 0); + EXPECT_GT(numOfTestsRan, 0); } -static void TestAES_CCM_128EncryptInvalidTagLen(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestAES_CCM_128EncryptInvalidTagLen) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; int numOfTestVectors = ArraySize(ccm_128_test_vectors); int numOfTestsRan = 0; for (int vectorIndex = 0; vectorIndex < numOfTestVectors; vectorIndex++) @@ -419,25 +432,25 @@ static void TestAES_CCM_128EncryptInvalidTagLen(nlTestSuite * inSuite, void * in numOfTestsRan++; chip::Platform::ScopedMemoryBuffer<uint8_t> out_ct; out_ct.Alloc(vector->ct_len); - NL_TEST_ASSERT(inSuite, out_ct); + EXPECT_TRUE(out_ct); chip::Platform::ScopedMemoryBuffer<uint8_t> out_tag; out_tag.Alloc(vector->tag_len); - NL_TEST_ASSERT(inSuite, out_tag); + EXPECT_TRUE(out_tag); - TestAesKey key(inSuite, vector->key, vector->key_len); + TestAesKey key(vector->key, vector->key_len); CHIP_ERROR err = AES_CCM_encrypt(vector->pt, vector->pt_len, vector->aad, vector->aad_len, key.key, vector->nonce, vector->nonce_len, out_ct.Get(), out_tag.Get(), 13); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT); break; } } - NL_TEST_ASSERT(inSuite, numOfTestsRan > 0); + EXPECT_GT(numOfTestsRan, 0); } -static void TestAES_CCM_128DecryptInvalidNonceLen(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestAES_CCM_128DecryptInvalidNonceLen) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; int numOfTestVectors = ArraySize(ccm_128_test_vectors); int numOfTestsRan = 0; for (int vectorIndex = 0; vectorIndex < numOfTestVectors; vectorIndex++) @@ -448,22 +461,22 @@ static void TestAES_CCM_128DecryptInvalidNonceLen(nlTestSuite * inSuite, void * numOfTestsRan++; Platform::ScopedMemoryBuffer<uint8_t> out_pt; out_pt.Alloc(vector->pt_len); - NL_TEST_ASSERT(inSuite, out_pt); + EXPECT_TRUE(out_pt); - TestAesKey key(inSuite, vector->key, vector->key_len); + TestAesKey key(vector->key, vector->key_len); CHIP_ERROR err = AES_CCM_decrypt(vector->ct, vector->ct_len, vector->aad, vector->aad_len, vector->tag, vector->tag_len, key.key, vector->nonce, 0, out_pt.Get()); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT); break; } } - NL_TEST_ASSERT(inSuite, numOfTestsRan > 0); + EXPECT_GT(numOfTestsRan, 0); } -static void TestSensitiveDataBuffer(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestSensitiveDataBuffer) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; constexpr size_t kCapacity = 32; constexpr size_t kLength = 16; @@ -473,32 +486,32 @@ static void TestSensitiveDataBuffer(nlTestSuite * inSuite, void * inContext) // Give us some data. CHIP_ERROR err = DRBG_get_bytes(testVector, sizeof(testVector)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Test initial value Buffer buffer; - NL_TEST_ASSERT(inSuite, buffer.ConstBytes() == (const uint8_t *) buffer.Bytes()); - NL_TEST_ASSERT(inSuite, buffer.Length() == 0); + EXPECT_EQ(buffer.ConstBytes(), (const uint8_t *) buffer.Bytes()); + EXPECT_EQ(buffer.Length(), 0u); // Put data in the buffer and test all accessors memcpy(buffer.Bytes(), testVector, kCapacity); buffer.SetLength(kLength); - NL_TEST_ASSERT(inSuite, buffer.ConstBytes() == (const uint8_t *) buffer.Bytes()); - NL_TEST_ASSERT(inSuite, buffer.ConstBytes() == buffer.Span().data()); - NL_TEST_ASSERT(inSuite, buffer.Length() == kLength); - NL_TEST_ASSERT(inSuite, buffer.Length() == buffer.Span().size()); + EXPECT_EQ(buffer.ConstBytes(), (const uint8_t *) buffer.Bytes()); + EXPECT_EQ(buffer.ConstBytes(), buffer.Span().data()); + EXPECT_EQ(buffer.Length(), kLength); + EXPECT_EQ(buffer.Length(), buffer.Span().size()); // Test sanitization of entire buffer (even though length < capacity) const void * bufferStorage = buffer.ConstBytes(); buffer.~Buffer(); - NL_TEST_ASSERT(inSuite, memcmp(bufferStorage, kAllZeros, kCapacity) == 0); - NL_TEST_ASSERT(inSuite, memcmp(bufferStorage, testVector, kCapacity)); + EXPECT_EQ(memcmp(bufferStorage, kAllZeros, kCapacity), 0); + EXPECT_TRUE(memcmp(bufferStorage, testVector, kCapacity)); } -static void TestSensitiveDataFixedBuffer(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestSensitiveDataFixedBuffer) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; constexpr size_t kCapacity = 32; using Buffer = SensitiveDataFixedBuffer<kCapacity>; @@ -508,34 +521,34 @@ static void TestSensitiveDataFixedBuffer(nlTestSuite * inSuite, void * inContext // Give us some data. CHIP_ERROR err = DRBG_get_bytes(testVector, sizeof(testVector)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Test construction from array and all accessors Buffer buffer(testVector); - NL_TEST_ASSERT(inSuite, buffer.ConstBytes() == (const uint8_t *) buffer.Bytes()); - NL_TEST_ASSERT(inSuite, buffer.ConstBytes() == buffer.Span().data()); - NL_TEST_ASSERT(inSuite, memcmp(buffer.ConstBytes(), testVector, kCapacity) == 0); + EXPECT_EQ(buffer.ConstBytes(), (const uint8_t *) buffer.Bytes()); + EXPECT_EQ(buffer.ConstBytes(), buffer.Span().data()); + EXPECT_EQ(memcmp(buffer.ConstBytes(), testVector, kCapacity), 0); // Test sanitization const void * bufferStorage = buffer.ConstBytes(); buffer.~Buffer(); - NL_TEST_ASSERT(inSuite, memcmp(bufferStorage, kAllZeros, kCapacity) == 0); - NL_TEST_ASSERT(inSuite, memcmp(bufferStorage, testVector, kCapacity)); + EXPECT_EQ(memcmp(bufferStorage, kAllZeros, kCapacity), 0); + EXPECT_TRUE(memcmp(bufferStorage, testVector, kCapacity)); // Give us different data err = DRBG_get_bytes(testVector, sizeof(testVector)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Test construction from span and all accessors new (&buffer) Buffer(BufferSpan(testVector)); - NL_TEST_ASSERT(inSuite, buffer.ConstBytes() == (const uint8_t *) buffer.Bytes()); - NL_TEST_ASSERT(inSuite, buffer.ConstBytes() == buffer.Span().data()); - NL_TEST_ASSERT(inSuite, memcmp(buffer.ConstBytes(), testVector, kCapacity) == 0); + EXPECT_EQ(buffer.ConstBytes(), (const uint8_t *) buffer.Bytes()); + EXPECT_EQ(buffer.ConstBytes(), buffer.Span().data()); + EXPECT_EQ(memcmp(buffer.ConstBytes(), testVector, kCapacity), 0); } -static void TestAsn1Conversions(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestAsn1Conversions) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; static_assert(sizeof(kDerSigConvDerCase4) == (sizeof(kDerSigConvRawCase4) + chip::Crypto::kMax_ECDSA_X9Dot62_Asn1_Overhead), "kDerSigConvDerCase4 must have worst case overhead"); @@ -547,36 +560,36 @@ static void TestAsn1Conversions(nlTestSuite * inSuite, void * inContext) chip::Platform::ScopedMemoryBuffer<uint8_t> out_raw_sig; size_t out_raw_sig_allocated_size = vector->fe_length_bytes * 2; out_raw_sig.Calloc(out_raw_sig_allocated_size); - NL_TEST_ASSERT(inSuite, out_raw_sig); + EXPECT_TRUE(out_raw_sig); chip::Platform::ScopedMemoryBuffer<uint8_t> out_der_sig; size_t out_der_sig_allocated_size = (vector->fe_length_bytes * 2) + kMax_ECDSA_X9Dot62_Asn1_Overhead; out_der_sig.Calloc(out_der_sig_allocated_size); - NL_TEST_ASSERT(inSuite, out_der_sig); + EXPECT_TRUE(out_der_sig); // Test conversion from ASN.1 ER to raw MutableByteSpan out_raw_sig_span(out_raw_sig.Get(), out_raw_sig_allocated_size); CHIP_ERROR status = EcdsaAsn1SignatureToRaw(vector->fe_length_bytes, ByteSpan{ vector->der_version, vector->der_version_length }, out_raw_sig_span); - NL_TEST_ASSERT(inSuite, status == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, out_raw_sig_span.size() == vector->raw_version_length); - NL_TEST_ASSERT(inSuite, (memcmp(out_raw_sig_span.data(), vector->raw_version, vector->raw_version_length) == 0)); + EXPECT_EQ(status, CHIP_NO_ERROR); + EXPECT_EQ(out_raw_sig_span.size(), vector->raw_version_length); + EXPECT_EQ(memcmp(out_raw_sig_span.data(), vector->raw_version, vector->raw_version_length), 0); // Test conversion from raw to ASN.1 DER MutableByteSpan out_der_sig_span(out_der_sig.Get(), out_der_sig_allocated_size); status = EcdsaRawSignatureToAsn1(vector->fe_length_bytes, ByteSpan{ vector->raw_version, vector->raw_version_length }, out_der_sig_span); - NL_TEST_ASSERT(inSuite, status == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, out_der_sig_span.size() <= out_der_sig_allocated_size); - NL_TEST_ASSERT(inSuite, out_der_sig_span.size() == vector->der_version_length); - NL_TEST_ASSERT(inSuite, (memcmp(out_der_sig_span.data(), vector->der_version, vector->der_version_length) == 0)); + EXPECT_EQ(status, CHIP_NO_ERROR); + EXPECT_LE(out_der_sig_span.size(), out_der_sig_allocated_size); + EXPECT_EQ(out_der_sig_span.size(), vector->der_version_length); + EXPECT_EQ(memcmp(out_der_sig_span.data(), vector->der_version, vector->der_version_length), 0); } } -static void TestRawIntegerToDerValidCases(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestRawIntegerToDerValidCases) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; int numOfTestCases = ArraySize(kRawIntegerToDerVectors); for (int testIdx = 0; testIdx < numOfTestCases; testIdx++) @@ -587,39 +600,39 @@ static void TestRawIntegerToDerValidCases(nlTestSuite * inSuite, void * inContex { chip::Platform::ScopedMemoryBuffer<uint8_t> out_der_buffer; out_der_buffer.Alloc(v.expected_size); - NL_TEST_ASSERT(inSuite, out_der_buffer); + EXPECT_TRUE(out_der_buffer); MutableByteSpan out_der_integer(out_der_buffer.Get(), v.expected_size); CHIP_ERROR status = ConvertIntegerRawToDer(ByteSpan{ v.candidate, v.candidate_size }, out_der_integer); - NL_TEST_ASSERT(inSuite, status == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, out_der_integer.size() == v.expected_size); - NL_TEST_ASSERT(inSuite, out_der_integer.data_equal(ByteSpan(v.expected, v.expected_size))); + EXPECT_EQ(status, CHIP_NO_ERROR); + EXPECT_EQ(out_der_integer.size(), v.expected_size); + EXPECT_TRUE(out_der_integer.data_equal(ByteSpan(v.expected, v.expected_size))); // Cover case of buffer too small MutableByteSpan out_der_integer_too_small(out_der_buffer.Get(), v.expected_size - 1); status = ConvertIntegerRawToDer(ByteSpan{ v.candidate, v.candidate_size }, out_der_integer_too_small); - NL_TEST_ASSERT(inSuite, status == CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_EQ(status, CHIP_ERROR_BUFFER_TOO_SMALL); } // Cover case without tag/length { chip::Platform::ScopedMemoryBuffer<uint8_t> out_der_buffer; out_der_buffer.Alloc(v.expected_without_tag_size); - NL_TEST_ASSERT(inSuite, out_der_buffer); + EXPECT_TRUE(out_der_buffer); MutableByteSpan out_der_integer(out_der_buffer.Get(), v.expected_without_tag_size); CHIP_ERROR status = ConvertIntegerRawToDerWithoutTag(ByteSpan{ v.candidate, v.candidate_size }, out_der_integer); - NL_TEST_ASSERT(inSuite, status == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, out_der_integer.size() == v.expected_without_tag_size); - NL_TEST_ASSERT(inSuite, out_der_integer.data_equal(ByteSpan(v.expected_without_tag, v.expected_without_tag_size))); + EXPECT_EQ(status, CHIP_NO_ERROR); + EXPECT_EQ(out_der_integer.size(), v.expected_without_tag_size); + EXPECT_TRUE(out_der_integer.data_equal(ByteSpan(v.expected_without_tag, v.expected_without_tag_size))); } } } -static void TestRawIntegerToDerInvalidCases(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestRawIntegerToDerInvalidCases) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; // Cover case of invalid buffers uint8_t placeholder[10] = { 0 }; MutableByteSpan good_out_buffer(placeholder); @@ -647,13 +660,13 @@ static void TestRawIntegerToDerInvalidCases(nlTestSuite * inSuite, void * inCont if (status != v.expected_status) { ChipLogError(Crypto, "Failed TestRawIntegerToDerInvalidCases sub-case %d", case_idx); - NL_TEST_ASSERT(inSuite, v.expected_status == status); + EXPECT_EQ(v.expected_status, status); } ++case_idx; } } -static void TestReadDerLengthValidCases(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestReadDerLengthValidCases) { const uint8_t short_zero_length[] = { 0x00 }; ByteSpan short_zero_length_buf(short_zero_length); @@ -713,14 +726,14 @@ static void TestReadDerLengthValidCases(nlTestSuite * inSuite, void * inContext) if ((status != CHIP_NO_ERROR) || (v.expected_length != output_length)) { ChipLogError(Crypto, "Failed TestReadDerLengthValidCases sub-case %d", case_idx); - NL_TEST_ASSERT_EQUALS(inSuite, output_length, v.expected_length); - NL_TEST_ASSERT_SUCCESS(inSuite, status); + EXPECT_EQ(output_length, v.expected_length); + EXPECT_EQ(status, CHIP_NO_ERROR); } ++case_idx; } } -static void TestReadDerLengthInvalidCases(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestReadDerLengthInvalidCases) { uint8_t placeholder[1]; @@ -777,17 +790,17 @@ static void TestReadDerLengthInvalidCases(nlTestSuite * inSuite, void * inContex if (status != v.expected_status) { ChipLogError(Crypto, "Failed TestReadDerLengthInvalidCases sub-case %d", case_idx); - NL_TEST_ASSERT_EQUALS(inSuite, v.expected_status, status); + EXPECT_EQ(v.expected_status, status); } ++case_idx; } } -static void TestHash_SHA256(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestHash_SHA256) { - HeapChecker heapChecker(inSuite); - int numOfTestCases = ArraySize(hash_sha256_test_vectors); - int numOfTestsExecuted = 0; + HeapChecker heapChecker; + unsigned int numOfTestCases = ArraySize(hash_sha256_test_vectors); + unsigned int numOfTestsExecuted = 0; for (numOfTestsExecuted = 0; numOfTestsExecuted < numOfTestCases; numOfTestsExecuted++) { @@ -795,17 +808,17 @@ static void TestHash_SHA256(nlTestSuite * inSuite, void * inContext) uint8_t out_buffer[kSHA256_Hash_Length]; Hash_SHA256(v.data, v.data_length, out_buffer); bool success = memcmp(v.hash, out_buffer, sizeof(out_buffer)) == 0; - NL_TEST_ASSERT(inSuite, success); + EXPECT_TRUE(success); } - NL_TEST_ASSERT(inSuite, numOfTestsExecuted == ArraySize(hash_sha256_test_vectors)); + EXPECT_EQ(numOfTestsExecuted, ArraySize(hash_sha256_test_vectors)); } -static void TestHash_SHA256_Stream(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestHash_SHA256_Stream) { - HeapChecker heapChecker(inSuite); - int numOfTestCases = ArraySize(hash_sha256_test_vectors); - int numOfTestsExecuted = 0; - CHIP_ERROR error = CHIP_NO_ERROR; + HeapChecker heapChecker; + unsigned int numOfTestCases = ArraySize(hash_sha256_test_vectors); + unsigned int numOfTestsExecuted = 0; + CHIP_ERROR error = CHIP_NO_ERROR; for (numOfTestsExecuted = 0; numOfTestsExecuted < numOfTestCases; numOfTestsExecuted++) { @@ -817,7 +830,7 @@ static void TestHash_SHA256_Stream(nlTestSuite * inSuite, void * inContext) Hash_SHA256_stream sha256; error = sha256.Begin(); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); // Split data into 3 random streams. for (int i = 0; i < 2; ++i) @@ -825,25 +838,25 @@ static void TestHash_SHA256_Stream(nlTestSuite * inSuite, void * inContext) size_t rand_data_length = static_cast<unsigned int>(rand()) % (data_length + 1); error = sha256.AddData(ByteSpan{ data, rand_data_length }); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); data += rand_data_length; data_length -= rand_data_length; } error = sha256.AddData(ByteSpan{ data, data_length }); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); MutableByteSpan out_span(out_buffer); error = sha256.Finish(out_span); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, out_span.size() == kSHA256_Hash_Length); + EXPECT_EQ(error, CHIP_NO_ERROR); + EXPECT_EQ(out_span.size(), kSHA256_Hash_Length); bool success = memcmp(v.hash, out_span.data(), out_span.size()) == 0; - NL_TEST_ASSERT(inSuite, success); + EXPECT_TRUE(success); } - NL_TEST_ASSERT(inSuite, numOfTestsExecuted == ArraySize(hash_sha256_test_vectors)); + EXPECT_EQ(numOfTestsExecuted, ArraySize(hash_sha256_test_vectors)); // Test partial digests uint8_t source_buf[2 * kSHA256_Hash_Length]; @@ -870,30 +883,30 @@ static void TestHash_SHA256_Stream(nlTestSuite * inSuite, void * inContext) MutableByteSpan total_digest_span(total_digest); Hash_SHA256_stream sha256; - NL_TEST_ASSERT(inSuite, sha256.Begin() == CHIP_NO_ERROR); + EXPECT_EQ(sha256.Begin(), CHIP_NO_ERROR); // Compute partial digest after first block - NL_TEST_ASSERT(inSuite, sha256.AddData(ByteSpan{ &source_buf[0], block1_size }) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, sha256.GetDigest(partial_digest_span1) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, partial_digest_span1.size() == kSHA256_Hash_Length); + EXPECT_EQ(sha256.AddData(ByteSpan{ &source_buf[0], block1_size }), CHIP_NO_ERROR); + EXPECT_EQ(sha256.GetDigest(partial_digest_span1), CHIP_NO_ERROR); + EXPECT_EQ(partial_digest_span1.size(), kSHA256_Hash_Length); // Validate partial digest matches expectations Hash_SHA256(&source_buf[0], block1_size, &partial_digest_ref[0]); - NL_TEST_ASSERT(inSuite, 0 == memcmp(partial_digest_span1.data(), partial_digest_ref, partial_digest_span1.size())); + EXPECT_EQ(0, memcmp(partial_digest_span1.data(), partial_digest_ref, partial_digest_span1.size())); // Compute partial digest and total digest after second block - NL_TEST_ASSERT(inSuite, sha256.AddData(ByteSpan{ &source_buf[block1_size], block2_size }) == CHIP_NO_ERROR); + EXPECT_EQ(sha256.AddData(ByteSpan{ &source_buf[block1_size], block2_size }), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, sha256.GetDigest(partial_digest_span2) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, partial_digest_span2.size() == kSHA256_Hash_Length); + EXPECT_EQ(sha256.GetDigest(partial_digest_span2), CHIP_NO_ERROR); + EXPECT_EQ(partial_digest_span2.size(), kSHA256_Hash_Length); - NL_TEST_ASSERT(inSuite, sha256.Finish(total_digest_span) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, total_digest_span.size() == kSHA256_Hash_Length); + EXPECT_EQ(sha256.Finish(total_digest_span), CHIP_NO_ERROR); + EXPECT_EQ(total_digest_span.size(), kSHA256_Hash_Length); // Validate second partial digest matches final digest Hash_SHA256(&source_buf[0], block1_size + block2_size, &total_digest_ref[0]); - NL_TEST_ASSERT(inSuite, 0 == memcmp(partial_digest_span2.data(), total_digest_ref, partial_digest_span2.size())); - NL_TEST_ASSERT(inSuite, 0 == memcmp(total_digest_span.data(), total_digest_ref, total_digest_span.size())); + EXPECT_EQ(0, memcmp(partial_digest_span2.data(), total_digest_ref, partial_digest_span2.size())); + EXPECT_EQ(0, memcmp(total_digest_span.data(), total_digest_ref, total_digest_span.size())); } } @@ -909,28 +922,28 @@ static void TestHash_SHA256_Stream(nlTestSuite * inSuite, void * inContext) Hash_SHA256(&source_buf2[0], sizeof(source_buf2), &digest_buf_ref[0]); Hash_SHA256_stream sha256; - NL_TEST_ASSERT(inSuite, sha256.Begin() == CHIP_NO_ERROR); + EXPECT_EQ(sha256.Begin(), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, sha256.AddData(ByteSpan{ source_buf2 }) == CHIP_NO_ERROR); + EXPECT_EQ(sha256.AddData(ByteSpan{ source_buf2 }), CHIP_NO_ERROR); // Check that error behavior works on buffer too small - NL_TEST_ASSERT(inSuite, sha256.GetDigest(digest_span_too_small) == CHIP_ERROR_BUFFER_TOO_SMALL); - NL_TEST_ASSERT(inSuite, sha256.Finish(digest_span_too_small) == CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_EQ(sha256.GetDigest(digest_span_too_small), CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_EQ(sha256.Finish(digest_span_too_small), CHIP_ERROR_BUFFER_TOO_SMALL); // Check that both GetDigest/Finish can still work after error. - NL_TEST_ASSERT(inSuite, sha256.GetDigest(digest_span_ok) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, 0 == memcmp(digest_span_ok.data(), digest_buf_ref, digest_span_ok.size())); + EXPECT_EQ(sha256.GetDigest(digest_span_ok), CHIP_NO_ERROR); + EXPECT_EQ(0, memcmp(digest_span_ok.data(), digest_buf_ref, digest_span_ok.size())); memset(digest_buf_ok, 0, sizeof(digest_buf_ok)); - NL_TEST_ASSERT(inSuite, sha256.Finish(digest_span_ok) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, 0 == memcmp(digest_span_ok.data(), digest_buf_ref, digest_span_ok.size())); + EXPECT_EQ(sha256.Finish(digest_span_ok), CHIP_NO_ERROR); + EXPECT_EQ(0, memcmp(digest_span_ok.data(), digest_buf_ref, digest_span_ok.size())); } } -static void TestHMAC_SHA256_RawKey(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestHMAC_SHA256_RawKey) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; int numOfTestCases = ArraySize(hmac_sha256_test_vectors_raw_key); int numOfTestsExecuted = 0; TestHMAC_sha mHMAC; @@ -941,17 +954,17 @@ static void TestHMAC_SHA256_RawKey(nlTestSuite * inSuite, void * inContext) size_t out_length = v.output_hash_length; chip::Platform::ScopedMemoryBuffer<uint8_t> out_buffer; out_buffer.Alloc(out_length); - NL_TEST_ASSERT(inSuite, out_buffer); + EXPECT_TRUE(out_buffer); mHMAC.HMAC_SHA256(v.key, v.key_length, v.message, v.message_length, out_buffer.Get(), v.output_hash_length); bool success = memcmp(v.output_hash, out_buffer.Get(), out_length) == 0; - NL_TEST_ASSERT(inSuite, success); + EXPECT_TRUE(success); } - NL_TEST_ASSERT(inSuite, numOfTestsExecuted == numOfTestCases); + EXPECT_EQ(numOfTestsExecuted, numOfTestCases); } -static void TestHMAC_SHA256_KeyHandle(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestHMAC_SHA256_KeyHandle) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; int numOfTestCases = ArraySize(hmac_sha256_test_vectors_key_handle); int numOfTestsExecuted = 0; TestHMAC_sha mHMAC; @@ -962,27 +975,27 @@ static void TestHMAC_SHA256_KeyHandle(nlTestSuite * inSuite, void * inContext) size_t out_length = v.output_hash_length; chip::Platform::ScopedMemoryBuffer<uint8_t> out_buffer; out_buffer.Alloc(out_length); - NL_TEST_ASSERT(inSuite, out_buffer); + EXPECT_TRUE(out_buffer); Crypto::DefaultSessionKeystore keystore; Symmetric128BitsKeyByteArray keyMaterial; memcpy(keyMaterial, v.key, v.key_length); Hmac128KeyHandle keyHandle; - NL_TEST_ASSERT_SUCCESS(inSuite, keystore.CreateKey(keyMaterial, keyHandle)); + EXPECT_EQ(keystore.CreateKey(keyMaterial, keyHandle), CHIP_NO_ERROR); mHMAC.HMAC_SHA256(keyHandle, v.message, v.message_length, out_buffer.Get(), v.output_hash_length); bool success = memcmp(v.output_hash, out_buffer.Get(), out_length) == 0; - NL_TEST_ASSERT(inSuite, success); + EXPECT_TRUE(success); keystore.DestroyKey(keyHandle); } - NL_TEST_ASSERT(inSuite, numOfTestsExecuted == numOfTestCases); + EXPECT_EQ(numOfTestsExecuted, numOfTestCases); } -static void TestHKDF_SHA256(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestHKDF_SHA256) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; int numOfTestCases = ArraySize(hkdf_sha256_test_vectors); int numOfTestsExecuted = 0; TestHKDF_sha mHKDF; @@ -993,28 +1006,28 @@ static void TestHKDF_SHA256(nlTestSuite * inSuite, void * inContext) size_t out_length = v.output_key_material_length; chip::Platform::ScopedMemoryBuffer<uint8_t> out_buffer; out_buffer.Alloc(out_length); - NL_TEST_ASSERT(inSuite, out_buffer); + EXPECT_TRUE(out_buffer); mHKDF.HKDF_SHA256(v.initial_key_material, v.initial_key_material_length, v.salt, v.salt_length, v.info, v.info_length, out_buffer.Get(), v.output_key_material_length); bool success = memcmp(v.output_key_material, out_buffer.Get(), out_length) == 0; - NL_TEST_ASSERT(inSuite, success); + EXPECT_TRUE(success); } - NL_TEST_ASSERT(inSuite, numOfTestsExecuted == 3); + EXPECT_EQ(numOfTestsExecuted, 3); } -static void TestDRBG_InvalidInputs(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestDRBG_InvalidInputs) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; CHIP_ERROR error = CHIP_NO_ERROR; error = DRBG_get_bytes(nullptr, 10); - NL_TEST_ASSERT(inSuite, error == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(error, CHIP_ERROR_INVALID_ARGUMENT); error = CHIP_NO_ERROR; uint8_t buffer[5]; error = DRBG_get_bytes(buffer, 0); - NL_TEST_ASSERT(inSuite, error == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(error, CHIP_ERROR_INVALID_ARGUMENT); } -static void TestDRBG_Output(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestDRBG_Output) { // No good way to unit test a DRBG. Just validate that we get out something CHIP_ERROR error = CHIP_ERROR_INVALID_ARGUMENT; @@ -1022,38 +1035,38 @@ static void TestDRBG_Output(nlTestSuite * inSuite, void * inContext) uint8_t orig_buf[10] = { 0 }; error = DRBG_get_bytes(out_buf, sizeof(out_buf)); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(out_buf, orig_buf, sizeof(out_buf)) != 0); + EXPECT_EQ(error, CHIP_NO_ERROR); + EXPECT_NE(memcmp(out_buf, orig_buf, sizeof(out_buf)), 0); } -static void TestECDSA_Signing_SHA256_Msg(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestECDSA_Signing_SHA256_Msg) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; const char * msg = "Hello World!"; size_t msg_length = strlen(msg); Test_P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); P256ECDSASignature signature; CHIP_ERROR signing_error = keypair.ECDSA_sign_msg(reinterpret_cast<const uint8_t *>(msg), msg_length, signature); - NL_TEST_ASSERT(inSuite, signing_error == CHIP_NO_ERROR); + EXPECT_EQ(signing_error, CHIP_NO_ERROR); CHIP_ERROR validation_error = keypair.Pubkey().ECDSA_validate_msg_signature(reinterpret_cast<const uint8_t *>(msg), msg_length, signature); - NL_TEST_ASSERT(inSuite, validation_error == CHIP_NO_ERROR); + EXPECT_EQ(validation_error, CHIP_NO_ERROR); } -static void TestECDSA_Signing_SHA256_Hash(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestECDSA_Signing_SHA256_Hash) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; const uint8_t msg[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F }; size_t msg_length = sizeof(msg); Test_P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); // TODO: Need to make this large number (1k+) to catch some signature serialization corner cases // but this is too slow on QEMU/embedded, so we need to parametrize. Signing with ECDSA @@ -1066,13 +1079,13 @@ static void TestECDSA_Signing_SHA256_Hash(nlTestSuite * inSuite, void * inContex P256ECDSASignature signature; uint8_t hash[Crypto::kSHA256_Hash_Length]; - NL_TEST_ASSERT(inSuite, Hash_SHA256(&msg[0], msg_length, &hash[0]) == CHIP_NO_ERROR); + EXPECT_EQ(Hash_SHA256(&msg[0], msg_length, &hash[0]), CHIP_NO_ERROR); CHIP_ERROR signing_error = keypair.ECDSA_sign_msg(msg, msg_length, signature); - NL_TEST_ASSERT(inSuite, signing_error == CHIP_NO_ERROR); + EXPECT_EQ(signing_error, CHIP_NO_ERROR); CHIP_ERROR validation_error = keypair.Pubkey().ECDSA_validate_hash_signature(hash, sizeof(hash), signature); - NL_TEST_ASSERT(inSuite, validation_error == CHIP_NO_ERROR); + EXPECT_EQ(validation_error, CHIP_NO_ERROR); if ((signing_error != CHIP_NO_ERROR) || (validation_error != CHIP_NO_ERROR)) { @@ -1082,142 +1095,142 @@ static void TestECDSA_Signing_SHA256_Hash(nlTestSuite * inSuite, void * inContex } } -static void TestECDSA_ValidationFailsDifferentMessage(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestECDSA_ValidationFailsDifferentMessage) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; const char * msg = "Hello World!"; size_t msg_length = strlen(msg); P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); P256ECDSASignature signature; CHIP_ERROR signing_error = keypair.ECDSA_sign_msg(reinterpret_cast<const uint8_t *>(msg), msg_length, signature); - NL_TEST_ASSERT(inSuite, signing_error == CHIP_NO_ERROR); + EXPECT_EQ(signing_error, CHIP_NO_ERROR); const char * diff_msg = "NOT Hello World!"; size_t diff_msg_length = strlen(msg); CHIP_ERROR validation_error = keypair.Pubkey().ECDSA_validate_msg_signature(reinterpret_cast<const uint8_t *>(diff_msg), diff_msg_length, signature); - NL_TEST_ASSERT(inSuite, validation_error == CHIP_ERROR_INVALID_SIGNATURE); + EXPECT_EQ(validation_error, CHIP_ERROR_INVALID_SIGNATURE); } -static void TestECDSA_ValidationFailIncorrectMsgSignature(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestECDSA_ValidationFailIncorrectMsgSignature) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; const char * msg = "Hello World!"; size_t msg_length = strlen(msg); P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); P256ECDSASignature signature; CHIP_ERROR signing_error = keypair.ECDSA_sign_msg(reinterpret_cast<const uint8_t *>(msg), msg_length, signature); - NL_TEST_ASSERT(inSuite, signing_error == CHIP_NO_ERROR); + EXPECT_EQ(signing_error, CHIP_NO_ERROR); signature.Bytes()[0] = static_cast<uint8_t>(~signature.ConstBytes()[0]); // Flipping bits should invalidate the signature. CHIP_ERROR validation_error = keypair.Pubkey().ECDSA_validate_msg_signature(reinterpret_cast<const uint8_t *>(msg), msg_length, signature); - NL_TEST_ASSERT(inSuite, validation_error == CHIP_ERROR_INVALID_SIGNATURE); + EXPECT_EQ(validation_error, CHIP_ERROR_INVALID_SIGNATURE); } -static void TestECDSA_ValidationFailIncorrectHashSignature(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestECDSA_ValidationFailIncorrectHashSignature) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; const uint8_t msg[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F }; size_t msg_length = sizeof(msg); uint8_t hash[Crypto::kSHA256_Hash_Length]; - NL_TEST_ASSERT(inSuite, Hash_SHA256(&msg[0], msg_length, &hash[0]) == CHIP_NO_ERROR); + EXPECT_EQ(Hash_SHA256(&msg[0], msg_length, &hash[0]), CHIP_NO_ERROR); P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); P256ECDSASignature signature; CHIP_ERROR signing_error = keypair.ECDSA_sign_msg(msg, msg_length, signature); - NL_TEST_ASSERT(inSuite, signing_error == CHIP_NO_ERROR); + EXPECT_EQ(signing_error, CHIP_NO_ERROR); signature.Bytes()[0] = static_cast<uint8_t>(~signature.ConstBytes()[0]); // Flipping bits should invalidate the signature. CHIP_ERROR validation_error = keypair.Pubkey().ECDSA_validate_hash_signature(hash, sizeof(hash), signature); - NL_TEST_ASSERT(inSuite, validation_error == CHIP_ERROR_INVALID_SIGNATURE); + EXPECT_EQ(validation_error, CHIP_ERROR_INVALID_SIGNATURE); } -static void TestECDSA_SigningMsgInvalidParams(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestECDSA_SigningMsgInvalidParams) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; const uint8_t * msg = reinterpret_cast<const uint8_t *>("Hello World!"); size_t msg_length = strlen(reinterpret_cast<const char *>(msg)); P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); P256ECDSASignature signature; CHIP_ERROR signing_error = keypair.ECDSA_sign_msg(nullptr, msg_length, signature); - NL_TEST_ASSERT(inSuite, signing_error == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(signing_error, CHIP_ERROR_INVALID_ARGUMENT); signing_error = CHIP_NO_ERROR; signing_error = keypair.ECDSA_sign_msg(msg, 0, signature); - NL_TEST_ASSERT(inSuite, signing_error == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(signing_error, CHIP_ERROR_INVALID_ARGUMENT); signing_error = CHIP_NO_ERROR; } -static void TestECDSA_ValidationMsgInvalidParam(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestECDSA_ValidationMsgInvalidParam) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; const char * msg = "Hello World!"; size_t msg_length = strlen(msg); P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); P256ECDSASignature signature; CHIP_ERROR signing_error = keypair.ECDSA_sign_msg(reinterpret_cast<const uint8_t *>(msg), msg_length, signature); - NL_TEST_ASSERT(inSuite, signing_error == CHIP_NO_ERROR); + EXPECT_EQ(signing_error, CHIP_NO_ERROR); CHIP_ERROR validation_error = keypair.Pubkey().ECDSA_validate_msg_signature(nullptr, msg_length, signature); - NL_TEST_ASSERT(inSuite, validation_error == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(validation_error, CHIP_ERROR_INVALID_ARGUMENT); validation_error = CHIP_NO_ERROR; validation_error = keypair.Pubkey().ECDSA_validate_msg_signature(reinterpret_cast<const uint8_t *>(msg), 0, signature); - NL_TEST_ASSERT(inSuite, validation_error == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(validation_error, CHIP_ERROR_INVALID_ARGUMENT); validation_error = CHIP_NO_ERROR; } -static void TestECDSA_ValidationHashInvalidParam(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestECDSA_ValidationHashInvalidParam) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; const uint8_t msg[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F }; size_t msg_length = sizeof(msg); uint8_t hash[Crypto::kSHA256_Hash_Length]; - NL_TEST_ASSERT(inSuite, Hash_SHA256(&msg[0], msg_length, &hash[0]) == CHIP_NO_ERROR); + EXPECT_EQ(Hash_SHA256(&msg[0], msg_length, &hash[0]), CHIP_NO_ERROR); P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); P256ECDSASignature signature; CHIP_ERROR signing_error = keypair.ECDSA_sign_msg(msg, msg_length, signature); - NL_TEST_ASSERT(inSuite, signing_error == CHIP_NO_ERROR); + EXPECT_EQ(signing_error, CHIP_NO_ERROR); CHIP_ERROR validation_error = keypair.Pubkey().ECDSA_validate_hash_signature(nullptr, sizeof(hash), signature); - NL_TEST_ASSERT(inSuite, validation_error == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(validation_error, CHIP_ERROR_INVALID_ARGUMENT); signing_error = CHIP_NO_ERROR; validation_error = keypair.Pubkey().ECDSA_validate_hash_signature(hash, sizeof(hash) - 5, signature); - NL_TEST_ASSERT(inSuite, validation_error == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(validation_error, CHIP_ERROR_INVALID_ARGUMENT); signing_error = CHIP_NO_ERROR; } -static void TestECDH_EstablishSecret(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestECDH_EstablishSecret) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; Test_P256Keypair keypair1; - NL_TEST_ASSERT(inSuite, keypair1.Initialize(ECPKeyTarget::ECDH) == CHIP_NO_ERROR); + EXPECT_EQ(keypair1.Initialize(ECPKeyTarget::ECDH), CHIP_NO_ERROR); Test_P256Keypair keypair2; - NL_TEST_ASSERT(inSuite, keypair2.Initialize(ECPKeyTarget::ECDH) == CHIP_NO_ERROR); + EXPECT_EQ(keypair2.Initialize(ECPKeyTarget::ECDH), CHIP_NO_ERROR); P256ECDHDerivedSecret out_secret1; out_secret1.Bytes()[0] = 0; @@ -1226,66 +1239,53 @@ static void TestECDH_EstablishSecret(nlTestSuite * inSuite, void * inContext) out_secret2.Bytes()[0] = 1; CHIP_ERROR error = CHIP_NO_ERROR; - NL_TEST_ASSERT(inSuite, - memcmp(out_secret1.ConstBytes(), out_secret2.ConstBytes(), out_secret1.Capacity()) != - 0); // Validate that buffers are indeed different. + EXPECT_NE(memcmp(out_secret1.ConstBytes(), out_secret2.ConstBytes(), out_secret1.Capacity()), + 0); // Validate that buffers are indeed different. error = keypair2.ECDH_derive_secret(keypair1.Pubkey(), out_secret1); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); error = keypair1.ECDH_derive_secret(keypair2.Pubkey(), out_secret2); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); bool signature_lengths_match = out_secret1.Length() == out_secret2.Length(); - NL_TEST_ASSERT(inSuite, signature_lengths_match); + EXPECT_TRUE(signature_lengths_match); bool signatures_match = (memcmp(out_secret1.ConstBytes(), out_secret2.ConstBytes(), out_secret1.Length()) == 0); - NL_TEST_ASSERT(inSuite, signatures_match); + EXPECT_TRUE(signatures_match); } #if CHIP_CRYPTO_OPENSSL -static void TestAddEntropySources(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestAddEntropySources) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; CHIP_ERROR error = add_entropy_source(test_entropy_source, nullptr, 10); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); uint8_t buffer[5]; - NL_TEST_ASSERT(inSuite, DRBG_get_bytes(buffer, sizeof(buffer)) == CHIP_NO_ERROR); + EXPECT_EQ(DRBG_get_bytes(buffer, sizeof(buffer)), CHIP_NO_ERROR); } #endif #if CHIP_CRYPTO_MBEDTLS -static void TestAddEntropySources(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestAddEntropySources) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; CHIP_ERROR error = add_entropy_source(test_entropy_source, nullptr, 10); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); uint8_t buffer[5]; uint32_t test_entropy_source_call_count = gs_test_entropy_source_called; - NL_TEST_ASSERT(inSuite, DRBG_get_bytes(buffer, sizeof(buffer)) == CHIP_NO_ERROR); + EXPECT_EQ(DRBG_get_bytes(buffer, sizeof(buffer)), CHIP_NO_ERROR); for (int i = 0; i < 5000 * 2; i++) { (void) DRBG_get_bytes(buffer, sizeof(buffer)); } - NL_TEST_ASSERT(inSuite, gs_test_entropy_source_called > test_entropy_source_call_count); + EXPECT_GT(gs_test_entropy_source_called, test_entropy_source_call_count); } #endif -#if CHIP_CRYPTO_PSA -static void TestAddEntropySources(nlTestSuite * inSuite, void * inContext) {} -#endif - -#if CHIP_CRYPTO_BORINGSSL -static void TestAddEntropySources(nlTestSuite * inSuite, void * inContext) {} -#endif - -#if CHIP_CRYPTO_PLATFORM -static void TestAddEntropySources(nlTestSuite * inSuite, void * inContext) {} -#endif - -static void TestPBKDF2_SHA256_TestVectors(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestPBKDF2_SHA256_TestVectors) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; int numOfTestVectors = ArraySize(pbkdf2_sha256_test_vectors); int numOfTestsRan = 0; TestPBKDF2_sha256 pbkdf1; @@ -1297,37 +1297,37 @@ static void TestPBKDF2_SHA256_TestVectors(nlTestSuite * inSuite, void * inContex numOfTestsRan++; chip::Platform::ScopedMemoryBuffer<uint8_t> out_key; out_key.Alloc(vector->key_len); - NL_TEST_ASSERT(inSuite, out_key); + EXPECT_TRUE(out_key); CHIP_ERROR err = pbkdf1.pbkdf2_sha256(vector->password, vector->plen, vector->salt, vector->slen, vector->iter, vector->key_len, out_key.Get()); - NL_TEST_ASSERT(inSuite, err == vector->result); + EXPECT_EQ(err, vector->result); if (vector->result == CHIP_NO_ERROR) { - NL_TEST_ASSERT(inSuite, memcmp(out_key.Get(), vector->key, vector->key_len) == 0); + EXPECT_EQ(memcmp(out_key.Get(), vector->key, vector->key_len), 0); } } } - NL_TEST_ASSERT(inSuite, numOfTestsRan > 0); + EXPECT_GT(numOfTestsRan, 0); } -static void TestP256_Keygen(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestP256_Keygen) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); const char * msg = "Test Message for Keygen"; const uint8_t * test_msg = Uint8::from_const_char(msg); size_t msglen = strlen(msg); P256ECDSASignature test_sig; - NL_TEST_ASSERT(inSuite, keypair.ECDSA_sign_msg(test_msg, msglen, test_sig) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, keypair.Pubkey().ECDSA_validate_msg_signature(test_msg, msglen, test_sig) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.ECDSA_sign_msg(test_msg, msglen, test_sig), CHIP_NO_ERROR); + EXPECT_EQ(keypair.Pubkey().ECDSA_validate_msg_signature(test_msg, msglen, test_sig), CHIP_NO_ERROR); } -void TestCSR_Verify(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestCSR_Verify) { Crypto::P256PublicKey pubKey; CHIP_ERROR err; @@ -1361,10 +1361,10 @@ void TestCSR_Verify(nlTestSuite * inSuite, void * inContext) return; } - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); err = VerifyCertificateSigningRequestFormat(&kBadTrailingGarbageCsr[0], sizeof(kBadTrailingGarbageCsr)); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_UNSUPPORTED_CERT_FORMAT); + EXPECT_EQ(err, CHIP_ERROR_UNSUPPORTED_CERT_FORMAT); } // Second case: correct CSR @@ -1392,13 +1392,13 @@ void TestCSR_Verify(nlTestSuite * inSuite, void * inContext) Crypto::ClearSecretData(pubKey.Bytes(), pubKey.Length()); err = VerifyCertificateSigningRequestFormat(&kGoodCsr[0], sizeof(kGoodCsr)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = VerifyCertificateSigningRequest(&kGoodCsr[0], sizeof(kGoodCsr), pubKey); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); Crypto::P256PublicKey expected(kGoodCsrSubjectPublicKey); - NL_TEST_ASSERT(inSuite, pubKey.Matches(expected)); + EXPECT_TRUE(pubKey.Matches(expected)); } // Third case: bad signature @@ -1420,10 +1420,10 @@ void TestCSR_Verify(nlTestSuite * inSuite, void * inContext) Crypto::ClearSecretData(pubKey.Bytes(), pubKey.Length()); err = VerifyCertificateSigningRequestFormat(&kBadSignatureSignatureCsr[0], sizeof(kBadSignatureSignatureCsr)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = VerifyCertificateSigningRequest(&kBadSignatureSignatureCsr[0], sizeof(kBadSignatureSignatureCsr), pubKey); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); } // Fourth case: CSR too big @@ -1446,10 +1446,10 @@ void TestCSR_Verify(nlTestSuite * inSuite, void * inContext) Crypto::ClearSecretData(pubKey.Bytes(), pubKey.Length()); err = VerifyCertificateSigningRequestFormat(&kBadTooBigCsr[0], sizeof(kBadTooBigCsr)); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_UNSUPPORTED_CERT_FORMAT); + EXPECT_EQ(err, CHIP_ERROR_UNSUPPORTED_CERT_FORMAT); err = VerifyCertificateSigningRequest(&kBadTooBigCsr[0], sizeof(kBadTooBigCsr), pubKey); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); } // Fifth case: obviously invalid CSR (1/2) @@ -1461,10 +1461,10 @@ void TestCSR_Verify(nlTestSuite * inSuite, void * inContext) Crypto::ClearSecretData(pubKey.Bytes(), pubKey.Length()); err = VerifyCertificateSigningRequestFormat(&kTooSmallCsr[0], sizeof(kTooSmallCsr)); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_UNSUPPORTED_CERT_FORMAT); + EXPECT_EQ(err, CHIP_ERROR_UNSUPPORTED_CERT_FORMAT); err = VerifyCertificateSigningRequest(&kTooSmallCsr[0], sizeof(kTooSmallCsr), pubKey); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); } // Sixth case: obviously invalid CSR (2/2) @@ -1486,14 +1486,14 @@ void TestCSR_Verify(nlTestSuite * inSuite, void * inContext) Crypto::ClearSecretData(pubKey.Bytes(), pubKey.Length()); err = VerifyCertificateSigningRequestFormat(&kNotSequenceCsr[0], sizeof(kNotSequenceCsr)); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_UNSUPPORTED_CERT_FORMAT); + EXPECT_EQ(err, CHIP_ERROR_UNSUPPORTED_CERT_FORMAT); err = VerifyCertificateSigningRequest(&kNotSequenceCsr[0], sizeof(kNotSequenceCsr), pubKey); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); } } -void TestCSR_GenDirect(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestCSR_GenDirect) { uint8_t csrBuf[kMIN_CSR_Buffer_Size]; ClearSecretData(csrBuf); @@ -1501,35 +1501,35 @@ void TestCSR_GenDirect(nlTestSuite * inSuite, void * inContext) Test_P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); // Validate case of buffer too small uint8_t csrBufTooSmall[kMIN_CSR_Buffer_Size - 1]; MutableByteSpan csrSpanTooSmall(csrBufTooSmall); - NL_TEST_ASSERT(inSuite, GenerateCertificateSigningRequest(&keypair, csrSpanTooSmall) == CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_EQ(GenerateCertificateSigningRequest(&keypair, csrSpanTooSmall), CHIP_ERROR_BUFFER_TOO_SMALL); // Validate case of null keypair - NL_TEST_ASSERT(inSuite, GenerateCertificateSigningRequest(nullptr, csrSpan) == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(GenerateCertificateSigningRequest(nullptr, csrSpan), CHIP_ERROR_INVALID_ARGUMENT); // Validate normal case ClearSecretData(csrBuf); - NL_TEST_ASSERT(inSuite, GenerateCertificateSigningRequest(&keypair, csrSpan) == CHIP_NO_ERROR); + EXPECT_EQ(GenerateCertificateSigningRequest(&keypair, csrSpan), CHIP_NO_ERROR); P256PublicKey pubkey; CHIP_ERROR err = VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), pubkey); if (err != CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE) { - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, pubkey.Length() == kP256_PublicKey_Length); - NL_TEST_ASSERT(inSuite, memcmp(pubkey.ConstBytes(), keypair.Pubkey().ConstBytes(), pubkey.Length()) == 0); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(pubkey.Length(), kP256_PublicKey_Length); + EXPECT_EQ(memcmp(pubkey.ConstBytes(), keypair.Pubkey().ConstBytes(), pubkey.Length()), 0); // Let's corrupt the CSR buffer and make sure it fails to verify size_t length = csrSpan.size(); csrBuf[length - 2] = (uint8_t) (csrBuf[length - 2] + 1); csrBuf[length - 1] = (uint8_t) (csrBuf[length - 1] + 1); - NL_TEST_ASSERT(inSuite, VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), pubkey) != CHIP_NO_ERROR); + EXPECT_NE(VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), pubkey), CHIP_NO_ERROR); } else { @@ -1537,30 +1537,30 @@ void TestCSR_GenDirect(nlTestSuite * inSuite, void * inContext) } } -static void TestCSR_GenByKeypair(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestCSR_GenByKeypair) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; uint8_t csr[kMIN_CSR_Buffer_Size]; size_t length = sizeof(csr); Test_P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, keypair.NewCertificateSigningRequest(csr, length) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, length > 0); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); + EXPECT_EQ(keypair.NewCertificateSigningRequest(csr, length), CHIP_NO_ERROR); + EXPECT_GT(length, 0u); P256PublicKey pubkey; CHIP_ERROR err = VerifyCertificateSigningRequest(csr, length, pubkey); if (err != CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE) { - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, pubkey.Length() == kP256_PublicKey_Length); - NL_TEST_ASSERT(inSuite, memcmp(pubkey.ConstBytes(), keypair.Pubkey().ConstBytes(), pubkey.Length()) == 0); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(pubkey.Length(), kP256_PublicKey_Length); + EXPECT_EQ(memcmp(pubkey.ConstBytes(), keypair.Pubkey().ConstBytes(), pubkey.Length()), 0); // Let's corrupt the CSR buffer and make sure it fails to verify csr[length - 2] = (uint8_t) (csr[length - 2] + 1); csr[length - 1] = (uint8_t) (csr[length - 1] + 1); - NL_TEST_ASSERT(inSuite, VerifyCertificateSigningRequest(csr, length, pubkey) != CHIP_NO_ERROR); + EXPECT_NE(VerifyCertificateSigningRequest(csr, length, pubkey), CHIP_NO_ERROR); } else { @@ -1568,34 +1568,34 @@ static void TestCSR_GenByKeypair(nlTestSuite * inSuite, void * inContext) } } -static void TestKeypair_Serialize(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestKeypair_Serialize) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; Test_P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); P256SerializedKeypair serialized; - NL_TEST_ASSERT(inSuite, keypair.Serialize(serialized) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Serialize(serialized), CHIP_NO_ERROR); Test_P256Keypair keypair_dup; - NL_TEST_ASSERT(inSuite, keypair_dup.Deserialize(serialized) == CHIP_NO_ERROR); + EXPECT_EQ(keypair_dup.Deserialize(serialized), CHIP_NO_ERROR); const char * msg = "Test Message for Keygen"; const uint8_t * test_msg = Uint8::from_const_char(msg); size_t msglen = strlen(msg); P256ECDSASignature test_sig; - NL_TEST_ASSERT(inSuite, keypair.ECDSA_sign_msg(test_msg, msglen, test_sig) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, keypair_dup.Pubkey().ECDSA_validate_msg_signature(test_msg, msglen, test_sig) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.ECDSA_sign_msg(test_msg, msglen, test_sig), CHIP_NO_ERROR); + EXPECT_EQ(keypair_dup.Pubkey().ECDSA_validate_msg_signature(test_msg, msglen, test_sig), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, keypair_dup.ECDSA_sign_msg(test_msg, msglen, test_sig) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, keypair.Pubkey().ECDSA_validate_msg_signature(test_msg, msglen, test_sig) == CHIP_NO_ERROR); + EXPECT_EQ(keypair_dup.ECDSA_sign_msg(test_msg, msglen, test_sig), CHIP_NO_ERROR); + EXPECT_EQ(keypair.Pubkey().ECDSA_validate_msg_signature(test_msg, msglen, test_sig), CHIP_NO_ERROR); } -static void TestSPAKE2P_spake2p_FEMul(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestSPAKE2P_spake2p_FEMul) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; uint8_t fe_out[kMAX_FE_Length]; int numOfTestVectors = ArraySize(fe_mul_tvs); @@ -1607,30 +1607,30 @@ static void TestSPAKE2P_spake2p_FEMul(nlTestSuite * inSuite, void * inContext) TestSpake2p_P256_SHA256_HKDF_HMAC spake2p; CHIP_ERROR err = spake2p.Init(nullptr, 0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.FELoad(vector->fe1, vector->fe1_len, spake2p.w0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.FELoad(vector->fe2, vector->fe2_len, spake2p.w1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.FEMul(spake2p.xy, spake2p.w0, spake2p.w1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.FEWrite(spake2p.xy, fe_out, sizeof(fe_out)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(fe_out, vector->fe_out, vector->fe_out_len) == 0); + EXPECT_EQ(memcmp(fe_out, vector->fe_out, vector->fe_out_len), 0); numOfTestsRan += 1; } - NL_TEST_ASSERT(inSuite, numOfTestsRan > 0); - NL_TEST_ASSERT(inSuite, numOfTestsRan == numOfTestVectors); + EXPECT_GT(numOfTestsRan, 0); + EXPECT_EQ(numOfTestsRan, numOfTestVectors); } -static void TestSPAKE2P_spake2p_FELoadWrite(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestSPAKE2P_spake2p_FELoadWrite) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; uint8_t fe_out[kMAX_FE_Length]; int numOfTestVectors = ArraySize(fe_rw_tvs); @@ -1642,24 +1642,24 @@ static void TestSPAKE2P_spake2p_FELoadWrite(nlTestSuite * inSuite, void * inCont TestSpake2p_P256_SHA256_HKDF_HMAC spake2p; CHIP_ERROR err = spake2p.Init(nullptr, 0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.FELoad(vector->fe_in, vector->fe_in_len, spake2p.w0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.FEWrite(spake2p.w0, fe_out, sizeof(fe_out)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(fe_out, vector->fe_out, vector->fe_out_len) == 0); + EXPECT_EQ(memcmp(fe_out, vector->fe_out, vector->fe_out_len), 0); numOfTestsRan += 1; } - NL_TEST_ASSERT(inSuite, numOfTestsRan > 0); - NL_TEST_ASSERT(inSuite, numOfTestsRan == numOfTestVectors); + EXPECT_GT(numOfTestsRan, 0); + EXPECT_EQ(numOfTestsRan, numOfTestVectors); } -static void TestSPAKE2P_spake2p_Mac(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestSPAKE2P_spake2p_Mac) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; uint8_t mac[kMAX_Hash_Length]; MutableByteSpan mac_span{ mac }; @@ -1672,25 +1672,25 @@ static void TestSPAKE2P_spake2p_Mac(nlTestSuite * inSuite, void * inContext) TestSpake2p_P256_SHA256_HKDF_HMAC spake2p; CHIP_ERROR err = spake2p.Init(nullptr, 0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.Mac(vector->key, vector->key_len, vector->input, vector->input_len, mac_span); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(mac_span.data(), vector->output, vector->output_len) == 0); + EXPECT_EQ(memcmp(mac_span.data(), vector->output, vector->output_len), 0); err = spake2p.MacVerify(vector->key, vector->key_len, vector->output, vector->output_len, vector->input, vector->input_len); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); numOfTestsRan += 1; } - NL_TEST_ASSERT(inSuite, numOfTestsRan > 0); - NL_TEST_ASSERT(inSuite, numOfTestsRan == numOfTestVectors); + EXPECT_GT(numOfTestsRan, 0); + EXPECT_EQ(numOfTestsRan, numOfTestVectors); } -static void TestSPAKE2P_spake2p_PointMul(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestSPAKE2P_spake2p_PointMul) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; uint8_t output[kMAX_Point_Length]; size_t out_len = sizeof(output); @@ -1704,31 +1704,31 @@ static void TestSPAKE2P_spake2p_PointMul(nlTestSuite * inSuite, void * inContext TestSpake2p_P256_SHA256_HKDF_HMAC spake2p; CHIP_ERROR err = spake2p.Init(nullptr, 0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.PointLoad(vector->point, vector->point_len, spake2p.L); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.FELoad(vector->scalar, vector->scalar_len, spake2p.w0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.PointMul(spake2p.X, spake2p.L, spake2p.w0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.PointWrite(spake2p.X, output, out_len); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(output, vector->out_point, vector->out_point_len) == 0); + EXPECT_EQ(memcmp(output, vector->out_point, vector->out_point_len), 0); numOfTestsRan += 1; } - NL_TEST_ASSERT(inSuite, numOfTestsRan > 0); - NL_TEST_ASSERT(inSuite, numOfTestsRan == numOfTestVectors); + EXPECT_GT(numOfTestsRan, 0); + EXPECT_EQ(numOfTestsRan, numOfTestVectors); } -static void TestSPAKE2P_spake2p_PointMulAdd(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestSPAKE2P_spake2p_PointMulAdd) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; uint8_t output[kMAX_Point_Length]; size_t out_len = sizeof(output); @@ -1742,37 +1742,37 @@ static void TestSPAKE2P_spake2p_PointMulAdd(nlTestSuite * inSuite, void * inCont TestSpake2p_P256_SHA256_HKDF_HMAC spake2p; CHIP_ERROR err = spake2p.Init(nullptr, 0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.PointLoad(vector->point1, vector->point1_len, spake2p.X); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.PointLoad(vector->point2, vector->point2_len, spake2p.Y); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.FELoad(vector->scalar1, vector->scalar1_len, spake2p.w0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.FELoad(vector->scalar2, vector->scalar2_len, spake2p.w1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.PointAddMul(spake2p.L, spake2p.X, spake2p.w0, spake2p.Y, spake2p.w1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.PointWrite(spake2p.L, output, out_len); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(output, vector->out_point, vector->out_point_len) == 0); + EXPECT_EQ(memcmp(output, vector->out_point, vector->out_point_len), 0); numOfTestsRan += 1; } - NL_TEST_ASSERT(inSuite, numOfTestsRan > 0); - NL_TEST_ASSERT(inSuite, numOfTestsRan == numOfTestVectors); + EXPECT_GT(numOfTestsRan, 0); + EXPECT_EQ(numOfTestsRan, numOfTestVectors); } -static void TestSPAKE2P_spake2p_PointLoadWrite(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestSPAKE2P_spake2p_PointLoadWrite) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; uint8_t output[kMAX_Point_Length]; size_t out_len = sizeof(output); @@ -1786,25 +1786,25 @@ static void TestSPAKE2P_spake2p_PointLoadWrite(nlTestSuite * inSuite, void * inC TestSpake2p_P256_SHA256_HKDF_HMAC spake2p; CHIP_ERROR err = spake2p.Init(nullptr, 0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.PointLoad(vector->point, vector->point_len, spake2p.L); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.PointWrite(spake2p.L, output, out_len); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(output, vector->point, vector->point_len) == 0); + EXPECT_EQ(memcmp(output, vector->point, vector->point_len), 0); numOfTestsRan += 1; } - NL_TEST_ASSERT(inSuite, numOfTestsRan > 0); - NL_TEST_ASSERT(inSuite, numOfTestsRan == numOfTestVectors); + EXPECT_GT(numOfTestsRan, 0); + EXPECT_EQ(numOfTestsRan, numOfTestVectors); } -static void TestSPAKE2P_spake2p_PointIsValid(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestSPAKE2P_spake2p_PointIsValid) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; int numOfTestVectors = ArraySize(point_valid_tvs); int numOfTestsRan = 0; for (int vectorIndex = 0; vectorIndex < numOfTestVectors; vectorIndex++) @@ -1814,19 +1814,19 @@ static void TestSPAKE2P_spake2p_PointIsValid(nlTestSuite * inSuite, void * inCon TestSpake2p_P256_SHA256_HKDF_HMAC spake2p; CHIP_ERROR err = spake2p.Init(nullptr, 0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = spake2p.PointLoad(vector->point, vector->point_len, spake2p.L); // The underlying implementation may (i.e. should) check for validity when loading a point. Let's catch this case. - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR || vector->valid == 0); + EXPECT_TRUE(err == CHIP_NO_ERROR || vector->valid == 0); err = spake2p.PointIsValid(spake2p.L); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR || vector->valid == 0); + EXPECT_TRUE(err == CHIP_NO_ERROR || vector->valid == 0); numOfTestsRan += 1; } - NL_TEST_ASSERT(inSuite, numOfTestsRan > 0); - NL_TEST_ASSERT(inSuite, numOfTestsRan == numOfTestVectors); + EXPECT_GT(numOfTestsRan, 0); + EXPECT_EQ(numOfTestsRan, numOfTestVectors); } // We need to "generate" specific field elements @@ -1852,9 +1852,9 @@ class Test_Spake2p_P256_SHA256_HKDF_HMAC : public Spake2p_P256_SHA256_HKDF_HMAC size_t fe_len; }; -static void TestSPAKE2P_RFC(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestSPAKE2P_RFC) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; CHIP_ERROR error = CHIP_NO_ERROR; uint8_t L[kMAX_Point_Length]; size_t L_len = sizeof(L); @@ -1885,103 +1885,103 @@ static void TestSPAKE2P_RFC(nlTestSuite * inSuite, void * inContext) // First start the prover error = Prover.Init(vector->context, vector->context_len); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); error = Prover.BeginProver(vector->prover_identity, vector->prover_identity_len, vector->verifier_identity, vector->verifier_identity_len, vector->w0, vector->w0_len, vector->w1, vector->w1_len); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); // Monkey patch the generated x coordinate error = Prover.TestSetFE(vector->x, vector->x_len); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); // Compute the first round and send it to the verifier X_len = sizeof(X); error = Prover.ComputeRoundOne(nullptr, 0, X, &X_len); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, X_len == vector->X_len); - NL_TEST_ASSERT(inSuite, memcmp(X, vector->X, vector->X_len) == 0); + EXPECT_EQ(error, CHIP_NO_ERROR); + EXPECT_EQ(X_len, vector->X_len); + EXPECT_EQ(memcmp(X, vector->X, vector->X_len), 0); // Start up the verifier error = Verifier.Init(vector->context, vector->context_len); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); // First pre-compute L (accessories with dynamic setup codes will do this) L_len = sizeof(L); error = Verifier.ComputeL(L, &L_len, vector->w1, vector->w1_len); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, L_len == vector->L_len); - NL_TEST_ASSERT(inSuite, memcmp(L, vector->L, vector->L_len) == 0); + EXPECT_EQ(error, CHIP_NO_ERROR); + EXPECT_EQ(L_len, vector->L_len); + EXPECT_EQ(memcmp(L, vector->L, vector->L_len), 0); // Start up the verifier error = Verifier.BeginVerifier(vector->verifier_identity, vector->verifier_identity_len, vector->prover_identity, vector->prover_identity_len, vector->w0, vector->w0_len, L, L_len); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); // Monkey patch the generated y coordinate error = Verifier.TestSetFE(vector->y, vector->y_len); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); // Compute the first round and send it to the prover Y_len = sizeof(Y); error = Verifier.ComputeRoundOne(X, X_len, Y, &Y_len); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, Y_len == vector->Y_len); - NL_TEST_ASSERT(inSuite, memcmp(Y, vector->Y, vector->Y_len) == 0); + EXPECT_EQ(error, CHIP_NO_ERROR); + EXPECT_EQ(Y_len, vector->Y_len); + EXPECT_EQ(memcmp(Y, vector->Y, vector->Y_len), 0); // Compute the second round to also send to the prover Vverifier_len = sizeof(Vverifier); error = Verifier.ComputeRoundTwo(X, X_len, Vverifier, &Vverifier_len); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, Vverifier_len == vector->MAC_KcB_len); - NL_TEST_ASSERT(inSuite, memcmp(Vverifier, vector->MAC_KcB, vector->MAC_KcB_len) == 0); + EXPECT_EQ(error, CHIP_NO_ERROR); + EXPECT_EQ(Vverifier_len, vector->MAC_KcB_len); + EXPECT_EQ(memcmp(Vverifier, vector->MAC_KcB, vector->MAC_KcB_len), 0); error = Verifier.PointWrite(Verifier.Z, Z, kP256_Point_Length); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(Z, vector->Z, vector->Z_len) == 0); + EXPECT_EQ(error, CHIP_NO_ERROR); + EXPECT_EQ(memcmp(Z, vector->Z, vector->Z_len), 0); error = Verifier.PointWrite(Verifier.V, V, kP256_Point_Length); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(V, vector->V, vector->V_len) == 0); + EXPECT_EQ(error, CHIP_NO_ERROR); + EXPECT_EQ(memcmp(V, vector->V, vector->V_len), 0); // Now the prover computes round 2 Pverifier_len = sizeof(Pverifier); error = Prover.ComputeRoundTwo(Y, Y_len, Pverifier, &Pverifier_len); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, Pverifier_len == vector->MAC_KcA_len); - NL_TEST_ASSERT(inSuite, memcmp(Pverifier, vector->MAC_KcA, vector->MAC_KcA_len) == 0); + EXPECT_EQ(error, CHIP_NO_ERROR); + EXPECT_EQ(Pverifier_len, vector->MAC_KcA_len); + EXPECT_EQ(memcmp(Pverifier, vector->MAC_KcA, vector->MAC_KcA_len), 0); error = Prover.PointWrite(Verifier.Z, Z, kP256_Point_Length); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(Z, vector->Z, vector->Z_len) == 0); + EXPECT_EQ(error, CHIP_NO_ERROR); + EXPECT_EQ(memcmp(Z, vector->Z, vector->Z_len), 0); error = Prover.PointWrite(Verifier.V, V, kP256_Point_Length); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(V, vector->V, vector->V_len) == 0); + EXPECT_EQ(error, CHIP_NO_ERROR); + EXPECT_EQ(memcmp(V, vector->V, vector->V_len), 0); // Both sides now confirm the keys they received error = Prover.KeyConfirm(Vverifier, Vverifier_len); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); error = Verifier.KeyConfirm(Pverifier, Pverifier_len); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); // Import HKDF key from the test vector to the keystore HkdfKeyHandle vectorKe; error = keystore.CreateKey(ByteSpan(vector->Ke, vector->Ke_len), vectorKe); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(error, CHIP_NO_ERROR); // Verify that both sides generated the same HKDF key as in the test vector // Since the HKDF keys may not be availabe in the raw form, do not compare them directly, // but rather check if the same attestation challenge is derived from HkdfKeyHandle PKe; error = Prover.GetKeys(keystore, PKe); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - AssertKeysEqual(inSuite, keystore, PKe, vectorKe); + EXPECT_EQ(error, CHIP_NO_ERROR); + AssertKeysEqual(keystore, PKe, vectorKe); HkdfKeyHandle VKe; error = Verifier.GetKeys(keystore, VKe); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - AssertKeysEqual(inSuite, keystore, VKe, vectorKe); + EXPECT_EQ(error, CHIP_NO_ERROR); + AssertKeysEqual(keystore, VKe, vectorKe); keystore.DestroyKey(vectorKe); keystore.DestroyKey(PKe); @@ -1989,27 +1989,27 @@ static void TestSPAKE2P_RFC(nlTestSuite * inSuite, void * inContext) numOfTestsRan += 1; } - NL_TEST_ASSERT(inSuite, numOfTestsRan > 0); - NL_TEST_ASSERT(inSuite, numOfTestsRan == numOfTestVectors); + EXPECT_GT(numOfTestsRan, 0); + EXPECT_EQ(numOfTestsRan, numOfTestVectors); } -static void TestSPAKE2P_Reuse(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestSPAKE2P_Reuse) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; Test_Spake2p_P256_SHA256_HKDF_HMAC spake2; // Veriy Init -> Clear -> Init sequence works and does not leak memory - NL_TEST_ASSERT(inSuite, spake2.Init(nullptr, 0) == CHIP_NO_ERROR); + EXPECT_EQ(spake2.Init(nullptr, 0), CHIP_NO_ERROR); spake2.Clear(); - NL_TEST_ASSERT(inSuite, spake2.Init(nullptr, 0) == CHIP_NO_ERROR); + EXPECT_EQ(spake2.Init(nullptr, 0), CHIP_NO_ERROR); // Even without an explicit Clear, Init does not leak memory - NL_TEST_ASSERT(inSuite, spake2.Init(nullptr, 0) == CHIP_NO_ERROR); + EXPECT_EQ(spake2.Init(nullptr, 0), CHIP_NO_ERROR); } -static void TestCompressedFabricIdentifier(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestCompressedFabricIdentifier) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; // Data from spec test vector (see Operational Discovery section) const uint8_t kRootPublicKey[] = { 0x04, 0x4a, 0x9f, 0x42, 0xb1, 0xca, 0x48, 0x40, 0xd3, 0x72, 0x92, 0xbb, 0xc7, 0xf6, 0xa7, 0xe1, 0x1e, @@ -2034,12 +2034,11 @@ static void TestCompressedFabricIdentifier(nlTestSuite * inSuite, void * inConte uint64_t compressed_fabric_id_int; CHIP_ERROR error = GenerateCompressedFabricId(root_public_key, kFabricId, compressed_fabric_id_span); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, compressed_fabric_id_span.size() == kCompressedFabricIdentifierSize); - NL_TEST_ASSERT(inSuite, - 0 == - memcmp(compressed_fabric_id_span.data(), kExpectedCompressedFabricIdentifier, - sizeof(kExpectedCompressedFabricIdentifier))); + EXPECT_EQ(error, CHIP_NO_ERROR); + EXPECT_EQ(compressed_fabric_id_span.size(), kCompressedFabricIdentifierSize); + EXPECT_EQ( + 0, + memcmp(compressed_fabric_id_span.data(), kExpectedCompressedFabricIdentifier, sizeof(kExpectedCompressedFabricIdentifier))); // Test bigger input buffer than needed uint8_t compressed_fabric_id_large[3 * kCompressedFabricIdentifierSize]; @@ -2047,22 +2046,21 @@ static void TestCompressedFabricIdentifier(nlTestSuite * inSuite, void * inConte ClearSecretData(compressed_fabric_id_large, sizeof(compressed_fabric_id_large)); error = GenerateCompressedFabricId(root_public_key, kFabricId, compressed_fabric_id_large_span); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, compressed_fabric_id_large_span.size() == kCompressedFabricIdentifierSize); - NL_TEST_ASSERT(inSuite, - 0 == - memcmp(compressed_fabric_id_large_span.data(), kExpectedCompressedFabricIdentifier, - sizeof(kExpectedCompressedFabricIdentifier))); + EXPECT_EQ(error, CHIP_NO_ERROR); + EXPECT_EQ(compressed_fabric_id_large_span.size(), kCompressedFabricIdentifierSize); + EXPECT_EQ(0, + memcmp(compressed_fabric_id_large_span.data(), kExpectedCompressedFabricIdentifier, + sizeof(kExpectedCompressedFabricIdentifier))); // Test smaller buffer than needed MutableByteSpan compressed_fabric_id_small_span(compressed_fabric_id, kCompressedFabricIdentifierSize - 1); error = GenerateCompressedFabricId(root_public_key, kFabricId, compressed_fabric_id_small_span); - NL_TEST_ASSERT(inSuite, error == CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_EQ(error, CHIP_ERROR_BUFFER_TOO_SMALL); // Test overload that writes to an integer output type. error = GenerateCompressedFabricId(root_public_key, kFabricId, compressed_fabric_id_int); - NL_TEST_ASSERT(inSuite, error == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, compressed_fabric_id_int == kExpectedCompressedFabricIdentifierInt); + EXPECT_EQ(error, CHIP_NO_ERROR); + EXPECT_EQ(compressed_fabric_id_int, kExpectedCompressedFabricIdentifierInt); // Test invalid public key const uint8_t kInvalidRootPublicKey[] = { @@ -2074,14 +2072,14 @@ static void TestCompressedFabricIdentifier(nlTestSuite * inSuite, void * inConte P256PublicKey invalid_root_public_key(kInvalidRootPublicKey); error = GenerateCompressedFabricId(invalid_root_public_key, kFabricId, compressed_fabric_id_span); - NL_TEST_ASSERT(inSuite, error == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(error, CHIP_ERROR_INVALID_ARGUMENT); } -static void TestPubkey_x509Extraction(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestPubkey_x509Extraction) { using namespace TestCerts; - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; CHIP_ERROR err = CHIP_NO_ERROR; P256PublicKey publicKey; @@ -2093,22 +2091,22 @@ static void TestPubkey_x509Extraction(nlTestSuite * inSuite, void * inContext) TestCert certType = TestCerts::gTestCerts[i]; err = GetTestCert(certType, TestCertLoadFlags::kDERForm, cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = GetTestCertPubkey(certType, pubkeySpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = ExtractPubkeyFromX509Cert(cert, publicKey); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, publicKey.Length() == pubkeySpan.size()); - NL_TEST_ASSERT(inSuite, memcmp(publicKey.ConstBytes(), pubkeySpan.data(), pubkeySpan.size()) == 0); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(publicKey.Length(), pubkeySpan.size()); + EXPECT_EQ(memcmp(publicKey.ConstBytes(), pubkeySpan.data(), pubkeySpan.size()), 0); } } -static void TestX509_VerifyAttestationCertificateFormat(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestX509_VerifyAttestationCertificateFormat) { using namespace TestCerts; - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; struct ValidationTestCase { @@ -2145,16 +2143,16 @@ static void TestX509_VerifyAttestationCertificateFormat(nlTestSuite * inSuite, v ChipLogError(Crypto, "Failed TestX509_VerifyAttestationCertificateFormat sub-case %d, err: %" CHIP_ERROR_FORMAT, case_idx, err.Format()); } - NL_TEST_ASSERT(inSuite, err == testCase.expectedError); + EXPECT_EQ(err, testCase.expectedError); ++case_idx; } } -static void TestX509_CertChainValidation(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestX509_CertChainValidation) { using namespace TestCerts; - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; CHIP_ERROR err = CHIP_NO_ERROR; struct ValidationTestCase @@ -2208,17 +2206,17 @@ static void TestX509_CertChainValidation(nlTestSuite * inSuite, void * inContext CertificateChainValidationResult chainValidationResult; err = ValidateCertificateChain(testCase.root.data(), testCase.root.size(), testCase.ica.data(), testCase.ica.size(), testCase.leaf.data(), testCase.leaf.size(), chainValidationResult); - NL_TEST_ASSERT(inSuite, err == testCase.expectedError); - NL_TEST_ASSERT(inSuite, chainValidationResult == testCase.expectedValResult); + EXPECT_EQ(err, testCase.expectedError); + EXPECT_EQ(chainValidationResult, testCase.expectedValResult); } } -static void TestX509_IssuingTimestampValidation(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestX509_IssuingTimestampValidation) { using namespace TestCerts; using namespace ASN1; - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; CHIP_ERROR err = CHIP_NO_ERROR; struct ValidationTestCase @@ -2254,21 +2252,21 @@ static void TestX509_IssuingTimestampValidation(nlTestSuite * inSuite, void * in for (auto & testCase : sValidationTestCases) { err = IsCertificateValidAtIssuance(testCase.refCert, testCase.evaluatedCert); - NL_TEST_ASSERT(inSuite, err == testCase.expectedError); + EXPECT_EQ(err, testCase.expectedError); } #if !defined(CURRENT_TIME_NOT_IMPLEMENTED) // test certificate validity (this one contains validity until year 9999 so it will not fail soon) err = IsCertificateValidAtCurrentTime(sTestCert_DAC_FFF2_8001_0008_Cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); #endif } -static void TestSKID_x509Extraction(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestSKID_x509Extraction) { using namespace TestCerts; - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; CHIP_ERROR err = CHIP_NO_ERROR; uint8_t skidBuf[kSubjectKeyIdentifierLength]; MutableByteSpan skidOut(skidBuf); @@ -2281,28 +2279,28 @@ static void TestSKID_x509Extraction(nlTestSuite * inSuite, void * inContext) TestCert certType = gTestCerts[i]; err = GetTestCert(certType, TestCertLoadFlags::kDERForm, cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = GetTestCertSKID(certType, skidSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = ExtractSKIDFromX509Cert(cert, skidOut); if (!skidSpan.empty()) { - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, skidSpan.data_equal(skidOut)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(skidSpan.data_equal(skidOut)); } else { - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(err, CHIP_ERROR_NOT_FOUND); } } } -static void TestAKID_x509Extraction(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestAKID_x509Extraction) { using namespace TestCerts; - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; CHIP_ERROR err = CHIP_NO_ERROR; uint8_t akidBuf[kAuthorityKeyIdentifierLength]; MutableByteSpan akidOut(akidBuf); @@ -2315,28 +2313,28 @@ static void TestAKID_x509Extraction(nlTestSuite * inSuite, void * inContext) TestCert certType = gTestCerts[i]; err = GetTestCert(certType, TestCertLoadFlags::kDERForm, cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = GetTestCertAKID(certType, akidSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = ExtractAKIDFromX509Cert(cert, akidOut); if (!akidSpan.empty()) { - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, akidSpan.data_equal(akidOut)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(akidSpan.data_equal(akidOut)); } else { - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(err, CHIP_ERROR_NOT_FOUND); } } } -static void TestCDPExtension_x509Extraction(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestCDPExtension_x509Extraction) { using namespace TestCerts; - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; CHIP_ERROR err = CHIP_NO_ERROR; struct CDPTestCase @@ -2382,20 +2380,20 @@ static void TestCDPExtension_x509Extraction(nlTestSuite * inSuite, void * inCont char cdpBuf[kMaxCRLDistributionPointURLLength] = { '\0' }; MutableCharSpan cdp(cdpBuf); err = ExtractCRLDistributionPointURIFromX509Cert(testCase.Cert, cdp); - NL_TEST_ASSERT(inSuite, err == testCase.mExpectedError); + EXPECT_EQ(err, testCase.mExpectedError); if (testCase.mExpectedError == CHIP_NO_ERROR) { - NL_TEST_ASSERT(inSuite, cdp.size() == testCase.mExpectedResult.size()); - NL_TEST_ASSERT(inSuite, cdp.data_equal(testCase.mExpectedResult)); + EXPECT_EQ(cdp.size(), testCase.mExpectedResult.size()); + EXPECT_TRUE(cdp.data_equal(testCase.mExpectedResult)); } } } -static void TestCDPCRLIssuerExtension_x509Extraction(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestCDPCRLIssuerExtension_x509Extraction) { using namespace TestCerts; - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; CHIP_ERROR err = CHIP_NO_ERROR; struct CDPTestCase @@ -2436,25 +2434,25 @@ static void TestCDPCRLIssuerExtension_x509Extraction(nlTestSuite * inSuite, void uint8_t crlIssuerBuf[kMaxCertificateDistinguishedNameLength] = { 0 }; MutableByteSpan crlIssuer(crlIssuerBuf); err = ExtractCDPExtensionCRLIssuerFromX509Cert(testCase.Cert, crlIssuer); - NL_TEST_ASSERT(inSuite, err == testCase.mExpectedError); + EXPECT_EQ(err, testCase.mExpectedError); if (testCase.mExpectedError == CHIP_NO_ERROR) { uint8_t crlIssuerSubjectBuf[kMaxCertificateDistinguishedNameLength] = { 0 }; MutableByteSpan crlIssuerSubject(crlIssuerSubjectBuf); err = ExtractSubjectFromX509Cert(testCase.mCRLIssuerCert, crlIssuerSubject); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, crlIssuer.data_equal(crlIssuerSubject)); + EXPECT_TRUE(crlIssuer.data_equal(crlIssuerSubject)); } } } -static void TestSerialNumber_x509Extraction(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestSerialNumber_x509Extraction) { using namespace TestCerts; - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; CHIP_ERROR err = CHIP_NO_ERROR; struct SerialNumberTestCase @@ -2481,21 +2479,21 @@ static void TestSerialNumber_x509Extraction(nlTestSuite * inSuite, void * inCont { ByteSpan cert; err = GetTestCert(testCase.Cert, TestCertLoadFlags::kDERForm, cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); uint8_t serialNumberBuf[kMaxCertificateSerialNumberLength] = { 0 }; MutableByteSpan serialNumber(serialNumberBuf); err = ExtractSerialNumberFromX509Cert(cert, serialNumber); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, serialNumber.data_equal(testCase.mExpectedResult)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(serialNumber.data_equal(testCase.mExpectedResult)); } } -static void TestSubject_x509Extraction(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestSubject_x509Extraction) { using namespace TestCerts; - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; CHIP_ERROR err = CHIP_NO_ERROR; struct TestCase @@ -2505,27 +2503,25 @@ static void TestSubject_x509Extraction(nlTestSuite * inSuite, void * inContext) }; ChipDN subjectDN_Root01; - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == subjectDN_Root01.AddAttribute_MatterRCACId(0xCACACACA00000001)); + EXPECT_EQ(subjectDN_Root01.AddAttribute_MatterRCACId(0xCACACACA00000001), CHIP_NO_ERROR); ChipDN subjectDN_ICA01; - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == subjectDN_ICA01.AddAttribute_MatterICACId(0xCACACACA00000003)); + EXPECT_EQ(subjectDN_ICA01.AddAttribute_MatterICACId(0xCACACACA00000003), CHIP_NO_ERROR); ChipDN subjectDN_Node02_02; - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == subjectDN_Node02_02.AddAttribute_MatterNodeId(0xDEDEDEDE00020002)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == subjectDN_Node02_02.AddAttribute_MatterFabricId(0xFAB000000000001D)); - NL_TEST_ASSERT(inSuite, - CHIP_NO_ERROR == - subjectDN_Node02_02.AddAttribute_CommonName("TEST CERT COMMON NAME Attr for Node02_02"_span, false)); + EXPECT_EQ(subjectDN_Node02_02.AddAttribute_MatterNodeId(0xDEDEDEDE00020002), CHIP_NO_ERROR); + EXPECT_EQ(subjectDN_Node02_02.AddAttribute_MatterFabricId(0xFAB000000000001D), CHIP_NO_ERROR); + EXPECT_EQ(subjectDN_Node02_02.AddAttribute_CommonName("TEST CERT COMMON NAME Attr for Node02_02"_span, false), CHIP_NO_ERROR); ChipDN subjectDN_Node02_04; - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == subjectDN_Node02_04.AddAttribute_MatterCASEAuthTag(0xABCE1002)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == subjectDN_Node02_04.AddAttribute_CommonName("TestCert02_04"_span, false)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == subjectDN_Node02_04.AddAttribute_MatterFabricId(0xFAB000000000001D)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == subjectDN_Node02_04.AddAttribute_MatterCASEAuthTag(0xABCD0003)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == subjectDN_Node02_04.AddAttribute_MatterNodeId(0xDEDEDEDE00020004)); + EXPECT_EQ(subjectDN_Node02_04.AddAttribute_MatterCASEAuthTag(0xABCE1002), CHIP_NO_ERROR); + EXPECT_EQ(subjectDN_Node02_04.AddAttribute_CommonName("TestCert02_04"_span, false), CHIP_NO_ERROR); + EXPECT_EQ(subjectDN_Node02_04.AddAttribute_MatterFabricId(0xFAB000000000001D), CHIP_NO_ERROR); + EXPECT_EQ(subjectDN_Node02_04.AddAttribute_MatterCASEAuthTag(0xABCD0003), CHIP_NO_ERROR); + EXPECT_EQ(subjectDN_Node02_04.AddAttribute_MatterNodeId(0xDEDEDEDE00020004), CHIP_NO_ERROR); ChipDN subjectDN_Node02_08; - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == subjectDN_Node02_08.AddAttribute_MatterCASEAuthTag(0xABCF00A0)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == subjectDN_Node02_08.AddAttribute_MatterNodeId(0xDEDEDEDE00020008)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == subjectDN_Node02_08.AddAttribute_MatterCASEAuthTag(0xABCD0020)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == subjectDN_Node02_08.AddAttribute_MatterFabricId(0xFAB000000000001D)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == subjectDN_Node02_08.AddAttribute_MatterCASEAuthTag(0xABCE0100)); + EXPECT_EQ(subjectDN_Node02_08.AddAttribute_MatterCASEAuthTag(0xABCF00A0), CHIP_NO_ERROR); + EXPECT_EQ(subjectDN_Node02_08.AddAttribute_MatterNodeId(0xDEDEDEDE00020008), CHIP_NO_ERROR); + EXPECT_EQ(subjectDN_Node02_08.AddAttribute_MatterCASEAuthTag(0xABCD0020), CHIP_NO_ERROR); + EXPECT_EQ(subjectDN_Node02_08.AddAttribute_MatterFabricId(0xFAB000000000001D), CHIP_NO_ERROR); + EXPECT_EQ(subjectDN_Node02_08.AddAttribute_MatterCASEAuthTag(0xABCE0100), CHIP_NO_ERROR); // clang-format off static TestCase sTestCases[] = { @@ -2543,30 +2539,30 @@ static void TestSubject_x509Extraction(nlTestSuite * inSuite, void * inContext) { ByteSpan cert; err = GetTestCert(testCase.Cert, TestCertLoadFlags::kDERForm, cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); uint8_t subjectBuf[kMaxCertificateDistinguishedNameLength] = { 0 }; MutableByteSpan subject(subjectBuf); err = ExtractSubjectFromX509Cert(cert, subject); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); static uint8_t expectedSubjectBuf[kMaxCertificateDistinguishedNameLength] = { 0 }; ASN1::ASN1Writer writer; writer.Init(expectedSubjectBuf); err = testCase.mExpectedDN.EncodeToASN1(writer); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); size_t expectedSubjectLen = writer.GetLengthWritten(); - NL_TEST_ASSERT(inSuite, expectedSubjectLen == subject.size()); - NL_TEST_ASSERT(inSuite, memcmp(subject.data(), expectedSubjectBuf, expectedSubjectLen) == 0); + EXPECT_EQ(expectedSubjectLen, subject.size()); + EXPECT_EQ(memcmp(subject.data(), expectedSubjectBuf, expectedSubjectLen), 0); } } -static void TestIssuer_x509Extraction(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestIssuer_x509Extraction) { using namespace TestCerts; - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; CHIP_ERROR err = CHIP_NO_ERROR; struct TestCase @@ -2576,13 +2572,13 @@ static void TestIssuer_x509Extraction(nlTestSuite * inSuite, void * inContext) }; ChipDN issuerDN_Root01; - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == issuerDN_Root01.AddAttribute_MatterRCACId(0xCACACACA00000001)); + EXPECT_EQ(CHIP_NO_ERROR, issuerDN_Root01.AddAttribute_MatterRCACId(0xCACACACA00000001)); ChipDN issuerDN_ICA02; - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == issuerDN_ICA02.AddAttribute_MatterRCACId(0xCACACACA00000002)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == issuerDN_ICA02.AddAttribute_MatterFabricId(0xFAB000000000001D)); + EXPECT_EQ(CHIP_NO_ERROR, issuerDN_ICA02.AddAttribute_MatterRCACId(0xCACACACA00000002)); + EXPECT_EQ(CHIP_NO_ERROR, issuerDN_ICA02.AddAttribute_MatterFabricId(0xFAB000000000001D)); ChipDN issuerDN_Node02_02; - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == issuerDN_Node02_02.AddAttribute_MatterICACId(0xCACACACA00000004)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == issuerDN_Node02_02.AddAttribute_MatterFabricId(0xFAB000000000001D)); + EXPECT_EQ(CHIP_NO_ERROR, issuerDN_Node02_02.AddAttribute_MatterICACId(0xCACACACA00000004)); + EXPECT_EQ(CHIP_NO_ERROR, issuerDN_Node02_02.AddAttribute_MatterFabricId(0xFAB000000000001D)); // clang-format off static TestCase sTestCases[] = { @@ -2598,28 +2594,28 @@ static void TestIssuer_x509Extraction(nlTestSuite * inSuite, void * inContext) { ByteSpan cert; err = GetTestCert(testCase.Cert, TestCertLoadFlags::kDERForm, cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); uint8_t issuerBuf[kMaxCertificateDistinguishedNameLength] = { 0 }; MutableByteSpan issuer(issuerBuf); err = ExtractIssuerFromX509Cert(cert, issuer); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); static uint8_t expectedIssuerBuf[kMaxCertificateDistinguishedNameLength] = { 0 }; ASN1::ASN1Writer writer; writer.Init(expectedIssuerBuf); err = testCase.mExpectedDN.EncodeToASN1(writer); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); size_t expectedIssuerLen = writer.GetLengthWritten(); - NL_TEST_ASSERT(inSuite, expectedIssuerLen == issuer.size()); - NL_TEST_ASSERT(inSuite, memcmp(issuer.data(), expectedIssuerBuf, expectedIssuerLen) == 0); + EXPECT_EQ(expectedIssuerLen, issuer.size()); + EXPECT_EQ(memcmp(issuer.data(), expectedIssuerBuf, expectedIssuerLen), 0); } } -static void TestVIDPID_StringExtraction(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestVIDPID_StringExtraction) { - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; // Matter VID/PID Attribute examples (from the spec): const char * sTestMatterAttribute01 = "FFF1"; @@ -2730,7 +2726,7 @@ static void TestVIDPID_StringExtraction(nlTestSuite * inSuite, void * inContext) { ChipLogError(Crypto, "Actual result: %" CHIP_ERROR_FORMAT, result.Format()); } - NL_TEST_ASSERT(inSuite, result == testCase.expectedResult); + EXPECT_EQ(result, testCase.expectedResult); // Only do assertions on output params in case of success since otherwise // many of the output params are intermediate outputs. @@ -2738,41 +2734,41 @@ static void TestVIDPID_StringExtraction(nlTestSuite * inSuite, void * inContext) { if (testCase.attrType == DNAttrType::kMatterVID || testCase.attrType == DNAttrType::kMatterPID) { - NL_TEST_ASSERT(inSuite, !vidpidFromCN.Initialized()); + EXPECT_FALSE(vidpidFromCN.Initialized()); vidpidToCheck = vidpid; } else if (testCase.attrType == DNAttrType::kCommonName) { - NL_TEST_ASSERT(inSuite, !vidpid.Initialized()); + EXPECT_FALSE(vidpid.Initialized()); vidpidToCheck = vidpidFromCN; } - NL_TEST_ASSERT(inSuite, vidpidToCheck.mVendorId.HasValue() == testCase.expectedVidPresent); - NL_TEST_ASSERT(inSuite, vidpidToCheck.mProductId.HasValue() == testCase.expectedPidPresent); + EXPECT_EQ(vidpidToCheck.mVendorId.HasValue(), testCase.expectedVidPresent); + EXPECT_EQ(vidpidToCheck.mProductId.HasValue(), testCase.expectedPidPresent); if (testCase.expectedVidPresent) { - NL_TEST_ASSERT(inSuite, vidpidToCheck.mVendorId.Value() == testCase.expectedVid); + EXPECT_EQ(vidpidToCheck.mVendorId.Value(), testCase.expectedVid); } if (testCase.expectedPidPresent) { - NL_TEST_ASSERT(inSuite, vidpidToCheck.mProductId.Value() == testCase.expectedPid); + EXPECT_EQ(vidpidToCheck.mProductId.Value(), testCase.expectedPid); } } ++caseIdx; } } -static void TestVIDPID_x509Extraction(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestVIDPID_x509Extraction) { using namespace TestCerts; - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; // Test scenario where Certificate does not contain a Vendor ID field ByteSpan kOpCertNoVID; - NL_TEST_ASSERT(inSuite, GetTestCert(TestCert::kNode01_01, TestCertLoadFlags::kDERForm, kOpCertNoVID) == CHIP_NO_ERROR); + EXPECT_EQ(GetTestCert(TestCert::kNode01_01, TestCertLoadFlags::kDERForm, kOpCertNoVID), CHIP_NO_ERROR); struct TestCase { @@ -2807,29 +2803,29 @@ static void TestVIDPID_x509Extraction(nlTestSuite * inSuite, void * inContext) { AttestationCertVidPid vidpid; CHIP_ERROR result = ExtractVIDPIDFromX509Cert(testCase.cert, vidpid); - NL_TEST_ASSERT(inSuite, result == testCase.expectedResult); - NL_TEST_ASSERT(inSuite, vidpid.mVendorId.HasValue() == testCase.expectedVidPresent); - NL_TEST_ASSERT(inSuite, vidpid.mProductId.HasValue() == testCase.expectedPidPresent); + EXPECT_EQ(result, testCase.expectedResult); + EXPECT_EQ(vidpid.mVendorId.HasValue(), testCase.expectedVidPresent); + EXPECT_EQ(vidpid.mProductId.HasValue(), testCase.expectedPidPresent); // If present, make sure the VID matches expectation. if (testCase.expectedVidPresent) { - NL_TEST_ASSERT(inSuite, vidpid.mVendorId.Value() == testCase.expectedVid); + EXPECT_EQ(vidpid.mVendorId.Value(), testCase.expectedVid); } // If present, make sure the VID matches expectation. if (testCase.expectedPidPresent) { - NL_TEST_ASSERT(inSuite, vidpid.mProductId.Value() == testCase.expectedPid); + EXPECT_EQ(vidpid.mProductId.Value(), testCase.expectedPid); } } } -static void TestX509_ReplaceCertIfResignedCertFound(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestX509_ReplaceCertIfResignedCertFound) { using namespace TestCerts; - HeapChecker heapChecker(inSuite); + HeapChecker heapChecker; struct TestCase { @@ -2885,8 +2881,8 @@ static void TestX509_ReplaceCertIfResignedCertFound(nlTestSuite * inSuite, void CHIP_ERROR result = ReplaceCertIfResignedCertFound(testCase.referenceCert, testCase.candidateCertsList, testCase.candidateCertsCount, outCert); - NL_TEST_ASSERT(inSuite, result == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, outCert.data_equal(testCase.expectedOutCert)); + EXPECT_EQ(result, CHIP_NO_ERROR); + EXPECT_TRUE(outCert.data_equal(testCase.expectedOutCert)); } // Error case: invalid input argument for referenceCertificate @@ -2894,7 +2890,7 @@ static void TestX509_ReplaceCertIfResignedCertFound(nlTestSuite * inSuite, void ByteSpan outCert; CHIP_ERROR result = ReplaceCertIfResignedCertFound(ByteSpan(), TestCandidateCertsList7, ArraySize(TestCandidateCertsList7), outCert); - NL_TEST_ASSERT(inSuite, result == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(result, CHIP_ERROR_INVALID_ARGUMENT); } // Error case: invalid input argument for one of the certificates in the candidateCertificates list @@ -2902,7 +2898,7 @@ static void TestX509_ReplaceCertIfResignedCertFound(nlTestSuite * inSuite, void ByteSpan outCert; CHIP_ERROR result = ReplaceCertIfResignedCertFound(ByteSpan(), TestCandidateCertsList8, ArraySize(TestCandidateCertsList8), outCert); - NL_TEST_ASSERT(inSuite, result == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(result, CHIP_ERROR_INVALID_ARGUMENT); } } @@ -2939,7 +2935,7 @@ static const uint8_t kGroupPrivacyKey3[Crypto::CHIP_CRYPTO_SYMMETRIC_KEY_LENGTH_ 0xf1, 0x94, 0x08, 0x25, 0x72, 0xd4, 0x9b, 0x1f, 0xdc, 0x73 }; -static void TestGroup_OperationalKeyDerivation(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestGroup_OperationalKeyDerivation) { uint8_t key_buffer[Crypto::CHIP_CRYPTO_SYMMETRIC_KEY_LENGTH_BYTES] = { 0 }; ByteSpan epoch_key(kEpochKeyBuffer1, sizeof(kEpochKeyBuffer1)); @@ -2947,181 +2943,63 @@ static void TestGroup_OperationalKeyDerivation(nlTestSuite * inSuite, void * inC ByteSpan compressed_fabric_id(kCompressedFabricId); // Invalid Epoch Key - NL_TEST_ASSERT(inSuite, - CHIP_ERROR_INVALID_ARGUMENT == DeriveGroupOperationalKey(ByteSpan(), compressed_fabric_id, operational_key)); + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, DeriveGroupOperationalKey(ByteSpan(), compressed_fabric_id, operational_key)); // Epoch Key 1 - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == DeriveGroupOperationalKey(epoch_key, compressed_fabric_id, operational_key)); - NL_TEST_ASSERT(inSuite, 0 == memcmp(operational_key.data(), kGroupOperationalKey1, sizeof(kGroupOperationalKey1))); + EXPECT_EQ(CHIP_NO_ERROR, DeriveGroupOperationalKey(epoch_key, compressed_fabric_id, operational_key)); + EXPECT_EQ(0, memcmp(operational_key.data(), kGroupOperationalKey1, sizeof(kGroupOperationalKey1))); // Epoch Key 2 epoch_key = ByteSpan(kEpochKeyBuffer2, sizeof(kEpochKeyBuffer2)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == DeriveGroupOperationalKey(epoch_key, compressed_fabric_id, operational_key)); - NL_TEST_ASSERT(inSuite, 0 == memcmp(operational_key.data(), kGroupOperationalKey2, sizeof(kGroupOperationalKey2))); + EXPECT_EQ(CHIP_NO_ERROR, DeriveGroupOperationalKey(epoch_key, compressed_fabric_id, operational_key)); + EXPECT_EQ(0, memcmp(operational_key.data(), kGroupOperationalKey2, sizeof(kGroupOperationalKey2))); // Epoch Key 3 (example from spec) epoch_key = ByteSpan(kEpochKeyBuffer3, sizeof(kEpochKeyBuffer3)); compressed_fabric_id = ByteSpan(kCompressedFabricId2); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == DeriveGroupOperationalKey(epoch_key, compressed_fabric_id, operational_key)); - NL_TEST_ASSERT(inSuite, 0 == memcmp(operational_key.data(), kGroupOperationalKey3, sizeof(kGroupOperationalKey3))); + EXPECT_EQ(CHIP_NO_ERROR, DeriveGroupOperationalKey(epoch_key, compressed_fabric_id, operational_key)); + EXPECT_EQ(0, memcmp(operational_key.data(), kGroupOperationalKey3, sizeof(kGroupOperationalKey3))); } -static void TestGroup_SessionIdDerivation(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestGroup_SessionIdDerivation) { ByteSpan operational_key1(kGroupOperationalKey1, sizeof(kGroupOperationalKey1)); ByteSpan operational_key2(kGroupOperationalKey2, sizeof(kGroupOperationalKey2)); uint16_t session_id = 0; // Bad Key - NL_TEST_ASSERT(inSuite, CHIP_ERROR_INVALID_ARGUMENT == DeriveGroupSessionId(ByteSpan(), session_id)); + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, DeriveGroupSessionId(ByteSpan(), session_id)); // Session ID 1 - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == DeriveGroupSessionId(operational_key1, session_id)); - NL_TEST_ASSERT(inSuite, kGroupSessionId1 == session_id); + EXPECT_EQ(CHIP_NO_ERROR, DeriveGroupSessionId(operational_key1, session_id)); + EXPECT_EQ(kGroupSessionId1, session_id); // Session ID 2 - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == DeriveGroupSessionId(operational_key2, session_id)); - NL_TEST_ASSERT(inSuite, kGroupSessionId2 == session_id); + EXPECT_EQ(CHIP_NO_ERROR, DeriveGroupSessionId(operational_key2, session_id)); + EXPECT_EQ(kGroupSessionId2, session_id); } -static void TestGroup_PrivacyKeyDerivation(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCryptoPAL, TestGroup_PrivacyKeyDerivation) { uint8_t key_buffer[Crypto::CHIP_CRYPTO_SYMMETRIC_KEY_LENGTH_BYTES] = { 0 }; ByteSpan encryption_key; MutableByteSpan privacy_key(key_buffer, sizeof(key_buffer)); // Invalid Epoch Key - NL_TEST_ASSERT(inSuite, CHIP_ERROR_INVALID_ARGUMENT == DeriveGroupPrivacyKey(ByteSpan(), privacy_key)); + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, DeriveGroupPrivacyKey(ByteSpan(), privacy_key)); // Epoch Key 1 encryption_key = ByteSpan(kGroupOperationalKey1, sizeof(kGroupOperationalKey1)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == DeriveGroupPrivacyKey(encryption_key, privacy_key)); - NL_TEST_ASSERT(inSuite, 0 == memcmp(privacy_key.data(), kGroupPrivacyKey1, sizeof(kGroupPrivacyKey1))); + EXPECT_EQ(CHIP_NO_ERROR, DeriveGroupPrivacyKey(encryption_key, privacy_key)); + EXPECT_EQ(0, memcmp(privacy_key.data(), kGroupPrivacyKey1, sizeof(kGroupPrivacyKey1))); // Epoch Key 2 encryption_key = ByteSpan(kGroupOperationalKey2, sizeof(kGroupOperationalKey2)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == DeriveGroupPrivacyKey(encryption_key, privacy_key)); - NL_TEST_ASSERT(inSuite, 0 == memcmp(privacy_key.data(), kGroupPrivacyKey2, sizeof(kGroupPrivacyKey2))); + EXPECT_EQ(CHIP_NO_ERROR, DeriveGroupPrivacyKey(encryption_key, privacy_key)); + EXPECT_EQ(0, memcmp(privacy_key.data(), kGroupPrivacyKey2, sizeof(kGroupPrivacyKey2))); // Epoch Key 3 (example from spec) encryption_key = ByteSpan(kGroupOperationalKey3, sizeof(kGroupOperationalKey3)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == DeriveGroupPrivacyKey(encryption_key, privacy_key)); - NL_TEST_ASSERT(inSuite, 0 == memcmp(privacy_key.data(), kGroupPrivacyKey3, sizeof(kGroupPrivacyKey3))); + EXPECT_EQ(CHIP_NO_ERROR, DeriveGroupPrivacyKey(encryption_key, privacy_key)); + EXPECT_EQ(0, memcmp(privacy_key.data(), kGroupPrivacyKey3, sizeof(kGroupPrivacyKey3))); } - -/** - * Test Suite. It lists all the test functions. - */ - -static const nlTest sTests[] = { - - NL_TEST_DEF("Test encrypting AES-CCM-128 test vectors", TestAES_CCM_128EncryptTestVectors), - NL_TEST_DEF("Test decrypting AES-CCM-128 test vectors", TestAES_CCM_128DecryptTestVectors), - NL_TEST_DEF("Test encrypting AES-CCM-128 using invalid nonce", TestAES_CCM_128EncryptInvalidNonceLen), - NL_TEST_DEF("Test encrypting AES-CCM-128 using invalid tag", TestAES_CCM_128EncryptInvalidTagLen), - NL_TEST_DEF("Test decrypting AES-CCM-128 invalid nonce", TestAES_CCM_128DecryptInvalidNonceLen), - NL_TEST_DEF("Test encrypt/decrypt AES-CTR-128 test vectors", TestAES_CTR_128CryptTestVectors), - NL_TEST_DEF("Test ASN.1 signature conversion routines", TestAsn1Conversions), - NL_TEST_DEF("Test reading a length from ASN.1 DER stream success cases", TestReadDerLengthValidCases), - NL_TEST_DEF("Test reading a length from ASN.1 DER stream error cases", TestReadDerLengthInvalidCases), - NL_TEST_DEF("Test Integer to ASN.1 DER conversion", TestRawIntegerToDerValidCases), - NL_TEST_DEF("Test Integer to ASN.1 DER conversion error cases", TestRawIntegerToDerInvalidCases), - NL_TEST_DEF("Test ECDSA signing and validation message using SHA256", TestECDSA_Signing_SHA256_Msg), - NL_TEST_DEF("Test ECDSA signing and validation SHA256 Hash", TestECDSA_Signing_SHA256_Hash), - NL_TEST_DEF("Test ECDSA signature validation fail - Different msg", TestECDSA_ValidationFailsDifferentMessage), - NL_TEST_DEF("Test ECDSA signature validation fail - Different msg signature", TestECDSA_ValidationFailIncorrectMsgSignature), - NL_TEST_DEF("Test ECDSA signature validation fail - Different hash signature", TestECDSA_ValidationFailIncorrectHashSignature), - NL_TEST_DEF("Test ECDSA sign msg invalid parameters", TestECDSA_SigningMsgInvalidParams), - NL_TEST_DEF("Test ECDSA msg signature validation invalid parameters", TestECDSA_ValidationMsgInvalidParam), - NL_TEST_DEF("Test ECDSA hash signature validation invalid parameters", TestECDSA_ValidationHashInvalidParam), - NL_TEST_DEF("Test Hash SHA 256", TestHash_SHA256), - NL_TEST_DEF("Test Hash SHA 256 Stream", TestHash_SHA256_Stream), - NL_TEST_DEF("Test HKDF SHA 256", TestHKDF_SHA256), - NL_TEST_DEF("Test HMAC SHA 256 - Raw Key", TestHMAC_SHA256_RawKey), - NL_TEST_DEF("Test HMAC SHA 256 - Key Handle", TestHMAC_SHA256_KeyHandle), - NL_TEST_DEF("Test DRBG invalid inputs", TestDRBG_InvalidInputs), - NL_TEST_DEF("Test DRBG output", TestDRBG_Output), - NL_TEST_DEF("Test ECDH derive shared secret", TestECDH_EstablishSecret), - NL_TEST_DEF("Test adding entropy sources", TestAddEntropySources), - NL_TEST_DEF("Test PBKDF2 SHA256", TestPBKDF2_SHA256_TestVectors), - NL_TEST_DEF("Test P256 Keygen", TestP256_Keygen), - NL_TEST_DEF("Test CSR Verification + PK extraction", TestCSR_Verify), - NL_TEST_DEF("Test CSR Generation via P256Keypair method", TestCSR_GenByKeypair), - NL_TEST_DEF("Test Direct CSR Generation", TestCSR_GenDirect), - NL_TEST_DEF("Test Keypair Serialize", TestKeypair_Serialize), - NL_TEST_DEF("Test Spake2p_spake2p FEMul", TestSPAKE2P_spake2p_FEMul), - NL_TEST_DEF("Test Spake2p_spake2p FELoad/FEWrite", TestSPAKE2P_spake2p_FELoadWrite), - NL_TEST_DEF("Test Spake2p_spake2p Mac", TestSPAKE2P_spake2p_Mac), - NL_TEST_DEF("Test Spake2p_spake2p PointMul", TestSPAKE2P_spake2p_PointMul), - NL_TEST_DEF("Test Spake2p_spake2p PointMulAdd", TestSPAKE2P_spake2p_PointMulAdd), - NL_TEST_DEF("Test Spake2p_spake2p PointLoad/PointWrite", TestSPAKE2P_spake2p_PointLoadWrite), - NL_TEST_DEF("Test Spake2p_spake2p PointIsValid", TestSPAKE2P_spake2p_PointIsValid), - NL_TEST_DEF("Test Spake2+ against RFC test vectors", TestSPAKE2P_RFC), - NL_TEST_DEF("Test Spake2+ object reuse", TestSPAKE2P_Reuse), - NL_TEST_DEF("Test compressed fabric identifier", TestCompressedFabricIdentifier), - NL_TEST_DEF("Test Pubkey Extraction from x509 Certificate", TestPubkey_x509Extraction), - NL_TEST_DEF("Test x509 Attestation Certificate Format Validation", TestX509_VerifyAttestationCertificateFormat), - NL_TEST_DEF("Test x509 Certificate Chain Validation", TestX509_CertChainValidation), - NL_TEST_DEF("Test x509 Certificate Timestamp Validation", TestX509_IssuingTimestampValidation), - NL_TEST_DEF("Test Subject Key Id Extraction from x509 Certificate", TestSKID_x509Extraction), - NL_TEST_DEF("Test Authority Key Id Extraction from x509 Certificate", TestAKID_x509Extraction), - NL_TEST_DEF("Test CRL Distribution Point Extension Extraction from x509 Certificate", TestCDPExtension_x509Extraction), - NL_TEST_DEF("Test CDP Extension CRL Issuer Extraction from x509 Certificate", TestCDPCRLIssuerExtension_x509Extraction), - NL_TEST_DEF("Test Serial Number Extraction from x509 Certificate", TestSerialNumber_x509Extraction), - NL_TEST_DEF("Test Subject Extraction from x509 Certificate", TestSubject_x509Extraction), - NL_TEST_DEF("Test Issuer Extraction from x509 Certificate", TestIssuer_x509Extraction), - NL_TEST_DEF("Test Vendor ID and Product ID Extraction from Attribute String", TestVIDPID_StringExtraction), - NL_TEST_DEF("Test Vendor ID and Product ID Extraction from x509 Attestation Certificate", TestVIDPID_x509Extraction), - NL_TEST_DEF("Test Replace Resigned Certificate Version if Found", TestX509_ReplaceCertIfResignedCertFound), - NL_TEST_DEF("Test Group Operation Key Derivation", TestGroup_OperationalKeyDerivation), - NL_TEST_DEF("Test Group Session ID Derivation", TestGroup_SessionIdDerivation), - NL_TEST_DEF("Test Group Privacy Key Derivation", TestGroup_PrivacyKeyDerivation), - NL_TEST_DEF("Test sensitive data buffer", TestSensitiveDataBuffer), - NL_TEST_DEF("Test sensitive data fixed buffer", TestSensitiveDataFixedBuffer), - NL_TEST_SENTINEL() -}; - -/** - * Set up the test suite. - */ -int TestCHIPCryptoPAL_Setup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - if (error != CHIP_NO_ERROR) - return FAILURE; - -#if CHIP_CRYPTO_PSA - psa_crypto_init(); -#endif - - return SUCCESS; -} - -/** - * Tear down the test suite. - */ -int TestCHIPCryptoPAL_Teardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - -int TestChipCryptoPal() -{ - // clang-format off - nlTestSuite theSuite = - { - "CHIP Crypto PAL tests", - &sTests[0], - TestCHIPCryptoPAL_Setup, - TestCHIPCryptoPAL_Teardown - }; - // clang-format on - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - - add_entropy_source(test_entropy_source, nullptr, 16); - return (nlTestRunnerStats(&theSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestChipCryptoPal) diff --git a/src/crypto/tests/TestGroupOperationalCredentials.cpp b/src/crypto/tests/TestGroupOperationalCredentials.cpp index 1f0eeb5f17e503..941423e327f873 100644 --- a/src/crypto/tests/TestGroupOperationalCredentials.cpp +++ b/src/crypto/tests/TestGroupOperationalCredentials.cpp @@ -21,9 +21,8 @@ #include <crypto/CHIPCryptoPAL.h> #include <lib/core/CHIPCore.h> #include <lib/support/CHIPMem.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> using namespace chip; using namespace chip::Crypto; @@ -80,59 +79,25 @@ struct GroupKeySetTestEntry theGroupKeySetTestVector[] = { }, }; -void TestDeriveGroupOperationalCredentials(nlTestSuite * apSuite, void * apContext) +struct TestGroupOperationalCredentials : public ::testing::Test +{ + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestGroupOperationalCredentials, TestDeriveGroupOperationalCredentials) { GroupOperationalCredentials opCreds; for (const auto & testVector : theGroupKeySetTestVector) { const ByteSpan epochKey(testVector.epochKey, KEY_LENGTH); - NL_TEST_ASSERT(apSuite, - CHIP_NO_ERROR == Crypto::DeriveGroupOperationalCredentials(epochKey, kCompressedFabricId1, opCreds)); + EXPECT_EQ(CHIP_NO_ERROR, Crypto::DeriveGroupOperationalCredentials(epochKey, kCompressedFabricId1, opCreds)); - NL_TEST_ASSERT(apSuite, opCreds.hash == testVector.groupKeys->hash); - NL_TEST_ASSERT(apSuite, 0 == memcmp(opCreds.encryption_key, testVector.groupKeys->encryption_key, KEY_LENGTH)); - NL_TEST_ASSERT(apSuite, 0 == memcmp(opCreds.privacy_key, testVector.groupKeys->privacy_key, KEY_LENGTH)); + EXPECT_EQ(opCreds.hash, testVector.groupKeys->hash); + EXPECT_EQ(0, memcmp(opCreds.encryption_key, testVector.groupKeys->encryption_key, KEY_LENGTH)); + EXPECT_EQ(0, memcmp(opCreds.privacy_key, testVector.groupKeys->privacy_key, KEY_LENGTH)); } } -/** - * Test Suite. It lists all the test functions. - */ -const nlTest sTests[] = { NL_TEST_DEF("TestDeriveGroupOperationalCredentials", TestDeriveGroupOperationalCredentials), - NL_TEST_SENTINEL() }; - -/** - * Set up the test suite. - */ -int Test_Setup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - VerifyOrReturnError(error == CHIP_NO_ERROR, FAILURE); - return SUCCESS; -} - -/** - * Tear down the test suite. - */ -int Test_Teardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - } // namespace - -/** - * Main - */ -int TestGroupOperationalCredentials() -{ - nlTestSuite theSuite = { "TestGroupOperationalCredentials", &sTests[0], Test_Setup, Test_Teardown }; - - // Run test suite againt one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestGroupOperationalCredentials) diff --git a/src/crypto/tests/TestPSAOpKeyStore.cpp b/src/crypto/tests/TestPSAOpKeyStore.cpp index 9ed39c5c3831de..4a16a19e254b60 100644 --- a/src/crypto/tests/TestPSAOpKeyStore.cpp +++ b/src/crypto/tests/TestPSAOpKeyStore.cpp @@ -25,16 +25,28 @@ #include <lib/support/DefaultStorageKeyAllocator.h> #include <lib/support/Span.h> #include <lib/support/TestPersistentStorageDelegate.h> -#include <lib/support/UnitTestExtendedAssertions.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> + +#include <gtest/gtest.h> using namespace chip; using namespace chip::Crypto; namespace { -void TestBasicLifeCycle(nlTestSuite * inSuite, void * inContext) +struct TestPSAOpKeyStore : public ::testing::Test +{ + static void SetUpTestSuite() + { + ASSERT_EQ(CHIP_NO_ERROR, chip::Platform::MemoryInit()); + +#if CHIP_CRYPTO_PSA + psa_crypto_init(); +#endif + } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestPSAOpKeyStore, TestBasicLifeCycle) { PSAOperationalKeystore opKeystore; @@ -45,125 +57,124 @@ void TestBasicLifeCycle(nlTestSuite * inSuite, void * inContext) uint8_t csrBuf[kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; CHIP_ERROR err = opKeystore.NewOpKeypairForFabric(kFabricIndex, csrSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kFabricIndex) == false); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); + EXPECT_FALSE(opKeystore.HasOpKeypairForFabric(kFabricIndex)); P256PublicKey csrPublicKey1; err = VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), csrPublicKey1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Can regenerate a second CSR and it has different PK csrSpan = MutableByteSpan{ csrBuf }; err = opKeystore.NewOpKeypairForFabric(kFabricIndex, csrSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); P256PublicKey csrPublicKey2; err = VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), csrPublicKey2); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !csrPublicKey1.Matches(csrPublicKey2)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(csrPublicKey1.Matches(csrPublicKey2)); // Cannot NewOpKeypair for a different fabric if one already pending uint8_t badCsrBuf[kMIN_CSR_Buffer_Size]; MutableByteSpan badCsrSpan{ badCsrBuf }; err = opKeystore.NewOpKeypairForFabric(kBadFabricIndex, badCsrSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); // Fail to generate CSR for invalid fabrics csrSpan = MutableByteSpan{ csrBuf }; err = opKeystore.NewOpKeypairForFabric(kUndefinedFabricIndex, csrSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); csrSpan = MutableByteSpan{ csrBuf }; err = opKeystore.NewOpKeypairForFabric(kMaxValidFabricIndex + 1, csrSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); // No storage done by NewOpKeypairForFabric - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kFabricIndex) == false); + EXPECT_FALSE(opKeystore.HasOpKeypairForFabric(kFabricIndex)); // Even after error, the previous valid pending keypair stays valid. - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); // Activating with mismatching fabricIndex and matching public key fails err = opKeystore.ActivateOpKeypairForFabric(kBadFabricIndex, csrPublicKey2); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kFabricIndex) == false); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); + EXPECT_FALSE(opKeystore.HasOpKeypairForFabric(kFabricIndex)); // Activating with matching fabricIndex and mismatching public key fails err = opKeystore.ActivateOpKeypairForFabric(kFabricIndex, csrPublicKey1); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_PUBLIC_KEY); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kFabricIndex) == false); + EXPECT_EQ(err, CHIP_ERROR_INVALID_PUBLIC_KEY); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); + EXPECT_FALSE(opKeystore.HasOpKeypairForFabric(kFabricIndex)); // Before successful activation, cannot sign uint8_t message[] = { 1, 2, 3, 4 }; P256ECDSASignature sig1; err = opKeystore.SignWithOpKeypair(kFabricIndex, ByteSpan{ message }, sig1); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); // Activating with matching fabricIndex and matching public key succeeds err = opKeystore.ActivateOpKeypairForFabric(kFabricIndex, csrPublicKey2); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Activating does not store, and keeps pending - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kFabricIndex) == true); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kBadFabricIndex) == false); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); + EXPECT_TRUE(opKeystore.HasOpKeypairForFabric(kFabricIndex)); + EXPECT_FALSE(opKeystore.HasOpKeypairForFabric(kBadFabricIndex)); // Can't sign for wrong fabric after activation P256ECDSASignature sig2; err = opKeystore.SignWithOpKeypair(kBadFabricIndex, ByteSpan{ message }, sig2); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); // Can sign after activation err = opKeystore.SignWithOpKeypair(kFabricIndex, ByteSpan{ message }, sig2); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Signature matches pending key err = csrPublicKey2.ECDSA_validate_msg_signature(message, sizeof(message), sig2); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Signature does not match a previous pending key err = csrPublicKey1.ECDSA_validate_msg_signature(message, sizeof(message), sig2); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_SIGNATURE); + EXPECT_EQ(err, CHIP_ERROR_INVALID_SIGNATURE); // Committing with mismatching fabric fails, leaves pending err = opKeystore.CommitOpKeypairForFabric(kBadFabricIndex); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kFabricIndex) == true); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); + EXPECT_TRUE(opKeystore.HasOpKeypairForFabric(kFabricIndex)); // Committing key resets pending state err = opKeystore.CommitOpKeypairForFabric(kFabricIndex); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == false); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kFabricIndex) == true); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(opKeystore.HasPendingOpKeypair()); + EXPECT_TRUE(opKeystore.HasOpKeypairForFabric(kFabricIndex)); // Verify if the key is not exportable - the PSA_KEY_USAGE_EXPORT psa flag should not be set P256SerializedKeypair serializedKeypair; - NL_TEST_ASSERT(inSuite, - opKeystore.ExportOpKeypairForFabric(kFabricIndex, serializedKeypair) == CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE); + EXPECT_EQ(opKeystore.ExportOpKeypairForFabric(kFabricIndex, serializedKeypair), CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE); // After committing, signing works with the key that was pending P256ECDSASignature sig3; uint8_t message2[] = { 10, 11, 12, 13 }; err = opKeystore.SignWithOpKeypair(kFabricIndex, ByteSpan{ message2 }, sig3); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = csrPublicKey2.ECDSA_validate_msg_signature(message2, sizeof(message2), sig3); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Let's remove the opkey for a fabric, it disappears err = opKeystore.RemoveOpKeypairForFabric(kFabricIndex); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == false); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kFabricIndex) == false); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(opKeystore.HasPendingOpKeypair()); + EXPECT_FALSE(opKeystore.HasOpKeypairForFabric(kFabricIndex)); } -void TestEphemeralKeys(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPSAOpKeyStore, TestEphemeralKeys) { PSAOperationalKeystore opKeyStore; @@ -171,16 +182,16 @@ void TestEphemeralKeys(nlTestSuite * inSuite, void * inContext) uint8_t message[] = { 'm', 's', 'g' }; Crypto::P256Keypair * ephemeralKeypair = opKeyStore.AllocateEphemeralKeypairForCASE(); - NL_TEST_ASSERT(inSuite, ephemeralKeypair != nullptr); - NL_TEST_ASSERT_SUCCESS(inSuite, ephemeralKeypair->Initialize(Crypto::ECPKeyTarget::ECDSA)); + EXPECT_NE(nullptr, ephemeralKeypair); + EXPECT_EQ(ephemeralKeypair->Initialize(Crypto::ECPKeyTarget::ECDSA), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, ephemeralKeypair->ECDSA_sign_msg(message, sizeof(message), sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, ephemeralKeypair->Pubkey().ECDSA_validate_msg_signature(message, sizeof(message), sig)); + EXPECT_EQ(ephemeralKeypair->ECDSA_sign_msg(message, sizeof(message), sig), CHIP_NO_ERROR); + EXPECT_EQ(ephemeralKeypair->Pubkey().ECDSA_validate_msg_signature(message, sizeof(message), sig), CHIP_NO_ERROR); opKeyStore.ReleaseEphemeralKeypair(ephemeralKeypair); } -void TestMigrationKeys(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPSAOpKeyStore, TestMigrationKeys) { chip::TestPersistentStorageDelegate storage; PSAOperationalKeystore psaOpKeyStore; @@ -188,39 +199,35 @@ void TestMigrationKeys(nlTestSuite * inSuite, void * inContext) constexpr FabricIndex kFabricIndex = 111; // Failure before Init of MoveOpKeysFromPersistentStorageToITS - NL_TEST_ASSERT(inSuite, - psaOpKeyStore.MigrateOpKeypairForFabric(kFabricIndex, persistentOpKeyStore) == CHIP_ERROR_INCORRECT_STATE); + EXPECT_EQ(psaOpKeyStore.MigrateOpKeypairForFabric(kFabricIndex, persistentOpKeyStore), CHIP_ERROR_INCORRECT_STATE); // Initialize both operational key stores - NL_TEST_ASSERT(inSuite, persistentOpKeyStore.Init(&storage) == CHIP_NO_ERROR); + EXPECT_EQ(persistentOpKeyStore.Init(&storage), CHIP_NO_ERROR); // Failure on invalid Fabric indexes - NL_TEST_ASSERT(inSuite, - psaOpKeyStore.MigrateOpKeypairForFabric(kUndefinedFabricIndex, persistentOpKeyStore) == - CHIP_ERROR_INVALID_FABRIC_INDEX); - NL_TEST_ASSERT(inSuite, - psaOpKeyStore.MigrateOpKeypairForFabric(kMaxValidFabricIndex + 1, persistentOpKeyStore) == - CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(psaOpKeyStore.MigrateOpKeypairForFabric(kUndefinedFabricIndex, persistentOpKeyStore), + CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(psaOpKeyStore.MigrateOpKeypairForFabric(kMaxValidFabricIndex + 1, persistentOpKeyStore), + CHIP_ERROR_INVALID_FABRIC_INDEX); // Failure on the key migration, while the key does not exist in the any keystore. - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == 0); - NL_TEST_ASSERT(inSuite, storage.HasKey(DefaultStorageKeyAllocator::FabricOpKey(kFabricIndex).KeyName()) == false); - NL_TEST_ASSERT(inSuite, psaOpKeyStore.HasOpKeypairForFabric(kFabricIndex) == false); - NL_TEST_ASSERT(inSuite, - psaOpKeyStore.MigrateOpKeypairForFabric(kFabricIndex, persistentOpKeyStore) == - CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); + EXPECT_EQ(storage.GetNumKeys(), 0u); + EXPECT_FALSE(storage.HasKey(DefaultStorageKeyAllocator::FabricOpKey(kFabricIndex).KeyName())); + EXPECT_FALSE(psaOpKeyStore.HasOpKeypairForFabric(kFabricIndex)); + EXPECT_EQ(psaOpKeyStore.MigrateOpKeypairForFabric(kFabricIndex, persistentOpKeyStore), + CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); auto generateAndStore = [&](FabricIndex index, MutableByteSpan & buf, P256PublicKey & pubKey) { - NL_TEST_ASSERT(inSuite, persistentOpKeyStore.HasPendingOpKeypair() == false); - NL_TEST_ASSERT(inSuite, persistentOpKeyStore.NewOpKeypairForFabric(kFabricIndex, buf) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, VerifyCertificateSigningRequest(buf.data(), buf.size(), pubKey) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, persistentOpKeyStore.HasPendingOpKeypair() == true); - NL_TEST_ASSERT(inSuite, persistentOpKeyStore.ActivateOpKeypairForFabric(kFabricIndex, pubKey) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == 0); - NL_TEST_ASSERT(inSuite, persistentOpKeyStore.CommitOpKeypairForFabric(kFabricIndex) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, persistentOpKeyStore.HasPendingOpKeypair() == false); - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == 1); - NL_TEST_ASSERT(inSuite, storage.HasKey(DefaultStorageKeyAllocator::FabricOpKey(kFabricIndex).KeyName()) == true); + EXPECT_FALSE(persistentOpKeyStore.HasPendingOpKeypair()); + EXPECT_EQ(persistentOpKeyStore.NewOpKeypairForFabric(kFabricIndex, buf), CHIP_NO_ERROR); + EXPECT_EQ(VerifyCertificateSigningRequest(buf.data(), buf.size(), pubKey), CHIP_NO_ERROR); + EXPECT_TRUE(persistentOpKeyStore.HasPendingOpKeypair()); + EXPECT_EQ(persistentOpKeyStore.ActivateOpKeypairForFabric(kFabricIndex, pubKey), CHIP_NO_ERROR); + EXPECT_EQ(storage.GetNumKeys(), 0u); + EXPECT_EQ(persistentOpKeyStore.CommitOpKeypairForFabric(kFabricIndex), CHIP_NO_ERROR); + EXPECT_FALSE(persistentOpKeyStore.HasPendingOpKeypair()); + EXPECT_EQ(storage.GetNumKeys(), 1u); + EXPECT_TRUE(storage.HasKey(DefaultStorageKeyAllocator::FabricOpKey(kFabricIndex).KeyName())); }; // Save a key to the old persistent storage @@ -230,83 +237,35 @@ void TestMigrationKeys(nlTestSuite * inSuite, void * inContext) generateAndStore(kFabricIndex, csrSpan, csrPublicKey1); // Migrate key to PSA ITS - NL_TEST_ASSERT(inSuite, psaOpKeyStore.MigrateOpKeypairForFabric(kFabricIndex, persistentOpKeyStore) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, psaOpKeyStore.HasOpKeypairForFabric(kFabricIndex) == true); + EXPECT_EQ(psaOpKeyStore.MigrateOpKeypairForFabric(kFabricIndex, persistentOpKeyStore), CHIP_NO_ERROR); + EXPECT_TRUE(psaOpKeyStore.HasOpKeypairForFabric(kFabricIndex)); // Verify the migrated keys P256ECDSASignature sig1; uint8_t message1[] = { 10, 11, 12, 13 }; - NL_TEST_ASSERT(inSuite, psaOpKeyStore.SignWithOpKeypair(kFabricIndex, ByteSpan{ message1 }, sig1) == CHIP_NO_ERROR); + EXPECT_EQ(psaOpKeyStore.SignWithOpKeypair(kFabricIndex, ByteSpan{ message1 }, sig1), CHIP_NO_ERROR); // To verify use the public key generated by the old persistent storage - NL_TEST_ASSERT(inSuite, csrPublicKey1.ECDSA_validate_msg_signature(message1, sizeof(message1), sig1) == CHIP_NO_ERROR); + EXPECT_EQ(csrPublicKey1.ECDSA_validate_msg_signature(message1, sizeof(message1), sig1), CHIP_NO_ERROR); // After migration there should be no old keys anymore - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == 0); - NL_TEST_ASSERT(inSuite, storage.HasKey(DefaultStorageKeyAllocator::FabricOpKey(kFabricIndex).KeyName()) == false); + EXPECT_EQ(storage.GetNumKeys(), 0u); + EXPECT_FALSE(storage.HasKey(DefaultStorageKeyAllocator::FabricOpKey(kFabricIndex).KeyName())); // Verify that migration method returns success when there is no OpKey stored in the old keystore, but already exists in PSA // ITS. - NL_TEST_ASSERT(inSuite, psaOpKeyStore.MigrateOpKeypairForFabric(kFabricIndex, persistentOpKeyStore) == CHIP_NO_ERROR); + EXPECT_EQ(psaOpKeyStore.MigrateOpKeypairForFabric(kFabricIndex, persistentOpKeyStore), CHIP_NO_ERROR); // The key already exists in ITS, but there is an another attempt to migrate the new key. // The key should not be overwritten, but the key from the previous persistent keystore should be removed. MutableByteSpan csrSpan2{ csrBuf }; generateAndStore(kFabricIndex, csrSpan2, csrPublicKey1); - NL_TEST_ASSERT(inSuite, psaOpKeyStore.MigrateOpKeypairForFabric(kFabricIndex, persistentOpKeyStore) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == 0); - NL_TEST_ASSERT(inSuite, storage.HasKey(DefaultStorageKeyAllocator::FabricOpKey(kFabricIndex).KeyName()) == false); + EXPECT_EQ(psaOpKeyStore.MigrateOpKeypairForFabric(kFabricIndex, persistentOpKeyStore), CHIP_NO_ERROR); + EXPECT_EQ(storage.GetNumKeys(), 0u); + EXPECT_FALSE(storage.HasKey(DefaultStorageKeyAllocator::FabricOpKey(kFabricIndex).KeyName())); // Finalize persistentOpKeyStore.Finish(); } -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { - NL_TEST_DEF("Test Basic Lifecycle of PersistentStorageOperationalKeystore", TestBasicLifeCycle), - NL_TEST_DEF("Test ephemeral key management", TestEphemeralKeys), - NL_TEST_DEF("Test keys migration to ITS", TestMigrationKeys), - NL_TEST_SENTINEL(), -}; - -/** - * Set up the test suite. - */ -int Test_Setup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - VerifyOrReturnError(error == CHIP_NO_ERROR, FAILURE); - -#if CHIP_CRYPTO_PSA - psa_crypto_init(); -#endif - - return SUCCESS; -} - -/** - * Tear down the test suite. - */ -int Test_Teardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - } // namespace - -/** - * Main - */ -int TestPSAOperationalKeystore() -{ - nlTestSuite theSuite = { "PSAOperationalKeystore tests", &sTests[0], Test_Setup, Test_Teardown }; - - // Run test suite againt one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestPSAOperationalKeystore) diff --git a/src/crypto/tests/TestPersistentStorageOpKeyStore.cpp b/src/crypto/tests/TestPersistentStorageOpKeyStore.cpp index c3dd0fcdec0447..4448004ff2d3a3 100644 --- a/src/crypto/tests/TestPersistentStorageOpKeyStore.cpp +++ b/src/crypto/tests/TestPersistentStorageOpKeyStore.cpp @@ -24,9 +24,8 @@ #include <lib/support/DefaultStorageKeyAllocator.h> #include <lib/support/Span.h> #include <lib/support/TestPersistentStorageDelegate.h> -#include <lib/support/UnitTestExtendedAssertions.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> + +#include <gtest/gtest.h> #include <string> @@ -130,7 +129,13 @@ class TestOperationalKeystore final : public Crypto::OperationalKeystore FabricIndex mUsedFabricIndex = 0; }; -void TestBasicLifeCycle(nlTestSuite * inSuite, void * inContext) +struct TestPersistentStorageOpKeyStore : public ::testing::Test +{ + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestPersistentStorageOpKeyStore, TestBasicLifeCycle) { TestPersistentStorageDelegate storageDelegate; PersistentStorageOperationalKeystore opKeystore; @@ -141,188 +146,187 @@ void TestBasicLifeCycle(nlTestSuite * inSuite, void * inContext) // Failure before Init of ActivateOpKeypairForFabric P256PublicKey placeHolderPublicKey; CHIP_ERROR err = opKeystore.ActivateOpKeypairForFabric(kFabricIndex, placeHolderPublicKey); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); // Failure before Init of NewOpKeypairForFabric uint8_t unusedCsrBuf[kMIN_CSR_Buffer_Size]; MutableByteSpan unusedCsrSpan{ unusedCsrBuf }; err = opKeystore.NewOpKeypairForFabric(kFabricIndex, unusedCsrSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); // Failure before Init of CommitOpKeypairForFabric err = opKeystore.CommitOpKeypairForFabric(kFabricIndex); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); // Failure before Init of RemoveOpKeypairForFabric err = opKeystore.RemoveOpKeypairForFabric(kFabricIndex); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); // Success after Init err = opKeystore.Init(&storageDelegate); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Can generate a key and get a CSR uint8_t csrBuf[kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; err = opKeystore.NewOpKeypairForFabric(kFabricIndex, csrSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kFabricIndex) == false); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); + EXPECT_FALSE(opKeystore.HasOpKeypairForFabric(kFabricIndex)); P256PublicKey csrPublicKey1; err = VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), csrPublicKey1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, csrPublicKey1.Matches(csrPublicKey1)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(csrPublicKey1.Matches(csrPublicKey1)); // Can regenerate a second CSR and it has different PK csrSpan = MutableByteSpan{ csrBuf }; err = opKeystore.NewOpKeypairForFabric(kFabricIndex, csrSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); // Cannot NewOpKeypair for a different fabric if one already pending uint8_t badCsrBuf[kMIN_CSR_Buffer_Size]; MutableByteSpan badCsrSpan = MutableByteSpan{ badCsrBuf }; err = opKeystore.NewOpKeypairForFabric(kBadFabricIndex, badCsrSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); P256PublicKey csrPublicKey2; err = VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), csrPublicKey2); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !csrPublicKey1.Matches(csrPublicKey2)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(csrPublicKey1.Matches(csrPublicKey2)); // Fail to generate CSR for invalid fabrics csrSpan = MutableByteSpan{ csrBuf }; err = opKeystore.NewOpKeypairForFabric(kUndefinedFabricIndex, csrSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); csrSpan = MutableByteSpan{ csrBuf }; err = opKeystore.NewOpKeypairForFabric(kMaxValidFabricIndex + 1, csrSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); // No storage done by NewOpKeypairForFabric - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kFabricIndex) == false); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); + EXPECT_FALSE(opKeystore.HasOpKeypairForFabric(kFabricIndex)); // Even after error, the previous valid pending keypair stays valid. - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); // Activating with mismatching fabricIndex and matching public key fails err = opKeystore.ActivateOpKeypairForFabric(kBadFabricIndex, csrPublicKey2); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kFabricIndex) == false); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); + EXPECT_FALSE(opKeystore.HasOpKeypairForFabric(kFabricIndex)); // Activating with matching fabricIndex and mismatching public key fails err = opKeystore.ActivateOpKeypairForFabric(kFabricIndex, csrPublicKey1); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_PUBLIC_KEY); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kFabricIndex) == false); + EXPECT_EQ(err, CHIP_ERROR_INVALID_PUBLIC_KEY); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); + EXPECT_FALSE(opKeystore.HasOpKeypairForFabric(kFabricIndex)); uint8_t message[] = { 1, 2, 3, 4 }; P256ECDSASignature sig1; // Before successful activation, cannot sign err = opKeystore.SignWithOpKeypair(kFabricIndex, ByteSpan{ message }, sig1); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); // Activating with matching fabricIndex and matching public key succeeds err = opKeystore.ActivateOpKeypairForFabric(kFabricIndex, csrPublicKey2); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Activating does not store, and keeps pending - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kFabricIndex) == true); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kBadFabricIndex) == false); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); + EXPECT_TRUE(opKeystore.HasOpKeypairForFabric(kFabricIndex)); + EXPECT_FALSE(opKeystore.HasOpKeypairForFabric(kBadFabricIndex)); // Can't sign for wrong fabric after activation P256ECDSASignature sig2; err = opKeystore.SignWithOpKeypair(kBadFabricIndex, ByteSpan{ message }, sig2); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); // Can sign after activation err = opKeystore.SignWithOpKeypair(kFabricIndex, ByteSpan{ message }, sig2); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Signature matches pending key err = csrPublicKey2.ECDSA_validate_msg_signature(message, sizeof(message), sig2); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Signature does not match a previous pending key err = csrPublicKey1.ECDSA_validate_msg_signature(message, sizeof(message), sig2); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_SIGNATURE); + EXPECT_EQ(err, CHIP_ERROR_INVALID_SIGNATURE); // Committing with mismatching fabric fails, leaves pending err = opKeystore.CommitOpKeypairForFabric(kBadFabricIndex); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == true); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kFabricIndex) == true); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); + EXPECT_TRUE(opKeystore.HasPendingOpKeypair()); + EXPECT_TRUE(opKeystore.HasOpKeypairForFabric(kFabricIndex)); // Committing key resets pending state and adds storage std::string opKeyStorageKey = DefaultStorageKeyAllocator::FabricOpKey(kFabricIndex).KeyName(); err = opKeystore.CommitOpKeypairForFabric(kFabricIndex); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == false); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 1); - NL_TEST_ASSERT(inSuite, storageDelegate.HasKey(opKeyStorageKey) == true); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(opKeystore.HasPendingOpKeypair()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 1u); + EXPECT_TRUE(storageDelegate.HasKey(opKeyStorageKey)); // Exporting a key P256SerializedKeypair serializedKeypair; - NL_TEST_ASSERT(inSuite, opKeystore.ExportOpKeypairForFabric(kFabricIndex, serializedKeypair) == CHIP_NO_ERROR); + EXPECT_EQ(opKeystore.ExportOpKeypairForFabric(kFabricIndex, serializedKeypair), CHIP_NO_ERROR); // Exporting a key from the bad fabric index - NL_TEST_ASSERT(inSuite, - opKeystore.ExportOpKeypairForFabric(kBadFabricIndex, serializedKeypair) == - CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); + EXPECT_EQ(opKeystore.ExportOpKeypairForFabric(kBadFabricIndex, serializedKeypair), + CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); // After committing, signing works with the key that was pending P256ECDSASignature sig3; uint8_t message2[] = { 10, 11, 12, 13 }; err = opKeystore.SignWithOpKeypair(kFabricIndex, ByteSpan{ message2 }, sig3); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = csrPublicKey2.ECDSA_validate_msg_signature(message2, sizeof(message2), sig3); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Let's remove the opkey for a fabric, it disappears err = opKeystore.RemoveOpKeypairForFabric(kFabricIndex); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opKeystore.HasPendingOpKeypair() == false); - NL_TEST_ASSERT(inSuite, opKeystore.HasOpKeypairForFabric(kFabricIndex) == false); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); - NL_TEST_ASSERT(inSuite, storageDelegate.HasKey(opKeyStorageKey) == false); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(opKeystore.HasPendingOpKeypair()); + EXPECT_FALSE(opKeystore.HasOpKeypairForFabric(kFabricIndex)); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); + EXPECT_FALSE(storageDelegate.HasKey(opKeyStorageKey)); opKeystore.Finish(); } -void TestEphemeralKeys(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPersistentStorageOpKeyStore, TestEphemeralKeys) { chip::TestPersistentStorageDelegate storage; PersistentStorageOperationalKeystore opKeyStore; - NL_TEST_ASSERT_SUCCESS(inSuite, opKeyStore.Init(&storage)); + EXPECT_EQ(opKeyStore.Init(&storage), CHIP_NO_ERROR); Crypto::P256ECDSASignature sig; uint8_t message[] = { 'm', 's', 'g' }; Crypto::P256Keypair * ephemeralKeypair = opKeyStore.AllocateEphemeralKeypairForCASE(); - NL_TEST_ASSERT(inSuite, ephemeralKeypair != nullptr); - NL_TEST_ASSERT_SUCCESS(inSuite, ephemeralKeypair->Initialize(Crypto::ECPKeyTarget::ECDSA)); + ASSERT_NE(ephemeralKeypair, nullptr); + EXPECT_EQ(ephemeralKeypair->Initialize(Crypto::ECPKeyTarget::ECDSA), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, ephemeralKeypair->ECDSA_sign_msg(message, sizeof(message), sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, ephemeralKeypair->Pubkey().ECDSA_validate_msg_signature(message, sizeof(message), sig)); + EXPECT_EQ(ephemeralKeypair->ECDSA_sign_msg(message, sizeof(message), sig), CHIP_NO_ERROR); + EXPECT_EQ(ephemeralKeypair->Pubkey().ECDSA_validate_msg_signature(message, sizeof(message), sig), CHIP_NO_ERROR); opKeyStore.ReleaseEphemeralKeypair(ephemeralKeypair); opKeyStore.Finish(); } -void TestMigrationKeys(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPersistentStorageOpKeyStore, TestMigrationKeys) { chip::TestPersistentStorageDelegate storageDelegate; @@ -334,89 +338,46 @@ void TestMigrationKeys(nlTestSuite * inSuite, void * inContext) opKeyStore.Init(&storageDelegate); // Failure on invalid Fabric indexes - NL_TEST_ASSERT(inSuite, - opKeyStore.MigrateOpKeypairForFabric(kUndefinedFabricIndex, testOperationalKeystore) == - CHIP_ERROR_INVALID_FABRIC_INDEX); - NL_TEST_ASSERT(inSuite, - opKeyStore.MigrateOpKeypairForFabric(kMaxValidFabricIndex + 1, testOperationalKeystore) == - CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(opKeyStore.MigrateOpKeypairForFabric(kUndefinedFabricIndex, testOperationalKeystore), + CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(opKeyStore.MigrateOpKeypairForFabric(kMaxValidFabricIndex + 1, testOperationalKeystore), + CHIP_ERROR_INVALID_FABRIC_INDEX); // The key does not exists in the any of the Operational Keystores - NL_TEST_ASSERT(inSuite, storageDelegate.HasKey(opKeyStorageKey) == false); - NL_TEST_ASSERT(inSuite, testOperationalKeystore.HasOpKeypairForFabric(kFabricIndex) == false); - NL_TEST_ASSERT(inSuite, - opKeyStore.MigrateOpKeypairForFabric(kFabricIndex, testOperationalKeystore) == - CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); + EXPECT_FALSE(storageDelegate.HasKey(opKeyStorageKey)); + EXPECT_FALSE(testOperationalKeystore.HasOpKeypairForFabric(kFabricIndex)); + EXPECT_EQ(opKeyStore.MigrateOpKeypairForFabric(kFabricIndex, testOperationalKeystore), + CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); // Create a key in the old Operational Keystore uint8_t csrBuf[kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT(inSuite, testOperationalKeystore.NewOpKeypairForFabric(kFabricIndex, csrSpan) == CHIP_NO_ERROR); + EXPECT_EQ(testOperationalKeystore.NewOpKeypairForFabric(kFabricIndex, csrSpan), CHIP_NO_ERROR); // Migrate the key to the PersistentStorageOperationalKeystore - NL_TEST_ASSERT(inSuite, opKeyStore.MigrateOpKeypairForFabric(kFabricIndex, testOperationalKeystore) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 1); - NL_TEST_ASSERT(inSuite, storageDelegate.HasKey(opKeyStorageKey) == true); - NL_TEST_ASSERT(inSuite, testOperationalKeystore.HasOpKeypairForFabric(kFabricIndex) == false); + EXPECT_EQ(opKeyStore.MigrateOpKeypairForFabric(kFabricIndex, testOperationalKeystore), CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 1u); + EXPECT_TRUE(storageDelegate.HasKey(opKeyStorageKey)); + EXPECT_FALSE(testOperationalKeystore.HasOpKeypairForFabric(kFabricIndex)); // Verify the migration P256SerializedKeypair serializedKeypair; - NL_TEST_ASSERT(inSuite, opKeyStore.ExportOpKeypairForFabric(kFabricIndex, serializedKeypair) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, testOperationalKeystore.ValidateKeypair(serializedKeypair)); + EXPECT_EQ(opKeyStore.ExportOpKeypairForFabric(kFabricIndex, serializedKeypair), CHIP_NO_ERROR); + EXPECT_TRUE(testOperationalKeystore.ValidateKeypair(serializedKeypair)); // Verify that migration method returns success when there is no OpKey stored in the old keystore, but already exists in PSA // ITS. - NL_TEST_ASSERT(inSuite, opKeyStore.MigrateOpKeypairForFabric(kFabricIndex, testOperationalKeystore) == CHIP_NO_ERROR); + EXPECT_EQ(opKeyStore.MigrateOpKeypairForFabric(kFabricIndex, testOperationalKeystore), CHIP_NO_ERROR); // The key already exists in ITS, but there is an another attempt to migrate the new key. // The key should not be overwritten, but the key from the previous persistent keystore should be removed. MutableByteSpan csrSpan2{ csrBuf }; - NL_TEST_ASSERT(inSuite, testOperationalKeystore.NewOpKeypairForFabric(kFabricIndex, csrSpan2) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, testOperationalKeystore.HasOpKeypairForFabric(kFabricIndex) == true); - NL_TEST_ASSERT(inSuite, opKeyStore.MigrateOpKeypairForFabric(kFabricIndex, testOperationalKeystore) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, testOperationalKeystore.HasOpKeypairForFabric(kFabricIndex) == false); + EXPECT_EQ(testOperationalKeystore.NewOpKeypairForFabric(kFabricIndex, csrSpan2), CHIP_NO_ERROR); + EXPECT_TRUE(testOperationalKeystore.HasOpKeypairForFabric(kFabricIndex)); + EXPECT_EQ(opKeyStore.MigrateOpKeypairForFabric(kFabricIndex, testOperationalKeystore), CHIP_NO_ERROR); + EXPECT_FALSE(testOperationalKeystore.HasOpKeypairForFabric(kFabricIndex)); opKeyStore.Finish(); } -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { NL_TEST_DEF("Test Basic Lifecycle of PersistentStorageOperationalKeystore", TestBasicLifeCycle), - NL_TEST_DEF("Test ephemeral key management", TestEphemeralKeys), - NL_TEST_DEF("Test keys migration ", TestMigrationKeys), NL_TEST_SENTINEL() }; - -/** - * Set up the test suite. - */ -int Test_Setup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - VerifyOrReturnError(error == CHIP_NO_ERROR, FAILURE); - return SUCCESS; -} - -/** - * Tear down the test suite. - */ -int Test_Teardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - } // namespace - -/** - * Main - */ -int TestPersistentStorageOperationalKeystore() -{ - nlTestSuite theSuite = { "PersistentStorageOperationalKeystore tests", &sTests[0], Test_Setup, Test_Teardown }; - - // Run test suite againt one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestPersistentStorageOperationalKeystore) diff --git a/src/crypto/tests/TestSessionKeystore.cpp b/src/crypto/tests/TestSessionKeystore.cpp index 025cd5c9233cbe..b3908d1695aaac 100644 --- a/src/crypto/tests/TestSessionKeystore.cpp +++ b/src/crypto/tests/TestSessionKeystore.cpp @@ -24,10 +24,8 @@ #include <lib/support/CodeUtils.h> #include <lib/support/ScopedBuffer.h> #include <lib/support/Span.h> -#include <lib/support/UnitTestExtendedAssertions.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> #if CHIP_CRYPTO_PSA #include <psa/crypto.h> @@ -101,7 +99,21 @@ ByteSpan ToSpan(const char * str) return ByteSpan(reinterpret_cast<const uint8_t *>(str), strlen(str)); } -void TestBasicImport(nlTestSuite * inSuite, void * inContext) +struct TestSessionKeystore : public ::testing::Test +{ + static void SetUpTestSuite() + { + ASSERT_EQ(Platform::MemoryInit(), CHIP_NO_ERROR); + +#if CHIP_CRYPTO_PSA + psa_crypto_init(); +#endif + } + + static void TearDownTestSuite() { Platform::MemoryShutdown(); } +}; + +TEST_F(TestSessionKeystore, TestBasicImport) { TestSessionKeystoreImpl keystore; @@ -114,23 +126,23 @@ void TestBasicImport(nlTestSuite * inSuite, void * inContext) memcpy(keyMaterial, test.key, test.key_len); Aes128KeyHandle keyHandle; - NL_TEST_ASSERT_SUCCESS(inSuite, keystore.CreateKey(keyMaterial, keyHandle)); + EXPECT_EQ(keystore.CreateKey(keyMaterial, keyHandle), CHIP_NO_ERROR); Platform::ScopedMemoryBuffer<uint8_t> ciphertext; Platform::ScopedMemoryBuffer<uint8_t> tag; - NL_TEST_ASSERT(inSuite, ciphertext.Alloc(test.ct_len)); - NL_TEST_ASSERT(inSuite, tag.Alloc(test.tag_len)); - NL_TEST_ASSERT(inSuite, - AES_CCM_encrypt(test.pt, test.pt_len, test.aad, test.aad_len, keyHandle, test.nonce, test.nonce_len, - ciphertext.Get(), tag.Get(), test.tag_len) == test.result); - NL_TEST_ASSERT(inSuite, memcmp(ciphertext.Get(), test.ct, test.ct_len) == 0); - NL_TEST_ASSERT(inSuite, memcmp(tag.Get(), test.tag, test.tag_len) == 0); + EXPECT_TRUE(ciphertext.Alloc(test.ct_len)); + EXPECT_TRUE(tag.Alloc(test.tag_len)); + EXPECT_EQ(AES_CCM_encrypt(test.pt, test.pt_len, test.aad, test.aad_len, keyHandle, test.nonce, test.nonce_len, + ciphertext.Get(), tag.Get(), test.tag_len), + test.result); + EXPECT_EQ(memcmp(ciphertext.Get(), test.ct, test.ct_len), 0); + EXPECT_EQ(memcmp(tag.Get(), test.tag, test.tag_len), 0); keystore.DestroyKey(keyHandle); } } -void TestDeriveKey(nlTestSuite * inSuite, void * inContext) +TEST_F(TestSessionKeystore, TestDeriveKey) { TestSessionKeystoreImpl keystore; @@ -141,18 +153,18 @@ void TestDeriveKey(nlTestSuite * inSuite, void * inContext) secret.SetLength(strlen(test.secret)); Aes128KeyHandle keyHandle; - NL_TEST_ASSERT_SUCCESS(inSuite, keystore.DeriveKey(secret, ToSpan(test.salt), ToSpan(test.info), keyHandle)); + EXPECT_EQ(keystore.DeriveKey(secret, ToSpan(test.salt), ToSpan(test.info), keyHandle), CHIP_NO_ERROR); uint8_t ciphertext[sizeof(test.ciphertext)]; - NL_TEST_ASSERT_SUCCESS( - inSuite, AES_CTR_crypt(test.plaintext, sizeof(test.plaintext), keyHandle, test.nonce, sizeof(test.nonce), ciphertext)); - NL_TEST_ASSERT(inSuite, memcmp(ciphertext, test.ciphertext, sizeof(test.ciphertext)) == 0); + EXPECT_EQ(AES_CTR_crypt(test.plaintext, sizeof(test.plaintext), keyHandle, test.nonce, sizeof(test.nonce), ciphertext), + CHIP_NO_ERROR); + EXPECT_EQ(memcmp(ciphertext, test.ciphertext, sizeof(test.ciphertext)), 0); keystore.DestroyKey(keyHandle); } } -void TestDeriveSessionKeys(nlTestSuite * inSuite, void * inContext) +TEST_F(TestSessionKeystore, TestDeriveSessionKeys) { TestSessionKeystoreImpl keystore; @@ -165,63 +177,27 @@ void TestDeriveSessionKeys(nlTestSuite * inSuite, void * inContext) Aes128KeyHandle i2r; Aes128KeyHandle r2i; AttestationChallenge challenge; - NL_TEST_ASSERT_SUCCESS( - inSuite, keystore.DeriveSessionKeys(ToSpan(test.secret), ToSpan(test.salt), ToSpan(test.info), i2r, r2i, challenge)); + EXPECT_EQ(keystore.DeriveSessionKeys(ToSpan(test.secret), ToSpan(test.salt), ToSpan(test.info), i2r, r2i, challenge), + CHIP_NO_ERROR); uint8_t ciphertext[sizeof(test.i2rCiphertext)]; // Test I2R key - NL_TEST_ASSERT_SUCCESS( - inSuite, AES_CTR_crypt(test.plaintext, sizeof(test.plaintext), i2r, test.nonce, sizeof(test.nonce), ciphertext)); - NL_TEST_ASSERT(inSuite, memcmp(ciphertext, test.i2rCiphertext, sizeof(test.i2rCiphertext)) == 0); + EXPECT_EQ(AES_CTR_crypt(test.plaintext, sizeof(test.plaintext), i2r, test.nonce, sizeof(test.nonce), ciphertext), + CHIP_NO_ERROR); + EXPECT_EQ(memcmp(ciphertext, test.i2rCiphertext, sizeof(test.i2rCiphertext)), 0); // Test R2I key - NL_TEST_ASSERT_SUCCESS( - inSuite, AES_CTR_crypt(test.plaintext, sizeof(test.plaintext), r2i, test.nonce, sizeof(test.nonce), ciphertext)); - NL_TEST_ASSERT(inSuite, memcmp(ciphertext, test.r2iCiphertext, sizeof(test.r2iCiphertext)) == 0); + EXPECT_EQ(AES_CTR_crypt(test.plaintext, sizeof(test.plaintext), r2i, test.nonce, sizeof(test.nonce), ciphertext), + CHIP_NO_ERROR); + EXPECT_EQ(memcmp(ciphertext, test.r2iCiphertext, sizeof(test.r2iCiphertext)), 0); // Check attestation challenge - NL_TEST_ASSERT(inSuite, memcmp(challenge.Bytes(), test.attestationChallenge, sizeof(test.attestationChallenge)) == 0); + EXPECT_EQ(memcmp(challenge.Bytes(), test.attestationChallenge, sizeof(test.attestationChallenge)), 0); keystore.DestroyKey(i2r); keystore.DestroyKey(r2i); } } -const nlTest sTests[] = { NL_TEST_DEF("Test basic import", TestBasicImport), NL_TEST_DEF("Test derive key", TestDeriveKey), - NL_TEST_DEF("Test derive session keys", TestDeriveSessionKeys), NL_TEST_SENTINEL() }; - -int Test_Setup(void * inContext) -{ - CHIP_ERROR error = Platform::MemoryInit(); - VerifyOrReturnError(error == CHIP_NO_ERROR, FAILURE); - -#if CHIP_CRYPTO_PSA - psa_crypto_init(); -#endif - - return SUCCESS; -} - -int Test_Teardown(void * inContext) -{ - Platform::MemoryShutdown(); - - return SUCCESS; -} - } // namespace - -/** - * Main - */ -int TestSessionKeystore() -{ - nlTestSuite theSuite = { "SessionKeystore tests", &sTests[0], Test_Setup, Test_Teardown }; - - // Run test suite againt one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestSessionKeystore) diff --git a/src/messaging/tests/TestAbortExchangesForFabric.cpp b/src/messaging/tests/TestAbortExchangesForFabric.cpp index a9999eb6c2f9e0..6dc5d8c2775cd3 100644 --- a/src/messaging/tests/TestAbortExchangesForFabric.cpp +++ b/src/messaging/tests/TestAbortExchangesForFabric.cpp @@ -37,6 +37,10 @@ #include <app/icd/server/ICDConfigurationData.h> // nogncheck #endif +#if CHIP_CRYPTO_PSA +#include "psa/crypto.h" +#endif + namespace { using namespace chip; @@ -45,7 +49,17 @@ using namespace chip::System; using namespace chip::System::Clock::Literals; using namespace chip::Protocols; -using TestContext = Test::LoopbackMessagingContext; +struct TestContext : Test::LoopbackMessagingContext +{ + virtual CHIP_ERROR SetUp() + { +#if CHIP_CRYPTO_PSA + ReturnErrorOnFailure(psa_crypto_init() == PSA_SUCCESS ? CHIP_NO_ERROR : CHIP_ERROR_INTERNAL); +#endif + ReturnErrorOnFailure(chip::Test::LoopbackMessagingContext::SetUp()); + return CHIP_NO_ERROR; + } +}; class MockAppDelegate : public ExchangeDelegate { diff --git a/src/messaging/tests/TestExchangeMgr.cpp b/src/messaging/tests/TestExchangeMgr.cpp index 69e1fbaa8f9afa..f85bebe455259e 100644 --- a/src/messaging/tests/TestExchangeMgr.cpp +++ b/src/messaging/tests/TestExchangeMgr.cpp @@ -40,6 +40,10 @@ #include <errno.h> #include <utility> +#if CHIP_CRYPTO_PSA +#include "psa/crypto.h" +#endif + namespace { using namespace chip; @@ -47,7 +51,19 @@ using namespace chip::Inet; using namespace chip::Transport; using namespace chip::Messaging; -using TestContext = Test::LoopbackMessagingContext; +struct TestContext : Test::LoopbackMessagingContext +{ + // TODO Add TearDown function during changing test framework to Pigweed to make it more clear how does it work. + // Currently, the TearDown function is from LoopbackMessagingContext + virtual CHIP_ERROR SetUp() + { +#if CHIP_CRYPTO_PSA + ReturnErrorOnFailure(psa_crypto_init() == PSA_SUCCESS ? CHIP_NO_ERROR : CHIP_ERROR_INTERNAL); +#endif + ReturnErrorOnFailure(chip::Test::LoopbackMessagingContext::SetUp()); + return CHIP_NO_ERROR; + } +}; enum : uint8_t { diff --git a/src/messaging/tests/TestReliableMessageProtocol.cpp b/src/messaging/tests/TestReliableMessageProtocol.cpp index 04b8a1aadb149f..7233e45fd846b5 100644 --- a/src/messaging/tests/TestReliableMessageProtocol.cpp +++ b/src/messaging/tests/TestReliableMessageProtocol.cpp @@ -50,6 +50,10 @@ #include <app/icd/server/ICDConfigurationData.h> // nogncheck #endif +#if CHIP_CRYPTO_PSA +#include "psa/crypto.h" +#endif + namespace { using namespace chip; @@ -75,6 +79,9 @@ class TestContext : public chip::Test::LoopbackMessagingContext // Performs setup for each individual test in the test suite CHIP_ERROR SetUp() override { +#if CHIP_CRYPTO_PSA + ReturnErrorOnFailure(psa_crypto_init() == PSA_SUCCESS ? CHIP_NO_ERROR : CHIP_ERROR_INTERNAL); +#endif ReturnErrorOnFailure(chip::Test::LoopbackMessagingContext::SetUp()); GetSessionAliceToBob()->AsSecureSession()->SetRemoteSessionParameters(GetLocalMRPConfig().ValueOr(GetDefaultMRPConfig())); GetSessionBobToAlice()->AsSecureSession()->SetRemoteSessionParameters(GetLocalMRPConfig().ValueOr(GetDefaultMRPConfig())); diff --git a/src/test_driver/openiotsdk/unit-tests/test_components.txt b/src/test_driver/openiotsdk/unit-tests/test_components.txt index 43a4bf883a9567..83dfc0d577bdb7 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components.txt @@ -1,12 +1,13 @@ accesstest +SystemLayerTests ASN1Tests MinimalMdnsCoreTests +ChipCryptoTests MinimalMdnsRecordsTests MinimalMdnsRespondersTests CoreTests MdnsTests PlatformTests -SystemLayerTests TestShell SetupPayloadTests SupportTests \ No newline at end of file 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 809a36b167c817..50b0fed3b5e724 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt @@ -1,6 +1,5 @@ AppTests BDXTests -ChipCryptoTests CredentialsTest DataModelTests InetLayerTests From e1dd2798bdd7d6c9c0f1cb7f9e3d319b907f21c3 Mon Sep 17 00:00:00 2001 From: Shubham Patil <shubham.patil@espressif.com> Date: Wed, 24 Apr 2024 19:41:05 +0530 Subject: [PATCH 020/124] [ESP32] Implement BLE Manager Shutdown for nimble host (#33109) * [ESP32] Implement BLE Manager Shutdown for nimble host - Replace ble deinit imple in Esp32AppServer with BLEMgr().Shutdown() - Replace few ESP_LOG with ChipLog in Esp32AppServer - Move ble deinit kCommissioningComplete switch case - Make USE_BLE_ONLY_FOR_COMMISSIONING depends on BT_ENABLED * Restyled by clang-format * address reviews * Add checks for timer handler --------- Co-authored-by: Restyled.io <commits@restyled.io> --- config/esp32/components/chip/Kconfig | 13 +-- .../esp32/common/CommonDeviceCallbacks.cpp | 2 +- .../platform/esp32/common/Esp32AppServer.cpp | 45 +-------- src/platform/ESP32/BLEManagerImpl.h | 6 +- src/platform/ESP32/nimble/BLEManagerImpl.cpp | 94 +++++++++++++++++-- 5 files changed, 103 insertions(+), 57 deletions(-) diff --git a/config/esp32/components/chip/Kconfig b/config/esp32/components/chip/Kconfig index d176d6571ef205..47ceceffe2f94d 100644 --- a/config/esp32/components/chip/Kconfig +++ b/config/esp32/components/chip/Kconfig @@ -726,12 +726,13 @@ menu "CHIP Device Layer" should not start advertising automatically after power-up. config USE_BLE_ONLY_FOR_COMMISSIONING - bool "Use BLE only for commissioning" - default y - help - Disable this flag if BLE is used for any other purpose than commissioning. - When enabled, it deinitialized the BLE on successful commissioning, and on - bootup do not initialize the BLE if device is already provisioned with Wi-Fi/Thread credentials. + depends on BT_ENABLED + bool "Use BLE only for commissioning" + default y + help + Disable this flag if BLE is used for any other purpose than commissioning. + When enabled, it deinitialized the BLE on successful commissioning, and on + bootup do not initialize the BLE if device is already provisioned with Wi-Fi/Thread credentials. endmenu diff --git a/examples/platform/esp32/common/CommonDeviceCallbacks.cpp b/examples/platform/esp32/common/CommonDeviceCallbacks.cpp index ede4e154483154..763340cee45e45 100644 --- a/examples/platform/esp32/common/CommonDeviceCallbacks.cpp +++ b/examples/platform/esp32/common/CommonDeviceCallbacks.cpp @@ -51,7 +51,6 @@ void CommonDeviceCallbacks::DeviceEventCallback(const ChipDeviceEvent * event, i case DeviceEventType::kCHIPoBLEConnectionClosed: ESP_LOGI(TAG, "CHIPoBLE disconnected"); - Esp32AppServer::DeInitBLEIfCommissioned(); break; case DeviceEventType::kDnssdInitialized: @@ -67,6 +66,7 @@ void CommonDeviceCallbacks::DeviceEventCallback(const ChipDeviceEvent * event, i case DeviceEventType::kCommissioningComplete: { ESP_LOGI(TAG, "Commissioning complete"); + Esp32AppServer::DeInitBLEIfCommissioned(); } break; diff --git a/examples/platform/esp32/common/Esp32AppServer.cpp b/examples/platform/esp32/common/Esp32AppServer.cpp index 873115c25ab1af..4f854c518bd01f 100644 --- a/examples/platform/esp32/common/Esp32AppServer.cpp +++ b/examples/platform/esp32/common/Esp32AppServer.cpp @@ -111,47 +111,12 @@ static size_t hex_string_to_binary(const char * hex_string, uint8_t * buf, size_ void Esp32AppServer::DeInitBLEIfCommissioned(void) { -#if CONFIG_BT_ENABLED && CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING +#ifdef CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING if (chip::Server::GetInstance().GetFabricTable().FabricCount() > 0) { - esp_err_t err = ESP_OK; - -#if CONFIG_BT_NIMBLE_ENABLED - if (!ble_hs_is_enabled()) - { - ESP_LOGI(TAG, "BLE already deinited"); - return; - } - if (nimble_port_stop() != 0) - { - ESP_LOGE(TAG, "nimble_port_stop() failed"); - return; - } - vTaskDelay(100); - nimble_port_deinit(); - -#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0) - err = esp_nimble_hci_and_controller_deinit(); -#endif -#endif /* CONFIG_BT_NIMBLE_ENABLED */ - -#if CONFIG_IDF_TARGET_ESP32 - err |= esp_bt_mem_release(ESP_BT_MODE_BTDM); -#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32H2 || \ - CONFIG_IDF_TARGET_ESP32C6 - err |= esp_bt_mem_release(ESP_BT_MODE_BLE); -#endif - - if (err != ESP_OK) - { - ESP_LOGE(TAG, "BLE deinit failed"); - } - else - { - ESP_LOGI(TAG, "BLE deinit successful and memory reclaimed"); - } + chip::DeviceLayer::Internal::BLEMgr().Shutdown(); } -#endif /* CONFIG_BT_ENABLED && CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING */ +#endif /* CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING */ } void Esp32AppServer::Init(AppDelegate * sAppDelegate) @@ -162,7 +127,7 @@ void Esp32AppServer::Init(AppDelegate * sAppDelegate) if (hex_string_to_binary(CONFIG_TEST_EVENT_TRIGGER_ENABLE_KEY, sTestEventTriggerEnableKey, sizeof(sTestEventTriggerEnableKey)) == 0) { - ESP_LOGE(TAG, "Failed to convert the EnableKey string to octstr type value"); + ChipLogError(DeviceLayer, "Failed to convert the EnableKey string to octstr type value"); memset(sTestEventTriggerEnableKey, 0, sizeof(sTestEventTriggerEnableKey)); } static SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; @@ -190,7 +155,7 @@ void Esp32AppServer::Init(AppDelegate * sAppDelegate) if (chip::DeviceLayer::ConnectivityMgr().IsThreadProvisioned() && (chip::Server::GetInstance().GetFabricTable().FabricCount() != 0)) { - ESP_LOGI(TAG, "Thread has been provisioned, publish the dns service now"); + ChipLogProgress(DeviceLayer, "Thread has been provisioned, publish the dns service now"); chip::app::DnssdServer::Instance().StartServer(); } #endif diff --git a/src/platform/ESP32/BLEManagerImpl.h b/src/platform/ESP32/BLEManagerImpl.h index 39cde57dc0c262..9364ead642c525 100644 --- a/src/platform/ESP32/BLEManagerImpl.h +++ b/src/platform/ESP32/BLEManagerImpl.h @@ -157,7 +157,7 @@ class BLEManagerImpl final : public BLEManager, // ===== Members that implement the BLEManager internal interface. CHIP_ERROR _Init(void); - void _Shutdown() {} + void _Shutdown(); bool _IsAdvertisingEnabled(void); CHIP_ERROR _SetAdvertisingEnabled(bool val); bool _IsAdvertising(void); @@ -298,6 +298,7 @@ class BLEManagerImpl final : public BLEManager, void DriveBLEState(void); CHIP_ERROR InitESPBleLayer(void); + void DeinitESPBleLayer(void); CHIP_ERROR ConfigureAdvertisingData(void); CHIP_ERROR StartAdvertising(void); void StartBleAdvTimeoutTimer(uint32_t aTimeoutInMs); @@ -328,6 +329,9 @@ class BLEManagerImpl final : public BLEManager, static void HandleGAPEvent(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t * param); #elif CONFIG_BT_NIMBLE_ENABLED + CHIP_ERROR DeinitBLE(); + static void ClaimBLEMemory(System::Layer *, void *); + void HandleRXCharRead(struct ble_gatt_char_context * param); void HandleRXCharWrite(struct ble_gatt_char_context * param); void HandleTXCharWrite(struct ble_gatt_char_context * param); diff --git a/src/platform/ESP32/nimble/BLEManagerImpl.cpp b/src/platform/ESP32/nimble/BLEManagerImpl.cpp index edff1666e6311a..67b5f9bc4b9530 100644 --- a/src/platform/ESP32/nimble/BLEManagerImpl.cpp +++ b/src/platform/ESP32/nimble/BLEManagerImpl.cpp @@ -211,14 +211,6 @@ CHIP_ERROR BLEManagerImpl::_Init() { CHIP_ERROR err; - // Initialize the Chip BleLayer. -#if CONFIG_ENABLE_ESP32_BLE_CONTROLLER - err = BleLayer::Init(this, this, this, &DeviceLayer::SystemLayer()); -#else - err = BleLayer::Init(this, this, &DeviceLayer::SystemLayer()); -#endif - SuccessOrExit(err); - // Create FreeRTOS sw timer for BLE timeouts and interval change. sbleAdvTimeoutTimer = xTimerCreate("BleAdvTimer", // Just a text name, not used by the RTOS kernel 1, // == default timer period @@ -227,6 +219,16 @@ CHIP_ERROR BLEManagerImpl::_Init() BleAdvTimeoutHandler // timer callback handler ); + VerifyOrReturnError(sbleAdvTimeoutTimer != nullptr, CHIP_ERROR_NO_MEMORY); + + // Initialize the Chip BleLayer. +#if CONFIG_ENABLE_ESP32_BLE_CONTROLLER + err = BleLayer::Init(this, this, this, &DeviceLayer::SystemLayer()); +#else + err = BleLayer::Init(this, this, &DeviceLayer::SystemLayer()); +#endif + SuccessOrExit(err); + mRXCharAttrHandle = 0; #if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING mC3CharAttrHandle = 0; @@ -252,6 +254,25 @@ CHIP_ERROR BLEManagerImpl::_Init() return err; } +void BLEManagerImpl::_Shutdown() +{ + VerifyOrReturn(sbleAdvTimeoutTimer != nullptr); + xTimerDelete(sbleAdvTimeoutTimer, portMAX_DELAY); + sbleAdvTimeoutTimer = nullptr; + + BleLayer::Shutdown(); + + // selectively setting kGATTServiceStarted flag, in order to notify the state machine to stop the CHIPoBLE GATT service + mFlags.ClearAll().Set(Flags::kGATTServiceStarted); + mServiceMode = ConnectivityManager::kCHIPoBLEServiceMode_Disabled; + +#if CONFIG_ENABLE_ESP32_BLE_CONTROLLER + OnChipBleConnectReceived = nullptr; +#endif // CONFIG_ENABLE_ESP32_BLE_CONTROLLER + + PlatformMgr().ScheduleWork(DriveBLEState, 0); +} + CHIP_ERROR BLEManagerImpl::_SetAdvertisingEnabled(bool val) { CHIP_ERROR err = CHIP_NO_ERROR; @@ -707,6 +728,8 @@ CHIP_ERROR BLEManagerImpl::MapBLEError(int bleErr) } void BLEManagerImpl::CancelBleAdvTimeoutTimer(void) { + VerifyOrReturn(sbleAdvTimeoutTimer != nullptr); + if (xTimerStop(sbleAdvTimeoutTimer, pdMS_TO_TICKS(0)) == pdFAIL) { ChipLogError(DeviceLayer, "Failed to stop BledAdv timeout timer"); @@ -714,6 +737,8 @@ void BLEManagerImpl::CancelBleAdvTimeoutTimer(void) } void BLEManagerImpl::StartBleAdvTimeoutTimer(uint32_t aTimeoutInMs) { + VerifyOrReturn(sbleAdvTimeoutTimer != nullptr); + if (xTimerIsTimerActive(sbleAdvTimeoutTimer)) { CancelBleAdvTimeoutTimer(); @@ -843,7 +868,8 @@ void BLEManagerImpl::DriveBLEState(void) // Stop the CHIPoBLE GATT service if needed. if (mServiceMode != ConnectivityManager::kCHIPoBLEServiceMode_Enabled && mFlags.Has(Flags::kGATTServiceStarted)) { - // TODO: Not supported + DeinitESPBleLayer(); + mFlags.ClearAll(); } exit: @@ -969,6 +995,56 @@ CHIP_ERROR BLEManagerImpl::InitESPBleLayer(void) return err; } +void BLEManagerImpl::DeinitESPBleLayer() +{ + VerifyOrReturn(DeinitBLE() == CHIP_NO_ERROR); + BLEManagerImpl::ClaimBLEMemory(nullptr, nullptr); +} + +void BLEManagerImpl::ClaimBLEMemory(System::Layer *, void *) +{ + TaskHandle_t handle = xTaskGetHandle("nimble_host"); + if (handle) + { + ChipLogDetail(DeviceLayer, "Schedule ble memory reclaiming since nimble host is still running"); + + // Rescheduling it for later, 2 seconds is an arbitrary value, keeping it a bit more so that + // we dont have to reschedule it again + SystemLayer().StartTimer(System::Clock::Seconds32(2), ClaimBLEMemory, nullptr); + } + else + { + // Free up all the space occupied by ble and add it to heap + esp_err_t err = ESP_OK; + +#if CONFIG_IDF_TARGET_ESP32 + err = esp_bt_mem_release(ESP_BT_MODE_BTDM); +#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32H2 || \ + CONFIG_IDF_TARGET_ESP32C6 + err = esp_bt_mem_release(ESP_BT_MODE_BLE); +#endif + + VerifyOrReturn(err == ESP_OK, ChipLogError(DeviceLayer, "BLE deinit failed")); + ChipLogProgress(DeviceLayer, "BLE deinit successful and memory reclaimed"); + // TODO: post an event when ble is deinitialized and memory is added to heap + } +} + +CHIP_ERROR BLEManagerImpl::DeinitBLE() +{ + VerifyOrReturnError(ble_hs_is_enabled(), CHIP_ERROR_INCORRECT_STATE, ChipLogProgress(DeviceLayer, "BLE already deinited")); + VerifyOrReturnError(0 == nimble_port_stop(), MapBLEError(ESP_FAIL), ChipLogError(DeviceLayer, "nimble_port_stop() failed")); + + esp_err_t err = nimble_port_deinit(); + VerifyOrReturnError(err == ESP_OK, MapBLEError(err)); + +#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0) + err = esp_nimble_hci_and_controller_deinit(); +#endif + + return MapBLEError(err); +} + CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void) { CHIP_ERROR err; From fe54a37ac087f6eb6210ace2632174a065c3e452 Mon Sep 17 00:00:00 2001 From: Andrei Litvin <andy314@gmail.com> Date: Wed, 24 Apr 2024 12:08:37 -0400 Subject: [PATCH 021/124] Fix builds to macos-13 rather than latest due to bootstrap python incompatibilities (#33142) --- .github/workflows/build.yaml | 2 +- .github/workflows/fuzzing-build.yaml | 2 +- .github/workflows/tests.yaml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0616a9bb7f7acd..7b356ab8f8e3ef 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -371,7 +371,7 @@ jobs: build_darwin: name: Build on Darwin (clang, python_lib, simulated) - runs-on: macos-latest + runs-on: macos-13 if: github.actor != 'restyled-io[bot]' steps: diff --git a/.github/workflows/fuzzing-build.yaml b/.github/workflows/fuzzing-build.yaml index 18a2f182e7f3a6..861212f70e0e76 100644 --- a/.github/workflows/fuzzing-build.yaml +++ b/.github/workflows/fuzzing-build.yaml @@ -68,7 +68,7 @@ jobs: build_darwin_fuzzing: name: Build on Darwin - runs-on: macos-latest + runs-on: macos-13 if: github.actor != 'restyled-io[bot]' steps: diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index b495b5f01309f4..005b00f86d3dbc 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -330,7 +330,7 @@ jobs: LSAN_OPTIONS: detect_leaks=1 suppressions=scripts/tests/chiptest/lsan-mac-suppressions.txt if: github.actor != 'restyled-io[bot]' - runs-on: macos-latest + runs-on: macos-13 steps: - name: Checkout @@ -588,7 +588,7 @@ jobs: TSAN_OPTIONS: "halt_on_error=1" if: github.actor != 'restyled-io[bot]' && false - runs-on: macos-latest + runs-on: macos-13 steps: - name: Checkout From a2c18ac2e1247f620f96983aae0be02238b95ec9 Mon Sep 17 00:00:00 2001 From: Nivi Sarkar <55898241+nivi-apple@users.noreply.github.com> Date: Wed, 24 Apr 2024 14:28:00 -0700 Subject: [PATCH 022/124] Update the Dnssd srp resolve default timeout to 3 secs (#33150) --- src/platform/Darwin/DnssdImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/Darwin/DnssdImpl.cpp b/src/platform/Darwin/DnssdImpl.cpp index b80e5958310e68..a8c488f559c59f 100644 --- a/src/platform/Darwin/DnssdImpl.cpp +++ b/src/platform/Darwin/DnssdImpl.cpp @@ -39,7 +39,7 @@ constexpr char kLocalDot[] = "local."; constexpr char kSRPDot[] = "default.service.arpa."; // The extra time in milliseconds that we will wait for the resolution on the SRP domain to complete. -constexpr uint16_t kSRPTimeoutInMsec = 250; +constexpr uint16_t kSRPTimeoutInMsec = 3000; constexpr DNSServiceFlags kRegisterFlags = kDNSServiceFlagsNoAutoRename; constexpr DNSServiceFlags kBrowseFlags = kDNSServiceFlagsShareConnection; From 1bc65f759e481c20d2510574f80e6376259c9ed4 Mon Sep 17 00:00:00 2001 From: Farshid Tavakolizadeh <email@farshid.ws> Date: Wed, 24 Apr 2024 23:29:34 +0200 Subject: [PATCH 023/124] Update ZAP installation description (#31825) * Update ZAP installation description Remove arm64 since it is done automatically since https://github.com/project-chip/connectedhomeip/pull/26636 * Improve explanations, describe the CIDP process * Improve link texts --- docs/guides/BUILDING.md | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/docs/guides/BUILDING.md b/docs/guides/BUILDING.md index 12ae984ce7d586..3a7ecdd800924b 100644 --- a/docs/guides/BUILDING.md +++ b/docs/guides/BUILDING.md @@ -199,22 +199,27 @@ permanently, you need to make the following changes: ## Installing ZAP tool -`bootstrap.sh` will download a compatible ZAP tool version and set it up in -`$PATH`. If you want to install or use a different version of the tool, you may -download one from the ZAP project's -[Releases](https://github.com/project-chip/zap/releases) page. +For platforms defined in [`scripts/setup/zap.json`](/scripts/setup/zap.json), +`bootstrap.sh` will download a compatible ZAP tool version from CIPD and set it +up in `$PATH`. -### Linux ARM +ZAP releases are copied to CIPD by an automated bot. You can check if a release +was copied by looking at tags created for +[ZAP CIPD Packages](https://chrome-infra-packages.appspot.com/p/fuchsia/third_party/zap) +in various platforms. -Zap does not provide binary releases for arm. Rosetta solves this for Darwin, -however for linux arm you will have to use a local ZAP, generally through -setting `$ZAP_DEVELOPMENT_PATH` (see the section `Which zap to use` below). +### Custom ZAP + +If you want to install or use a different version of the tool, you may download +one from the [ZAP releases](https://github.com/project-chip/zap/releases) or +build it from source. The file `scripts/setup/zap.json` contains the version that CIPD would download, -so you can download a compatible version from the zap project -[Releases](https://github.com/project-chip/zap/releases). To checkout as source -code the corresponding tag should exist in the zap -[repository tags](https://github.com/project-chip/zap/tags) list. +so you can refer to it to find a compatible version. The version is also +maintained at [`scripts/setup/zap.version`](/scripts/setup/zap.version). + +To check out as source code, the corresponding tag should exist in the +[ZAP repository tags](https://github.com/project-chip/zap/tags) list. Example commands: From 742e65bdb95396cebce4c51c1f01dee22a3840f0 Mon Sep 17 00:00:00 2001 From: Justin Wood <woody@apple.com> Date: Wed, 24 Apr 2024 17:05:13 -0700 Subject: [PATCH 024/124] Revert "Update the Dnssd srp resolve default timeout to 3 secs" (#33151) This reverts commit a2c18ac2e1247f620f96983aae0be02238b95ec9. --- src/platform/Darwin/DnssdImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/Darwin/DnssdImpl.cpp b/src/platform/Darwin/DnssdImpl.cpp index a8c488f559c59f..b80e5958310e68 100644 --- a/src/platform/Darwin/DnssdImpl.cpp +++ b/src/platform/Darwin/DnssdImpl.cpp @@ -39,7 +39,7 @@ constexpr char kLocalDot[] = "local."; constexpr char kSRPDot[] = "default.service.arpa."; // The extra time in milliseconds that we will wait for the resolution on the SRP domain to complete. -constexpr uint16_t kSRPTimeoutInMsec = 3000; +constexpr uint16_t kSRPTimeoutInMsec = 250; constexpr DNSServiceFlags kRegisterFlags = kDNSServiceFlagsNoAutoRename; constexpr DNSServiceFlags kBrowseFlags = kDNSServiceFlagsShareConnection; From 72eab93d3b9fc4178b6695e55aa427d56e2e4372 Mon Sep 17 00:00:00 2001 From: Karsten Sperling <113487422+ksperling-apple@users.noreply.github.com> Date: Thu, 25 Apr 2024 19:15:14 +1200 Subject: [PATCH 025/124] Prevent unclean dealloc of SystemState (#33128) * Prevent unclean dealloc of SystemState Per current documentation calling Shutdown while any controller is alive is already prohibited. Also rename the recently-introduced isShutdown method to isShutDown. * Add comments and remove the VerifyOrDie() Upon closer reading Shutdown() was already guaranteed to be called and ensures that the reference count is 0 at that time, but the documentation was wrong. --- src/controller/CHIPDeviceControllerFactory.cpp | 6 +++++- src/controller/CHIPDeviceControllerFactory.h | 8 ++++++-- src/controller/CHIPDeviceControllerSystemState.h | 4 ++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/controller/CHIPDeviceControllerFactory.cpp b/src/controller/CHIPDeviceControllerFactory.cpp index 248e96cf237f3a..198d0c47c9f614 100644 --- a/src/controller/CHIPDeviceControllerFactory.cpp +++ b/src/controller/CHIPDeviceControllerFactory.cpp @@ -68,6 +68,8 @@ CHIP_ERROR DeviceControllerFactory::Init(FactoryInitParams params) mSessionResumptionStorage = params.sessionResumptionStorage; mEnableServerInteractions = params.enableServerInteractions; + // Initialize the system state. Note that it is left in a somewhat + // special state where it is initialized, but has a ref count of 0. CHIP_ERROR err = InitSystemState(params); return err; @@ -76,7 +78,7 @@ CHIP_ERROR DeviceControllerFactory::Init(FactoryInitParams params) CHIP_ERROR DeviceControllerFactory::ReinitSystemStateIfNecessary() { VerifyOrReturnError(mSystemState != nullptr, CHIP_ERROR_INCORRECT_STATE); - VerifyOrReturnError(mSystemState->IsShutdown(), CHIP_NO_ERROR); + VerifyOrReturnError(mSystemState->IsShutDown(), CHIP_NO_ERROR); FactoryInitParams params; params.systemLayer = mSystemState->SystemLayer(); @@ -404,6 +406,8 @@ void DeviceControllerFactory::Shutdown() { if (mSystemState != nullptr) { + // ~DeviceControllerSystemState will call Shutdown(), + // which in turn ensures that the reference count is 0. Platform::Delete(mSystemState); mSystemState = nullptr; } diff --git a/src/controller/CHIPDeviceControllerFactory.h b/src/controller/CHIPDeviceControllerFactory.h index d4e50e9c44b57a..474357ec4a4bde 100644 --- a/src/controller/CHIPDeviceControllerFactory.h +++ b/src/controller/CHIPDeviceControllerFactory.h @@ -172,7 +172,9 @@ class DeviceControllerFactory // Shuts down matter and frees the system state. // - // Must not be called while any controllers are alive. + // Must not be called while any controllers are alive, or while any calls + // to RetainSystemState or EnsureAndRetainSystemState have not been balanced + // by a call to ReleaseSystemState. void Shutdown(); CHIP_ERROR SetupController(SetupParams params, DeviceController & controller); @@ -195,7 +197,8 @@ class DeviceControllerFactory // all device controllers have ceased to exist. To avoid that, this method has been // created to permit retention of the underlying system state. // - // NB: The system state will still be freed in Shutdown() regardless of this call. + // Calls to this method must be balanced by calling ReleaseSystemState before Shutdown. + // void RetainSystemState(); // @@ -210,6 +213,7 @@ class DeviceControllerFactory bool ReleaseSystemState(); // Like RetainSystemState(), but will re-initialize the system state first if necessary. + // Calls to this method must be balanced by calling ReleaseSystemState before Shutdown. CHIP_ERROR EnsureAndRetainSystemState(); // diff --git a/src/controller/CHIPDeviceControllerSystemState.h b/src/controller/CHIPDeviceControllerSystemState.h index 8a3be25e591ae0..389bb557f6c0cc 100644 --- a/src/controller/CHIPDeviceControllerSystemState.h +++ b/src/controller/CHIPDeviceControllerSystemState.h @@ -169,7 +169,7 @@ class DeviceControllerSystemState { auto count = mRefCount++; VerifyOrDie(count < std::numeric_limits<decltype(count)>::max()); // overflow - VerifyOrDie(!IsShutdown()); // avoid zombie + VerifyOrDie(!IsShutDown()); // avoid zombie return this; }; @@ -197,7 +197,7 @@ class DeviceControllerSystemState mGroupDataProvider != nullptr && mReportScheduler != nullptr && mTimerDelegate != nullptr && mSessionKeystore != nullptr && mSessionResumptionStorage != nullptr && mBDXTransferServer != nullptr; }; - bool IsShutdown() { return mHaveShutDown; } + bool IsShutDown() { return mHaveShutDown; } System::Layer * SystemLayer() const { return mSystemLayer; }; Inet::EndPointManager<Inet::TCPEndPoint> * TCPEndPointManager() const { return mTCPEndPointManager; }; From 22188b60f18b4834cf0f3c13926c35b7b6cf0bfe Mon Sep 17 00:00:00 2001 From: Jakub Latusek <j.latusek@samsung.com> Date: Thu, 25 Apr 2024 10:06:05 +0200 Subject: [PATCH 026/124] credentials to pigweed (#33044) --- src/credentials/tests/BUILD.gn | 5 +- .../tests/TestCertificationDeclaration.cpp | 275 +-- src/credentials/tests/TestChipCert.cpp | 935 ++++---- .../tests/TestCommissionerDUTVectors.cpp | 89 +- .../TestDeviceAttestationConstruction.cpp | 218 +- .../TestDeviceAttestationCredentials.cpp | 165 +- src/credentials/tests/TestFabricTable.cpp | 2077 ++++++++--------- .../tests/TestGroupDataProvider.cpp | 1297 +++++----- .../TestPersistentStorageOpCertStore.cpp | 663 +++--- .../openiotsdk/unit-tests/test_components.txt | 3 +- .../unit-tests/test_components_nl.txt | 1 - 11 files changed, 2573 insertions(+), 3155 deletions(-) diff --git a/src/credentials/tests/BUILD.gn b/src/credentials/tests/BUILD.gn index 2de5d99a7bb091..766557d8126124 100644 --- a/src/credentials/tests/BUILD.gn +++ b/src/credentials/tests/BUILD.gn @@ -14,7 +14,6 @@ import("//build_overrides/build.gni") import("//build_overrides/chip.gni") -import("//build_overrides/nlunit_test.gni") import("${chip_root}/build/chip/chip_test_suite.gni") import("${chip_root}/build/chip/fuzz_test.gni") @@ -42,7 +41,7 @@ static_library("cert_test_vectors") { ] } -chip_test_suite_using_nltest("tests") { +chip_test_suite("tests") { output_name = "libCredentialsTest" output_dir = "${root_out_dir}/lib" @@ -71,8 +70,6 @@ chip_test_suite_using_nltest("tests") { "${chip_root}/src/credentials:default_attestation_verifier", "${chip_root}/src/lib/core", "${chip_root}/src/lib/support:testing", - "${chip_root}/src/lib/support:testing_nlunit", - "${nlunit_test_root}:nlunit-test", ] } diff --git a/src/credentials/tests/TestCertificationDeclaration.cpp b/src/credentials/tests/TestCertificationDeclaration.cpp index 45003548bd852e..45c8d5027bac93 100644 --- a/src/credentials/tests/TestCertificationDeclaration.cpp +++ b/src/credentials/tests/TestCertificationDeclaration.cpp @@ -30,10 +30,8 @@ #include <credentials/attestation_verifier/DefaultDeviceAttestationVerifier.h> #include <crypto/CHIPCryptoPAL.h> #include <lib/support/Span.h> -#include <lib/support/UnitTestExtendedAssertions.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> using namespace chip; using namespace chip::ASN1; @@ -263,59 +261,57 @@ static constexpr TestCase sTestCases[] = { ByteSpan(sTestCMS_CDContent02), ByteSpan(sTestCMS_SignedMessage02) }, }; -static void TestCD_EncodeDecode(nlTestSuite * inSuite, void * inContext) +TEST(TestCertificationDeclaration, TestCD_EncodeDecode) { for (const auto & testCase : sTestCases) { uint8_t encodedCertElemBuf[kCertificationElements_TLVEncodedMaxLength]; MutableByteSpan encodedCDPayload(encodedCertElemBuf); - NL_TEST_ASSERT(inSuite, EncodeCertificationElements(testCase.cdElements, encodedCDPayload) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, testCase.cdContent.data_equal(encodedCDPayload)); + EXPECT_EQ(EncodeCertificationElements(testCase.cdElements, encodedCDPayload), CHIP_NO_ERROR); + EXPECT_TRUE(testCase.cdContent.data_equal(encodedCDPayload)); CertificationElements decodedElements; - NL_TEST_ASSERT(inSuite, DecodeCertificationElements(encodedCDPayload, decodedElements) == CHIP_NO_ERROR); + EXPECT_EQ(DecodeCertificationElements(encodedCDPayload, decodedElements), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, decodedElements.FormatVersion == testCase.cdElements.FormatVersion); - NL_TEST_ASSERT(inSuite, decodedElements.VendorId == testCase.cdElements.VendorId); - NL_TEST_ASSERT(inSuite, decodedElements.ProductIdsCount == testCase.cdElements.ProductIdsCount); + EXPECT_EQ(decodedElements.FormatVersion, testCase.cdElements.FormatVersion); + EXPECT_EQ(decodedElements.VendorId, testCase.cdElements.VendorId); + EXPECT_EQ(decodedElements.ProductIdsCount, testCase.cdElements.ProductIdsCount); for (uint8_t j = 0; j < decodedElements.ProductIdsCount; j++) { - NL_TEST_ASSERT(inSuite, decodedElements.ProductIds[j] == testCase.cdElements.ProductIds[j]); + EXPECT_EQ(decodedElements.ProductIds[j], testCase.cdElements.ProductIds[j]); } - NL_TEST_ASSERT(inSuite, decodedElements.DeviceTypeId == testCase.cdElements.DeviceTypeId); - NL_TEST_ASSERT(inSuite, - memcmp(decodedElements.CertificateId, testCase.cdElements.CertificateId, kCertificateIdLength) == 0); - NL_TEST_ASSERT(inSuite, decodedElements.SecurityLevel == testCase.cdElements.SecurityLevel); - NL_TEST_ASSERT(inSuite, decodedElements.SecurityInformation == testCase.cdElements.SecurityInformation); - NL_TEST_ASSERT(inSuite, decodedElements.VersionNumber == testCase.cdElements.VersionNumber); - NL_TEST_ASSERT(inSuite, decodedElements.CertificationType == testCase.cdElements.CertificationType); - NL_TEST_ASSERT(inSuite, decodedElements.DACOriginVIDandPIDPresent == testCase.cdElements.DACOriginVIDandPIDPresent); + EXPECT_EQ(decodedElements.DeviceTypeId, testCase.cdElements.DeviceTypeId); + EXPECT_EQ(memcmp(decodedElements.CertificateId, testCase.cdElements.CertificateId, kCertificateIdLength), 0); + EXPECT_EQ(decodedElements.SecurityLevel, testCase.cdElements.SecurityLevel); + EXPECT_EQ(decodedElements.SecurityInformation, testCase.cdElements.SecurityInformation); + EXPECT_EQ(decodedElements.VersionNumber, testCase.cdElements.VersionNumber); + EXPECT_EQ(decodedElements.CertificationType, testCase.cdElements.CertificationType); + EXPECT_EQ(decodedElements.DACOriginVIDandPIDPresent, testCase.cdElements.DACOriginVIDandPIDPresent); if (decodedElements.DACOriginVIDandPIDPresent) { - NL_TEST_ASSERT(inSuite, decodedElements.DACOriginVendorId == testCase.cdElements.DACOriginVendorId); - NL_TEST_ASSERT(inSuite, decodedElements.DACOriginProductId == testCase.cdElements.DACOriginProductId); + EXPECT_EQ(decodedElements.DACOriginVendorId, testCase.cdElements.DACOriginVendorId); + EXPECT_EQ(decodedElements.DACOriginProductId, testCase.cdElements.DACOriginProductId); } - NL_TEST_ASSERT(inSuite, decodedElements.AuthorizedPAAListCount == testCase.cdElements.AuthorizedPAAListCount); + EXPECT_EQ(decodedElements.AuthorizedPAAListCount, testCase.cdElements.AuthorizedPAAListCount); for (uint8_t j = 0; j < decodedElements.AuthorizedPAAListCount; j++) { - NL_TEST_ASSERT( - inSuite, - memcmp(decodedElements.AuthorizedPAAList[j], testCase.cdElements.AuthorizedPAAList[j], kKeyIdentifierLength) == 0); + EXPECT_EQ(memcmp(decodedElements.AuthorizedPAAList[j], testCase.cdElements.AuthorizedPAAList[j], kKeyIdentifierLength), + 0); } } } -static void TestCD_EncodeDecode_Errors(nlTestSuite * inSuite, void * inContext) +TEST(TestCertificationDeclaration, TestCD_EncodeDecode_Errors) { uint8_t encodedCertElemBuf[kCertificationElements_TLVEncodedMaxLength]; MutableByteSpan encodedCDPayload(encodedCertElemBuf); - NL_TEST_ASSERT(inSuite, EncodeCertificationElements(sTestCMS_CertElements01, encodedCDPayload) == CHIP_NO_ERROR); + EXPECT_EQ(EncodeCertificationElements(sTestCMS_CertElements01, encodedCDPayload), CHIP_NO_ERROR); // Test Encode Error: CHIP_ERROR_BUFFER_TOO_SMALL // Provide a smaller buffer as an input. encodedCDPayload.reduce_size(encodedCDPayload.size() - 4); - NL_TEST_ASSERT(inSuite, EncodeCertificationElements(sTestCMS_CertElements01, encodedCDPayload) == CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_EQ(EncodeCertificationElements(sTestCMS_CertElements01, encodedCDPayload), CHIP_ERROR_BUFFER_TOO_SMALL); // Test Decode Error: CHIP_ERROR_INVALID_INTEGER_VALUE // Manually modified sTestCMS_CDContent01[]: updated VendorId element to 4-octet @@ -327,9 +323,7 @@ static void TestCD_EncodeDecode_Errors(nlTestSuite * inSuite, void * inContext) }; CertificationElements certElementsOut; - NL_TEST_ASSERT(inSuite, - DecodeCertificationElements(ByteSpan(sTestCMS_CDContent01_Err01), certElementsOut) == - CHIP_ERROR_INVALID_INTEGER_VALUE); + EXPECT_EQ(DecodeCertificationElements(ByteSpan(sTestCMS_CDContent01_Err01), certElementsOut), CHIP_ERROR_INVALID_INTEGER_VALUE); // Test Decode Error: CHIP_ERROR_UNEXPECTED_TLV_ELEMENT // Manually modified sTestCMS_CDContent01[]: switched ProductIds and DeviceTypeId elements tag (0x02 <--> 0x03) @@ -338,12 +332,11 @@ static void TestCD_EncodeDecode_Errors(nlTestSuite * inSuite, void * inContext) 0x49, 0x47, 0x32, 0x30, 0x31, 0x34, 0x31, 0x5a, 0x42, 0x33, 0x33, 0x30, 0x30, 0x30, 0x31, 0x2d, 0x32, 0x34, 0x24, 0x05, 0x00, 0x24, 0x06, 0x00, 0x25, 0x07, 0x94, 0x26, 0x24, 0x08, 0x00, 0x18 }; - NL_TEST_ASSERT(inSuite, - DecodeCertificationElements(ByteSpan(sTestCMS_CDContent01_Err02), certElementsOut) == - CHIP_ERROR_UNEXPECTED_TLV_ELEMENT); + EXPECT_EQ(DecodeCertificationElements(ByteSpan(sTestCMS_CDContent01_Err02), certElementsOut), + CHIP_ERROR_UNEXPECTED_TLV_ELEMENT); } -static void TestCD_CMSSignAndVerify(nlTestSuite * inSuite, void * inContext) +TEST(TestCertificationDeclaration, TestCD_CMSSignAndVerify) { ByteSpan cdContentIn(sTestCMS_CDContent01); ByteSpan cdContentOut; @@ -352,14 +345,14 @@ static void TestCD_CMSSignAndVerify(nlTestSuite * inSuite, void * inContext) uint8_t signedMessageBuf[kMaxCMSSignedCDMessage]; MutableByteSpan signedMessage(signedMessageBuf); - NL_TEST_ASSERT(inSuite, ExtractSKIDFromX509Cert(ByteSpan(sTestCMS_SignerCert), signerKeyId) == CHIP_NO_ERROR); + EXPECT_EQ(ExtractSKIDFromX509Cert(ByteSpan(sTestCMS_SignerCert), signerKeyId), CHIP_NO_ERROR); // Test with random key P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, CMS_Sign(cdContentIn, signerKeyId, keypair, signedMessage) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, CMS_Verify(signedMessage, keypair.Pubkey(), cdContentOut) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, cdContentIn.data_equal(cdContentOut)); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); + EXPECT_EQ(CMS_Sign(cdContentIn, signerKeyId, keypair, signedMessage), CHIP_NO_ERROR); + EXPECT_EQ(CMS_Verify(signedMessage, keypair.Pubkey(), cdContentOut), CHIP_NO_ERROR); + EXPECT_TRUE(cdContentIn.data_equal(cdContentOut)); // Test with known key P256Keypair keypair2; @@ -368,93 +361,89 @@ static void TestCD_CMSSignAndVerify(nlTestSuite * inSuite, void * inContext) serializedKeypair.SetLength(sizeof(sTestCMS_SignerSerializedKeypair)); cdContentIn = ByteSpan(sTestCMS_CDContent02); signedMessage = MutableByteSpan(signedMessageBuf); - NL_TEST_ASSERT(inSuite, keypair2.Deserialize(serializedKeypair) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, CMS_Sign(cdContentIn, signerKeyId, keypair2, signedMessage) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, CMS_Verify(signedMessage, keypair2.Pubkey(), cdContentOut) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, cdContentIn.data_equal(cdContentOut)); + EXPECT_EQ(keypair2.Deserialize(serializedKeypair), CHIP_NO_ERROR); + EXPECT_EQ(CMS_Sign(cdContentIn, signerKeyId, keypair2, signedMessage), CHIP_NO_ERROR); + EXPECT_EQ(CMS_Verify(signedMessage, keypair2.Pubkey(), cdContentOut), CHIP_NO_ERROR); + EXPECT_TRUE(cdContentIn.data_equal(cdContentOut)); } -static void TestCD_CMSVerifyAndExtract(nlTestSuite * inSuite, void * inContext) +TEST(TestCertificationDeclaration, TestCD_CMSVerifyAndExtract) { for (const auto & testCase : sTestCases) { // Verify using signer P256PublicKey ByteSpan cdContentOut; - NL_TEST_ASSERT(inSuite, - CMS_Verify(testCase.cdCMSSigned, P256PublicKey(testCase.signerPubkey), cdContentOut) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, testCase.cdContent.data_equal(cdContentOut)); + EXPECT_EQ(CMS_Verify(testCase.cdCMSSigned, P256PublicKey(testCase.signerPubkey), cdContentOut), CHIP_NO_ERROR); + EXPECT_TRUE(testCase.cdContent.data_equal(cdContentOut)); // Verify using signer X509 Certificate cdContentOut = ByteSpan(); - NL_TEST_ASSERT(inSuite, CMS_Verify(testCase.cdCMSSigned, testCase.signerCert, cdContentOut) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, testCase.cdContent.data_equal(cdContentOut)); + EXPECT_EQ(CMS_Verify(testCase.cdCMSSigned, testCase.signerCert, cdContentOut), CHIP_NO_ERROR); + EXPECT_TRUE(testCase.cdContent.data_equal(cdContentOut)); // Test CMS_ExtractCDContent() cdContentOut = ByteSpan(); - NL_TEST_ASSERT(inSuite, CMS_ExtractCDContent(testCase.cdCMSSigned, cdContentOut) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, testCase.cdContent.data_equal(cdContentOut)); + EXPECT_EQ(CMS_ExtractCDContent(testCase.cdCMSSigned, cdContentOut), CHIP_NO_ERROR); + EXPECT_TRUE(testCase.cdContent.data_equal(cdContentOut)); // Test CMS_ExtractKeyId() uint8_t signerKeyIdBuf[Crypto::kSubjectKeyIdentifierLength]; MutableByteSpan signerKeyId(signerKeyIdBuf); - NL_TEST_ASSERT(inSuite, ExtractSKIDFromX509Cert(testCase.signerCert, signerKeyId) == CHIP_NO_ERROR); + EXPECT_EQ(ExtractSKIDFromX509Cert(testCase.signerCert, signerKeyId), CHIP_NO_ERROR); ByteSpan signerKeyIdOut; - NL_TEST_ASSERT(inSuite, CMS_ExtractKeyId(testCase.cdCMSSigned, signerKeyIdOut) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, signerKeyId.data_equal(signerKeyIdOut)); + EXPECT_EQ(CMS_ExtractKeyId(testCase.cdCMSSigned, signerKeyIdOut), CHIP_NO_ERROR); + EXPECT_TRUE(signerKeyId.data_equal(signerKeyIdOut)); } } -static void TestCD_CertificationElementsDecoder(nlTestSuite * inSuite, void * inContext) +TEST(TestCertificationDeclaration, TestCD_CertificationElementsDecoder) { for (const auto & testCase : sTestCases) { uint8_t encodedCertElemBuf[kCertificationElements_TLVEncodedMaxLength]; MutableByteSpan encodedCDPayload(encodedCertElemBuf); - NL_TEST_ASSERT(inSuite, EncodeCertificationElements(testCase.cdElements, encodedCDPayload) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, testCase.cdContent.data_equal(encodedCDPayload)); + EXPECT_EQ(EncodeCertificationElements(testCase.cdElements, encodedCDPayload), CHIP_NO_ERROR); + EXPECT_TRUE(testCase.cdContent.data_equal(encodedCDPayload)); CertificationElementsWithoutPIDs certificationDeclarationContent; CertificationElementsDecoder certificationElementsDecoder; - NL_TEST_ASSERT(inSuite, DecodeCertificationElements(encodedCDPayload, certificationDeclarationContent) == CHIP_NO_ERROR); + EXPECT_EQ(DecodeCertificationElements(encodedCDPayload, certificationDeclarationContent), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certificationDeclarationContent.formatVersion == testCase.cdElements.FormatVersion); - NL_TEST_ASSERT(inSuite, certificationDeclarationContent.vendorId == testCase.cdElements.VendorId); + EXPECT_EQ(certificationDeclarationContent.formatVersion, testCase.cdElements.FormatVersion); + EXPECT_EQ(certificationDeclarationContent.vendorId, testCase.cdElements.VendorId); for (uint8_t j = 0; j < testCase.cdElements.ProductIdsCount; j++) { - NL_TEST_ASSERT(inSuite, - certificationElementsDecoder.IsProductIdIn(encodedCDPayload, testCase.cdElements.ProductIds[j])); + EXPECT_TRUE(certificationElementsDecoder.IsProductIdIn(encodedCDPayload, testCase.cdElements.ProductIds[j])); // now test for an unexistent ProductId - NL_TEST_ASSERT(inSuite, certificationElementsDecoder.IsProductIdIn(encodedCDPayload, 0x9000) == false); + EXPECT_FALSE(certificationElementsDecoder.IsProductIdIn(encodedCDPayload, 0x9000)); } - NL_TEST_ASSERT(inSuite, certificationDeclarationContent.deviceTypeId == testCase.cdElements.DeviceTypeId); - NL_TEST_ASSERT( - inSuite, - memcmp(certificationDeclarationContent.certificateId, testCase.cdElements.CertificateId, kCertificateIdLength) == 0); - NL_TEST_ASSERT(inSuite, certificationDeclarationContent.securityLevel == testCase.cdElements.SecurityLevel); - NL_TEST_ASSERT(inSuite, certificationDeclarationContent.securityInformation == testCase.cdElements.SecurityInformation); - NL_TEST_ASSERT(inSuite, certificationDeclarationContent.versionNumber == testCase.cdElements.VersionNumber); - NL_TEST_ASSERT(inSuite, certificationDeclarationContent.certificationType == testCase.cdElements.CertificationType); - NL_TEST_ASSERT(inSuite, - certificationDeclarationContent.dacOriginVIDandPIDPresent == testCase.cdElements.DACOriginVIDandPIDPresent); + EXPECT_EQ(certificationDeclarationContent.deviceTypeId, testCase.cdElements.DeviceTypeId); + EXPECT_EQ(memcmp(certificationDeclarationContent.certificateId, testCase.cdElements.CertificateId, kCertificateIdLength), + 0); + EXPECT_EQ(certificationDeclarationContent.securityLevel, testCase.cdElements.SecurityLevel); + EXPECT_EQ(certificationDeclarationContent.securityInformation, testCase.cdElements.SecurityInformation); + EXPECT_EQ(certificationDeclarationContent.versionNumber, testCase.cdElements.VersionNumber); + EXPECT_EQ(certificationDeclarationContent.certificationType, testCase.cdElements.CertificationType); + EXPECT_EQ(certificationDeclarationContent.dacOriginVIDandPIDPresent, testCase.cdElements.DACOriginVIDandPIDPresent); if (certificationDeclarationContent.dacOriginVIDandPIDPresent) { - NL_TEST_ASSERT(inSuite, certificationDeclarationContent.dacOriginVendorId == testCase.cdElements.DACOriginVendorId); - NL_TEST_ASSERT(inSuite, certificationDeclarationContent.dacOriginProductId == testCase.cdElements.DACOriginProductId); + EXPECT_EQ(certificationDeclarationContent.dacOriginVendorId, testCase.cdElements.DACOriginVendorId); + EXPECT_EQ(certificationDeclarationContent.dacOriginProductId, testCase.cdElements.DACOriginProductId); } if (testCase.cdElements.AuthorizedPAAListCount > 0) { - NL_TEST_ASSERT(inSuite, certificationDeclarationContent.authorizedPAAListPresent); + EXPECT_TRUE(certificationDeclarationContent.authorizedPAAListPresent); } else { - NL_TEST_ASSERT(inSuite, !certificationDeclarationContent.authorizedPAAListPresent); + EXPECT_FALSE(certificationDeclarationContent.authorizedPAAListPresent); } } } -static void TestCD_EncodeDecode_Random(nlTestSuite * inSuite, void * inContext) +TEST(TestCertificationDeclaration, TestCD_EncodeDecode_Random) { CertificationElements randomElements = { .FormatVersion = 0x6F, .VendorId = 0x88EA, @@ -489,97 +478,95 @@ static void TestCD_EncodeDecode_Random(nlTestSuite * inSuite, void * inContext) MutableByteSpan encodedCDPayload(encodedCertElemBuf); CertificationElements decodedElements; - NL_TEST_ASSERT(inSuite, EncodeCertificationElements(randomElements, encodedCDPayload) == CHIP_NO_ERROR); + EXPECT_EQ(EncodeCertificationElements(randomElements, encodedCDPayload), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, DecodeCertificationElements(encodedCDPayload, decodedElements) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, decodedElements.FormatVersion == randomElements.FormatVersion); - NL_TEST_ASSERT(inSuite, decodedElements.VendorId == randomElements.VendorId); - NL_TEST_ASSERT(inSuite, decodedElements.ProductIdsCount == randomElements.ProductIdsCount); + EXPECT_EQ(DecodeCertificationElements(encodedCDPayload, decodedElements), CHIP_NO_ERROR); + EXPECT_EQ(decodedElements.FormatVersion, randomElements.FormatVersion); + EXPECT_EQ(decodedElements.VendorId, randomElements.VendorId); + EXPECT_EQ(decodedElements.ProductIdsCount, randomElements.ProductIdsCount); for (uint8_t j = 0; j < decodedElements.ProductIdsCount; j++) { - NL_TEST_ASSERT(inSuite, decodedElements.ProductIds[j] == randomElements.ProductIds[j]); + EXPECT_EQ(decodedElements.ProductIds[j], randomElements.ProductIds[j]); } - NL_TEST_ASSERT(inSuite, decodedElements.DeviceTypeId == randomElements.DeviceTypeId); - NL_TEST_ASSERT(inSuite, memcmp(decodedElements.CertificateId, randomElements.CertificateId, kCertificateIdLength) == 0); - NL_TEST_ASSERT(inSuite, decodedElements.SecurityLevel == randomElements.SecurityLevel); - NL_TEST_ASSERT(inSuite, decodedElements.SecurityInformation == randomElements.SecurityInformation); - NL_TEST_ASSERT(inSuite, decodedElements.VersionNumber == randomElements.VersionNumber); - NL_TEST_ASSERT(inSuite, decodedElements.CertificationType == randomElements.CertificationType); - NL_TEST_ASSERT(inSuite, decodedElements.DACOriginVIDandPIDPresent == randomElements.DACOriginVIDandPIDPresent); + EXPECT_EQ(decodedElements.DeviceTypeId, randomElements.DeviceTypeId); + EXPECT_EQ(memcmp(decodedElements.CertificateId, randomElements.CertificateId, kCertificateIdLength), 0); + EXPECT_EQ(decodedElements.SecurityLevel, randomElements.SecurityLevel); + EXPECT_EQ(decodedElements.SecurityInformation, randomElements.SecurityInformation); + EXPECT_EQ(decodedElements.VersionNumber, randomElements.VersionNumber); + EXPECT_EQ(decodedElements.CertificationType, randomElements.CertificationType); + EXPECT_EQ(decodedElements.DACOriginVIDandPIDPresent, randomElements.DACOriginVIDandPIDPresent); if (decodedElements.DACOriginVIDandPIDPresent) { - NL_TEST_ASSERT(inSuite, decodedElements.DACOriginVendorId == randomElements.DACOriginVendorId); - NL_TEST_ASSERT(inSuite, decodedElements.DACOriginProductId == randomElements.DACOriginProductId); + EXPECT_EQ(decodedElements.DACOriginVendorId, randomElements.DACOriginVendorId); + EXPECT_EQ(decodedElements.DACOriginProductId, randomElements.DACOriginProductId); } - NL_TEST_ASSERT(inSuite, decodedElements.AuthorizedPAAListCount == randomElements.AuthorizedPAAListCount); + EXPECT_EQ(decodedElements.AuthorizedPAAListCount, randomElements.AuthorizedPAAListCount); for (uint8_t j = 0; j < decodedElements.AuthorizedPAAListCount; j++) { - NL_TEST_ASSERT( - inSuite, memcmp(decodedElements.AuthorizedPAAList[j], randomElements.AuthorizedPAAList[j], kKeyIdentifierLength) == 0); + EXPECT_EQ(memcmp(decodedElements.AuthorizedPAAList[j], randomElements.AuthorizedPAAList[j], kKeyIdentifierLength), 0); } CertificationElementsWithoutPIDs decodedElements2; CertificationElementsDecoder cdElementsDecoder; - NL_TEST_ASSERT(inSuite, DecodeCertificationElements(encodedCDPayload, decodedElements2) == CHIP_NO_ERROR); + EXPECT_EQ(DecodeCertificationElements(encodedCDPayload, decodedElements2), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, decodedElements2.formatVersion == randomElements.FormatVersion); - NL_TEST_ASSERT(inSuite, decodedElements2.vendorId == randomElements.VendorId); + EXPECT_EQ(decodedElements2.formatVersion, randomElements.FormatVersion); + EXPECT_EQ(decodedElements2.vendorId, randomElements.VendorId); for (uint8_t j = 0; j < randomElements.ProductIdsCount; j++) { - NL_TEST_ASSERT(inSuite, cdElementsDecoder.IsProductIdIn(encodedCDPayload, randomElements.ProductIds[j])); + EXPECT_TRUE(cdElementsDecoder.IsProductIdIn(encodedCDPayload, randomElements.ProductIds[j])); // now test for an unexistent ProductId - NL_TEST_ASSERT(inSuite, cdElementsDecoder.IsProductIdIn(encodedCDPayload, pid++) == false); + EXPECT_FALSE(cdElementsDecoder.IsProductIdIn(encodedCDPayload, pid++)); } - NL_TEST_ASSERT(inSuite, decodedElements2.deviceTypeId == randomElements.DeviceTypeId); - NL_TEST_ASSERT(inSuite, memcmp(decodedElements2.certificateId, randomElements.CertificateId, kCertificateIdLength) == 0); - NL_TEST_ASSERT(inSuite, decodedElements2.securityLevel == randomElements.SecurityLevel); - NL_TEST_ASSERT(inSuite, decodedElements2.securityInformation == randomElements.SecurityInformation); - NL_TEST_ASSERT(inSuite, decodedElements2.versionNumber == randomElements.VersionNumber); - NL_TEST_ASSERT(inSuite, decodedElements2.certificationType == randomElements.CertificationType); - NL_TEST_ASSERT(inSuite, decodedElements2.dacOriginVIDandPIDPresent == randomElements.DACOriginVIDandPIDPresent); + EXPECT_EQ(decodedElements2.deviceTypeId, randomElements.DeviceTypeId); + EXPECT_EQ(memcmp(decodedElements2.certificateId, randomElements.CertificateId, kCertificateIdLength), 0); + EXPECT_EQ(decodedElements2.securityLevel, randomElements.SecurityLevel); + EXPECT_EQ(decodedElements2.securityInformation, randomElements.SecurityInformation); + EXPECT_EQ(decodedElements2.versionNumber, randomElements.VersionNumber); + EXPECT_EQ(decodedElements2.certificationType, randomElements.CertificationType); + EXPECT_EQ(decodedElements2.dacOriginVIDandPIDPresent, randomElements.DACOriginVIDandPIDPresent); if (decodedElements2.dacOriginVIDandPIDPresent) { - NL_TEST_ASSERT(inSuite, decodedElements2.dacOriginVendorId == randomElements.DACOriginVendorId); - NL_TEST_ASSERT(inSuite, decodedElements2.dacOriginProductId == randomElements.DACOriginProductId); + EXPECT_EQ(decodedElements2.dacOriginVendorId, randomElements.DACOriginVendorId); + EXPECT_EQ(decodedElements2.dacOriginProductId, randomElements.DACOriginProductId); } - NL_TEST_ASSERT(inSuite, decodedElements2.authorizedPAAListPresent); + EXPECT_TRUE(decodedElements2.authorizedPAAListPresent); for (uint8_t j = 0; j < randomElements.AuthorizedPAAListCount; j++) { - NL_TEST_ASSERT(inSuite, - cdElementsDecoder.HasAuthorizedPAA(encodedCDPayload, ByteSpan(randomElements.AuthorizedPAAList[j]))); + EXPECT_TRUE(cdElementsDecoder.HasAuthorizedPAA(encodedCDPayload, ByteSpan(randomElements.AuthorizedPAAList[j]))); // now test for an unexistent PAA kid[(kKeyIdentifierLength - 1 - j) % kKeyIdentifierLength] ^= 0x5A; - NL_TEST_ASSERT(inSuite, cdElementsDecoder.HasAuthorizedPAA(encodedCDPayload, ByteSpan(kid)) == false); + EXPECT_FALSE(cdElementsDecoder.HasAuthorizedPAA(encodedCDPayload, ByteSpan(kid))); } } -static void TestCD_DefaultCdTrustStore(nlTestSuite * inSuite, void * inContext) +TEST(TestCertificationDeclaration, TestCD_DefaultCdTrustStore) { chip::Credentials::CsaCdKeysTrustStore trustStore; // Make sure that for an untrusted CD, whose key is not in truststore, we cannot find the key. { ByteSpan signerKeyIdOut; - NL_TEST_ASSERT_SUCCESS(inSuite, CMS_ExtractKeyId(ByteSpan(gUntrustedCd), signerKeyIdOut)); - NL_TEST_ASSERT(inSuite, !trustStore.IsCdTestKey(signerKeyIdOut)); + EXPECT_EQ(CMS_ExtractKeyId(ByteSpan(gUntrustedCd), signerKeyIdOut), CHIP_NO_ERROR); + EXPECT_FALSE(trustStore.IsCdTestKey(signerKeyIdOut)); P256PublicKey pubKey; - NL_TEST_ASSERT(inSuite, CHIP_ERROR_KEY_NOT_FOUND == trustStore.LookupVerifyingKey(signerKeyIdOut, pubKey)); + EXPECT_EQ(CHIP_ERROR_KEY_NOT_FOUND, trustStore.LookupVerifyingKey(signerKeyIdOut, pubKey)); } // Verify that a payload known to use the test key passes verification w/ default truststore { const auto & testCase = sTestCases[0]; ByteSpan signerKeyIdOut; - NL_TEST_ASSERT_SUCCESS(inSuite, CMS_ExtractKeyId(testCase.cdCMSSigned, signerKeyIdOut)); - NL_TEST_ASSERT(inSuite, trustStore.IsCdTestKey(signerKeyIdOut)); + EXPECT_EQ(CMS_ExtractKeyId(testCase.cdCMSSigned, signerKeyIdOut), CHIP_NO_ERROR); + EXPECT_TRUE(trustStore.IsCdTestKey(signerKeyIdOut)); P256PublicKey pubKey; ByteSpan cdContentOut; - NL_TEST_ASSERT_SUCCESS(inSuite, trustStore.LookupVerifyingKey(signerKeyIdOut, pubKey)); + EXPECT_EQ(trustStore.LookupVerifyingKey(signerKeyIdOut, pubKey), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, CMS_Verify(testCase.cdCMSSigned, pubKey, cdContentOut) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, testCase.cdContent.data_equal(cdContentOut)); + EXPECT_EQ(CMS_Verify(testCase.cdCMSSigned, pubKey, cdContentOut), CHIP_NO_ERROR); + EXPECT_TRUE(testCase.cdContent.data_equal(cdContentOut)); } // Verify that after adding the verifying key to the trust store, it is now possible to @@ -587,49 +574,25 @@ static void TestCD_DefaultCdTrustStore(nlTestSuite * inSuite, void * inContext) { P256PublicKey pubKey; ByteSpan cdContentOut; - NL_TEST_ASSERT_SUCCESS(inSuite, trustStore.AddTrustedKey(ByteSpan(gUntrustedCdKid), gUntrustedCdVerifyingKey)); + EXPECT_EQ(trustStore.AddTrustedKey(ByteSpan(gUntrustedCdKid), gUntrustedCdVerifyingKey), CHIP_NO_ERROR); ByteSpan signerKeyIdOut; - NL_TEST_ASSERT_SUCCESS(inSuite, CMS_ExtractKeyId(ByteSpan(gUntrustedCd), signerKeyIdOut)); - NL_TEST_ASSERT(inSuite, signerKeyIdOut.data_equal(ByteSpan(gUntrustedCdKid))); + EXPECT_EQ(CMS_ExtractKeyId(ByteSpan(gUntrustedCd), signerKeyIdOut), CHIP_NO_ERROR); + EXPECT_TRUE(signerKeyIdOut.data_equal(ByteSpan(gUntrustedCdKid))); - NL_TEST_ASSERT_SUCCESS(inSuite, trustStore.LookupVerifyingKey(signerKeyIdOut, pubKey)); - NL_TEST_ASSERT(inSuite, pubKey.Matches(gUntrustedCdVerifyingKey)); + EXPECT_EQ(trustStore.LookupVerifyingKey(signerKeyIdOut, pubKey), CHIP_NO_ERROR); + EXPECT_TRUE(pubKey.Matches(gUntrustedCdVerifyingKey)); - NL_TEST_ASSERT_SUCCESS(inSuite, CMS_Verify(ByteSpan(gUntrustedCd), pubKey, cdContentOut)); + EXPECT_EQ(CMS_Verify(ByteSpan(gUntrustedCd), pubKey, cdContentOut), CHIP_NO_ERROR); } // Verify that untrusted certificate key cannot be added to the trust store. { - NL_TEST_ASSERT(inSuite, CHIP_ERROR_INVALID_ARGUMENT == trustStore.AddTrustedKey(ByteSpan(gUntrustedCdCert))); + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, trustStore.AddTrustedKey(ByteSpan(gUntrustedCdCert))); } // Verify that trusted certificate key can be added to the trust store. { - NL_TEST_ASSERT_SUCCESS(inSuite, trustStore.AddTrustedKey(ByteSpan(gCdSigningCert001))); + EXPECT_EQ(trustStore.AddTrustedKey(ByteSpan(gCdSigningCert001)), CHIP_NO_ERROR); } } - -#define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn) -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { NL_TEST_DEF_FN(TestCD_EncodeDecode), - NL_TEST_DEF_FN(TestCD_EncodeDecode_Errors), - NL_TEST_DEF_FN(TestCD_CMSSignAndVerify), - NL_TEST_DEF_FN(TestCD_CMSVerifyAndExtract), - NL_TEST_DEF_FN(TestCD_CertificationElementsDecoder), - NL_TEST_DEF_FN(TestCD_EncodeDecode_Random), - NL_TEST_DEF_FN(TestCD_DefaultCdTrustStore), - NL_TEST_SENTINEL() }; - -int TestCertificationDeclaration() -{ - nlTestSuite theSuite = { "CHIP Certification Declaration tests", &sTests[0], nullptr, nullptr }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestCertificationDeclaration); diff --git a/src/credentials/tests/TestChipCert.cpp b/src/credentials/tests/TestChipCert.cpp index 2b0319f8ebb827..9a6e50b58561fb 100644 --- a/src/credentials/tests/TestChipCert.cpp +++ b/src/credentials/tests/TestChipCert.cpp @@ -33,10 +33,8 @@ #include <lib/core/TLV.h> #include <lib/support/CHIPMem.h> #include <lib/support/CodeUtils.h> -#include <lib/support/UnitTestExtendedAssertions.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> #include "CHIPCert_error_test_vectors.h" #include "CHIPCert_test_vectors.h" @@ -163,7 +161,13 @@ static void ClearTimeSource(ValidationContext & validContext) validContext.mEffectiveTime = EffectiveTime{}; } -static void TestChipCert_ChipToX509(nlTestSuite * inSuite, void * inContext) +struct TestChipCert : public ::testing::Test +{ + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestChipCert, TestChipCert_ChipToX509) { CHIP_ERROR err; ByteSpan inCert; @@ -175,23 +179,23 @@ static void TestChipCert_ChipToX509(nlTestSuite * inSuite, void * inContext) TestCert certType = gTestCerts[i]; err = GetTestCert(certType, sNullLoadFlag, inCert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = GetTestCert(certType, sDerFormFlag, expectedOutCert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); MutableByteSpan outCert(outCertBuf); err = ConvertChipCertToX509Cert(inCert, outCert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, expectedOutCert.data_equal(outCert)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(expectedOutCert.data_equal(outCert)); } // Error Case: MutableByteSpan outCert(outCertBuf); err = ConvertChipCertToX509Cert(sTestCert_Node01_01_Err01_Chip, outCert); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_TLV_TAG); + EXPECT_EQ(err, CHIP_ERROR_INVALID_TLV_TAG); } -static void TestChipCert_ChipToX509_ErrorCases(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_ChipToX509_ErrorCases) { CHIP_ERROR err; uint8_t outCertBuf[kMaxDERCertLength]; @@ -201,22 +205,22 @@ static void TestChipCert_ChipToX509_ErrorCases(nlTestSuite * inSuite, void * inC MutableByteSpan outCert(outCertBuf); err = ConvertChipCertToX509Cert(chipCert, outCert); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); } } -static void TestChipCert_ChipCertLoad_ErrorCases(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_ChipCertLoad_ErrorCases) { CHIP_ERROR err; ChipCertificateSet certSet; err = certSet.Init(1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); for (auto chipCert : gTestCert_ChipCertLoad_ErrorCases) { err = certSet.LoadCert(chipCert, sNullDecodeFlag); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); certSet.Clear(); } @@ -224,34 +228,34 @@ static void TestChipCert_ChipCertLoad_ErrorCases(nlTestSuite * inSuite, void * i certSet.Release(); } -static void TestChipCert_ValidateChipRCAC_ErrorCases(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_ValidateChipRCAC_ErrorCases) { CHIP_ERROR err; for (auto chipCert : gTestCert_ValidateChipRCAC_ErrorCases) { err = ValidateChipRCAC(chipCert); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); } } -static void TestChipCert_GetCertType_ErrorCases(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_GetCertType_ErrorCases) { CHIP_ERROR err; ChipCertificateSet certSet; err = certSet.Init(1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); for (auto chipCert : gTestCert_GetCertType_ErrorCases) { CertType certType; err = certSet.LoadCert(chipCert, sNullDecodeFlag); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = certSet.GetCertSet()->mSubjectDN.GetCertType(certType); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR || certType == CertType::kNotSpecified); + EXPECT_TRUE(err != CHIP_NO_ERROR || certType == CertType::kNotSpecified); certSet.Clear(); } @@ -259,7 +263,7 @@ static void TestChipCert_GetCertType_ErrorCases(nlTestSuite * inSuite, void * in certSet.Release(); } -static void TestChipCert_X509ToChip(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_X509ToChip) { CHIP_ERROR err; ByteSpan inCert; @@ -271,18 +275,18 @@ static void TestChipCert_X509ToChip(nlTestSuite * inSuite, void * inContext) TestCert certType = gTestCerts[i]; err = GetTestCert(certType, sDerFormFlag, inCert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = GetTestCert(certType, sNullLoadFlag, expectedOutCert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); MutableByteSpan outCert(outCertBuf); err = ConvertX509CertToChipCert(inCert, outCert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, expectedOutCert.data_equal(outCert)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(expectedOutCert.data_equal(outCert)); } } -static void TestChipCert_X509ToChip_ErrorCases(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_X509ToChip_ErrorCases) { CHIP_ERROR err; uint8_t outCertBuf[kMaxCHIPCertLength]; @@ -292,11 +296,11 @@ static void TestChipCert_X509ToChip_ErrorCases(nlTestSuite * inSuite, void * inC MutableByteSpan outCert(outCertBuf); err = ConvertX509CertToChipCert(derCert, outCert); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); } } -static void TestChipCert_ChipDN(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_ChipDN) { const static char noc_rdn[] = "Test NOC"; const static char noc_rdn2[] = "John"; @@ -305,51 +309,51 @@ static void TestChipCert_ChipDN(nlTestSuite * inSuite, void * inContext) ChipDN chip_dn; CertType certType = CertType::kFirmwareSigning; // Start with non-default value - NL_TEST_ASSERT(inSuite, chip_dn.IsEmpty()); - NL_TEST_ASSERT(inSuite, chip_dn.RDNCount() == 0); - NL_TEST_ASSERT(inSuite, chip_dn.GetCertType(certType) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, chip_dn.IsEmpty() == true); - NL_TEST_ASSERT(inSuite, certType == CertType::kNotSpecified); + EXPECT_TRUE(chip_dn.IsEmpty()); + EXPECT_EQ(chip_dn.RDNCount(), 0); + EXPECT_EQ(chip_dn.GetCertType(certType), CHIP_NO_ERROR); + EXPECT_TRUE(chip_dn.IsEmpty()); + EXPECT_EQ(certType, CertType::kNotSpecified); - NL_TEST_ASSERT(inSuite, chip_dn.AddAttribute_CommonName(CharSpan(noc_rdn, strlen(noc_rdn)), false) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, chip_dn.AddAttribute_MatterNodeId(0xAAAABBBBCCCCDDDD) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, chip_dn.AddAttribute_MatterFabricId(0xFAB00000FAB00001) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, chip_dn.AddAttribute_GivenName(CharSpan(noc_rdn2, strlen(noc_rdn2)), true) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, chip_dn.AddCATs(noc_cats) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, chip_dn.RDNCount() == 5); + EXPECT_EQ(chip_dn.AddAttribute_CommonName(CharSpan(noc_rdn, strlen(noc_rdn)), false), CHIP_NO_ERROR); + EXPECT_EQ(chip_dn.AddAttribute_MatterNodeId(0xAAAABBBBCCCCDDDD), CHIP_NO_ERROR); + EXPECT_EQ(chip_dn.AddAttribute_MatterFabricId(0xFAB00000FAB00001), CHIP_NO_ERROR); + EXPECT_EQ(chip_dn.AddAttribute_GivenName(CharSpan(noc_rdn2, strlen(noc_rdn2)), true), CHIP_NO_ERROR); + EXPECT_EQ(chip_dn.AddCATs(noc_cats), CHIP_NO_ERROR); + EXPECT_EQ(chip_dn.RDNCount(), 5); - NL_TEST_ASSERT(inSuite, chip_dn.AddAttribute_GivenName(CharSpan(noc_rdn2, strlen(noc_rdn2)), true) == CHIP_ERROR_NO_MEMORY); - NL_TEST_ASSERT(inSuite, chip_dn.RDNCount() == 5); + EXPECT_EQ(chip_dn.AddAttribute_GivenName(CharSpan(noc_rdn2, strlen(noc_rdn2)), true), CHIP_ERROR_NO_MEMORY); + EXPECT_EQ(chip_dn.RDNCount(), 5); - NL_TEST_ASSERT(inSuite, chip_dn.GetCertType(certType) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certType == CertType::kNode); + EXPECT_EQ(chip_dn.GetCertType(certType), CHIP_NO_ERROR); + EXPECT_EQ(certType, CertType::kNode); uint64_t certId; - NL_TEST_ASSERT(inSuite, chip_dn.GetCertChipId(certId) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certId == 0xAAAABBBBCCCCDDDD); + EXPECT_EQ(chip_dn.GetCertChipId(certId), CHIP_NO_ERROR); + EXPECT_EQ(certId, 0xAAAABBBBCCCCDDDD); uint64_t fabricId; - NL_TEST_ASSERT(inSuite, chip_dn.GetCertFabricId(fabricId) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, fabricId == 0xFAB00000FAB00001); + EXPECT_EQ(chip_dn.GetCertFabricId(fabricId), CHIP_NO_ERROR); + EXPECT_EQ(fabricId, 0xFAB00000FAB00001); chip_dn.Clear(); - NL_TEST_ASSERT(inSuite, chip_dn.GetCertType(certType) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, chip_dn.IsEmpty() == true); - NL_TEST_ASSERT(inSuite, certType == CertType::kNotSpecified); + EXPECT_EQ(chip_dn.GetCertType(certType), CHIP_NO_ERROR); + EXPECT_TRUE(chip_dn.IsEmpty()); + EXPECT_EQ(certType, CertType::kNotSpecified); CATValues noc_cats2; chip::CATValues::Serialized serializedCATs; - NL_TEST_ASSERT(inSuite, noc_cats.Serialize(serializedCATs) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, noc_cats2.Deserialize(serializedCATs) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(&noc_cats, &noc_cats2, chip::CATValues::kSerializedLength) == 0); + EXPECT_EQ(noc_cats.Serialize(serializedCATs), CHIP_NO_ERROR); + EXPECT_EQ(noc_cats2.Deserialize(serializedCATs), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(&noc_cats, &noc_cats2, chip::CATValues::kSerializedLength), 0); CATValues noc_cats3 = { { 0xABCD0001, 0xFFEEAA00, 0x0001F012 } }; - NL_TEST_ASSERT(inSuite, noc_cats3.Serialize(serializedCATs) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, noc_cats2.Deserialize(serializedCATs) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(&noc_cats3, &noc_cats2, chip::CATValues::kSerializedLength) == 0); + EXPECT_EQ(noc_cats3.Serialize(serializedCATs), CHIP_NO_ERROR); + EXPECT_EQ(noc_cats2.Deserialize(serializedCATs), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(&noc_cats3, &noc_cats2, chip::CATValues::kSerializedLength), 0); } -static void TestChipCert_CertValidation(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_CertValidation) { CHIP_ERROR err; ChipCertificateSet certSet; @@ -512,29 +516,28 @@ static void TestChipCert_CertValidation(nlTestSuite * inSuite, void * inContext) { const ChipCertificateData * resultCert = nullptr; err = certSet.Init(kMaxCertsPerTestCase); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); for (auto inputCert : testCase.InputCerts) { if (inputCert.Type != TestCert::kNone) { err = LoadTestCert(certSet, inputCert.Type, inputCert.LoadFlags, inputCert.DecodeFlags); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); } } // Make sure the test case is valid. - NL_TEST_ASSERT(inSuite, testCase.mSubjectCertIndex >= 0 && testCase.mSubjectCertIndex < certSet.GetCertCount()); + EXPECT_TRUE(testCase.mSubjectCertIndex >= 0 && testCase.mSubjectCertIndex < certSet.GetCertCount()); if (testCase.mExpectedResult == CHIP_NO_ERROR) { - NL_TEST_ASSERT(inSuite, testCase.mExpectedCertIndex >= 0 && testCase.mExpectedCertIndex < certSet.GetCertCount()); - NL_TEST_ASSERT(inSuite, - testCase.mExpectedTrustAnchorIndex >= 0 && testCase.mExpectedTrustAnchorIndex < certSet.GetCertCount()); + EXPECT_TRUE(testCase.mExpectedCertIndex >= 0 && testCase.mExpectedCertIndex < certSet.GetCertCount()); + EXPECT_TRUE(testCase.mExpectedTrustAnchorIndex >= 0 && testCase.mExpectedTrustAnchorIndex < certSet.GetCertCount()); } // Initialize the validation context. validContext.Reset(); err = SetCurrentTime(validContext, 2021, 1, 1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); validContext.mRequiredKeyUsages.Set(KeyUsageFlags::kDigitalSignature); validContext.mRequiredKeyPurposes.Set(KeyPurposeFlags::kServerAuth); validContext.mRequiredKeyPurposes.Set(KeyPurposeFlags::kClientAuth); @@ -546,16 +549,16 @@ static void TestChipCert_CertValidation(nlTestSuite * inSuite, void * inContext) // Invoke the FindValidCert() method (the method being tested). err = certSet.FindValidCert(subjectDN, subjectKeyId, validContext, &resultCert); - NL_TEST_ASSERT(inSuite, err == testCase.mExpectedResult); + EXPECT_EQ(err, testCase.mExpectedResult); // If the test case is expected to be successful... if (err == CHIP_NO_ERROR) { // Verify that the method found the correct certificate. - NL_TEST_ASSERT(inSuite, resultCert == &certSet.GetCertSet()[testCase.mExpectedCertIndex]); + EXPECT_EQ(resultCert, &certSet.GetCertSet()[testCase.mExpectedCertIndex]); // Verify that the method selected the correct trust anchor. - NL_TEST_ASSERT(inSuite, validContext.mTrustAnchor == &certSet.GetCertSet()[testCase.mExpectedTrustAnchorIndex]); + EXPECT_EQ(validContext.mTrustAnchor, &certSet.GetCertSet()[testCase.mExpectedTrustAnchorIndex]); } // Clear the certificate set. @@ -563,17 +566,17 @@ static void TestChipCert_CertValidation(nlTestSuite * inSuite, void * inContext) } } -static void TestChipCert_CertValidTime(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_CertValidTime) { CHIP_ERROR err; ChipCertificateSet certSet; ValidationContext validContext; err = certSet.Init(kStandardCertsCount); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = LoadTestCertSet01(certSet); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); validContext.Reset(); validContext.mRequiredKeyUsages.Set(KeyUsageFlags::kDigitalSignature); @@ -588,248 +591,248 @@ static void TestChipCert_CertValidTime(nlTestSuite * inSuite, void * inContext) // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictCertificateValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimeValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Current time before certificate validity period. err = SetCurrentTime(validContext, 2020, 1, 3); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_NOT_VALID_YET); + EXPECT_EQ(err, CHIP_ERROR_CERT_NOT_VALID_YET); // Strict policy validContext.mValidityPolicy = &strictCertificateValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_NOT_VALID_YET); + EXPECT_EQ(err, CHIP_ERROR_CERT_NOT_VALID_YET); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimeValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_NOT_VALID_YET); + EXPECT_EQ(err, CHIP_ERROR_CERT_NOT_VALID_YET); // Current time 1 second before validity period. err = SetCurrentTime(validContext, 2020, 10, 15, 14, 23, 42); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_NOT_VALID_YET); + EXPECT_EQ(err, CHIP_ERROR_CERT_NOT_VALID_YET); // Strict policy validContext.mValidityPolicy = &strictCertificateValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_NOT_VALID_YET); + EXPECT_EQ(err, CHIP_ERROR_CERT_NOT_VALID_YET); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimeValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_NOT_VALID_YET); + EXPECT_EQ(err, CHIP_ERROR_CERT_NOT_VALID_YET); // Current time 1st second of validity period. err = SetCurrentTime(validContext, 2020, 10, 15, 14, 23, 43); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictCertificateValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimeValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Current time within validity period. err = SetCurrentTime(validContext, 2022, 02, 23, 12, 30, 01); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictCertificateValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimeValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Current time at last second of validity period. err = SetCurrentTime(validContext, 2040, 10, 15, 14, 23, 42); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictCertificateValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimeValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Current time at 1 second after end of certificate validity period. err = SetCurrentTime(validContext, 2040, 10, 15, 14, 23, 43); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Strict policy validContext.mValidityPolicy = &strictCertificateValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimeValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Current time after end of certificate validity period. err = SetCurrentTime(validContext, 2042, 4, 25, 0, 0, 0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Strict policy validContext.mValidityPolicy = &strictCertificateValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimeValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Last known good time before certificate validity period. // We can't invalidate based on NotBefore with Last Known Good Time. // Hence, we expect CHIP_NO_ERROR. err = SetLastKnownGoodTime(validContext, 2020, 1, 3); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictCertificateValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimeValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Last known good time 1 second before certificate validity period. // We can't invalidate based on NotBefore with Last Known Good Time. // Hence, we expect CHIP_NO_ERROR. err = SetLastKnownGoodTime(validContext, 2020, 10, 15, 14, 23, 42); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictCertificateValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimeValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Last Known Good Time 1st second of validity period. err = SetLastKnownGoodTime(validContext, 2020, 10, 15, 14, 23, 43); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictCertificateValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimeValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Last Known Good Time within validity period. err = SetLastKnownGoodTime(validContext, 2022, 02, 23, 12, 30, 01); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictCertificateValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimeValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Last Known Good Time at last second of validity period. err = SetLastKnownGoodTime(validContext, 2040, 10, 15, 14, 23, 42); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictCertificateValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimeValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Last Known Good Time at 1 second after end of certificate validity period. err = SetLastKnownGoodTime(validContext, 2040, 10, 15, 14, 23, 43); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictCertificateValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimeValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Last Known Good Time after end of certificate validity period. err = SetLastKnownGoodTime(validContext, 2042, 4, 25, 0, 0, 0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictCertificateValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimeValidityPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); certSet.Release(); } -static void TestChipCert_ValidateChipRCAC(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_ValidateChipRCAC) { struct RCACTestCase { @@ -855,8 +858,8 @@ static void TestChipCert_ValidateChipRCAC(nlTestSuite * inSuite, void * inContex for (auto & testCase : sRCACTestCases) { ByteSpan cert; - NL_TEST_ASSERT(inSuite, GetTestCert(testCase.Cert, sNullLoadFlag, cert) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ValidateChipRCAC(cert) == testCase.mExpectedResult); + EXPECT_EQ(GetTestCert(testCase.Cert, sNullLoadFlag, cert), CHIP_NO_ERROR); + EXPECT_EQ(ValidateChipRCAC(cert), testCase.mExpectedResult); } } @@ -884,7 +887,7 @@ class AlwaysRejectValidityPolicy : public CertificateValidityPolicy } }; -static void TestChipCert_CertValidityPolicyInjection(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_CertValidityPolicyInjection) { CHIP_ERROR err; ChipCertificateSet certSet; @@ -895,10 +898,10 @@ static void TestChipCert_CertValidityPolicyInjection(nlTestSuite * inSuite, void AlwaysRejectValidityPolicy alwaysRejectPolicy; err = certSet.Init(kStandardCertsCount); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = LoadTestCertSet01(certSet); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); validContext.Reset(); validContext.mRequiredKeyUsages.Set(KeyUsageFlags::kDigitalSignature); @@ -910,170 +913,170 @@ static void TestChipCert_CertValidityPolicyInjection(nlTestSuite * inSuite, void // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimePolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Always accept policy validContext.mValidityPolicy = &alwaysAcceptPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Always reject policy validContext.mValidityPolicy = &alwaysRejectPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); // Curent time before certificate validity period. err = SetCurrentTime(validContext, 2020, 1, 3); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_NOT_VALID_YET); + EXPECT_EQ(err, CHIP_ERROR_CERT_NOT_VALID_YET); // Strict policy validContext.mValidityPolicy = &strictPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_NOT_VALID_YET); + EXPECT_EQ(err, CHIP_ERROR_CERT_NOT_VALID_YET); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimePolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_NOT_VALID_YET); + EXPECT_EQ(err, CHIP_ERROR_CERT_NOT_VALID_YET); // Always accept policy validContext.mValidityPolicy = &alwaysAcceptPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Always reject policy validContext.mValidityPolicy = &alwaysRejectPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); // Last known good time before certificate validity period. err = SetLastKnownGoodTime(validContext, 2020, 1, 3); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Always accept policy validContext.mValidityPolicy = &alwaysAcceptPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Always reject policy validContext.mValidityPolicy = &alwaysRejectPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); // Current time during validity period err = SetCurrentTime(validContext, 2022, 02, 23, 12, 30, 01); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Always accept policy validContext.mValidityPolicy = &alwaysAcceptPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Always reject policy validContext.mValidityPolicy = &alwaysRejectPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); // Last Known Good Time during validity period err = SetLastKnownGoodTime(validContext, 2022, 02, 23, 12, 30, 01); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimePolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Always accept policy validContext.mValidityPolicy = &alwaysAcceptPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Always reject policy validContext.mValidityPolicy = &alwaysRejectPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); // Current time after end of certificate validity period. err = SetCurrentTime(validContext, 2042, 4, 25, 0, 0, 0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Strict policy validContext.mValidityPolicy = &strictPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimePolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Always accept policy validContext.mValidityPolicy = &alwaysAcceptPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Always reject policy validContext.mValidityPolicy = &alwaysRejectPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); // Last Known Good Time after end of certificate validity period. err = SetLastKnownGoodTime(validContext, 2042, 4, 25, 0, 0, 0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Default policy validContext.mValidityPolicy = nullptr; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Strict policy validContext.mValidityPolicy = &strictPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Last Known Good Time policy validContext.mValidityPolicy = &lastKnownGoodTimePolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_CERT_EXPIRED); + EXPECT_EQ(err, CHIP_ERROR_CERT_EXPIRED); // Always accept policy validContext.mValidityPolicy = &alwaysAcceptPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Always reject policy validContext.mValidityPolicy = &alwaysRejectPolicy; err = certSet.ValidateCert(certSet.GetLastCert(), validContext); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); certSet.Release(); } -static void TestChipCert_CertUsage(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_CertUsage) { CHIP_ERROR err; ChipCertificateSet certSet; @@ -1164,10 +1167,10 @@ static void TestChipCert_CertUsage(nlTestSuite * inSuite, void * inContext) size_t sNumUsageTestCases = ArraySize(sUsageTestCases); err = certSet.Init(certDataArray, ArraySize(certDataArray)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = LoadTestCertSet01(certSet); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); for (size_t i = 0; i < sNumUsageTestCases; i++) { @@ -1176,16 +1179,16 @@ static void TestChipCert_CertUsage(nlTestSuite * inSuite, void * inContext) validContext.mRequiredKeyPurposes = sUsageTestCases[i].mRequiredKeyPurposes; err = SetCurrentTime(validContext, 2020, 10, 16); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = certSet.ValidateCert(&certSet.GetCertSet()[sUsageTestCases[i].mCertIndex], validContext); - NL_TEST_ASSERT(inSuite, err == sUsageTestCases[i].mExpectedResult); + EXPECT_EQ(err, sUsageTestCases[i].mExpectedResult); } certSet.Release(); } -static void TestChipCert_CertType(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_CertType) { CHIP_ERROR err; ChipCertificateData certData; @@ -1218,16 +1221,16 @@ static void TestChipCert_CertType(nlTestSuite * inSuite, void * inContext) CertType certType; err = DecodeTestCert(certData, testCase.Cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = certData.mSubjectDN.GetCertType(certType); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certType == testCase.ExpectedCertType); + EXPECT_EQ(certType, testCase.ExpectedCertType); } } -static void TestChipCert_CertId(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_CertId) { CHIP_ERROR err; ChipCertificateData certData; @@ -1260,114 +1263,114 @@ static void TestChipCert_CertId(nlTestSuite * inSuite, void * inContext) uint64_t chipId; err = DecodeTestCert(certData, testCase.Cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = certData.mSubjectDN.GetCertChipId(chipId); if (testCase.ExpectedCertId != 0) { - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, chipId == testCase.ExpectedCertId); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(chipId, testCase.ExpectedCertId); } else { - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_WRONG_CERT_DN); + EXPECT_EQ(err, CHIP_ERROR_WRONG_CERT_DN); } } } -static void TestChipCert_DecodingOptions(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_DecodingOptions) { CHIP_ERROR err; ByteSpan cert; ChipCertificateData certData; err = GetTestCert(TestCert::kRoot01, sNullLoadFlag, cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Decode with default (null) options err = DecodeChipCert(cert, certData); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !certData.mCertFlags.Has(CertFlags::kIsTrustAnchor)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(certData.mCertFlags.Has(CertFlags::kIsTrustAnchor)); // Decode as trust anchor err = DecodeChipCert(cert, certData, CertDecodeFlags::kIsTrustAnchor); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certData.mCertFlags.Has(CertFlags::kIsTrustAnchor)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(certData.mCertFlags.Has(CertFlags::kIsTrustAnchor)); // Decode with TBS Hash calculation err = DecodeChipCert(cert, certData, CertDecodeFlags::kGenerateTBSHash); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certData.mCertFlags.Has(CertFlags::kTBSHashPresent)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(certData.mCertFlags.Has(CertFlags::kTBSHashPresent)); // When the TBS hash is available signature verification should work err = VerifyCertSignature(certData, certData); // test cert is a self-signed root - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); } -static void TestChipCert_LoadDuplicateCerts(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_LoadDuplicateCerts) { CHIP_ERROR err; ChipCertificateSet certSet; ValidationContext validContext; err = certSet.Init(kStandardCertsCount); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Let's load two distinct certificates, and make sure cert count is 2 err = LoadTestCert(certSet, TestCert::kRoot01, sNullLoadFlag, sTrustAnchorFlag); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = LoadTestCert(certSet, TestCert::kICA01, sNullLoadFlag, sGenTBSHashFlag); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certSet.GetCertCount() == 2); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(certSet.GetCertCount(), 2); // Let's load a previously loaded cert and make sure cert count is still 2 err = LoadTestCert(certSet, TestCert::kRoot01, sNullLoadFlag, sTrustAnchorFlag); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certSet.GetCertCount() == 2); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(certSet.GetCertCount(), 2); // Let's load the other previously loaded cert and make sure cert count is still 2 err = LoadTestCert(certSet, TestCert::kICA01, sNullLoadFlag, sGenTBSHashFlag); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certSet.GetCertCount() == 2); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(certSet.GetCertCount(), 2); // Let's load a new cert and make sure cert count updates to 3 err = LoadTestCert(certSet, TestCert::kNode01_01, sNullLoadFlag, sGenTBSHashFlag); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certSet.GetCertCount() == 3); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(certSet.GetCertCount(), 3); } -static void TestChipCert_GenerateRootCert(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_GenerateRootCert) { // Generate a new keypair for cert signing P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); uint8_t signed_cert[kMaxDERCertLength]; ChipCertificateData certData; ChipDN root_dn; - NL_TEST_ASSERT(inSuite, root_dn.AddAttribute_MatterRCACId(0xabcdabcd) == CHIP_NO_ERROR); + EXPECT_EQ(root_dn.AddAttribute_MatterRCACId(0xabcdabcd), CHIP_NO_ERROR); X509CertRequestParams root_params = { 1234, 631161876, 729942000, root_dn, root_dn }; MutableByteSpan signed_cert_span(signed_cert); - NL_TEST_ASSERT(inSuite, NewRootX509Cert(root_params, keypair, signed_cert_span) == CHIP_NO_ERROR); + EXPECT_EQ(NewRootX509Cert(root_params, keypair, signed_cert_span), CHIP_NO_ERROR); uint8_t outCertBuf[kMaxCHIPCertLength]; MutableByteSpan outCert(outCertBuf); - NL_TEST_ASSERT(inSuite, ConvertX509CertToChipCert(signed_cert_span, outCert) == CHIP_NO_ERROR); + EXPECT_EQ(ConvertX509CertToChipCert(signed_cert_span, outCert), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, DecodeChipCert(outCert, certData) == CHIP_NO_ERROR); + EXPECT_EQ(DecodeChipCert(outCert, certData), CHIP_NO_ERROR); // Test with FutureExtension X509CertRequestParams root_params2 = { 1234, 631161876, 729942000, root_dn, root_dn, kSubjectAltNameAsFutureExt }; MutableByteSpan signed_cert_span2(signed_cert); - NL_TEST_ASSERT(inSuite, NewRootX509Cert(root_params2, keypair, signed_cert_span2) == CHIP_NO_ERROR); + EXPECT_EQ(NewRootX509Cert(root_params2, keypair, signed_cert_span2), CHIP_NO_ERROR); outCert = MutableByteSpan(outCertBuf); - NL_TEST_ASSERT(inSuite, ConvertX509CertToChipCert(signed_cert_span2, outCert) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, DecodeChipCert(outCert, certData) == CHIP_NO_ERROR); + EXPECT_EQ(ConvertX509CertToChipCert(signed_cert_span2, outCert), CHIP_NO_ERROR); + EXPECT_EQ(DecodeChipCert(outCert, certData), CHIP_NO_ERROR); // Test with no defined notAfter time. { @@ -1378,41 +1381,41 @@ static void TestChipCert_GenerateRootCert(nlTestSuite * inSuite, void * inContex .IssuerDN = root_dn }; MutableByteSpan signed_cert_span_no_expiry(signed_cert); - NL_TEST_ASSERT(inSuite, NewRootX509Cert(root_params3, keypair, signed_cert_span_no_expiry) == CHIP_NO_ERROR); + EXPECT_EQ(NewRootX509Cert(root_params3, keypair, signed_cert_span_no_expiry), CHIP_NO_ERROR); outCert = MutableByteSpan(outCertBuf); - NL_TEST_ASSERT(inSuite, ConvertX509CertToChipCert(signed_cert_span_no_expiry, outCert) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, DecodeChipCert(outCert, certData) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certData.mNotAfterTime == kNullCertTime); + EXPECT_EQ(ConvertX509CertToChipCert(signed_cert_span_no_expiry, outCert), CHIP_NO_ERROR); + EXPECT_EQ(DecodeChipCert(outCert, certData), CHIP_NO_ERROR); + EXPECT_EQ(certData.mNotAfterTime, kNullCertTime); } // Test error case: root cert subject provided ICA OID Attribute. root_params.SubjectDN.Clear(); - NL_TEST_ASSERT(inSuite, root_params.SubjectDN.AddAttribute_MatterICACId(0xabcdabcd) == CHIP_NO_ERROR); + EXPECT_EQ(root_params.SubjectDN.AddAttribute_MatterICACId(0xabcdabcd), CHIP_NO_ERROR); root_params.IssuerDN.Clear(); - NL_TEST_ASSERT(inSuite, root_params.IssuerDN.AddAttribute_MatterICACId(0xabcdabcd) == CHIP_NO_ERROR); + EXPECT_EQ(root_params.IssuerDN.AddAttribute_MatterICACId(0xabcdabcd), CHIP_NO_ERROR); MutableByteSpan signed_cert_span1(signed_cert); - NL_TEST_ASSERT(inSuite, NewRootX509Cert(root_params, keypair, signed_cert_span1) == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(NewRootX509Cert(root_params, keypair, signed_cert_span1), CHIP_ERROR_INVALID_ARGUMENT); // Test error case: root cert provided different subject and issuer DNs. root_params.SubjectDN.Clear(); - NL_TEST_ASSERT(inSuite, root_params.SubjectDN.AddAttribute_MatterRCACId(0xabcdabcd) == CHIP_NO_ERROR); + EXPECT_EQ(root_params.SubjectDN.AddAttribute_MatterRCACId(0xabcdabcd), CHIP_NO_ERROR); root_params.IssuerDN.Clear(); - NL_TEST_ASSERT(inSuite, root_params.IssuerDN.AddAttribute_MatterRCACId(0xffffeeee) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, NewRootX509Cert(root_params, keypair, signed_cert_span1) == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(root_params.IssuerDN.AddAttribute_MatterRCACId(0xffffeeee), CHIP_NO_ERROR); + EXPECT_EQ(NewRootX509Cert(root_params, keypair, signed_cert_span1), CHIP_ERROR_INVALID_ARGUMENT); // Test that serial number cannot be negative root_params.IssuerDN.Clear(); - NL_TEST_ASSERT(inSuite, root_params.IssuerDN.AddAttribute_MatterRCACId(0xabcdabcd) == CHIP_NO_ERROR); + EXPECT_EQ(root_params.IssuerDN.AddAttribute_MatterRCACId(0xabcdabcd), CHIP_NO_ERROR); root_params.SerialNumber = -1; - NL_TEST_ASSERT(inSuite, NewRootX509Cert(root_params, keypair, signed_cert_span1) == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(NewRootX509Cert(root_params, keypair, signed_cert_span1), CHIP_ERROR_INVALID_ARGUMENT); } -static void TestChipCert_GenerateRootFabCert(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_GenerateRootFabCert) { // Generate a new keypair for cert signing P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); uint8_t signed_cert[kMaxDERCertLength]; @@ -1422,24 +1425,24 @@ static void TestChipCert_GenerateRootFabCert(nlTestSuite * inSuite, void * inCon MutableByteSpan outCert(outCertBuf); ChipDN root_dn; - NL_TEST_ASSERT(inSuite, root_dn.AddAttribute_MatterRCACId(0xabcdabcd) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, root_dn.AddAttribute_MatterFabricId(0xabcd) == CHIP_NO_ERROR); + EXPECT_EQ(root_dn.AddAttribute_MatterRCACId(0xabcdabcd), CHIP_NO_ERROR); + EXPECT_EQ(root_dn.AddAttribute_MatterFabricId(0xabcd), CHIP_NO_ERROR); X509CertRequestParams root_params_fabric = { 1234, 631161876, 729942000, root_dn, root_dn }; MutableByteSpan signed_cert_span(signed_cert); - NL_TEST_ASSERT(inSuite, NewRootX509Cert(root_params_fabric, keypair, signed_cert_span) == CHIP_NO_ERROR); + EXPECT_EQ(NewRootX509Cert(root_params_fabric, keypair, signed_cert_span), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ConvertX509CertToChipCert(signed_cert_span, outCert) == CHIP_NO_ERROR); + EXPECT_EQ(ConvertX509CertToChipCert(signed_cert_span, outCert), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, DecodeChipCert(outCert, certData) == CHIP_NO_ERROR); + EXPECT_EQ(DecodeChipCert(outCert, certData), CHIP_NO_ERROR); } -static void TestChipCert_GenerateICACert(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_GenerateICACert) { // Generate a new keypair for cert signing P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); uint8_t signed_cert[kMaxDERCertLength]; @@ -1449,51 +1452,49 @@ static void TestChipCert_GenerateICACert(nlTestSuite * inSuite, void * inContext ChipCertificateData certData; ChipDN ica_dn; - NL_TEST_ASSERT(inSuite, ica_dn.AddAttribute_MatterICACId(0xABCDABCDABCDABCD) == CHIP_NO_ERROR); + EXPECT_EQ(ica_dn.AddAttribute_MatterICACId(0xABCDABCDABCDABCD), CHIP_NO_ERROR); ChipDN issuer_dn; - NL_TEST_ASSERT(inSuite, issuer_dn.AddAttribute_MatterRCACId(0x43215678FEDCABCD) == CHIP_NO_ERROR); + EXPECT_EQ(issuer_dn.AddAttribute_MatterRCACId(0x43215678FEDCABCD), CHIP_NO_ERROR); X509CertRequestParams ica_params = { 1234, 631161876, 729942000, ica_dn, issuer_dn }; P256Keypair ica_keypair; - NL_TEST_ASSERT(inSuite, ica_keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(ica_keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); MutableByteSpan signed_cert_span(signed_cert); - NL_TEST_ASSERT(inSuite, NewICAX509Cert(ica_params, ica_keypair.Pubkey(), keypair, signed_cert_span) == CHIP_NO_ERROR); + EXPECT_EQ(NewICAX509Cert(ica_params, ica_keypair.Pubkey(), keypair, signed_cert_span), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ConvertX509CertToChipCert(signed_cert_span, outCert) == CHIP_NO_ERROR); + EXPECT_EQ(ConvertX509CertToChipCert(signed_cert_span, outCert), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, DecodeChipCert(outCert, certData) == CHIP_NO_ERROR); + EXPECT_EQ(DecodeChipCert(outCert, certData), CHIP_NO_ERROR); // Test with FutureExtension X509CertRequestParams ica_params2 = { 1234, 631161876, 729942000, ica_dn, issuer_dn, kSubjectAltNameAsFutureExt }; MutableByteSpan signed_cert_span2(signed_cert); - NL_TEST_ASSERT(inSuite, NewICAX509Cert(ica_params2, ica_keypair.Pubkey(), keypair, signed_cert_span2) == CHIP_NO_ERROR); + EXPECT_EQ(NewICAX509Cert(ica_params2, ica_keypair.Pubkey(), keypair, signed_cert_span2), CHIP_NO_ERROR); outCert = MutableByteSpan(outCertBuf); - NL_TEST_ASSERT(inSuite, ConvertX509CertToChipCert(signed_cert_span2, outCert) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, DecodeChipCert(outCert, certData) == CHIP_NO_ERROR); + EXPECT_EQ(ConvertX509CertToChipCert(signed_cert_span2, outCert), CHIP_NO_ERROR); + EXPECT_EQ(DecodeChipCert(outCert, certData), CHIP_NO_ERROR); // Test error case: ICA cert subject provided a node ID attribute ica_params.SubjectDN.Clear(); - NL_TEST_ASSERT(inSuite, ica_params.SubjectDN.AddAttribute_MatterNodeId(0xABCDABCDABCDABCD) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ica_params.SubjectDN.AddAttribute_MatterFabricId(0xFAB00000FAB00001) == CHIP_NO_ERROR); + EXPECT_EQ(ica_params.SubjectDN.AddAttribute_MatterNodeId(0xABCDABCDABCDABCD), CHIP_NO_ERROR); + EXPECT_EQ(ica_params.SubjectDN.AddAttribute_MatterFabricId(0xFAB00000FAB00001), CHIP_NO_ERROR); MutableByteSpan signed_cert_span1(signed_cert); - NL_TEST_ASSERT(inSuite, - NewICAX509Cert(ica_params, ica_keypair.Pubkey(), keypair, signed_cert_span1) == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(NewICAX509Cert(ica_params, ica_keypair.Pubkey(), keypair, signed_cert_span1), CHIP_ERROR_INVALID_ARGUMENT); // Test that serial number cannot be negative ica_params.SubjectDN.Clear(); - NL_TEST_ASSERT(inSuite, ica_params.SubjectDN.AddAttribute_MatterICACId(0xABCDABCDABCDABCD) == CHIP_NO_ERROR); + EXPECT_EQ(ica_params.SubjectDN.AddAttribute_MatterICACId(0xABCDABCDABCDABCD), CHIP_NO_ERROR); ica_params.SerialNumber = -1; - NL_TEST_ASSERT(inSuite, - NewICAX509Cert(ica_params, ica_keypair.Pubkey(), keypair, signed_cert_span1) == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(NewICAX509Cert(ica_params, ica_keypair.Pubkey(), keypair, signed_cert_span1), CHIP_ERROR_INVALID_ARGUMENT); } -static void TestChipCert_GenerateNOCRoot(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_GenerateNOCRoot) { // Generate a new keypair for cert signing P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); uint8_t signed_cert[kMaxDERCertLength]; @@ -1503,68 +1504,62 @@ static void TestChipCert_GenerateNOCRoot(nlTestSuite * inSuite, void * inContext ChipCertificateData certData; ChipDN noc_dn; - NL_TEST_ASSERT(inSuite, noc_dn.AddAttribute_MatterNodeId(0xABCDABCDABCDABCD) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, noc_dn.AddAttribute_MatterFabricId(0xFAB00000FAB00001) == CHIP_NO_ERROR); + EXPECT_EQ(noc_dn.AddAttribute_MatterNodeId(0xABCDABCDABCDABCD), CHIP_NO_ERROR); + EXPECT_EQ(noc_dn.AddAttribute_MatterFabricId(0xFAB00000FAB00001), CHIP_NO_ERROR); ChipDN issuer_dn; - NL_TEST_ASSERT(inSuite, issuer_dn.AddAttribute_MatterRCACId(0x8888999944442222) == CHIP_NO_ERROR); + EXPECT_EQ(issuer_dn.AddAttribute_MatterRCACId(0x8888999944442222), CHIP_NO_ERROR); X509CertRequestParams noc_params = { 123456, 631161876, 729942000, noc_dn, issuer_dn }; P256Keypair noc_keypair; - NL_TEST_ASSERT(inSuite, noc_keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(noc_keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); MutableByteSpan signed_cert_span(signed_cert, sizeof(signed_cert)); - NL_TEST_ASSERT(inSuite, - NewNodeOperationalX509Cert(noc_params, noc_keypair.Pubkey(), keypair, signed_cert_span) == CHIP_NO_ERROR); + EXPECT_EQ(NewNodeOperationalX509Cert(noc_params, noc_keypair.Pubkey(), keypair, signed_cert_span), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ConvertX509CertToChipCert(signed_cert_span, outCert) == CHIP_NO_ERROR); + EXPECT_EQ(ConvertX509CertToChipCert(signed_cert_span, outCert), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, DecodeChipCert(outCert, certData) == CHIP_NO_ERROR); + EXPECT_EQ(DecodeChipCert(outCert, certData), CHIP_NO_ERROR); // Test with FutureExtension X509CertRequestParams noc_params2 = { 123456, 631161876, 729942000, noc_dn, issuer_dn, kSubjectAltNameAsFutureExt }; MutableByteSpan signed_cert_span2(signed_cert); - NL_TEST_ASSERT(inSuite, - NewNodeOperationalX509Cert(noc_params2, noc_keypair.Pubkey(), keypair, signed_cert_span2) == CHIP_NO_ERROR); + EXPECT_EQ(NewNodeOperationalX509Cert(noc_params2, noc_keypair.Pubkey(), keypair, signed_cert_span2), CHIP_NO_ERROR); outCert = MutableByteSpan(outCertBuf); - NL_TEST_ASSERT(inSuite, ConvertX509CertToChipCert(signed_cert_span2, outCert) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, DecodeChipCert(outCert, certData) == CHIP_NO_ERROR); + EXPECT_EQ(ConvertX509CertToChipCert(signed_cert_span2, outCert), CHIP_NO_ERROR); + EXPECT_EQ(DecodeChipCert(outCert, certData), CHIP_NO_ERROR); // Test error case: NOC cert subject doesn't have NodeId attribute noc_params.SubjectDN.Clear(); - NL_TEST_ASSERT(inSuite, noc_params.SubjectDN.AddAttribute_MatterFabricId(0xFAB00000FAB00001) == CHIP_NO_ERROR); + EXPECT_EQ(noc_params.SubjectDN.AddAttribute_MatterFabricId(0xFAB00000FAB00001), CHIP_NO_ERROR); MutableByteSpan signed_cert_span1(signed_cert, sizeof(signed_cert)); - NL_TEST_ASSERT(inSuite, - NewNodeOperationalX509Cert(noc_params, noc_keypair.Pubkey(), keypair, signed_cert_span1) == - CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(NewNodeOperationalX509Cert(noc_params, noc_keypair.Pubkey(), keypair, signed_cert_span1), + CHIP_ERROR_INVALID_ARGUMENT); // Test error case: NOC cert subject doesn't have fabric ID attribute noc_params.SubjectDN.Clear(); - NL_TEST_ASSERT(inSuite, noc_params.SubjectDN.AddAttribute_MatterNodeId(0xABCDABCDABCDABCD) == CHIP_NO_ERROR); + EXPECT_EQ(noc_params.SubjectDN.AddAttribute_MatterNodeId(0xABCDABCDABCDABCD), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, - NewNodeOperationalX509Cert(noc_params, noc_keypair.Pubkey(), keypair, signed_cert_span1) == - CHIP_ERROR_WRONG_CERT_DN); + EXPECT_EQ(NewNodeOperationalX509Cert(noc_params, noc_keypair.Pubkey(), keypair, signed_cert_span1), CHIP_ERROR_WRONG_CERT_DN); // Test error case: issuer cert DN type is Node certificate noc_params.SubjectDN.Clear(); - NL_TEST_ASSERT(inSuite, noc_params.SubjectDN.AddAttribute_MatterNodeId(0xABCDABCDABCDABCD) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, noc_params.SubjectDN.AddAttribute_MatterFabricId(0xFAB00000FAB00001) == CHIP_NO_ERROR); + EXPECT_EQ(noc_params.SubjectDN.AddAttribute_MatterNodeId(0xABCDABCDABCDABCD), CHIP_NO_ERROR); + EXPECT_EQ(noc_params.SubjectDN.AddAttribute_MatterFabricId(0xFAB00000FAB00001), CHIP_NO_ERROR); noc_params.IssuerDN.Clear(); - NL_TEST_ASSERT(inSuite, noc_params.IssuerDN.AddAttribute_MatterNodeId(0x8888999944442222) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, noc_params.IssuerDN.AddAttribute_MatterFabricId(0xFAB00000FAB00001) == CHIP_NO_ERROR); + EXPECT_EQ(noc_params.IssuerDN.AddAttribute_MatterNodeId(0x8888999944442222), CHIP_NO_ERROR); + EXPECT_EQ(noc_params.IssuerDN.AddAttribute_MatterFabricId(0xFAB00000FAB00001), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, - NewNodeOperationalX509Cert(noc_params, noc_keypair.Pubkey(), keypair, signed_cert_span1) == - CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(NewNodeOperationalX509Cert(noc_params, noc_keypair.Pubkey(), keypair, signed_cert_span1), + CHIP_ERROR_INVALID_ARGUMENT); } -static void TestChipCert_GenerateNOCICA(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_GenerateNOCICA) { // Generate a new keypair for cert signing P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); uint8_t signed_cert[kMaxDERCertLength]; @@ -1581,78 +1576,75 @@ static void TestChipCert_GenerateNOCICA(nlTestSuite * inSuite, void * inContext) const static char noc_name_rdn[] = "Smith"; ChipDN noc_dn; - NL_TEST_ASSERT(inSuite, noc_dn.AddAttribute_CommonName(CharSpan(noc_cn_rdn, strlen(noc_cn_rdn)), false) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, noc_dn.AddAttribute_MatterNodeId(0xAAAABBBBCCCCDDDD) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, noc_dn.AddAttribute_MatterFabricId(0xFAB00000FAB00001) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, - noc_dn.AddAttribute_GivenName(CharSpan(noc_givenname_rdn, strlen(noc_givenname_rdn)), true) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, noc_dn.AddAttribute_Name(CharSpan(noc_name_rdn, strlen(noc_name_rdn)), true) == CHIP_NO_ERROR); + EXPECT_EQ(noc_dn.AddAttribute_CommonName(CharSpan(noc_cn_rdn, strlen(noc_cn_rdn)), false), CHIP_NO_ERROR); + EXPECT_EQ(noc_dn.AddAttribute_MatterNodeId(0xAAAABBBBCCCCDDDD), CHIP_NO_ERROR); + EXPECT_EQ(noc_dn.AddAttribute_MatterFabricId(0xFAB00000FAB00001), CHIP_NO_ERROR); + EXPECT_EQ(noc_dn.AddAttribute_GivenName(CharSpan(noc_givenname_rdn, strlen(noc_givenname_rdn)), true), CHIP_NO_ERROR); + EXPECT_EQ(noc_dn.AddAttribute_Name(CharSpan(noc_name_rdn, strlen(noc_name_rdn)), true), CHIP_NO_ERROR); ChipDN ica_dn; - NL_TEST_ASSERT(inSuite, ica_dn.AddAttribute_MatterICACId(0x8888999944442222) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ica_dn.AddAttribute_MatterFabricId(0xFAB00000FAB00001) == CHIP_NO_ERROR); + EXPECT_EQ(ica_dn.AddAttribute_MatterICACId(0x8888999944442222), CHIP_NO_ERROR); + EXPECT_EQ(ica_dn.AddAttribute_MatterFabricId(0xFAB00000FAB00001), CHIP_NO_ERROR); X509CertRequestParams noc_params = { 12348765, 631161876, 729942000, noc_dn, ica_dn }; P256Keypair noc_keypair; - NL_TEST_ASSERT(inSuite, noc_keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(noc_keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); MutableByteSpan signed_cert_span(signed_cert); - NL_TEST_ASSERT(inSuite, - NewNodeOperationalX509Cert(noc_params, noc_keypair.Pubkey(), keypair, signed_cert_span) == CHIP_NO_ERROR); + EXPECT_EQ(NewNodeOperationalX509Cert(noc_params, noc_keypair.Pubkey(), keypair, signed_cert_span), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ConvertX509CertToChipCert(signed_cert_span, outCert) == CHIP_NO_ERROR); + EXPECT_EQ(ConvertX509CertToChipCert(signed_cert_span, outCert), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ConvertChipCertToX509Cert(outCert, outCertDER) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, signed_cert_span.data_equal(outCertDER)); + EXPECT_EQ(ConvertChipCertToX509Cert(outCert, outCertDER), CHIP_NO_ERROR); + EXPECT_TRUE(signed_cert_span.data_equal(outCertDER)); - NL_TEST_ASSERT(inSuite, DecodeChipCert(outCert, certData) == CHIP_NO_ERROR); + EXPECT_EQ(DecodeChipCert(outCert, certData), CHIP_NO_ERROR); } -static void TestChipCert_VerifyGeneratedCerts(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_VerifyGeneratedCerts) { // Generate a new keypair for cert signing P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); static uint8_t root_cert[kMaxDERCertLength]; ChipDN root_dn; - NL_TEST_ASSERT(inSuite, root_dn.AddAttribute_MatterRCACId(0xAAAABBBBCCCCDDDD) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, root_dn.AddAttribute_MatterFabricId(0xFAB0000000008888) == CHIP_NO_ERROR); + EXPECT_EQ(root_dn.AddAttribute_MatterRCACId(0xAAAABBBBCCCCDDDD), CHIP_NO_ERROR); + EXPECT_EQ(root_dn.AddAttribute_MatterFabricId(0xFAB0000000008888), CHIP_NO_ERROR); X509CertRequestParams root_params = { 1234, 631161876, 729942000, root_dn, root_dn }; MutableByteSpan root_cert_span(root_cert); - NL_TEST_ASSERT(inSuite, NewRootX509Cert(root_params, keypair, root_cert_span) == CHIP_NO_ERROR); + EXPECT_EQ(NewRootX509Cert(root_params, keypair, root_cert_span), CHIP_NO_ERROR); static uint8_t ica_cert[kMaxDERCertLength]; ChipDN ica_dn; - NL_TEST_ASSERT(inSuite, ica_dn.AddAttribute_MatterICACId(0xAABBCCDDAABBCCDD) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ica_dn.AddAttribute_MatterFabricId(0xFAB0000000008888) == CHIP_NO_ERROR); + EXPECT_EQ(ica_dn.AddAttribute_MatterICACId(0xAABBCCDDAABBCCDD), CHIP_NO_ERROR); + EXPECT_EQ(ica_dn.AddAttribute_MatterFabricId(0xFAB0000000008888), CHIP_NO_ERROR); X509CertRequestParams ica_params = { 12345, 631161876, 729942000, ica_dn, root_dn }; P256Keypair ica_keypair; - NL_TEST_ASSERT(inSuite, ica_keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(ica_keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); MutableByteSpan ica_cert_span(ica_cert); - NL_TEST_ASSERT(inSuite, NewICAX509Cert(ica_params, ica_keypair.Pubkey(), keypair, ica_cert_span) == CHIP_NO_ERROR); + EXPECT_EQ(NewICAX509Cert(ica_params, ica_keypair.Pubkey(), keypair, ica_cert_span), CHIP_NO_ERROR); static uint8_t noc_cert[kMaxDERCertLength]; ChipDN noc_dn; - NL_TEST_ASSERT(inSuite, noc_dn.AddAttribute_MatterNodeId(0xAABBCCDDAABBCCDD) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, noc_dn.AddAttribute_MatterFabricId(0xFAB0000000008888) == CHIP_NO_ERROR); + EXPECT_EQ(noc_dn.AddAttribute_MatterNodeId(0xAABBCCDDAABBCCDD), CHIP_NO_ERROR); + EXPECT_EQ(noc_dn.AddAttribute_MatterFabricId(0xFAB0000000008888), CHIP_NO_ERROR); X509CertRequestParams noc_params = { 123456, 631161876, 729942000, noc_dn, ica_dn }; P256Keypair noc_keypair; - NL_TEST_ASSERT(inSuite, noc_keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(noc_keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); MutableByteSpan noc_cert_span(noc_cert, sizeof(noc_cert)); - NL_TEST_ASSERT(inSuite, - NewNodeOperationalX509Cert(noc_params, noc_keypair.Pubkey(), ica_keypair, noc_cert_span) == CHIP_NO_ERROR); + EXPECT_EQ(NewNodeOperationalX509Cert(noc_params, noc_keypair.Pubkey(), ica_keypair, noc_cert_span), CHIP_NO_ERROR); ChipCertificateSet certSet; - NL_TEST_ASSERT(inSuite, certSet.Init(3) == CHIP_NO_ERROR); + EXPECT_EQ(certSet.Init(3), CHIP_NO_ERROR); static uint8_t chipRootCertBuf[kMaxCHIPCertLength]; static uint8_t chipICACertBuf[kMaxCHIPCertLength]; @@ -1661,19 +1653,19 @@ static void TestChipCert_VerifyGeneratedCerts(nlTestSuite * inSuite, void * inCo MutableByteSpan chipICACert(chipICACertBuf); MutableByteSpan chipNOCCert(chipNOCCertBuf); - NL_TEST_ASSERT(inSuite, ConvertX509CertToChipCert(root_cert_span, chipRootCert) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certSet.LoadCert(chipRootCert, sTrustAnchorFlag) == CHIP_NO_ERROR); + EXPECT_EQ(ConvertX509CertToChipCert(root_cert_span, chipRootCert), CHIP_NO_ERROR); + EXPECT_EQ(certSet.LoadCert(chipRootCert, sTrustAnchorFlag), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ConvertX509CertToChipCert(ica_cert_span, chipICACert) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certSet.LoadCert(chipICACert, sGenTBSHashFlag) == CHIP_NO_ERROR); + EXPECT_EQ(ConvertX509CertToChipCert(ica_cert_span, chipICACert), CHIP_NO_ERROR); + EXPECT_EQ(certSet.LoadCert(chipICACert, sGenTBSHashFlag), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ConvertX509CertToChipCert(noc_cert_span, chipNOCCert) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certSet.LoadCert(chipNOCCert, sGenTBSHashFlag) == CHIP_NO_ERROR); + EXPECT_EQ(ConvertX509CertToChipCert(noc_cert_span, chipNOCCert), CHIP_NO_ERROR); + EXPECT_EQ(certSet.LoadCert(chipNOCCert, sGenTBSHashFlag), CHIP_NO_ERROR); ValidationContext validContext; validContext.Reset(); - NL_TEST_ASSERT(inSuite, SetCurrentTime(validContext, 2022, 1, 1) == CHIP_NO_ERROR); + EXPECT_EQ(SetCurrentTime(validContext, 2022, 1, 1), CHIP_NO_ERROR); validContext.mRequiredKeyUsages.Set(KeyUsageFlags::kDigitalSignature); validContext.mRequiredKeyPurposes.Set(KeyPurposeFlags::kServerAuth); validContext.mRequiredKeyPurposes.Set(KeyPurposeFlags::kClientAuth); @@ -1683,63 +1675,63 @@ static void TestChipCert_VerifyGeneratedCerts(nlTestSuite * inSuite, void * inCo const CertificateKeyId & subjectKeyId = certSet.GetCertSet()[2].mSubjectKeyId; const ChipCertificateData * resultCert = nullptr; - NL_TEST_ASSERT(inSuite, certSet.FindValidCert(subjectDN, subjectKeyId, validContext, &resultCert) == CHIP_NO_ERROR); + EXPECT_EQ(certSet.FindValidCert(subjectDN, subjectKeyId, validContext, &resultCert), CHIP_NO_ERROR); } -static void TestChipCert_VerifyGeneratedCertsNoICA(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_VerifyGeneratedCertsNoICA) { // Generate a new keypair for cert signing P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); static uint8_t root_cert[kMaxDERCertLength]; const static char root_cn_rdn[] = "Test Root Operational Cert"; ChipDN root_dn; - NL_TEST_ASSERT(inSuite, root_dn.AddAttribute_CommonName(CharSpan(root_cn_rdn, strlen(root_cn_rdn)), false) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, root_dn.AddAttribute_MatterRCACId(0xAAAABBBBCCCCDDDD) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, root_dn.AddAttribute_MatterFabricId(0xFAB0000000008888) == CHIP_NO_ERROR); + EXPECT_EQ(root_dn.AddAttribute_CommonName(CharSpan(root_cn_rdn, strlen(root_cn_rdn)), false), CHIP_NO_ERROR); + EXPECT_EQ(root_dn.AddAttribute_MatterRCACId(0xAAAABBBBCCCCDDDD), CHIP_NO_ERROR); + EXPECT_EQ(root_dn.AddAttribute_MatterFabricId(0xFAB0000000008888), CHIP_NO_ERROR); X509CertRequestParams root_params = { 1234, 631161876, 729942000, root_dn, root_dn }; MutableByteSpan root_cert_span(root_cert); - NL_TEST_ASSERT(inSuite, NewRootX509Cert(root_params, keypair, root_cert_span) == CHIP_NO_ERROR); + EXPECT_EQ(NewRootX509Cert(root_params, keypair, root_cert_span), CHIP_NO_ERROR); static uint8_t noc_cert[kMaxDERCertLength]; const static char noc_cn_rdn[] = "Test NOC"; ChipDN noc_dn; - NL_TEST_ASSERT(inSuite, noc_dn.AddAttribute_CommonName(CharSpan(noc_cn_rdn, strlen(noc_cn_rdn)), true) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, noc_dn.AddAttribute_MatterNodeId(0xAABBCCDDAABBCCDD) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, noc_dn.AddAttribute_MatterFabricId(0xFAB0000000008888) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, noc_dn.AddAttribute_MatterCASEAuthTag(0xABCD0010) == CHIP_NO_ERROR); + EXPECT_EQ(noc_dn.AddAttribute_CommonName(CharSpan(noc_cn_rdn, strlen(noc_cn_rdn)), true), CHIP_NO_ERROR); + EXPECT_EQ(noc_dn.AddAttribute_MatterNodeId(0xAABBCCDDAABBCCDD), CHIP_NO_ERROR); + EXPECT_EQ(noc_dn.AddAttribute_MatterFabricId(0xFAB0000000008888), CHIP_NO_ERROR); + EXPECT_EQ(noc_dn.AddAttribute_MatterCASEAuthTag(0xABCD0010), CHIP_NO_ERROR); X509CertRequestParams noc_params = { 1234, 631161876, 729942000, noc_dn, root_dn }; P256Keypair noc_keypair; - NL_TEST_ASSERT(inSuite, noc_keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(noc_keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); MutableByteSpan noc_cert_span(noc_cert); - NL_TEST_ASSERT(inSuite, NewNodeOperationalX509Cert(noc_params, noc_keypair.Pubkey(), keypair, noc_cert_span) == CHIP_NO_ERROR); + EXPECT_EQ(NewNodeOperationalX509Cert(noc_params, noc_keypair.Pubkey(), keypair, noc_cert_span), CHIP_NO_ERROR); ChipCertificateSet certSet; - NL_TEST_ASSERT(inSuite, certSet.Init(2) == CHIP_NO_ERROR); + EXPECT_EQ(certSet.Init(2), CHIP_NO_ERROR); static uint8_t chipRootCertBuf[kMaxCHIPCertLength]; static uint8_t chipNOCCertBuf[kMaxCHIPCertLength]; MutableByteSpan chipRootCert(chipRootCertBuf); MutableByteSpan chipNOCCert(chipNOCCertBuf); - NL_TEST_ASSERT(inSuite, ConvertX509CertToChipCert(root_cert_span, chipRootCert) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certSet.LoadCert(chipRootCert, sTrustAnchorFlag) == CHIP_NO_ERROR); + EXPECT_EQ(ConvertX509CertToChipCert(root_cert_span, chipRootCert), CHIP_NO_ERROR); + EXPECT_EQ(certSet.LoadCert(chipRootCert, sTrustAnchorFlag), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ConvertX509CertToChipCert(noc_cert_span, chipNOCCert) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certSet.LoadCert(chipNOCCert, sGenTBSHashFlag) == CHIP_NO_ERROR); + EXPECT_EQ(ConvertX509CertToChipCert(noc_cert_span, chipNOCCert), CHIP_NO_ERROR); + EXPECT_EQ(certSet.LoadCert(chipNOCCert, sGenTBSHashFlag), CHIP_NO_ERROR); ValidationContext validContext; validContext.Reset(); - NL_TEST_ASSERT(inSuite, SetCurrentTime(validContext, 2022, 1, 1) == CHIP_NO_ERROR); + EXPECT_EQ(SetCurrentTime(validContext, 2022, 1, 1), CHIP_NO_ERROR); validContext.mRequiredKeyUsages.Set(KeyUsageFlags::kDigitalSignature); validContext.mRequiredKeyPurposes.Set(KeyPurposeFlags::kServerAuth); validContext.mRequiredKeyPurposes.Set(KeyPurposeFlags::kClientAuth); @@ -1749,10 +1741,10 @@ static void TestChipCert_VerifyGeneratedCertsNoICA(nlTestSuite * inSuite, void * const CertificateKeyId & subjectKeyId = certSet.GetCertSet()[1].mSubjectKeyId; const ChipCertificateData * resultCert = nullptr; - NL_TEST_ASSERT(inSuite, certSet.FindValidCert(subjectDN, subjectKeyId, validContext, &resultCert) == CHIP_NO_ERROR); + EXPECT_EQ(certSet.FindValidCert(subjectDN, subjectKeyId, validContext, &resultCert), CHIP_NO_ERROR); } -static void TestChipCert_ExtractNodeIdFabricId(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_ExtractNodeIdFabricId) { struct TestCase { @@ -1784,14 +1776,14 @@ static void TestChipCert_ExtractNodeIdFabricId(nlTestSuite * inSuite, void * inC { ByteSpan cert; CHIP_ERROR err = GetTestCert(testCase.Cert, sNullLoadFlag, cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); NodeId nodeId; FabricId fabricId; err = ExtractNodeIdFabricIdFromOpCert(cert, &nodeId, &fabricId); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, nodeId == testCase.ExpectedNodeId); - NL_TEST_ASSERT(inSuite, fabricId == testCase.ExpectedFabricId); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(nodeId, testCase.ExpectedNodeId); + EXPECT_EQ(fabricId, testCase.ExpectedFabricId); } // Test node ID and fabric ID extraction from the parsed form. @@ -1799,17 +1791,17 @@ static void TestChipCert_ExtractNodeIdFabricId(nlTestSuite * inSuite, void * inC for (auto & testCase : sTestCases) { CHIP_ERROR err = certSet.Init(1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = LoadTestCert(certSet, testCase.Cert, sNullLoadFlag, sNullDecodeFlag); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); NodeId nodeId; FabricId fabricId; err = ExtractNodeIdFabricIdFromOpCert(certSet.GetCertSet()[0], &nodeId, &fabricId); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, nodeId == testCase.ExpectedNodeId); - NL_TEST_ASSERT(inSuite, fabricId == testCase.ExpectedFabricId); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(nodeId, testCase.ExpectedNodeId); + EXPECT_EQ(fabricId, testCase.ExpectedFabricId); certSet.Release(); } @@ -1818,27 +1810,27 @@ static void TestChipCert_ExtractNodeIdFabricId(nlTestSuite * inSuite, void * inC { ByteSpan cert; CHIP_ERROR err = GetTestCert(testCase.Cert, sNullLoadFlag, cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); FabricId fabricId; err = ExtractFabricIdFromCert(cert, &fabricId); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, fabricId == testCase.ExpectedFabricId); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(fabricId, testCase.ExpectedFabricId); } // Test fabric ID extraction from the parsed form. for (auto & testCase : sTestCases) { CHIP_ERROR err = certSet.Init(1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = LoadTestCert(certSet, testCase.Cert, sNullLoadFlag, sNullDecodeFlag); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); FabricId fabricId; err = ExtractFabricIdFromCert(certSet.GetCertSet()[0], &fabricId); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, fabricId == testCase.ExpectedFabricId); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(fabricId, testCase.ExpectedFabricId); certSet.Release(); } @@ -1846,29 +1838,29 @@ static void TestChipCert_ExtractNodeIdFabricId(nlTestSuite * inSuite, void * inC { ByteSpan cert; CHIP_ERROR err = GetTestCert(TestCert::kICA01, sNullLoadFlag, cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); FabricId fabricId; err = ExtractFabricIdFromCert(cert, &fabricId); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(err, CHIP_ERROR_NOT_FOUND); } // Test extraction from the parsed form of ICA Cert that doesn't have FabricId. { CHIP_ERROR err = certSet.Init(1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = LoadTestCert(certSet, TestCert::kICA01, sNullLoadFlag, sNullDecodeFlag); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); FabricId fabricId; err = ExtractFabricIdFromCert(certSet.GetCertSet()[0], &fabricId); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(err, CHIP_ERROR_NOT_FOUND); certSet.Release(); } } -static void TestChipCert_ExtractOperationalDiscoveryId(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_ExtractOperationalDiscoveryId) { struct TestCase { @@ -1901,30 +1893,30 @@ static void TestChipCert_ExtractOperationalDiscoveryId(nlTestSuite * inSuite, vo ByteSpan noc; ByteSpan rcac; CHIP_ERROR err = GetTestCert(testCase.Noc, sNullLoadFlag, noc); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = GetTestCert(testCase.Rcac, sNullLoadFlag, rcac); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Extract Node ID and Fabric ID from the leaf node certificate. NodeId nodeId; FabricId fabricId; err = ExtractNodeIdFabricIdFromOpCert(noc, &nodeId, &fabricId); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, nodeId == testCase.ExpectedNodeId); - NL_TEST_ASSERT(inSuite, fabricId == testCase.ExpectedFabricId); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(nodeId, testCase.ExpectedNodeId); + EXPECT_EQ(fabricId, testCase.ExpectedFabricId); // Extract Node ID, Fabric ID and Compressed Fabric ID from the // NOC and root certificate. CompressedFabricId compressedFabricId; err = ExtractNodeIdFabricIdCompressedFabricIdFromOpCerts(rcac, noc, compressedFabricId, fabricId, nodeId); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, compressedFabricId == testCase.ExpectedCompressedFabricId); - NL_TEST_ASSERT(inSuite, fabricId == testCase.ExpectedFabricId); - NL_TEST_ASSERT(inSuite, nodeId == testCase.ExpectedNodeId); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(compressedFabricId, testCase.ExpectedCompressedFabricId); + EXPECT_EQ(fabricId, testCase.ExpectedFabricId); + EXPECT_EQ(nodeId, testCase.ExpectedNodeId); } } -static void TestChipCert_ExtractAndValidateCATsFromOpCert(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_ExtractAndValidateCATsFromOpCert) { struct TestCase { @@ -1954,12 +1946,12 @@ static void TestChipCert_ExtractAndValidateCATsFromOpCert(nlTestSuite * inSuite, { ByteSpan cert; CHIP_ERROR err = GetTestCert(testCase.Cert, sNullLoadFlag, cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); CATValues cats; err = ExtractCATsFromOpCert(cert, cats); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(&cats, &testCase.ExpectedCATs, sizeof(cats)) == 0); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(memcmp(&cats, &testCase.ExpectedCATs, sizeof(cats)), 0); } // Test extraction from the parsed form. @@ -1967,15 +1959,15 @@ static void TestChipCert_ExtractAndValidateCATsFromOpCert(nlTestSuite * inSuite, for (auto & testCase : sTestCases) { CHIP_ERROR err = certSet.Init(1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = LoadTestCert(certSet, testCase.Cert, sNullLoadFlag, sNullDecodeFlag); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); CATValues cats; err = ExtractCATsFromOpCert(certSet.GetCertSet()[0], cats); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(&cats, &testCase.ExpectedCATs, sizeof(cats)) == 0); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(memcmp(&cats, &testCase.ExpectedCATs, sizeof(cats)), 0); certSet.Release(); } @@ -1983,14 +1975,14 @@ static void TestChipCert_ExtractAndValidateCATsFromOpCert(nlTestSuite * inSuite, // Error case: trying to extract CAT from Root Cert. { CHIP_ERROR err = certSet.Init(1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = LoadTestCert(certSet, TestCert::kRoot01, sNullLoadFlag, sNullDecodeFlag); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); CATValues cats; err = ExtractCATsFromOpCert(certSet.GetCertSet()[0], cats); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT); certSet.Release(); } @@ -1999,18 +1991,18 @@ static void TestChipCert_ExtractAndValidateCATsFromOpCert(nlTestSuite * inSuite, { CATValues cats; CHIP_ERROR err = ExtractCATsFromOpCert(ByteSpan(sChipTest_NOC_Subject_CAT_Invalid_Cert_CHIP), cats); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT); } // Error case: NOC with multiple versions of the same CAT tag. { CATValues cats; CHIP_ERROR err = ExtractCATsFromOpCert(ByteSpan(sChipTest_NOC_Subject_CAT_Twice_Cert_CHIP), cats); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_WRONG_CERT_DN); + EXPECT_EQ(err, CHIP_ERROR_WRONG_CERT_DN); } } -static void TestChipCert_ExtractSubjectDNFromChipCert(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_ExtractSubjectDNFromChipCert) { struct TestCase { @@ -2019,29 +2011,28 @@ static void TestChipCert_ExtractSubjectDNFromChipCert(nlTestSuite * inSuite, voi }; ChipDN expectedSubjectDN_Root01; - NL_TEST_ASSERT(inSuite, expectedSubjectDN_Root01.AddAttribute_MatterRCACId(0xCACACACA00000001) == CHIP_NO_ERROR); + EXPECT_EQ(expectedSubjectDN_Root01.AddAttribute_MatterRCACId(0xCACACACA00000001), CHIP_NO_ERROR); ChipDN expectedSubjectDN_Root02; - NL_TEST_ASSERT(inSuite, expectedSubjectDN_Root02.AddAttribute_MatterRCACId(0xCACACACA00000002) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, expectedSubjectDN_Root02.AddAttribute_MatterFabricId(0xFAB000000000001D) == CHIP_NO_ERROR); + EXPECT_EQ(expectedSubjectDN_Root02.AddAttribute_MatterRCACId(0xCACACACA00000002), CHIP_NO_ERROR); + EXPECT_EQ(expectedSubjectDN_Root02.AddAttribute_MatterFabricId(0xFAB000000000001D), CHIP_NO_ERROR); ChipDN expectedSubjectDN_ICA02; - NL_TEST_ASSERT(inSuite, expectedSubjectDN_ICA02.AddAttribute_MatterICACId(0xCACACACA00000004) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, expectedSubjectDN_ICA02.AddAttribute_MatterFabricId(0xFAB000000000001D) == CHIP_NO_ERROR); + EXPECT_EQ(expectedSubjectDN_ICA02.AddAttribute_MatterICACId(0xCACACACA00000004), CHIP_NO_ERROR); + EXPECT_EQ(expectedSubjectDN_ICA02.AddAttribute_MatterFabricId(0xFAB000000000001D), CHIP_NO_ERROR); ChipDN expectedSubjectDN_Node01_01; - NL_TEST_ASSERT(inSuite, expectedSubjectDN_Node01_01.AddAttribute_MatterNodeId(0xDEDEDEDE00010001) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, expectedSubjectDN_Node01_01.AddAttribute_MatterFabricId(0xFAB000000000001D) == CHIP_NO_ERROR); + EXPECT_EQ(expectedSubjectDN_Node01_01.AddAttribute_MatterNodeId(0xDEDEDEDE00010001), CHIP_NO_ERROR); + EXPECT_EQ(expectedSubjectDN_Node01_01.AddAttribute_MatterFabricId(0xFAB000000000001D), CHIP_NO_ERROR); const static char commonName_RDN[] = "TestCert02_03"; ChipDN expectedSubjectDN_Node02_03; - NL_TEST_ASSERT(inSuite, expectedSubjectDN_Node02_03.AddAttribute_MatterNodeId(0xDEDEDEDE00020003) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, expectedSubjectDN_Node02_03.AddAttribute_MatterFabricId(0xFAB000000000001D) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, - expectedSubjectDN_Node02_03.AddAttribute_CommonName(CharSpan(commonName_RDN, strlen(commonName_RDN)), false) == - CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, expectedSubjectDN_Node02_03.AddAttribute_MatterCASEAuthTag(0xABCD0001) == CHIP_NO_ERROR); + EXPECT_EQ(expectedSubjectDN_Node02_03.AddAttribute_MatterNodeId(0xDEDEDEDE00020003), CHIP_NO_ERROR); + EXPECT_EQ(expectedSubjectDN_Node02_03.AddAttribute_MatterFabricId(0xFAB000000000001D), CHIP_NO_ERROR); + EXPECT_EQ(expectedSubjectDN_Node02_03.AddAttribute_CommonName(CharSpan(commonName_RDN, strlen(commonName_RDN)), false), + CHIP_NO_ERROR); + EXPECT_EQ(expectedSubjectDN_Node02_03.AddAttribute_MatterCASEAuthTag(0xABCD0001), CHIP_NO_ERROR); // clang-format off TestCase sTestCases[] = { @@ -2061,15 +2052,15 @@ static void TestChipCert_ExtractSubjectDNFromChipCert(nlTestSuite * inSuite, voi { ByteSpan cert; CHIP_ERROR err = GetTestCert(testCase.Cert, sNullLoadFlag, cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); ChipDN subjectDN; err = ExtractSubjectDNFromChipCert(cert, subjectDN); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); if (!testCase.ExpectedSubjectDN.IsEmpty()) { - NL_TEST_ASSERT(inSuite, subjectDN.IsEqual(testCase.ExpectedSubjectDN)); + EXPECT_TRUE(subjectDN.IsEqual(testCase.ExpectedSubjectDN)); } } @@ -2078,20 +2069,20 @@ static void TestChipCert_ExtractSubjectDNFromChipCert(nlTestSuite * inSuite, voi { ByteSpan cert; CHIP_ERROR err = GetTestCert(testCase.Cert, TestCertLoadFlags::kDERForm, cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); ChipDN subjectDN; err = ExtractSubjectDNFromX509Cert(cert, subjectDN); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); if (!testCase.ExpectedSubjectDN.IsEmpty()) { - NL_TEST_ASSERT(inSuite, subjectDN.IsEqual(testCase.ExpectedSubjectDN)); + EXPECT_TRUE(subjectDN.IsEqual(testCase.ExpectedSubjectDN)); } } } -static void TestChipCert_ExtractPublicKeyAndSKID(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_ExtractPublicKeyAndSKID) { struct TestCase { @@ -2127,28 +2118,28 @@ static void TestChipCert_ExtractPublicKeyAndSKID(nlTestSuite * inSuite, void * i { ByteSpan cert; CHIP_ERROR err = GetTestCert(testCase.Cert, sNullLoadFlag, cert); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); P256PublicKeySpan publicKey; err = ExtractPublicKeyFromChipCert(cert, publicKey); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, publicKey.data_equal(testCase.ExpectedPublicKey)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(publicKey.data_equal(testCase.ExpectedPublicKey)); CertificateKeyId skid; err = ExtractSKIDFromChipCert(cert, skid); if (!testCase.ExpectedSKID.empty()) { - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, skid.data_equal(testCase.ExpectedSKID)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(skid.data_equal(testCase.ExpectedSKID)); } else { - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(err, CHIP_ERROR_NOT_FOUND); } } } -static void TestChipCert_PDCIdentityValidation(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_PDCIdentityValidation) { CertificateKeyIdStorage keyId; @@ -2156,134 +2147,52 @@ static void TestChipCert_PDCIdentityValidation(nlTestSuite * inSuite, void * inC for (auto && cert : { sTestCert_PDCID01_Chip, sTestCert_PDCID01_ChipCompact }) { // Validate only - NL_TEST_ASSERT(inSuite, ValidateChipNetworkIdentity(cert) == CHIP_NO_ERROR); + EXPECT_EQ(ValidateChipNetworkIdentity(cert), CHIP_NO_ERROR); // Validate and calculate identifier keyId.fill(0xaa); - NL_TEST_ASSERT(inSuite, ValidateChipNetworkIdentity(cert, keyId) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, CertificateKeyId(keyId).data_equal(sTestCert_PDCID01_KeyId)); + EXPECT_EQ(ValidateChipNetworkIdentity(cert, keyId), CHIP_NO_ERROR); + EXPECT_TRUE(CertificateKeyId(keyId).data_equal(sTestCert_PDCID01_KeyId)); // Extract identifier only keyId.fill(0xaa); - NL_TEST_ASSERT(inSuite, ExtractIdentifierFromChipNetworkIdentity(cert, keyId) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, CertificateKeyId(keyId).data_equal(sTestCert_PDCID01_KeyId)); + EXPECT_EQ(ExtractIdentifierFromChipNetworkIdentity(cert, keyId), CHIP_NO_ERROR); + EXPECT_TRUE(CertificateKeyId(keyId).data_equal(sTestCert_PDCID01_KeyId)); } } -static void TestChipCert_PDCIdentityGeneration(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_PDCIdentityGeneration) { // Generate a new keypair P256Keypair keypair; - NL_TEST_ASSERT(inSuite, keypair.Initialize(ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(keypair.Initialize(ECPKeyTarget::ECDSA), CHIP_NO_ERROR); // Generate an identity certificate based on the keypair uint8_t buffer[kMaxCHIPCompactNetworkIdentityLength]; MutableByteSpan cert(buffer); - NL_TEST_ASSERT(inSuite, NewChipNetworkIdentity(keypair, cert) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ValidateChipNetworkIdentity(cert) == CHIP_NO_ERROR); + EXPECT_EQ(NewChipNetworkIdentity(keypair, cert), CHIP_NO_ERROR); + EXPECT_EQ(ValidateChipNetworkIdentity(cert), CHIP_NO_ERROR); // It should round-trip to X.509 DER and back, and remain valid. uint8_t derBuffer[kMaxDERCertLength]; MutableByteSpan derCert(derBuffer); - NL_TEST_ASSERT(inSuite, ConvertChipCertToX509Cert(cert, derCert) == CHIP_NO_ERROR); + EXPECT_EQ(ConvertChipCertToX509Cert(cert, derCert), CHIP_NO_ERROR); uint8_t tlvBuffer[kMaxCHIPCertLength]; MutableByteSpan tlvCert(tlvBuffer); // won't be compact after round-tripping - NL_TEST_ASSERT(inSuite, ConvertX509CertToChipCert(derCert, tlvCert) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, ValidateChipNetworkIdentity(tlvCert) == CHIP_NO_ERROR); + EXPECT_EQ(ConvertX509CertToChipCert(derCert, tlvCert), CHIP_NO_ERROR); + EXPECT_EQ(ValidateChipNetworkIdentity(tlvCert), CHIP_NO_ERROR); } -static void TestChipCert_KeypairConversion(nlTestSuite * inSuite, void * inContext) +TEST_F(TestChipCert, TestChipCert_KeypairConversion) { P256SerializedKeypair keypair; - NL_TEST_ASSERT_SUCCESS(inSuite, GetTestCertKeypair(kPDCID01, keypair)); + EXPECT_EQ(GetTestCertKeypair(kPDCID01, keypair), CHIP_NO_ERROR); uint8_t buffer[kP256ECPrivateKeyDERLength]; MutableByteSpan keypairDer(buffer); - NL_TEST_ASSERT_SUCCESS(inSuite, ConvertECDSAKeypairRawToDER(keypair, keypairDer)); + EXPECT_EQ(ConvertECDSAKeypairRawToDER(keypair, keypairDer), CHIP_NO_ERROR); // Technically the curve name and public key are optional in the DER format, // but both our code and standard tools include them, so we can just compare. - NL_TEST_ASSERT(inSuite, keypairDer.data_equal(sTestCert_PDCID01_KeypairDER)); + EXPECT_TRUE(keypairDer.data_equal(sTestCert_PDCID01_KeypairDER)); } - -/** - * Set up the test suite. - */ -int TestChipCert_Setup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - - if (error != CHIP_NO_ERROR) - { - return FAILURE; - } - - return SUCCESS; -} - -/** - * Tear down the test suite. - */ -int TestChipCert_Teardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - -/** - * Test Suite. It lists all the test functions. - */ -// clang-format off -static const nlTest sTests[] = { - NL_TEST_DEF("Test CHIP Certificate CHIP to X509 Conversion", TestChipCert_ChipToX509), - NL_TEST_DEF("Test CHIP Certificate CHIP to X509 Conversion - Error Cases", TestChipCert_ChipToX509_ErrorCases), - NL_TEST_DEF("Test CHIP Certificate Loading - Error Cases", TestChipCert_ChipCertLoad_ErrorCases), - NL_TEST_DEF("Test CHIP Certificate Validate RCAC - Error Cases", TestChipCert_ValidateChipRCAC_ErrorCases), - NL_TEST_DEF("Test CHIP Certificate Get Cert Type from Subject - Error Cases", TestChipCert_GetCertType_ErrorCases), - NL_TEST_DEF("Test CHIP Certificate X509 to CHIP Conversion", TestChipCert_X509ToChip), - NL_TEST_DEF("Test CHIP Certificate X509 to CHIP Conversion - Error Cases", TestChipCert_X509ToChip_ErrorCases), - NL_TEST_DEF("Test CHIP Certificate Distinguish Name", TestChipCert_ChipDN), - NL_TEST_DEF("Test CHIP Certificate Validation", TestChipCert_CertValidation), - NL_TEST_DEF("Test CHIP Certificate Validation time", TestChipCert_CertValidTime), - NL_TEST_DEF("Test CHIP Root Certificate Validation", TestChipCert_ValidateChipRCAC), - NL_TEST_DEF("Test CHIP Certificate Validity Policy injection", TestChipCert_CertValidityPolicyInjection), - NL_TEST_DEF("Test CHIP Certificate Usage", TestChipCert_CertUsage), - NL_TEST_DEF("Test CHIP Certificate Type", TestChipCert_CertType), - NL_TEST_DEF("Test CHIP Certificate ID", TestChipCert_CertId), - NL_TEST_DEF("Test CHIP Certificate Decoding Options", TestChipCert_DecodingOptions), - NL_TEST_DEF("Test Loading Duplicate Certificates", TestChipCert_LoadDuplicateCerts), - NL_TEST_DEF("Test CHIP Generate Root Certificate", TestChipCert_GenerateRootCert), - NL_TEST_DEF("Test CHIP Generate Root Certificate with Fabric", TestChipCert_GenerateRootFabCert), - NL_TEST_DEF("Test CHIP Generate ICA Certificate", TestChipCert_GenerateICACert), - NL_TEST_DEF("Test CHIP Generate NOC using Root", TestChipCert_GenerateNOCRoot), - NL_TEST_DEF("Test CHIP Generate NOC using ICA", TestChipCert_GenerateNOCICA), - NL_TEST_DEF("Test CHIP Verify Generated Cert Chain", TestChipCert_VerifyGeneratedCerts), - NL_TEST_DEF("Test CHIP Verify Generated Cert Chain No ICA", TestChipCert_VerifyGeneratedCertsNoICA), - NL_TEST_DEF("Test extracting Node ID and Fabric ID from node certificate", TestChipCert_ExtractNodeIdFabricId), - NL_TEST_DEF("Test extracting Operational Discovery ID from node and root certificate", TestChipCert_ExtractOperationalDiscoveryId), - NL_TEST_DEF("Test extracting and validating CASE Authenticated Tags from NOC", TestChipCert_ExtractAndValidateCATsFromOpCert), - NL_TEST_DEF("Test extracting Subject DN from chip certificate", TestChipCert_ExtractSubjectDNFromChipCert), - NL_TEST_DEF("Test extracting PublicKey and SKID from chip certificate", TestChipCert_ExtractPublicKeyAndSKID), - NL_TEST_DEF("Test PDC Identity Validation", TestChipCert_PDCIdentityValidation), - NL_TEST_DEF("Test PDC Identity Generation", TestChipCert_PDCIdentityGeneration), - NL_TEST_DEF("Test keypair conversion", TestChipCert_KeypairConversion), - NL_TEST_SENTINEL() -}; -// clang-format on - -int TestChipCert() -{ - // clang-format off - nlTestSuite theSuite = - { - "Credentials-CHIP-Certs", - &sTests[0], - TestChipCert_Setup, - TestChipCert_Teardown - }; - // clang-format on - nlTestRunner(&theSuite, nullptr); - return (nlTestRunnerStats(&theSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestChipCert); diff --git a/src/credentials/tests/TestCommissionerDUTVectors.cpp b/src/credentials/tests/TestCommissionerDUTVectors.cpp index 4c7efea882c4c2..55beafdc044313 100644 --- a/src/credentials/tests/TestCommissionerDUTVectors.cpp +++ b/src/credentials/tests/TestCommissionerDUTVectors.cpp @@ -29,10 +29,8 @@ #include <lib/core/CHIPError.h> #include <lib/support/CHIPMem.h> #include <lib/support/Span.h> -#include <lib/support/UnitTestExtendedAssertions.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> #include <dirent.h> #include <stdio.h> @@ -49,10 +47,17 @@ static void OnAttestationInformationVerificationCallback(void * context, const D *pResult = result; } -static void TestCommissionerDUTVectors(nlTestSuite * inSuite, void * inContext) +struct TestCommissionerDUTVectors : public ::testing::Test +{ + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestCommissionerDUTVectors, TestCommissionerDUTVectors) { DeviceAttestationVerifier * example_dac_verifier = GetDefaultDACVerifier(GetTestAttestationTrustStore()); - NL_TEST_ASSERT(inSuite, example_dac_verifier != nullptr); + ASSERT_NE(example_dac_verifier, nullptr); std::string dirPath("../../../../../credentials/development/commissioner_dut/"); DIR * dir = opendir(dirPath.c_str()); @@ -105,14 +110,14 @@ static void TestCommissionerDUTVectors(nlTestSuite * inSuite, void * inContext) VendorId vid = TestVendor1; uint16_t pid = strstr(entry->d_name, "_vidpid_fallback_encoding_") ? 0x00B1 : 0x8000; - NL_TEST_ASSERT_SUCCESS(inSuite, dacProvider.GetCertificationDeclaration(certDeclSpan)); - NL_TEST_ASSERT_SUCCESS(inSuite, dacProvider.GetDeviceAttestationCert(dacCertSpan)); - NL_TEST_ASSERT_SUCCESS(inSuite, dacProvider.GetProductAttestationIntermediateCert(paiCertSpan)); + EXPECT_EQ(dacProvider.GetCertificationDeclaration(certDeclSpan), CHIP_NO_ERROR); + EXPECT_EQ(dacProvider.GetDeviceAttestationCert(dacCertSpan), CHIP_NO_ERROR); + EXPECT_EQ(dacProvider.GetProductAttestationIntermediateCert(paiCertSpan), CHIP_NO_ERROR); size_t attestationElementsLen = TLV::EstimateStructOverhead(certDeclSpan.size(), attestationNonceSpan.size(), sizeof(uint64_t) * 8); Platform::ScopedMemoryBuffer<uint8_t> attestationElements; - NL_TEST_ASSERT(inSuite, attestationElements.Alloc(attestationElementsLen + attestationChallengeSpan.size())); + EXPECT_TRUE(attestationElements.Alloc(attestationElementsLen + attestationChallengeSpan.size())); MutableByteSpan attestationElementsSpan(attestationElements.Get(), attestationElementsLen); // Construct attestation elements @@ -121,10 +126,9 @@ static void TestCommissionerDUTVectors(nlTestSuite * inSuite, void * inContext) Credentials::DeviceAttestationVendorReservedConstructor emptyVendorReserved(nullptr, 0); const ByteSpan kEmptyFirmwareInfo; - NL_TEST_ASSERT_SUCCESS(inSuite, - Credentials::ConstructAttestationElements(certDeclSpan, attestationNonceSpan, timestamp, - kEmptyFirmwareInfo, emptyVendorReserved, - attestationElementsSpan)); + EXPECT_EQ(Credentials::ConstructAttestationElements(certDeclSpan, attestationNonceSpan, timestamp, kEmptyFirmwareInfo, + emptyVendorReserved, attestationElementsSpan), + CHIP_NO_ERROR); } // Generate attestation signature @@ -134,8 +138,8 @@ static void TestCommissionerDUTVectors(nlTestSuite * inSuite, void * inContext) attestationChallengeSpan.size()); ByteSpan tbsSpan(attestationElementsSpan.data(), attestationElementsSpan.size() + attestationChallengeSpan.size()); - NL_TEST_ASSERT_SUCCESS(inSuite, dacProvider.SignWithDeviceAttestationKey(tbsSpan, attestationSignatureSpan)); - NL_TEST_ASSERT(inSuite, attestationSignatureSpan.size() == signature.Capacity()); + EXPECT_EQ(dacProvider.SignWithDeviceAttestationKey(tbsSpan, attestationSignatureSpan), CHIP_NO_ERROR); + EXPECT_EQ(attestationSignatureSpan.size(), signature.Capacity()); } AttestationVerificationResult attestationResult = AttestationVerificationResult::kNotImplemented; @@ -167,63 +171,12 @@ static void TestCommissionerDUTVectors(nlTestSuite * inSuite, void * inContext) if (isSuccessCase) { - NL_TEST_ASSERT(inSuite, attestationResult == AttestationVerificationResult::kSuccess); + EXPECT_EQ(attestationResult, AttestationVerificationResult::kSuccess); } else { - NL_TEST_ASSERT(inSuite, attestationResult != AttestationVerificationResult::kSuccess); + EXPECT_NE(attestationResult, AttestationVerificationResult::kSuccess); } } closedir(dir); } - -/** - * Set up the test suite. - */ -int TestCommissionerDUT_Setup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - - if (error != CHIP_NO_ERROR) - { - return FAILURE; - } - - return SUCCESS; -} - -/** - * Tear down the test suite. - */ -int TestCommissionerDUT_Teardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - -/** - * Test Suite. It lists all the test functions. - */ -// clang-format off -static const nlTest sTests[] = { - NL_TEST_DEF("Test Device Attestation Credentials Vectors", TestCommissionerDUTVectors), - NL_TEST_SENTINEL() -}; -// clang-format on - -int TestCommissionerDUT() -{ - // clang-format off - nlTestSuite theSuite = - { - "Device Attestation Credentials Test Vectors", - &sTests[0], - TestCommissionerDUT_Setup, - TestCommissionerDUT_Teardown - }; - // clang-format on - nlTestRunner(&theSuite, nullptr); - return (nlTestRunnerStats(&theSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestCommissionerDUT); diff --git a/src/credentials/tests/TestDeviceAttestationConstruction.cpp b/src/credentials/tests/TestDeviceAttestationConstruction.cpp index 8d1b0175f51920..e624b257a32ef2 100644 --- a/src/credentials/tests/TestDeviceAttestationConstruction.cpp +++ b/src/credentials/tests/TestDeviceAttestationConstruction.cpp @@ -22,15 +22,20 @@ #include <lib/support/CodeUtils.h> #include <lib/support/ScopedBuffer.h> #include <lib/support/Span.h> -#include <lib/support/UnitTestRegistration.h> #include <cstdio> -#include <nlunit-test.h> +#include <gtest/gtest.h> using namespace chip; using namespace chip::Credentials; -static void TestAttestationElements_Roundtrip(nlTestSuite * inSuite, void * inContext) +struct TestDeviceAttestationConstruction : public ::testing::Test +{ + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestDeviceAttestationConstruction, TestAttestationElements_Roundtrip) { CHIP_ERROR err = CHIP_NO_ERROR; chip::Platform::ScopedMemoryBuffer<uint8_t> attestationElements; @@ -67,7 +72,7 @@ static void TestAttestationElements_Roundtrip(nlTestSuite * inSuite, void * inCo attestationElements.Alloc(attestationElementsLen); vendorReservedConstructor.addVendorReservedElement(vendorId, profileNum, 1, ByteSpan(vendorReserved1)); vendorReservedConstructor.addVendorReservedElement(vendorId, profileNum, 3, ByteSpan(vendorReserved3)); - NL_TEST_ASSERT(inSuite, attestationElements); + EXPECT_TRUE(attestationElements); { MutableByteSpan attestationElementsSpan(attestationElements.Get(), attestationElementsLen); @@ -76,22 +81,22 @@ static void TestAttestationElements_Roundtrip(nlTestSuite * inSuite, void * inCo err = ConstructAttestationElements(ByteSpan(certificationDeclaration), ByteSpan(attestationNonce, sizeof(attestationNonce) - 1), timestamp, ByteSpan(), vendorReservedConstructor, attestationElementsSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT); // Test with missing mandatory TLV entries err = ConstructAttestationElements(ByteSpan(), ByteSpan(attestationNonce), timestamp, ByteSpan(), vendorReservedConstructor, attestationElementsSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT); // Test with missing mandatory TLV entries err = ConstructAttestationElements(ByteSpan(certificationDeclaration), ByteSpan(), timestamp, ByteSpan(), vendorReservedConstructor, attestationElementsSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT); // Test for success with entirely valid arguments err = ConstructAttestationElements(ByteSpan(certificationDeclaration), ByteSpan(attestationNonce), timestamp, ByteSpan(), vendorReservedConstructor, attestationElementsSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); attestationElementsLen = attestationElementsSpan.size(); } @@ -104,13 +109,13 @@ static void TestAttestationElements_Roundtrip(nlTestSuite * inSuite, void * inCo err = DeconstructAttestationElements(ByteSpan(attestationElements.Get(), attestationElementsLen), certificationDeclarationSpan, attestationNonceSpan, timestampDeconstructed, firmwareInfoSpan, vendorReservedDeconstructor); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certificationDeclarationSpan.data_equal(ByteSpan(certificationDeclaration))); - NL_TEST_ASSERT(inSuite, attestationNonceSpan.data_equal(ByteSpan(attestationNonce))); - NL_TEST_ASSERT(inSuite, timestamp == timestampDeconstructed); - NL_TEST_ASSERT(inSuite, firmwareInfoSpan.empty()); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(certificationDeclarationSpan.data_equal(ByteSpan(certificationDeclaration))); + EXPECT_TRUE(attestationNonceSpan.data_equal(ByteSpan(attestationNonce))); + EXPECT_EQ(timestamp, timestampDeconstructed); + EXPECT_TRUE(firmwareInfoSpan.empty()); - NL_TEST_ASSERT(inSuite, vendorReservedConstructor.GetNumberOfElements() == vendorReservedDeconstructor.GetNumberOfElements()); + EXPECT_EQ(vendorReservedConstructor.GetNumberOfElements(), vendorReservedDeconstructor.GetNumberOfElements()); const VendorReservedElement * constructionElement = vendorReservedConstructor.cbegin(); VendorReservedElement deconstructionElement; @@ -118,13 +123,13 @@ static void TestAttestationElements_Roundtrip(nlTestSuite * inSuite, void * inCo while ((constructionElement = vendorReservedConstructor.Next()) != nullptr && vendorReservedDeconstructor.GetNextVendorReservedElement(deconstructionElement) == CHIP_NO_ERROR) { - NL_TEST_ASSERT(inSuite, constructionElement->vendorId == deconstructionElement.vendorId); - NL_TEST_ASSERT(inSuite, constructionElement->profileNum == deconstructionElement.profileNum); - NL_TEST_ASSERT(inSuite, constructionElement->vendorReservedData.data_equal(deconstructionElement.vendorReservedData)); + EXPECT_EQ(constructionElement->vendorId, deconstructionElement.vendorId); + EXPECT_EQ(constructionElement->profileNum, deconstructionElement.profileNum); + EXPECT_TRUE(constructionElement->vendorReservedData.data_equal(deconstructionElement.vendorReservedData)); } } -static void TestAttestationElements_Construction(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDeviceAttestationConstruction, TestAttestationElements_Construction) { CHIP_ERROR err = CHIP_NO_ERROR; Platform::ScopedMemoryBuffer<uint8_t> attestationElements; @@ -175,21 +180,21 @@ static void TestAttestationElements_Construction(nlTestSuite * inSuite, void * i attestationElementsLen = sizeof(certificationDeclaration) + sizeof(attestationNonce) + sizeof(timestamp) + sizeof(vendorReserved1) + sizeof(vendorReserved3) + sizeof(uint64_t) * 5; attestationElements.Alloc(attestationElementsLen); - NL_TEST_ASSERT(inSuite, attestationElements); + EXPECT_TRUE(attestationElements); { MutableByteSpan attestationElementsSpan(attestationElements.Get(), attestationElementsLen); err = ConstructAttestationElements(ByteSpan(certificationDeclaration), ByteSpan(attestationNonce), timestamp, ByteSpan(), vendorReserved, attestationElementsSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); attestationElementsLen = attestationElementsSpan.size(); - NL_TEST_ASSERT(inSuite, attestationElementsSpan.data_equal(ByteSpan(attestationElementsTestVector))); + EXPECT_TRUE(attestationElementsSpan.data_equal(ByteSpan(attestationElementsTestVector))); } } -static void TestAttestationElements_Deconstruction(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDeviceAttestationConstruction, TestAttestationElements_Deconstruction) { // This is a test case with only the known TLV tags fields constexpr uint8_t attestationElementsTestVectorOnlyKnownTags[] = { @@ -266,36 +271,36 @@ static void TestAttestationElements_Deconstruction(nlTestSuite * inSuite, void * err = DeconstructAttestationElements(attestationElementsTestCase, certificationDeclarationDeconstructed, attestationNonceDeconstructed, timestampDeconstructed, firmwareInfoDeconstructed, vendorReserved); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certificationDeclarationDeconstructed.data_equal(ByteSpan(certificationDeclarationTestVector))); - NL_TEST_ASSERT(inSuite, attestationNonceDeconstructed.data_equal(ByteSpan(attestationNonceTestVector))); - NL_TEST_ASSERT(inSuite, timestampTestVector == timestampDeconstructed); - NL_TEST_ASSERT(inSuite, firmwareInfoDeconstructed.empty()); - NL_TEST_ASSERT(inSuite, ArraySize(vendorReservedArrayTestVector) == vendorReserved.GetNumberOfElements()); + EXPECT_TRUE(certificationDeclarationDeconstructed.data_equal(ByteSpan(certificationDeclarationTestVector))); + EXPECT_TRUE(attestationNonceDeconstructed.data_equal(ByteSpan(attestationNonceTestVector))); + EXPECT_EQ(timestampTestVector, timestampDeconstructed); + EXPECT_TRUE(firmwareInfoDeconstructed.empty()); + EXPECT_EQ(ArraySize(vendorReservedArrayTestVector), vendorReserved.GetNumberOfElements()); struct VendorReservedElement element; while (vendorReserved.GetNextVendorReservedElement(element) == CHIP_NO_ERROR) { - NL_TEST_ASSERT(inSuite, vendorIdTestVector == element.vendorId); - NL_TEST_ASSERT(inSuite, profileNumTestVector == element.profileNum); + EXPECT_EQ(vendorIdTestVector, element.vendorId); + EXPECT_EQ(profileNumTestVector, element.profileNum); switch (element.tagNum) { case 1: - NL_TEST_ASSERT(inSuite, element.vendorReservedData.data_equal(vendorReservedArrayTestVector[0])); + EXPECT_TRUE(element.vendorReservedData.data_equal(vendorReservedArrayTestVector[0])); break; case 3: - NL_TEST_ASSERT(inSuite, element.vendorReservedData.data_equal(vendorReservedArrayTestVector[1])); + EXPECT_TRUE(element.vendorReservedData.data_equal(vendorReservedArrayTestVector[1])); break; default: - NL_TEST_ASSERT(inSuite, 0); + EXPECT_TRUE(0); break; } } } } -static void TestAttestationElements_DeconstructionNoVendorReserved(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDeviceAttestationConstruction, TestAttestationElements_DeconstructionNoVendorReserved) { // This is a test case with only the known TLV tags fields constexpr uint8_t attestationElementsTestVectorNoVendor[] = { @@ -333,19 +338,19 @@ static void TestAttestationElements_DeconstructionNoVendorReserved(nlTestSuite * err = DeconstructAttestationElements(ByteSpan{ attestationElementsTestVectorNoVendor }, certificationDeclarationDeconstructed, attestationNonceDeconstructed, timestampDeconstructed, firmwareInfoDeconstructed, vendorReserved); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certificationDeclarationDeconstructed.data_equal(ByteSpan(certificationDeclarationTestVector))); - NL_TEST_ASSERT(inSuite, attestationNonceDeconstructed.data_equal(ByteSpan(attestationNonceTestVector))); - NL_TEST_ASSERT(inSuite, timestampTestVector == timestampDeconstructed); - NL_TEST_ASSERT(inSuite, firmwareInfoDeconstructed.empty()); - NL_TEST_ASSERT(inSuite, 0 == vendorReserved.GetNumberOfElements()); + EXPECT_TRUE(certificationDeclarationDeconstructed.data_equal(ByteSpan(certificationDeclarationTestVector))); + EXPECT_TRUE(attestationNonceDeconstructed.data_equal(ByteSpan(attestationNonceTestVector))); + EXPECT_EQ(timestampTestVector, timestampDeconstructed); + EXPECT_TRUE(firmwareInfoDeconstructed.empty()); + EXPECT_EQ(vendorReserved.GetNumberOfElements(), 0u); struct VendorReservedElement element; - NL_TEST_ASSERT(inSuite, vendorReserved.GetNextVendorReservedElement(element) == CHIP_END_OF_TLV); + EXPECT_EQ(vendorReserved.GetNextVendorReservedElement(element), CHIP_END_OF_TLV); } -static void TestVendorReservedData(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDeviceAttestationConstruction, TestVendorReservedData) { struct VendorReservedElement inputArray[] = { { 3000, 100, 10 }, { 2999, 99, 10 }, { 10, 20, 100 }, @@ -363,7 +368,7 @@ static void TestVendorReservedData(nlTestSuite * inSuite, void * inContext) vendorReserved.addVendorReservedElement(inputArray[i].vendorId, inputArray[i].profileNum, inputArray[i].tagNum, ByteSpan(strings[i], strlen(reinterpret_cast<char *>(strings[i])))); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); } // manually figure out the order these should be read out in when sorted @@ -372,24 +377,23 @@ static void TestVendorReservedData(nlTestSuite * inSuite, void * inContext) }; const struct VendorReservedElement * element = vendorReserved.cbegin(); - NL_TEST_ASSERT(inSuite, element); - NL_TEST_ASSERT(inSuite, element = vendorReserved.Next()); + EXPECT_TRUE(element); + EXPECT_TRUE(element = vendorReserved.Next()); for (i = 0; element && i < ArraySize(desiredOrder); element = vendorReserved.Next(), i++) { - NL_TEST_ASSERT(inSuite, - element->vendorId == desiredOrder[i]->vendorId && element->profileNum == desiredOrder[i]->profileNum && - element->tagNum == desiredOrder[i]->tagNum); + EXPECT_TRUE(element->vendorId == desiredOrder[i]->vendorId && element->profileNum == desiredOrder[i]->profileNum && + element->tagNum == desiredOrder[i]->tagNum); } - NL_TEST_ASSERT(inSuite, i == ArraySize(desiredOrder)); // check if previous loop matched for every array entry. + EXPECT_EQ(i, ArraySize(desiredOrder)); // check if previous loop matched for every array entry. // add another element, it should fail uint8_t testByteSpan[] = { 0x1, 0x2, 0x3 }; CHIP_ERROR err = vendorReserved.addVendorReservedElement(5, 10, 20, ByteSpan(testByteSpan)); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NO_MEMORY); + EXPECT_EQ(err, CHIP_ERROR_NO_MEMORY); } -static void TestAttestationElements_DeconstructionWithFirmwareInfo(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDeviceAttestationConstruction, TestAttestationElements_DeconstructionWithFirmwareInfo) { CHIP_ERROR err = CHIP_NO_ERROR; @@ -456,39 +460,39 @@ static void TestAttestationElements_DeconstructionWithFirmwareInfo(nlTestSuite * err = DeconstructAttestationElements(ByteSpan(attestationElementsTestVectorWithFirmwareInfo), certificationDeclarationDeconstructed, attestationNonceDeconstructed, timestampDeconstructed, firmwareInfoDeconstructed, vendorReserved); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, certificationDeclarationDeconstructed.data_equal(ByteSpan(certificationDeclarationTestVector))); - NL_TEST_ASSERT(inSuite, attestationNonceDeconstructed.data_equal(ByteSpan(attestationNonceTestVector))); - NL_TEST_ASSERT(inSuite, timestampTestVector == timestampDeconstructed); - NL_TEST_ASSERT(inSuite, firmwareInfoDeconstructed.data_equal(ByteSpan(firmwareInfoTestVector))); - NL_TEST_ASSERT(inSuite, ArraySize(vendorReservedArrayTestVector) == vendorReserved.GetNumberOfElements()); + EXPECT_TRUE(certificationDeclarationDeconstructed.data_equal(ByteSpan(certificationDeclarationTestVector))); + EXPECT_TRUE(attestationNonceDeconstructed.data_equal(ByteSpan(attestationNonceTestVector))); + EXPECT_EQ(timestampTestVector, timestampDeconstructed); + EXPECT_TRUE(firmwareInfoDeconstructed.data_equal(ByteSpan(firmwareInfoTestVector))); + EXPECT_EQ(ArraySize(vendorReservedArrayTestVector), vendorReserved.GetNumberOfElements()); struct VendorReservedElement element; size_t elementsSeen = 0; while (vendorReserved.GetNextVendorReservedElement(element) == CHIP_NO_ERROR) { - NL_TEST_ASSERT(inSuite, vendorIdTestVector == element.vendorId); - NL_TEST_ASSERT(inSuite, profileNumTestVector == element.profileNum); + EXPECT_EQ(vendorIdTestVector, element.vendorId); + EXPECT_EQ(profileNumTestVector, element.profileNum); switch (element.tagNum) { case 1: - NL_TEST_ASSERT(inSuite, element.vendorReservedData.data_equal(vendorReservedArrayTestVector[0])); + EXPECT_TRUE(element.vendorReservedData.data_equal(vendorReservedArrayTestVector[0])); elementsSeen++; break; case 3: - NL_TEST_ASSERT(inSuite, element.vendorReservedData.data_equal(vendorReservedArrayTestVector[1])); + EXPECT_TRUE(element.vendorReservedData.data_equal(vendorReservedArrayTestVector[1])); elementsSeen++; break; default: - NL_TEST_ASSERT(inSuite, 0); + EXPECT_TRUE(0); break; } } - NL_TEST_ASSERT(inSuite, elementsSeen == ArraySize(vendorReservedArrayTestVector)); + EXPECT_EQ(elementsSeen, ArraySize(vendorReservedArrayTestVector)); } -static void TestAttestationElements_DeconstructionUnordered(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDeviceAttestationConstruction, TestAttestationElements_DeconstructionUnordered) { CHIP_ERROR err = CHIP_NO_ERROR; @@ -516,10 +520,10 @@ static void TestAttestationElements_DeconstructionUnordered(nlTestSuite * inSuit err = DeconstructAttestationElements(ByteSpan(attestationElementsUnorderedTestVector), certificationDeclarationDeconstructed, attestationNonceDeconstructed, timestampDeconstructed, firmwareInfoDeconstructed, vendorReserved); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_UNEXPECTED_TLV_ELEMENT); + EXPECT_EQ(err, CHIP_ERROR_UNEXPECTED_TLV_ELEMENT); } -static void TestAttestationElements_DeconstructionCorruptedTLV(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDeviceAttestationConstruction, TestAttestationElements_DeconstructionCorruptedTLV) { CHIP_ERROR err = CHIP_NO_ERROR; using chip::FormatCHIPError; @@ -541,10 +545,10 @@ static void TestAttestationElements_DeconstructionCorruptedTLV(nlTestSuite * inS DeviceAttestationVendorReservedDeconstructor vendorReserved; size_t count = 2; err = vendorReserved.PrepareToReadVendorReservedElements(ByteSpan(attestationElementsCorruptedTLVTestVector), count); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_TLV_UNDERRUN); + EXPECT_EQ(err, CHIP_ERROR_TLV_UNDERRUN); } -static void TestNocsrElements_Construction(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDeviceAttestationConstruction, TestNocsrElements_Construction) { static constexpr uint8_t kNocsrNonce[] = { 0x81, 0x4a, 0x4d, 0x4c, 0x1c, 0x4a, 0x8e, 0xbb, 0xea, 0xdb, 0x0a, 0xe2, 0x82, 0xf9, 0x91, 0xeb, @@ -600,18 +604,18 @@ static void TestNocsrElements_Construction(nlTestSuite * inSuite, void * inConte TLV::EstimateStructOverhead(sizeof(kExampleCsr), sizeof(kNocsrNonce), sizeof(kVendorReserved1), sizeof(kVendorReserved3)); nocsrElements.Alloc(nocsrElementsLen); - NL_TEST_ASSERT(inSuite, nocsrElements.Get() != nullptr); + ASSERT_NE(nocsrElements.Get(), nullptr); MutableByteSpan nocsrElementsSpan(nocsrElements.Get(), nocsrElementsLen); CHIP_ERROR err = ConstructNOCSRElements(ByteSpan(kExampleCsr), ByteSpan(kNocsrNonce), ByteSpan{ kVendorReserved1 }, ByteSpan{}, ByteSpan{ kVendorReserved3 }, nocsrElementsSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, nocsrElementsSpan.size() <= nocsrElementsLen); - NL_TEST_ASSERT(inSuite, nocsrElementsSpan.data_equal(ByteSpan(kNoCsrElementsVector))); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_LE(nocsrElementsSpan.size(), nocsrElementsLen); + EXPECT_TRUE(nocsrElementsSpan.data_equal(ByteSpan(kNoCsrElementsVector))); } -static void TestNocsrElements_Deconstruction(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDeviceAttestationConstruction, TestNocsrElements_Deconstruction) { static constexpr uint8_t kNocsrNonce[] = { 0x81, 0x4a, 0x4d, 0x4c, 0x1c, 0x4a, 0x8e, 0xbb, 0xea, 0xdb, 0x0a, 0xe2, 0x82, 0xf9, 0x91, 0xeb, @@ -669,66 +673,10 @@ static void TestNocsrElements_Deconstruction(nlTestSuite * inSuite, void * inCon ByteSpan vendorReserved3Span; CHIP_ERROR err = DeconstructNOCSRElements(ByteSpan(kNoCsrElementsVector), csrSpan, csrNonceSpan, vendorReserved1Span, vendorReserved2Span, vendorReserved3Span); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, csrSpan.data_equal(ByteSpan(kExampleCsr))); - NL_TEST_ASSERT(inSuite, csrNonceSpan.data_equal(ByteSpan(kNocsrNonce))); - NL_TEST_ASSERT(inSuite, vendorReserved1Span.data_equal(ByteSpan(kVendorReserved1))); - NL_TEST_ASSERT(inSuite, vendorReserved2Span.empty()); - NL_TEST_ASSERT(inSuite, vendorReserved3Span.data_equal(ByteSpan(kVendorReserved3))); -} - -/** - * Test Suite. It lists all the test functions. - */ -// clang-format off -static const nlTest sTests[] = { - NL_TEST_DEF("Test Device Attestation Elements Roundtrip", TestAttestationElements_Roundtrip), - NL_TEST_DEF("Test Device Attestation Elements Construction", TestAttestationElements_Construction), - NL_TEST_DEF("Test Device Attestation Elements Deconstruction", TestAttestationElements_Deconstruction), - NL_TEST_DEF("Test Vendor Reserved Data Ordering", TestVendorReservedData), - NL_TEST_DEF("Test Device Attestation Elements Deconstruction with Firmware Information", TestAttestationElements_DeconstructionWithFirmwareInfo), - NL_TEST_DEF("Test Device Attestation Elements Deconstruction - Corrupted/Out of Order TLV", TestAttestationElements_DeconstructionUnordered), - NL_TEST_DEF("Test Device Attestation Elements Deconstruction - Corrupted TLV -- vendor reserved elements", TestAttestationElements_DeconstructionCorruptedTLV), - NL_TEST_DEF("Test Device Attestation Elements Deconstruction - No vendor reserved", TestAttestationElements_DeconstructionNoVendorReserved), - NL_TEST_DEF("Test Device NOCSR Elements Construction", TestNocsrElements_Construction), - NL_TEST_DEF("Test Device NOCSR Elements Deconstruction", TestNocsrElements_Deconstruction), - NL_TEST_SENTINEL() -}; -// clang-format on - -/** - * Set up the test suite. - */ -int TestDeviceAttestationElementsConstruction_Setup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - if (error != CHIP_NO_ERROR) - return FAILURE; - return SUCCESS; + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(csrSpan.data_equal(ByteSpan(kExampleCsr))); + EXPECT_TRUE(csrNonceSpan.data_equal(ByteSpan(kNocsrNonce))); + EXPECT_TRUE(vendorReserved1Span.data_equal(ByteSpan(kVendorReserved1))); + EXPECT_TRUE(vendorReserved2Span.empty()); + EXPECT_TRUE(vendorReserved3Span.data_equal(ByteSpan(kVendorReserved3))); } - -/** - * Tear down the test suite. - */ -int TestDeviceAttestationElementsConstruction_Teardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - -int TestDeviceAttestationElementsConstruction() -{ - // clang-format off - nlTestSuite theSuite = - { - "Device Attestation Elements Construction", - &sTests[0], - TestDeviceAttestationElementsConstruction_Setup, - TestDeviceAttestationElementsConstruction_Teardown - }; - // clang-format on - nlTestRunner(&theSuite, nullptr); - return (nlTestRunnerStats(&theSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestDeviceAttestationElementsConstruction); diff --git a/src/credentials/tests/TestDeviceAttestationCredentials.cpp b/src/credentials/tests/TestDeviceAttestationCredentials.cpp index 4707caa3bc6669..bf203c8321adf1 100644 --- a/src/credentials/tests/TestDeviceAttestationCredentials.cpp +++ b/src/credentials/tests/TestDeviceAttestationCredentials.cpp @@ -30,9 +30,8 @@ #include <lib/core/CHIPError.h> #include <lib/support/CHIPMem.h> #include <lib/support/Span.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> #include "CHIPAttCert_test_vectors.h" @@ -48,49 +47,55 @@ static const ByteSpan kExpectedPaiPublicKey = DevelopmentCerts::kPaiPublicKey; } // namespace -static void TestDACProvidersExample_Providers(nlTestSuite * inSuite, void * inContext) +struct TestDeviceAttestationCredentials : public ::testing::Test +{ + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestDeviceAttestationCredentials, TestDACProvidersExample_Providers) { uint8_t der_cert_buf[kMaxDERCertLength]; MutableByteSpan der_cert_span(der_cert_buf); // Make sure default provider exists and is not implemented on at least one method DeviceAttestationCredentialsProvider * default_provider = GetDeviceAttestationCredentialsProvider(); - NL_TEST_ASSERT(inSuite, default_provider != nullptr); + ASSERT_NE(default_provider, nullptr); CHIP_ERROR err = default_provider->GetDeviceAttestationCert(der_cert_span); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NOT_IMPLEMENTED); + EXPECT_EQ(err, CHIP_ERROR_NOT_IMPLEMENTED); // Replace default provider with example provider DeviceAttestationCredentialsProvider * example_dac_provider = Examples::GetExampleDACProvider(); - NL_TEST_ASSERT(inSuite, example_dac_provider != nullptr); - NL_TEST_ASSERT(inSuite, default_provider != example_dac_provider); + ASSERT_NE(example_dac_provider, nullptr); + EXPECT_NE(default_provider, example_dac_provider); SetDeviceAttestationCredentialsProvider(example_dac_provider); default_provider = GetDeviceAttestationCredentialsProvider(); - NL_TEST_ASSERT(inSuite, default_provider == example_dac_provider); + EXPECT_EQ(default_provider, example_dac_provider); // Make sure DAC is what we expect, by validating public key memset(der_cert_span.data(), 0, der_cert_span.size()); err = example_dac_provider->GetDeviceAttestationCert(der_cert_span); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); P256PublicKey dac_public_key; err = ExtractPubkeyFromX509Cert(der_cert_span, dac_public_key); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, dac_public_key.Length() == kExpectedDacPublicKey.size()); - NL_TEST_ASSERT(inSuite, 0 == memcmp(dac_public_key.ConstBytes(), kExpectedDacPublicKey.data(), kExpectedDacPublicKey.size())); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(dac_public_key.Length(), kExpectedDacPublicKey.size()); + EXPECT_EQ(0, memcmp(dac_public_key.ConstBytes(), kExpectedDacPublicKey.data(), kExpectedDacPublicKey.size())); // Make sure PAI is what we expect, by validating public key der_cert_span = MutableByteSpan{ der_cert_span }; memset(der_cert_span.data(), 0, der_cert_span.size()); err = example_dac_provider->GetProductAttestationIntermediateCert(der_cert_span); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); P256PublicKey pai_public_key; err = ExtractPubkeyFromX509Cert(der_cert_span, pai_public_key); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, pai_public_key.Length() == kExpectedPaiPublicKey.size()); - NL_TEST_ASSERT(inSuite, 0 == memcmp(pai_public_key.ConstBytes(), kExpectedPaiPublicKey.data(), kExpectedPaiPublicKey.size())); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(pai_public_key.Length(), kExpectedPaiPublicKey.size()); + EXPECT_EQ(0, memcmp(pai_public_key.ConstBytes(), kExpectedPaiPublicKey.data(), kExpectedPaiPublicKey.size())); // Check for CD presence uint8_t other_data_buf[kMaxCMSSignedCDMessage]; @@ -98,35 +103,35 @@ static void TestDACProvidersExample_Providers(nlTestSuite * inSuite, void * inCo memset(other_data_span.data(), 0, other_data_span.size()); err = example_dac_provider->GetCertificationDeclaration(other_data_span); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, other_data_span.size() > 0); - NL_TEST_ASSERT(inSuite, other_data_span.data()[0] != 0); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_GT(other_data_span.size(), 0u); + EXPECT_NE(other_data_span.data()[0], 0); // Check for firmware information presence other_data_span = MutableByteSpan{ other_data_buf }; memset(other_data_span.data(), 0, other_data_span.size()); err = example_dac_provider->GetFirmwareInformation(other_data_span); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, other_data_span.size() == 0); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(other_data_span.size(), 0u); } -static void TestDACProvidersExample_Signature(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDeviceAttestationCredentials, TestDACProvidersExample_Signature) { constexpr uint8_t kExampleMessage[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 }; DeviceAttestationCredentialsProvider * example_dac_provider = Examples::GetExampleDACProvider(); - NL_TEST_ASSERT(inSuite, example_dac_provider != nullptr); + ASSERT_NE(example_dac_provider, nullptr); // Sign using the example attestation private key P256ECDSASignature da_signature; MutableByteSpan out_sig_span(da_signature.Bytes(), da_signature.Capacity()); CHIP_ERROR err = example_dac_provider->SignWithDeviceAttestationKey(ByteSpan{ kExampleMessage }, out_sig_span); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, out_sig_span.size() == kP256_ECDSA_Signature_Length_Raw); + EXPECT_EQ(out_sig_span.size(), kP256_ECDSA_Signature_Length_Raw); da_signature.SetLength(out_sig_span.size()); // Get DAC from the provider @@ -135,18 +140,18 @@ static void TestDACProvidersExample_Signature(nlTestSuite * inSuite, void * inCo memset(dac_cert_span.data(), 0, dac_cert_span.size()); err = example_dac_provider->GetDeviceAttestationCert(dac_cert_span); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Extract public key from DAC, prior to signature verification P256PublicKey dac_public_key; err = ExtractPubkeyFromX509Cert(dac_cert_span, dac_public_key); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, dac_public_key.Length() == kExpectedDacPublicKey.size()); - NL_TEST_ASSERT(inSuite, 0 == memcmp(dac_public_key.ConstBytes(), kExpectedDacPublicKey.data(), kExpectedDacPublicKey.size())); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(dac_public_key.Length(), kExpectedDacPublicKey.size()); + EXPECT_EQ(memcmp(dac_public_key.ConstBytes(), kExpectedDacPublicKey.data(), kExpectedDacPublicKey.size()), 0); // Verify round trip signature err = dac_public_key.ECDSA_validate_msg_signature(&kExampleMessage[0], sizeof(kExampleMessage), da_signature); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); } static void OnAttestationInformationVerificationCallback(void * context, const DeviceAttestationVerifier::AttestationInfo & info, @@ -156,7 +161,7 @@ static void OnAttestationInformationVerificationCallback(void * context, const D *pResult = result; } -static void TestDACVerifierExample_AttestationInfoVerification(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDeviceAttestationCredentials, TestDACVerifierExample_AttestationInfoVerification) { uint8_t attestationElementsTestVector[] = { 0x15, 0x30, 0x01, 0xeb, 0x30, 0x81, 0xe8, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x81, @@ -191,20 +196,20 @@ static void TestDACVerifierExample_AttestationInfoVerification(nlTestSuite * inS // Make sure default verifier exists and is not implemented on at least one method DeviceAttestationVerifier * default_verifier = GetDeviceAttestationVerifier(); - NL_TEST_ASSERT(inSuite, default_verifier != nullptr); + ASSERT_NE(default_verifier, nullptr); AttestationVerificationResult attestationResult = AttestationVerificationResult::kSuccess; ByteSpan emptyByteSpan; attestationResult = default_verifier->ValidateCertificationDeclarationSignature(ByteSpan(), emptyByteSpan); - NL_TEST_ASSERT(inSuite, attestationResult == AttestationVerificationResult::kNotImplemented); + EXPECT_EQ(attestationResult, AttestationVerificationResult::kNotImplemented); DeviceAttestationVerifier * example_dac_verifier = GetDefaultDACVerifier(GetTestAttestationTrustStore()); - NL_TEST_ASSERT(inSuite, example_dac_verifier != nullptr); - NL_TEST_ASSERT(inSuite, default_verifier != example_dac_verifier); + ASSERT_NE(example_dac_verifier, nullptr); + EXPECT_NE(default_verifier, example_dac_verifier); SetDeviceAttestationVerifier(example_dac_verifier); default_verifier = GetDeviceAttestationVerifier(); - NL_TEST_ASSERT(inSuite, default_verifier == example_dac_verifier); + EXPECT_EQ(default_verifier, example_dac_verifier); attestationResult = AttestationVerificationResult::kNotImplemented; Callback::Callback<DeviceAttestationVerifier::OnAttestationInformationVerification> attestationInformationVerificationCallback( @@ -216,10 +221,10 @@ static void TestDACVerifierExample_AttestationInfoVerification(nlTestSuite * inS static_cast<VendorId>(0xFFF1), 0x8000); default_verifier->VerifyAttestationInformation(info, &attestationInformationVerificationCallback); - NL_TEST_ASSERT(inSuite, attestationResult == AttestationVerificationResult::kSuccess); + EXPECT_EQ(attestationResult, AttestationVerificationResult::kSuccess); } -static void TestDACVerifierExample_CertDeclarationVerification(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDeviceAttestationCredentials, TestDACVerifierExample_CertDeclarationVerification) { // -> format_version = 1 // -> vendor_id = 0xFFF1 @@ -258,11 +263,11 @@ static void TestDACVerifierExample_CertDeclarationVerification(nlTestSuite * inS // Replace default verifier with example verifier DeviceAttestationVerifier * example_dac_verifier = GetDefaultDACVerifier(GetTestAttestationTrustStore()); - NL_TEST_ASSERT(inSuite, example_dac_verifier != nullptr); + ASSERT_NE(example_dac_verifier, nullptr); SetDeviceAttestationVerifier(example_dac_verifier); DeviceAttestationVerifier * default_verifier = GetDeviceAttestationVerifier(); - NL_TEST_ASSERT(inSuite, default_verifier == example_dac_verifier); + EXPECT_EQ(default_verifier, example_dac_verifier); // Check for CD presence uint8_t cd_data_buf[kMaxCMSSignedCDMessage] = { 0 }; @@ -271,9 +276,9 @@ static void TestDACVerifierExample_CertDeclarationVerification(nlTestSuite * inS ByteSpan cd_payload; AttestationVerificationResult attestation_result = default_verifier->ValidateCertificationDeclarationSignature(ByteSpan(sTest_CD), cd_payload); - NL_TEST_ASSERT(inSuite, attestation_result == AttestationVerificationResult::kSuccess); + EXPECT_EQ(attestation_result, AttestationVerificationResult::kSuccess); - NL_TEST_ASSERT(inSuite, cd_payload.data_equal(ByteSpan(sTestCMS_CDContent))); + EXPECT_TRUE(cd_payload.data_equal(ByteSpan(sTestCMS_CDContent))); DeviceInfoForAttestation deviceInfo{ .vendorId = sTestCMS_CertElements.VendorId, @@ -285,10 +290,10 @@ static void TestDACVerifierExample_CertDeclarationVerification(nlTestSuite * inS .paaVendorId = sTestCMS_CertElements.VendorId, }; attestation_result = default_verifier->ValidateCertificateDeclarationPayload(cd_payload, ByteSpan(), deviceInfo); - NL_TEST_ASSERT(inSuite, attestation_result == AttestationVerificationResult::kSuccess); + EXPECT_EQ(attestation_result, AttestationVerificationResult::kSuccess); } -static void TestDACVerifierExample_NocsrInformationVerification(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDeviceAttestationCredentials, TestDACVerifierExample_NocsrInformationVerification) { CHIP_ERROR err = CHIP_NO_ERROR; @@ -335,25 +340,25 @@ static void TestDACVerifierExample_NocsrInformationVerification(nlTestSuite * in 0x8d, 0x85, 0xfb, 0xd7, 0xa0, 0x7c, 0x8e, 0x83, 0x7d, 0xa4, 0xd5, 0xa8, 0xb9 }; DeviceAttestationVerifier * exampleDacVerifier = GetDefaultDACVerifier(GetTestAttestationTrustStore()); - NL_TEST_ASSERT(inSuite, exampleDacVerifier != nullptr); + ASSERT_NE(exampleDacVerifier, nullptr); P256PublicKey dacPubkey; - NL_TEST_ASSERT(inSuite, sizeof(attestationPublicKey) == dacPubkey.Length()); + EXPECT_EQ(sizeof(attestationPublicKey), dacPubkey.Length()); memcpy(dacPubkey.Bytes(), attestationPublicKey, dacPubkey.Length()); err = exampleDacVerifier->VerifyNodeOperationalCSRInformation( ByteSpan(nocsrElementsTestVector), ByteSpan(attestationChallengeTestVector), ByteSpan(attestationSignatureTestVector), dacPubkey, ByteSpan(csrNonceTestVector)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // now test with invalid signature err = exampleDacVerifier->VerifyNodeOperationalCSRInformation( ByteSpan(nocsrElementsTestVector), ByteSpan(attestationChallengeTestVector), ByteSpan(wrongAttestationSignatureTestVector), dacPubkey, ByteSpan(csrNonceTestVector)); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_SIGNATURE); + EXPECT_EQ(err, CHIP_ERROR_INVALID_SIGNATURE); } -static void TestAttestationTrustStore(nlTestSuite * inSuite, void * inContext) +TEST_F(TestDeviceAttestationCredentials, TestAttestationTrustStore) { // SKID to trigger CHIP_ERROR_INVALID_ARGUMENT ByteSpan kPaaFFF1BadSkidSpan1{ TestCerts::sTestCert_PAA_FFF1_Cert.data(), TestCerts::sTestCert_PAA_FFF1_Cert.size() - 1 }; @@ -383,7 +388,7 @@ static void TestAttestationTrustStore(nlTestSuite * inSuite, void * inContext) }; const AttestationTrustStore * testAttestationTrustStore = GetTestAttestationTrustStore(); - NL_TEST_ASSERT(inSuite, testAttestationTrustStore != nullptr); + ASSERT_NE(testAttestationTrustStore, nullptr); for (const auto & testCase : kTestCases) { @@ -397,68 +402,12 @@ static void TestAttestationTrustStore(nlTestSuite * inSuite, void * inContext) // Try to obtain cert CHIP_ERROR result = testAttestationTrustStore->GetProductAttestationAuthorityCert(testCase.skidSpan, paaCertSpan); - NL_TEST_ASSERT(inSuite, result == testCase.expectedResult); + EXPECT_EQ(result, testCase.expectedResult); // In success cases, make sure the cert matches expectation. if (testCase.expectedResult == CHIP_NO_ERROR) { - NL_TEST_ASSERT(inSuite, paaCertSpan.data_equal(testCase.expectedCertSpan) == true); + EXPECT_TRUE(paaCertSpan.data_equal(testCase.expectedCertSpan)); } } } - -/** - * Set up the test suite. - */ -int TestDeviceAttestation_Setup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - - if (error != CHIP_NO_ERROR) - { - return FAILURE; - } - - return SUCCESS; -} - -/** - * Tear down the test suite. - */ -int TestDeviceAttestation_Teardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - -/** - * Test Suite. It lists all the test functions. - */ -// clang-format off -static const nlTest sTests[] = { - NL_TEST_DEF("Test Example Device Attestation Credentials Providers", TestDACProvidersExample_Providers), - NL_TEST_DEF("Test Example Device Attestation Signature", TestDACProvidersExample_Signature), - NL_TEST_DEF("Test the 'for testing' Paa Root Store", TestAttestationTrustStore), - NL_TEST_DEF("Test Example Device Attestation Information Verification", TestDACVerifierExample_AttestationInfoVerification), - NL_TEST_DEF("Test Example Device Attestation Certification Declaration Verification", TestDACVerifierExample_CertDeclarationVerification), - NL_TEST_DEF("Test Example Device Attestation Node Operational CSR Information Verification", TestDACVerifierExample_NocsrInformationVerification), - NL_TEST_SENTINEL() -}; -// clang-format on - -int TestDeviceAttestation() -{ - // clang-format off - nlTestSuite theSuite = - { - "Device Attestation Credentials", - &sTests[0], - TestDeviceAttestation_Setup, - TestDeviceAttestation_Teardown - }; - // clang-format on - nlTestRunner(&theSuite, nullptr); - return (nlTestRunnerStats(&theSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestDeviceAttestation); diff --git a/src/credentials/tests/TestFabricTable.cpp b/src/credentials/tests/TestFabricTable.cpp index 8dd65192441aea..a6b9f2ee6bc467 100644 --- a/src/credentials/tests/TestFabricTable.cpp +++ b/src/credentials/tests/TestFabricTable.cpp @@ -22,7 +22,7 @@ */ #include <errno.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> #include <lib/core/CHIPCore.h> @@ -36,8 +36,7 @@ #include <lib/asn1/ASN1.h> #include <lib/support/CodeUtils.h> #include <lib/support/TestPersistentStorageDelegate.h> -#include <lib/support/UnitTestExtendedAssertions.h> -#include <lib/support/UnitTestRegistration.h> + #include <platform/ConfigurationManager.h> #include <lib/support/BytesToHex.h> @@ -83,7 +82,7 @@ class ScopedFabricTable /** * Load a single test fabric with with the Root01:ICA01:Node01_01 identity. */ -static CHIP_ERROR LoadTestFabric_Node01_01(nlTestSuite * inSuite, FabricTable & fabricTable, bool doCommit) +static CHIP_ERROR LoadTestFabric_Node01_01(FabricTable & fabricTable, bool doCommit) { Crypto::P256SerializedKeypair opKeysSerialized; static Crypto::P256Keypair opKey_Node01_01; @@ -114,7 +113,7 @@ static CHIP_ERROR LoadTestFabric_Node01_01(nlTestSuite * inSuite, FabricTable & return CHIP_NO_ERROR; } -static CHIP_ERROR LoadTestFabric_Node01_02(nlTestSuite * inSuite, FabricTable & fabricTable, bool doCommit) +static CHIP_ERROR LoadTestFabric_Node01_02(FabricTable & fabricTable, bool doCommit) { Crypto::P256SerializedKeypair opKeysSerialized; FabricIndex fabricIndex; @@ -147,7 +146,7 @@ static CHIP_ERROR LoadTestFabric_Node01_02(nlTestSuite * inSuite, FabricTable & /** * Load a single test fabric with with the Root02:ICA02:Node02_01 identity. */ -static CHIP_ERROR LoadTestFabric_Node02_01(nlTestSuite * inSuite, FabricTable & fabricTable, bool doCommit, +static CHIP_ERROR LoadTestFabric_Node02_01(FabricTable & fabricTable, bool doCommit, FabricTable::AdvertiseIdentity advertiseIdentity = FabricTable::AdvertiseIdentity::Yes) { Crypto::P256SerializedKeypair opKeysSerialized; @@ -163,55 +162,67 @@ static CHIP_ERROR LoadTestFabric_Node02_01(nlTestSuite * inSuite, FabricTable & ByteSpan icacSpan(TestCerts::sTestCert_ICA02_Chip); ByteSpan nocSpan(TestCerts::sTestCert_Node02_01_Chip); - NL_TEST_ASSERT(inSuite, - opKeysSerialized.SetLength(TestCerts::sTestCert_Node02_01_PublicKey.size() + - TestCerts::sTestCert_Node02_01_PrivateKey.size()) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opKey_Node02_01.Deserialize(opKeysSerialized) == CHIP_NO_ERROR); + EXPECT_EQ(opKeysSerialized.SetLength(TestCerts::sTestCert_Node02_01_PublicKey.size() + + TestCerts::sTestCert_Node02_01_PrivateKey.size()), + CHIP_NO_ERROR); + EXPECT_EQ(opKey_Node02_01.Deserialize(opKeysSerialized), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcacSpan) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcacSpan), CHIP_NO_ERROR); CHIP_ERROR err = fabricTable.AddNewPendingFabricWithProvidedOpKey(nocSpan, icacSpan, VendorId::TestVendor1, &opKey_Node02_01, /*isExistingOpKeyExternallyOwned =*/true, &fabricIndex, advertiseIdentity); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); if (doCommit) { err = fabricTable.CommitPendingFabricData(); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); } return err; } -void TestLastKnownGoodTimeInit(nlTestSuite * inSuite, void * inContext) + +struct TestFabricTable : public ::testing::Test +{ + + static void SetUpTestSuite() + { + DeviceLayer::SetConfigurationMgr(&DeviceLayer::ConfigurationManagerImpl::GetDefaultInstance()); + ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); + } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestFabricTable, TestLastKnownGoodTimeInit) { // Fabric table init should init Last Known Good Time to the firmware build time. chip::TestPersistentStorageDelegate testStorage; ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&testStorage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&testStorage), CHIP_NO_ERROR); System::Clock::Seconds32 lastKnownGoodChipEpochTime; FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodChipEpochTime) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodChipEpochTime), CHIP_NO_ERROR); System::Clock::Seconds32 firmwareBuildTime; - NL_TEST_ASSERT(inSuite, DeviceLayer::ConfigurationMgr().GetFirmwareBuildChipEpochTime(firmwareBuildTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodChipEpochTime == firmwareBuildTime); + EXPECT_EQ(DeviceLayer::ConfigurationMgr().GetFirmwareBuildChipEpochTime(firmwareBuildTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodChipEpochTime, firmwareBuildTime); } -void TestCollidingFabrics(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestCollidingFabrics) { chip::TestPersistentStorageDelegate testStorage; ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&testStorage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&testStorage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); // // Start by loading NOCs for two nodes on the same fabric. The second one should fail since the FabricTable by default // doesn't permit colliding fabrics. // - NL_TEST_ASSERT(inSuite, LoadTestFabric_Node01_01(inSuite, fabricTable, /* doCommit = */ true) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, LoadTestFabric_Node01_02(inSuite, fabricTable, /* doCommit = */ true) != CHIP_NO_ERROR); + EXPECT_EQ(LoadTestFabric_Node01_01(fabricTable, /* doCommit = */ true), CHIP_NO_ERROR); + EXPECT_NE(LoadTestFabric_Node01_02(fabricTable, /* doCommit = */ true), CHIP_NO_ERROR); // // Revert the partially added NOC from the last call, permit colliding fabrics in the FabricTable and try again. @@ -219,12 +230,12 @@ void TestCollidingFabrics(nlTestSuite * inSuite, void * inContext) // fabricTable.RevertPendingFabricData(); fabricTable.PermitCollidingFabrics(); - NL_TEST_ASSERT(inSuite, LoadTestFabric_Node01_02(inSuite, fabricTable, /* doCommit = */ true) == CHIP_NO_ERROR); + EXPECT_EQ(LoadTestFabric_Node01_02(fabricTable, /* doCommit = */ true), CHIP_NO_ERROR); ByteSpan rcacSpan(TestCerts::sTestCert_Root01_Chip); Credentials::P256PublicKeySpan rootPublicKeySpan; - NL_TEST_ASSERT(inSuite, Credentials::ExtractPublicKeyFromChipCert(rcacSpan, rootPublicKeySpan) == CHIP_NO_ERROR); + EXPECT_EQ(Credentials::ExtractPublicKeyFromChipCert(rcacSpan, rootPublicKeySpan), CHIP_NO_ERROR); // // Ensure we can find both node identities in the FabricTable. @@ -235,8 +246,8 @@ void TestCollidingFabrics(nlTestSuite * inSuite, void * inContext) NodeId nodeId; FabricId fabricId; - NL_TEST_ASSERT(inSuite, ExtractNodeIdFabricIdFromOpCert(origNocSpan, &nodeId, &fabricId) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, fabricTable.FindIdentity(rootPublicKeySpan, fabricId, nodeId) != nullptr); + EXPECT_EQ(ExtractNodeIdFabricIdFromOpCert(origNocSpan, &nodeId, &fabricId), CHIP_NO_ERROR); + EXPECT_NE(fabricTable.FindIdentity(rootPublicKeySpan, fabricId, nodeId), nullptr); } { @@ -245,12 +256,12 @@ void TestCollidingFabrics(nlTestSuite * inSuite, void * inContext) NodeId nodeId; FabricId fabricId; - NL_TEST_ASSERT(inSuite, ExtractNodeIdFabricIdFromOpCert(origNocSpan, &nodeId, &fabricId) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, fabricTable.FindIdentity(rootPublicKeySpan, fabricId, nodeId) != nullptr); + EXPECT_EQ(ExtractNodeIdFabricIdFromOpCert(origNocSpan, &nodeId, &fabricId), CHIP_NO_ERROR); + EXPECT_NE(fabricTable.FindIdentity(rootPublicKeySpan, fabricId, nodeId), nullptr); } } -void TestUpdateLastKnownGoodTime(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestUpdateLastKnownGoodTime) { // Adding a fabric should advance Last Known Good Time if any certificate's // NotBefore time is later than the build time, and else should leave it @@ -259,7 +270,7 @@ void TestUpdateLastKnownGoodTime(nlTestSuite * inSuite, void * inContext) // Test certs all have this NotBefore: Oct 15 14:23:43 2020 GMT const ASN1::ASN1UniversalTime asn1Expected = { 2020, 10, 15, 14, 23, 43 }; uint32_t testCertNotBeforeSeconds; - NL_TEST_ASSERT(inSuite, Credentials::ASN1ToChipEpochTime(asn1Expected, testCertNotBeforeSeconds) == CHIP_NO_ERROR); + EXPECT_EQ(Credentials::ASN1ToChipEpochTime(asn1Expected, testCertNotBeforeSeconds), CHIP_NO_ERROR); System::Clock::Seconds32 testCertNotBeforeTime = System::Clock::Seconds32(testCertNotBeforeSeconds); // Test that certificate NotBefore times that are before the Firmware build time @@ -270,22 +281,22 @@ void TestUpdateLastKnownGoodTime(nlTestSuite * inSuite, void * inContext) for (auto buildTime : afterNotBeforeBuildTimes) { // Set build time to the desired value. - NL_TEST_ASSERT(inSuite, DeviceLayer::ConfigurationMgr().SetFirmwareBuildChipEpochTime(buildTime) == CHIP_NO_ERROR); + EXPECT_EQ(DeviceLayer::ConfigurationMgr().SetFirmwareBuildChipEpochTime(buildTime), CHIP_NO_ERROR); chip::TestPersistentStorageDelegate testStorage; { // Initialize a fabric table. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&testStorage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&testStorage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); // Read back Last Known Good Time, which will have been initialized to firmware build time. System::Clock::Seconds32 lastKnownGoodTime; - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == buildTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, buildTime); // Load a test fabric, but do not commit. - NL_TEST_ASSERT(inSuite, LoadTestFabric_Node01_01(inSuite, fabricTable, /* doCommit = */ false) == CHIP_NO_ERROR); + EXPECT_EQ(LoadTestFabric_Node01_01(fabricTable, /* doCommit = */ false), CHIP_NO_ERROR); // Read Last Known Good Time and verify that it hasn't moved forward. // This test case was written after the test certs' NotBefore time and we @@ -293,17 +304,17 @@ void TestUpdateLastKnownGoodTime(nlTestSuite * inSuite, void * inContext) // Therefore, we expect that build time is after NotBefore and so Last // Known Good Time will be set to the later of these, build time, even // after installing the new fabric. - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == buildTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, buildTime); // Verify that calling the fail-safe roll back interface does not change // last known good time, as it hadn't been updated in the first place. fabricTable.RevertPendingFabricData(); - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == buildTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, buildTime); // Now reload the test fabric and commit this time. - NL_TEST_ASSERT(inSuite, LoadTestFabric_Node01_01(inSuite, fabricTable, /* doCommit = */ true) == CHIP_NO_ERROR); + EXPECT_EQ(LoadTestFabric_Node01_01(fabricTable, /* doCommit = */ true), CHIP_NO_ERROR); // Read Last Known Good Time and verify that it hasn't moved forward. // This test case was written after the test certs' NotBefore time and we @@ -311,25 +322,25 @@ void TestUpdateLastKnownGoodTime(nlTestSuite * inSuite, void * inContext) // Therefore, we expect that build time is after NotBefore and so Last // Known Good Time will be set to the later of these, build time, even // after installing the new fabric. - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == buildTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, buildTime); // Call revert again. Since we've committed, this is a no-op. // Last known good time should again be unchanged. fabricTable.RevertPendingFabricData(); - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == buildTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, buildTime); } { // Test reloading last known good time from persistence. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&testStorage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&testStorage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); // Verify that last known good time was retained. System::Clock::Seconds32 lastKnownGoodTime; - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == buildTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, buildTime); } } @@ -343,75 +354,75 @@ void TestUpdateLastKnownGoodTime(nlTestSuite * inSuite, void * inContext) for (auto buildTime : beforeNotBeforeBuildTimes) { // Set build time to the desired value. - NL_TEST_ASSERT(inSuite, DeviceLayer::ConfigurationMgr().SetFirmwareBuildChipEpochTime(buildTime) == CHIP_NO_ERROR); + EXPECT_EQ(DeviceLayer::ConfigurationMgr().SetFirmwareBuildChipEpochTime(buildTime), CHIP_NO_ERROR); chip::TestPersistentStorageDelegate testStorage; { // Initialize a fabric table. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&testStorage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&testStorage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); // Load a test fabric, but do not commit. - NL_TEST_ASSERT(inSuite, LoadTestFabric_Node01_01(inSuite, fabricTable, /* doCommit = */ false) == CHIP_NO_ERROR); + EXPECT_EQ(LoadTestFabric_Node01_01(fabricTable, /* doCommit = */ false), CHIP_NO_ERROR); // Read Last Known Good Time and verify that it is now set to the certificate // NotBefore time, as this should be at or after firmware build time. System::Clock::Seconds32 lastKnownGoodTime; - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == testCertNotBeforeTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, testCertNotBeforeTime); // Now test revert. Last known good time should change back to the // previous value. fabricTable.RevertPendingFabricData(); - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == buildTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, buildTime); } { // Test reloading last known good time from persistence. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&testStorage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&testStorage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); // Verify that the original last known good time was retained, since // we reverted before. System::Clock::Seconds32 lastKnownGoodTime; - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); } { // Now test loading a fabric and committing. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&testStorage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&testStorage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT(inSuite, LoadTestFabric_Node01_01(inSuite, fabricTable, /* doCommit = */ true) == CHIP_NO_ERROR); + EXPECT_EQ(LoadTestFabric_Node01_01(fabricTable, /* doCommit = */ true), CHIP_NO_ERROR); // Read Last Known Good Time and verify that it is now set to the certificate // NotBefore time, as this should be at or after firmware build time. System::Clock::Seconds32 lastKnownGoodTime; - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == testCertNotBeforeTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, testCertNotBeforeTime); // Now test revert, which will be a no-op because we already // committed. Verify that Last Known Good time is retained. fabricTable.RevertPendingFabricData(); - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == testCertNotBeforeTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, testCertNotBeforeTime); } { // Test reloading last known good time from persistence. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&testStorage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&testStorage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); // Verify that the new last known good time was retained, since // we committed. System::Clock::Seconds32 lastKnownGoodTime; - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == testCertNotBeforeTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, testCertNotBeforeTime); } } } -void TestSetLastKnownGoodTime(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestSetLastKnownGoodTime) { // It is desirable for nodes to set Last Known Good Time whenever a good // time source is available, including cases where this would set the time @@ -422,7 +433,7 @@ void TestSetLastKnownGoodTime(nlTestSuite * inSuite, void * inContext) // Test certs all have this NotBefore: Oct 15 14:23:43 2020 GMT const ASN1::ASN1UniversalTime asn1Expected = { 2020, 10, 15, 14, 23, 43 }; uint32_t testCertNotBeforeSeconds; - NL_TEST_ASSERT(inSuite, Credentials::ASN1ToChipEpochTime(asn1Expected, testCertNotBeforeSeconds) == CHIP_NO_ERROR); + EXPECT_EQ(Credentials::ASN1ToChipEpochTime(asn1Expected, testCertNotBeforeSeconds), CHIP_NO_ERROR); System::Clock::Seconds32 testCertNotBeforeTime = System::Clock::Seconds32(testCertNotBeforeSeconds); // Iterate over two cases: one with build time prior to our certificates' NotBefore, one with build time after. @@ -432,77 +443,77 @@ void TestSetLastKnownGoodTime(nlTestSuite * inSuite, void * inContext) for (auto buildTime : testCaseFirmwareBuildTimes) { // Set build time to the desired value. - NL_TEST_ASSERT(inSuite, DeviceLayer::ConfigurationMgr().SetFirmwareBuildChipEpochTime(buildTime) == CHIP_NO_ERROR); + EXPECT_EQ(DeviceLayer::ConfigurationMgr().SetFirmwareBuildChipEpochTime(buildTime), CHIP_NO_ERROR); chip::TestPersistentStorageDelegate testStorage; System::Clock::Seconds32 newTime; { // Initialize a fabric table. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&testStorage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&testStorage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); // Load a test fabric - NL_TEST_ASSERT(inSuite, LoadTestFabric_Node01_01(inSuite, fabricTable, /* doCommit= */ true) == CHIP_NO_ERROR); + EXPECT_EQ(LoadTestFabric_Node01_01(fabricTable, /* doCommit= */ true), CHIP_NO_ERROR); // Verify the Last Known Good Time matches our expected initial value. System::Clock::Seconds32 initialLastKnownGoodTime = buildTime > testCertNotBeforeTime ? buildTime : testCertNotBeforeTime; System::Clock::Seconds32 lastKnownGoodTime; - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == initialLastKnownGoodTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, initialLastKnownGoodTime); // Read Last Known Good Time and verify that it hasn't moved forward, since // build time is later than the test certs' NotBefore times. - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == initialLastKnownGoodTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, initialLastKnownGoodTime); // Attempt to set a Last Known Good Time that is before the firmware build time. This should fail. newTime = System::Clock::Seconds32(buildTime.count() - 1000); - NL_TEST_ASSERT(inSuite, fabricTable.SetLastKnownGoodChipEpochTime(newTime) != CHIP_NO_ERROR); + EXPECT_NE(fabricTable.SetLastKnownGoodChipEpochTime(newTime), CHIP_NO_ERROR); // Verify Last Known Good Time is unchanged. - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == initialLastKnownGoodTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, initialLastKnownGoodTime); // Attempt to set a Last Known Good Time that is before our certificates' NotBefore times. This should fail. newTime = System::Clock::Seconds32(testCertNotBeforeTime.count() - 1000); - NL_TEST_ASSERT(inSuite, fabricTable.SetLastKnownGoodChipEpochTime(newTime) != CHIP_NO_ERROR); + EXPECT_NE(fabricTable.SetLastKnownGoodChipEpochTime(newTime), CHIP_NO_ERROR); // Verify Last Known Good Time is unchanged. - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == initialLastKnownGoodTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, initialLastKnownGoodTime); // Attempt to set a Last Known Good Time that at our current value. - NL_TEST_ASSERT(inSuite, fabricTable.SetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.SetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); // Verify Last Known Good Time is unchanged. - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == initialLastKnownGoodTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, initialLastKnownGoodTime); // Attempt to set Last Known Good Times that is after our current value. newTime = System::Clock::Seconds32(initialLastKnownGoodTime.count() + 1000); - NL_TEST_ASSERT(inSuite, fabricTable.SetLastKnownGoodChipEpochTime(newTime) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.SetLastKnownGoodChipEpochTime(newTime), CHIP_NO_ERROR); // Verify Last Known Good Time is updated. - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == newTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, newTime); } { // Verify that Last Known Good Time was persisted. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&testStorage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&testStorage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); System::Clock::Seconds32 lastKnownGoodTime; - NL_TEST_ASSERT(inSuite, fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, lastKnownGoodTime == newTime); + EXPECT_EQ(fabricTable.GetLastKnownGoodChipEpochTime(lastKnownGoodTime), CHIP_NO_ERROR); + EXPECT_EQ(lastKnownGoodTime, newTime); } } } // Test adding 2 fabrics, updating 1, removing 1 -void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestBasicAddNocUpdateNocFlow) { Credentials::TestOnlyLocalCertificateAuthority fabric11CertAuthority; Credentials::TestOnlyLocalCertificateAuthority fabric44CertAuthority; @@ -513,25 +524,25 @@ void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) // storage.SetLoggingLevel(chip::TestPersistentStorageDelegate::LoggingLevel::kLogMutation); // Initialize test CA and a Fabric 11 externally owned key - NL_TEST_ASSERT(inSuite, fabric11CertAuthority.Init().IsSuccess()); - NL_TEST_ASSERT(inSuite, fabric44CertAuthority.Init().IsSuccess()); + EXPECT_TRUE(fabric11CertAuthority.Init().IsSuccess()); + EXPECT_TRUE(fabric44CertAuthority.Init().IsSuccess()); constexpr uint16_t kVendorId = 0xFFF1u; chip::Crypto::P256Keypair fabric11Node55Keypair; // Fabric ID 11, - NL_TEST_ASSERT(inSuite, fabric11Node55Keypair.Initialize(Crypto::ECPKeyTarget::ECDSA) == CHIP_NO_ERROR); + EXPECT_EQ(fabric11Node55Keypair.Initialize(Crypto::ECPKeyTarget::ECDSA), CHIP_NO_ERROR); // Initialize a fabric table. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&storage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&storage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.FabricCount(), 0); { FabricIndex nextFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT(inSuite, fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex) == CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, nextFabricIndex, 1); + EXPECT_EQ(fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(nextFabricIndex, 1); } size_t numFabricsIterated = 0; @@ -542,10 +553,10 @@ void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) { FabricId fabricId = 11; NodeId nodeId = 55; - NL_TEST_ASSERT_SUCCESS(inSuite, - fabric11CertAuthority.SetIncludeIcac(false) - .GenerateNocChain(fabricId, nodeId, fabric11Node55Keypair.Pubkey()) - .GetStatus()); + EXPECT_EQ(fabric11CertAuthority.SetIncludeIcac(false) + .GenerateNocChain(fabricId, nodeId, fabric11Node55Keypair.Pubkey()) + .GetStatus(), + CHIP_NO_ERROR); ByteSpan rcac = fabric11CertAuthority.GetRcac(); ByteSpan noc = fabric11CertAuthority.GetNoc(); @@ -562,48 +573,48 @@ void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 0); - NL_TEST_ASSERT(inSuite, saw1 == false); + EXPECT_EQ(numFabricsIterated, 0u); + EXPECT_FALSE(saw1); } uint8_t rcacBuf[Credentials::kMaxCHIPCertLength]; { // No pending root cert yet. MutableByteSpan fetchedSpan{ rcacBuf }; - NL_TEST_ASSERT(inSuite, fabricTable.FetchPendingNonFabricAssociatedRootCert(fetchedSpan) == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(fabricTable.FetchPendingNonFabricAssociatedRootCert(fetchedSpan), CHIP_ERROR_NOT_FOUND); } - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); { // Now have a pending root cert. MutableByteSpan fetchedSpan{ rcacBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchPendingNonFabricAssociatedRootCert(fetchedSpan)); - NL_TEST_ASSERT(inSuite, fetchedSpan.data_equal(rcac)); + EXPECT_EQ(fabricTable.FetchPendingNonFabricAssociatedRootCert(fetchedSpan), CHIP_NO_ERROR); + EXPECT_TRUE(fetchedSpan.data_equal(rcac)); } FabricIndex newFabricIndex = kUndefinedFabricIndex; bool keyIsExternallyOwned = true; - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AddNewPendingFabricWithProvidedOpKey(noc, ByteSpan{}, kVendorId, &fabric11Node55Keypair, - keyIsExternallyOwned, &newFabricIndex)); - NL_TEST_ASSERT(inSuite, newFabricIndex == 1); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithProvidedOpKey(noc, ByteSpan{}, kVendorId, &fabric11Node55Keypair, + keyIsExternallyOwned, &newFabricIndex), + CHIP_NO_ERROR); + EXPECT_EQ(newFabricIndex, 1); + EXPECT_EQ(fabricTable.FabricCount(), 1); { // No more pending root cert; it's associated with a fabric now. MutableByteSpan fetchedSpan{ rcacBuf }; - NL_TEST_ASSERT(inSuite, fabricTable.FetchPendingNonFabricAssociatedRootCert(fetchedSpan) == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(fabricTable.FetchPendingNonFabricAssociatedRootCert(fetchedSpan), CHIP_ERROR_NOT_FOUND); } // No storage yet - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == numStorageKeysAtStart); + EXPECT_EQ(storage.GetNumKeys(), numStorageKeysAtStart); // Next fabric index has not been updated yet. { FabricIndex nextFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT(inSuite, fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex) == CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, nextFabricIndex, 1); + EXPECT_EQ(fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(nextFabricIndex, 1); } // Validate iterator sees pending @@ -615,56 +626,51 @@ void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == nodeId); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == fabricId); + EXPECT_EQ(iterFabricInfo.GetNodeId(), nodeId); + EXPECT_EQ(iterFabricInfo.GetFabricId(), fabricId); saw1 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 1); - NL_TEST_ASSERT(inSuite, saw1 == true); + EXPECT_EQ(numFabricsIterated, 1u); + EXPECT_TRUE(saw1); } // Commit, now storage should have keys - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == (numStorageKeysAtStart + 4)); // 2 opcerts + fabric metadata + index + EXPECT_EQ(storage.GetNumKeys(), (numStorageKeysAtStart + 4)); // 2 opcerts + fabric metadata + index // Next fabric index has been updated. { FabricIndex nextFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT(inSuite, fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex) == CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, nextFabricIndex, 2); + EXPECT_EQ(fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(nextFabricIndex, 2); } // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(1); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); - Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == newFabricIndex); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == nodeId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == fabricId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); - } + ASSERT_NE(fabricInfo, nullptr); + Credentials::ChipCertificateSet certificates; + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); + Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), newFabricIndex); + EXPECT_EQ(fabricInfo->GetNodeId(), nodeId); + EXPECT_EQ(fabricInfo->GetFabricId(), fabricId); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); + + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); // Validate that fabric has the correct operational key by verifying a signature Crypto::P256ECDSASignature sig; uint8_t message[] = { 'm', 's', 'g' }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SignWithOpKeypair(newFabricIndex, ByteSpan{ message }, sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabric11Node55Keypair.Pubkey().ECDSA_validate_msg_signature(&message[0], sizeof(message), sig)); + EXPECT_EQ(fabricTable.SignWithOpKeypair(newFabricIndex, ByteSpan{ message }, sig), CHIP_NO_ERROR); + EXPECT_EQ(fabric11Node55Keypair.Pubkey().ECDSA_validate_msg_signature(&message[0], sizeof(message), sig), CHIP_NO_ERROR); // Validate iterator sees committed { @@ -675,14 +681,14 @@ void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == nodeId); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == fabricId); + EXPECT_EQ(iterFabricInfo.GetNodeId(), nodeId); + EXPECT_EQ(iterFabricInfo.GetFabricId(), fabricId); saw1 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 1); - NL_TEST_ASSERT(inSuite, saw1 == true); + EXPECT_EQ(numFabricsIterated, 1u); + EXPECT_TRUE(saw1); } } @@ -695,75 +701,70 @@ void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabric44CertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabric44CertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), + CHIP_NO_ERROR); ByteSpan rcac = fabric44CertAuthority.GetRcac(); ByteSpan icac = fabric44CertAuthority.GetIcac(); ByteSpan noc = fabric44CertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.FabricCount(), 1); // Next fabric index should still be the same as before. { FabricIndex nextFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT(inSuite, fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex) == CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, nextFabricIndex, 2); + EXPECT_EQ(fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(nextFabricIndex, 2); } - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 2); - NL_TEST_ASSERT(inSuite, newFabricIndex == 2); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 2); + EXPECT_EQ(newFabricIndex, 2); // No storage yet - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == numStorageAfterFirstAdd); + EXPECT_EQ(storage.GetNumKeys(), numStorageAfterFirstAdd); // Next fabric index has not been updated yet. { FabricIndex nextFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT(inSuite, fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex) == CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, nextFabricIndex, 2); + EXPECT_EQ(fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(nextFabricIndex, 2); } // Commit, now storage should have keys - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 2); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 2); - NL_TEST_ASSERT_EQUALS(inSuite, storage.GetNumKeys(), - (numStorageAfterFirstAdd + 5)); // 3 opcerts + fabric metadata + 1 operational key + EXPECT_EQ(storage.GetNumKeys(), + (numStorageAfterFirstAdd + 5)); // 3 opcerts + fabric metadata + 1 operational key // Next fabric index has been updated. { FabricIndex nextFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT(inSuite, fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex) == CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, nextFabricIndex, 3); + EXPECT_EQ(fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(nextFabricIndex, 3); } // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(2); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); - Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == newFabricIndex); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == nodeId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == fabricId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); - } + ASSERT_NE(fabricInfo, nullptr); + Credentials::ChipCertificateSet certificates; + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); + Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), newFabricIndex); + EXPECT_EQ(fabricInfo->GetNodeId(), nodeId); + EXPECT_EQ(fabricInfo->GetFabricId(), fabricId); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); + + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); // Validate that fabric has the correct operational key by verifying a signature { @@ -771,10 +772,10 @@ void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) uint8_t message[] = { 'm', 's', 'g' }; Crypto::P256PublicKey nocPubKey; - NL_TEST_ASSERT_SUCCESS(inSuite, VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), nocPubKey)); + EXPECT_EQ(VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), nocPubKey), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SignWithOpKeypair(newFabricIndex, ByteSpan{ message }, sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, nocPubKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig)); + EXPECT_EQ(fabricTable.SignWithOpKeypair(newFabricIndex, ByteSpan{ message }, sig), CHIP_NO_ERROR); + EXPECT_EQ(nocPubKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig), CHIP_NO_ERROR); } // Verify we can now see 2 fabrics with the iterator @@ -787,21 +788,21 @@ void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 11); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 55u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 11u); saw1 = true; } if (iterFabricInfo.GetFabricIndex() == 2) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 999); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 44); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 999u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 44u); saw2 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 2); - NL_TEST_ASSERT(inSuite, saw1 == true); - NL_TEST_ASSERT(inSuite, saw2 == true); + EXPECT_EQ(numFabricsIterated, 2u); + EXPECT_TRUE(saw1); + EXPECT_TRUE(saw2); } } @@ -817,22 +818,21 @@ void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) MutableByteSpan csrSpan{ csrBuf }; // Make sure to tag fabric index to pending opkey: otherwise the UpdateNOC fails - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AllocatePendingOperationalKey(chip::MakeOptional(static_cast<FabricIndex>(2)), csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::MakeOptional(static_cast<FabricIndex>(2)), csrSpan), + CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabric44CertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabric44CertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), + CHIP_NO_ERROR); ByteSpan rcac = fabric44CertAuthority.GetRcac(); ByteSpan noc = fabric44CertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 2); - NL_TEST_ASSERT_SUCCESS( - inSuite, - fabricTable.UpdatePendingFabricWithOperationalKeystore(2, noc, ByteSpan{}, FabricTable::AdvertiseIdentity::No)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 2); + EXPECT_EQ(fabricTable.FabricCount(), 2); + EXPECT_EQ(fabricTable.UpdatePendingFabricWithOperationalKeystore(2, noc, ByteSpan{}, FabricTable::AdvertiseIdentity::No), + CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 2); // No storage yet - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == numStorageAfterSecondAdd); + EXPECT_EQ(storage.GetNumKeys(), numStorageAfterSecondAdd); // Validate iterator sees the pending data { @@ -844,52 +844,48 @@ void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 11); - NL_TEST_ASSERT(inSuite, iterFabricInfo.ShouldAdvertiseIdentity()); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 55u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 11u); + EXPECT_TRUE(iterFabricInfo.ShouldAdvertiseIdentity()); saw1 = true; } if (iterFabricInfo.GetFabricIndex() == 2) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 1000); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 44); - NL_TEST_ASSERT(inSuite, !iterFabricInfo.ShouldAdvertiseIdentity()); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 1000u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 44u); + EXPECT_FALSE(iterFabricInfo.ShouldAdvertiseIdentity()); saw2 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 2); - NL_TEST_ASSERT(inSuite, saw1 == true); - NL_TEST_ASSERT(inSuite, saw2 == true); + EXPECT_EQ(numFabricsIterated, 2u); + EXPECT_TRUE(saw1); + EXPECT_TRUE(saw2); } // Commit, now storage should have keys - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 2); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 2); - NL_TEST_ASSERT_EQUALS(inSuite, storage.GetNumKeys(), (numStorageAfterSecondAdd - 1)); // ICAC got deleted + EXPECT_EQ(storage.GetNumKeys(), (numStorageAfterSecondAdd - 1)); // ICAC got deleted // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(2); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); - Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == fabricIndex); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == nodeId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == fabricId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(fabricIndex, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); - } + ASSERT_NE(fabricInfo, nullptr); + Credentials::ChipCertificateSet certificates; + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); + Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), fabricIndex); + EXPECT_EQ(fabricInfo->GetNodeId(), nodeId); + EXPECT_EQ(fabricInfo->GetFabricId(), fabricId); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); + + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(fabricIndex, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); // Validate that fabric has the correct operational key by verifying a signature { @@ -897,10 +893,10 @@ void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) uint8_t message[] = { 'm', 's', 'g' }; Crypto::P256PublicKey nocPubKey; - NL_TEST_ASSERT_SUCCESS(inSuite, VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), nocPubKey)); + EXPECT_EQ(VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), nocPubKey), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SignWithOpKeypair(fabricIndex, ByteSpan{ message }, sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, nocPubKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig)); + EXPECT_EQ(fabricTable.SignWithOpKeypair(fabricIndex, ByteSpan{ message }, sig), CHIP_NO_ERROR); + EXPECT_EQ(nocPubKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig), CHIP_NO_ERROR); } // Validate iterator sees the committed update @@ -913,28 +909,28 @@ void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 11); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 55u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 11u); saw1 = true; } if (iterFabricInfo.GetFabricIndex() == 2) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 1000); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 44); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 1000u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 44u); saw2 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 2); - NL_TEST_ASSERT(inSuite, saw1 == true); - NL_TEST_ASSERT(inSuite, saw2 == true); + EXPECT_EQ(numFabricsIterated, 2u); + EXPECT_TRUE(saw1); + EXPECT_TRUE(saw2); } // Next fabric index has stayed the same. { FabricIndex nextFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT(inSuite, fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex) == CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, nextFabricIndex, 3); + EXPECT_EQ(fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(nextFabricIndex, 3); } } @@ -942,31 +938,28 @@ void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) // Sequence 4: Rename fabric index 2, applies immediately when nothing pending { - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 2); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SetFabricLabel(2, "roboto"_span)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 2); + EXPECT_EQ(fabricTable.FabricCount(), 2); + EXPECT_EQ(fabricTable.SetFabricLabel(2, "roboto"_span), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 2); - NL_TEST_ASSERT_EQUALS(inSuite, storage.GetNumKeys(), numStorageAfterUpdate); // Number of keys unchanged + EXPECT_EQ(storage.GetNumKeys(), numStorageAfterUpdate); // Number of keys unchanged // Validate basic contents { const auto * fabricInfo = fabricTable.FindFabricWithIndex(2); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 2); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 1000); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 44); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().data_equal(CharSpan{ "roboto", strlen("roboto") })); - } + ASSERT_NE(fabricInfo, nullptr); + EXPECT_EQ(fabricInfo->GetFabricIndex(), 2); + EXPECT_EQ(fabricInfo->GetNodeId(), 1000u); + EXPECT_EQ(fabricInfo->GetFabricId(), 44u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_TRUE(fabricInfo->GetFabricLabel().data_equal(CharSpan{ "roboto", strlen("roboto") })); } // Next fabric index has stayed the same. { FabricIndex nextFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT(inSuite, fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex) == CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, nextFabricIndex, 3); + EXPECT_EQ(fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(nextFabricIndex, 3); } } @@ -974,52 +967,48 @@ void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) { // Remove the fabric: no commit needed { - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 2); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.Delete(1)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.FabricCount(), 2); + EXPECT_EQ(fabricTable.Delete(1), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 1); - NL_TEST_ASSERT_EQUALS(inSuite, storage.GetNumKeys(), (numStorageAfterUpdate - 3)); // Deleted NOC, RCAC, Metadata + EXPECT_EQ(storage.GetNumKeys(), (numStorageAfterUpdate - 3)); // Deleted NOC, RCAC, Metadata } // Next fabric index has stayed the same. { FabricIndex nextFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT(inSuite, fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex) == CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, nextFabricIndex, 3); + EXPECT_EQ(fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(nextFabricIndex, 3); } // Validate contents of Fabric Index 2 is still OK const auto * fabricInfo = fabricTable.FindFabricWithIndex(2); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 2); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 1000); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 44); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().data_equal(CharSpan{ "roboto", strlen("roboto") })); + ASSERT_NE(fabricInfo, nullptr); + EXPECT_EQ(fabricInfo->GetFabricIndex(), 2); + EXPECT_EQ(fabricInfo->GetNodeId(), 1000u); + EXPECT_EQ(fabricInfo->GetFabricId(), 44u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_TRUE(fabricInfo->GetFabricLabel().data_equal(CharSpan{ "roboto", strlen("roboto") })); - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(2, rootPublicKeyOfFabric)); - } + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(2, rootPublicKeyOfFabric), CHIP_NO_ERROR); // Validate that fabric has the correct operational key by verifying a signature { uint8_t nocBuf[Credentials::kMaxCHIPCertLength]; MutableByteSpan nocSpan{ nocBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchNOCCert(2, nocSpan)); + EXPECT_EQ(fabricTable.FetchNOCCert(2, nocSpan), CHIP_NO_ERROR); Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(nocSpan, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(nocSpan, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); Crypto::P256PublicKey nocPubKey(certificates.GetCertSet()[0].mPublicKey); Crypto::P256ECDSASignature sig; uint8_t message[] = { 'm', 's', 'g' }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SignWithOpKeypair(2, ByteSpan{ message }, sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, nocPubKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig)); + EXPECT_EQ(fabricTable.SignWithOpKeypair(2, ByteSpan{ message }, sig), CHIP_NO_ERROR); + EXPECT_EQ(nocPubKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig), CHIP_NO_ERROR); } // Validate iterator only sees the remaining fabric @@ -1036,34 +1025,34 @@ void TestBasicAddNocUpdateNocFlow(nlTestSuite * inSuite, void * inContext) } if (iterFabricInfo.GetFabricIndex() == 2) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 1000); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 44); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 1000u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 44u); saw2 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 1); - NL_TEST_ASSERT(inSuite, saw1 == false); - NL_TEST_ASSERT(inSuite, saw2 == true); + EXPECT_EQ(numFabricsIterated, 1u); + EXPECT_FALSE(saw1); + EXPECT_TRUE(saw2); } } } -void TestAddMultipleSameRootDifferentFabricId(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestAddMultipleSameRootDifferentFabricId) { Credentials::TestOnlyLocalCertificateAuthority fabricCertAuthority; chip::TestPersistentStorageDelegate storage; - NL_TEST_ASSERT(inSuite, fabricCertAuthority.Init().IsSuccess()); + EXPECT_TRUE(fabricCertAuthority.Init().IsSuccess()); constexpr uint16_t kVendorId = 0xFFF1u; // Initialize a fabric table. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&storage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&storage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.FabricCount(), 0); uint8_t rcac1Buf[kMaxCHIPCertLength]; MutableByteSpan rcac1Span{ rcac1Buf }; @@ -1075,10 +1064,9 @@ void TestAddMultipleSameRootDifferentFabricId(nlTestSuite * inSuite, void * inCo uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), CHIP_NO_ERROR); ByteSpan rcac = fabricCertAuthority.GetRcac(); // Keep a copy for second scope check CopySpanToMutableSpan(rcac, rcac1Span); @@ -1086,30 +1074,26 @@ void TestAddMultipleSameRootDifferentFabricId(nlTestSuite * inSuite, void * inCo ByteSpan icac = fabricCertAuthority.GetIcac(); ByteSpan noc = fabricCertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT(inSuite, newFabricIndex == 1); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(newFabricIndex, 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(1); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 1); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 1111); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - } + ASSERT_NE(fabricInfo, nullptr); + EXPECT_EQ(fabricInfo->GetFabricIndex(), 1); + EXPECT_EQ(fabricInfo->GetNodeId(), 55u); + EXPECT_EQ(fabricInfo->GetFabricId(), 1111u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); } size_t numStorageKeysAfterFirstAdd = storage.GetNumKeys(); - NL_TEST_ASSERT(inSuite, numStorageKeysAfterFirstAdd == 7); // Metadata, index, 3 certs, 1 opkey, last known good time + EXPECT_EQ(numStorageKeysAfterFirstAdd, 7u); // Metadata, index, 3 certs, 1 opkey, last known good time // Second scope: add FabricID 2222, node ID 66, same root as first { @@ -1118,59 +1102,54 @@ void TestAddMultipleSameRootDifferentFabricId(nlTestSuite * inSuite, void * inCo uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), CHIP_NO_ERROR); ByteSpan rcac2 = fabricCertAuthority.GetRcac(); - NL_TEST_ASSERT(inSuite, rcac2.data_equal(rcac1Span)); + EXPECT_TRUE(rcac2.data_equal(rcac1Span)); ByteSpan icac = fabricCertAuthority.GetIcac(); ByteSpan noc = fabricCertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac2)); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac2), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 2); - NL_TEST_ASSERT(inSuite, newFabricIndex == 2); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 2); + EXPECT_EQ(newFabricIndex, 2); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(2); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 2); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 66); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 2222); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - } + ASSERT_NE(fabricInfo, nullptr); + EXPECT_EQ(fabricInfo->GetFabricIndex(), 2); + EXPECT_EQ(fabricInfo->GetNodeId(), 66u); + EXPECT_EQ(fabricInfo->GetFabricId(), 2222u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); } size_t numStorageKeysAfterSecondAdd = storage.GetNumKeys(); - NL_TEST_ASSERT(inSuite, numStorageKeysAfterSecondAdd == (numStorageKeysAfterFirstAdd + 5)); // Add 3 certs, 1 metadata, 1 opkey + EXPECT_EQ(numStorageKeysAfterSecondAdd, (numStorageKeysAfterFirstAdd + 5)); // Add 3 certs, 1 metadata, 1 opkey } -void TestAddMultipleSameFabricIdDifferentRoot(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestAddMultipleSameFabricIdDifferentRoot) { Credentials::TestOnlyLocalCertificateAuthority fabricCertAuthority1; Credentials::TestOnlyLocalCertificateAuthority fabricCertAuthority2; chip::TestPersistentStorageDelegate storage; - NL_TEST_ASSERT(inSuite, fabricCertAuthority1.Init().IsSuccess()); - NL_TEST_ASSERT(inSuite, fabricCertAuthority2.Init().IsSuccess()); + EXPECT_TRUE(fabricCertAuthority1.Init().IsSuccess()); + EXPECT_TRUE(fabricCertAuthority2.Init().IsSuccess()); constexpr uint16_t kVendorId = 0xFFF1u; // Initialize a fabric table. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&storage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&storage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.FabricCount(), 0); uint8_t rcac1Buf[kMaxCHIPCertLength]; MutableByteSpan rcac1Span{ rcac1Buf }; @@ -1182,10 +1161,9 @@ void TestAddMultipleSameFabricIdDifferentRoot(nlTestSuite * inSuite, void * inCo uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricCertAuthority1.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabricCertAuthority1.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), CHIP_NO_ERROR); ByteSpan rcac = fabricCertAuthority1.GetRcac(); // Keep a copy for second scope check CopySpanToMutableSpan(rcac, rcac1Span); @@ -1193,30 +1171,26 @@ void TestAddMultipleSameFabricIdDifferentRoot(nlTestSuite * inSuite, void * inCo ByteSpan icac = fabricCertAuthority1.GetIcac(); ByteSpan noc = fabricCertAuthority1.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT(inSuite, newFabricIndex == 1); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(newFabricIndex, 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(1); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 1); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 1111); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - } + ASSERT_NE(fabricInfo, nullptr); + EXPECT_EQ(fabricInfo->GetFabricIndex(), 1); + EXPECT_EQ(fabricInfo->GetNodeId(), 55u); + EXPECT_EQ(fabricInfo->GetFabricId(), 1111u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); } size_t numStorageKeysAfterFirstAdd = storage.GetNumKeys(); - NL_TEST_ASSERT(inSuite, numStorageKeysAfterFirstAdd == 7); // Metadata, index, 3 certs, 1 opkey, last known good time + EXPECT_EQ(numStorageKeysAfterFirstAdd, 7u); // Metadata, index, 3 certs, 1 opkey, last known good time // Second scope: add FabricID 1111, node ID 66, different root from first { @@ -1225,43 +1199,38 @@ void TestAddMultipleSameFabricIdDifferentRoot(nlTestSuite * inSuite, void * inCo uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricCertAuthority2.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabricCertAuthority2.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), CHIP_NO_ERROR); ByteSpan rcac2 = fabricCertAuthority2.GetRcac(); - NL_TEST_ASSERT(inSuite, !rcac2.data_equal(rcac1Span)); + EXPECT_FALSE(rcac2.data_equal(rcac1Span)); ByteSpan icac = fabricCertAuthority2.GetIcac(); ByteSpan noc = fabricCertAuthority2.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac2)); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac2), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 2); - NL_TEST_ASSERT(inSuite, newFabricIndex == 2); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 2); + EXPECT_EQ(newFabricIndex, 2); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(2); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 2); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 66); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 1111); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - } + ASSERT_NE(fabricInfo, nullptr); + EXPECT_EQ(fabricInfo->GetFabricIndex(), 2); + EXPECT_EQ(fabricInfo->GetNodeId(), 66u); + EXPECT_EQ(fabricInfo->GetFabricId(), 1111u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); } size_t numStorageKeysAfterSecondAdd = storage.GetNumKeys(); - NL_TEST_ASSERT(inSuite, numStorageKeysAfterSecondAdd == (numStorageKeysAfterFirstAdd + 5)); // Add 3 certs, 1 metadata, 1 opkey + EXPECT_EQ(numStorageKeysAfterSecondAdd, (numStorageKeysAfterFirstAdd + 5)); // Add 3 certs, 1 metadata, 1 opkey } -void TestPersistence(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestPersistence) { /** * @@ -1287,7 +1256,7 @@ void TestPersistence(nlTestSuite * inSuite, void * inContext) chip::TestPersistentStorageDelegate storage; - NL_TEST_ASSERT(inSuite, fabricCertAuthority.Init().IsSuccess()); + EXPECT_TRUE(fabricCertAuthority.Init().IsSuccess()); constexpr uint16_t kVendorId = 0xFFF1u; @@ -1295,10 +1264,10 @@ void TestPersistence(nlTestSuite * inSuite, void * inContext) { // Initialize a FabricTable ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&storage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&storage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.FabricCount(), 0); // Add Fabric 1111 Node Id 55 { @@ -1307,55 +1276,50 @@ void TestPersistence(nlTestSuite * inSuite, void * inContext) uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS( - inSuite, fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), + CHIP_NO_ERROR); ByteSpan rcac = fabricCertAuthority.GetRcac(); ByteSpan icac = fabricCertAuthority.GetIcac(); ByteSpan noc = fabricCertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT(inSuite, newFabricIndex == 1); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(newFabricIndex, 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(1); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); - Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 1); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 1111); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); - } + ASSERT_NE(fabricInfo, nullptr); + Credentials::ChipCertificateSet certificates; + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); + Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), 1); + EXPECT_EQ(fabricInfo->GetNodeId(), 55u); + EXPECT_EQ(fabricInfo->GetFabricId(), 1111u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); + + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); // Validate that fabric has the correct operational key by verifying a signature { Crypto::P256ECDSASignature sig; uint8_t message[] = { 'm', 's', 'g' }; - NL_TEST_ASSERT_SUCCESS(inSuite, VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), fIdx1PublicKey)); + EXPECT_EQ(VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), fIdx1PublicKey), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SignWithOpKeypair(newFabricIndex, ByteSpan{ message }, sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, fIdx1PublicKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig)); + EXPECT_EQ(fabricTable.SignWithOpKeypair(newFabricIndex, ByteSpan{ message }, sig), CHIP_NO_ERROR); + EXPECT_EQ(fIdx1PublicKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig), CHIP_NO_ERROR); } } @@ -1366,58 +1330,54 @@ void TestPersistence(nlTestSuite * inSuite, void * inContext) uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS( - inSuite, fabricCertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabricCertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), + CHIP_NO_ERROR); ByteSpan rcac = fabricCertAuthority.GetRcac(); ByteSpan noc = fabricCertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT_SUCCESS( - inSuite, fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, ByteSpan{}, kVendorId, &newFabricIndex)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 2); - NL_TEST_ASSERT(inSuite, newFabricIndex == 2); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, ByteSpan{}, kVendorId, &newFabricIndex), + CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 2); + EXPECT_EQ(newFabricIndex, 2); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(2); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); - Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 2); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 66); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 2222); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); - } + ASSERT_NE(fabricInfo, nullptr); + Credentials::ChipCertificateSet certificates; + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); + Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), 2); + EXPECT_EQ(fabricInfo->GetNodeId(), 66u); + EXPECT_EQ(fabricInfo->GetFabricId(), 2222u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); + + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); // Validate that fabric has the correct operational key by verifying a signature { Crypto::P256ECDSASignature sig; uint8_t message[] = { 'm', 's', 'g' }; - NL_TEST_ASSERT_SUCCESS(inSuite, VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), fIdx2PublicKey)); + EXPECT_EQ(VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), fIdx2PublicKey), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SignWithOpKeypair(newFabricIndex, ByteSpan{ message }, sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, fIdx2PublicKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig)); + EXPECT_EQ(fabricTable.SignWithOpKeypair(newFabricIndex, ByteSpan{ message }, sig), CHIP_NO_ERROR); + EXPECT_EQ(fIdx2PublicKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig), CHIP_NO_ERROR); } } - NL_TEST_ASSERT(inSuite, fabricTable.FabricCount() == 2); + EXPECT_EQ(fabricTable.FabricCount(), 2); // Verify we can now see 2 fabrics with the iterator { @@ -1429,44 +1389,44 @@ void TestPersistence(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 1111); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 55u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 1111u); saw1 = true; } if (iterFabricInfo.GetFabricIndex() == 2) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 66); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 2222); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 66u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 2222u); saw2 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 2); - NL_TEST_ASSERT(inSuite, saw1 == true); - NL_TEST_ASSERT(inSuite, saw2 == true); + EXPECT_EQ(numFabricsIterated, 2u); + EXPECT_TRUE(saw1); + EXPECT_TRUE(saw2); } // Next fabric index should now be 3, since we added 1 and 2 above. { FabricIndex nextFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT(inSuite, fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex) == CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, nextFabricIndex, 3); + EXPECT_EQ(fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(nextFabricIndex, 3); } } // Global: Last known good time + fabric index = 2 // Fabric 1111: Metadata, 1 opkey, RCAC/ICAC/NOC = 5 // Fabric 2222: Metadata, 1 opkey, RCAC/NOC = 4 - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == (2 + 5 + 4)); + EXPECT_EQ(storage.GetNumKeys(), (2u + 5u + 4u)); // Second scope: Validate that a fresh FabricTable loads the previously committed fabrics on Init. { // Initialize a FabricTable ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&storage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&storage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 2); + EXPECT_EQ(fabricTable.FabricCount(), 2); // Verify we can see 2 fabrics with the iterator { @@ -1478,57 +1438,53 @@ void TestPersistence(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 1111); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 55u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 1111u); saw1 = true; } if (iterFabricInfo.GetFabricIndex() == 2) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 66); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 2222); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 66u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 2222u); saw2 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 2); - NL_TEST_ASSERT(inSuite, saw1 == true); - NL_TEST_ASSERT(inSuite, saw2 == true); + EXPECT_EQ(numFabricsIterated, 2u); + EXPECT_TRUE(saw1); + EXPECT_TRUE(saw2); } // Validate contents of Fabric 2222 { uint8_t rcacBuf[Credentials::kMaxCHIPCertLength]; MutableByteSpan rcacSpan{ rcacBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootCert(2, rcacSpan)); + EXPECT_EQ(fabricTable.FetchRootCert(2, rcacSpan), CHIP_NO_ERROR); const auto * fabricInfo = fabricTable.FindFabricWithIndex(2); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcacSpan, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); - Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 2); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 66); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 2222); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(2, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); - } + ASSERT_NE(fabricInfo, nullptr); + Credentials::ChipCertificateSet certificates; + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcacSpan, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); + Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), 2); + EXPECT_EQ(fabricInfo->GetNodeId(), 66u); + EXPECT_EQ(fabricInfo->GetFabricId(), 2222u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); + + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(2, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); // Validate that fabric has the correct operational key by verifying a signature { Crypto::P256ECDSASignature sig; uint8_t message[] = { 'm', 's', 'g' }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SignWithOpKeypair(2, ByteSpan{ message }, sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, fIdx2PublicKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig)); + EXPECT_EQ(fabricTable.SignWithOpKeypair(2, ByteSpan{ message }, sig), CHIP_NO_ERROR); + EXPECT_EQ(fIdx2PublicKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig), CHIP_NO_ERROR); } } @@ -1536,36 +1492,32 @@ void TestPersistence(nlTestSuite * inSuite, void * inContext) { uint8_t rcacBuf[Credentials::kMaxCHIPCertLength]; MutableByteSpan rcacSpan{ rcacBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootCert(1, rcacSpan)); + EXPECT_EQ(fabricTable.FetchRootCert(1, rcacSpan), CHIP_NO_ERROR); const auto * fabricInfo = fabricTable.FindFabricWithIndex(1); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcacSpan, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); - Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 1); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 1111); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(1, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); - } + ASSERT_NE(fabricInfo, nullptr); + Credentials::ChipCertificateSet certificates; + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcacSpan, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); + Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), 1); + EXPECT_EQ(fabricInfo->GetNodeId(), 55u); + EXPECT_EQ(fabricInfo->GetFabricId(), 1111u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); + + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(1, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); // Validate that fabric has the correct operational key by verifying a signature { Crypto::P256ECDSASignature sig; uint8_t message[] = { 'm', 's', 'g' }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SignWithOpKeypair(1, ByteSpan{ message }, sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, fIdx1PublicKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig)); + EXPECT_EQ(fabricTable.SignWithOpKeypair(1, ByteSpan{ message }, sig), CHIP_NO_ERROR); + EXPECT_EQ(fIdx1PublicKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig), CHIP_NO_ERROR); } // Validate that signing with Fabric index 2 fails to verify with fabric index 1 @@ -1573,40 +1525,39 @@ void TestPersistence(nlTestSuite * inSuite, void * inContext) Crypto::P256ECDSASignature sig; uint8_t message[] = { 'm', 's', 'g' }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SignWithOpKeypair(2, ByteSpan{ message }, sig)); - NL_TEST_ASSERT(inSuite, - fIdx1PublicKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig) == - CHIP_ERROR_INVALID_SIGNATURE); + EXPECT_EQ(fabricTable.SignWithOpKeypair(2, ByteSpan{ message }, sig), CHIP_NO_ERROR); + EXPECT_EQ(fIdx1PublicKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig), + CHIP_ERROR_INVALID_SIGNATURE); } } // Validate that next fabric index is still 3; { FabricIndex nextFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT(inSuite, fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex) == CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, nextFabricIndex, 3); + EXPECT_EQ(fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(nextFabricIndex, 3); } } } -void TestAddNocFailSafe(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestAddNocFailSafe) { Credentials::TestOnlyLocalCertificateAuthority fabric11CertAuthority; Credentials::TestOnlyLocalCertificateAuthority fabric44CertAuthority; chip::TestPersistentStorageDelegate storage; - NL_TEST_ASSERT(inSuite, fabric11CertAuthority.Init().IsSuccess()); - NL_TEST_ASSERT(inSuite, fabric44CertAuthority.Init().IsSuccess()); + EXPECT_TRUE(fabric11CertAuthority.Init().IsSuccess()); + EXPECT_TRUE(fabric44CertAuthority.Init().IsSuccess()); constexpr uint16_t kVendorId = 0xFFF1u; // Initialize a fabric table. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&storage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&storage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.FabricCount(), 0); size_t numFabricsIterated = 0; @@ -1619,30 +1570,30 @@ void TestAddNocFailSafe(nlTestSuite * inSuite, void * inContext) uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabric11CertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabric11CertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), + CHIP_NO_ERROR); ByteSpan rcac = fabric11CertAuthority.GetRcac(); ByteSpan noc = fabric11CertAuthority.GetNoc(); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; { FabricIndex nextFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT(inSuite, fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex) == CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, nextFabricIndex, 1); + EXPECT_EQ(fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(nextFabricIndex, 1); } - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, ByteSpan{}, kVendorId, &newFabricIndex)); - NL_TEST_ASSERT(inSuite, newFabricIndex == 1); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, ByteSpan{}, kVendorId, &newFabricIndex), + CHIP_NO_ERROR); + EXPECT_EQ(newFabricIndex, 1); + EXPECT_EQ(fabricTable.FabricCount(), 1); // No storage yet - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == numStorageKeysAtStart); // Nothing yet + EXPECT_EQ(storage.GetNumKeys(), numStorageKeysAtStart); // Nothing yet // Validate iterator sees pending { @@ -1653,23 +1604,23 @@ void TestAddNocFailSafe(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == nodeId); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == fabricId); + EXPECT_EQ(iterFabricInfo.GetNodeId(), nodeId); + EXPECT_EQ(iterFabricInfo.GetFabricId(), fabricId); saw1 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 1); - NL_TEST_ASSERT(inSuite, saw1 == true); + EXPECT_EQ(numFabricsIterated, 1u); + EXPECT_TRUE(saw1); } // Revert, should see nothing yet fabricTable.RevertPendingFabricData(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.FabricCount(), 0); // No started except fabric index metadata - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == (numStorageKeysAtStart + 1)); + EXPECT_EQ(storage.GetNumKeys(), (numStorageKeysAtStart + 1)); // Validate iterator sees nothing { @@ -1684,15 +1635,15 @@ void TestAddNocFailSafe(nlTestSuite * inSuite, void * inContext) } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 0); - NL_TEST_ASSERT(inSuite, saw1 == false); + EXPECT_EQ(numFabricsIterated, 0u); + EXPECT_FALSE(saw1); } // Validate next fabric index has not changed. { FabricIndex nextFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT(inSuite, fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex) == CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, nextFabricIndex, 1); + EXPECT_EQ(fabricTable.PeekFabricIndexForNextAddition(nextFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(nextFabricIndex, 1); } } @@ -1705,54 +1656,49 @@ void TestAddNocFailSafe(nlTestSuite * inSuite, void * inContext) uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabric44CertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabric44CertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), + CHIP_NO_ERROR); ByteSpan rcac = fabric44CertAuthority.GetRcac(); ByteSpan icac = fabric44CertAuthority.GetIcac(); ByteSpan noc = fabric44CertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT(inSuite, newFabricIndex == 1); + EXPECT_EQ(fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(newFabricIndex, 1); // No storage yet - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == numStorageAfterRevert); + EXPECT_EQ(storage.GetNumKeys(), numStorageAfterRevert); // Commit, now storage should have keys - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 1); - NL_TEST_ASSERT_EQUALS(inSuite, storage.GetNumKeys(), - (numStorageAfterRevert + 5)); // 3 opcerts + fabric metadata + 1 operational key + EXPECT_EQ(storage.GetNumKeys(), + (numStorageAfterRevert + 5)); // 3 opcerts + fabric metadata + 1 operational key // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(1); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); - Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == newFabricIndex); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == nodeId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == fabricId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); - } + ASSERT_NE(fabricInfo, nullptr); + Credentials::ChipCertificateSet certificates; + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); + Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), newFabricIndex); + EXPECT_EQ(fabricInfo->GetNodeId(), nodeId); + EXPECT_EQ(fabricInfo->GetFabricId(), fabricId); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); + + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); // Validate that fabric has the correct operational key by verifying a signature { @@ -1760,10 +1706,10 @@ void TestAddNocFailSafe(nlTestSuite * inSuite, void * inContext) uint8_t message[] = { 'm', 's', 'g' }; Crypto::P256PublicKey nocPubKey; - NL_TEST_ASSERT_SUCCESS(inSuite, VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), nocPubKey)); + EXPECT_EQ(VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), nocPubKey), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SignWithOpKeypair(newFabricIndex, ByteSpan{ message }, sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, nocPubKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig)); + EXPECT_EQ(fabricTable.SignWithOpKeypair(newFabricIndex, ByteSpan{ message }, sig), CHIP_NO_ERROR); + EXPECT_EQ(nocPubKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig), CHIP_NO_ERROR); } // Verify we can now see the fabric with the iterator @@ -1775,14 +1721,14 @@ void TestAddNocFailSafe(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 999); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 44); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 999u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 44u); saw1 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 1); - NL_TEST_ASSERT(inSuite, saw1 == true); + EXPECT_EQ(numFabricsIterated, 1u); + EXPECT_TRUE(saw1); } } @@ -1795,8 +1741,8 @@ void TestAddNocFailSafe(nlTestSuite * inSuite, void * inContext) fabricTable.RevertPendingFabricData(); // No change of storage - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == numStorageAfterAdd); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(storage.GetNumKeys(), numStorageAfterAdd); // Verify we can still see the fabric with the iterator { @@ -1807,19 +1753,19 @@ void TestAddNocFailSafe(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 999); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 44); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 999u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 44u); saw1 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 1); - NL_TEST_ASSERT(inSuite, saw1 == true); + EXPECT_EQ(numFabricsIterated, 1u); + EXPECT_TRUE(saw1); } } } -void TestUpdateNocFailSafe(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestUpdateNocFailSafe) { Credentials::TestOnlyLocalCertificateAuthority fabric11CertAuthority; Credentials::TestOnlyLocalCertificateAuthority fabric44CertAuthority; @@ -1828,17 +1774,17 @@ void TestUpdateNocFailSafe(nlTestSuite * inSuite, void * inContext) storage.SetLoggingLevel(chip::TestPersistentStorageDelegate::LoggingLevel::kLogMutation); - NL_TEST_ASSERT(inSuite, fabric11CertAuthority.Init().IsSuccess()); - NL_TEST_ASSERT(inSuite, fabric44CertAuthority.Init().IsSuccess()); + EXPECT_TRUE(fabric11CertAuthority.Init().IsSuccess()); + EXPECT_TRUE(fabric44CertAuthority.Init().IsSuccess()); constexpr uint16_t kVendorId = 0xFFF1u; // Initialize a fabric table. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&storage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&storage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.FabricCount(), 0); size_t numFabricsIterated = 0; @@ -1851,54 +1797,49 @@ void TestUpdateNocFailSafe(nlTestSuite * inSuite, void * inContext) uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabric44CertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabric44CertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), + CHIP_NO_ERROR); ByteSpan rcac = fabric44CertAuthority.GetRcac(); ByteSpan icac = fabric44CertAuthority.GetIcac(); ByteSpan noc = fabric44CertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT(inSuite, newFabricIndex == 1); + EXPECT_EQ(fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(newFabricIndex, 1); // No storage yet - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == numStorageKeysAtStart); + EXPECT_EQ(storage.GetNumKeys(), numStorageKeysAtStart); // Commit, now storage should have keys - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 1); - NL_TEST_ASSERT_EQUALS(inSuite, storage.GetNumKeys(), - (numStorageKeysAtStart + 6)); // 3 opcerts + fabric metadata + 1 operational key + LKGT + fabric index + EXPECT_EQ(storage.GetNumKeys(), + (numStorageKeysAtStart + 6)); // 3 opcerts + fabric metadata + 1 operational key + LKGT + fabric index // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(1); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); - Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == newFabricIndex); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == nodeId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == fabricId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); - } + ASSERT_NE(fabricInfo, nullptr); + Credentials::ChipCertificateSet certificates; + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); + Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), newFabricIndex); + EXPECT_EQ(fabricInfo->GetNodeId(), nodeId); + EXPECT_EQ(fabricInfo->GetFabricId(), fabricId); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); + + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); // Validate that fabric has the correct operational key by verifying a signature { @@ -1906,10 +1847,10 @@ void TestUpdateNocFailSafe(nlTestSuite * inSuite, void * inContext) uint8_t message[] = { 'm', 's', 'g' }; Crypto::P256PublicKey nocPubKey; - NL_TEST_ASSERT_SUCCESS(inSuite, VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), nocPubKey)); + EXPECT_EQ(VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), nocPubKey), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SignWithOpKeypair(newFabricIndex, ByteSpan{ message }, sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, nocPubKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig)); + EXPECT_EQ(fabricTable.SignWithOpKeypair(newFabricIndex, ByteSpan{ message }, sig), CHIP_NO_ERROR); + EXPECT_EQ(nocPubKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig), CHIP_NO_ERROR); } // Verify we can now see the fabric with the iterator @@ -1921,14 +1862,14 @@ void TestUpdateNocFailSafe(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 999); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 44); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 999u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 44u); saw1 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 1); - NL_TEST_ASSERT(inSuite, saw1 == true); + EXPECT_EQ(numFabricsIterated, 1u); + EXPECT_TRUE(saw1); } } @@ -1944,20 +1885,20 @@ void TestUpdateNocFailSafe(nlTestSuite * inSuite, void * inContext) MutableByteSpan csrSpan{ csrBuf }; // Make sure to tag fabric index to pending opkey: otherwise the UpdateNOC fails - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AllocatePendingOperationalKey(chip::MakeOptional(static_cast<FabricIndex>(1)), csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::MakeOptional(static_cast<FabricIndex>(1)), csrSpan), + CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabric44CertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabric44CertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), + CHIP_NO_ERROR); ByteSpan rcac = fabric44CertAuthority.GetRcac(); ByteSpan noc = fabric44CertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.UpdatePendingFabricWithOperationalKeystore(1, noc, ByteSpan{})); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.UpdatePendingFabricWithOperationalKeystore(1, noc, ByteSpan{}), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 1); // No storage yet - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == numStorageAfterAdd); + EXPECT_EQ(storage.GetNumKeys(), numStorageAfterAdd); // Validate iterator sees the pending data { @@ -1968,62 +1909,58 @@ void TestUpdateNocFailSafe(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 1000); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 44); - NL_TEST_ASSERT(inSuite, iterFabricInfo.ShouldAdvertiseIdentity()); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 1000u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 44u); + EXPECT_TRUE(iterFabricInfo.ShouldAdvertiseIdentity()); saw1 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 1); - NL_TEST_ASSERT(inSuite, saw1 == true); + EXPECT_EQ(numFabricsIterated, 1u); + EXPECT_TRUE(saw1); } // Revert, should see Node ID 999 again fabricTable.RevertPendingFabricData(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.FabricCount(), 1); - NL_TEST_ASSERT_EQUALS(inSuite, storage.GetNumKeys(), numStorageAfterAdd); + EXPECT_EQ(storage.GetNumKeys(), numStorageAfterAdd); // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(1); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) + ASSERT_NE(fabricInfo, nullptr); { Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == fabricIndex); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 999); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 44); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); + EXPECT_EQ(fabricInfo->GetFabricIndex(), fabricIndex); + EXPECT_EQ(fabricInfo->GetNodeId(), 999u); + EXPECT_EQ(fabricInfo->GetFabricId(), 44u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(fabricIndex, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); + EXPECT_EQ(fabricTable.FetchRootPubkey(fabricIndex, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); } // Validate that fabric has the correct operational key by verifying a signature { uint8_t nocBuf[Credentials::kMaxCHIPCertLength]; MutableByteSpan nocSpan{ nocBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchNOCCert(1, nocSpan)); - + EXPECT_EQ(fabricTable.FetchNOCCert(1, nocSpan), CHIP_NO_ERROR); Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(nocSpan, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(nocSpan, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); Crypto::P256PublicKey nocPubKey(certificates.GetCertSet()[0].mPublicKey); Crypto::P256ECDSASignature sig; uint8_t message[] = { 'm', 's', 'g' }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SignWithOpKeypair(fabricIndex, ByteSpan{ message }, sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, nocPubKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig)); + EXPECT_EQ(fabricTable.SignWithOpKeypair(fabricIndex, ByteSpan{ message }, sig), CHIP_NO_ERROR); + EXPECT_EQ(nocPubKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig), CHIP_NO_ERROR); } // Validate iterator sees the previous fabric @@ -2035,14 +1972,14 @@ void TestUpdateNocFailSafe(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 999); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 44); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 999u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 44u); saw1 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 1); - NL_TEST_ASSERT(inSuite, saw1 == true); + EXPECT_EQ(numFabricsIterated, 1u); + EXPECT_TRUE(saw1); } } @@ -2056,20 +1993,20 @@ void TestUpdateNocFailSafe(nlTestSuite * inSuite, void * inContext) MutableByteSpan csrSpan{ csrBuf }; // Make sure to tag fabric index to pending opkey: otherwise the UpdateNOC fails - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AllocatePendingOperationalKey(chip::MakeOptional(static_cast<FabricIndex>(1)), csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::MakeOptional(static_cast<FabricIndex>(1)), csrSpan), + CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabric44CertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabric44CertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), + CHIP_NO_ERROR); ByteSpan rcac = fabric44CertAuthority.GetRcac(); ByteSpan noc = fabric44CertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.UpdatePendingFabricWithOperationalKeystore(1, noc, ByteSpan{})); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.UpdatePendingFabricWithOperationalKeystore(1, noc, ByteSpan{}), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 1); // No storage yet - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == numStorageAfterAdd); + EXPECT_EQ(storage.GetNumKeys(), numStorageAfterAdd); // Validate iterator sees the pending data { @@ -2080,55 +2017,51 @@ void TestUpdateNocFailSafe(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 1001); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 44); - NL_TEST_ASSERT(inSuite, iterFabricInfo.ShouldAdvertiseIdentity()); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 1001u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 44u); + EXPECT_TRUE(iterFabricInfo.ShouldAdvertiseIdentity()); saw1 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 1); - NL_TEST_ASSERT(inSuite, saw1 == true); + EXPECT_EQ(numFabricsIterated, 1u); + EXPECT_TRUE(saw1); } // Commit, should see Node ID 1001, and 1 less cert in the storage - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT_EQUALS(inSuite, storage.GetNumKeys(), numStorageAfterAdd - 1); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(storage.GetNumKeys(), numStorageAfterAdd - 1); // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(1); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); - Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == fabricIndex); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 1001); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 44); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(fabricIndex, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); - } + ASSERT_NE(fabricInfo, nullptr); + Credentials::ChipCertificateSet certificates; + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); + Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), fabricIndex); + EXPECT_EQ(fabricInfo->GetNodeId(), 1001u); + EXPECT_EQ(fabricInfo->GetFabricId(), 44u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); + + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(fabricIndex, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); // Validate that fabric has the correct operational key by verifying a signature { Crypto::P256PublicKey nocPubKey; - NL_TEST_ASSERT_SUCCESS(inSuite, VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), nocPubKey)); + EXPECT_EQ(VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), nocPubKey), CHIP_NO_ERROR); Crypto::P256ECDSASignature sig; uint8_t message[] = { 'm', 's', 'g' }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SignWithOpKeypair(fabricIndex, ByteSpan{ message }, sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, nocPubKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig)); + EXPECT_EQ(fabricTable.SignWithOpKeypair(fabricIndex, ByteSpan{ message }, sig), CHIP_NO_ERROR); + EXPECT_EQ(nocPubKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig), CHIP_NO_ERROR); } // Validate iterator sees the updated fabric @@ -2140,32 +2073,32 @@ void TestUpdateNocFailSafe(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 1001); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 44); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 1001u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 44u); saw1 = true; } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 1); - NL_TEST_ASSERT(inSuite, saw1 == true); + EXPECT_EQ(numFabricsIterated, 1u); + EXPECT_TRUE(saw1); } } } -void TestAddRootCertFailSafe(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestAddRootCertFailSafe) { Credentials::TestOnlyLocalCertificateAuthority fabric11CertAuthority; chip::TestPersistentStorageDelegate storage; - NL_TEST_ASSERT(inSuite, fabric11CertAuthority.Init().IsSuccess()); + EXPECT_TRUE(fabric11CertAuthority.Init().IsSuccess()); // Initialize a fabric table. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&storage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&storage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.FabricCount(), 0); // Add a root cert, see that pending works, and that revert works { @@ -2175,15 +2108,15 @@ void TestAddRootCertFailSafe(nlTestSuite * inSuite, void * inContext) { // No pending root cert yet. MutableByteSpan fetchedSpan{ rcacBuf }; - NL_TEST_ASSERT(inSuite, fabricTable.FetchPendingNonFabricAssociatedRootCert(fetchedSpan) == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(fabricTable.FetchPendingNonFabricAssociatedRootCert(fetchedSpan), CHIP_ERROR_NOT_FOUND); } - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); { // Now have a pending root cert. MutableByteSpan fetchedSpan{ rcacBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchPendingNonFabricAssociatedRootCert(fetchedSpan)); - NL_TEST_ASSERT(inSuite, fetchedSpan.data_equal(rcac)); + EXPECT_EQ(fabricTable.FetchPendingNonFabricAssociatedRootCert(fetchedSpan), CHIP_NO_ERROR); + EXPECT_TRUE(fetchedSpan.data_equal(rcac)); } // Revert @@ -2192,31 +2125,31 @@ void TestAddRootCertFailSafe(nlTestSuite * inSuite, void * inContext) { // No pending root cert anymore. MutableByteSpan fetchedSpan{ rcacBuf }; - NL_TEST_ASSERT(inSuite, fabricTable.FetchPendingNonFabricAssociatedRootCert(fetchedSpan) == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(fabricTable.FetchPendingNonFabricAssociatedRootCert(fetchedSpan), CHIP_ERROR_NOT_FOUND); } } } -void TestSequenceErrors(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestSequenceErrors) { // TODO: Write test } -void TestFabricLabelChange(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestFabricLabelChange) { Credentials::TestOnlyLocalCertificateAuthority fabricCertAuthority; chip::TestPersistentStorageDelegate storage; - NL_TEST_ASSERT(inSuite, fabricCertAuthority.Init().IsSuccess()); + EXPECT_TRUE(fabricCertAuthority.Init().IsSuccess()); constexpr uint16_t kVendorId = 0xFFF1u; // Initialize a fabric table. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&storage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&storage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.FabricCount(), 0); // First scope: add FabricID 1111, node ID 55 { @@ -2225,68 +2158,63 @@ void TestFabricLabelChange(nlTestSuite * inSuite, void * inContext) uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), CHIP_NO_ERROR); ByteSpan rcac = fabricCertAuthority.GetRcac(); ByteSpan icac = fabricCertAuthority.GetIcac(); ByteSpan noc = fabricCertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT(inSuite, newFabricIndex == 1); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(newFabricIndex, 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(1); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 1); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 1111); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - } + ASSERT_NE(fabricInfo, nullptr); + EXPECT_EQ(fabricInfo->GetFabricIndex(), 1); + EXPECT_EQ(fabricInfo->GetNodeId(), 55u); + EXPECT_EQ(fabricInfo->GetFabricId(), 1111u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); } size_t numStorageKeysAfterFirstAdd = storage.GetNumKeys(); - NL_TEST_ASSERT(inSuite, numStorageKeysAfterFirstAdd == 7); // Metadata, index, 3 certs, 1 opkey, last known good time + EXPECT_EQ(numStorageKeysAfterFirstAdd, 7u); // Metadata, index, 3 certs, 1 opkey, last known good time // Second scope: set FabricLabel to "acme fabric", make sure it cannot be reverted { // Fabric label starts unset from prior scope CharSpan fabricLabel = "placeholder"_span; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.GetFabricLabel(1, fabricLabel)); - NL_TEST_ASSERT(inSuite, fabricLabel.size() == 0); + EXPECT_EQ(fabricTable.GetFabricLabel(1, fabricLabel), CHIP_NO_ERROR); + EXPECT_EQ(fabricLabel.size(), 0u); // Set a valid name - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SetFabricLabel(1, "acme fabric"_span)); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.GetFabricLabel(1, fabricLabel)); - NL_TEST_ASSERT(inSuite, fabricLabel.data_equal("acme fabric"_span) == true); + EXPECT_EQ(fabricTable.SetFabricLabel(1, "acme fabric"_span), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.GetFabricLabel(1, fabricLabel), CHIP_NO_ERROR); + EXPECT_TRUE(fabricLabel.data_equal("acme fabric"_span)); // Revert pending fabric data. Should not revert name since nothing pending. fabricTable.RevertPendingFabricData(); fabricLabel = "placeholder"_span; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.GetFabricLabel(1, fabricLabel)); - NL_TEST_ASSERT(inSuite, fabricLabel.data_equal("acme fabric"_span) == true); + EXPECT_EQ(fabricTable.GetFabricLabel(1, fabricLabel), CHIP_NO_ERROR); + EXPECT_TRUE(fabricLabel.data_equal("acme fabric"_span)); // Verify we fail to set too large a label (> kFabricLabelMaxLengthInBytes) CharSpan fabricLabelTooBig = "012345678901234567890123456789123456"_span; - NL_TEST_ASSERT(inSuite, fabricLabelTooBig.size() > chip::kFabricLabelMaxLengthInBytes); + EXPECT_GT(fabricLabelTooBig.size(), chip::kFabricLabelMaxLengthInBytes); - NL_TEST_ASSERT(inSuite, fabricTable.SetFabricLabel(1, fabricLabelTooBig) == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(fabricTable.SetFabricLabel(1, fabricLabelTooBig), CHIP_ERROR_INVALID_ARGUMENT); fabricLabel = "placeholder"_span; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.GetFabricLabel(1, fabricLabel)); - NL_TEST_ASSERT(inSuite, fabricLabel.data_equal("acme fabric"_span) == true); + EXPECT_EQ(fabricTable.GetFabricLabel(1, fabricLabel), CHIP_NO_ERROR); + EXPECT_TRUE(fabricLabel.data_equal("acme fabric"_span)); } // Third scope: set fabric label after an update, it sticks, but then goes back after revert @@ -2296,156 +2224,144 @@ void TestFabricLabelChange(nlTestSuite * inSuite, void * inContext) uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AllocatePendingOperationalKey(chip::MakeOptional(static_cast<FabricIndex>(1)), csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::MakeOptional(static_cast<FabricIndex>(1)), csrSpan), + CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), CHIP_NO_ERROR); ByteSpan icac = fabricCertAuthority.GetIcac(); ByteSpan noc = fabricCertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.UpdatePendingFabricWithOperationalKeystore(1, noc, icac)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.UpdatePendingFabricWithOperationalKeystore(1, noc, icac), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 1); // Validate contents prior to change/revert const auto * fabricInfo = fabricTable.FindFabricWithIndex(1); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 1); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 66); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 1111); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); + ASSERT_NE(fabricInfo, nullptr); + EXPECT_EQ(fabricInfo->GetFabricIndex(), 1); + EXPECT_EQ(fabricInfo->GetNodeId(), 66u); + EXPECT_EQ(fabricInfo->GetFabricId(), 1111u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); - CharSpan fabricLabel = fabricInfo->GetFabricLabel(); - NL_TEST_ASSERT(inSuite, fabricLabel.data_equal("acme fabric"_span) == true); - } + CharSpan fabricLabel = fabricInfo->GetFabricLabel(); + EXPECT_TRUE(fabricLabel.data_equal("acme fabric"_span)); // Update fabric label - CharSpan fabricLabel = "placeholder"_span; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SetFabricLabel(1, "roboto fabric"_span)); + fabricLabel = "placeholder"_span; + EXPECT_EQ(fabricTable.SetFabricLabel(1, "roboto fabric"_span), CHIP_NO_ERROR); fabricLabel = "placeholder"_span; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.GetFabricLabel(1, fabricLabel)); - NL_TEST_ASSERT(inSuite, fabricLabel.data_equal("roboto fabric"_span) == true); + EXPECT_EQ(fabricTable.GetFabricLabel(1, fabricLabel), CHIP_NO_ERROR); + EXPECT_TRUE(fabricLabel.data_equal("roboto fabric"_span)); // Revert pending fabric data. Should revert name to "acme fabric" fabricTable.RevertPendingFabricData(); fabricLabel = "placeholder"_span; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.GetFabricLabel(1, fabricLabel)); - NL_TEST_ASSERT(inSuite, fabricLabel.data_equal("acme fabric"_span) == true); + EXPECT_EQ(fabricTable.GetFabricLabel(1, fabricLabel), CHIP_NO_ERROR); + EXPECT_TRUE(fabricLabel.data_equal("acme fabric"_span)); } } -void TestCompressedFabricId(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestCompressedFabricId) { // TODO: Write test } -void TestFabricLookup(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestFabricLookup) { // Initialize a fabric table. chip::TestPersistentStorageDelegate testStorage; ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&testStorage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&testStorage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT(inSuite, LoadTestFabric_Node01_01(inSuite, fabricTable, /* doCommit = */ true) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, - LoadTestFabric_Node02_01(inSuite, fabricTable, /* doCommit = */ true, FabricTable::AdvertiseIdentity::No) == - CHIP_NO_ERROR); + EXPECT_EQ(LoadTestFabric_Node01_01(fabricTable, /* doCommit = */ true), CHIP_NO_ERROR); + EXPECT_EQ(LoadTestFabric_Node02_01(fabricTable, /* doCommit = */ true, FabricTable::AdvertiseIdentity::No), CHIP_NO_ERROR); // Attempt lookup of the Root01 fabric. { Crypto::P256PublicKey key; - NL_TEST_ASSERT(inSuite, key.Length() >= TestCerts::sTestCert_Root01_PublicKey.size()); + EXPECT_GE(key.Length(), TestCerts::sTestCert_Root01_PublicKey.size()); if (key.Length() < TestCerts::sTestCert_Root01_PublicKey.size()) { return; } memcpy(key.Bytes(), TestCerts::sTestCert_Root01_PublicKey.data(), TestCerts::sTestCert_Root01_PublicKey.size()); auto fabricInfo = fabricTable.FindFabric(key, 0xFAB000000000001D); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo == nullptr) - { - return; - } - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 1); - NL_TEST_ASSERT(inSuite, fabricInfo->ShouldAdvertiseIdentity()); + ASSERT_NE(fabricInfo, nullptr); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), 1); + EXPECT_TRUE(fabricInfo->ShouldAdvertiseIdentity()); } // Attempt lookup of the Root02 fabric. { Crypto::P256PublicKey key; - NL_TEST_ASSERT(inSuite, key.Length() >= TestCerts::sTestCert_Root02_PublicKey.size()); + EXPECT_GE(key.Length(), TestCerts::sTestCert_Root02_PublicKey.size()); if (key.Length() < TestCerts::sTestCert_Root02_PublicKey.size()) { return; } memcpy(key.Bytes(), TestCerts::sTestCert_Root02_PublicKey.data(), TestCerts::sTestCert_Root02_PublicKey.size()); auto fabricInfo = fabricTable.FindFabric(key, 0xFAB000000000001D); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo == nullptr) - { - return; - } - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 2); - NL_TEST_ASSERT(inSuite, !fabricInfo->ShouldAdvertiseIdentity()); + ASSERT_NE(fabricInfo, nullptr); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), 2); + EXPECT_FALSE(fabricInfo->ShouldAdvertiseIdentity()); } // Attempt lookup of FabricIndex 0 --> should always fail. { - NL_TEST_ASSERT(inSuite, fabricTable.FindFabricWithIndex(0) == nullptr); + EXPECT_EQ(fabricTable.FindFabricWithIndex(0), nullptr); } } -void TestFetchCATs(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestFetchCATs) { // Initialize a fabric table. chip::TestPersistentStorageDelegate testStorage; ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&testStorage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&testStorage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT(inSuite, LoadTestFabric_Node01_01(inSuite, fabricTable, /* doCommit = */ true) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, LoadTestFabric_Node02_01(inSuite, fabricTable, /* doCommit = */ true) == CHIP_NO_ERROR); + EXPECT_EQ(LoadTestFabric_Node01_01(fabricTable, /* doCommit = */ true), CHIP_NO_ERROR); + EXPECT_EQ(LoadTestFabric_Node02_01(fabricTable, /* doCommit = */ true), CHIP_NO_ERROR); // Attempt Fetching fabric index 1 CATs and verify contents. { CATValues cats; - NL_TEST_ASSERT(inSuite, fabricTable.FetchCATs(1, cats) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FetchCATs(1, cats), CHIP_NO_ERROR); // Test fabric NOCs don't contain any CATs. - NL_TEST_ASSERT(inSuite, cats == kUndefinedCATs); + EXPECT_EQ(cats, kUndefinedCATs); } // Attempt Fetching fabric index 2 CATs and verify contents. { CATValues cats; - NL_TEST_ASSERT(inSuite, fabricTable.FetchCATs(2, cats) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FetchCATs(2, cats), CHIP_NO_ERROR); // Test fabric NOCs don't contain any CATs. - NL_TEST_ASSERT(inSuite, cats == kUndefinedCATs); + EXPECT_EQ(cats, kUndefinedCATs); } // TODO(#20335): Add test cases for NOCs that actually embed CATs } // Validate that adding the same fabric twice fails (same root, same FabricId) -void TestAddNocRootCollision(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestAddNocRootCollision) { Credentials::TestOnlyLocalCertificateAuthority fabricCertAuthority; chip::TestPersistentStorageDelegate storage; - NL_TEST_ASSERT(inSuite, fabricCertAuthority.Init().IsSuccess()); + EXPECT_TRUE(fabricCertAuthority.Init().IsSuccess()); constexpr uint16_t kVendorId = 0xFFF1u; // Initialize a fabric table. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&storage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&storage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.FabricCount(), 0); // First scope: add FabricID 1111, node ID 55 { @@ -2454,51 +2370,46 @@ void TestAddNocRootCollision(nlTestSuite * inSuite, void * inContext) uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), CHIP_NO_ERROR); ByteSpan rcac = fabricCertAuthority.GetRcac(); ByteSpan icac = fabricCertAuthority.GetIcac(); ByteSpan noc = fabricCertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex, - FabricTable::AdvertiseIdentity::No)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT(inSuite, newFabricIndex == 1); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex, + FabricTable::AdvertiseIdentity::No), + CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(newFabricIndex, 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(1); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - NL_TEST_ASSERT(inSuite, !fabricInfo->ShouldAdvertiseIdentity()); - - Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); - Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 1); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 1111); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); - } + ASSERT_NE(fabricInfo, nullptr); + EXPECT_FALSE(fabricInfo->ShouldAdvertiseIdentity()); + + Credentials::ChipCertificateSet certificates; + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); + Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), 1); + EXPECT_EQ(fabricInfo->GetNodeId(), 55u); + EXPECT_EQ(fabricInfo->GetFabricId(), 1111u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); + + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); } size_t numStorageKeysAfterFirstAdd = storage.GetNumKeys(); - NL_TEST_ASSERT(inSuite, numStorageKeysAfterFirstAdd == 7); // Metadata, index, 3 certs, 1 opkey, last known good time + EXPECT_EQ(numStorageKeysAfterFirstAdd, 7u); // Metadata, index, 3 certs, 1 opkey, last known good time // Second scope: add FabricID 1111, node ID 55 *again* --> Collision of Root/FabricID with existing { @@ -2507,51 +2418,45 @@ void TestAddNocRootCollision(nlTestSuite * inSuite, void * inContext) uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), CHIP_NO_ERROR); ByteSpan rcac = fabricCertAuthority.GetRcac(); ByteSpan icac = fabricCertAuthority.GetIcac(); ByteSpan noc = fabricCertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT(inSuite, - fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex) == - CHIP_ERROR_FABRIC_EXISTS); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex), + CHIP_ERROR_FABRIC_EXISTS); + EXPECT_EQ(fabricTable.FabricCount(), 1); CHIP_ERROR err = fabricTable.CommitPendingFabricData(); printf("err = %" CHIP_ERROR_FORMAT "\n", err.Format()); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); // Validate contents of Fabric index 1 still valid const auto * fabricInfo = fabricTable.FindFabricWithIndex(1); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); - Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 1); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 1111); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(1, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); - } + ASSERT_NE(fabricInfo, nullptr); + Credentials::ChipCertificateSet certificates; + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); + Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), 1); + EXPECT_EQ(fabricInfo->GetNodeId(), 55u); + EXPECT_EQ(fabricInfo->GetFabricId(), 1111u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); + + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(1, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); } // Ensure no new persisted keys after failed colliding add - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == numStorageKeysAfterFirstAdd); + EXPECT_EQ(storage.GetNumKeys(), numStorageKeysAfterFirstAdd); // Third scope: add FabricID 2222, node ID 55 --> Not colliding, should work. The failing commit above] // should have been enough of a revert that this scope succeeds without any additional revert. @@ -2561,70 +2466,64 @@ void TestAddNocRootCollision(nlTestSuite * inSuite, void * inContext) uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), CHIP_NO_ERROR); ByteSpan rcac = fabricCertAuthority.GetRcac(); ByteSpan icac = fabricCertAuthority.GetIcac(); ByteSpan noc = fabricCertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 2); - NL_TEST_ASSERT(inSuite, newFabricIndex == 2); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 2); + EXPECT_EQ(newFabricIndex, 2); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(2); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - NL_TEST_ASSERT(inSuite, fabricInfo->ShouldAdvertiseIdentity()); - - Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); - Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 2); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 2222); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); - } + ASSERT_NE(fabricInfo, nullptr); + EXPECT_TRUE(fabricInfo->ShouldAdvertiseIdentity()); + + Credentials::ChipCertificateSet certificates; + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); + Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), 2); + EXPECT_EQ(fabricInfo->GetNodeId(), 55u); + EXPECT_EQ(fabricInfo->GetFabricId(), 2222u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); + + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); } size_t numStorageKeysAfterSecondAdd = storage.GetNumKeys(); - NL_TEST_ASSERT(inSuite, numStorageKeysAfterSecondAdd == (numStorageKeysAfterFirstAdd + 5)); // Metadata, 3 certs, 1 opkey + EXPECT_EQ(numStorageKeysAfterSecondAdd, (numStorageKeysAfterFirstAdd + 5)); // Metadata, 3 certs, 1 opkey } -void TestInvalidChaining(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestInvalidChaining) { Credentials::TestOnlyLocalCertificateAuthority fabricCertAuthority; Credentials::TestOnlyLocalCertificateAuthority differentCertAuthority; chip::TestPersistentStorageDelegate storage; - NL_TEST_ASSERT(inSuite, fabricCertAuthority.Init().IsSuccess()); - NL_TEST_ASSERT(inSuite, differentCertAuthority.Init().IsSuccess()); + EXPECT_TRUE(fabricCertAuthority.Init().IsSuccess()); + EXPECT_TRUE(differentCertAuthority.Init().IsSuccess()); constexpr uint16_t kVendorId = 0xFFF1u; // Initialize a fabric table. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&storage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&storage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.FabricCount(), 0); // Try to add fabric with either the NOC not chaining properly, or ICAC not chaining properly, fail, // then succeed with proper chaining @@ -2634,13 +2533,12 @@ void TestInvalidChaining(nlTestSuite * inSuite, void * inContext) uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); // Generate same cert chain from two different roots - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); - NL_TEST_ASSERT_SUCCESS(inSuite, - differentCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), CHIP_NO_ERROR); + EXPECT_EQ(differentCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), + CHIP_NO_ERROR); ByteSpan rcac = fabricCertAuthority.GetRcac(); ByteSpan icac = fabricCertAuthority.GetIcac(); @@ -2649,23 +2547,23 @@ void TestInvalidChaining(nlTestSuite * inSuite, void * inContext) ByteSpan otherIcac = differentCertAuthority.GetIcac(); ByteSpan otherNoc = differentCertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); // Add with NOC not chaining to ICAC: fail { FabricIndex newFabricIndex = kUndefinedFabricIndex; CHIP_ERROR err = fabricTable.AddNewPendingFabricWithOperationalKeystore(otherNoc, icac, kVendorId, &newFabricIndex); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_NE(err, CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 0); } // Add with ICAC not chaining to root: fail { FabricIndex newFabricIndex = kUndefinedFabricIndex; CHIP_ERROR err = fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, otherIcac, kVendorId, &newFabricIndex); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_NE(err, CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 0); } // Add with NOC and ICAC chaining together, but not to root: fail @@ -2673,8 +2571,8 @@ void TestInvalidChaining(nlTestSuite * inSuite, void * inContext) FabricIndex newFabricIndex = kUndefinedFabricIndex; CHIP_ERROR err = fabricTable.AddNewPendingFabricWithOperationalKeystore(otherNoc, otherIcac, kVendorId, &newFabricIndex); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_NE(err, CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 0); } // Revert state, start tests without ICAC @@ -2683,52 +2581,48 @@ void TestInvalidChaining(nlTestSuite * inSuite, void * inContext) // Generate same cert chain from two different roots csrSpan = MutableByteSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricCertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); - NL_TEST_ASSERT_SUCCESS( - inSuite, differentCertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); + EXPECT_EQ(fabricCertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), CHIP_NO_ERROR); + EXPECT_EQ(differentCertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), + CHIP_NO_ERROR); rcac = fabricCertAuthority.GetRcac(); noc = fabricCertAuthority.GetNoc(); otherNoc = differentCertAuthority.GetNoc(); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); // Add with NOC not chaining to RCAC: fail { FabricIndex newFabricIndex = kUndefinedFabricIndex; CHIP_ERROR err = fabricTable.AddNewPendingFabricWithOperationalKeystore(otherNoc, ByteSpan{}, kVendorId, &newFabricIndex); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_NE(err, CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 0); } // Add properly now FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, ByteSpan{}, kVendorId, &newFabricIndex)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT(inSuite, newFabricIndex == 1); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, ByteSpan{}, kVendorId, &newFabricIndex), + CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(newFabricIndex, 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(1); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 1); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 1111); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - } + ASSERT_NE(fabricInfo, nullptr); + EXPECT_EQ(fabricInfo->GetFabricIndex(), 1); + EXPECT_EQ(fabricInfo->GetNodeId(), 55u); + EXPECT_EQ(fabricInfo->GetFabricId(), 1111u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); } } -void TestEphemeralKeys(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestEphemeralKeys) { // Initialize a fabric table with operational keystore { @@ -2736,18 +2630,18 @@ void TestEphemeralKeys(nlTestSuite * inSuite, void * inContext) // Initialize a FabricTable ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&storage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&storage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); Crypto::P256ECDSASignature sig; uint8_t message[] = { 'm', 's', 'g' }; Crypto::P256Keypair * ephemeralKeypair = fabricTable.AllocateEphemeralKeypairForCASE(); - NL_TEST_ASSERT(inSuite, ephemeralKeypair != nullptr); - NL_TEST_ASSERT_SUCCESS(inSuite, ephemeralKeypair->Initialize(Crypto::ECPKeyTarget::ECDSA)); + ASSERT_NE(ephemeralKeypair, nullptr); + EXPECT_EQ(ephemeralKeypair->Initialize(Crypto::ECPKeyTarget::ECDSA), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, ephemeralKeypair->ECDSA_sign_msg(message, sizeof(message), sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, ephemeralKeypair->Pubkey().ECDSA_validate_msg_signature(message, sizeof(message), sig)); + EXPECT_EQ(ephemeralKeypair->ECDSA_sign_msg(message, sizeof(message), sig), CHIP_NO_ERROR); + EXPECT_EQ(ephemeralKeypair->Pubkey().ECDSA_validate_msg_signature(message, sizeof(message), sig), CHIP_NO_ERROR); fabricTable.ReleaseEphemeralKeypair(ephemeralKeypair); } @@ -2757,24 +2651,24 @@ void TestEphemeralKeys(nlTestSuite * inSuite, void * inContext) chip::TestPersistentStorageDelegate storage; chip::Credentials::PersistentStorageOpCertStore opCertStore; - NL_TEST_ASSERT_SUCCESS(inSuite, opCertStore.Init(&storage)); + EXPECT_EQ(opCertStore.Init(&storage), CHIP_NO_ERROR); FabricTable fabricTable; FabricTable::InitParams initParams; initParams.storage = &storage; initParams.opCertStore = &opCertStore; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.Init(initParams)); + EXPECT_EQ(fabricTable.Init(initParams), CHIP_NO_ERROR); Crypto::P256ECDSASignature sig; uint8_t message[] = { 'm', 's', 'g' }; Crypto::P256Keypair * ephemeralKeypair = fabricTable.AllocateEphemeralKeypairForCASE(); - NL_TEST_ASSERT(inSuite, ephemeralKeypair != nullptr); - NL_TEST_ASSERT_SUCCESS(inSuite, ephemeralKeypair->Initialize(Crypto::ECPKeyTarget::ECDSA)); + ASSERT_NE(ephemeralKeypair, nullptr); + EXPECT_EQ(ephemeralKeypair->Initialize(Crypto::ECPKeyTarget::ECDSA), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, ephemeralKeypair->ECDSA_sign_msg(message, sizeof(message), sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, ephemeralKeypair->Pubkey().ECDSA_validate_msg_signature(message, sizeof(message), sig)); + EXPECT_EQ(ephemeralKeypair->ECDSA_sign_msg(message, sizeof(message), sig), CHIP_NO_ERROR); + EXPECT_EQ(ephemeralKeypair->Pubkey().ECDSA_validate_msg_signature(message, sizeof(message), sig), CHIP_NO_ERROR); fabricTable.ReleaseEphemeralKeypair(ephemeralKeypair); @@ -2783,7 +2677,7 @@ void TestEphemeralKeys(nlTestSuite * inSuite, void * inContext) } } -void TestCommitMarker(nlTestSuite * inSuite, void * inContext) +TEST_F(TestFabricTable, TestCommitMarker) { Crypto::P256PublicKey fIdx1PublicKey; Crypto::P256PublicKey fIdx2PublicKey; @@ -2795,7 +2689,7 @@ void TestCommitMarker(nlTestSuite * inSuite, void * inContext) // Log verbosity on this test helps debug significantly storage.SetLoggingLevel(chip::TestPersistentStorageDelegate::LoggingLevel::kLogMutationAndReads); - NL_TEST_ASSERT(inSuite, fabricCertAuthority.Init().IsSuccess()); + EXPECT_TRUE(fabricCertAuthority.Init().IsSuccess()); constexpr uint16_t kVendorId = 0xFFF1u; @@ -2808,11 +2702,11 @@ void TestCommitMarker(nlTestSuite * inSuite, void * inContext) { // Initialize a fabric table ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&storage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&storage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); - NL_TEST_ASSERT(inSuite, fabricTable.GetDeletedFabricFromCommitMarker() == kUndefinedFabricIndex); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.GetDeletedFabricFromCommitMarker(), kUndefinedFabricIndex); + EXPECT_EQ(fabricTable.FabricCount(), 0); // Add Fabric 1111 Node Id 55 { @@ -2821,60 +2715,55 @@ void TestCommitMarker(nlTestSuite * inSuite, void * inContext) uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS( - inSuite, fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabricCertAuthority.SetIncludeIcac(true).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), + CHIP_NO_ERROR); ByteSpan rcac = fabricCertAuthority.GetRcac(); ByteSpan icac = fabricCertAuthority.GetIcac(); ByteSpan noc = fabricCertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 0); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.FabricCount(), 0); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT_SUCCESS(inSuite, - fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT(inSuite, newFabricIndex == 1); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, icac, kVendorId, &newFabricIndex), CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(newFabricIndex, 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.CommitPendingFabricData()); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_NO_ERROR); // Validate contents const auto * fabricInfo = fabricTable.FindFabricWithIndex(1); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); - Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 1); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 1111); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); - } + ASSERT_NE(fabricInfo, nullptr); + Credentials::ChipCertificateSet certificates; + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); + Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), 1); + EXPECT_EQ(fabricInfo->GetNodeId(), 55u); + EXPECT_EQ(fabricInfo->GetFabricId(), 1111u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); + + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); // Validate that fabric has the correct operational key by verifying a signature { Crypto::P256ECDSASignature sig; uint8_t message[] = { 'm', 's', 'g' }; - NL_TEST_ASSERT_SUCCESS(inSuite, VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), fIdx1PublicKey)); + EXPECT_EQ(VerifyCertificateSigningRequest(csrSpan.data(), csrSpan.size(), fIdx1PublicKey), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.SignWithOpKeypair(newFabricIndex, ByteSpan{ message }, sig)); - NL_TEST_ASSERT_SUCCESS(inSuite, fIdx1PublicKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig)); + EXPECT_EQ(fabricTable.SignWithOpKeypair(newFabricIndex, ByteSpan{ message }, sig), CHIP_NO_ERROR); + EXPECT_EQ(fIdx1PublicKey.ECDSA_validate_msg_signature(&message[0], sizeof(message), sig), CHIP_NO_ERROR); } } numStorageKeysAfterFirstAdd = storage.GetNumKeys(); - NL_TEST_ASSERT(inSuite, numStorageKeysAfterFirstAdd == 7); // Metadata, index, 3 certs, 1 opkey, last known good time + EXPECT_EQ(numStorageKeysAfterFirstAdd, 7u); // Metadata, index, 3 certs, 1 opkey, last known good time // The following test requires test methods not available on all builds. // TODO: Debug why some CI jobs don't set it properly. @@ -2887,53 +2776,49 @@ void TestCommitMarker(nlTestSuite * inSuite, void * inContext) uint8_t csrBuf[chip::Crypto::kMIN_CSR_Buffer_Size]; MutableByteSpan csrSpan{ csrBuf }; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan)); + EXPECT_EQ(fabricTable.AllocatePendingOperationalKey(chip::NullOptional, csrSpan), CHIP_NO_ERROR); - NL_TEST_ASSERT_SUCCESS( - inSuite, fabricCertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus()); + EXPECT_EQ(fabricCertAuthority.SetIncludeIcac(false).GenerateNocChain(fabricId, nodeId, csrSpan).GetStatus(), + CHIP_NO_ERROR); ByteSpan rcac = fabricCertAuthority.GetRcac(); ByteSpan noc = fabricCertAuthority.GetNoc(); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.AddNewPendingTrustedRootCert(rcac)); + EXPECT_EQ(fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.AddNewPendingTrustedRootCert(rcac), CHIP_NO_ERROR); FabricIndex newFabricIndex = kUndefinedFabricIndex; - NL_TEST_ASSERT_SUCCESS( - inSuite, fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, ByteSpan{}, kVendorId, &newFabricIndex)); - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 2); - NL_TEST_ASSERT(inSuite, newFabricIndex == 2); + EXPECT_EQ(fabricTable.AddNewPendingFabricWithOperationalKeystore(noc, ByteSpan{}, kVendorId, &newFabricIndex), + CHIP_NO_ERROR); + EXPECT_EQ(fabricTable.FabricCount(), 2); + EXPECT_EQ(newFabricIndex, 2); // Validate contents of pending const auto * fabricInfo = fabricTable.FindFabricWithIndex(2); - NL_TEST_ASSERT(inSuite, fabricInfo != nullptr); - if (fabricInfo != nullptr) - { - Credentials::ChipCertificateSet certificates; - NL_TEST_ASSERT_SUCCESS(inSuite, certificates.Init(1)); - NL_TEST_ASSERT_SUCCESS(inSuite, - certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor))); - Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); - - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricIndex() == 2); - NL_TEST_ASSERT(inSuite, fabricInfo->GetNodeId() == 66); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricId() == 2222); - NL_TEST_ASSERT(inSuite, fabricInfo->GetVendorId() == kVendorId); - NL_TEST_ASSERT(inSuite, fabricInfo->GetFabricLabel().size() == 0); - - Crypto::P256PublicKey rootPublicKeyOfFabric; - NL_TEST_ASSERT_SUCCESS(inSuite, fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric)); - NL_TEST_ASSERT(inSuite, rootPublicKeyOfFabric.Matches(rcacPublicKey)); - } + ASSERT_NE(fabricInfo, nullptr); + Credentials::ChipCertificateSet certificates; + EXPECT_EQ(certificates.Init(1), CHIP_NO_ERROR); + EXPECT_EQ(certificates.LoadCert(rcac, BitFlags<CertDecodeFlags>(CertDecodeFlags::kIsTrustAnchor)), CHIP_NO_ERROR); + Crypto::P256PublicKey rcacPublicKey(certificates.GetCertSet()[0].mPublicKey); + + EXPECT_EQ(fabricInfo->GetFabricIndex(), 2); + EXPECT_EQ(fabricInfo->GetNodeId(), 66u); + EXPECT_EQ(fabricInfo->GetFabricId(), 2222u); + EXPECT_EQ(fabricInfo->GetVendorId(), kVendorId); + EXPECT_EQ(fabricInfo->GetFabricLabel().size(), 0u); + + Crypto::P256PublicKey rootPublicKeyOfFabric; + EXPECT_EQ(fabricTable.FetchRootPubkey(newFabricIndex, rootPublicKeyOfFabric), CHIP_NO_ERROR); + EXPECT_TRUE(rootPublicKeyOfFabric.Matches(rcacPublicKey)); // Make sure no additional storage yet - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == numStorageKeysAfterFirstAdd); + EXPECT_EQ(storage.GetNumKeys(), numStorageKeysAfterFirstAdd); // --> FORCE AN ERROR ON COMMIT that will BYPASS commit clean-up (similar to reboot during commit) fabricTable.SetForceAbortCommitForTest(true); - NL_TEST_ASSERT(inSuite, fabricTable.CommitPendingFabricData() == CHIP_ERROR_INTERNAL); + EXPECT_EQ(fabricTable.CommitPendingFabricData(), CHIP_ERROR_INTERNAL); // Check that there are more keys now, partially committed: at least a Commit Marker (+1) // and some more keys from the aborted process. - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() > (numStorageKeysAfterFirstAdd + 1)); + EXPECT_GT(storage.GetNumKeys(), (numStorageKeysAfterFirstAdd + 1)); } #endif // CONFIG_BUILD_FOR_HOST_UNIT_TEST } @@ -2945,19 +2830,19 @@ void TestCommitMarker(nlTestSuite * inSuite, void * inContext) // Initialize a FabricTable again. Make sure it succeeds in initing. ScopedFabricTable fabricTableHolder; - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() > (numStorageKeysAfterFirstAdd + 1)); + EXPECT_GT(storage.GetNumKeys(), (numStorageKeysAfterFirstAdd + 1)); - NL_TEST_ASSERT(inSuite, fabricTableHolder.Init(&storage) == CHIP_NO_ERROR); + EXPECT_EQ(fabricTableHolder.Init(&storage), CHIP_NO_ERROR); FabricTable & fabricTable = fabricTableHolder.GetFabricTable(); // Make sure that after init, the fabricTable has only 1 fabric - NL_TEST_ASSERT_EQUALS(inSuite, fabricTable.FabricCount(), 1); + EXPECT_EQ(fabricTable.FabricCount(), 1); // Make sure it caught the last partially committed fabric - NL_TEST_ASSERT(inSuite, fabricTable.GetDeletedFabricFromCommitMarker() == 2); + EXPECT_EQ(fabricTable.GetDeletedFabricFromCommitMarker(), 2); // Second read must return kUndefinedFabricIndex - NL_TEST_ASSERT(inSuite, fabricTable.GetDeletedFabricFromCommitMarker() == kUndefinedFabricIndex); + EXPECT_EQ(fabricTable.GetDeletedFabricFromCommitMarker(), kUndefinedFabricIndex); { // Here we would do other clean-ups (e.g. see Server.cpp that uses the above) and then @@ -2966,7 +2851,7 @@ void TestCommitMarker(nlTestSuite * inSuite, void * inContext) } // Make sure that all other pending storage got deleted - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == numStorageKeysAfterFirstAdd); + EXPECT_EQ(storage.GetNumKeys(), numStorageKeysAfterFirstAdd); // Verify we can only see 1 fabric with the iterator { @@ -2978,8 +2863,8 @@ void TestCommitMarker(nlTestSuite * inSuite, void * inContext) ++numFabricsIterated; if (iterFabricInfo.GetFabricIndex() == 1) { - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetNodeId() == 55); - NL_TEST_ASSERT(inSuite, iterFabricInfo.GetFabricId() == 1111); + EXPECT_EQ(iterFabricInfo.GetNodeId(), 55u); + EXPECT_EQ(iterFabricInfo.GetFabricId(), 1111u); saw1 = true; } if (iterFabricInfo.GetFabricIndex() == 2) @@ -2988,90 +2873,12 @@ void TestCommitMarker(nlTestSuite * inSuite, void * inContext) } } - NL_TEST_ASSERT(inSuite, numFabricsIterated == 1); - NL_TEST_ASSERT(inSuite, saw1 == true); - NL_TEST_ASSERT(inSuite, saw2 == false); + EXPECT_EQ(numFabricsIterated, 1u); + EXPECT_TRUE(saw1); + EXPECT_FALSE(saw2); } } #endif // CONFIG_BUILD_FOR_HOST_UNIT_TEST } -// Test Suite - -/** - * Test Suite that lists all the test functions. - */ -// clang-format off -static const nlTest sTests[] = -{ - NL_TEST_DEF("Last Known Good Time Init", TestLastKnownGoodTimeInit), - NL_TEST_DEF("Update Last Known Good Time", TestUpdateLastKnownGoodTime), - NL_TEST_DEF("Set Last Known Good Time", TestSetLastKnownGoodTime), - NL_TEST_DEF("Test basic AddNOC flow", TestBasicAddNocUpdateNocFlow), - NL_TEST_DEF("Test adding multiple fabrics that chain to same root, different fabric ID", TestAddMultipleSameRootDifferentFabricId), - NL_TEST_DEF("Test adding multiple fabrics that chain to different roots, same fabric ID", TestAddMultipleSameFabricIdDifferentRoot), - NL_TEST_DEF("Validate fabrics are loaded from persistence at FabricTable::init", TestPersistence), - NL_TEST_DEF("Test fail-safe handling during AddNOC", TestAddNocFailSafe), - NL_TEST_DEF("Test fail-safe handling during UpdateNoc", TestUpdateNocFailSafe), - NL_TEST_DEF("Test fail-safe handling for root cert", TestAddRootCertFailSafe), - NL_TEST_DEF("Test interlock sequencing errors", TestSequenceErrors), - NL_TEST_DEF("Test fabric label changes", TestFabricLabelChange), - NL_TEST_DEF("Test compressed fabric ID is properly generated", TestCompressedFabricId), - NL_TEST_DEF("Test fabric lookup by <root public key, fabric ID>", TestFabricLookup), - NL_TEST_DEF("Test Fetching CATs", TestFetchCATs), - NL_TEST_DEF("Test AddNOC root collision", TestAddNocRootCollision), - NL_TEST_DEF("Test invalid chaining in AddNOC and UpdateNOC", TestInvalidChaining), - NL_TEST_DEF("Test ephemeral keys allocation", TestEphemeralKeys), - NL_TEST_DEF("Test proper detection of Commit Marker on init", TestCommitMarker), - NL_TEST_DEF("Test colliding fabrics in the fabric table", TestCollidingFabrics), - - NL_TEST_SENTINEL() -}; - -// clang-format on - -int TestFabricTable_Setup(void * inContext); -int TestFabricTable_Teardown(void * inContext); - -// clang-format off -static nlTestSuite sSuite = -{ - "Test-CHIP-FabricTable", - &sTests[0], - TestFabricTable_Setup, - TestFabricTable_Teardown, -}; -// clang-format on - -/** - * Set up the test suite. - */ -int TestFabricTable_Setup(void * inContext) -{ - DeviceLayer::SetConfigurationMgr(&DeviceLayer::ConfigurationManagerImpl::GetDefaultInstance()); - return chip::Platform::MemoryInit() == CHIP_NO_ERROR ? SUCCESS : FAILURE; -} - -/** - * Tear down the test suite. - */ -int TestFabricTable_Teardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - } // namespace - -/** - * Main - */ -int TestFabricTable() -{ - // Run test suit against one context - nlTestRunner(&sSuite, nullptr); - - return (nlTestRunnerStats(&sSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestFabricTable) diff --git a/src/credentials/tests/TestGroupDataProvider.cpp b/src/credentials/tests/TestGroupDataProvider.cpp index f3f44d8195d0eb..7718cf0ee49cd2 100644 --- a/src/credentials/tests/TestGroupDataProvider.cpp +++ b/src/credentials/tests/TestGroupDataProvider.cpp @@ -18,11 +18,10 @@ #include <credentials/GroupDataProviderImpl.h> #include <crypto/DefaultSessionKeystore.h> +#include <gtest/gtest.h> #include <lib/core/TLV.h> #include <lib/support/CHIPMem.h> #include <lib/support/TestPersistentStorageDelegate.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> #include <platform/KeyValueStoreManager.h> #include <set> #include <string.h> @@ -187,41 +186,100 @@ bool CompareKeySets(const KeySet & retrievedKeySet, const KeySet & keyset2) return true; } -void TestStorageDelegate(nlTestSuite * apSuite, void * apContext) +struct TestGroupDataProvider : public ::testing::Test +{ + + static chip::TestPersistentStorageDelegate sDelegate; + static chip::Crypto::DefaultSessionKeystore sSessionKeystore; + static GroupDataProviderImpl sProvider; + + constexpr static EpochKey kEpochKeys0[] = { + { 0x0000000000000000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { 0x1111111111111111, { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f } }, + { 0x2222222222222222, { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f } } + }; + constexpr static EpochKey kEpochKeys1[] = { + { 0x3333333333333333, { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f } }, + { 0x4444444444444444, { 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f } }, + { 0x5555555555555555, { 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f } }, + }; + constexpr static EpochKey kEpochKeys2[] = { + { 0xaaaaaaaaaaaaaaaa, { 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf } }, + { 0xbbbbbbbbbbbbbbbb, { 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf } }, + { 0xcccccccccccccccc, { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf } }, + }; + constexpr static EpochKey kEpochKeys3[] = { + { 0xdddddddddddddddd, { 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf } }, + { 0xeeeeeeeeeeeeeeee, { 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef } }, + { 0xffffffffffffffff, { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff } }, + }; + static void SetUpTestSuite() + { + + EXPECT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); + + // Initialize Group Data Provider + sProvider.SetStorageDelegate(&sDelegate); + sProvider.SetSessionKeystore(&sSessionKeystore); + sProvider.SetListener(&chip::app::TestGroups::sListener); + EXPECT_EQ(sProvider.Init(), CHIP_NO_ERROR); + SetGroupDataProvider(&sProvider); + + memcpy(chip::app::TestGroups::kKeySet0.epoch_keys, kEpochKeys0, sizeof(kEpochKeys0)); + memcpy(chip::app::TestGroups::kKeySet1.epoch_keys, kEpochKeys1, sizeof(kEpochKeys1)); + memcpy(chip::app::TestGroups::kKeySet2.epoch_keys, kEpochKeys2, sizeof(kEpochKeys2)); + memcpy(chip::app::TestGroups::kKeySet3.epoch_keys, kEpochKeys3, sizeof(kEpochKeys3)); + } + static void TearDownTestSuite() + { + GroupDataProvider * provider = GetGroupDataProvider(); + if (nullptr != provider) + { + provider->Finish(); + } + chip::Platform::MemoryShutdown(); + } +}; + +chip::TestPersistentStorageDelegate TestGroupDataProvider::sDelegate; +chip::Crypto::DefaultSessionKeystore TestGroupDataProvider::sSessionKeystore; +GroupDataProviderImpl TestGroupDataProvider::sProvider(kMaxGroupsPerFabric, kMaxGroupKeysPerFabric); + +TEST_F(TestGroupDataProvider, TestStorageDelegate) { chip::TestPersistentStorageDelegate delegate; char out[128]; uint16_t size = static_cast<uint16_t>(sizeof(out)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND == delegate.SyncGetKeyValue(kKey1, out, size)); + EXPECT_EQ(CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND, delegate.SyncGetKeyValue(kKey1, out, size)); size = static_cast<uint16_t>(kSize1); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == delegate.SyncSetKeyValue(kKey1, kValue1, size)); + EXPECT_EQ(delegate.SyncSetKeyValue(kKey1, kValue1, size), CHIP_NO_ERROR); size = static_cast<uint16_t>(sizeof(out)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == delegate.SyncGetKeyValue(kKey1, out, size)); - NL_TEST_ASSERT(apSuite, size == kSize1); - NL_TEST_ASSERT(apSuite, !memcmp(out, kValue1, kSize1)); + EXPECT_EQ(delegate.SyncGetKeyValue(kKey1, out, size), CHIP_NO_ERROR); + EXPECT_EQ(size, kSize1); + EXPECT_FALSE(memcmp(out, kValue1, kSize1)); size = static_cast<uint16_t>(kSize2); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == delegate.SyncSetKeyValue(kKey1, kValue2, size)); + EXPECT_EQ(delegate.SyncSetKeyValue(kKey1, kValue2, size), CHIP_NO_ERROR); size = static_cast<uint16_t>(sizeof(out)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == delegate.SyncGetKeyValue(kKey1, out, size)); - NL_TEST_ASSERT(apSuite, size == kSize2); - NL_TEST_ASSERT(apSuite, !memcmp(out, kValue2, kSize2)); + EXPECT_EQ(delegate.SyncGetKeyValue(kKey1, out, size), CHIP_NO_ERROR); + EXPECT_EQ(size, kSize2); + EXPECT_FALSE(memcmp(out, kValue2, kSize2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == delegate.SyncDeleteKeyValue(kKey1)); + EXPECT_EQ(delegate.SyncDeleteKeyValue(kKey1), CHIP_NO_ERROR); size = static_cast<uint16_t>(sizeof(out)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND == delegate.SyncGetKeyValue(kKey1, out, size)); + EXPECT_EQ(CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND, delegate.SyncGetKeyValue(kKey1, out, size)); } -void TestGroupInfo(nlTestSuite * apSuite, void * apContext) +TEST_F(TestGroupDataProvider, TestGroupInfo) { GroupDataProvider * provider = GetGroupDataProvider(); - NL_TEST_ASSERT(apSuite, provider); + EXPECT_TRUE(provider); // Reset test ResetProvider(provider); @@ -233,114 +291,114 @@ void TestGroupInfo(nlTestSuite * apSuite, void * apContext) sListener.Reset(); // Out-of-order - NL_TEST_ASSERT(apSuite, CHIP_ERROR_INVALID_ARGUMENT == provider->SetGroupInfoAt(kFabric1, 2, kGroupInfo1_1)); + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, provider->SetGroupInfoAt(kFabric1, 2, kGroupInfo1_1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 0, kGroupInfo1_1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 1, kGroupInfo1_2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 2, kGroupInfo1_3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric2, 0, kGroupInfo2_1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric2, 1, kGroupInfo2_2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric2, 2, kGroupInfo2_3)); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 0, kGroupInfo1_1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 1, kGroupInfo1_2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 2, kGroupInfo1_3), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric2, 0, kGroupInfo2_1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric2, 1, kGroupInfo2_2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric2, 2, kGroupInfo2_3), CHIP_NO_ERROR); // Duplicated - NL_TEST_ASSERT(apSuite, CHIP_ERROR_DUPLICATE_KEY_ID == provider->SetGroupInfoAt(kFabric1, 3, kGroupInfo1_1)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_DUPLICATE_KEY_ID == provider->SetGroupInfoAt(kFabric2, 3, kGroupInfo2_3)); + EXPECT_EQ(CHIP_ERROR_DUPLICATE_KEY_ID, provider->SetGroupInfoAt(kFabric1, 3, kGroupInfo1_1)); + EXPECT_EQ(CHIP_ERROR_DUPLICATE_KEY_ID, provider->SetGroupInfoAt(kFabric2, 3, kGroupInfo2_3)); // Get Group Info - NL_TEST_ASSERT(apSuite, CHIP_ERROR_INVALID_FABRIC_INDEX == provider->GetGroupInfoAt(kUndefinedFabricIndex, 0, group)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetGroupInfoAt(kFabric2, 999, group)); - - NL_TEST_ASSERT(apSuite, sListener.latest == kGroupInfo2_3); - NL_TEST_ASSERT(apSuite, 6 == sListener.added_count); - NL_TEST_ASSERT(apSuite, 0 == sListener.removed_count); - - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric2, 2, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo2_3); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric2, 1, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo2_2); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric2, 0, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo2_1); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric1, 1, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo1_2); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric1, 0, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo1_1); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric1, 2, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo1_3); + EXPECT_EQ(CHIP_ERROR_INVALID_FABRIC_INDEX, provider->GetGroupInfoAt(kUndefinedFabricIndex, 0, group)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetGroupInfoAt(kFabric2, 999, group)); + + EXPECT_EQ(sListener.latest, kGroupInfo2_3); + EXPECT_EQ(sListener.added_count, 6u); + EXPECT_EQ(sListener.removed_count, 0u); + + EXPECT_EQ(provider->GetGroupInfoAt(kFabric2, 2, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo2_3); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric2, 1, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo2_2); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric2, 0, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo2_1); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric1, 1, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo1_2); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric1, 0, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo1_1); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric1, 2, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo1_3); // Remove Groups - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveGroupInfo(kFabric1, kGroup3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveGroupInfoAt(kFabric2, 0)); - NL_TEST_ASSERT(apSuite, sListener.latest == kGroupInfo2_1); - NL_TEST_ASSERT(apSuite, 6 == sListener.added_count); - NL_TEST_ASSERT(apSuite, 2 == sListener.removed_count); + EXPECT_EQ(provider->RemoveGroupInfo(kFabric1, kGroup3), CHIP_NO_ERROR); + EXPECT_EQ(provider->RemoveGroupInfoAt(kFabric2, 0), CHIP_NO_ERROR); + EXPECT_EQ(sListener.latest, kGroupInfo2_1); + EXPECT_EQ(sListener.added_count, 6u); + EXPECT_EQ(sListener.removed_count, 2u); // Remaining entries shift up - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetGroupInfoAt(kFabric2, 2, group)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric2, 1, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo2_3); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric2, 0, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo2_2); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric1, 1, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo1_2); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric1, 0, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo1_1); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetGroupInfoAt(kFabric1, 3, group)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetGroupInfoAt(kFabric2, 2, group)); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric2, 1, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo2_3); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric2, 0, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo2_2); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric1, 1, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo1_2); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric1, 0, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo1_1); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetGroupInfoAt(kFabric1, 3, group)); // Overwrite with new group - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 2, kGroupInfo3_4)); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 2, kGroupInfo3_4), CHIP_NO_ERROR); // Replace existing group (implicit group remove) - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric2, 0, kGroupInfo3_4)); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric2, 0, kGroupInfo3_4), CHIP_NO_ERROR); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric1, 2, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo3_4); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric1, 2, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo3_4); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric2, 0, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo3_4); - NL_TEST_ASSERT(apSuite, sListener.latest == kGroupInfo3_4); - NL_TEST_ASSERT(apSuite, 8 == sListener.added_count); - NL_TEST_ASSERT(apSuite, 3 == sListener.removed_count); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric2, 0, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo3_4); + EXPECT_EQ(sListener.latest, kGroupInfo3_4); + EXPECT_EQ(sListener.added_count, 8u); + EXPECT_EQ(sListener.removed_count, 3u); // Overwrite existing group, index must match - NL_TEST_ASSERT(apSuite, CHIP_ERROR_DUPLICATE_KEY_ID == provider->SetGroupInfoAt(kFabric1, 1, kGroupInfo1_1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 1, kGroupInfo2_2)); + EXPECT_EQ(CHIP_ERROR_DUPLICATE_KEY_ID, provider->SetGroupInfoAt(kFabric1, 1, kGroupInfo1_1)); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 1, kGroupInfo2_2), CHIP_NO_ERROR); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_DUPLICATE_KEY_ID == provider->SetGroupInfoAt(kFabric2, 1, kGroupInfo3_4)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric2, 1, kGroupInfo1_3)); + EXPECT_EQ(CHIP_ERROR_DUPLICATE_KEY_ID, provider->SetGroupInfoAt(kFabric2, 1, kGroupInfo3_4)); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric2, 1, kGroupInfo1_3), CHIP_NO_ERROR); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric1, 1, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo2_2); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric1, 1, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo2_2); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric2, 1, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo1_3); - NL_TEST_ASSERT(apSuite, sListener.latest == kGroupInfo3_4); - NL_TEST_ASSERT(apSuite, 8 == sListener.added_count); - NL_TEST_ASSERT(apSuite, 3 == sListener.removed_count); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric2, 1, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo1_3); + EXPECT_EQ(sListener.latest, kGroupInfo3_4); + EXPECT_EQ(sListener.added_count, 8u); + EXPECT_EQ(sListener.removed_count, 3u); // By group_id // Override existing - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfo(kFabric1, kGroupInfo3_5)); + EXPECT_EQ(provider->SetGroupInfo(kFabric1, kGroupInfo3_5), CHIP_NO_ERROR); // New group - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfo(kFabric2, kGroupInfo3_2)); + EXPECT_EQ(provider->SetGroupInfo(kFabric2, kGroupInfo3_2), CHIP_NO_ERROR); // Not found - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetGroupInfo(kFabric2, kGroup5, group)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetGroupInfo(kFabric2, kGroup5, group)); // Existing - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfo(kFabric2, kGroup2, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo3_2); - NL_TEST_ASSERT(apSuite, sListener.latest == kGroupInfo3_2); - NL_TEST_ASSERT(apSuite, 9 == sListener.added_count); - NL_TEST_ASSERT(apSuite, 3 == sListener.removed_count); + EXPECT_EQ(provider->GetGroupInfo(kFabric2, kGroup2, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo3_2); + EXPECT_EQ(sListener.latest, kGroupInfo3_2); + EXPECT_EQ(sListener.added_count, 9u); + EXPECT_EQ(sListener.removed_count, 3u); } -void TestGroupInfoIterator(nlTestSuite * apSuite, void * apContext) +TEST_F(TestGroupDataProvider, TestGroupInfoIterator) { GroupDataProvider * provider = GetGroupDataProvider(); - NL_TEST_ASSERT(apSuite, provider); + EXPECT_TRUE(provider); // Reset test ResetProvider(provider); @@ -349,12 +407,12 @@ void TestGroupInfoIterator(nlTestSuite * apSuite, void * apContext) // Set Group Info - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 0, kGroupInfo1_3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 1, kGroupInfo1_2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 2, kGroupInfo1_1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric2, 0, kGroupInfo2_1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric2, 1, kGroupInfo2_3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric2, 2, kGroupInfo2_2)); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 0, kGroupInfo1_3), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 1, kGroupInfo1_2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 2, kGroupInfo1_1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric2, 0, kGroupInfo2_1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric2, 1, kGroupInfo2_3), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric2, 2, kGroupInfo2_2), CHIP_NO_ERROR); // Iterate fabric 1 @@ -363,17 +421,14 @@ void TestGroupInfoIterator(nlTestSuite * apSuite, void * apContext) auto it = provider->IterateGroupInfo(kFabric1); size_t i = 0; - NL_TEST_ASSERT(apSuite, it); - if (it) + ASSERT_TRUE(it); + EXPECT_EQ(expected_f1_count, it->Count()); + while (it->Next(group) && i < expected_f1_count) { - NL_TEST_ASSERT(apSuite, expected_f1_count == it->Count()); - while (it->Next(group) && i < expected_f1_count) - { - NL_TEST_ASSERT(apSuite, expected_f1[i++] == group); - } - NL_TEST_ASSERT(apSuite, i == it->Count()); - it->Release(); + EXPECT_EQ(expected_f1[i++], group); } + EXPECT_EQ(i, it->Count()); + it->Release(); // Iterate fabric 2 @@ -381,24 +436,21 @@ void TestGroupInfoIterator(nlTestSuite * apSuite, void * apContext) size_t expected_f2_count = sizeof(expected_f2) / sizeof(GroupInfo); it = provider->IterateGroupInfo(kFabric2); - NL_TEST_ASSERT(apSuite, it); - if (it) + ASSERT_TRUE(it); + i = 0; + EXPECT_EQ(expected_f2_count, it->Count()); + while (it->Next(group) && i < expected_f2_count) { - i = 0; - NL_TEST_ASSERT(apSuite, expected_f2_count == it->Count()); - while (it->Next(group) && i < expected_f2_count) - { - NL_TEST_ASSERT(apSuite, expected_f2[i++] == group); - } - NL_TEST_ASSERT(apSuite, i == it->Count()); - it->Release(); + EXPECT_EQ(expected_f2[i++], group); } + EXPECT_EQ(i, it->Count()); + it->Release(); } -void TestEndpoints(nlTestSuite * apSuite, void * apContext) +TEST_F(TestGroupDataProvider, TestEndpoints) { GroupDataProvider * provider = GetGroupDataProvider(); - NL_TEST_ASSERT(apSuite, provider); + EXPECT_TRUE(provider); // Reset test ResetProvider(provider); @@ -407,92 +459,92 @@ void TestEndpoints(nlTestSuite * apSuite, void * apContext) // Existing groups - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 0, kGroupInfo1_1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 1, kGroupInfo1_2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 2, kGroupInfo1_3)); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 0, kGroupInfo1_1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 1, kGroupInfo1_2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 2, kGroupInfo1_3), CHIP_NO_ERROR); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup1, kEndpointId0)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup1, kEndpointId1)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup2, kEndpointId2)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup2, kEndpointId3)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId0)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId1)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId2)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup1, kEndpointId0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup1, kEndpointId1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup2, kEndpointId2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup2, kEndpointId3)); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup1, kEndpointId0), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup1, kEndpointId1), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup2, kEndpointId2), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup2, kEndpointId3), CHIP_NO_ERROR); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup2, kEndpointId3)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup2, kEndpointId2)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup1, kEndpointId1)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup1, kEndpointId0)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId3)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId2)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId1)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId0)); // New groups - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric2, kGroup1, kEndpointId0)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric2, kGroup2, kEndpointId1)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric2, kGroup3, kEndpointId2)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric2, kGroup4, kEndpointId3)); + EXPECT_FALSE(provider->HasEndpoint(kFabric2, kGroup1, kEndpointId0)); + EXPECT_FALSE(provider->HasEndpoint(kFabric2, kGroup2, kEndpointId1)); + EXPECT_FALSE(provider->HasEndpoint(kFabric2, kGroup3, kEndpointId2)); + EXPECT_FALSE(provider->HasEndpoint(kFabric2, kGroup4, kEndpointId3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup1, kEndpointId0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup2, kEndpointId1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup4, kEndpointId3)); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup1, kEndpointId0), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup2, kEndpointId1), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId2), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup4, kEndpointId3), CHIP_NO_ERROR); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup1, kEndpointId0)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup2, kEndpointId1)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup3, kEndpointId2)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup4, kEndpointId3)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup1, kEndpointId0)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup2, kEndpointId1)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup3, kEndpointId2)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup4, kEndpointId3)); // Remove - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->RemoveEndpoint(kFabric1, kGroup1, kEndpointId4)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveEndpoint(kFabric1, kGroup1, kEndpointId0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveEndpoint(kFabric1, kGroup2, kEndpointId3)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->RemoveEndpoint(kFabric1, kGroup1, kEndpointId4)); + EXPECT_EQ(provider->RemoveEndpoint(kFabric1, kGroup1, kEndpointId0), CHIP_NO_ERROR); + EXPECT_EQ(provider->RemoveEndpoint(kFabric1, kGroup2, kEndpointId3), CHIP_NO_ERROR); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->RemoveEndpoint(kFabric2, kGroup5, kEndpointId0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveEndpoint(kFabric2, kGroup2, kEndpointId1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveEndpoint(kFabric2, kGroup3, kEndpointId2)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->RemoveEndpoint(kFabric2, kGroup5, kEndpointId0)); + EXPECT_EQ(provider->RemoveEndpoint(kFabric2, kGroup2, kEndpointId1), CHIP_NO_ERROR); + EXPECT_EQ(provider->RemoveEndpoint(kFabric2, kGroup3, kEndpointId2), CHIP_NO_ERROR); // Check removed - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup1, kEndpointId0)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup1, kEndpointId1)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup2, kEndpointId2)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup2, kEndpointId3)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId0)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId1)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId2)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId3)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup1, kEndpointId0)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric2, kGroup2, kEndpointId1)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric2, kGroup3, kEndpointId2)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup4, kEndpointId3)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup1, kEndpointId0)); + EXPECT_FALSE(provider->HasEndpoint(kFabric2, kGroup2, kEndpointId1)); + EXPECT_FALSE(provider->HasEndpoint(kFabric2, kGroup3, kEndpointId2)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup4, kEndpointId3)); // Remove All - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup1, kEndpointId3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup2, kEndpointId3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup3, kEndpointId3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup4, kEndpointId3)); - - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup1, kEndpointId1)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup1, kEndpointId3)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup2, kEndpointId3)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup2, kEndpointId2)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup3, kEndpointId3)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup4, kEndpointId3)); - - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveEndpoint(kFabric1, kEndpointId3)); - - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup1, kEndpointId1)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup1, kEndpointId3)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup2, kEndpointId3)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup2, kEndpointId2)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup3, kEndpointId3)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup4, kEndpointId3)); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup1, kEndpointId3), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup2, kEndpointId3), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup3, kEndpointId3), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup4, kEndpointId3), CHIP_NO_ERROR); + + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId1)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId3)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId3)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId2)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup3, kEndpointId3)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup4, kEndpointId3)); + + EXPECT_EQ(provider->RemoveEndpoint(kFabric1, kEndpointId3), CHIP_NO_ERROR); + + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId1)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId3)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId3)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId2)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup3, kEndpointId3)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup4, kEndpointId3)); } -void TestEndpointIterator(nlTestSuite * apSuite, void * apContext) +TEST_F(TestGroupDataProvider, TestEndpointIterator) { GroupDataProvider * provider = GetGroupDataProvider(); - NL_TEST_ASSERT(apSuite, provider); + EXPECT_TRUE(provider); // Reset test ResetProvider(provider); @@ -501,18 +553,18 @@ void TestEndpointIterator(nlTestSuite * apSuite, void * apContext) // Set Endpoints - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup1, kEndpointId0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup1, kEndpointId2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup1, kEndpointId4)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup2, kEndpointId1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup2, kEndpointId2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup2, kEndpointId3)); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup1, kEndpointId0), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup1, kEndpointId2), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup1, kEndpointId4), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup2, kEndpointId1), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup2, kEndpointId2), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup2, kEndpointId3), CHIP_NO_ERROR); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId4)); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId0), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId1), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId2), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId3), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId4), CHIP_NO_ERROR); // Iterate fabric 1 @@ -523,20 +575,17 @@ void TestEndpointIterator(nlTestSuite * apSuite, void * apContext) auto it = provider->IterateEndpoints(kFabric1); size_t count = 0; - NL_TEST_ASSERT(apSuite, it); - if (it) + ASSERT_TRUE(it); + GroupEndpoint output; + EXPECT_EQ(expected_f1.size(), it->Count()); + while (it->Next(output) && count < expected_f1.size()) { - GroupEndpoint output; - NL_TEST_ASSERT(apSuite, expected_f1.size() == it->Count()); - while (it->Next(output) && count < expected_f1.size()) - { - std::pair<chip::GroupId, chip::EndpointId> mapping(output.group_id, output.endpoint_id); - NL_TEST_ASSERT(apSuite, expected_f1.count(mapping) > 0); - count++; - } - NL_TEST_ASSERT(apSuite, count == it->Count()); - it->Release(); + std::pair<chip::GroupId, chip::EndpointId> mapping(output.group_id, output.endpoint_id); + EXPECT_GT(expected_f1.count(mapping), 0u); + count++; } + EXPECT_EQ(count, it->Count()); + it->Release(); // Iterate fabric 2 @@ -546,27 +595,23 @@ void TestEndpointIterator(nlTestSuite * apSuite, void * apContext) }; it = provider->IterateEndpoints(kFabric2); - NL_TEST_ASSERT(apSuite, it); - if (it) + ASSERT_TRUE(it); + count = 0; + EXPECT_EQ(expected_f2.size(), it->Count()); + while (it->Next(output) && count < expected_f2.size()) { - count = 0; - GroupEndpoint output; - NL_TEST_ASSERT(apSuite, expected_f2.size() == it->Count()); - while (it->Next(output) && count < expected_f2.size()) - { - std::pair<chip::GroupId, chip::EndpointId> mapping(output.group_id, output.endpoint_id); - NL_TEST_ASSERT(apSuite, expected_f2.count(mapping) > 0); - count++; - } - NL_TEST_ASSERT(apSuite, count == it->Count()); - it->Release(); + std::pair<chip::GroupId, chip::EndpointId> mapping(output.group_id, output.endpoint_id); + EXPECT_GT(expected_f2.count(mapping), 0u); + count++; } + EXPECT_EQ(count, it->Count()); + it->Release(); } -void TestGroupKeys(nlTestSuite * apSuite, void * apContext) +TEST_F(TestGroupDataProvider, TestGroupKeys) { GroupDataProvider * provider = GetGroupDataProvider(); - NL_TEST_ASSERT(apSuite, provider); + EXPECT_TRUE(provider); // Reset test ResetProvider(provider); @@ -576,101 +621,101 @@ void TestGroupKeys(nlTestSuite * apSuite, void * apContext) // Set Group Info // Out-of-order - NL_TEST_ASSERT(apSuite, CHIP_ERROR_INVALID_ARGUMENT == provider->SetGroupKeyAt(kFabric1, 2, kGroup1Keyset0)); + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, provider->SetGroupKeyAt(kFabric1, 2, kGroup1Keyset0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric1, 0, kGroup1Keyset0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric1, 1, kGroup1Keyset1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric1, 2, kGroup1Keyset2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric1, 3, kGroup1Keyset3)); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric1, 0, kGroup1Keyset0), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric1, 1, kGroup1Keyset1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric1, 2, kGroup1Keyset2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric1, 3, kGroup1Keyset3), CHIP_NO_ERROR); // Duplicated - NL_TEST_ASSERT(apSuite, CHIP_ERROR_DUPLICATE_KEY_ID == provider->SetGroupKeyAt(kFabric1, 4, kGroup1Keyset2)); + EXPECT_EQ(CHIP_ERROR_DUPLICATE_KEY_ID, provider->SetGroupKeyAt(kFabric1, 4, kGroup1Keyset2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric2, 0, kGroup2Keyset0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric2, 1, kGroup2Keyset1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric2, 2, kGroup2Keyset2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric2, 3, kGroup2Keyset3)); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric2, 0, kGroup2Keyset0), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric2, 1, kGroup2Keyset1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric2, 2, kGroup2Keyset2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric2, 3, kGroup2Keyset3), CHIP_NO_ERROR); // Duplicated - NL_TEST_ASSERT(apSuite, CHIP_ERROR_DUPLICATE_KEY_ID == provider->SetGroupKeyAt(kFabric2, 4, kGroup2Keyset0)); + EXPECT_EQ(CHIP_ERROR_DUPLICATE_KEY_ID, provider->SetGroupKeyAt(kFabric2, 4, kGroup2Keyset0)); // Get Group Info - NL_TEST_ASSERT(apSuite, CHIP_ERROR_INVALID_FABRIC_INDEX == provider->GetGroupKeyAt(kUndefinedFabricIndex, 0, pair)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetGroupKeyAt(kFabric2, 999, pair)); - - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric1, 3, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup1Keyset3); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric1, 2, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup1Keyset2); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric1, 1, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup1Keyset1); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric1, 0, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup1Keyset0); - - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric2, 3, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup2Keyset3); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric2, 2, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup2Keyset2); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric2, 1, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup2Keyset1); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric2, 0, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup2Keyset0); + EXPECT_EQ(CHIP_ERROR_INVALID_FABRIC_INDEX, provider->GetGroupKeyAt(kUndefinedFabricIndex, 0, pair)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetGroupKeyAt(kFabric2, 999, pair)); + + EXPECT_EQ(provider->GetGroupKeyAt(kFabric1, 3, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup1Keyset3); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric1, 2, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup1Keyset2); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric1, 1, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup1Keyset1); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric1, 0, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup1Keyset0); + + EXPECT_EQ(provider->GetGroupKeyAt(kFabric2, 3, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup2Keyset3); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric2, 2, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup2Keyset2); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric2, 1, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup2Keyset1); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric2, 0, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup2Keyset0); // Remove Groups (remaining entries shift up) - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveGroupKeyAt(kFabric1, 2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveGroupKeyAt(kFabric2, 0)); - - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetGroupKeyAt(kFabric1, 3, pair)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric1, 2, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup1Keyset3); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric1, 1, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup1Keyset1); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric1, 0, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup1Keyset0); - - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetGroupKeyAt(kFabric2, 3, pair)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric2, 2, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup2Keyset3); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric2, 1, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup2Keyset2); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric2, 0, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup2Keyset1); + EXPECT_EQ(provider->RemoveGroupKeyAt(kFabric1, 2), CHIP_NO_ERROR); + EXPECT_EQ(provider->RemoveGroupKeyAt(kFabric2, 0), CHIP_NO_ERROR); + + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetGroupKeyAt(kFabric1, 3, pair)); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric1, 2, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup1Keyset3); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric1, 1, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup1Keyset1); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric1, 0, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup1Keyset0); + + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetGroupKeyAt(kFabric2, 3, pair)); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric2, 2, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup2Keyset3); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric2, 1, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup2Keyset2); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric2, 0, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup2Keyset1); // Overwrite, (group_id, keyset_id) must be unique - NL_TEST_ASSERT(apSuite, CHIP_ERROR_DUPLICATE_KEY_ID == provider->SetGroupKeyAt(kFabric1, 2, kGroup1Keyset0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric1, 2, kGroup3Keyset0)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_DUPLICATE_KEY_ID == provider->SetGroupKeyAt(kFabric2, 0, kGroup2Keyset2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric2, 0, kGroup3Keyset1)); + EXPECT_EQ(CHIP_ERROR_DUPLICATE_KEY_ID, provider->SetGroupKeyAt(kFabric1, 2, kGroup1Keyset0)); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric1, 2, kGroup3Keyset0), CHIP_NO_ERROR); + EXPECT_EQ(CHIP_ERROR_DUPLICATE_KEY_ID, provider->SetGroupKeyAt(kFabric2, 0, kGroup2Keyset2)); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric2, 0, kGroup3Keyset1), CHIP_NO_ERROR); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric1, 2, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup3Keyset0); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric1, 2, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup3Keyset0); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric2, 0, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup3Keyset1); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric2, 0, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup3Keyset1); // Remove all - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveGroupKeys(kFabric1)); + EXPECT_EQ(provider->RemoveGroupKeys(kFabric1), CHIP_NO_ERROR); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetGroupKeyAt(kFabric1, 3, pair)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetGroupKeyAt(kFabric1, 2, pair)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetGroupKeyAt(kFabric1, 1, pair)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetGroupKeyAt(kFabric1, 0, pair)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetGroupKeyAt(kFabric1, 3, pair)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetGroupKeyAt(kFabric1, 2, pair)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetGroupKeyAt(kFabric1, 1, pair)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetGroupKeyAt(kFabric1, 0, pair)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetGroupKeyAt(kFabric2, 3, pair)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric2, 2, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup2Keyset3); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric2, 1, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup2Keyset2); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupKeyAt(kFabric2, 0, pair)); - NL_TEST_ASSERT(apSuite, pair == kGroup3Keyset1); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetGroupKeyAt(kFabric2, 3, pair)); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric2, 2, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup2Keyset3); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric2, 1, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup2Keyset2); + EXPECT_EQ(provider->GetGroupKeyAt(kFabric2, 0, pair), CHIP_NO_ERROR); + EXPECT_EQ(pair, kGroup3Keyset1); } -void TestGroupKeyIterator(nlTestSuite * apSuite, void * apContext) +TEST_F(TestGroupDataProvider, TestGroupKeyIterator) { GroupDataProvider * provider = GetGroupDataProvider(); - NL_TEST_ASSERT(apSuite, provider); + EXPECT_TRUE(provider); // Reset test ResetProvider(provider); @@ -679,17 +724,17 @@ void TestGroupKeyIterator(nlTestSuite * apSuite, void * apContext) // Set Group Info - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric1, 0, kGroup3Keyset0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric1, 1, kGroup3Keyset1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric1, 2, kGroup3Keyset2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric1, 3, kGroup3Keyset3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric1, 4, kGroup1Keyset0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR != provider->SetGroupKeyAt(kFabric1, 5, kGroup1Keyset1)); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric1, 0, kGroup3Keyset0), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric1, 1, kGroup3Keyset1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric1, 2, kGroup3Keyset2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric1, 3, kGroup3Keyset3), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric1, 4, kGroup1Keyset0), CHIP_NO_ERROR); + EXPECT_NE(CHIP_NO_ERROR, provider->SetGroupKeyAt(kFabric1, 5, kGroup1Keyset1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric2, 0, kGroup2Keyset0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric2, 1, kGroup2Keyset1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric2, 2, kGroup2Keyset2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric2, 3, kGroup2Keyset3)); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric2, 0, kGroup2Keyset0), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric2, 1, kGroup2Keyset1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric2, 2, kGroup2Keyset2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric2, 3, kGroup2Keyset3), CHIP_NO_ERROR); // Iterate fabric 1 @@ -698,17 +743,14 @@ void TestGroupKeyIterator(nlTestSuite * apSuite, void * apContext) auto it = provider->IterateGroupKeys(kFabric1); size_t count = 0; - NL_TEST_ASSERT(apSuite, it); - if (it) + ASSERT_TRUE(it); + EXPECT_EQ(expected_f1_count, it->Count()); + while (it->Next(pair) && count < expected_f1_count) { - NL_TEST_ASSERT(apSuite, expected_f1_count == it->Count()); - while (it->Next(pair) && count < expected_f1_count) - { - NL_TEST_ASSERT(apSuite, expected_f1[count++] == pair); - } - NL_TEST_ASSERT(apSuite, count == it->Count()); - it->Release(); + EXPECT_EQ(expected_f1[count++], pair); } + EXPECT_EQ(count, it->Count()); + it->Release(); // Iterate fabric 2 @@ -716,24 +758,21 @@ void TestGroupKeyIterator(nlTestSuite * apSuite, void * apContext) size_t expected_f2_count = sizeof(expected_f2) / sizeof(GroupKey); it = provider->IterateGroupKeys(kFabric2); - NL_TEST_ASSERT(apSuite, it); - if (it) + ASSERT_TRUE(it); + count = 0; + EXPECT_EQ(expected_f2_count, it->Count()); + while (it->Next(pair) && count < expected_f2_count) { - count = 0; - NL_TEST_ASSERT(apSuite, expected_f2_count == it->Count()); - while (it->Next(pair) && count < expected_f2_count) - { - NL_TEST_ASSERT(apSuite, expected_f2[count++] == pair); - } - NL_TEST_ASSERT(apSuite, count == it->Count()); - it->Release(); + EXPECT_EQ(expected_f2[count++], pair); } + EXPECT_EQ(count, it->Count()); + it->Release(); } -void TestKeySets(nlTestSuite * apSuite, void * apContext) +TEST_F(TestGroupDataProvider, TestKeySets) { GroupDataProvider * provider = GetGroupDataProvider(); - NL_TEST_ASSERT(apSuite, provider); + EXPECT_TRUE(provider); // Reset test ResetProvider(provider); @@ -742,104 +781,104 @@ void TestKeySets(nlTestSuite * apSuite, void * apContext) // Add KeySets - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR != provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet4)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet1)); + EXPECT_EQ(provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet0), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet3), CHIP_NO_ERROR); + EXPECT_NE(CHIP_NO_ERROR, provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet4)); + EXPECT_EQ(provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet3), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet0), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet1), CHIP_NO_ERROR); // Get KeySets - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric1, kKeysetId3, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet3)); + EXPECT_EQ(provider->GetKeySet(kFabric1, kKeysetId3, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric1, kKeysetId1, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet1)); + EXPECT_EQ(provider->GetKeySet(kFabric1, kKeysetId1, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric1, kKeysetId0, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet0)); + EXPECT_EQ(provider->GetKeySet(kFabric1, kKeysetId0, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric1, kKeysetId2, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet2)); + EXPECT_EQ(provider->GetKeySet(kFabric1, kKeysetId2, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric2, kKeysetId3, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet3)); + EXPECT_EQ(provider->GetKeySet(kFabric2, kKeysetId3, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric2, kKeysetId2, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet2)); + EXPECT_EQ(provider->GetKeySet(kFabric2, kKeysetId2, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric2, kKeysetId1, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet1)); + EXPECT_EQ(provider->GetKeySet(kFabric2, kKeysetId1, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric2, kKeysetId0, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet0)); + EXPECT_EQ(provider->GetKeySet(kFabric2, kKeysetId0, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet0)); // Remove Keysets - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->RemoveKeySet(kFabric1, 0xffff)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->RemoveKeySet(kFabric1, 0xffff)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveKeySet(kFabric1, kKeysetId1)); // First - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveKeySet(kFabric1, kKeysetId3)); // Last - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveKeySet(kFabric2, kKeysetId2)); // Middle + EXPECT_EQ(provider->RemoveKeySet(kFabric1, kKeysetId1), CHIP_NO_ERROR); // First + EXPECT_EQ(provider->RemoveKeySet(kFabric1, kKeysetId3), CHIP_NO_ERROR); // Last + EXPECT_EQ(provider->RemoveKeySet(kFabric2, kKeysetId2), CHIP_NO_ERROR); // Middle - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetKeySet(kFabric1, kKeysetId3, keyset)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetKeySet(kFabric1, kKeysetId1, keyset)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric1, kKeysetId0, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet0)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetKeySet(kFabric1, kKeysetId3, keyset)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetKeySet(kFabric1, kKeysetId1, keyset)); + EXPECT_EQ(provider->GetKeySet(kFabric1, kKeysetId0, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric1, kKeysetId2, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet2)); + EXPECT_EQ(provider->GetKeySet(kFabric1, kKeysetId2, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric2, kKeysetId3, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet3)); + EXPECT_EQ(provider->GetKeySet(kFabric2, kKeysetId3, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet3)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetKeySet(kFabric2, kKeysetId2, keyset)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric2, kKeysetId1, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet1)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetKeySet(kFabric2, kKeysetId2, keyset)); + EXPECT_EQ(provider->GetKeySet(kFabric2, kKeysetId1, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric2, kKeysetId0, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet0)); + EXPECT_EQ(provider->GetKeySet(kFabric2, kKeysetId0, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet0)); // Remove all - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->RemoveKeySet(kFabric1, kKeysetId3)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->RemoveKeySet(kFabric1, kKeysetId1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveKeySet(kFabric1, kKeysetId0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveKeySet(kFabric1, kKeysetId2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveKeySet(kFabric2, kKeysetId3)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->RemoveKeySet(kFabric2, kKeysetId2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveKeySet(kFabric2, kKeysetId1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveKeySet(kFabric2, kKeysetId0)); - - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetKeySet(kFabric1, kKeysetId3, keyset)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetKeySet(kFabric1, kKeysetId1, keyset)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetKeySet(kFabric1, kKeysetId0, keyset)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetKeySet(kFabric1, kKeysetId2, keyset)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetKeySet(kFabric2, kKeysetId3, keyset)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetKeySet(kFabric2, kKeysetId2, keyset)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetKeySet(kFabric2, kKeysetId1, keyset)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetKeySet(kFabric2, kKeysetId0, keyset)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->RemoveKeySet(kFabric1, kKeysetId3)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->RemoveKeySet(kFabric1, kKeysetId1)); + EXPECT_EQ(provider->RemoveKeySet(kFabric1, kKeysetId0), CHIP_NO_ERROR); + EXPECT_EQ(provider->RemoveKeySet(kFabric1, kKeysetId2), CHIP_NO_ERROR); + EXPECT_EQ(provider->RemoveKeySet(kFabric2, kKeysetId3), CHIP_NO_ERROR); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->RemoveKeySet(kFabric2, kKeysetId2)); + EXPECT_EQ(provider->RemoveKeySet(kFabric2, kKeysetId1), CHIP_NO_ERROR); + EXPECT_EQ(provider->RemoveKeySet(kFabric2, kKeysetId0), CHIP_NO_ERROR); + + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetKeySet(kFabric1, kKeysetId3, keyset)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetKeySet(kFabric1, kKeysetId1, keyset)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetKeySet(kFabric1, kKeysetId0, keyset)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetKeySet(kFabric1, kKeysetId2, keyset)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetKeySet(kFabric2, kKeysetId3, keyset)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetKeySet(kFabric2, kKeysetId2, keyset)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetKeySet(kFabric2, kKeysetId1, keyset)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetKeySet(kFabric2, kKeysetId0, keyset)); } -void TestIpk(nlTestSuite * apSuite, void * apContext) +TEST_F(TestGroupDataProvider, TestIpk) { GroupDataProvider * provider = GetGroupDataProvider(); - NL_TEST_ASSERT(apSuite, provider); + EXPECT_TRUE(provider); // Reset test ResetProvider(provider); // Make sure IPK set is not found on a fresh provider KeySet ipkOperationalKeySet; - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetIpkKeySet(kFabric1, ipkOperationalKeySet)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetIpkKeySet(kFabric1, ipkOperationalKeySet)); // Add a non-IPK key, make sure the IPK set is not found - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet3)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetIpkKeySet(kFabric1, ipkOperationalKeySet)); + EXPECT_EQ(provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet3), CHIP_NO_ERROR); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetIpkKeySet(kFabric1, ipkOperationalKeySet)); const uint8_t kIpkEpochKeyFromSpec[] = { 0x23, 0x5b, 0xf7, 0xe6, 0x28, 0x23, 0xd3, 0x58, 0xdc, 0xa4, 0xba, 0x50, 0xb1, 0x53, 0x5f, 0x4b }; @@ -849,55 +888,51 @@ void TestIpk(nlTestSuite * apSuite, void * apContext) memcpy(&fabric1KeySet0.epoch_keys[0].key, &kIpkEpochKeyFromSpec[0], sizeof(kIpkEpochKeyFromSpec)); // Set a single IPK, validate key derivation follows spec - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric1, kCompressedFabricId1, fabric1KeySet0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetIpkKeySet(kFabric1, ipkOperationalKeySet)); + EXPECT_EQ(provider->SetKeySet(kFabric1, kCompressedFabricId1, fabric1KeySet0), CHIP_NO_ERROR); + EXPECT_EQ(provider->GetIpkKeySet(kFabric1, ipkOperationalKeySet), CHIP_NO_ERROR); // Make sure the derived key matches spec test vector const uint8_t kExpectedIpkFromSpec[] = { 0xa6, 0xf5, 0x30, 0x6b, 0xaf, 0x6d, 0x05, 0x0a, 0xf2, 0x3b, 0xa4, 0xbd, 0x6b, 0x9d, 0xd9, 0x60 }; - NL_TEST_ASSERT(apSuite, 0 == ipkOperationalKeySet.keyset_id); - NL_TEST_ASSERT(apSuite, 1 == ipkOperationalKeySet.num_keys_used); - NL_TEST_ASSERT(apSuite, SecurityPolicy::kTrustFirst == ipkOperationalKeySet.policy); - NL_TEST_ASSERT(apSuite, 1234 == ipkOperationalKeySet.epoch_keys[0].start_time); - NL_TEST_ASSERT(apSuite, - 0 == memcmp(ipkOperationalKeySet.epoch_keys[0].key, kExpectedIpkFromSpec, sizeof(kExpectedIpkFromSpec))); + EXPECT_EQ(ipkOperationalKeySet.keyset_id, 0u); + EXPECT_EQ(ipkOperationalKeySet.num_keys_used, 1u); + EXPECT_EQ(SecurityPolicy::kTrustFirst, ipkOperationalKeySet.policy); + EXPECT_EQ(ipkOperationalKeySet.epoch_keys[0].start_time, 1234u); + EXPECT_EQ(memcmp(ipkOperationalKeySet.epoch_keys[0].key, kExpectedIpkFromSpec, sizeof(kExpectedIpkFromSpec)), 0); // Remove IPK, verify removal - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveKeySet(kFabric1, kKeysetId0)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetIpkKeySet(kFabric1, ipkOperationalKeySet)); + EXPECT_EQ(provider->RemoveKeySet(kFabric1, kKeysetId0), CHIP_NO_ERROR); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetIpkKeySet(kFabric1, ipkOperationalKeySet)); // Set a single IPK with the SetSingleIpkEpochKey helper, validate key derivation follows spec - NL_TEST_ASSERT( - apSuite, - CHIP_NO_ERROR == - chip::Credentials::SetSingleIpkEpochKey(provider, kFabric1, ByteSpan(kIpkEpochKeyFromSpec), kCompressedFabricId1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetIpkKeySet(kFabric1, ipkOperationalKeySet)); - - NL_TEST_ASSERT(apSuite, 0 == ipkOperationalKeySet.keyset_id); - NL_TEST_ASSERT(apSuite, 1 == ipkOperationalKeySet.num_keys_used); - NL_TEST_ASSERT(apSuite, SecurityPolicy::kTrustFirst == ipkOperationalKeySet.policy); - NL_TEST_ASSERT(apSuite, 0 == ipkOperationalKeySet.epoch_keys[0].start_time); // default time is zero for SetSingleIpkEpochKey - NL_TEST_ASSERT(apSuite, - 0 == memcmp(ipkOperationalKeySet.epoch_keys[0].key, kExpectedIpkFromSpec, sizeof(kExpectedIpkFromSpec))); + EXPECT_EQ(chip::Credentials::SetSingleIpkEpochKey(provider, kFabric1, ByteSpan(kIpkEpochKeyFromSpec), kCompressedFabricId1), + CHIP_NO_ERROR); + EXPECT_EQ(provider->GetIpkKeySet(kFabric1, ipkOperationalKeySet), CHIP_NO_ERROR); + + EXPECT_EQ(ipkOperationalKeySet.keyset_id, 0u); + EXPECT_EQ(ipkOperationalKeySet.num_keys_used, 1u); + EXPECT_EQ(SecurityPolicy::kTrustFirst, ipkOperationalKeySet.policy); + EXPECT_EQ(ipkOperationalKeySet.epoch_keys[0].start_time, 0u); // default time is zero for SetSingleIpkEpochKey + EXPECT_EQ(memcmp(ipkOperationalKeySet.epoch_keys[0].key, kExpectedIpkFromSpec, sizeof(kExpectedIpkFromSpec)), 0); } -void TestKeySetIterator(nlTestSuite * apSuite, void * apContext) +TEST_F(TestGroupDataProvider, TestKeySetIterator) { GroupDataProvider * provider = GetGroupDataProvider(); - NL_TEST_ASSERT(apSuite, provider); + EXPECT_TRUE(provider); // Reset test ResetProvider(provider); // Add data to iterate - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet1)); + EXPECT_EQ(provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet0), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet3), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet3), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet1), CHIP_NO_ERROR); // Iterate Fabric 1 @@ -908,48 +943,42 @@ void TestKeySetIterator(nlTestSuite * apSuite, void * apContext) }; auto it = provider->IterateKeySets(kFabric1); - NL_TEST_ASSERT(apSuite, it); - if (it) - { - size_t count = 0; - NL_TEST_ASSERT(apSuite, expected_f1.size() == it->Count()); + ASSERT_TRUE(it); + size_t count = 0; + EXPECT_EQ(expected_f1.size(), it->Count()); - while (it->Next(keyset) && count < expected_f1.size()) - { - NL_TEST_ASSERT(apSuite, expected_f1.count(keyset.keyset_id) > 0); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, expected_f1[keyset.keyset_id])); - count++; - } - NL_TEST_ASSERT(apSuite, count == expected_f1.size()); - it->Release(); + while (it->Next(keyset) && count < expected_f1.size()) + { + EXPECT_GT(expected_f1.count(keyset.keyset_id), 0u); + EXPECT_TRUE(CompareKeySets(keyset, expected_f1[keyset.keyset_id])); + count++; } + EXPECT_EQ(count, expected_f1.size()); + it->Release(); // Iterate Fabric 2 std::map<uint16_t, const KeySet> expected_f2{ { kKeysetId1, kKeySet1 }, { kKeysetId2, kKeySet2 }, { kKeysetId3, kKeySet3 } }; it = provider->IterateKeySets(kFabric2); - NL_TEST_ASSERT(apSuite, it); - if (it) - { - size_t count = 0; - NL_TEST_ASSERT(apSuite, expected_f2.size() == it->Count()); + ASSERT_TRUE(it); + count = 0; + EXPECT_EQ(expected_f2.size(), it->Count()); - while (it->Next(keyset) && count < expected_f2.size()) - { - NL_TEST_ASSERT(apSuite, expected_f2.count(keyset.keyset_id) > 0); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, expected_f2[keyset.keyset_id])); - count++; - } - NL_TEST_ASSERT(apSuite, count == expected_f2.size()); - it->Release(); + while (it->Next(keyset) && count < expected_f2.size()) + { + EXPECT_GT(expected_f2.count(keyset.keyset_id), 0u); + EXPECT_TRUE(CompareKeySets(keyset, expected_f2[keyset.keyset_id])); + count++; } + EXPECT_EQ(count, expected_f2.size()); + it->Release(); } -void TestPerFabricData(nlTestSuite * apSuite, void * apContext) +TEST_F(TestGroupDataProvider, TestPerFabricData) { GroupDataProvider * provider = GetGroupDataProvider(); - NL_TEST_ASSERT(apSuite, provider); + EXPECT_TRUE(provider); // Reset test ResetProvider(provider); @@ -957,163 +986,163 @@ void TestPerFabricData(nlTestSuite * apSuite, void * apContext) // Group Info GroupInfo group; - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 0, kGroupInfo1_3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 1, kGroupInfo1_2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 2, kGroupInfo1_1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric2, 0, kGroupInfo2_1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric2, 1, kGroupInfo2_3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric2, 2, kGroupInfo2_2)); - - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric1, 0, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo1_3); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric1, 1, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo1_2); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric1, 2, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo1_1); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric2, 0, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo2_1); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric2, 1, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo2_3); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric2, 2, group)); - NL_TEST_ASSERT(apSuite, group == kGroupInfo2_2); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 0, kGroupInfo1_3), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 1, kGroupInfo1_2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 2, kGroupInfo1_1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric2, 0, kGroupInfo2_1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric2, 1, kGroupInfo2_3), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric2, 2, kGroupInfo2_2), CHIP_NO_ERROR); + + EXPECT_EQ(provider->GetGroupInfoAt(kFabric1, 0, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo1_3); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric1, 1, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo1_2); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric1, 2, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo1_1); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric2, 0, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo2_1); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric2, 1, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo2_3); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric2, 2, group), CHIP_NO_ERROR); + EXPECT_EQ(group, kGroupInfo2_2); // Endpoints - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup1, kEndpointId0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup1, kEndpointId1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup1, kEndpointId2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup2, kEndpointId1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup2, kEndpointId2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup2, kEndpointId3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId4)); - - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup1, kEndpointId0)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup1, kEndpointId1)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup1, kEndpointId2)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup2, kEndpointId1)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup2, kEndpointId2)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric1, kGroup2, kEndpointId3)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup3, kEndpointId0)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup3, kEndpointId1)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup3, kEndpointId2)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup3, kEndpointId3)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup3, kEndpointId4)); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup1, kEndpointId0), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup1, kEndpointId1), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup1, kEndpointId2), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup2, kEndpointId1), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup2, kEndpointId2), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup2, kEndpointId3), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId0), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId1), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId2), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId3), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId4), CHIP_NO_ERROR); + + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId0)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId1)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId2)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId1)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId2)); + EXPECT_TRUE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId3)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup3, kEndpointId0)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup3, kEndpointId1)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup3, kEndpointId2)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup3, kEndpointId3)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup3, kEndpointId4)); // Keys KeySet keyset; - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet0)); + EXPECT_EQ(provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet0), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet0), CHIP_NO_ERROR); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric2, kKeysetId0, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet0)); + EXPECT_EQ(provider->GetKeySet(kFabric2, kKeysetId0, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric2, kKeysetId1, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet1)); + EXPECT_EQ(provider->GetKeySet(kFabric2, kKeysetId1, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric2, kKeysetId2, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet2)); + EXPECT_EQ(provider->GetKeySet(kFabric2, kKeysetId2, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric1, kKeysetId2, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet2)); + EXPECT_EQ(provider->GetKeySet(kFabric1, kKeysetId2, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric1, kKeysetId1, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet1)); + EXPECT_EQ(provider->GetKeySet(kFabric1, kKeysetId1, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric1, kKeysetId0, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet0)); + EXPECT_EQ(provider->GetKeySet(kFabric1, kKeysetId0, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet0)); // // Remove Fabric // - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->RemoveFabric(kFabric1)); + EXPECT_EQ(provider->RemoveFabric(kFabric1), CHIP_NO_ERROR); // Endpoints - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup1, kEndpointId0)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup1, kEndpointId1)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup1, kEndpointId2)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup2, kEndpointId1)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup2, kEndpointId2)); - NL_TEST_ASSERT(apSuite, !provider->HasEndpoint(kFabric1, kGroup2, kEndpointId3)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup3, kEndpointId0)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup3, kEndpointId1)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup3, kEndpointId2)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup3, kEndpointId3)); - NL_TEST_ASSERT(apSuite, provider->HasEndpoint(kFabric2, kGroup3, kEndpointId4)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId0)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId1)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup1, kEndpointId2)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId1)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId2)); + EXPECT_FALSE(provider->HasEndpoint(kFabric1, kGroup2, kEndpointId3)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup3, kEndpointId0)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup3, kEndpointId1)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup3, kEndpointId2)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup3, kEndpointId3)); + EXPECT_TRUE(provider->HasEndpoint(kFabric2, kGroup3, kEndpointId4)); // Group Info - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetGroupInfoAt(kFabric1, 0, group)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetGroupInfoAt(kFabric1, 1, group)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetGroupInfoAt(kFabric1, 2, group)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric2, 0, group)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric2, 1, group)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetGroupInfoAt(kFabric2, 2, group)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetGroupInfoAt(kFabric1, 0, group)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetGroupInfoAt(kFabric1, 1, group)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetGroupInfoAt(kFabric1, 2, group)); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric2, 0, group), CHIP_NO_ERROR); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric2, 1, group), CHIP_NO_ERROR); + EXPECT_EQ(provider->GetGroupInfoAt(kFabric2, 2, group), CHIP_NO_ERROR); // Keys - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric2, kKeysetId1, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet1)); + EXPECT_EQ(provider->GetKeySet(kFabric2, kKeysetId1, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->GetKeySet(kFabric2, kKeysetId0, keyset)); - NL_TEST_ASSERT(apSuite, CompareKeySets(keyset, kKeySet0)); + EXPECT_EQ(provider->GetKeySet(kFabric2, kKeysetId0, keyset), CHIP_NO_ERROR); + EXPECT_TRUE(CompareKeySets(keyset, kKeySet0)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetKeySet(kFabric1, 202, keyset)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetKeySet(kFabric1, 404, keyset)); - NL_TEST_ASSERT(apSuite, CHIP_ERROR_NOT_FOUND == provider->GetKeySet(kFabric1, 606, keyset)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetKeySet(kFabric1, 202, keyset)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetKeySet(kFabric1, 404, keyset)); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, provider->GetKeySet(kFabric1, 606, keyset)); } -void TestGroupDecryption(nlTestSuite * apSuite, void * apContext) +TEST_F(TestGroupDataProvider, TestGroupDecryption) { GroupDataProvider * provider = GetGroupDataProvider(); - NL_TEST_ASSERT(apSuite, provider); + EXPECT_TRUE(provider); // Reset test ResetProvider(provider); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 0, kGroupInfo1_3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 1, kGroupInfo1_2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric1, 2, kGroupInfo1_1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric2, 0, kGroupInfo2_1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric2, 1, kGroupInfo2_3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupInfoAt(kFabric2, 2, kGroupInfo2_2)); - - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup1, kEndpointId0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup1, kEndpointId2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup1, kEndpointId4)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup2, kEndpointId1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup2, kEndpointId2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric1, kGroup2, kEndpointId3)); - - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId3)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->AddEndpoint(kFabric2, kGroup3, kEndpointId4)); - - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet3)); - - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric1, 0, kGroup1Keyset0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric1, 1, kGroup1Keyset2)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric1, 2, kGroup3Keyset0)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric1, 3, kGroup3Keyset2)); - - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric2, 0, kGroup2Keyset1)); - NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == provider->SetGroupKeyAt(kFabric2, 1, kGroup2Keyset3)); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 0, kGroupInfo1_3), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 1, kGroupInfo1_2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric1, 2, kGroupInfo1_1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric2, 0, kGroupInfo2_1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric2, 1, kGroupInfo2_3), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupInfoAt(kFabric2, 2, kGroupInfo2_2), CHIP_NO_ERROR); + + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup1, kEndpointId0), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup1, kEndpointId2), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup1, kEndpointId4), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup2, kEndpointId1), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup2, kEndpointId2), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric1, kGroup2, kEndpointId3), CHIP_NO_ERROR); + + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId0), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId1), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId2), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId3), CHIP_NO_ERROR); + EXPECT_EQ(provider->AddEndpoint(kFabric2, kGroup3, kEndpointId4), CHIP_NO_ERROR); + + EXPECT_EQ(provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet0), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric1, kCompressedFabricId1, kKeySet2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetKeySet(kFabric2, kCompressedFabricId2, kKeySet3), CHIP_NO_ERROR); + + EXPECT_EQ(provider->SetGroupKeyAt(kFabric1, 0, kGroup1Keyset0), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric1, 1, kGroup1Keyset2), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric1, 2, kGroup3Keyset0), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric1, 3, kGroup3Keyset2), CHIP_NO_ERROR); + + EXPECT_EQ(provider->SetGroupKeyAt(kFabric2, 0, kGroup2Keyset1), CHIP_NO_ERROR); + EXPECT_EQ(provider->SetGroupKeyAt(kFabric2, 1, kGroup2Keyset3), CHIP_NO_ERROR); const size_t kMessageLength = 10; const uint8_t kMessage[kMessageLength] = { 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9 }; @@ -1140,17 +1169,15 @@ void TestGroupDecryption(nlTestSuite * apSuite, void * apContext) // Get the key context Crypto::SymmetricKeyContext * key_context = provider->GetKeyContext(kFabric2, kGroup2); - NL_TEST_ASSERT(apSuite, nullptr != key_context); + ASSERT_NE(nullptr, key_context); uint16_t session_id = key_context->GetKeyHash(); // Encrypt the message - NL_TEST_ASSERT( - apSuite, - CHIP_NO_ERROR == - key_context->MessageEncrypt(plaintext, ByteSpan(aad, sizeof(aad)), ByteSpan(nonce, sizeof(nonce)), tag, ciphertext)); + EXPECT_EQ(key_context->MessageEncrypt(plaintext, ByteSpan(aad, sizeof(aad)), ByteSpan(nonce, sizeof(nonce)), tag, ciphertext), + CHIP_NO_ERROR); // The ciphertext must be different to the original message - NL_TEST_ASSERT(apSuite, memcmp(ciphertext.data(), kMessage, sizeof(kMessage))); + EXPECT_TRUE(memcmp(ciphertext.data(), kMessage, sizeof(kMessage))); key_context->Release(); // @@ -1164,126 +1191,36 @@ void TestGroupDecryption(nlTestSuite * apSuite, void * apContext) auto it = provider->IterateGroupSessions(session_id); size_t count = 0, total = 0; - NL_TEST_ASSERT(apSuite, it); - if (it) + ASSERT_TRUE(it); + total = it->Count(); + EXPECT_EQ(expected.size(), total); + while (it->Next(session)) { - total = it->Count(); - NL_TEST_ASSERT(apSuite, expected.size() == total); - while (it->Next(session)) + std::pair<FabricIndex, GroupId> found(session.fabric_index, session.group_id); + EXPECT_GT(expected.count(found), 0u); + ASSERT_NE(session.keyContext, nullptr); + // Assert aboves doesn't actually exit, we call continue so that we can call it->Release() outside of + // loop. + if (session.keyContext == nullptr) { - std::pair<FabricIndex, GroupId> found(session.fabric_index, session.group_id); - NL_TEST_ASSERT(apSuite, expected.count(found) > 0); - NL_TEST_ASSERT(apSuite, session.keyContext != nullptr); - // Assert aboves doesn't actually exit, we call continue so that we can call it->Release() outside of - // loop. - if (session.keyContext == nullptr) - { - continue; - } - - // Decrypt the ciphertext - NL_TEST_ASSERT(apSuite, - CHIP_NO_ERROR == - session.keyContext->MessageDecrypt(ciphertext, ByteSpan(aad, sizeof(aad)), - ByteSpan(nonce, sizeof(nonce)), tag, plaintext)); - - // The new plaintext must match the original message - NL_TEST_ASSERT(apSuite, 0 == memcmp(plaintext.data(), kMessage, sizeof(kMessage))); - count++; + continue; } - NL_TEST_ASSERT(apSuite, count == total); - it->Release(); + + // Decrypt the ciphertext + EXPECT_EQ(session.keyContext->MessageDecrypt(ciphertext, ByteSpan(aad, sizeof(aad)), ByteSpan(nonce, sizeof(nonce)), tag, + plaintext), + CHIP_NO_ERROR); + + // The new plaintext must match the original message + EXPECT_EQ(memcmp(plaintext.data(), kMessage, sizeof(kMessage)), 0); + count++; } + EXPECT_EQ(count, total); + it->Release(); } } // namespace TestGroups } // namespace app } // namespace chip -namespace { - -static chip::TestPersistentStorageDelegate sDelegate; -static chip::Crypto::DefaultSessionKeystore sSessionKeystore; -static GroupDataProviderImpl sProvider(chip::app::TestGroups::kMaxGroupsPerFabric, chip::app::TestGroups::kMaxGroupKeysPerFabric); - -static EpochKey kEpochKeys0[] = { - { 0x0000000000000000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, - { 0x1111111111111111, { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f } }, - { 0x2222222222222222, { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f } } -}; -static EpochKey kEpochKeys1[] = { - { 0x3333333333333333, { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f } }, - { 0x4444444444444444, { 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f } }, - { 0x5555555555555555, { 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f } }, -}; -static EpochKey kEpochKeys2[] = { - { 0xaaaaaaaaaaaaaaaa, { 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf } }, - { 0xbbbbbbbbbbbbbbbb, { 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf } }, - { 0xcccccccccccccccc, { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf } }, -}; -static EpochKey kEpochKeys3[] = { - { 0xdddddddddddddddd, { 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf } }, - { 0xeeeeeeeeeeeeeeee, { 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef } }, - { 0xffffffffffffffff, { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff } }, -}; - -/** - * Set up the test suite. - */ -int Test_Setup(void * inContext) -{ - VerifyOrReturnError(CHIP_NO_ERROR == chip::Platform::MemoryInit(), FAILURE); - - // Initialize Group Data Provider - sProvider.SetStorageDelegate(&sDelegate); - sProvider.SetSessionKeystore(&sSessionKeystore); - sProvider.SetListener(&chip::app::TestGroups::sListener); - VerifyOrReturnError(CHIP_NO_ERROR == sProvider.Init(), FAILURE); - SetGroupDataProvider(&sProvider); - - memcpy(chip::app::TestGroups::kKeySet0.epoch_keys, kEpochKeys0, sizeof(kEpochKeys0)); - memcpy(chip::app::TestGroups::kKeySet1.epoch_keys, kEpochKeys1, sizeof(kEpochKeys1)); - memcpy(chip::app::TestGroups::kKeySet2.epoch_keys, kEpochKeys2, sizeof(kEpochKeys2)); - memcpy(chip::app::TestGroups::kKeySet3.epoch_keys, kEpochKeys3, sizeof(kEpochKeys3)); - - return SUCCESS; -} - -/** - * Tear down the test suite. - */ -int Test_Teardown(void * inContext) -{ - GroupDataProvider * provider = GetGroupDataProvider(); - if (nullptr != provider) - { - provider->Finish(); - } - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - -const nlTest sTests[] = { NL_TEST_DEF("TestStorageDelegate", chip::app::TestGroups::TestStorageDelegate), - NL_TEST_DEF("TestGroupInfo", chip::app::TestGroups::TestGroupInfo), - NL_TEST_DEF("TestGroupInfoIterator", chip::app::TestGroups::TestGroupInfoIterator), - NL_TEST_DEF("TestEndpoints", chip::app::TestGroups::TestEndpoints), - NL_TEST_DEF("TestEndpointIterator", chip::app::TestGroups::TestEndpointIterator), - NL_TEST_DEF("TestGroupKeys", chip::app::TestGroups::TestGroupKeys), - NL_TEST_DEF("TestGroupKeyIterator", chip::app::TestGroups::TestGroupKeyIterator), - NL_TEST_DEF("TestKeySets", chip::app::TestGroups::TestKeySets), - NL_TEST_DEF("TestKeySetIterator", chip::app::TestGroups::TestKeySetIterator), - NL_TEST_DEF("TestIpk", chip::app::TestGroups::TestIpk), - NL_TEST_DEF("TestPerFabricData", chip::app::TestGroups::TestPerFabricData), - NL_TEST_DEF("TestGroupDecryption", chip::app::TestGroups::TestGroupDecryption), - NL_TEST_SENTINEL() }; -} // namespace - -int TestGroups() -{ - nlTestSuite theSuite = { "GroupDataProvider", &sTests[0], &Test_Setup, &Test_Teardown }; - - nlTestRunner(&theSuite, nullptr); - return (nlTestRunnerStats(&theSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestGroups) +namespace {} // namespace diff --git a/src/credentials/tests/TestPersistentStorageOpCertStore.cpp b/src/credentials/tests/TestPersistentStorageOpCertStore.cpp index 12d4ac8b992af6..c1a57e00e95af2 100644 --- a/src/credentials/tests/TestPersistentStorageOpCertStore.cpp +++ b/src/credentials/tests/TestPersistentStorageOpCertStore.cpp @@ -19,13 +19,12 @@ #include <inttypes.h> #include <credentials/PersistentStorageOpCertStore.h> +#include <gtest/gtest.h> #include <lib/support/CHIPMem.h> #include <lib/support/CodeUtils.h> #include <lib/support/DefaultStorageKeyAllocator.h> #include <lib/support/Span.h> #include <lib/support/TestPersistentStorageDelegate.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> using namespace chip; using namespace chip::Credentials; @@ -47,19 +46,25 @@ const ByteSpan kTestIcacSpan{ kTestIcacBuf }; const uint8_t kTestNocBuf[] = { 'n', 'o', 'c' }; const ByteSpan kTestNocSpan{ kTestNocBuf }; -void TestAddNocFlow(nlTestSuite * inSuite, void * inContext) +struct TestPersistentStorageOpCertStore : public ::testing::Test +{ + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestPersistentStorageOpCertStore, TestAddNocFlow) { TestPersistentStorageDelegate storageDelegate; PersistentStorageOpCertStore opCertStore; // Failure before Init CHIP_ERROR err = opCertStore.AddNewTrustedRootCertForFabric(kFabricIndex1, kTestRcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); // Init succeeds err = opCertStore.Init(&storageDelegate); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Manually add existing root for the FabricIndex, should fail AddNewTrustedRootCertForFabric for // same fabric but succeed GetCertificate. @@ -67,53 +72,52 @@ void TestAddNocFlow(nlTestSuite * inSuite, void * inContext) err = storageDelegate.SyncSetKeyValue(DefaultStorageKeyAllocator::FabricRCAC(kFabricIndex1).KeyName(), kTestRcacBufExists, sizeof(kTestRcacBufExists)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 1); - NL_TEST_ASSERT(inSuite, - opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kRcac) == true); //< From manual add + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 1u); + EXPECT_TRUE(opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kRcac)); //< From manual add err = opCertStore.AddNewTrustedRootCertForFabric(kFabricIndex1, kTestRcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); uint8_t largeBuf[400]; MutableByteSpan largeSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(err, CHIP_ERROR_NOT_FOUND); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestRcacBufExists })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestRcacBufExists })); // Adding root for another FabricIndex should work err = opCertStore.AddNewTrustedRootCertForFabric(kUndefinedFabricIndex, kTestRcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); err = opCertStore.AddNewTrustedRootCertForFabric(kFabricIndex2, kTestRcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 1); //< Storage count did not yet increase - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 1u); //< Storage count did not yet increase + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_TRUE(opCertStore.HasPendingRootCert()); // Should be able to read pending RCAC right away largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex2, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); // Trying to commit with pending RCAC but no NOC should fail but leave everything as-is err = opCertStore.CommitOpCertsForFabric(kFabricIndex2); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_TRUE(opCertStore.HasPendingRootCert()); // Trying to do AddNewOpCertsForFabric for fabric different that with pending RCAC should fail err = opCertStore.AddNewOpCertsForFabric(kOtherFabricIndex, kTestNocSpan, kTestIcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_TRUE(opCertStore.HasPendingRootCert()); // Clear other bad cases from storage for now storageDelegate.ClearStorage(); @@ -125,128 +129,127 @@ void TestAddNocFlow(nlTestSuite * inSuite, void * inContext) err = storageDelegate.SyncSetKeyValue(DefaultStorageKeyAllocator::FabricICAC(kFabricIndex2).KeyName(), kTestIcacBufExists, sizeof(kTestIcacBufExists)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 1); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 1u); err = storageDelegate.SyncSetKeyValue(DefaultStorageKeyAllocator::FabricNOC(kFabricIndex2).KeyName(), kTestNocBufExists, sizeof(kTestNocBufExists)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 2); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 2u); - NL_TEST_ASSERT(inSuite, - opCertStore.HasCertificateForFabric(kFabricIndex2, CertChainElement::kIcac) == true); //< From manual add - NL_TEST_ASSERT(inSuite, opCertStore.HasCertificateForFabric(kFabricIndex2, CertChainElement::kNoc) == true); //< From manual add + EXPECT_TRUE(opCertStore.HasCertificateForFabric(kFabricIndex2, CertChainElement::kIcac)); //< From manual add + EXPECT_TRUE(opCertStore.HasCertificateForFabric(kFabricIndex2, CertChainElement::kNoc)); //< From manual add err = opCertStore.AddNewOpCertsForFabric(kFabricIndex2, kTestNocSpan, kTestIcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_TRUE(opCertStore.HasPendingRootCert()); storageDelegate.SyncDeleteKeyValue(DefaultStorageKeyAllocator::FabricICAC(kFabricIndex2).KeyName()); storageDelegate.SyncDeleteKeyValue(DefaultStorageKeyAllocator::FabricNOC(kFabricIndex2).KeyName()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); // Trying to do AddNewOpCertsForFabric for same fabric as that with pending RCAC should succeed err = opCertStore.AddNewOpCertsForFabric(kFabricIndex2, kTestNocSpan, kTestIcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(opCertStore.HasPendingNocChain()); + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase // Should be able to get the pending cert even if not in persisted storage largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex2, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestIcacSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestIcacSpan })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex2, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestNocSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestNocSpan })); // Trying to do AddNewOpCertsForFabric a second time after success before commit should fail, // but leave state as-is err = opCertStore.AddNewOpCertsForFabric(kFabricIndex2, kTestNocSpan, kTestIcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); + EXPECT_TRUE(opCertStore.HasPendingNocChain()); + EXPECT_TRUE(opCertStore.HasPendingRootCert()); // Should be able to get the pending cert even if not in persisted storage, after an API error largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex2, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestIcacSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestIcacSpan })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex2, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestNocSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestNocSpan })); // Trying to commit with wrong FabricIndex should fail err = opCertStore.CommitOpCertsForFabric(kOtherFabricIndex); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_TRUE(opCertStore.HasPendingNocChain()); + EXPECT_TRUE(opCertStore.HasPendingRootCert()); // Commiting new certs should succeed on correct fabric err = opCertStore.CommitOpCertsForFabric(kFabricIndex2); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_FALSE(opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 3); //< All certs now committed + EXPECT_EQ(storageDelegate.GetNumKeys(), 3u); //< All certs now committed // Should be able to get the committed certs largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex2, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex2, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestIcacSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestIcacSpan })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex2, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestNocSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestNocSpan })); opCertStore.Finish(); } -void TestUpdateNocFlow(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPersistentStorageOpCertStore, TestUpdateNocFlow) { TestPersistentStorageDelegate storageDelegate; PersistentStorageOpCertStore opCertStore; // Failure before Init CHIP_ERROR err = opCertStore.UpdateOpCertsForFabric(kFabricIndex1, kTestNocSpan, kTestIcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); // Init succeeds err = opCertStore.Init(&storageDelegate); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Add a new pending trusted root to test for UpdateOpCertsForFabric failure on new root present err = opCertStore.AddNewTrustedRootCertForFabric(kFabricIndex1, kTestRcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); // Trying to do an UpdateOpCertsForFabric with new root pending should fail err = opCertStore.UpdateOpCertsForFabric(kFabricIndex1, kTestNocSpan, kTestIcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); // Revert state for next tests opCertStore.RevertPendingOpCerts(); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase // Manually add root, ICAC and NOC to validate update since existing chain required const uint8_t kTestRcacBufExists[] = { 'r', 'c', 'a', 'c', ' ', 'e', 'x', 'i', 's', 't', 's' }; @@ -259,385 +262,382 @@ void TestUpdateNocFlow(nlTestSuite * inSuite, void * inContext) { err = storageDelegate.SyncSetKeyValue(DefaultStorageKeyAllocator::FabricRCAC(kFabricIndex1).KeyName(), kTestRcacBufExists, sizeof(kTestRcacBufExists)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 1); - NL_TEST_ASSERT(inSuite, - opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kRcac) == true); //< From manual add + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 1u); + EXPECT_TRUE(opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kRcac)); //< From manual add err = storageDelegate.SyncSetKeyValue(DefaultStorageKeyAllocator::FabricICAC(kFabricIndex1).KeyName(), kTestIcacBufExists, sizeof(kTestIcacBufExists)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 2); - NL_TEST_ASSERT(inSuite, - opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kIcac) == true); //< From manual add + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 2u); + EXPECT_TRUE(opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kIcac)); //< From manual add err = storageDelegate.SyncSetKeyValue(DefaultStorageKeyAllocator::FabricNOC(kFabricIndex1).KeyName(), kTestNocBufExists, sizeof(kTestNocBufExists)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 3); - NL_TEST_ASSERT(inSuite, - opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kNoc) == true); //< From manual add + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 3u); + EXPECT_TRUE(opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kNoc)); //< From manual add // Test that we can manually stored certs largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestRcacBufExists })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestRcacBufExists })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestIcacBufExists })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestIcacBufExists })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestNocBufExists })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestNocBufExists })); } // Update fails on fabric with wrong FabricIndex err = opCertStore.UpdateOpCertsForFabric(kOtherFabricIndex, kTestNocSpan, kTestIcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); // Update succeeds on fabric with existing data err = opCertStore.UpdateOpCertsForFabric(kFabricIndex1, kTestNocSpan, kTestIcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingNocChain() == true); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 3); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_TRUE(opCertStore.HasPendingNocChain()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 3u); // Can read back existing root unchanged largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestRcacBufExists })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestRcacBufExists })); // NOC chain elements see the pending updated certs largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestIcacBuf })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestIcacBuf })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestNocBuf })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestNocBuf })); // Trying update again fails err = opCertStore.UpdateOpCertsForFabric(kFabricIndex1, kTestNocSpan, kTestIcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingNocChain() == true); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 3); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_TRUE(opCertStore.HasPendingNocChain()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 3u); // Trying to add a new root after update, before commit/revert fails err = opCertStore.AddNewTrustedRootCertForFabric(kFabricIndex1, kTestRcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingNocChain() == true); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 3); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_TRUE(opCertStore.HasPendingNocChain()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 3u); // Trying to add new opcerts for any fabric after update, before commit/revert fails err = opCertStore.AddNewOpCertsForFabric(kFabricIndex1, kTestNocSpan, kTestIcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); err = opCertStore.AddNewOpCertsForFabric(kFabricIndex2, kTestNocSpan, kTestIcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); // Committing writes the new values (we even "background-remove" the old ICAC/NOC before commit) storageDelegate.SyncDeleteKeyValue(DefaultStorageKeyAllocator::FabricICAC(kFabricIndex1).KeyName()); storageDelegate.SyncDeleteKeyValue(DefaultStorageKeyAllocator::FabricNOC(kFabricIndex1).KeyName()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 1); //< Root remains + EXPECT_EQ(storageDelegate.GetNumKeys(), 1u); //< Root remains err = opCertStore.CommitOpCertsForFabric(kFabricIndex1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 3); //< All certs now committed + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 3u); //< All certs now committed // Should be able to get the committed cert even if not in persisted storage, after an API error largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestRcacBufExists })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestRcacBufExists })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestIcacSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestIcacSpan })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestNocSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestNocSpan })); // Calling revert doesn't undo the work we just did opCertStore.RevertPendingOpCerts(); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 3); //< All certs now committed + EXPECT_EQ(storageDelegate.GetNumKeys(), 3u); //< All certs now committed // Verify the revert after commit left all data alone largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestRcacBufExists })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestRcacBufExists })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestIcacSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestIcacSpan })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestNocSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestNocSpan })); // Verify that RemoveOpCertsForFabric fails on fabric with no data err = opCertStore.RemoveOpCertsForFabric(kFabricIndex2); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_FABRIC_INDEX); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 3); + EXPECT_EQ(err, CHIP_ERROR_INVALID_FABRIC_INDEX); + EXPECT_EQ(storageDelegate.GetNumKeys(), 3u); // Verify that RemoveOpCertsForFabric works for fabric we just updated err = opCertStore.RemoveOpCertsForFabric(kFabricIndex1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); // All keys gone + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); // All keys gone opCertStore.Finish(); } -void TestReverts(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPersistentStorageOpCertStore, TestReverts) { TestPersistentStorageDelegate storageDelegate; PersistentStorageOpCertStore opCertStore; // Failure before Init CHIP_ERROR err = opCertStore.RemoveOpCertsForFabric(kFabricIndex1); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); // Init succeeds err = opCertStore.Init(&storageDelegate); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Add a new pending trusted root uint8_t largeBuf[400]; MutableByteSpan largeSpan{ largeBuf }; err = opCertStore.AddNewTrustedRootCertForFabric(kFabricIndex1, kTestRcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); // Verify we can see the new trusted root largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(kTestRcacSpan)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(kTestRcacSpan)); // Verify that after revert, we can't see the root anymore opCertStore.RevertPendingOpCerts(); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(err, CHIP_ERROR_NOT_FOUND); { // Add new root again, to then test review of AddNewTrustedCertificates err = opCertStore.AddNewTrustedRootCertForFabric(kFabricIndex1, kTestRcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); // Add NOC chain err = opCertStore.AddNewOpCertsForFabric(kFabricIndex1, kTestNocSpan, kTestIcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(opCertStore.HasPendingNocChain()); + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase } // Make sure we can see all pending certs before revert { largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(kTestRcacSpan)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(kTestRcacSpan)); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(kTestIcacSpan)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(kTestIcacSpan)); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(kTestNocSpan)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(kTestNocSpan)); } // Revert opCertStore.RevertPendingOpCerts(); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase // Verify that after revert, we can't see the root or chain anymore { largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(err, CHIP_ERROR_NOT_FOUND); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(err, CHIP_ERROR_NOT_FOUND); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(err, CHIP_ERROR_NOT_FOUND); } // Start again to add a new set, but then let's commit { // Add new root again, to then test review of AddNewTrustedCertificates err = opCertStore.AddNewTrustedRootCertForFabric(kFabricIndex1, kTestRcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); // Add NOC chain err = opCertStore.AddNewOpCertsForFabric(kFabricIndex1, kTestNocSpan, kTestIcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(opCertStore.HasPendingNocChain()); + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase } // Commiting new certs should succeed on correct fabric err = opCertStore.CommitOpCertsForFabric(kFabricIndex1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_FALSE(opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 3); //< All certs now committed + EXPECT_EQ(storageDelegate.GetNumKeys(), 3u); //< All certs now committed // Should be able to get the committed certs { largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestIcacSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestIcacSpan })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestNocSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestNocSpan })); } const uint8_t kNewNoc[] = { 'n', 'o', 'c', ' ', 'n', 'e', 'w' }; // Updating certs should work (NO ICAC) err = opCertStore.UpdateOpCertsForFabric(kFabricIndex1, ByteSpan{ kNewNoc }, ByteSpan{}); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 3); //< No change to keys + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_TRUE(opCertStore.HasPendingNocChain()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 3u); //< No change to keys // Should see committed root, pending NOC, absent ICAC { largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NOT_FOUND); - NL_TEST_ASSERT(inSuite, !opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kIcac)); + EXPECT_EQ(err, CHIP_ERROR_NOT_FOUND); + EXPECT_FALSE(opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kIcac)); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kNewNoc })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kNewNoc })); } // Revert, should be back at previous state opCertStore.RevertPendingOpCerts(); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 3); //< Storage count did not yet change + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 3u); //< Storage count did not yet change // Should be able to get the previously committed certs { largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestIcacSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestIcacSpan })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestNocSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestNocSpan })); } // Try again to update with missing ICAC and commit err = opCertStore.UpdateOpCertsForFabric(kFabricIndex1, ByteSpan{ kNewNoc }, ByteSpan{}); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 3); //< No change to keys + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_TRUE(opCertStore.HasPendingNocChain()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 3u); //< No change to keys err = opCertStore.CommitOpCertsForFabric(kFabricIndex1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 2); //< ICAC cert should be gone + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 2u); //< ICAC cert should be gone // Should see committed root, new NOC, absent ICAC { largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); - NL_TEST_ASSERT(inSuite, opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kRcac)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); + EXPECT_TRUE(opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kRcac)); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NOT_FOUND); - NL_TEST_ASSERT(inSuite, !opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kIcac)); + EXPECT_EQ(err, CHIP_ERROR_NOT_FOUND); + EXPECT_FALSE(opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kIcac)); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kNewNoc })); - NL_TEST_ASSERT(inSuite, opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kNoc)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kNewNoc })); + EXPECT_TRUE(opCertStore.HasCertificateForFabric(kFabricIndex1, CertChainElement::kNoc)); } opCertStore.Finish(); } -void TestRevertAddNoc(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPersistentStorageOpCertStore, TestRevertAddNoc) { TestPersistentStorageDelegate storageDelegate; PersistentStorageOpCertStore opCertStore; // Init succeeds CHIP_ERROR err = opCertStore.Init(&storageDelegate); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Add a new pending trusted root uint8_t largeBuf[400]; @@ -646,63 +646,63 @@ void TestRevertAddNoc(nlTestSuite * inSuite, void * inContext) { // Add new root err = opCertStore.AddNewTrustedRootCertForFabric(kFabricIndex1, kTestRcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); // Add NOC chain, with NO ICAC err = opCertStore.AddNewOpCertsForFabric(kFabricIndex1, kTestNocSpan, ByteSpan{}); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(opCertStore.HasPendingNocChain()); + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase } // Make sure we get expected pending state before revert { largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(kTestRcacSpan)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(kTestRcacSpan)); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(err, CHIP_ERROR_NOT_FOUND); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(kTestNocSpan)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(kTestNocSpan)); } // Revert using RemoveOpCertsForFabric err = opCertStore.RemoveOpCertsForFabric(kFabricIndex1); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase // Add again, and commit { // Add new root err = opCertStore.AddNewTrustedRootCertForFabric(kFabricIndex1, kTestRcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); // Add NOC chain, with NO ICAC err = opCertStore.AddNewOpCertsForFabric(kFabricIndex1, kTestNocSpan, ByteSpan{}); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(opCertStore.HasPendingNocChain()); + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase err = opCertStore.CommitOpCertsForFabric(kFabricIndex1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 2); //< We have RCAC, NOC, no ICAC + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 2u); //< We have RCAC, NOC, no ICAC } // Update to add an ICAC @@ -711,65 +711,65 @@ void TestRevertAddNoc(nlTestSuite * inSuite, void * inContext) // Updating certs should work (NO ICAC) err = opCertStore.UpdateOpCertsForFabric(kFabricIndex1, ByteSpan{ kNewNoc }, ByteSpan{ kNewIcac }); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 2); //< No change to keys + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_TRUE(opCertStore.HasPendingNocChain()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 2u); //< No change to keys // Should see committed root, pending NOC, pending ICAC { largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kNewIcac })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kNewIcac })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kNewNoc })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kNewNoc })); } // Commit, should see the new ICAC appear. err = opCertStore.CommitOpCertsForFabric(kFabricIndex1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 3); //< We have RCAC, NOC, ICAC + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 3u); //< We have RCAC, NOC, ICAC // Should see committed root, new NOC, new ICAC { largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kTestRcacSpan })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kNewIcac })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kNewIcac })); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(ByteSpan{ kNewNoc })); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(ByteSpan{ kNewNoc })); } opCertStore.Finish(); } -void TestRevertPendingOpCertsExceptRoot(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPersistentStorageOpCertStore, TestRevertPendingOpCertsExceptRoot) { TestPersistentStorageDelegate storageDelegate; PersistentStorageOpCertStore opCertStore; // Init succeeds CHIP_ERROR err = opCertStore.Init(&storageDelegate); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Add a new pending trusted root uint8_t largeBuf[400]; @@ -778,111 +778,66 @@ void TestRevertPendingOpCertsExceptRoot(nlTestSuite * inSuite, void * inContext) { // Add new root err = opCertStore.AddNewTrustedRootCertForFabric(kFabricIndex1, kTestRcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); // Add NOC chain, with NO ICAC err = opCertStore.AddNewOpCertsForFabric(kFabricIndex1, kTestNocSpan, ByteSpan{}); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(opCertStore.HasPendingNocChain()); + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase } // Make sure we get expected pending state before revert { largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kRcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(kTestRcacSpan)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(kTestRcacSpan)); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kIcac, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_NOT_FOUND); + EXPECT_EQ(err, CHIP_ERROR_NOT_FOUND); largeSpan = MutableByteSpan{ largeBuf }; err = opCertStore.GetCertificate(kFabricIndex1, CertChainElement::kNoc, largeSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, largeSpan.data_equal(kTestNocSpan)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(largeSpan.data_equal(kTestNocSpan)); } // Revert using RevertPendingOpCertsExceptRoot opCertStore.RevertPendingOpCertsExceptRoot(); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase // Add again, and commit { // Add new root: should fail, since it should still be pending err = opCertStore.AddNewTrustedRootCertForFabric(kFabricIndex1, kTestRcacSpan); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INCORRECT_STATE); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); + EXPECT_EQ(err, CHIP_ERROR_INCORRECT_STATE); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); // Add NOC chain, with NO ICAC err = opCertStore.AddNewOpCertsForFabric(kFabricIndex1, kTestNocSpan, ByteSpan{}); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, opCertStore.HasPendingRootCert() == true); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 0); //< Storage count did not yet increase + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(opCertStore.HasPendingNocChain()); + EXPECT_TRUE(opCertStore.HasPendingRootCert()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 0u); //< Storage count did not yet increase err = opCertStore.CommitOpCertsForFabric(kFabricIndex1); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingRootCert()); - NL_TEST_ASSERT(inSuite, !opCertStore.HasPendingNocChain()); - NL_TEST_ASSERT(inSuite, storageDelegate.GetNumKeys() == 2); //< We have RCAC, NOC, no ICAC + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(opCertStore.HasPendingRootCert()); + EXPECT_FALSE(opCertStore.HasPendingNocChain()); + EXPECT_EQ(storageDelegate.GetNumKeys(), 2u); //< We have RCAC, NOC, no ICAC } opCertStore.Finish(); } -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { - NL_TEST_DEF("Test AddNOC-like flows PersistentStorageOpCertStore", TestAddNocFlow), - NL_TEST_DEF("Test UpdateNOC-like flows PersistentStorageOpCertStore", TestUpdateNocFlow), - NL_TEST_DEF("Test revert operations of PersistentStorageOpCertStore", TestReverts), - NL_TEST_DEF("Test revert operations with AddNOC of PersistentStorageOpCertStore", TestRevertAddNoc), - NL_TEST_DEF("Test revert operations using RevertPendingOpCertsExceptRoot", TestRevertPendingOpCertsExceptRoot), - NL_TEST_SENTINEL() -}; - -/** - * Set up the test suite. - */ -int Test_Setup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - VerifyOrReturnError(error == CHIP_NO_ERROR, FAILURE); - return SUCCESS; -} - -/** - * Tear down the test suite. - */ -int Test_Teardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - } // namespace - -/** - * Main - */ -int TestPersistentStorageOpCertStore() -{ - nlTestSuite theSuite = { "PersistentStorageOpCertStore tests", &sTests[0], Test_Setup, Test_Teardown }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestPersistentStorageOpCertStore) diff --git a/src/test_driver/openiotsdk/unit-tests/test_components.txt b/src/test_driver/openiotsdk/unit-tests/test_components.txt index 83dfc0d577bdb7..0471f70b7a1a55 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components.txt @@ -7,7 +7,8 @@ MinimalMdnsRecordsTests MinimalMdnsRespondersTests CoreTests MdnsTests +CredentialsTest PlatformTests TestShell SetupPayloadTests -SupportTests \ No newline at end of file +SupportTests 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 50b0fed3b5e724..d9801e9f9cd305 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt @@ -1,6 +1,5 @@ AppTests BDXTests -CredentialsTest DataModelTests InetLayerTests MessagingLayerTests From 80d7e840b277eaf87a535481f8ef3f2e580be282 Mon Sep 17 00:00:00 2001 From: Mihai Ignat <50373067+mihai-ignat@users.noreply.github.com> Date: Thu, 25 Apr 2024 14:38:24 +0300 Subject: [PATCH 027/124] [NXP][docs] Put all NXP guides in nxp folder and update paths (#33092) * [NXP][docs] Put all NXP guides in nxp folder and update paths * Restyled by prettier-markdown --------- Co-authored-by: Restyled.io <commits@restyled.io> --- docs/guides/README.md | 3 +-- docs/guides/darwin.md | 2 +- docs/guides/index.md | 5 ++--- docs/guides/nxp/README.md | 14 +++++++++++++ .../{ => nxp}/nxp_imx8m_linux_examples.md | 16 +++++++-------- .../nxp_k32w_android_commissioning.md | 20 +++++++++---------- .../{ => nxp}/nxp_manufacturing_flow.md | 0 .../nxp_rw61x_ota_software_update.md | 10 +++++----- .../nxp_zephyr_ota_software_update.md | 4 ++-- examples/air-purifier-app/linux/README.md | 3 ++- .../air-quality-sensor-app/linux/README.md | 3 ++- .../nxp/linux-imx/imx8m/README.md | 4 ++-- .../all-clusters-app/nxp/rt/rw61x/README.md | 8 ++++---- .../nxp/linux-imx/imx8m/README.md | 4 ++-- .../nxp/k32w/k32w0/README.md | 2 +- .../nxp/k32w/k32w1/README.md | 2 +- examples/dishwasher-app/linux/README.md | 3 ++- .../energy-management-app/linux/README.md | 3 ++- examples/lighting-app/linux/README.md | 3 ++- .../lighting-app/nxp/k32w/k32w0/README.md | 2 +- .../lighting-app/nxp/k32w/k32w1/README.md | 2 +- .../nxp/linux-imx/imx8m/README.md | 4 ++-- examples/refrigerator-app/linux/README.md | 3 ++- .../thermostat/nxp/linux-imx/imx8m/README.md | 4 ++-- examples/thermostat/nxp/linux-se05x/README.md | 4 ++-- .../nxp/factory_data_generator/README.md | 2 +- 26 files changed, 74 insertions(+), 56 deletions(-) create mode 100644 docs/guides/nxp/README.md rename docs/guides/{ => nxp}/nxp_imx8m_linux_examples.md (95%) rename docs/guides/{ => nxp}/nxp_k32w_android_commissioning.md (94%) rename docs/guides/{ => nxp}/nxp_manufacturing_flow.md (100%) rename docs/guides/{ => nxp}/nxp_rw61x_ota_software_update.md (96%) rename docs/guides/{ => nxp}/nxp_zephyr_ota_software_update.md (99%) diff --git a/docs/guides/README.md b/docs/guides/README.md index dbdda1bba07de4..e9a42a15861648 100644 --- a/docs/guides/README.md +++ b/docs/guides/README.md @@ -18,8 +18,7 @@ - [nRF Connect - Factory Data Configuration](./nrfconnect_factory_data_configuration.md) - [nRF Connect - Platform Overview](./nrfconnect_platform_overview.md) - [nRF Connect - Software Update](./nrfconnect_examples_software_update.md) -- [NXP - Android Commissioning](./nxp_k32w_android_commissioning.md) -- [NXP - Linux Examples](./nxp_imx8m_linux_examples.md) +- [NXP - Getting Started Guide](./nxp/README.md) - [Silicon Labs - Documentation](https://siliconlabs.github.io/matter/latest/index.html) - [Silicon Labs - Getting Started](./silabs_getting_started.md) - [Silicon Labs - Software Update](./silabs_efr32_software_update.md) diff --git a/docs/guides/darwin.md b/docs/guides/darwin.md index 0b312807e3457f..4a9a8da939952e 100644 --- a/docs/guides/darwin.md +++ b/docs/guides/darwin.md @@ -259,7 +259,7 @@ Example: - [mbedOS](/examples/all-clusters-app/mbed/README.md) - [nRF Connect All Clusters](./nrfconnect_examples_configuration.md) - [nRF Connect Pump](/examples/pump-app/nrfconnect/README.md) -- [NXP Examples](./nxp_imx8m_linux_examples.md) +- [NXP Examples](./nxp/nxp_imx8m_linux_examples.md) - [NXP](/examples/all-clusters-app/nxp/mw320/README.md) - [Infineon CYW30739 Lighting](/examples/lighting-app/infineon/cyw30739/README.md) - [Infineon PSoC6](/examples/all-clusters-app/infineon/psoc6/README.md) diff --git a/docs/guides/index.md b/docs/guides/index.md index 2a5d3a64f5afe7..7ec0ec61a3cc69 100644 --- a/docs/guides/index.md +++ b/docs/guides/index.md @@ -10,6 +10,7 @@ and features. * esp32/README +nxp/README ti/ti_platform_overview ``` @@ -34,9 +35,7 @@ ti/ti_platform_overview - [nRF Connect - Factory Data Configuration](./nrfconnect_factory_data_configuration.md) - [nRF Connect - Platform Overview](./nrfconnect_platform_overview.md) - [nRF Connect - Software Update](./nrfconnect_examples_software_update.md) -- [NXP - Android Commissioning](./nxp_k32w_android_commissioning.md) -- [NXP - Linux Examples](./nxp_imx8m_linux_examples.md) -- [NXP - Manufacturing Data](./nxp_manufacturing_flow.md) +- [NXP - Getting Started Guide](./nxp/README.md) - [Silicon Labs - Documentation](https://siliconlabs.github.io/matter/latest/index.html) - [Silicon Labs - Getting Started](./silabs_getting_started.md) - [Silicon Labs - Software Update](./silabs_efr32_software_update.md) diff --git a/docs/guides/nxp/README.md b/docs/guides/nxp/README.md new file mode 100644 index 00000000000000..be225ac938f7b5 --- /dev/null +++ b/docs/guides/nxp/README.md @@ -0,0 +1,14 @@ +```{toctree} +:glob: +:maxdepth: 1 + +* +``` + +# NXP Getting Started Guide + +- [NXP - Android Commissioning](nxp_k32w_android_commissioning.md) +- [NXP - Linux Examples](nxp_imx8m_linux_examples.md) +- [NXP - Manufacturing Data](nxp_manufacturing_flow.md) +- [NXP - RW61x OTA Software Update Guide](nxp_rw61x_ota_software_update.md) +- [NXP - Zephyr OTA Software Update Guide](nxp_zephyr_ota_software_update.md) diff --git a/docs/guides/nxp_imx8m_linux_examples.md b/docs/guides/nxp/nxp_imx8m_linux_examples.md similarity index 95% rename from docs/guides/nxp_imx8m_linux_examples.md rename to docs/guides/nxp/nxp_imx8m_linux_examples.md index 6b1ad2b8f6c4bd..4ff8ded6a53515 100644 --- a/docs/guides/nxp_imx8m_linux_examples.md +++ b/docs/guides/nxp/nxp_imx8m_linux_examples.md @@ -4,11 +4,11 @@ This document describes how to build below Linux examples with the NXP embedded Linux Yocto SDK and then run the output executable files on the **NXP i.MX 8M** **Mini EVK** development board. -- [CHIP Linux All-clusters Example](../../examples/all-clusters-app/linux/README.md) -- [CHIP Linux Lighting Example](../../examples/lighting-app/linux/README.md) +- [CHIP Linux All-clusters Example](../../../examples/all-clusters-app/linux/README.md) +- [CHIP Linux Lighting Example](../../../examples/lighting-app/linux/README.md) - [CHIP Linux Thermostat Example](https://github.com/project-chip/connectedhomeip/tree/master/examples/thermostat/linux) -- [CHIP Linux CHIP-tool Example](../../examples/chip-tool/README.md) -- [CHIP Linux OTA-provider Example](../../examples/ota-provider-app/linux/README.md) +- [CHIP Linux CHIP-tool Example](../../../examples/chip-tool/README.md) +- [CHIP Linux OTA-provider Example](../../../examples/ota-provider-app/linux/README.md) This document has been tested on: @@ -234,8 +234,8 @@ Thermostat-app is used as an example below. In order to test the CHIP protocol functions, another device on the same network is needed to run the - [ChipDeviceController](../../src/controller/python) tool to communicate with - the **i.MX 8M Mini EVK**. + [ChipDeviceController](../../../src/controller/python) tool to communicate + with the **i.MX 8M Mini EVK**. The ChipDeviceController can be a laptop / workstation. Bluetooth functionality is mandatory on this device. @@ -252,7 +252,7 @@ Thermostat-app is used as an example below. - Boot up Ubuntu on the Raspberry Pi - Clone this connectedhomeip project - Follow Python ChipDeviceController - [README.md](../../src/controller/python/README.md) document. Refer to + [README.md](../../../src/controller/python/README.md) document. Refer to the "Building and installing" part to build the tool. - Running @@ -283,7 +283,7 @@ Thermostat-app is used as an example below. /home/root/thermostat-app --ble-device 0 --wifi # The bluetooth device used is hci0 and support wifi network ``` - - Run [ChipDeviceController](../../src/controller/python) on the + - Run [ChipDeviceController](../../../src/controller/python) on the controller device to communicate with **i.MX 8M Mini EVK** running the example. diff --git a/docs/guides/nxp_k32w_android_commissioning.md b/docs/guides/nxp/nxp_k32w_android_commissioning.md similarity index 94% rename from docs/guides/nxp_k32w_android_commissioning.md rename to docs/guides/nxp/nxp_k32w_android_commissioning.md index b39a2f2afd2c8c..6d872f5f7ba268 100644 --- a/docs/guides/nxp_k32w_android_commissioning.md +++ b/docs/guides/nxp/nxp_k32w_android_commissioning.md @@ -1,8 +1,8 @@ # Commissioning NXP K32W using Android CHIPTool This article describes how to use -[CHIPTool](../../examples/android/CHIPTool/README.md) for Android smartphones to -commission an NXP K32W061 DK6 running +[CHIPTool](../../../examples/android/CHIPTool/README.md) for Android smartphones +to commission an NXP K32W061 DK6 running [NXP K32W Light Example Application](#building-and-programming-nxp-k32w-light-example-application) onto a CHIP-enabled Thread network. @@ -47,7 +47,7 @@ The following diagram shows the connectivity between network components required to allow communication between devices running the CHIPTool and Light applications: - + <hr> @@ -348,7 +348,7 @@ To make your PC work as a Thread Border Router, complete the following tasks: ## Building and programming NXP K32W Light Example Application See -[NXP K32W Light Example Application README](../../examples/lighting-app/nxp/k32w/k32w0/README.md) +[NXP K32W Light Example Application README](../../../examples/lighting-app/nxp/k32w/k32w0/README.md) to learn how to build and program the light example onto an K32W061 DK6. <hr> @@ -356,7 +356,7 @@ to learn how to build and program the light example onto an K32W061 DK6. ## Building and installing Android CHIPTool To build the CHIPTool application for your smartphone, read -[Android CHIPTool README](../../examples/android/CHIPTool/README.md). +[Android CHIPTool README](../../../examples/android/CHIPTool/README.md). After building, install the application by completing the following steps: @@ -396,7 +396,7 @@ CHIPTool is now ready to be used for commissioning. 3. Navigate to the _Form_ tab then push the _Form_ button using the default parameters: -  +  4. The message _Form operation is successful_ should be display after a few seconds. @@ -430,7 +430,7 @@ To prepare the accessory device for commissioning, complete the following steps: 1. Make sure that JP4 and JP7 jumpers are in leftmost position and a mini-USB cable is connected between the LPC connector and PC -  +  2. Use a terminal emulator (e.g.: Putty) to connect to the UART console of the accessory device. Use a baudrate of 115200. @@ -466,14 +466,14 @@ section, complete the following steps: progress with scanning, connection, and pairing. At the end of this process, the Thread network settings screen appears. -  +  6. In the Thread network settings screen, use the default settings and tap the _SAVE NETWORK_ button to send a Thread provisioning message to the accessory device. You will see the "Network provisioning completed" message when the accessory device successfully joins the Thread network. -  +  <hr> @@ -483,7 +483,7 @@ section, complete the following steps: the provisioning is completed successfully and you are connected to the device. -  +  2. Verify that the text box on the screen is not empty and contains the IPv6 address of the accessory device. diff --git a/docs/guides/nxp_manufacturing_flow.md b/docs/guides/nxp/nxp_manufacturing_flow.md similarity index 100% rename from docs/guides/nxp_manufacturing_flow.md rename to docs/guides/nxp/nxp_manufacturing_flow.md diff --git a/docs/guides/nxp_rw61x_ota_software_update.md b/docs/guides/nxp/nxp_rw61x_ota_software_update.md similarity index 96% rename from docs/guides/nxp_rw61x_ota_software_update.md rename to docs/guides/nxp/nxp_rw61x_ota_software_update.md index cdabf5e012da96..1543b2f94402cf 100644 --- a/docs/guides/nxp_rw61x_ota_software_update.md +++ b/docs/guides/nxp/nxp_rw61x_ota_software_update.md @@ -89,7 +89,7 @@ J-Link > erase 0x8000000, 0x88a0000 - Using MCUXPresso, import the `mcuboot_opensource` demo example from the SDK previously downloaded. The example can be found under the `ota_examples` folder. -  +  - Before building the demo example, it should be specified that the application to be run by the bootloader is monolithic. As a result, only one image will be upgraded by the bootloader. This can be done by defining @@ -99,7 +99,7 @@ J-Link > erase 0x8000000, 0x88a0000 Right click on the Project -> Properties -> C/C++ Build -> Settings -> Tool Settings -> MCU C Compiler -> Preprocessor -> Add "MONOLITHIC_APP=1" in the Defined Symbols ``` - + - Build the demo example project. @@ -149,7 +149,7 @@ The image must have the following format : signature, the upgrade type, the swap status... The all-clusters application can be generated using the instructions from the -[README.md 'Building'](../../examples/all-clusters-app/nxp/rt/rw61x/README.md#building) +[README.md 'Building'](../../../examples/all-clusters-app/nxp/rt/rw61x/README.md#building) section. The application is automatically linked to be executed from the primary image partition, taking into consideration the offset imposed by mcuboot. @@ -242,8 +242,8 @@ instructions below describe the procedure step-by-step. Setup example : -- [Chip-tool](../../examples/chip-tool/README.md) application running on the - RPi. +- [Chip-tool](../../../examples/chip-tool/README.md) application running on + the RPi. - OTA Provider application built on the same RPi (as explained below). - RW61x board programmed with the example application (with the instructions above). diff --git a/docs/guides/nxp_zephyr_ota_software_update.md b/docs/guides/nxp/nxp_zephyr_ota_software_update.md similarity index 99% rename from docs/guides/nxp_zephyr_ota_software_update.md rename to docs/guides/nxp/nxp_zephyr_ota_software_update.md index a36ac3281cb116..314765aaa4d7c6 100644 --- a/docs/guides/nxp_zephyr_ota_software_update.md +++ b/docs/guides/nxp/nxp_zephyr_ota_software_update.md @@ -178,8 +178,8 @@ Update. The instructions below describes the procedure step-by-step. Setup example : -- [Chip-tool](../../examples/chip-tool/README.md) application running on the - RPi. +- [Chip-tool](../../../examples/chip-tool/README.md) application running on + the RPi. - OTA Provider application built on the same RPi (as explained below). - Board programmed with the example application (with the instructions above). diff --git a/examples/air-purifier-app/linux/README.md b/examples/air-purifier-app/linux/README.md index d2352bca201e1a..2d771bdf5b5ff4 100644 --- a/examples/air-purifier-app/linux/README.md +++ b/examples/air-purifier-app/linux/README.md @@ -11,7 +11,8 @@ Temperature Sensor and Endpoint 5 is a Thermostat. To cross-compile this example on x64 host and run on **NXP i.MX 8M Mini** **EVK**, see the associated -[README document](../../../docs/guides/nxp_imx8m_linux_examples.md) for details. +[README document](../../../docs/guides/nxp/nxp_imx8m_linux_examples.md) for +details. <hr> diff --git a/examples/air-quality-sensor-app/linux/README.md b/examples/air-quality-sensor-app/linux/README.md index b1c2e92461d8f0..ef90a4bd23df9f 100644 --- a/examples/air-quality-sensor-app/linux/README.md +++ b/examples/air-quality-sensor-app/linux/README.md @@ -7,7 +7,8 @@ for Raspberry Pi Desktop 20.10 (aarch64)** To cross-compile this example on x64 host and run on **NXP i.MX 8M Mini** **EVK**, see the associated -[README document](../../../docs/guides/nxp_imx8m_linux_examples.md) for details. +[README document](../../../docs/guides/nxp/nxp_imx8m_linux_examples.md) for +details. <hr> diff --git a/examples/all-clusters-app/nxp/linux-imx/imx8m/README.md b/examples/all-clusters-app/nxp/linux-imx/imx8m/README.md index 9a90a11e0dccc4..e20ff1065d3dfb 100644 --- a/examples/all-clusters-app/nxp/linux-imx/imx8m/README.md +++ b/examples/all-clusters-app/nxp/linux-imx/imx8m/README.md @@ -1,4 +1,4 @@ To cross-compile this example on x64 host and run on **NXP i.MX 8M Mini** **EVK**, see the associated -[README document](../../../../../docs/guides/nxp_imx8m_linux_examples.md) for -details. +[README document](../../../../../docs/guides/nxp/nxp_imx8m_linux_examples.md) +for details. diff --git a/examples/all-clusters-app/nxp/rt/rw61x/README.md b/examples/all-clusters-app/nxp/rt/rw61x/README.md index 8a6889909dffa3..bdec2c58956274 100644 --- a/examples/all-clusters-app/nxp/rt/rw61x/README.md +++ b/examples/all-clusters-app/nxp/rt/rw61x/README.md @@ -139,16 +139,16 @@ Optional GN options that can be added when building an application: - To build with the option to have Matter certificates/keys pre-loaded in a specific flash area the argument `chip_with_factory_data=1` must be added to the _gn gen_ command. (for more information see - [Guide for writing manufacturing data on NXP devices](../../../../../docs/guides/nxp_manufacturing_flow.md). + [Guide for writing manufacturing data on NXP devices](../../../../../docs/guides/nxp/nxp_manufacturing_flow.md). - To build the application with the OTA Requestor enabled, the arguments `chip_enable_ota_requestor=true no_mcuboot=false` must be added to the _gn gen_ command. (More information about the OTA Requestor feature in - [OTA Requestor README](../../../../../docs/guides/nxp_rw61x_ota_software_update.md) + [OTA Requestor README](../../../../../docs/guides/nxp/nxp_rw61x_ota_software_update.md) ## Manufacturing data See -[Guide for writing manufacturing data on NXP devices](../../../../../docs/guides/nxp_manufacturing_flow.md) +[Guide for writing manufacturing data on NXP devices](../../../../../docs/guides/nxp/nxp_manufacturing_flow.md) Other comments: @@ -374,4 +374,4 @@ Done Over-The-Air software updates are supported with the RW61x all-clusters example. The process to follow in order to perform a software update is described in the dedicated guide -['Matter Over-The-Air Software Update with NXP RW61x example applications'](../../../../../docs/guides/nxp_rw61x_ota_software_update.md). +['Matter Over-The-Air Software Update with NXP RW61x example applications'](../../../../../docs/guides/nxp/nxp_rw61x_ota_software_update.md). diff --git a/examples/all-clusters-minimal-app/nxp/linux-imx/imx8m/README.md b/examples/all-clusters-minimal-app/nxp/linux-imx/imx8m/README.md index 9a90a11e0dccc4..e20ff1065d3dfb 100644 --- a/examples/all-clusters-minimal-app/nxp/linux-imx/imx8m/README.md +++ b/examples/all-clusters-minimal-app/nxp/linux-imx/imx8m/README.md @@ -1,4 +1,4 @@ To cross-compile this example on x64 host and run on **NXP i.MX 8M Mini** **EVK**, see the associated -[README document](../../../../../docs/guides/nxp_imx8m_linux_examples.md) for -details. +[README document](../../../../../docs/guides/nxp/nxp_imx8m_linux_examples.md) +for details. diff --git a/examples/contact-sensor-app/nxp/k32w/k32w0/README.md b/examples/contact-sensor-app/nxp/k32w/k32w0/README.md index b7ec329d7650d1..5ad31921b665ae 100644 --- a/examples/contact-sensor-app/nxp/k32w/k32w0/README.md +++ b/examples/contact-sensor-app/nxp/k32w/k32w0/README.md @@ -348,7 +348,7 @@ Please use the following build args: ## Manufacturing data See -[Guide for writing manufacturing data on NXP devices](../../../../../docs/guides/nxp_manufacturing_flow.md). +[Guide for writing manufacturing data on NXP devices](../../../../../docs/guides/nxp/nxp_manufacturing_flow.md). There are factory data generated binaries available in examples/platform/nxp/k32w/k32w0/scripts/demo_generated_factory_data folder. diff --git a/examples/contact-sensor-app/nxp/k32w/k32w1/README.md b/examples/contact-sensor-app/nxp/k32w/k32w1/README.md index 5079e01c6e2400..f3896a01b8362e 100644 --- a/examples/contact-sensor-app/nxp/k32w/k32w1/README.md +++ b/examples/contact-sensor-app/nxp/k32w/k32w1/README.md @@ -185,7 +185,7 @@ using Fibonacci backoff for retries pacing. Use `chip_with_factory_data=1` in the gn build command to enable factory data. For a full guide on manufacturing flow, please see -[Guide for writing manufacturing data on NXP devices](../../../../../docs/guides/nxp_manufacturing_flow.md). +[Guide for writing manufacturing data on NXP devices](../../../../../docs/guides/nxp/nxp_manufacturing_flow.md). ## Flashing diff --git a/examples/dishwasher-app/linux/README.md b/examples/dishwasher-app/linux/README.md index 3c8df646ecd060..2d3b461386395d 100644 --- a/examples/dishwasher-app/linux/README.md +++ b/examples/dishwasher-app/linux/README.md @@ -7,7 +7,8 @@ for Raspberry Pi Desktop 20.10 (aarch64)** To cross-compile this example on x64 host and run on **NXP i.MX 8M Mini** **EVK**, see the associated -[README document](../../../docs/guides/nxp_imx8m_linux_examples.md) for details. +[README document](../../../docs/guides/nxp/nxp_imx8m_linux_examples.md) for +details. <hr> diff --git a/examples/energy-management-app/linux/README.md b/examples/energy-management-app/linux/README.md index 424ef46d58e259..f91d341915ccd8 100644 --- a/examples/energy-management-app/linux/README.md +++ b/examples/energy-management-app/linux/README.md @@ -7,7 +7,8 @@ for Raspberry Pi Desktop 20.10 (aarch64)** To cross-compile this example on x64 host and run on **NXP i.MX 8M Mini** **EVK**, see the associated -[README document](../../../docs/guides/nxp_imx8m_linux_examples.md) for details. +[README document](../../../docs/guides/nxp/nxp_imx8m_linux_examples.md) for +details. <hr> diff --git a/examples/lighting-app/linux/README.md b/examples/lighting-app/linux/README.md index ff2c9b1bf50611..e41799a70dc60d 100644 --- a/examples/lighting-app/linux/README.md +++ b/examples/lighting-app/linux/README.md @@ -7,7 +7,8 @@ Raspberry Pi Desktop 20.10 (aarch64)** To cross-compile this example on x64 host and run on **NXP i.MX 8M Mini** **EVK**, see the associated -[README document](../../../docs/guides/nxp_imx8m_linux_examples.md) for details. +[README document](../../../docs/guides/nxp/nxp_imx8m_linux_examples.md) for +details. <hr> diff --git a/examples/lighting-app/nxp/k32w/k32w0/README.md b/examples/lighting-app/nxp/k32w/k32w0/README.md index af43002f21c65a..106a614191c5f0 100644 --- a/examples/lighting-app/nxp/k32w/k32w0/README.md +++ b/examples/lighting-app/nxp/k32w/k32w0/README.md @@ -323,7 +323,7 @@ Please use the following build args: ## Manufacturing data See -[Guide for writing manufacturing data on NXP devices](../../../../../docs/guides/nxp_manufacturing_flow.md). +[Guide for writing manufacturing data on NXP devices](../../../../../docs/guides/nxp/nxp_manufacturing_flow.md). There are factory data generated binaries available in examples/platform/nxp/k32w/k32w0/scripts/demo_generated_factory_data folder. diff --git a/examples/lighting-app/nxp/k32w/k32w1/README.md b/examples/lighting-app/nxp/k32w/k32w1/README.md index c44c73a1ecc946..3bf2ab8105481b 100644 --- a/examples/lighting-app/nxp/k32w/k32w1/README.md +++ b/examples/lighting-app/nxp/k32w/k32w1/README.md @@ -187,7 +187,7 @@ control** cluster Use `chip_with_factory_data=1` in the gn build command to enable factory data. For a full guide on manufacturing flow, please see -[Guide for writing manufacturing data on NXP devices](../../../../../docs/guides/nxp_manufacturing_flow.md). +[Guide for writing manufacturing data on NXP devices](../../../../../docs/guides/nxp/nxp_manufacturing_flow.md). ## Flashing diff --git a/examples/lighting-app/nxp/linux-imx/imx8m/README.md b/examples/lighting-app/nxp/linux-imx/imx8m/README.md index 9a90a11e0dccc4..e20ff1065d3dfb 100644 --- a/examples/lighting-app/nxp/linux-imx/imx8m/README.md +++ b/examples/lighting-app/nxp/linux-imx/imx8m/README.md @@ -1,4 +1,4 @@ To cross-compile this example on x64 host and run on **NXP i.MX 8M Mini** **EVK**, see the associated -[README document](../../../../../docs/guides/nxp_imx8m_linux_examples.md) for -details. +[README document](../../../../../docs/guides/nxp/nxp_imx8m_linux_examples.md) +for details. diff --git a/examples/refrigerator-app/linux/README.md b/examples/refrigerator-app/linux/README.md index fc51f2fc39d6d6..a8adfe03a792fb 100644 --- a/examples/refrigerator-app/linux/README.md +++ b/examples/refrigerator-app/linux/README.md @@ -7,7 +7,8 @@ for Raspberry Pi Desktop 20.10 (aarch64)** To cross-compile this example on x64 host and run on **NXP i.MX 8M Mini** **EVK**, see the associated -[README document](../../../docs/guides/nxp_imx8m_linux_examples.md) for details. +[README document](../../../docs/guides/nxp/nxp_imx8m_linux_examples.md) for +details. <hr> diff --git a/examples/thermostat/nxp/linux-imx/imx8m/README.md b/examples/thermostat/nxp/linux-imx/imx8m/README.md index 9a90a11e0dccc4..e20ff1065d3dfb 100644 --- a/examples/thermostat/nxp/linux-imx/imx8m/README.md +++ b/examples/thermostat/nxp/linux-imx/imx8m/README.md @@ -1,4 +1,4 @@ To cross-compile this example on x64 host and run on **NXP i.MX 8M Mini** **EVK**, see the associated -[README document](../../../../../docs/guides/nxp_imx8m_linux_examples.md) for -details. +[README document](../../../../../docs/guides/nxp/nxp_imx8m_linux_examples.md) +for details. diff --git a/examples/thermostat/nxp/linux-se05x/README.md b/examples/thermostat/nxp/linux-se05x/README.md index 9a90a11e0dccc4..e20ff1065d3dfb 100644 --- a/examples/thermostat/nxp/linux-se05x/README.md +++ b/examples/thermostat/nxp/linux-se05x/README.md @@ -1,4 +1,4 @@ To cross-compile this example on x64 host and run on **NXP i.MX 8M Mini** **EVK**, see the associated -[README document](../../../../../docs/guides/nxp_imx8m_linux_examples.md) for -details. +[README document](../../../../../docs/guides/nxp/nxp_imx8m_linux_examples.md) +for details. diff --git a/scripts/tools/nxp/factory_data_generator/README.md b/scripts/tools/nxp/factory_data_generator/README.md index 38f65d4b7cbaef..0aacaeb81a29b6 100644 --- a/scripts/tools/nxp/factory_data_generator/README.md +++ b/scripts/tools/nxp/factory_data_generator/README.md @@ -1,7 +1,7 @@ # NXP Factory Data Generator For usage of the tool, please see -[Guide for writing manufacturing data on NXP devices](../../../../docs/guides/nxp_manufacturing_flow.md). +[Guide for writing manufacturing data on NXP devices](../../../../docs/guides/nxp/nxp_manufacturing_flow.md). ## Tool implementation From 91f362efb3f00e9a34cd50b7df6d6b198dbe7cd0 Mon Sep 17 00:00:00 2001 From: Amine Alami <43780877+Alami-Amine@users.noreply.github.com> Date: Thu, 25 Apr 2024 13:47:27 +0200 Subject: [PATCH 028/124] pw_unit_test migration: lib support batch 2 (#33144) * pw_unit_test migration: lib support batch 2 * restyle --- src/lib/support/tests/BUILD.gn | 14 +- src/lib/support/tests/TestBytesToHex.cpp | 237 ++++++------- src/lib/support/tests/TestSafeString.cpp | 40 +-- src/lib/support/tests/TestScoped.cpp | 65 ++-- src/lib/support/tests/TestSpan.cpp | 321 ++++++++---------- .../tests/TestStaticSupportSmartPtr.cpp | 63 ++-- .../TestTestPersistentStorageDelegate.cpp | 213 ++++++------ src/lib/support/tests/TestUtf8.cpp | 87 ++--- 8 files changed, 438 insertions(+), 602 deletions(-) diff --git a/src/lib/support/tests/BUILD.gn b/src/lib/support/tests/BUILD.gn index 2a9c1ac81fe6a8..585233b1e6667d 100644 --- a/src/lib/support/tests/BUILD.gn +++ b/src/lib/support/tests/BUILD.gn @@ -25,11 +25,18 @@ chip_test_suite("tests") { test_sources = [ "TestBitMask.cpp", "TestBufferReader.cpp", + "TestBytesToHex.cpp", "TestDefer.cpp", "TestFixedBufferAllocator.cpp", "TestFold.cpp", "TestIniEscaping.cpp", "TestSafeInt.cpp", + "TestSafeString.cpp", + "TestScoped.cpp", + "TestSpan.cpp", + "TestStaticSupportSmartPtr.cpp", + "TestTestPersistentStorageDelegate.cpp", + "TestUtf8.cpp", ] sources = [] @@ -59,7 +66,6 @@ chip_test_suite_using_nltest("tests_nltest") { test_sources = [ "TestBufferWriter.cpp", "TestBytesCircularBuffer.cpp", - "TestBytesToHex.cpp", "TestCHIPCounter.cpp", "TestCHIPMem.cpp", "TestCHIPMemString.cpp", @@ -70,21 +76,15 @@ chip_test_suite_using_nltest("tests_nltest") { "TestPersistedCounter.cpp", "TestPool.cpp", "TestPrivateHeap.cpp", - "TestSafeString.cpp", - "TestScoped.cpp", "TestScopedBuffer.cpp", "TestSorting.cpp", - "TestSpan.cpp", "TestStateMachine.cpp", - "TestStaticSupportSmartPtr.cpp", "TestStringBuilder.cpp", "TestStringSplitter.cpp", - "TestTestPersistentStorageDelegate.cpp", "TestThreadOperationalDataset.cpp", "TestTimeUtils.cpp", "TestTlvJson.cpp", "TestTlvToJson.cpp", - "TestUtf8.cpp", "TestVariant.cpp", "TestZclString.cpp", ] diff --git a/src/lib/support/tests/TestBytesToHex.cpp b/src/lib/support/tests/TestBytesToHex.cpp index f5ac6eff27feb1..1e304811b5e42b 100644 --- a/src/lib/support/tests/TestBytesToHex.cpp +++ b/src/lib/support/tests/TestBytesToHex.cpp @@ -20,15 +20,13 @@ #include <string> #include <vector> +#include <gtest/gtest.h> + #include <lib/support/BytesToHex.h> #include <lib/support/CodeUtils.h> #include <lib/support/EnforceFormat.h> #include <lib/support/Span.h> -#include <lib/support/UnitTestRegistration.h> #include <lib/support/logging/CHIPLogging.h> - -#include <nlunit-test.h> - namespace { using namespace chip; @@ -37,7 +35,7 @@ using namespace chip::Encoding; // To accumulate redirected logs for some tests std::vector<std::string> gRedirectedLogLines; -void TestBytesToHexNotNullTerminated(nlTestSuite * inSuite, void * inContext) +TEST(TestBytesToHex, TestBytesToHexNotNullTerminated) { // Uppercase { @@ -45,12 +43,11 @@ void TestBytesToHexNotNullTerminated(nlTestSuite * inSuite, void * inContext) char dest[18] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '@' }; char dest2[18] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '@' }; char expected[18] = { 'F', 'E', 'D', 'C', 'B', 'A', '9', '8', '7', '6', '5', '4', '3', '2', '1', '0', '!', '@' }; - NL_TEST_ASSERT(inSuite, - BytesToHex(&src[0], sizeof(src), &dest[0], sizeof(src) * 2u, HexFlags::kUppercase) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(&dest[0], &expected[0], sizeof(expected)) == 0); + EXPECT_EQ(BytesToHex(&src[0], sizeof(src), &dest[0], sizeof(src) * 2u, HexFlags::kUppercase), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(&dest[0], &expected[0], sizeof(expected)), 0); - NL_TEST_ASSERT(inSuite, BytesToUppercaseHexBuffer(&src[0], sizeof(src), &dest2[0], sizeof(src) * 2u) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(&dest2[0], &expected[0], sizeof(expected)) == 0); + EXPECT_EQ(BytesToUppercaseHexBuffer(&src[0], sizeof(src), &dest2[0], sizeof(src) * 2u), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(&dest2[0], &expected[0], sizeof(expected)), 0); } // Lowercase @@ -59,12 +56,12 @@ void TestBytesToHexNotNullTerminated(nlTestSuite * inSuite, void * inContext) char dest[18] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '@' }; char dest2[18] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '@' }; char expected[18] = { 'f', 'e', 'd', 'c', 'b', 'a', '9', '8', '7', '6', '5', '4', '3', '2', '1', '0', '!', '@' }; - NL_TEST_ASSERT(inSuite, BytesToHex(&src[0], sizeof(src), &dest[0], sizeof(src) * 2u, HexFlags::kNone) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(&dest[0], &expected[0], sizeof(expected)) == 0); + EXPECT_EQ(BytesToHex(&src[0], sizeof(src), &dest[0], sizeof(src) * 2u, HexFlags::kNone), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(&dest[0], &expected[0], sizeof(expected)), 0); // Test Alias - NL_TEST_ASSERT(inSuite, BytesToLowercaseHexBuffer(&src[0], sizeof(src), &dest2[0], sizeof(src) * 2u) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(&dest2[0], &expected[0], sizeof(expected)) == 0); + EXPECT_EQ(BytesToLowercaseHexBuffer(&src[0], sizeof(src), &dest2[0], sizeof(src) * 2u), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(&dest2[0], &expected[0], sizeof(expected)), 0); } // Trivial: Zero size input @@ -72,28 +69,28 @@ void TestBytesToHexNotNullTerminated(nlTestSuite * inSuite, void * inContext) uint8_t src[] = { 0x00 }; char dest[2] = { '!', '@' }; char expected[2] = { '!', '@' }; - NL_TEST_ASSERT(inSuite, BytesToHex(&src[0], 0, &dest[0], sizeof(src) * 2u, HexFlags::kNone) == CHIP_NO_ERROR); + EXPECT_EQ(BytesToHex(&src[0], 0, &dest[0], sizeof(src) * 2u, HexFlags::kNone), CHIP_NO_ERROR); // Nothing should have been touched. - NL_TEST_ASSERT(inSuite, memcmp(&dest[0], &expected[0], sizeof(expected)) == 0); + EXPECT_EQ(memcmp(&dest[0], &expected[0], sizeof(expected)), 0); } // Trivial: Zero size input with null buffer { char dest[2] = { '!', '@' }; char expected[2] = { '!', '@' }; - NL_TEST_ASSERT(inSuite, BytesToHex(nullptr, 0, &dest[0], sizeof(dest), HexFlags::kNone) == CHIP_NO_ERROR); + EXPECT_EQ(BytesToHex(nullptr, 0, &dest[0], sizeof(dest), HexFlags::kNone), CHIP_NO_ERROR); // Nothing should have been touched. - NL_TEST_ASSERT(inSuite, memcmp(&dest[0], &expected[0], sizeof(expected)) == 0); + EXPECT_EQ(memcmp(&dest[0], &expected[0], sizeof(expected)), 0); - NL_TEST_ASSERT(inSuite, BytesToHex(nullptr, 0, nullptr, 0, HexFlags::kNone) == CHIP_NO_ERROR); + EXPECT_EQ(BytesToHex(nullptr, 0, nullptr, 0, HexFlags::kNone), CHIP_NO_ERROR); // Nothing should have been touched. - NL_TEST_ASSERT(inSuite, memcmp(&dest[0], &expected[0], sizeof(expected)) == 0); + EXPECT_EQ(memcmp(&dest[0], &expected[0], sizeof(expected)), 0); - NL_TEST_ASSERT(inSuite, BytesToHex(nullptr, 0, nullptr, 1, HexFlags::kNone) == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(BytesToHex(nullptr, 0, nullptr, 1, HexFlags::kNone), CHIP_ERROR_INVALID_ARGUMENT); } } -void TestBytesToHexNullTerminated(nlTestSuite * inSuite, void * inContext) +TEST(TestBytesToHex, TestBytesToHexNullTerminated) { // Uppercase { @@ -101,17 +98,16 @@ void TestBytesToHexNullTerminated(nlTestSuite * inSuite, void * inContext) char dest[18] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '@' }; char dest2[18] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '@' }; char expected[18] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', '\0', '@' }; - NL_TEST_ASSERT(inSuite, ((sizeof(src) * 2u) + 1u) <= sizeof(dest)); - NL_TEST_ASSERT(inSuite, - BytesToHex(&src[0], sizeof(src), &dest[0], (sizeof(src) * 2u) + 1, HexFlags::kUppercaseAndNullTerminate) == - CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(&dest[0], &expected[0], sizeof(expected)) == 0); + EXPECT_LE(((sizeof(src) * 2u) + 1u), sizeof(dest)); + EXPECT_EQ(BytesToHex(&src[0], sizeof(src), &dest[0], (sizeof(src) * 2u) + 1, HexFlags::kUppercaseAndNullTerminate), + CHIP_NO_ERROR); + EXPECT_EQ(memcmp(&dest[0], &expected[0], sizeof(expected)), 0); // Test Alias CHIP_ERROR retval = BytesToUppercaseHexString(&src[0], sizeof(src), &dest2[0], sizeof(dest2)); printf("retval=%" CHIP_ERROR_FORMAT "\n", retval.Format()); - NL_TEST_ASSERT(inSuite, retval == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(&dest2[0], &expected[0], sizeof(expected)) == 0); + EXPECT_EQ(retval, CHIP_NO_ERROR); + EXPECT_EQ(memcmp(&dest2[0], &expected[0], sizeof(expected)), 0); } // Lowercase @@ -120,15 +116,14 @@ void TestBytesToHexNullTerminated(nlTestSuite * inSuite, void * inContext) char dest[18] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '@' }; char dest2[18] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '@' }; char expected[18] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', '\0', '@' }; - NL_TEST_ASSERT(inSuite, ((sizeof(src) * 2u) + 1u) <= sizeof(dest)); - NL_TEST_ASSERT( - inSuite, BytesToHex(&src[0], sizeof(src), &dest[0], (sizeof(src) * 2u) + 1, HexFlags::kNullTerminate) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(&dest[0], &expected[0], sizeof(expected)) == 0); + EXPECT_LE(((sizeof(src) * 2u) + 1u), sizeof(dest)); + EXPECT_EQ(BytesToHex(&src[0], sizeof(src), &dest[0], (sizeof(src) * 2u) + 1, HexFlags::kNullTerminate), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(&dest[0], &expected[0], sizeof(expected)), 0); // Test Alias - NL_TEST_ASSERT(inSuite, BytesToLowercaseHexString(&src[0], sizeof(src), &dest2[0], sizeof(dest2)) == CHIP_NO_ERROR); + EXPECT_EQ(BytesToLowercaseHexString(&src[0], sizeof(src), &dest2[0], sizeof(dest2)), CHIP_NO_ERROR); printf("->%s\n", dest2); - NL_TEST_ASSERT(inSuite, memcmp(&dest2[0], &expected[0], sizeof(expected)) == 0); + EXPECT_EQ(memcmp(&dest2[0], &expected[0], sizeof(expected)), 0); } // Trivial: Zero size input @@ -136,36 +131,36 @@ void TestBytesToHexNullTerminated(nlTestSuite * inSuite, void * inContext) uint8_t src[] = { 0x00 }; char dest[2] = { '!', '@' }; char expected[2] = { '\0', '@' }; - NL_TEST_ASSERT(inSuite, BytesToHex(&src[0], 0, &dest[0], sizeof(dest), HexFlags::kNullTerminate) == CHIP_NO_ERROR); + EXPECT_EQ(BytesToHex(&src[0], 0, &dest[0], sizeof(dest), HexFlags::kNullTerminate), CHIP_NO_ERROR); // Expect nul termination - NL_TEST_ASSERT(inSuite, memcmp(&dest[0], &expected[0], sizeof(expected)) == 0); + EXPECT_EQ(memcmp(&dest[0], &expected[0], sizeof(expected)), 0); } // Trivial: Zero size input with null buffer { char dest[2] = { '!', '@' }; char expected[2] = { '\0', '@' }; - NL_TEST_ASSERT(inSuite, BytesToHex(nullptr, 0, &dest[0], sizeof(dest), HexFlags::kNullTerminate) == CHIP_NO_ERROR); + EXPECT_EQ(BytesToHex(nullptr, 0, &dest[0], sizeof(dest), HexFlags::kNullTerminate), CHIP_NO_ERROR); // Nothing should have been touched. - NL_TEST_ASSERT(inSuite, memcmp(&dest[0], &expected[0], sizeof(expected)) == 0); + EXPECT_EQ(memcmp(&dest[0], &expected[0], sizeof(expected)), 0); - NL_TEST_ASSERT(inSuite, BytesToHex(nullptr, 0, nullptr, 0, HexFlags::kNullTerminate) == CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_EQ(BytesToHex(nullptr, 0, nullptr, 0, HexFlags::kNullTerminate), CHIP_ERROR_BUFFER_TOO_SMALL); - NL_TEST_ASSERT(inSuite, BytesToHex(nullptr, 0, &dest[0], 1, HexFlags::kNullTerminate) == CHIP_NO_ERROR); + EXPECT_EQ(BytesToHex(nullptr, 0, &dest[0], 1, HexFlags::kNullTerminate), CHIP_NO_ERROR); // Nothing should have been touched. - NL_TEST_ASSERT(inSuite, memcmp(&dest[0], &expected[0], sizeof(expected)) == 0); + EXPECT_EQ(memcmp(&dest[0], &expected[0], sizeof(expected)), 0); - NL_TEST_ASSERT(inSuite, BytesToHex(nullptr, 0, nullptr, 1, HexFlags::kNullTerminate) == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(BytesToHex(nullptr, 0, nullptr, 1, HexFlags::kNullTerminate), CHIP_ERROR_INVALID_ARGUMENT); } } -void TestBytesToHexErrors(nlTestSuite * inSuite, void * inContext) +TEST(TestBytesToHex, TestBytesToHexErrors) { // NULL destination { uint8_t src[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }; char * dest = nullptr; - NL_TEST_ASSERT(inSuite, BytesToHex(&src[0], 0, dest, sizeof(src) * 2u, HexFlags::kNone) == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(BytesToHex(&src[0], 0, dest, sizeof(src) * 2u, HexFlags::kNone), CHIP_ERROR_INVALID_ARGUMENT); } // Destination buffer too small for non-null-terminated @@ -173,12 +168,10 @@ void TestBytesToHexErrors(nlTestSuite * inSuite, void * inContext) uint8_t src[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }; char dest[18] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '@' }; char expected[18] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '@' }; - NL_TEST_ASSERT(inSuite, ((sizeof(src) * 2u) + 1u) <= sizeof(dest)); - NL_TEST_ASSERT(inSuite, - BytesToHex(&src[0], sizeof(src), &dest[0], (sizeof(src) * 2u) - 1, HexFlags::kNone) == - CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_LE(((sizeof(src) * 2u) + 1u), sizeof(dest)); + EXPECT_EQ(BytesToHex(&src[0], sizeof(src), &dest[0], (sizeof(src) * 2u) - 1, HexFlags::kNone), CHIP_ERROR_BUFFER_TOO_SMALL); // Ensure output not touched - NL_TEST_ASSERT(inSuite, memcmp(&dest[0], &expected[0], sizeof(expected)) == 0); + EXPECT_EQ(memcmp(&dest[0], &expected[0], sizeof(expected)), 0); } // Destination buffer too small for null-terminated @@ -186,12 +179,11 @@ void TestBytesToHexErrors(nlTestSuite * inSuite, void * inContext) uint8_t src[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }; char dest[18] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '@' }; char expected[18] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '@' }; - NL_TEST_ASSERT(inSuite, ((sizeof(src) * 2u) + 1u) <= sizeof(dest)); - NL_TEST_ASSERT(inSuite, - BytesToHex(&src[0], sizeof(src), &dest[0], (sizeof(src) * 2u), HexFlags::kNullTerminate) == - CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_LE(((sizeof(src) * 2u) + 1u), sizeof(dest)); + EXPECT_EQ(BytesToHex(&src[0], sizeof(src), &dest[0], (sizeof(src) * 2u), HexFlags::kNullTerminate), + CHIP_ERROR_BUFFER_TOO_SMALL); // Ensure output not touched - NL_TEST_ASSERT(inSuite, memcmp(&dest[0], &expected[0], sizeof(expected)) == 0); + EXPECT_EQ(memcmp(&dest[0], &expected[0], sizeof(expected)), 0); } // Writing in a larger buffer is fine, bytes past the nul terminator (when requested) are untouched. @@ -199,10 +191,9 @@ void TestBytesToHexErrors(nlTestSuite * inSuite, void * inContext) uint8_t src[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }; char dest[18] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '@' }; char expected[18] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', '\0', '@' }; - NL_TEST_ASSERT(inSuite, ((sizeof(src) * 2u) + 1u) < sizeof(dest)); - NL_TEST_ASSERT(inSuite, - BytesToHex(&src[0], sizeof(src), &dest[0], sizeof(dest), HexFlags::kNullTerminate) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(&dest[0], &expected[0], sizeof(expected)) == 0); + EXPECT_LT(((sizeof(src) * 2u) + 1u), sizeof(dest)); + EXPECT_EQ(BytesToHex(&src[0], sizeof(src), &dest[0], sizeof(dest), HexFlags::kNullTerminate), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(&dest[0], &expected[0], sizeof(expected)), 0); } // Source size that would not fit in any output using size_t @@ -210,18 +201,16 @@ void TestBytesToHexErrors(nlTestSuite * inSuite, void * inContext) uint8_t src[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }; char dest[18] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '@' }; char expected[18] = { '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '!', '@' }; - NL_TEST_ASSERT(inSuite, - BytesToHex(&src[0], SIZE_MAX / 2u, &dest[0], sizeof(dest), HexFlags::kNullTerminate) == - CHIP_ERROR_BUFFER_TOO_SMALL); - NL_TEST_ASSERT(inSuite, memcmp(&dest[0], &expected[0], sizeof(expected)) == 0); - - NL_TEST_ASSERT(inSuite, - BytesToHex(&src[0], SIZE_MAX / 2u, &dest[0], sizeof(dest), HexFlags::kNone) == CHIP_ERROR_BUFFER_TOO_SMALL); - NL_TEST_ASSERT(inSuite, memcmp(&dest[0], &expected[0], sizeof(expected)) == 0); + EXPECT_EQ(BytesToHex(&src[0], SIZE_MAX / 2u, &dest[0], sizeof(dest), HexFlags::kNullTerminate), + CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_EQ(memcmp(&dest[0], &expected[0], sizeof(expected)), 0); + + EXPECT_EQ(BytesToHex(&src[0], SIZE_MAX / 2u, &dest[0], sizeof(dest), HexFlags::kNone), CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_EQ(memcmp(&dest[0], &expected[0], sizeof(expected)), 0); } } -void TestBytesToHexUint64(nlTestSuite * inSuite, void * inContext) +TEST(TestBytesToHex, TestBytesToHexUint64) { // Different values in each byte and each nibble should let us know if the conversion is correct. uint64_t test = 0x0123456789ABCDEF; @@ -237,62 +226,54 @@ void TestBytesToHexUint64(nlTestSuite * inSuite, void * inContext) // Lower case - uint64_t. memset(buf, 1, sizeof(buf)); - NL_TEST_ASSERT(inSuite, Uint64ToHex(test, buf, sizeof(buf), HexFlags::kNone) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(buf, lowerExpected, strlen(lowerExpected)) == 0); + EXPECT_EQ(Uint64ToHex(test, buf, sizeof(buf), HexFlags::kNone), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(buf, lowerExpected, strlen(lowerExpected)), 0); // No null termination. - NL_TEST_ASSERT(inSuite, buf[16] == 1); + EXPECT_EQ(buf[16], 1); // Lower case - uint32_t. memset(buf, 1, sizeof(buf)); - NL_TEST_ASSERT(inSuite, Uint32ToHex(test32_0, buf, sizeof(uint32_t) * 2, HexFlags::kNone) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, - Uint32ToHex(test32_1, &buf[sizeof(uint32_t) * 2], sizeof(uint32_t) * 2, HexFlags::kNone) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(buf, lowerExpected, strlen(lowerExpected)) == 0); + EXPECT_EQ(Uint32ToHex(test32_0, buf, sizeof(uint32_t) * 2, HexFlags::kNone), CHIP_NO_ERROR); + EXPECT_EQ(Uint32ToHex(test32_1, &buf[sizeof(uint32_t) * 2], sizeof(uint32_t) * 2, HexFlags::kNone), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(buf, lowerExpected, strlen(lowerExpected)), 0); // No null termination. - NL_TEST_ASSERT(inSuite, buf[16] == 1); + EXPECT_EQ(buf[16], 1); // Upper case - uint64_t. memset(buf, 1, sizeof(buf)); - NL_TEST_ASSERT(inSuite, Uint64ToHex(test, buf, sizeof(buf), HexFlags::kUppercase) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(buf, upperExpected, strlen(upperExpected)) == 0); + EXPECT_EQ(Uint64ToHex(test, buf, sizeof(buf), HexFlags::kUppercase), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(buf, upperExpected, strlen(upperExpected)), 0); // No null termination. - NL_TEST_ASSERT(inSuite, buf[16] == 1); + EXPECT_EQ(buf[16], 1); // Upper case - uint16_t. memset(buf, 1, sizeof(buf)); - NL_TEST_ASSERT(inSuite, Uint16ToHex(test16_0, buf, sizeof(uint16_t) * 2, HexFlags::kUppercase) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, - Uint16ToHex(test16_1, &buf[sizeof(uint16_t) * 2 * 1], sizeof(uint16_t) * 2, HexFlags::kUppercase) == - CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, - Uint16ToHex(test16_2, &buf[sizeof(uint16_t) * 2 * 2], sizeof(uint16_t) * 2, HexFlags::kUppercase) == - CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, - Uint16ToHex(test16_3, &buf[sizeof(uint16_t) * 2 * 3], sizeof(uint16_t) * 2, HexFlags::kUppercase) == - CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(buf, upperExpected, strlen(upperExpected)) == 0); + EXPECT_EQ(Uint16ToHex(test16_0, buf, sizeof(uint16_t) * 2, HexFlags::kUppercase), CHIP_NO_ERROR); + EXPECT_EQ(Uint16ToHex(test16_1, &buf[sizeof(uint16_t) * 2 * 1], sizeof(uint16_t) * 2, HexFlags::kUppercase), CHIP_NO_ERROR); + EXPECT_EQ(Uint16ToHex(test16_2, &buf[sizeof(uint16_t) * 2 * 2], sizeof(uint16_t) * 2, HexFlags::kUppercase), CHIP_NO_ERROR); + EXPECT_EQ(Uint16ToHex(test16_3, &buf[sizeof(uint16_t) * 2 * 3], sizeof(uint16_t) * 2, HexFlags::kUppercase), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(buf, upperExpected, strlen(upperExpected)), 0); // No null termination. - NL_TEST_ASSERT(inSuite, buf[16] == 1); + EXPECT_EQ(buf[16], 1); // Lower case with null termination. memset(buf, 1, sizeof(buf)); - NL_TEST_ASSERT(inSuite, Uint64ToHex(test, buf, sizeof(buf), HexFlags::kNullTerminate) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(buf, lowerExpected, sizeof(lowerExpected)) == 0); + EXPECT_EQ(Uint64ToHex(test, buf, sizeof(buf), HexFlags::kNullTerminate), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(buf, lowerExpected, sizeof(lowerExpected)), 0); // Upper case with null termination. memset(buf, 1, sizeof(buf)); - NL_TEST_ASSERT(inSuite, Uint64ToHex(test, buf, sizeof(buf), HexFlags::kUppercaseAndNullTerminate) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(buf, upperExpected, sizeof(upperExpected)) == 0); + EXPECT_EQ(Uint64ToHex(test, buf, sizeof(buf), HexFlags::kUppercaseAndNullTerminate), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(buf, upperExpected, sizeof(upperExpected)), 0); // Too small buffer - NL_TEST_ASSERT(inSuite, Uint64ToHex(test, buf, sizeof(buf) - 2, HexFlags::kNone) == CHIP_ERROR_BUFFER_TOO_SMALL); - NL_TEST_ASSERT(inSuite, Uint64ToHex(test, buf, sizeof(buf) - 2, HexFlags::kUppercase) == CHIP_ERROR_BUFFER_TOO_SMALL); - NL_TEST_ASSERT(inSuite, Uint64ToHex(test, buf, sizeof(buf) - 1, HexFlags::kNullTerminate) == CHIP_ERROR_BUFFER_TOO_SMALL); - NL_TEST_ASSERT(inSuite, - Uint64ToHex(test, buf, sizeof(buf) - 1, HexFlags::kUppercaseAndNullTerminate) == CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_EQ(Uint64ToHex(test, buf, sizeof(buf) - 2, HexFlags::kNone), CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_EQ(Uint64ToHex(test, buf, sizeof(buf) - 2, HexFlags::kUppercase), CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_EQ(Uint64ToHex(test, buf, sizeof(buf) - 1, HexFlags::kNullTerminate), CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_EQ(Uint64ToHex(test, buf, sizeof(buf) - 1, HexFlags::kUppercaseAndNullTerminate), CHIP_ERROR_BUFFER_TOO_SMALL); } -void TestHexToBytesAndUint(nlTestSuite * inSuite, void * inContext) +TEST(TestBytesToHex, TestHexToBytesAndUint) { // Different values in each byte and each nibble should let us know if the conversion is correct. char hexInLowercase[] = "0123456789abcdef"; @@ -310,32 +291,32 @@ void TestHexToBytesAndUint(nlTestSuite * inSuite, void * inContext) // Lower case - bytes. memset(buf, 0, sizeof(buf)); - NL_TEST_ASSERT(inSuite, HexToBytes(hexInLowercase, strlen(hexInLowercase), buf, sizeof(buf)) == sizeof(buf)); - NL_TEST_ASSERT(inSuite, memcmp(buf, bytesOutExpected, sizeof(buf)) == 0); + EXPECT_EQ(HexToBytes(hexInLowercase, strlen(hexInLowercase), buf, sizeof(buf)), sizeof(buf)); + EXPECT_EQ(memcmp(buf, bytesOutExpected, sizeof(buf)), 0); // Upper case - bytes. memset(buf, 0, sizeof(buf)); - NL_TEST_ASSERT(inSuite, HexToBytes(hexInUppercase, strlen(hexInUppercase), buf, sizeof(buf)) == sizeof(buf)); - NL_TEST_ASSERT(inSuite, memcmp(buf, bytesOutExpected, sizeof(buf)) == 0); + EXPECT_EQ(HexToBytes(hexInUppercase, strlen(hexInUppercase), buf, sizeof(buf)), sizeof(buf)); + EXPECT_EQ(memcmp(buf, bytesOutExpected, sizeof(buf)), 0); // Lower case - uint64_t. test64Out = 0; - NL_TEST_ASSERT(inSuite, UppercaseHexToUint64(hexInLowercase, strlen(hexInLowercase), test64Out) == 0); + EXPECT_EQ(UppercaseHexToUint64(hexInLowercase, strlen(hexInLowercase), test64Out), 0u); // Upper case - uint64_t. test64Out = 0; - NL_TEST_ASSERT(inSuite, UppercaseHexToUint64(hexInUppercase, strlen(hexInUppercase), test64Out) == sizeof(uint64_t)); - NL_TEST_ASSERT(inSuite, test64Out == test64OutExpected); + EXPECT_EQ(UppercaseHexToUint64(hexInUppercase, strlen(hexInUppercase), test64Out), sizeof(uint64_t)); + EXPECT_EQ(test64Out, test64OutExpected); // Upper case - uint32_t. test32Out = 0; - NL_TEST_ASSERT(inSuite, UppercaseHexToUint32(hexInUppercase32, strlen(hexInUppercase32), test32Out) == sizeof(uint32_t)); - NL_TEST_ASSERT(inSuite, test32Out == test32OutExpected); + EXPECT_EQ(UppercaseHexToUint32(hexInUppercase32, strlen(hexInUppercase32), test32Out), sizeof(uint32_t)); + EXPECT_EQ(test32Out, test32OutExpected); // Upper case - uint16_t. test16Out = 0; - NL_TEST_ASSERT(inSuite, UppercaseHexToUint16(hexInUppercase16, strlen(hexInUppercase16), test16Out) == sizeof(uint16_t)); - NL_TEST_ASSERT(inSuite, test16Out == test16OutExpected); + EXPECT_EQ(UppercaseHexToUint16(hexInUppercase16, strlen(hexInUppercase16), test16Out), sizeof(uint16_t)); + EXPECT_EQ(test16Out, test16OutExpected); } #if CHIP_PROGRESS_LOGGING @@ -351,9 +332,9 @@ ENFORCE_FORMAT(3, 0) void AccumulateLogLineCallback(const char * module, uint8_t gRedirectedLogLines.push_back(std::string(line)); } -void ValidateTextMatches(nlTestSuite * inSuite, const char ** expected, size_t numLines, const std::vector<std::string> & candidate) +void ValidateTextMatches(const char ** expected, size_t numLines, const std::vector<std::string> & candidate) { - NL_TEST_ASSERT(inSuite, candidate.size() == numLines); + EXPECT_EQ(candidate.size(), numLines); if (candidate.size() != numLines) { return; @@ -361,7 +342,7 @@ void ValidateTextMatches(nlTestSuite * inSuite, const char ** expected, size_t n for (size_t idx = 0; idx < numLines; idx++) { printf("Checking '%s' against '%s'\n", candidate.at(idx).c_str(), expected[idx]); - NL_TEST_ASSERT(inSuite, candidate.at(idx) == expected[idx]); + EXPECT_EQ(candidate.at(idx), expected[idx]); if (candidate.at(idx) != expected[idx]) { return; @@ -369,7 +350,7 @@ void ValidateTextMatches(nlTestSuite * inSuite, const char ** expected, size_t n } } -void TestLogBufferAsHex(nlTestSuite * inSuite, void * inContext) +TEST(TestBytesToHex, TestLogBufferAsHex) { const char * kExpectedText1[] = { ">>>A54A39294B28886E8BFC15B44105A3FD22745225983A753E6BB82DA7C62493BF", @@ -425,31 +406,9 @@ void TestLogBufferAsHex(nlTestSuite * inSuite, void * inContext) LogBufferAsHex(testCase.label, testCase.buffer); } chip::Logging::SetLogRedirectCallback(nullptr); - ValidateTextMatches(inSuite, testCase.expectedText, testCase.numLines, gRedirectedLogLines); + ValidateTextMatches(testCase.expectedText, testCase.numLines, gRedirectedLogLines); } } #endif - -const nlTest sTests[] = { - NL_TEST_DEF("TestBytesToHexNotNullTerminated", TestBytesToHexNotNullTerminated), // - NL_TEST_DEF("TestBytesToHexNullTerminated", TestBytesToHexNullTerminated), // - NL_TEST_DEF("TestBytesToHexErrors", TestBytesToHexErrors), // - NL_TEST_DEF("TestBytesToHexUint64", TestBytesToHexUint64), // - NL_TEST_DEF("TestHexToBytesAndUint", TestHexToBytesAndUint), // -#if CHIP_PROGRESS_LOGGING - NL_TEST_DEF("TestLogBufferAsHex", TestLogBufferAsHex), // -#endif - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestBytesToHex() -{ - nlTestSuite theSuite = { "BytesToHex", sTests, nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestBytesToHex) diff --git a/src/lib/support/tests/TestSafeString.cpp b/src/lib/support/tests/TestSafeString.cpp index 2dc52d38a6754e..09e7d89e4054f7 100644 --- a/src/lib/support/tests/TestSafeString.cpp +++ b/src/lib/support/tests/TestSafeString.cpp @@ -22,45 +22,27 @@ * */ -#include <lib/support/SafeString.h> -#include <lib/support/UnitTestRegistration.h> +#include <gtest/gtest.h> -#include <nlunit-test.h> +#include <lib/support/SafeString.h> using namespace chip; -static void TestMaxStringLength(nlTestSuite * inSuite, void * inContext) +TEST(TestSafeString, TestMaxStringLength) { constexpr size_t len = MaxStringLength("a", "bc", "def"); - NL_TEST_ASSERT(inSuite, len == 3); + EXPECT_EQ(len, 3u); - NL_TEST_ASSERT(inSuite, MaxStringLength("bc") == 2); + EXPECT_EQ(MaxStringLength("bc"), 2u); - NL_TEST_ASSERT(inSuite, MaxStringLength("def", "bc", "a") == 3); + EXPECT_EQ(MaxStringLength("def", "bc", "a"), 3u); - NL_TEST_ASSERT(inSuite, MaxStringLength("") == 0); -} - -static void TestTotalStringLength(nlTestSuite * inSuite, void * inContext) -{ - NL_TEST_ASSERT(inSuite, TotalStringLength("") == 0); - NL_TEST_ASSERT(inSuite, TotalStringLength("a") == 1); - NL_TEST_ASSERT(inSuite, TotalStringLength("def", "bc", "a") == 6); + EXPECT_EQ(MaxStringLength(""), 0u); } -#define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn) -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { NL_TEST_DEF_FN(TestMaxStringLength), NL_TEST_DEF_FN(TestTotalStringLength), NL_TEST_SENTINEL() }; - -int TestSafeString() +TEST(TestSafeString, TestTotalStringLength) { - nlTestSuite theSuite = { "CHIP SafeString tests", &sTests[0], nullptr, nullptr }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); + EXPECT_EQ(TotalStringLength(""), 0u); + EXPECT_EQ(TotalStringLength("a"), 1u); + EXPECT_EQ(TotalStringLength("def", "bc", "a"), 6u); } - -CHIP_REGISTER_TEST_SUITE(TestSafeString) diff --git a/src/lib/support/tests/TestScoped.cpp b/src/lib/support/tests/TestScoped.cpp index 90cdd62b0acf4a..fef70a443dcfb1 100644 --- a/src/lib/support/tests/TestScoped.cpp +++ b/src/lib/support/tests/TestScoped.cpp @@ -16,87 +16,66 @@ * limitations under the License. */ -#include <lib/support/Scoped.h> -#include <lib/support/UnitTestRegistration.h> - -#include <nlunit-test.h> #include <string.h> +#include <gtest/gtest.h> + +#include <lib/support/Scoped.h> + namespace { using namespace chip; -void TestScopedVariableChange(nlTestSuite * inSuite, void * inContext) +TEST(TestScoped, TestScopedVariableChange) { int x = 123; { ScopedChange change1(x, 10); - NL_TEST_ASSERT(inSuite, x == 10); + EXPECT_EQ(x, 10); x = 15; { ScopedChange change2(x, 20); - NL_TEST_ASSERT(inSuite, x == 20); + EXPECT_EQ(x, 20); } - NL_TEST_ASSERT(inSuite, x == 15); + EXPECT_EQ(x, 15); } - NL_TEST_ASSERT(inSuite, x == 123); + EXPECT_EQ(x, 123); } -void TestScopedChangeOnly(nlTestSuite * inSuite, void * inContext) +TEST(TestScoped, TestScopedChangeOnly) { ScopedChangeOnly intValue(123); ScopedChangeOnly strValue("abc"); - NL_TEST_ASSERT(inSuite, intValue == 123); - NL_TEST_ASSERT(inSuite, strcmp(strValue, "abc") == 0); + EXPECT_EQ(intValue, 123); + EXPECT_STREQ(strValue, "abc"); { ScopedChange change1(intValue, 234); - NL_TEST_ASSERT(inSuite, intValue == 234); - NL_TEST_ASSERT(inSuite, strcmp(strValue, "abc") == 0); + EXPECT_EQ(intValue, 234); + EXPECT_STREQ(strValue, "abc"); ScopedChange change2(strValue, "xyz"); - NL_TEST_ASSERT(inSuite, intValue == 234); - NL_TEST_ASSERT(inSuite, strcmp(strValue, "xyz") == 0); + EXPECT_EQ(intValue, 234); + EXPECT_STREQ(strValue, "xyz"); { ScopedChange change3(intValue, 10); ScopedChange change4(strValue, "test"); - NL_TEST_ASSERT(inSuite, intValue == 10); - NL_TEST_ASSERT(inSuite, strcmp(strValue, "test") == 0); + EXPECT_EQ(intValue, 10); + EXPECT_STREQ(strValue, "test"); } - NL_TEST_ASSERT(inSuite, intValue == 234); - NL_TEST_ASSERT(inSuite, strcmp(strValue, "xyz") == 0); + EXPECT_EQ(intValue, 234); + EXPECT_STREQ(strValue, "xyz"); } - NL_TEST_ASSERT(inSuite, intValue == 123); - NL_TEST_ASSERT(inSuite, strcmp(strValue, "abc") == 0); + EXPECT_EQ(intValue, 123); + EXPECT_STREQ(strValue, "abc"); } } // namespace - -#define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn) -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { - NL_TEST_DEF_FN(TestScopedVariableChange), // - NL_TEST_DEF_FN(TestScopedChangeOnly), // - NL_TEST_SENTINEL() // -}; - -int TestScoped() -{ - nlTestSuite theSuite = { "CHIP Scoped tests", &sTests[0], nullptr, nullptr }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestScoped) diff --git a/src/lib/support/tests/TestSpan.cpp b/src/lib/support/tests/TestSpan.cpp index 87f52ae9bec4d2..6849138861065c 100644 --- a/src/lib/support/tests/TestSpan.cpp +++ b/src/lib/support/tests/TestSpan.cpp @@ -22,256 +22,255 @@ * */ -#include <lib/support/Span.h> -#include <lib/support/UnitTestRegistration.h> +#include <array> -#include <nlunit-test.h> +#include <gtest/gtest.h> -#include <array> +#include <lib/support/Span.h> using namespace chip; -static void TestByteSpan(nlTestSuite * inSuite, void * inContext) +TEST(TestSpan, TestByteSpan) { uint8_t arr[] = { 1, 2, 3 }; ByteSpan s0 = ByteSpan(); - NL_TEST_ASSERT(inSuite, s0.size() == 0); - NL_TEST_ASSERT(inSuite, s0.empty()); - NL_TEST_ASSERT(inSuite, s0.data_equal(s0)); + EXPECT_EQ(s0.size(), 0u); + EXPECT_TRUE(s0.empty()); + EXPECT_TRUE(s0.data_equal(s0)); ByteSpan s1(arr, 2); - NL_TEST_ASSERT(inSuite, s1.data() == arr); - NL_TEST_ASSERT(inSuite, s1.size() == 2); - NL_TEST_ASSERT(inSuite, !s1.empty()); - NL_TEST_ASSERT(inSuite, s1.data_equal(s1)); - NL_TEST_ASSERT(inSuite, !s1.data_equal(s0)); + EXPECT_EQ(s1.data(), arr); + EXPECT_EQ(s1.size(), 2u); + EXPECT_FALSE(s1.empty()); + EXPECT_TRUE(s1.data_equal(s1)); + EXPECT_FALSE(s1.data_equal(s0)); ByteSpan s2(arr); - NL_TEST_ASSERT(inSuite, s2.data() == arr); - NL_TEST_ASSERT(inSuite, s2.size() == 3); - NL_TEST_ASSERT(inSuite, s2.data()[2] == 3); - NL_TEST_ASSERT(inSuite, !s2.empty()); - NL_TEST_ASSERT(inSuite, s2.data_equal(s2)); - NL_TEST_ASSERT(inSuite, !s2.data_equal(s1)); - NL_TEST_ASSERT(inSuite, s2.front() == 1); - NL_TEST_ASSERT(inSuite, s2.back() == 3); - NL_TEST_ASSERT(inSuite, s2[0] == 1); - NL_TEST_ASSERT(inSuite, s2[1] == 2); - NL_TEST_ASSERT(inSuite, s2[2] == 3); + EXPECT_EQ(s2.data(), arr); + EXPECT_EQ(s2.size(), 3u); + EXPECT_EQ(s2.data()[2], 3u); + EXPECT_FALSE(s2.empty()); + EXPECT_TRUE(s2.data_equal(s2)); + EXPECT_FALSE(s2.data_equal(s1)); + EXPECT_EQ(s2.front(), 1u); + EXPECT_EQ(s2.back(), 3u); + EXPECT_EQ(s2[0], 1u); + EXPECT_EQ(s2[1], 2u); + EXPECT_EQ(s2[2], 3u); ByteSpan s3 = s2; - NL_TEST_ASSERT(inSuite, s3.data() == arr); - NL_TEST_ASSERT(inSuite, s3.size() == 3); - NL_TEST_ASSERT(inSuite, s3.data()[2] == 3); - NL_TEST_ASSERT(inSuite, !s3.empty()); - NL_TEST_ASSERT(inSuite, s3.data_equal(s2)); + EXPECT_EQ(s3.data(), arr); + EXPECT_EQ(s3.size(), 3u); + EXPECT_EQ(s3.data()[2], 3u); + EXPECT_FALSE(s3.empty()); + EXPECT_TRUE(s3.data_equal(s2)); uint8_t arr2[] = { 3, 2, 1 }; ByteSpan s4(arr2); - NL_TEST_ASSERT(inSuite, !s4.data_equal(s2)); + EXPECT_FALSE(s4.data_equal(s2)); ByteSpan s5(arr2, 0); - NL_TEST_ASSERT(inSuite, s5.data() != nullptr); - NL_TEST_ASSERT(inSuite, !s5.data_equal(s4)); - NL_TEST_ASSERT(inSuite, s5.data_equal(s0)); - NL_TEST_ASSERT(inSuite, s0.data_equal(s5)); + EXPECT_NE(s5.data(), nullptr); + EXPECT_FALSE(s5.data_equal(s4)); + EXPECT_TRUE(s5.data_equal(s0)); + EXPECT_TRUE(s0.data_equal(s5)); ByteSpan s6(arr2); s6.reduce_size(2); - NL_TEST_ASSERT(inSuite, s6.size() == 2); + EXPECT_EQ(s6.size(), 2u); ByteSpan s7(arr2, 2); - NL_TEST_ASSERT(inSuite, s6.data_equal(s7)); - NL_TEST_ASSERT(inSuite, s7.data_equal(s6)); + EXPECT_TRUE(s6.data_equal(s7)); + EXPECT_TRUE(s7.data_equal(s6)); } -static void TestMutableByteSpan(nlTestSuite * inSuite, void * inContext) +TEST(TestSpan, TestMutableByteSpan) { uint8_t arr[] = { 1, 2, 3 }; MutableByteSpan s0 = MutableByteSpan(); - NL_TEST_ASSERT(inSuite, s0.size() == 0); - NL_TEST_ASSERT(inSuite, s0.empty()); - NL_TEST_ASSERT(inSuite, s0.data_equal(s0)); + EXPECT_EQ(s0.size(), 0u); + EXPECT_TRUE(s0.empty()); + EXPECT_TRUE(s0.data_equal(s0)); MutableByteSpan s1(arr, 2); - NL_TEST_ASSERT(inSuite, s1.data() == arr); - NL_TEST_ASSERT(inSuite, s1.size() == 2); - NL_TEST_ASSERT(inSuite, !s1.empty()); - NL_TEST_ASSERT(inSuite, s1.data_equal(s1)); - NL_TEST_ASSERT(inSuite, !s1.data_equal(s0)); + EXPECT_EQ(s1.data(), arr); + EXPECT_EQ(s1.size(), 2u); + EXPECT_FALSE(s1.empty()); + EXPECT_TRUE(s1.data_equal(s1)); + EXPECT_FALSE(s1.data_equal(s0)); MutableByteSpan s2(arr); - NL_TEST_ASSERT(inSuite, s2.data() == arr); - NL_TEST_ASSERT(inSuite, s2.size() == 3); - NL_TEST_ASSERT(inSuite, s2.data()[2] == 3); - NL_TEST_ASSERT(inSuite, !s2.empty()); - NL_TEST_ASSERT(inSuite, s2.data_equal(s2)); - NL_TEST_ASSERT(inSuite, !s2.data_equal(s1)); + EXPECT_EQ(s2.data(), arr); + EXPECT_EQ(s2.size(), 3u); + EXPECT_EQ(s2.data()[2], 3u); + EXPECT_FALSE(s2.empty()); + EXPECT_TRUE(s2.data_equal(s2)); + EXPECT_FALSE(s2.data_equal(s1)); MutableByteSpan s3 = s2; - NL_TEST_ASSERT(inSuite, s3.data() == arr); - NL_TEST_ASSERT(inSuite, s3.size() == 3); - NL_TEST_ASSERT(inSuite, s3.data()[2] == 3); - NL_TEST_ASSERT(inSuite, !s3.empty()); - NL_TEST_ASSERT(inSuite, s3.data_equal(s2)); + EXPECT_EQ(s3.data(), arr); + EXPECT_EQ(s3.size(), 3u); + EXPECT_EQ(s3.data()[2], 3u); + EXPECT_FALSE(s3.empty()); + EXPECT_TRUE(s3.data_equal(s2)); uint8_t arr2[] = { 3, 2, 1 }; MutableByteSpan s4(arr2); - NL_TEST_ASSERT(inSuite, !s4.data_equal(s2)); + EXPECT_FALSE(s4.data_equal(s2)); MutableByteSpan s5(arr2, 0); - NL_TEST_ASSERT(inSuite, s5.data() != nullptr); - NL_TEST_ASSERT(inSuite, !s5.data_equal(s4)); - NL_TEST_ASSERT(inSuite, s5.data_equal(s0)); - NL_TEST_ASSERT(inSuite, s0.data_equal(s5)); + EXPECT_NE(s5.data(), nullptr); + EXPECT_FALSE(s5.data_equal(s4)); + EXPECT_TRUE(s5.data_equal(s0)); + EXPECT_TRUE(s0.data_equal(s5)); MutableByteSpan s6(arr2); s6.reduce_size(2); - NL_TEST_ASSERT(inSuite, s6.size() == 2); + EXPECT_EQ(s6.size(), 2u); MutableByteSpan s7(arr2, 2); - NL_TEST_ASSERT(inSuite, s6.data_equal(s7)); - NL_TEST_ASSERT(inSuite, s7.data_equal(s6)); + EXPECT_TRUE(s6.data_equal(s7)); + EXPECT_TRUE(s7.data_equal(s6)); uint8_t arr3[] = { 1, 2, 3 }; MutableByteSpan s8(arr3); - NL_TEST_ASSERT(inSuite, arr3[1] == 2); + EXPECT_EQ(arr3[1], 2u); s8.data()[1] = 3; - NL_TEST_ASSERT(inSuite, arr3[1] == 3); + EXPECT_EQ(arr3[1], 3u); // Not mutable span on purpose, to test conversion. ByteSpan s9 = s8; - NL_TEST_ASSERT(inSuite, s9.data_equal(s8)); - NL_TEST_ASSERT(inSuite, s8.data_equal(s9)); + EXPECT_TRUE(s9.data_equal(s8)); + EXPECT_TRUE(s8.data_equal(s9)); // Not mutable span on purpose. ByteSpan s10(s8); - NL_TEST_ASSERT(inSuite, s10.data_equal(s8)); - NL_TEST_ASSERT(inSuite, s8.data_equal(s10)); + EXPECT_TRUE(s10.data_equal(s8)); + EXPECT_TRUE(s8.data_equal(s10)); } -static void TestFixedByteSpan(nlTestSuite * inSuite, void * inContext) +TEST(TestSpan, TestFixedByteSpan) { uint8_t arr[] = { 1, 2, 3 }; FixedByteSpan<3> s0 = FixedByteSpan<3>(); - NL_TEST_ASSERT(inSuite, s0.data() != nullptr); - NL_TEST_ASSERT(inSuite, s0.size() == 3); - NL_TEST_ASSERT(inSuite, s0.data_equal(s0)); - NL_TEST_ASSERT(inSuite, s0[0] == 0); - NL_TEST_ASSERT(inSuite, s0[1] == 0); - NL_TEST_ASSERT(inSuite, s0[2] == 0); + EXPECT_NE(s0.data(), nullptr); + EXPECT_EQ(s0.size(), 3u); + EXPECT_TRUE(s0.data_equal(s0)); + EXPECT_EQ(s0[0], 0u); + EXPECT_EQ(s0[1], 0u); + EXPECT_EQ(s0[2], 0u); FixedByteSpan<2> s1(arr); - NL_TEST_ASSERT(inSuite, s1.data() == arr); - NL_TEST_ASSERT(inSuite, s1.size() == 2); - NL_TEST_ASSERT(inSuite, s1.data_equal(s1)); + EXPECT_EQ(s1.data(), arr); + EXPECT_EQ(s1.size(), 2u); + EXPECT_TRUE(s1.data_equal(s1)); FixedByteSpan<3> s2(arr); - NL_TEST_ASSERT(inSuite, s2.data() == arr); - NL_TEST_ASSERT(inSuite, s2.size() == 3); - NL_TEST_ASSERT(inSuite, s2.data()[2] == 3); - NL_TEST_ASSERT(inSuite, s2.data_equal(s2)); - NL_TEST_ASSERT(inSuite, s2.front() == 1); - NL_TEST_ASSERT(inSuite, s2.back() == 3); - NL_TEST_ASSERT(inSuite, s2[0] == 1); - NL_TEST_ASSERT(inSuite, s2[1] == 2); - NL_TEST_ASSERT(inSuite, s2[2] == 3); + EXPECT_EQ(s2.data(), arr); + EXPECT_EQ(s2.size(), 3u); + EXPECT_EQ(s2.data()[2], 3u); + EXPECT_TRUE(s2.data_equal(s2)); + EXPECT_EQ(s2.front(), 1u); + EXPECT_EQ(s2.back(), 3u); + EXPECT_EQ(s2[0], 1u); + EXPECT_EQ(s2[1], 2u); + EXPECT_EQ(s2[2], 3u); FixedByteSpan<3> s3 = s2; - NL_TEST_ASSERT(inSuite, s3.data() == arr); - NL_TEST_ASSERT(inSuite, s3.size() == 3); - NL_TEST_ASSERT(inSuite, s3.data()[2] == 3); - NL_TEST_ASSERT(inSuite, s3.data_equal(s2)); + EXPECT_EQ(s3.data(), arr); + EXPECT_EQ(s3.size(), 3u); + EXPECT_EQ(s3.data()[2], 3u); + EXPECT_TRUE(s3.data_equal(s2)); uint8_t arr2[] = { 3, 2, 1 }; FixedSpan<uint8_t, 3> s4(arr2); - NL_TEST_ASSERT(inSuite, !s4.data_equal(s2)); + EXPECT_FALSE(s4.data_equal(s2)); size_t idx = 0; for (auto & entry : s4) { - NL_TEST_ASSERT(inSuite, entry == arr2[idx++]); + EXPECT_EQ(entry, arr2[idx++]); } - NL_TEST_ASSERT(inSuite, idx == 3); + EXPECT_EQ(idx, 3u); FixedByteSpan<3> s5(arr2); - NL_TEST_ASSERT(inSuite, s5.data_equal(s4)); - NL_TEST_ASSERT(inSuite, s4.data_equal(s5)); + EXPECT_TRUE(s5.data_equal(s4)); + EXPECT_TRUE(s4.data_equal(s5)); FixedByteSpan<2> s6(s4); idx = 0; for (auto & entry : s6) { - NL_TEST_ASSERT(inSuite, entry == arr2[idx++]); + EXPECT_EQ(entry, arr2[idx++]); } - NL_TEST_ASSERT(inSuite, idx == 2); + EXPECT_EQ(idx, 2u); // Not fixed, to test conversion. ByteSpan s7(s4); - NL_TEST_ASSERT(inSuite, s7.data_equal(s4)); - NL_TEST_ASSERT(inSuite, s4.data_equal(s7)); + EXPECT_TRUE(s7.data_equal(s4)); + EXPECT_TRUE(s4.data_equal(s7)); MutableByteSpan s8(s4); - NL_TEST_ASSERT(inSuite, s8.data_equal(s4)); - NL_TEST_ASSERT(inSuite, s4.data_equal(s8)); + EXPECT_TRUE(s8.data_equal(s4)); + EXPECT_TRUE(s4.data_equal(s8)); } -static void TestSpanOfPointers(nlTestSuite * inSuite, void * inContext) +TEST(TestSpan, TestSpanOfPointers) { uint8_t x = 5; uint8_t * ptrs[] = { &x, &x }; Span<uint8_t *> s1(ptrs); Span<uint8_t * const> s2(s1); - NL_TEST_ASSERT(inSuite, s1.data_equal(s2)); - NL_TEST_ASSERT(inSuite, s2.data_equal(s1)); + EXPECT_TRUE(s1.data_equal(s2)); + EXPECT_TRUE(s2.data_equal(s1)); FixedSpan<uint8_t *, 2> s3(ptrs); FixedSpan<uint8_t * const, 2> s4(s3); - NL_TEST_ASSERT(inSuite, s1.data_equal(s3)); - NL_TEST_ASSERT(inSuite, s3.data_equal(s1)); + EXPECT_TRUE(s1.data_equal(s3)); + EXPECT_TRUE(s3.data_equal(s1)); - NL_TEST_ASSERT(inSuite, s2.data_equal(s3)); - NL_TEST_ASSERT(inSuite, s3.data_equal(s2)); + EXPECT_TRUE(s2.data_equal(s3)); + EXPECT_TRUE(s3.data_equal(s2)); - NL_TEST_ASSERT(inSuite, s1.data_equal(s4)); - NL_TEST_ASSERT(inSuite, s4.data_equal(s1)); + EXPECT_TRUE(s1.data_equal(s4)); + EXPECT_TRUE(s4.data_equal(s1)); - NL_TEST_ASSERT(inSuite, s2.data_equal(s4)); - NL_TEST_ASSERT(inSuite, s4.data_equal(s2)); + EXPECT_TRUE(s2.data_equal(s4)); + EXPECT_TRUE(s4.data_equal(s2)); - NL_TEST_ASSERT(inSuite, s3.data_equal(s4)); - NL_TEST_ASSERT(inSuite, s4.data_equal(s3)); + EXPECT_TRUE(s3.data_equal(s4)); + EXPECT_TRUE(s4.data_equal(s3)); Span<uint8_t *> s5(s3); - NL_TEST_ASSERT(inSuite, s5.data_equal(s3)); - NL_TEST_ASSERT(inSuite, s3.data_equal(s5)); + EXPECT_TRUE(s5.data_equal(s3)); + EXPECT_TRUE(s3.data_equal(s5)); } -static void TestSubSpan(nlTestSuite * inSuite, void * inContext) +TEST(TestSpan, TestSubSpan) { uint8_t array[16]; ByteSpan span(array); - NL_TEST_ASSERT(inSuite, span.data() == &array[0]); - NL_TEST_ASSERT(inSuite, span.size() == 16); + EXPECT_EQ(span.data(), &array[0]); + EXPECT_EQ(span.size(), 16u); ByteSpan subspan = span.SubSpan(1, 14); - NL_TEST_ASSERT(inSuite, subspan.data() == &array[1]); - NL_TEST_ASSERT(inSuite, subspan.size() == 14); + EXPECT_EQ(subspan.data(), &array[1]); + EXPECT_EQ(subspan.size(), 14u); subspan = span.SubSpan(1, 0); - NL_TEST_ASSERT(inSuite, subspan.size() == 0); + EXPECT_EQ(subspan.size(), 0u); subspan = span.SubSpan(10); - NL_TEST_ASSERT(inSuite, subspan.data() == &array[10]); - NL_TEST_ASSERT(inSuite, subspan.size() == 6); + EXPECT_EQ(subspan.data(), &array[10]); + EXPECT_EQ(subspan.size(), 6u); subspan = span.SubSpan(16); - NL_TEST_ASSERT(inSuite, subspan.size() == 0); + EXPECT_EQ(subspan.size(), 0u); } -static void TestFromZclString(nlTestSuite * inSuite, void * inContext) +TEST(TestSpan, TestFromZclString) { // Purposefully larger size than data. constexpr uint8_t array[16] = { 3, 0x41, 0x63, 0x45 }; @@ -279,26 +278,26 @@ static void TestFromZclString(nlTestSuite * inSuite, void * inContext) static constexpr char str[] = "AcE"; ByteSpan s1 = ByteSpan::fromZclString(array); - NL_TEST_ASSERT(inSuite, s1.data_equal(ByteSpan(&array[1], 3))); + EXPECT_TRUE(s1.data_equal(ByteSpan(&array[1], 3u))); CharSpan s2 = CharSpan::fromZclString(array); - NL_TEST_ASSERT(inSuite, s2.data_equal(CharSpan(str, 3))); + EXPECT_TRUE(s2.data_equal(CharSpan(str, 3))); } -static void TestFromCharString(nlTestSuite * inSuite, void * inContext) +TEST(TestSpan, TestFromCharString) { static constexpr char str[] = "AcE"; CharSpan s1 = CharSpan::fromCharString(str); - NL_TEST_ASSERT(inSuite, s1.data_equal(CharSpan(str, 3))); + EXPECT_TRUE(s1.data_equal(CharSpan(str, 3))); } -static void TestLiteral(nlTestSuite * inSuite, void * inContext) +TEST(TestSpan, TestLiteral) { constexpr CharSpan literal = "HI!"_span; - NL_TEST_ASSERT(inSuite, literal.size() == 3); - NL_TEST_ASSERT(inSuite, literal.data_equal(CharSpan::fromCharString("HI!"))); - NL_TEST_ASSERT(inSuite, ""_span.size() == 0); + EXPECT_EQ(literal.size(), 3u); + EXPECT_TRUE(literal.data_equal(CharSpan::fromCharString("HI!"))); + EXPECT_EQ(""_span.size(), 0u); // These should be compile errors -- if they were allowed they would produce // a CharSpan that includes the trailing '\0' byte in the value. @@ -306,7 +305,7 @@ static void TestLiteral(nlTestSuite * inSuite, void * inContext) // constexpr CharSpan disallowed2{ "abcd" }; } -static void TestConversionConstructors(nlTestSuite * inSuite, void * inContext) +TEST(TestSpan, TestConversionConstructors) { struct Foo { @@ -345,43 +344,15 @@ static void TestConversionConstructors(nlTestSuite * inSuite, void * inContext) ([](FixedSpan<const Foo, 3> f) {})(constArray); ([](Span<const Foo> f) {})(constArray); - NL_TEST_ASSERT(inSuite, span10.data_equal(span10)); - NL_TEST_ASSERT(inSuite, span10.data_equal(span9)); - NL_TEST_ASSERT(inSuite, span10.data_equal(array)); - NL_TEST_ASSERT(inSuite, span10.data_equal(constArray)); - NL_TEST_ASSERT(inSuite, span9.data_equal(span9)); - NL_TEST_ASSERT(inSuite, span9.data_equal(span10)); - NL_TEST_ASSERT(inSuite, span9.data_equal(array)); - NL_TEST_ASSERT(inSuite, span9.data_equal(constArray)); + EXPECT_TRUE(span10.data_equal(span10)); + EXPECT_TRUE(span10.data_equal(span9)); + EXPECT_TRUE(span10.data_equal(array)); + EXPECT_TRUE(span10.data_equal(constArray)); + EXPECT_TRUE(span9.data_equal(span9)); + EXPECT_TRUE(span9.data_equal(span10)); + EXPECT_TRUE(span9.data_equal(array)); + EXPECT_TRUE(span9.data_equal(constArray)); // The following should not compile // Span<const Foo> error1 = std::array<Foo, 3>(); // Span would point into a temporary value } - -#define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn) -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { - NL_TEST_DEF_FN(TestByteSpan), - NL_TEST_DEF_FN(TestMutableByteSpan), - NL_TEST_DEF_FN(TestFixedByteSpan), - NL_TEST_DEF_FN(TestSpanOfPointers), - NL_TEST_DEF_FN(TestSubSpan), - NL_TEST_DEF_FN(TestFromZclString), - NL_TEST_DEF_FN(TestFromCharString), - NL_TEST_DEF_FN(TestLiteral), - NL_TEST_DEF_FN(TestConversionConstructors), - NL_TEST_SENTINEL(), -}; - -int TestSpan() -{ - nlTestSuite theSuite = { "CHIP Span tests", &sTests[0], nullptr, nullptr }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestSpan) diff --git a/src/lib/support/tests/TestStaticSupportSmartPtr.cpp b/src/lib/support/tests/TestStaticSupportSmartPtr.cpp index 809c2e4887969c..b51afc15729ad8 100644 --- a/src/lib/support/tests/TestStaticSupportSmartPtr.cpp +++ b/src/lib/support/tests/TestStaticSupportSmartPtr.cpp @@ -15,14 +15,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include <lib/support/static_support_smart_ptr.h> - -#include <lib/support/Scoped.h> -#include <lib/support/UnitTestRegistration.h> #include <cstring> -#include <nlunit-test.h> +#include <gtest/gtest.h> + +#include <lib/support/Scoped.h> +#include <lib/support/static_support_smart_ptr.h> using namespace chip; namespace { @@ -50,42 +49,42 @@ TestClass * GlobalInstanceProvider<TestClass>::InstancePointer() namespace { -void TestCheckedGlobalInstanceReference(nlTestSuite * inSuite, void * inContext) +TEST(TestStaticSupportSmartPtr, TestCheckedGlobalInstanceReference) { CheckedGlobalInstanceReference<TestClass> ref(&gTestClass); // We expect that sizes of global references is minimal - NL_TEST_ASSERT(inSuite, sizeof(ref) == 1); + EXPECT_EQ(sizeof(ref), 1u); - NL_TEST_ASSERT(inSuite, ref->num == 123); - NL_TEST_ASSERT(inSuite, strcmp(ref->str, "abc") == 0); + EXPECT_EQ(ref->num, 123); + EXPECT_STREQ(ref->str, "abc"); { ScopedChange<int> change1(gTestClass.num, 100); ScopedChange<const char *> change2(ref->str, "xyz"); - NL_TEST_ASSERT(inSuite, ref->num == 100); - NL_TEST_ASSERT(inSuite, strcmp(gTestClass.str, "xyz") == 0); + EXPECT_EQ(ref->num, 100); + EXPECT_STREQ(gTestClass.str, "xyz"); } CheckedGlobalInstanceReference<TestClass> ref2(&gTestClass); - NL_TEST_ASSERT(inSuite, ref->num == ref2->num); - NL_TEST_ASSERT(inSuite, strcmp(ref->str, ref2->str) == 0); + EXPECT_EQ(ref->num, ref2->num); + EXPECT_STREQ(ref->str, ref2->str); { ScopedChange<int> change1(gTestClass.num, 321); ScopedChange<const char *> change2(ref->str, "test"); - NL_TEST_ASSERT(inSuite, ref->num == ref2->num); - NL_TEST_ASSERT(inSuite, strcmp(ref->str, ref2->str) == 0); + EXPECT_EQ(ref->num, ref2->num); + EXPECT_STREQ(ref->str, ref2->str); - NL_TEST_ASSERT(inSuite, ref2->num == 321); - NL_TEST_ASSERT(inSuite, strcmp(ref2->str, "test") == 0); + EXPECT_EQ(ref2->num, 321); + EXPECT_STREQ(ref2->str, "test"); } } -void TestSimpleInstanceReference(nlTestSuite * inSuite, void * inContext) +TEST(TestStaticSupportSmartPtr, TestSimpleInstanceReference) { TestClass a("abc", 123); TestClass b("xyz", 100); @@ -94,34 +93,16 @@ void TestSimpleInstanceReference(nlTestSuite * inSuite, void * inContext) SimpleInstanceReference ref_b(&b); // overhead of simple references should be a simple pointer - NL_TEST_ASSERT(inSuite, sizeof(ref_a) <= sizeof(void *)); + EXPECT_LE(sizeof(ref_a), sizeof(void *)); - NL_TEST_ASSERT(inSuite, ref_a->num == 123); - NL_TEST_ASSERT(inSuite, ref_b->num == 100); + EXPECT_EQ(ref_a->num, 123); + EXPECT_EQ(ref_b->num, 100); ref_a->num = 99; b.num = 30; - NL_TEST_ASSERT(inSuite, a.num == 99); - NL_TEST_ASSERT(inSuite, ref_b->num == 30); + EXPECT_EQ(a.num, 99); + EXPECT_EQ(ref_b->num, 30); } -#define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn) -const nlTest sTests[] = { - NL_TEST_DEF_FN(TestCheckedGlobalInstanceReference), - NL_TEST_DEF_FN(TestSimpleInstanceReference), - NL_TEST_SENTINEL(), -}; - } // namespace - -int TestStaticSupportSmartPtr() -{ - nlTestSuite theSuite = { "CHIP Static support smart pointers", &sTests[0], nullptr, nullptr }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestStaticSupportSmartPtr) diff --git a/src/lib/support/tests/TestTestPersistentStorageDelegate.cpp b/src/lib/support/tests/TestTestPersistentStorageDelegate.cpp index 05ef383f248b14..a53f43c0febaaa 100644 --- a/src/lib/support/tests/TestTestPersistentStorageDelegate.cpp +++ b/src/lib/support/tests/TestTestPersistentStorageDelegate.cpp @@ -18,14 +18,13 @@ #include <lib/core/CHIPError.h> #include <lib/support/TestPersistentStorageDelegate.h> -#include <lib/support/UnitTestRegistration.h> #include <array> #include <cstring> #include <set> #include <string> -#include <nlunit-test.h> +#include <gtest/gtest.h> using namespace chip; @@ -50,7 +49,7 @@ bool SetMatches(const std::set<T> & set, const std::array<T, N> expectedContents return true; } -void TestBasicApi(nlTestSuite * inSuite, void * inContext) +TEST(TestTestPersistentStorageDelegate, TestBasicApi) { TestPersistentStorageDelegate storage; @@ -63,49 +62,49 @@ void TestBasicApi(nlTestSuite * inSuite, void * inContext) memset(&buf[0], 0, sizeof(buf)); size = actualSizeOfBuf; err = storage.SyncGetKeyValue("roboto", &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); - NL_TEST_ASSERT(inSuite, size == actualSizeOfBuf); + EXPECT_EQ(err, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); + EXPECT_EQ(size, actualSizeOfBuf); - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == 0); + EXPECT_EQ(storage.GetNumKeys(), 0u); err = storage.SyncDeleteKeyValue("roboto"); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); + EXPECT_EQ(err, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); // Add basic key, read it back, erase it static const char kStringValue1[] = "abcd"; err = storage.SyncSetKeyValue("roboto", kStringValue1, static_cast<uint16_t>(strlen(kStringValue1))); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); memset(&buf[0], 0, sizeof(buf)); size = actualSizeOfBuf; err = storage.SyncGetKeyValue("roboto", &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, size == strlen(kStringValue1)); - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[0], kStringValue1, strlen(kStringValue1))); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(size, strlen(kStringValue1)); + EXPECT_EQ(0, memcmp(&buf[0], kStringValue1, strlen(kStringValue1))); err = storage.SyncDeleteKeyValue("roboto"); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); memset(&buf[0], 0, sizeof(buf)); size = actualSizeOfBuf; err = storage.SyncGetKeyValue("roboto", &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); - NL_TEST_ASSERT(inSuite, size == actualSizeOfBuf); + EXPECT_EQ(err, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); + EXPECT_EQ(size, actualSizeOfBuf); // Validate adding 2 different keys static const char kStringValue2[] = "0123abcd"; static const char kStringValue3[] = "cdef89"; err = storage.SyncSetKeyValue("key2", kStringValue2, static_cast<uint16_t>(strlen(kStringValue2))); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = storage.SyncSetKeyValue("key3", kStringValue3, static_cast<uint16_t>(strlen(kStringValue3))); - NL_TEST_ASSERT(inSuite, storage.SyncDoesKeyExist("key3")); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_TRUE(storage.SyncDoesKeyExist("key3")); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == 2); + EXPECT_EQ(storage.GetNumKeys(), 2u); auto keys = storage.GetKeys(); std::array<std::string, 2> kExpectedKeys{ "key2", "key3" }; - NL_TEST_ASSERT(inSuite, SetMatches(keys, kExpectedKeys) == true); + EXPECT_EQ(SetMatches(keys, kExpectedKeys), true); // Read them back @@ -115,164 +114,164 @@ void TestBasicApi(nlTestSuite * inSuite, void * inContext) memset(&buf[0], 0, sizeof(buf)); size = actualSizeOfBuf; err = storage.SyncGetKeyValue("key2", &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, size == strlen(kStringValue2)); - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[0], kStringValue2, strlen(kStringValue2))); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(size, strlen(kStringValue2)); + EXPECT_EQ(0, memcmp(&buf[0], kStringValue2, strlen(kStringValue2))); // Make sure that there was no buffer overflow during SyncGetKeyValue - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[size], &all_zeroes[0], sizeof(buf) - size)); + EXPECT_EQ(0, memcmp(&buf[size], &all_zeroes[0], sizeof(buf) - size)); memset(&buf[0], 0, sizeof(buf)); size = actualSizeOfBuf; err = storage.SyncGetKeyValue("key3", &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, size == strlen(kStringValue3)); - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[0], kStringValue3, strlen(kStringValue3))); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(size, strlen(kStringValue3)); + EXPECT_EQ(0, memcmp(&buf[0], kStringValue3, strlen(kStringValue3))); // Make sure that there was no buffer overflow during SyncGetKeyValue - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[size], &all_zeroes[0], sizeof(buf) - size)); + EXPECT_EQ(0, memcmp(&buf[size], &all_zeroes[0], sizeof(buf) - size)); // Read providing too small a buffer. Data read up to `size` and nothing more. memset(&buf[0], 0, sizeof(buf)); size = static_cast<uint16_t>(strlen(kStringValue2) - 1); uint16_t sizeBeforeGetKeyValueCall = size; err = storage.SyncGetKeyValue("key2", &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_BUFFER_TOO_SMALL); - NL_TEST_ASSERT(inSuite, size == sizeBeforeGetKeyValueCall); - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[0], kStringValue2, size)); + EXPECT_EQ(err, CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_EQ(size, sizeBeforeGetKeyValueCall); + EXPECT_EQ(0, memcmp(&buf[0], kStringValue2, size)); // Make sure that there was no buffer overflow during SyncGetKeyValue - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[size], &all_zeroes[0], sizeof(buf) - size)); + EXPECT_EQ(0, memcmp(&buf[size], &all_zeroes[0], sizeof(buf) - size)); // Read in too small a buffer, which is nullptr and size == 0: check CHIP_ERROR_BUFFER_TOO_SMALL is given. memset(&buf[0], 0, sizeof(buf)); size = 0; sizeBeforeGetKeyValueCall = size; err = storage.SyncGetKeyValue("key2", nullptr, size); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_BUFFER_TOO_SMALL); - NL_TEST_ASSERT(inSuite, size != strlen(kStringValue2)); - NL_TEST_ASSERT(inSuite, size == sizeBeforeGetKeyValueCall); + EXPECT_EQ(err, CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_NE(size, strlen(kStringValue2)); + EXPECT_EQ(size, sizeBeforeGetKeyValueCall); // Just making sure that implementation doesn't hold onto reference of previous destination buffer when // nullptr is provided. - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[0], &all_zeroes[0], sizeof(buf))); + EXPECT_EQ(0, memcmp(&buf[0], &all_zeroes[0], sizeof(buf))); // Read in too small a buffer, which is nullptr and size != 0: error size = static_cast<uint16_t>(strlen(kStringValue2) - 1); sizeBeforeGetKeyValueCall = size; err = storage.SyncGetKeyValue("key2", nullptr, size); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_ARGUMENT); - NL_TEST_ASSERT(inSuite, size == sizeBeforeGetKeyValueCall); + EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(size, sizeBeforeGetKeyValueCall); // Just making sure that implementation doesn't hold onto reference of previous destination buffer when // nullptr is provided. - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[0], &all_zeroes[0], sizeof(buf))); + EXPECT_EQ(0, memcmp(&buf[0], &all_zeroes[0], sizeof(buf))); // When key not found, size is not touched. size = actualSizeOfBuf; err = storage.SyncGetKeyValue("keyDOES_NOT_EXIST", &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); - NL_TEST_ASSERT(inSuite, actualSizeOfBuf == size); - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[0], &all_zeroes[0], sizeof(buf))); + EXPECT_EQ(err, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); + EXPECT_EQ(actualSizeOfBuf, size); + EXPECT_EQ(0, memcmp(&buf[0], &all_zeroes[0], sizeof(buf))); size = 0; err = storage.SyncGetKeyValue("keyDOES_NOT_EXIST", nullptr, size); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); - NL_TEST_ASSERT(inSuite, 0 == size); - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[0], &all_zeroes[0], sizeof(buf))); + EXPECT_EQ(err, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); + EXPECT_EQ(0, size); + EXPECT_EQ(0, memcmp(&buf[0], &all_zeroes[0], sizeof(buf))); // Even when key not found, cannot pass nullptr with size != 0. size = actualSizeOfBuf; err = storage.SyncGetKeyValue("keyDOES_NOT_EXIST", nullptr, size); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_ARGUMENT); - NL_TEST_ASSERT(inSuite, actualSizeOfBuf == size); - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[0], &all_zeroes[0], size)); + EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(actualSizeOfBuf, size); + EXPECT_EQ(0, memcmp(&buf[0], &all_zeroes[0], size)); // Attempt an empty key write with either nullptr or zero size works err = storage.SyncSetKeyValue("key2", kStringValue2, 0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storage.SyncDoesKeyExist("key2")); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(storage.SyncDoesKeyExist("key2")); size = 0; err = storage.SyncGetKeyValue("key2", &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, size == 0); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(size, 0u); size = 0; err = storage.SyncGetKeyValue("key2", nullptr, size); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, size == 0); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(size, 0u); size = actualSizeOfBuf; err = storage.SyncGetKeyValue("key2", &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, size == 0); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(size, 0u); err = storage.SyncSetKeyValue("key2", nullptr, 0); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storage.SyncDoesKeyExist("key2")); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_TRUE(storage.SyncDoesKeyExist("key2")); size = 0; err = storage.SyncGetKeyValue("key2", &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, size == 0); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(size, 0u); // Failure to set key if buffer is nullptr and size != 0 size = 10; err = storage.SyncSetKeyValue("key4", nullptr, size); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_ARGUMENT); - NL_TEST_ASSERT(inSuite, !storage.SyncDoesKeyExist("key4")); + EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_FALSE(storage.SyncDoesKeyExist("key4")); // Can delete empty key err = storage.SyncDeleteKeyValue("key2"); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !storage.SyncDoesKeyExist("key2")); + EXPECT_FALSE(storage.SyncDoesKeyExist("key2")); size = actualSizeOfBuf; err = storage.SyncGetKeyValue("key2", &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); - NL_TEST_ASSERT(inSuite, size == actualSizeOfBuf); - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[0], &all_zeroes[0], size)); + EXPECT_EQ(err, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); + EXPECT_EQ(size, actualSizeOfBuf); + EXPECT_EQ(0, memcmp(&buf[0], &all_zeroes[0], size)); // Using key and value with base64 symbols static const char kBase64SymbolsKey[] = "key+/="; static const char kBase64SymbolValues[] = "value+/="; err = storage.SyncSetKeyValue(kBase64SymbolsKey, kBase64SymbolValues, static_cast<uint16_t>(strlen(kBase64SymbolValues))); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); memset(&buf[0], 0, sizeof(buf)); size = actualSizeOfBuf; err = storage.SyncGetKeyValue(kBase64SymbolsKey, &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, size == strlen(kBase64SymbolValues)); - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[0], kBase64SymbolValues, strlen(kBase64SymbolValues))); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(size, strlen(kBase64SymbolValues)); + EXPECT_EQ(0, memcmp(&buf[0], kBase64SymbolValues, strlen(kBase64SymbolValues))); // Make sure that there was no buffer overflow during SyncGetKeyValue - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[size], &all_zeroes[0], sizeof(buf) - size)); + EXPECT_EQ(0, memcmp(&buf[size], &all_zeroes[0], sizeof(buf) - size)); err = storage.SyncDeleteKeyValue(kBase64SymbolsKey); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !storage.SyncDoesKeyExist(kBase64SymbolsKey)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(storage.SyncDoesKeyExist(kBase64SymbolsKey)); // Try using key that is a size that equals PersistentStorageDelegate::kKeyLengthMax char longKeyString[PersistentStorageDelegate::kKeyLengthMax + 1]; memset(&longKeyString, 'X', PersistentStorageDelegate::kKeyLengthMax); longKeyString[sizeof(longKeyString) - 1] = '\0'; // strlen() is not compile time so we just have this runtime assert that should aways pass as a sanity check. - NL_TEST_ASSERT(inSuite, strlen(longKeyString) == PersistentStorageDelegate::kKeyLengthMax); + EXPECT_EQ(strlen(longKeyString), PersistentStorageDelegate::kKeyLengthMax); err = storage.SyncSetKeyValue(longKeyString, kStringValue2, static_cast<uint16_t>(strlen(kStringValue2))); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); memset(&buf[0], 0, sizeof(buf)); size = actualSizeOfBuf; err = storage.SyncGetKeyValue(longKeyString, &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, size == strlen(kStringValue2)); - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[0], kStringValue2, strlen(kStringValue2))); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(size, strlen(kStringValue2)); + EXPECT_EQ(0, memcmp(&buf[0], kStringValue2, strlen(kStringValue2))); // Make sure that there was no buffer overflow during SyncGetKeyValue - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[size], &all_zeroes[0], sizeof(buf) - size)); + EXPECT_EQ(0, memcmp(&buf[size], &all_zeroes[0], sizeof(buf) - size)); - NL_TEST_ASSERT(inSuite, storage.SyncDoesKeyExist(longKeyString)); + EXPECT_TRUE(storage.SyncDoesKeyExist(longKeyString)); err = storage.SyncDeleteKeyValue(longKeyString); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !storage.SyncDoesKeyExist(longKeyString)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_FALSE(storage.SyncDoesKeyExist(longKeyString)); constexpr size_t kMaxCHIPCertLength = 400; // From credentials/CHIPCert.h and spec uint8_t largeBuffer[kMaxCHIPCertLength]; @@ -281,26 +280,26 @@ void TestBasicApi(nlTestSuite * inSuite, void * inContext) memcpy(largeBufferForCheck, largeBuffer, sizeof(largeBuffer)); err = storage.SyncSetKeyValue(longKeyString, largeBuffer, static_cast<uint16_t>(sizeof(largeBuffer))); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); memset(&largeBuffer, 0, sizeof(largeBuffer)); size = static_cast<uint16_t>(sizeof(largeBuffer)); err = storage.SyncGetKeyValue(longKeyString, &largeBuffer[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, size == static_cast<uint16_t>(sizeof(largeBuffer))); - NL_TEST_ASSERT(inSuite, 0 == memcmp(&largeBuffer, largeBufferForCheck, sizeof(largeBuffer))); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(size, static_cast<uint16_t>(sizeof(largeBuffer))); + EXPECT_EQ(0, memcmp(&largeBuffer, largeBufferForCheck, sizeof(largeBuffer))); err = storage.SyncDeleteKeyValue(longKeyString); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Cleaning up err = storage.SyncDeleteKeyValue("key3"); - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == 0); + EXPECT_EQ(storage.GetNumKeys(), 0u); } // ClearStorage is not a PersistentStorageDelegate base class method, it only // appears in the TestPersistentStorageDelegate. -void TestClearStorage(nlTestSuite * inSuite, void * inContext) +TEST(TestTestPersistentStorageDelegate, TestClearStorage) { TestPersistentStorageDelegate storage; @@ -308,51 +307,37 @@ void TestClearStorage(nlTestSuite * inSuite, void * inContext) uint16_t size = sizeof(buf); // Key not there - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == 0); + EXPECT_EQ(storage.GetNumKeys(), 0u); CHIP_ERROR err; memset(&buf[0], 0, sizeof(buf)); size = sizeof(buf); err = storage.SyncGetKeyValue("roboto", &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); - NL_TEST_ASSERT(inSuite, size == sizeof(buf)); + EXPECT_EQ(err, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); + EXPECT_EQ(size, sizeof(buf)); // Add basic key, read it back static const char kStringValue1[] = "abcd"; err = storage.SyncSetKeyValue("roboto", kStringValue1, static_cast<uint16_t>(strlen(kStringValue1))); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == 1); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(storage.GetNumKeys(), 1u); memset(&buf[0], 0, sizeof(buf)); size = sizeof(buf); err = storage.SyncGetKeyValue("roboto", &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, size == strlen(kStringValue1)); - NL_TEST_ASSERT(inSuite, 0 == memcmp(&buf[0], kStringValue1, strlen(kStringValue1))); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(size, strlen(kStringValue1)); + EXPECT_EQ(0, memcmp(&buf[0], kStringValue1, strlen(kStringValue1))); // Clear storage, make sure it's gone storage.ClearStorage(); - NL_TEST_ASSERT(inSuite, storage.GetNumKeys() == 0); + EXPECT_EQ(storage.GetNumKeys(), 0u); memset(&buf[0], 0, sizeof(buf)); size = sizeof(buf); err = storage.SyncGetKeyValue("roboto", &buf[0], size); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); - NL_TEST_ASSERT(inSuite, size == sizeof(buf)); + EXPECT_EQ(err, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); + EXPECT_EQ(size, sizeof(buf)); } -const nlTest sTests[] = { NL_TEST_DEF("Test basic API", TestBasicApi), - NL_TEST_DEF("Test ClearStorage method of TestPersistentStorageDelegate", TestClearStorage), - NL_TEST_SENTINEL() }; - } // namespace - -int TestTestPersistentStorageDelegate() -{ - nlTestSuite theSuite = { "TestPersistentStorageDelegate tests", &sTests[0], nullptr, nullptr }; - - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestTestPersistentStorageDelegate); diff --git a/src/lib/support/tests/TestUtf8.cpp b/src/lib/support/tests/TestUtf8.cpp index a18ed74f65c8ae..dd078804c1ed5d 100644 --- a/src/lib/support/tests/TestUtf8.cpp +++ b/src/lib/support/tests/TestUtf8.cpp @@ -17,12 +17,10 @@ * limitations under the License. */ -#include <functional> - -#include <lib/support/UnitTestRegistration.h> #include <lib/support/utf8.h> -#include <nlunit-test.h> +#include <functional> +#include <gtest/gtest.h> namespace { @@ -33,7 +31,7 @@ using namespace chip; { \ uint8_t _buff[] = { __VA_ARGS__ }; \ CharSpan _span(reinterpret_cast<const char *>(_buff), sizeof(_buff)); \ - NL_TEST_ASSERT(inSuite, Utf8::IsValid(_span)); \ + EXPECT_TRUE(Utf8::IsValid(_span)); \ } while (0) #define TEST_INVALID_BYTES(...) \ @@ -41,42 +39,42 @@ using namespace chip; { \ uint8_t _buff[] = { __VA_ARGS__ }; \ CharSpan _span(reinterpret_cast<const char *>(_buff), sizeof(_buff)); \ - NL_TEST_ASSERT(inSuite, !Utf8::IsValid(_span)); \ + EXPECT_FALSE(Utf8::IsValid(_span)); \ } while (0) -void TestValidStrings(nlTestSuite * inSuite, void * inContext) +TEST(TestUtf8, TestValidStrings) { - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan())); // empty span ok + EXPECT_TRUE(Utf8::IsValid(CharSpan())); // empty span ok - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString(""))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString("abc"))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString(""))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString("abc"))); // Various tests from https://www.w3.org/2001/06/utf-8-wrong/UTF-8-test.html // Generic UTF8 - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString("κόσμε"))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString("κόσμε"))); // First possible sequence of a certain length - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString(""))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString("ࠀ"))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString("𐀀"))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString("�����"))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString("������"))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString(""))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString("ࠀ"))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString("𐀀"))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString("�����"))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString("������"))); // Last possible sequence of a certain length - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString(""))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString("߿"))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString(""))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString("����"))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString("�����"))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString("������"))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString(""))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString("߿"))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString(""))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString("����"))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString("�����"))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString("������"))); // Other boundary conditions - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString(""))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString(""))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString("�"))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString(""))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan::fromCharString("����"))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString(""))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString(""))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString("�"))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString(""))); + EXPECT_TRUE(Utf8::IsValid(CharSpan::fromCharString("����"))); // NOTE: UTF8 allows embeded NULLs // even though strings like that are probably not ideal for handling @@ -84,17 +82,17 @@ void TestValidStrings(nlTestSuite * inSuite, void * inContext) // completely if the spec is updated as such { char zero[16] = { 0 }; - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan(zero, 0))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan(zero, 1))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan(zero, 2))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan(zero, 3))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan(zero, 4))); - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan(zero, 16))); + EXPECT_TRUE(Utf8::IsValid(CharSpan(zero, 0))); + EXPECT_TRUE(Utf8::IsValid(CharSpan(zero, 1))); + EXPECT_TRUE(Utf8::IsValid(CharSpan(zero, 2))); + EXPECT_TRUE(Utf8::IsValid(CharSpan(zero, 3))); + EXPECT_TRUE(Utf8::IsValid(CharSpan(zero, 4))); + EXPECT_TRUE(Utf8::IsValid(CharSpan(zero, 16))); } { char insideZero[] = "test\0zero"; - NL_TEST_ASSERT(inSuite, Utf8::IsValid(CharSpan(insideZero))); + EXPECT_TRUE(Utf8::IsValid(CharSpan(insideZero))); } // Test around forbidden 0xD800..0xDFFF UTF-16 surrogate pairs. @@ -102,7 +100,7 @@ void TestValidStrings(nlTestSuite * inSuite, void * inContext) TEST_VALID_BYTES(0b1110'1110, 0b10'000000, 0b10'000000); } -void TestInvalidStrings(nlTestSuite * inSuite, void * inContext) +TEST(TestUtf8, TestInvalidStrings) { // Overly long sequences TEST_INVALID_BYTES(0xc0, 0b10'111111); @@ -169,22 +167,3 @@ void TestInvalidStrings(nlTestSuite * inSuite, void * inContext) } } // namespace - -// clang-format off -const nlTest sTests[] = -{ - NL_TEST_DEF("TestValidStrings", TestValidStrings), - NL_TEST_DEF("TestInvalidStrings", TestInvalidStrings), - NL_TEST_SENTINEL() -}; -// clang-format on - -int TestUtf8() -{ - nlTestSuite theSuite = { "UTF8 validator tests", &sTests[0], nullptr, nullptr }; - - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestUtf8); From be15c9b92a974dce45890a83ce24805443a7a8a5 Mon Sep 17 00:00:00 2001 From: Jakub Latusek <j.latusek@samsung.com> Date: Thu, 25 Apr 2024 13:49:58 +0200 Subject: [PATCH 029/124] Interaction model to PW (#33160) --- .../interaction_model/tests/BUILD.gn | 5 +- .../tests/TestStatusCode.cpp | 104 +++++++----------- 2 files changed, 40 insertions(+), 69 deletions(-) diff --git a/src/protocols/interaction_model/tests/BUILD.gn b/src/protocols/interaction_model/tests/BUILD.gn index 0abd3a7fa595a9..875146e3958ec6 100644 --- a/src/protocols/interaction_model/tests/BUILD.gn +++ b/src/protocols/interaction_model/tests/BUILD.gn @@ -14,11 +14,10 @@ import("//build_overrides/build.gni") import("//build_overrides/chip.gni") -import("//build_overrides/nlunit_test.gni") import("${chip_root}/build/chip/chip_test_suite.gni") -chip_test_suite_using_nltest("tests") { +chip_test_suite("tests") { output_name = "libInteractionModelTests" test_sources = [ "TestStatusCode.cpp" ] @@ -26,9 +25,7 @@ chip_test_suite_using_nltest("tests") { public_deps = [ "${chip_root}/src/lib/core", "${chip_root}/src/lib/support", - "${chip_root}/src/lib/support:testing_nlunit", "${chip_root}/src/protocols/interaction_model", - "${nlunit_test_root}:nlunit-test", ] cflags = [ "-Wconversion" ] diff --git a/src/protocols/interaction_model/tests/TestStatusCode.cpp b/src/protocols/interaction_model/tests/TestStatusCode.cpp index 4b89e0f4b1acfb..2be78c4f3ac418 100644 --- a/src/protocols/interaction_model/tests/TestStatusCode.cpp +++ b/src/protocols/interaction_model/tests/TestStatusCode.cpp @@ -18,54 +18,51 @@ #include <stdint.h> +#include <gtest/gtest.h> #include <lib/core/Optional.h> -#include <lib/support/UnitTestExtendedAssertions.h> -#include <lib/support/UnitTestRegistration.h> #include <protocols/interaction_model/StatusCode.h> -#include <nlunit-test.h> - using namespace ::chip; using namespace ::chip::Protocols::InteractionModel; namespace { -void TestStatusBasicValues(nlTestSuite * inSuite, void * inContext) +TEST(TestStatusCode, TestStatusBasicValues) { - NL_TEST_ASSERT_EQUALS(inSuite, static_cast<int>(Status::Success), 0); - NL_TEST_ASSERT_EQUALS(inSuite, static_cast<int>(Status::Failure), 1); - NL_TEST_ASSERT_EQUALS(inSuite, static_cast<int>(Status::UnsupportedEndpoint), 0x7f); - NL_TEST_ASSERT_EQUALS(inSuite, static_cast<int>(Status::InvalidInState), 0xcb); + EXPECT_EQ(static_cast<int>(Status::Success), 0); + EXPECT_EQ(static_cast<int>(Status::Failure), 1); + EXPECT_EQ(static_cast<int>(Status::UnsupportedEndpoint), 0x7f); + EXPECT_EQ(static_cast<int>(Status::InvalidInState), 0xcb); } -void TestClusterStatusCode(nlTestSuite * inSuite, void * inContext) +TEST(TestStatusCode, TestClusterStatusCode) { // Basic usage as a Status. { ClusterStatusCode status_code_success{ Status::Success }; - NL_TEST_ASSERT_EQUALS(inSuite, status_code_success, Status::Success); - NL_TEST_ASSERT_EQUALS(inSuite, status_code_success.GetStatus(), Status::Success); - NL_TEST_ASSERT(inSuite, !status_code_success.HasClusterSpecificCode()); - NL_TEST_ASSERT_EQUALS(inSuite, status_code_success.GetClusterSpecificCode(), chip::NullOptional); - NL_TEST_ASSERT(inSuite, status_code_success.IsSuccess()); + EXPECT_EQ(status_code_success, Status::Success); + EXPECT_EQ(status_code_success.GetStatus(), Status::Success); + EXPECT_FALSE(status_code_success.HasClusterSpecificCode()); + EXPECT_EQ(status_code_success.GetClusterSpecificCode(), chip::NullOptional); + EXPECT_TRUE(status_code_success.IsSuccess()); ClusterStatusCode status_code_failure{ Status::Failure }; - NL_TEST_ASSERT_EQUALS(inSuite, status_code_failure, Status::Failure); - NL_TEST_ASSERT_EQUALS(inSuite, status_code_failure.GetStatus(), Status::Failure); - NL_TEST_ASSERT(inSuite, !status_code_failure.HasClusterSpecificCode()); - NL_TEST_ASSERT(inSuite, !status_code_failure.IsSuccess()); + EXPECT_EQ(status_code_failure, Status::Failure); + EXPECT_EQ(status_code_failure.GetStatus(), Status::Failure); + EXPECT_FALSE(status_code_failure.HasClusterSpecificCode()); + EXPECT_FALSE(status_code_failure.IsSuccess()); ClusterStatusCode status_code_unsupported_ep{ Status::UnsupportedEndpoint }; - NL_TEST_ASSERT_EQUALS(inSuite, status_code_unsupported_ep, Status::UnsupportedEndpoint); - NL_TEST_ASSERT_EQUALS(inSuite, status_code_unsupported_ep.GetStatus(), Status::UnsupportedEndpoint); - NL_TEST_ASSERT(inSuite, !status_code_unsupported_ep.HasClusterSpecificCode()); - NL_TEST_ASSERT(inSuite, !status_code_unsupported_ep.IsSuccess()); + EXPECT_EQ(status_code_unsupported_ep, Status::UnsupportedEndpoint); + EXPECT_EQ(status_code_unsupported_ep.GetStatus(), Status::UnsupportedEndpoint); + EXPECT_FALSE(status_code_unsupported_ep.HasClusterSpecificCode()); + EXPECT_FALSE(status_code_unsupported_ep.IsSuccess()); ClusterStatusCode status_code_invalid_in_state{ Status::InvalidInState }; - NL_TEST_ASSERT_EQUALS(inSuite, status_code_invalid_in_state, Status::InvalidInState); - NL_TEST_ASSERT_EQUALS(inSuite, status_code_invalid_in_state.GetStatus(), Status::InvalidInState); - NL_TEST_ASSERT(inSuite, !status_code_invalid_in_state.HasClusterSpecificCode()); - NL_TEST_ASSERT(inSuite, !status_code_invalid_in_state.IsSuccess()); + EXPECT_EQ(status_code_invalid_in_state, Status::InvalidInState); + EXPECT_EQ(status_code_invalid_in_state.GetStatus(), Status::InvalidInState); + EXPECT_FALSE(status_code_invalid_in_state.HasClusterSpecificCode()); + EXPECT_FALSE(status_code_invalid_in_state.IsSuccess()); } enum RobotoClusterStatus : uint8_t @@ -77,18 +74,16 @@ void TestClusterStatusCode(nlTestSuite * inSuite, void * inContext) // Cluster-specific usage. { ClusterStatusCode status_code_success = ClusterStatusCode::ClusterSpecificSuccess(RobotoClusterStatus::kSauceSuccess); - NL_TEST_ASSERT_EQUALS(inSuite, status_code_success, Status::Success); - NL_TEST_ASSERT(inSuite, status_code_success.HasClusterSpecificCode()); - NL_TEST_ASSERT_EQUALS(inSuite, status_code_success.GetClusterSpecificCode(), - static_cast<uint8_t>(RobotoClusterStatus::kSauceSuccess)); - NL_TEST_ASSERT(inSuite, status_code_success.IsSuccess()); + EXPECT_EQ(status_code_success, Status::Success); + EXPECT_TRUE(status_code_success.HasClusterSpecificCode()); + EXPECT_EQ(status_code_success.GetClusterSpecificCode(), static_cast<uint8_t>(RobotoClusterStatus::kSauceSuccess)); + EXPECT_TRUE(status_code_success.IsSuccess()); ClusterStatusCode status_code_failure = ClusterStatusCode::ClusterSpecificFailure(RobotoClusterStatus::kSandwichError); - NL_TEST_ASSERT_EQUALS(inSuite, status_code_failure, Status::Failure); - NL_TEST_ASSERT(inSuite, status_code_failure.HasClusterSpecificCode()); - NL_TEST_ASSERT_EQUALS(inSuite, status_code_failure.GetClusterSpecificCode(), - static_cast<uint8_t>(RobotoClusterStatus::kSandwichError)); - NL_TEST_ASSERT(inSuite, !status_code_failure.IsSuccess()); + EXPECT_EQ(status_code_failure, Status::Failure); + EXPECT_TRUE(status_code_failure.HasClusterSpecificCode()); + EXPECT_EQ(status_code_failure.GetClusterSpecificCode(), static_cast<uint8_t>(RobotoClusterStatus::kSandwichError)); + EXPECT_FALSE(status_code_failure.IsSuccess()); } // Copy/Assignment @@ -96,40 +91,19 @@ void TestClusterStatusCode(nlTestSuite * inSuite, void * inContext) ClusterStatusCode status_code_failure1 = ClusterStatusCode::ClusterSpecificFailure(RobotoClusterStatus::kSandwichError); ClusterStatusCode status_code_failure2(status_code_failure1); - NL_TEST_ASSERT_EQUALS(inSuite, status_code_failure1, status_code_failure2); - NL_TEST_ASSERT(inSuite, status_code_failure1.HasClusterSpecificCode()); - NL_TEST_ASSERT(inSuite, status_code_failure2.HasClusterSpecificCode()); + EXPECT_EQ(status_code_failure1, status_code_failure2); + EXPECT_TRUE(status_code_failure1.HasClusterSpecificCode()); + EXPECT_TRUE(status_code_failure2.HasClusterSpecificCode()); - NL_TEST_ASSERT_EQUALS(inSuite, status_code_failure1.GetClusterSpecificCode(), - static_cast<uint8_t>(RobotoClusterStatus::kSandwichError)); - NL_TEST_ASSERT_EQUALS(inSuite, status_code_failure2.GetClusterSpecificCode(), - static_cast<uint8_t>(RobotoClusterStatus::kSandwichError)); + EXPECT_EQ(status_code_failure1.GetClusterSpecificCode(), static_cast<uint8_t>(RobotoClusterStatus::kSandwichError)); + EXPECT_EQ(status_code_failure2.GetClusterSpecificCode(), static_cast<uint8_t>(RobotoClusterStatus::kSandwichError)); ClusterStatusCode status_code_failure3{ Status::InvalidCommand }; - NL_TEST_ASSERT(inSuite, status_code_failure2 != status_code_failure3); + EXPECT_NE(status_code_failure2, status_code_failure3); status_code_failure3 = status_code_failure2; - NL_TEST_ASSERT_EQUALS(inSuite, status_code_failure2, status_code_failure3); + EXPECT_EQ(status_code_failure2, status_code_failure3); } } -// clang-format off -const nlTest sTests[] = -{ - NL_TEST_DEF("TestStatusBasicValues", TestStatusBasicValues), - NL_TEST_DEF("TestClusterStatusCode", TestClusterStatusCode), - NL_TEST_SENTINEL() -}; -// clang-format on - -nlTestSuite sSuite = { "Test IM Status Code abstractions", &sTests[0], nullptr, nullptr }; } // namespace - -int TestClusterStatusCode() -{ - nlTestRunner(&sSuite, nullptr); - - return (nlTestRunnerStats(&sSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestClusterStatusCode) From b68f1b1f30ba6c75874eb965b2b9e47734df811c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20PORTAY?= <gael.portay@rtone.fr> Date: Thu, 25 Apr 2024 14:08:03 +0200 Subject: [PATCH 030/124] [Inet] Fix setting for CLOEXEC flag at socket creation (#33164) * [Inet] Fix setting for SOCK_CLOEXEC The linux kernel allows to set the flag SOCK_CLOEXEC through the parameter type[1]. The implementation sets the flag through the parameter protocol and causes the call to socket()[2] to return -1 with EINVAL. This fixes the behaviour by OR-ing the flag SOCK_CLOEXEC to type instead of protocol. [1]: https://github.com/torvalds/linux/blob/v6.8/net/socket.c#L1655 [2]: https://man7.org/linux/man-pages/man2/socket.2.html * [Inet] Fix setting for O_CLOEXEC The macro O_CLOEXEC is a filedescriptor flag. The implemention sets the flag O_CLOEXEC as the parameter command given to function fcntl[1] and causes the call to fcntl to return -1 with EINVAL. The flag O_CLOEXEC intends to be set using the command F_SETFD. This fixes the behaviour by adding the missing command paramete F_SETFD before the optional argument O_CLOEXEC. [1]: https://man7.org/linux/man-pages/man2/fcntl.2.html --- src/inet/InetInterface.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/inet/InetInterface.cpp b/src/inet/InetInterface.cpp index db10bdba3ed769..af89de8cb96822 100644 --- a/src/inet/InetInterface.cpp +++ b/src/inet/InetInterface.cpp @@ -500,12 +500,12 @@ int GetIOCTLSocket() { int s; #ifdef SOCK_CLOEXEC - s = socket(AF_INET, SOCK_STREAM, SOCK_CLOEXEC); + s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0); if (s < 0) #endif { s = socket(AF_INET, SOCK_STREAM, 0); - fcntl(s, O_CLOEXEC); + fcntl(s, F_SETFD, O_CLOEXEC); } if (!__sync_bool_compare_and_swap(&sIOCTLSocket, -1, s)) From 8e27412a6de6a66388f2c0a66c17a4bd8e999810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damian=20Kr=C3=B3lik?= <66667989+Damian-Nordic@users.noreply.github.com> Date: Thu, 25 Apr 2024 14:39:48 +0200 Subject: [PATCH 031/124] [nrfconnect] Optimize packet buffer size (#33137) Matter requires that regular Matter messages fit in IPv6 MTU of 1280 bytes so the default packet buffer size of 1583 bytes seems excessively large for some configurations. Especially that the buffers only hold the UDP payload in the case of non-LWIP transports. There are two exceptions to the above though: 1. Minimal mDNS uses the same packet buffer pool and mDNS message size is not limited to 1280 bytes, so shrinking the buffer size below MTU might have a negative impact on the mDNS behavior. 2. Matter allows definining so called large messages that can be bigger than 1280 bytes and sent over TCP, but that is not implemented yet and will likely require a different allocation mechanism. Signed-off-by: Damian Krolik <damian.krolik@nordicsemi.no> --- src/platform/nrfconnect/SystemPlatformConfig.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/platform/nrfconnect/SystemPlatformConfig.h b/src/platform/nrfconnect/SystemPlatformConfig.h index ce0df4d5f69ff5..60d9c354d01ab1 100644 --- a/src/platform/nrfconnect/SystemPlatformConfig.h +++ b/src/platform/nrfconnect/SystemPlatformConfig.h @@ -51,4 +51,18 @@ struct ChipDeviceEvent; #define CHIP_SYSTEM_CONFIG_PACKETBUFFER_POOL_SIZE 8 #endif +#ifndef CHIP_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX +#ifdef CONFIG_WIFI_NRF700X +// Minimal mDNS uses Matter packet buffers, so as long as minimal mDNS is used +// in Nordic's Wi-Fi solution, the packet buffers must be a bit bigger than what +// is required by Matter. +#define CHIP_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX CONFIG_NRF_WIFI_IFACE_MTU +#else +// Matter specification requires that Matter messages fit in IPV6 MTU of 1280B +// unless for large messages that can be sent over BTP or TCP. But those will +// likely require a separate buffer pool or employ chained buffers. +#define CHIP_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX 1280 +#endif // CONFIG_WIFI_NRF700X +#endif // CHIP_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX + // ========== Platform-specific Configuration Overrides ========= From c24edd38fe85cb3285fd6f5c361d2df12ae574e8 Mon Sep 17 00:00:00 2001 From: Florian Burtscher <97540177+bufl-blum@users.noreply.github.com> Date: Thu, 25 Apr 2024 14:40:39 +0200 Subject: [PATCH 032/124] added documentation to disable the BlueZ battery plugin (#33133) --- docs/guides/BUILDING.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/guides/BUILDING.md b/docs/guides/BUILDING.md index 3a7ecdd800924b..7cd660227ed165 100644 --- a/docs/guides/BUILDING.md +++ b/docs/guides/BUILDING.md @@ -135,13 +135,20 @@ Complete the following steps: 1. Reboot your Raspberry Pi after installing `pi-bluetooth`. -#### Enable experimental Bluetooth support in BlueZ +#### Enable experimental Bluetooth support and disable battery plugin in BlueZ The Matter application on Linux uses BlueZ to communicate with the Bluetooth controller. The BlueZ version that comes with Ubuntu 22.04 does not support all the features required by the Matter application by default. To enable these features, you need to enable experimental Bluetooth support in BlueZ. +Also disable the battery plugin from BlueZ, because iOS devices advertises a +battery service via BLE, which requires pairing if accessed. BlueZ includes a +battery plugin by default which tries to connect to the battery service. The +authentication fails, because in this case no BLE pairing has been done. If the +BlueZ battery plugin is not disabled, the BLE connection will be terminated +during the Matter commissioning process. + 1. Edit the `bluetooth.service` unit by running the following command: ```sh @@ -153,7 +160,7 @@ features, you need to enable experimental Bluetooth support in BlueZ. ```ini [Service] ExecStart= - ExecStart=/usr/lib/bluetooth/bluetoothd -E + ExecStart=/usr/lib/bluetooth/bluetoothd -E -P battery ``` 1. Restart the Bluetooth service by running the following command: From c4699cf63d68857653bf4b5af8c99eab4eec8096 Mon Sep 17 00:00:00 2001 From: achaulk-goog <107196446+achaulk-goog@users.noreply.github.com> Date: Thu, 25 Apr 2024 08:55:56 -0400 Subject: [PATCH 033/124] More IWYU across app/ & src/ (#32952) * More IWYU across app/ & src/ * Fix bad path --- src/app/util/util.h | 1 + src/lib/dnssd/platform/DnssdBrowseDelegate.h | 3 +++ src/lib/support/CommonIterator.h | 2 ++ src/protocols/bdx/DiagnosticLogs.h | 2 ++ src/transport/TracingStructs.h | 1 + 5 files changed, 9 insertions(+) diff --git a/src/app/util/util.h b/src/app/util/util.h index 6d84a7c0ee947f..d79b63612dd1b0 100644 --- a/src/app/util/util.h +++ b/src/app/util/util.h @@ -21,6 +21,7 @@ #include <app/util/af-types.h> #include <app/util/endpoint-config-api.h> +#include <lib/core/DataModelTypes.h> void emberAfInit(); diff --git a/src/lib/dnssd/platform/DnssdBrowseDelegate.h b/src/lib/dnssd/platform/DnssdBrowseDelegate.h index 8d95a03b8d020e..bb0e6e51867a87 100644 --- a/src/lib/dnssd/platform/DnssdBrowseDelegate.h +++ b/src/lib/dnssd/platform/DnssdBrowseDelegate.h @@ -17,6 +17,9 @@ #pragma once +#include <lib/core/CHIPError.h> +#include <lib/support/DLLUtil.h> + namespace chip { namespace Dnssd { diff --git a/src/lib/support/CommonIterator.h b/src/lib/support/CommonIterator.h index 689625aa292a94..fc799c33b233eb 100644 --- a/src/lib/support/CommonIterator.h +++ b/src/lib/support/CommonIterator.h @@ -22,6 +22,8 @@ #pragma once +#include <stddef.h> + namespace chip { /** diff --git a/src/protocols/bdx/DiagnosticLogs.h b/src/protocols/bdx/DiagnosticLogs.h index 60ec2a33080c9c..a3bf0428186705 100644 --- a/src/protocols/bdx/DiagnosticLogs.h +++ b/src/protocols/bdx/DiagnosticLogs.h @@ -18,6 +18,8 @@ #pragma once +#include <stdint.h> + namespace chip { namespace bdx { namespace DiagnosticLogs { diff --git a/src/transport/TracingStructs.h b/src/transport/TracingStructs.h index 5f57663e46dba2..987e2311950dc9 100644 --- a/src/transport/TracingStructs.h +++ b/src/transport/TracingStructs.h @@ -19,6 +19,7 @@ #include <lib/support/Span.h> #include <transport/Session.h> #include <transport/raw/MessageHeader.h> +#include <transport/raw/PeerAddress.h> namespace chip { namespace Tracing { From f4dbc23d6e7e259ac0bba6ce2558db44b15711bf Mon Sep 17 00:00:00 2001 From: Suhas Shankar <118879678+su-shanka@users.noreply.github.com> Date: Thu, 25 Apr 2024 18:48:49 +0530 Subject: [PATCH 034/124] [Dnssd] Refactored DiscoveredNodeData definition and usage (#33025) * Refactored DiscoveredNodeData definition and usage * Restyled by whitespace * Restyled by clang-format * updates based on review feedback * Restyled by whitespace * Restyled by clang-format * fix for build failure * Updates as per feedback * Restyled by clang-format --------- Co-authored-by: Restyled.io <commits@restyled.io> --- .../commands/common/DeviceScanner.cpp | 7 +- .../commands/common/RemoteDataModelLogger.cpp | 6 +- .../commands/common/RemoteDataModelLogger.h | 2 +- .../DiscoverCommissionablesCommand.cpp | 2 +- .../discover/DiscoverCommissionablesCommand.h | 2 +- .../discover/DiscoverCommissionersCommand.cpp | 2 +- .../commands/pairing/PairingCommand.cpp | 6 +- .../commands/pairing/PairingCommand.h | 2 +- .../linux/ControllerShellCommands.cpp | 5 +- .../app/src/main/jni/cpp/ConversionUtils.cpp | 55 ++- .../app/src/main/jni/cpp/ConversionUtils.h | 2 +- .../app/src/main/jni/cpp/TvCastingApp-JNI.cpp | 2 +- .../CastingServerBridge.mm | 4 +- .../CommissionerDiscoveryDelegateImpl.h | 4 +- .../MatterTvCastingBridge/ConversionUtils.hpp | 4 +- .../MatterTvCastingBridge/ConversionUtils.mm | 70 +-- .../tv-casting-app/linux/CastingUtils.cpp | 8 +- examples/tv-casting-app/linux/CastingUtils.h | 2 +- .../core/CastingPlayerDiscovery.cpp | 27 +- .../core/CastingPlayerDiscovery.h | 2 +- .../tv-casting-common/include/CastingServer.h | 4 +- .../include/TargetVideoPlayerInfo.h | 2 +- .../tv-casting-common/src/CastingServer.cpp | 32 +- .../tv-casting-common/src/ConversionUtils.cpp | 21 +- .../src/TargetVideoPlayerInfo.cpp | 6 +- .../AbstractDnssdDiscoveryController.cpp | 21 +- .../AbstractDnssdDiscoveryController.h | 4 +- .../CHIPCommissionableNodeController.cpp | 2 +- .../CHIPCommissionableNodeController.h | 4 +- src/controller/CHIPDeviceController.cpp | 2 +- src/controller/CHIPDeviceController.h | 4 +- src/controller/DeviceDiscoveryDelegate.h | 2 +- src/controller/SetUpCodePairer.cpp | 21 +- .../java/CHIPDeviceController-JNI.cpp | 28 +- ...issionableNodeController-ScriptBinding.cpp | 48 +- .../python/ChipDeviceController-Discovery.cpp | 105 +++-- ...r-ScriptPairingDeviceDiscoveryDelegate.cpp | 13 +- ...ler-ScriptPairingDeviceDiscoveryDelegate.h | 2 +- .../TestCommissionableNodeController.cpp | 75 ++-- .../CHIP/MTRCommissionableBrowser.mm | 9 +- src/lib/dnssd/ActiveResolveAttempts.h | 13 +- src/lib/dnssd/Discovery_ImplPlatform.cpp | 24 +- src/lib/dnssd/IncrementalResolve.cpp | 15 +- src/lib/dnssd/IncrementalResolve.h | 4 +- src/lib/dnssd/Resolver_ImplMinimalMdns.cpp | 2 - src/lib/dnssd/TxtFields.cpp | 2 +- src/lib/dnssd/TxtFields.h | 2 +- src/lib/dnssd/Types.h | 34 +- .../dnssd/tests/TestActiveResolveAttempts.cpp | 6 +- .../dnssd/tests/TestIncrementalResolve.cpp | 31 +- src/lib/dnssd/tests/TestTxtFields.cpp | 423 +++++++++++++++--- src/lib/shell/commands/Dns.cpp | 55 +-- .../UserDirectedCommissioningServer.cpp | 52 +-- .../tests/TestUdcMessages.cpp | 42 +- 54 files changed, 822 insertions(+), 502 deletions(-) diff --git a/examples/chip-tool/commands/common/DeviceScanner.cpp b/examples/chip-tool/commands/common/DeviceScanner.cpp index 9d3dbca98f8db9..548e461f96ca8e 100644 --- a/examples/chip-tool/commands/common/DeviceScanner.cpp +++ b/examples/chip-tool/commands/common/DeviceScanner.cpp @@ -55,7 +55,8 @@ CHIP_ERROR DeviceScanner::Stop() void DeviceScanner::OnNodeDiscovered(const DiscoveredNodeData & nodeData) { - auto & commissionData = nodeData.nodeData; + VerifyOrReturn(nodeData.Is<CommissionNodeData>()); + auto & commissionData = nodeData.Get<CommissionNodeData>(); auto discriminator = commissionData.longDiscriminator; auto vendorId = static_cast<VendorId>(commissionData.vendorId); @@ -64,7 +65,7 @@ void DeviceScanner::OnNodeDiscovered(const DiscoveredNodeData & nodeData) ChipLogProgress(chipTool, "OnNodeDiscovered (MDNS): discriminator: %u, vendorId: %u, productId: %u", discriminator, vendorId, productId); - auto & resolutionData = nodeData.resolutionData; + const CommonResolutionData & resolutionData = commissionData; auto & instanceData = mDiscoveredResults[commissionData.instanceName]; auto & interfaceData = instanceData[resolutionData.interfaceId.GetPlatformInterface()]; @@ -76,7 +77,7 @@ void DeviceScanner::OnNodeDiscovered(const DiscoveredNodeData & nodeData) interfaceData.push_back(result); } - nodeData.LogDetail(); + commissionData.LogDetail(); } void DeviceScanner::OnBrowseAdd(chip::Dnssd::DnssdService service) diff --git a/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp b/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp index 9e3026262db97d..9a996051957ccf 100644 --- a/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp +++ b/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp @@ -204,12 +204,12 @@ CHIP_ERROR LogIssueNOCChain(const char * noc, const char * icac, const char * rc return gDelegate->LogJSON(valueStr.c_str()); } -CHIP_ERROR LogDiscoveredNodeData(const chip::Dnssd::DiscoveredNodeData & nodeData) +CHIP_ERROR LogDiscoveredNodeData(const chip::Dnssd::CommissionNodeData & nodeData) { VerifyOrReturnError(gDelegate != nullptr, CHIP_NO_ERROR); - auto & resolutionData = nodeData.resolutionData; - auto & commissionData = nodeData.nodeData; + auto & commissionData = nodeData; + auto & resolutionData = commissionData; if (!chip::CanCastTo<uint8_t>(resolutionData.numIPs)) { diff --git a/examples/chip-tool/commands/common/RemoteDataModelLogger.h b/examples/chip-tool/commands/common/RemoteDataModelLogger.h index 7c93a50aa1f191..215433588e3ae6 100644 --- a/examples/chip-tool/commands/common/RemoteDataModelLogger.h +++ b/examples/chip-tool/commands/common/RemoteDataModelLogger.h @@ -43,6 +43,6 @@ CHIP_ERROR LogErrorAsJSON(const CHIP_ERROR & error); CHIP_ERROR LogGetCommissionerNodeId(chip::NodeId value); CHIP_ERROR LogGetCommissionerRootCertificate(const char * value); CHIP_ERROR LogIssueNOCChain(const char * noc, const char * icac, const char * rcac, const char * ipk); -CHIP_ERROR LogDiscoveredNodeData(const chip::Dnssd::DiscoveredNodeData & nodeData); +CHIP_ERROR LogDiscoveredNodeData(const chip::Dnssd::CommissionNodeData & nodeData); void SetDelegate(RemoteDataModelLoggerDelegate * delegate); }; // namespace RemoteDataModelLogger diff --git a/examples/chip-tool/commands/discover/DiscoverCommissionablesCommand.cpp b/examples/chip-tool/commands/discover/DiscoverCommissionablesCommand.cpp index 9e65a87b16bac7..ad5e7feaf7f948 100644 --- a/examples/chip-tool/commands/discover/DiscoverCommissionablesCommand.cpp +++ b/examples/chip-tool/commands/discover/DiscoverCommissionablesCommand.cpp @@ -23,7 +23,7 @@ using namespace ::chip; -void DiscoverCommissionablesCommandBase::OnDiscoveredDevice(const chip::Dnssd::DiscoveredNodeData & nodeData) +void DiscoverCommissionablesCommandBase::OnDiscoveredDevice(const chip::Dnssd::CommissionNodeData & nodeData) { nodeData.LogDetail(); LogErrorOnFailure(RemoteDataModelLogger::LogDiscoveredNodeData(nodeData)); diff --git a/examples/chip-tool/commands/discover/DiscoverCommissionablesCommand.h b/examples/chip-tool/commands/discover/DiscoverCommissionablesCommand.h index bac24634152823..d1fec307eac19e 100644 --- a/examples/chip-tool/commands/discover/DiscoverCommissionablesCommand.h +++ b/examples/chip-tool/commands/discover/DiscoverCommissionablesCommand.h @@ -31,7 +31,7 @@ class DiscoverCommissionablesCommandBase : public CHIPCommand, public chip::Cont } /////////// DeviceDiscoveryDelegate Interface ///////// - void OnDiscoveredDevice(const chip::Dnssd::DiscoveredNodeData & nodeData) override; + void OnDiscoveredDevice(const chip::Dnssd::CommissionNodeData & nodeData) override; /////////// CHIPCommand Interface ///////// chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(30); } diff --git a/examples/chip-tool/commands/discover/DiscoverCommissionersCommand.cpp b/examples/chip-tool/commands/discover/DiscoverCommissionersCommand.cpp index 57c7574c4ea2e3..30de62b9329173 100644 --- a/examples/chip-tool/commands/discover/DiscoverCommissionersCommand.cpp +++ b/examples/chip-tool/commands/discover/DiscoverCommissionersCommand.cpp @@ -32,7 +32,7 @@ void DiscoverCommissionersCommand::Shutdown() [[maybe_unused]] int commissionerCount = 0; for (int i = 0; i < CHIP_DEVICE_CONFIG_MAX_DISCOVERED_NODES; i++) { - const Dnssd::DiscoveredNodeData * commissioner = mCommissionableNodeController.GetDiscoveredCommissioner(i); + const Dnssd::CommissionNodeData * commissioner = mCommissionableNodeController.GetDiscoveredCommissioner(i); if (commissioner != nullptr) { ChipLogProgress(chipTool, "Discovered Commissioner #%d", commissionerCount); diff --git a/examples/chip-tool/commands/pairing/PairingCommand.cpp b/examples/chip-tool/commands/pairing/PairingCommand.cpp index 5ec206c25b7ea0..31da1329308c5b 100644 --- a/examples/chip-tool/commands/pairing/PairingCommand.cpp +++ b/examples/chip-tool/commands/pairing/PairingCommand.cpp @@ -479,12 +479,12 @@ void PairingCommand::OnICDStayActiveComplete(NodeId deviceId, uint32_t promisedA ChipLogValueX64(deviceId), promisedActiveDuration); } -void PairingCommand::OnDiscoveredDevice(const chip::Dnssd::DiscoveredNodeData & nodeData) +void PairingCommand::OnDiscoveredDevice(const chip::Dnssd::CommissionNodeData & nodeData) { // Ignore nodes with closed commissioning window - VerifyOrReturn(nodeData.nodeData.commissioningMode != 0); + VerifyOrReturn(nodeData.commissioningMode != 0); - auto & resolutionData = nodeData.resolutionData; + auto & resolutionData = nodeData; const uint16_t port = resolutionData.port; char buf[chip::Inet::IPAddress::kMaxStringLength]; diff --git a/examples/chip-tool/commands/pairing/PairingCommand.h b/examples/chip-tool/commands/pairing/PairingCommand.h index 0baf70128531b8..4df17f7dee40b5 100644 --- a/examples/chip-tool/commands/pairing/PairingCommand.h +++ b/examples/chip-tool/commands/pairing/PairingCommand.h @@ -201,7 +201,7 @@ class PairingCommand : public CHIPCommand, void OnICDStayActiveComplete(NodeId deviceId, uint32_t promisedActiveDuration) override; /////////// DeviceDiscoveryDelegate Interface ///////// - void OnDiscoveredDevice(const chip::Dnssd::DiscoveredNodeData & nodeData) override; + void OnDiscoveredDevice(const chip::Dnssd::CommissionNodeData & nodeData) override; /////////// DeviceAttestationDelegate ///////// chip::Optional<uint16_t> FailSafeExpiryTimeoutSecs() const override; diff --git a/examples/platform/linux/ControllerShellCommands.cpp b/examples/platform/linux/ControllerShellCommands.cpp index aefbb3fafa4353..b2bc8af2d8f92b 100644 --- a/examples/platform/linux/ControllerShellCommands.cpp +++ b/examples/platform/linux/ControllerShellCommands.cpp @@ -116,7 +116,7 @@ static CHIP_ERROR display(bool printHeader) for (int i = 0; i < 10; i++) { - const Dnssd::DiscoveredNodeData * next = GetDeviceCommissioner()->GetDiscoveredDevice(i); + const Dnssd::CommissionNodeData * next = GetDeviceCommissioner()->GetDiscoveredDevice(i); if (next == nullptr) { streamer_printf(sout, " Entry %d null\r\n", i); @@ -124,8 +124,7 @@ static CHIP_ERROR display(bool printHeader) else { streamer_printf(sout, " Entry %d instanceName=%s host=%s longDiscriminator=%d vendorId=%d productId=%d\r\n", i, - next->nodeData.instanceName, next->resolutionData.hostName, next->nodeData.longDiscriminator, - next->nodeData.vendorId, next->nodeData.productId); + next->instanceName, next->hostName, next->longDiscriminator, next->vendorId, next->productId); } } diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/ConversionUtils.cpp b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/ConversionUtils.cpp index fd66ba44649cea..c8a38942e60234 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/ConversionUtils.cpp +++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/ConversionUtils.cpp @@ -301,7 +301,7 @@ CHIP_ERROR convertTargetVideoPlayerInfoToJVideoPlayer(TargetVideoPlayerInfo * ta } CHIP_ERROR convertJDiscoveredNodeDataToCppDiscoveredNodeData(jobject jDiscoveredNodeData, - chip::Dnssd::DiscoveredNodeData & outCppDiscoveredNodeData) + chip::Dnssd::CommissionNodeData & outCppDiscoveredNodeData) { ChipLogProgress(AppServer, "convertJDiscoveredNodeDataToCppDiscoveredNodeData called"); VerifyOrReturnError(jDiscoveredNodeData != nullptr, CHIP_ERROR_INVALID_ARGUMENT); @@ -316,7 +316,7 @@ CHIP_ERROR convertJDiscoveredNodeDataToCppDiscoveredNodeData(jobject jDiscovered jstring jHostName = static_cast<jstring>(env->GetObjectField(jDiscoveredNodeData, getHostNameField)); if (jHostName != nullptr) { - chip::Platform::CopyString(outCppDiscoveredNodeData.resolutionData.hostName, chip::Dnssd::kHostNameMaxLength + 1, + chip::Platform::CopyString(outCppDiscoveredNodeData.hostName, chip::Dnssd::kHostNameMaxLength + 1, env->GetStringUTFChars(jHostName, 0)); } @@ -324,61 +324,58 @@ CHIP_ERROR convertJDiscoveredNodeDataToCppDiscoveredNodeData(jobject jDiscovered jstring jInstanceName = static_cast<jstring>(env->GetObjectField(jDiscoveredNodeData, getInstanceNameField)); if (jInstanceName != nullptr) { - chip::Platform::CopyString(outCppDiscoveredNodeData.nodeData.instanceName, - chip::Dnssd::Commission::kInstanceNameMaxLength + 1, env->GetStringUTFChars(jInstanceName, 0)); + chip::Platform::CopyString(outCppDiscoveredNodeData.instanceName, chip::Dnssd::Commission::kInstanceNameMaxLength + 1, + env->GetStringUTFChars(jInstanceName, 0)); } - jfieldID jLongDiscriminatorField = env->GetFieldID(jDiscoveredNodeDataClass, "longDiscriminator", "J"); - outCppDiscoveredNodeData.nodeData.vendorId = - static_cast<uint16_t>(env->GetLongField(jDiscoveredNodeData, jLongDiscriminatorField)); + jfieldID jLongDiscriminatorField = env->GetFieldID(jDiscoveredNodeDataClass, "longDiscriminator", "J"); + outCppDiscoveredNodeData.vendorId = static_cast<uint16_t>(env->GetLongField(jDiscoveredNodeData, jLongDiscriminatorField)); - jfieldID jVendorIdField = env->GetFieldID(jDiscoveredNodeDataClass, "vendorId", "J"); - outCppDiscoveredNodeData.nodeData.vendorId = static_cast<uint16_t>(env->GetLongField(jDiscoveredNodeData, jVendorIdField)); + jfieldID jVendorIdField = env->GetFieldID(jDiscoveredNodeDataClass, "vendorId", "J"); + outCppDiscoveredNodeData.vendorId = static_cast<uint16_t>(env->GetLongField(jDiscoveredNodeData, jVendorIdField)); - jfieldID jProductIdField = env->GetFieldID(jDiscoveredNodeDataClass, "productId", "J"); - outCppDiscoveredNodeData.nodeData.productId = static_cast<uint16_t>(env->GetLongField(jDiscoveredNodeData, jProductIdField)); + jfieldID jProductIdField = env->GetFieldID(jDiscoveredNodeDataClass, "productId", "J"); + outCppDiscoveredNodeData.productId = static_cast<uint16_t>(env->GetLongField(jDiscoveredNodeData, jProductIdField)); jfieldID jCommissioningModeField = env->GetFieldID(jDiscoveredNodeDataClass, "commissioningMode", "B"); - outCppDiscoveredNodeData.nodeData.commissioningMode = + outCppDiscoveredNodeData.commissioningMode = static_cast<uint8_t>(env->GetByteField(jDiscoveredNodeData, jCommissioningModeField)); - jfieldID jDeviceTypeField = env->GetFieldID(jDiscoveredNodeDataClass, "deviceType", "J"); - outCppDiscoveredNodeData.nodeData.deviceType = static_cast<uint16_t>(env->GetLongField(jDiscoveredNodeData, jDeviceTypeField)); + jfieldID jDeviceTypeField = env->GetFieldID(jDiscoveredNodeDataClass, "deviceType", "J"); + outCppDiscoveredNodeData.deviceType = static_cast<uint16_t>(env->GetLongField(jDiscoveredNodeData, jDeviceTypeField)); jfieldID getDeviceNameField = env->GetFieldID(jDiscoveredNodeDataClass, "deviceName", "Ljava/lang/String;"); jstring jDeviceName = static_cast<jstring>(env->GetObjectField(jDiscoveredNodeData, getDeviceNameField)); if (jDeviceName != nullptr) { - chip::Platform::CopyString(outCppDiscoveredNodeData.nodeData.deviceName, chip::Dnssd::kMaxDeviceNameLen + 1, + chip::Platform::CopyString(outCppDiscoveredNodeData.deviceName, chip::Dnssd::kMaxDeviceNameLen + 1, env->GetStringUTFChars(jDeviceName, 0)); } // TODO: map rotating ID - jfieldID jRotatingIdLenField = env->GetFieldID(jDiscoveredNodeDataClass, "rotatingIdLen", "I"); - outCppDiscoveredNodeData.nodeData.rotatingIdLen = - static_cast<size_t>(env->GetIntField(jDiscoveredNodeData, jRotatingIdLenField)); + jfieldID jRotatingIdLenField = env->GetFieldID(jDiscoveredNodeDataClass, "rotatingIdLen", "I"); + outCppDiscoveredNodeData.rotatingIdLen = static_cast<size_t>(env->GetIntField(jDiscoveredNodeData, jRotatingIdLenField)); - jfieldID jPairingHintField = env->GetFieldID(jDiscoveredNodeDataClass, "pairingHint", "S"); - outCppDiscoveredNodeData.nodeData.pairingHint = - static_cast<uint16_t>(env->GetShortField(jDiscoveredNodeData, jPairingHintField)); + jfieldID jPairingHintField = env->GetFieldID(jDiscoveredNodeDataClass, "pairingHint", "S"); + outCppDiscoveredNodeData.pairingHint = static_cast<uint16_t>(env->GetShortField(jDiscoveredNodeData, jPairingHintField)); jfieldID getPairingInstructionField = env->GetFieldID(jDiscoveredNodeDataClass, "pairingInstruction", "Ljava/lang/String;"); jstring jPairingInstruction = static_cast<jstring>(env->GetObjectField(jDiscoveredNodeData, getPairingInstructionField)); if (jPairingInstruction != nullptr) { - chip::Platform::CopyString(outCppDiscoveredNodeData.nodeData.pairingInstruction, chip::Dnssd::kMaxPairingInstructionLen + 1, + chip::Platform::CopyString(outCppDiscoveredNodeData.pairingInstruction, chip::Dnssd::kMaxPairingInstructionLen + 1, env->GetStringUTFChars(jPairingInstruction, 0)); } - jfieldID jPortField = env->GetFieldID(jDiscoveredNodeDataClass, "port", "I"); - outCppDiscoveredNodeData.resolutionData.port = static_cast<uint16_t>(env->GetIntField(jDiscoveredNodeData, jPortField)); + jfieldID jPortField = env->GetFieldID(jDiscoveredNodeDataClass, "port", "I"); + outCppDiscoveredNodeData.port = static_cast<uint16_t>(env->GetIntField(jDiscoveredNodeData, jPortField)); - jfieldID jNumIpsField = env->GetFieldID(jDiscoveredNodeDataClass, "numIPs", "I"); - outCppDiscoveredNodeData.resolutionData.numIPs = static_cast<size_t>(env->GetIntField(jDiscoveredNodeData, jNumIpsField)); + jfieldID jNumIpsField = env->GetFieldID(jDiscoveredNodeDataClass, "numIPs", "I"); + outCppDiscoveredNodeData.numIPs = static_cast<size_t>(env->GetIntField(jDiscoveredNodeData, jNumIpsField)); jfieldID jIPAddressesField = env->GetFieldID(jDiscoveredNodeDataClass, "ipAddresses", "Ljava/util/List;"); jobject jIPAddresses = env->GetObjectField(jDiscoveredNodeData, jIPAddressesField); - if (jIPAddresses == nullptr && outCppDiscoveredNodeData.resolutionData.numIPs > 0) + if (jIPAddresses == nullptr && outCppDiscoveredNodeData.numIPs > 0) { return CHIP_ERROR_INVALID_ARGUMENT; } @@ -400,11 +397,11 @@ CHIP_ERROR convertJDiscoveredNodeDataToCppDiscoveredNodeData(jobject jDiscovered chip::Inet::IPAddress addressInet; chip::JniUtfString addressJniString(env, jIPAddressStr); VerifyOrReturnError(chip::Inet::IPAddress::FromString(addressJniString.c_str(), addressInet), CHIP_ERROR_INVALID_ARGUMENT); - outCppDiscoveredNodeData.resolutionData.ipAddress[ipAddressCount] = addressInet; + outCppDiscoveredNodeData.ipAddress[ipAddressCount] = addressInet; if (ipAddressCount == 0) { - outCppDiscoveredNodeData.resolutionData.interfaceId = chip::Inet::InterfaceId::FromIPAddress(addressInet); + outCppDiscoveredNodeData.interfaceId = chip::Inet::InterfaceId::FromIPAddress(addressInet); } ipAddressCount++; } diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/ConversionUtils.h b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/ConversionUtils.h index a2c59596d9e9e5..28f5a1abd28c5a 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/ConversionUtils.h +++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/ConversionUtils.h @@ -33,4 +33,4 @@ CHIP_ERROR convertJVideoPlayerToTargetVideoPlayerInfo(jobject videoPlayer, Targe CHIP_ERROR convertTargetVideoPlayerInfoToJVideoPlayer(TargetVideoPlayerInfo * targetVideoPlayerInfo, jobject & outVideoPlayer); CHIP_ERROR convertJDiscoveredNodeDataToCppDiscoveredNodeData(jobject jDiscoveredNodeData, - chip::Dnssd::DiscoveredNodeData & cppDiscoveredNodeData); + chip::Dnssd::CommissionNodeData & cppDiscoveredNodeData); diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp index 6dbdfba9c83449..f2e0d5b79fc53c 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp +++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp @@ -372,7 +372,7 @@ JNI_METHOD(jboolean, sendCommissioningRequest)(JNIEnv * env, jobject, jobject jD chip::DeviceLayer::StackLock lock; ChipLogProgress(AppServer, "JNI_METHOD sendCommissioningRequest called"); - chip::Dnssd::DiscoveredNodeData commissioner; + chip::Dnssd::CommissionNodeData commissioner; CHIP_ERROR err = convertJDiscoveredNodeDataToCppDiscoveredNodeData(jDiscoveredNodeData, commissioner); VerifyOrExit(err == CHIP_NO_ERROR, ChipLogError(AppServer, diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm index 86a1976aed7d18..f199ba96b7a5a5 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm @@ -456,7 +456,7 @@ - (void)getDiscoveredCommissioner:(int)index block:^{ chip::Optional<TargetVideoPlayerInfo *> associatedConnectableVideoPlayer; DiscoveredNodeData * commissioner = nil; - const chip::Dnssd::DiscoveredNodeData * cppDiscoveredNodeData + const chip::Dnssd::CommissionNodeData * cppDiscoveredNodeData = CastingServer::GetInstance()->GetDiscoveredCommissioner( index, associatedConnectableVideoPlayer); if (cppDiscoveredNodeData != nullptr) { @@ -530,7 +530,7 @@ - (void)sendUserDirectedCommissioningRequest:(DiscoveredNodeData * _Nonnull)comm block:^{ bool udcRequestStatus; - chip::Dnssd::DiscoveredNodeData cppCommissioner; + chip::Dnssd::CommissionNodeData cppCommissioner; if ([ConversionUtils convertToCppDiscoveredNodeDataFrom:commissioner outDiscoveredNodeData:cppCommissioner] != CHIP_NO_ERROR) { diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CommissionerDiscoveryDelegateImpl.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CommissionerDiscoveryDelegateImpl.h index 07c1f5c68fc893..8f55e33e27402a 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CommissionerDiscoveryDelegateImpl.h +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CommissionerDiscoveryDelegateImpl.h @@ -61,10 +61,10 @@ class CommissionerDiscoveryDelegateImpl : public chip::Controller::DeviceDiscove } } - void OnDiscoveredDevice(const chip::Dnssd::DiscoveredNodeData & nodeData) + void OnDiscoveredDevice(const chip::Dnssd::CommissionNodeData & nodeData) { ChipLogProgress(AppServer, "CommissionerDiscoveryDelegateImpl().OnDiscoveredDevice() called"); - __block const chip::Dnssd::DiscoveredNodeData cppNodeData = nodeData; + __block const chip::Dnssd::CommissionNodeData cppNodeData = nodeData; dispatch_async(mClientQueue, ^{ DiscoveredNodeData * objCDiscoveredNodeData = [ConversionUtils convertToObjCDiscoveredNodeDataFrom:&cppNodeData]; mDiscoveredCommissioners.push_back(objCDiscoveredNodeData); // add to the list of discovered commissioners diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/ConversionUtils.hpp b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/ConversionUtils.hpp index d60b442c03c7a5..597b3728e3f6c5 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/ConversionUtils.hpp +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/ConversionUtils.hpp @@ -43,7 +43,7 @@ outTargetVideoPlayerInfo:(TargetVideoPlayerInfo &)outTargetVideoPlayerInfo; + (CHIP_ERROR)convertToCppDiscoveredNodeDataFrom:(DiscoveredNodeData * _Nonnull)objCDiscoveredNodeData - outDiscoveredNodeData:(chip::Dnssd::DiscoveredNodeData &)outDiscoveredNodeData; + outDiscoveredNodeData:(chip::Dnssd::CommissionNodeData &)outDiscoveredNodeData; /** * @brief C++ to Objective C converters @@ -51,7 +51,7 @@ + (ContentApp * _Nonnull)convertToObjCContentAppFrom:(TargetEndpointInfo * _Nonnull)cppTargetEndpointInfo; + (DiscoveredNodeData * _Nonnull)convertToObjCDiscoveredNodeDataFrom: - (const chip::Dnssd::DiscoveredNodeData * _Nonnull)cppDiscoveredNodedata; + (const chip::Dnssd::CommissionNodeData * _Nonnull)cppDiscoveredNodedata; + (VideoPlayer * _Nonnull)convertToObjCVideoPlayerFrom:(TargetVideoPlayerInfo * _Nonnull)cppTargetVideoPlayerInfo; diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/ConversionUtils.mm b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/ConversionUtils.mm index 902e386ae551e1..5cce096756bfa0 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/ConversionUtils.mm +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/ConversionUtils.mm @@ -45,36 +45,36 @@ + (CHIP_ERROR)convertToCppTargetEndpointInfoFrom:(ContentApp * _Nonnull)objCCont } + (CHIP_ERROR)convertToCppDiscoveredNodeDataFrom:(DiscoveredNodeData * _Nonnull)objCDiscoveredNodeData - outDiscoveredNodeData:(chip::Dnssd::DiscoveredNodeData &)outDiscoveredNodeData + outDiscoveredNodeData:(chip::Dnssd::CommissionNodeData &)outDiscoveredNodeData { // setting CommissionNodeData - outDiscoveredNodeData.nodeData.deviceType = objCDiscoveredNodeData.deviceType; - outDiscoveredNodeData.nodeData.vendorId = objCDiscoveredNodeData.vendorId; - outDiscoveredNodeData.nodeData.productId = objCDiscoveredNodeData.productId; - outDiscoveredNodeData.nodeData.longDiscriminator = objCDiscoveredNodeData.longDiscriminator; - outDiscoveredNodeData.nodeData.commissioningMode = objCDiscoveredNodeData.commissioningMode; - outDiscoveredNodeData.nodeData.pairingHint = objCDiscoveredNodeData.pairingHint; - memset(outDiscoveredNodeData.nodeData.deviceName, '\0', sizeof(outDiscoveredNodeData.nodeData.deviceName)); + outDiscoveredNodeData.deviceType = objCDiscoveredNodeData.deviceType; + outDiscoveredNodeData.vendorId = objCDiscoveredNodeData.vendorId; + outDiscoveredNodeData.productId = objCDiscoveredNodeData.productId; + outDiscoveredNodeData.longDiscriminator = objCDiscoveredNodeData.longDiscriminator; + outDiscoveredNodeData.commissioningMode = objCDiscoveredNodeData.commissioningMode; + outDiscoveredNodeData.pairingHint = objCDiscoveredNodeData.pairingHint; + memset(outDiscoveredNodeData.deviceName, '\0', sizeof(outDiscoveredNodeData.deviceName)); if (objCDiscoveredNodeData.deviceName != nullptr) { - chip::Platform::CopyString(outDiscoveredNodeData.nodeData.deviceName, chip::Dnssd::kMaxDeviceNameLen + 1, + chip::Platform::CopyString(outDiscoveredNodeData.deviceName, chip::Dnssd::kMaxDeviceNameLen + 1, [objCDiscoveredNodeData.deviceName UTF8String]); } - outDiscoveredNodeData.nodeData.rotatingIdLen = objCDiscoveredNodeData.rotatingIdLen; + outDiscoveredNodeData.rotatingIdLen = objCDiscoveredNodeData.rotatingIdLen; memcpy( - outDiscoveredNodeData.nodeData.rotatingId, objCDiscoveredNodeData.rotatingId, objCDiscoveredNodeData.rotatingIdLen); + outDiscoveredNodeData.rotatingId, objCDiscoveredNodeData.rotatingId, objCDiscoveredNodeData.rotatingIdLen); // setting CommonResolutionData - outDiscoveredNodeData.resolutionData.port = objCDiscoveredNodeData.port; - memset(outDiscoveredNodeData.resolutionData.hostName, '\0', sizeof(outDiscoveredNodeData.resolutionData.hostName)); + outDiscoveredNodeData.port = objCDiscoveredNodeData.port; + memset(outDiscoveredNodeData.hostName, '\0', sizeof(outDiscoveredNodeData.hostName)); if (objCDiscoveredNodeData.hostName != nullptr) { - chip::Platform::CopyString(outDiscoveredNodeData.resolutionData.hostName, chip::Dnssd::kHostNameMaxLength + 1, + chip::Platform::CopyString(outDiscoveredNodeData.hostName, chip::Dnssd::kHostNameMaxLength + 1, [objCDiscoveredNodeData.hostName UTF8String]); } - outDiscoveredNodeData.resolutionData.interfaceId = chip::Inet::InterfaceId(objCDiscoveredNodeData.platformInterface); - outDiscoveredNodeData.resolutionData.numIPs = objCDiscoveredNodeData.numIPs; + outDiscoveredNodeData.interfaceId = chip::Inet::InterfaceId(objCDiscoveredNodeData.platformInterface); + outDiscoveredNodeData.numIPs = objCDiscoveredNodeData.numIPs; for (size_t i = 0; i < objCDiscoveredNodeData.numIPs; i++) { chip::Inet::IPAddress::FromString( - [objCDiscoveredNodeData.ipAddresses[i] UTF8String], outDiscoveredNodeData.resolutionData.ipAddress[i]); + [objCDiscoveredNodeData.ipAddresses[i] UTF8String], outDiscoveredNodeData.ipAddress[i]); } return CHIP_NO_ERROR; } @@ -116,36 +116,36 @@ + (ContentApp *)convertToObjCContentAppFrom:(TargetEndpointInfo * _Nonnull)cppTa return objCContentApp; } -+ (DiscoveredNodeData *)convertToObjCDiscoveredNodeDataFrom:(const chip::Dnssd::DiscoveredNodeData * _Nonnull)cppDiscoveredNodedata ++ (DiscoveredNodeData *)convertToObjCDiscoveredNodeDataFrom:(const chip::Dnssd::CommissionNodeData * _Nonnull)cppDiscoveredNodedata { DiscoveredNodeData * objCDiscoveredNodeData = [DiscoveredNodeData new]; // from CommissionNodeData - objCDiscoveredNodeData.deviceType = cppDiscoveredNodedata->nodeData.deviceType; - objCDiscoveredNodeData.vendorId = cppDiscoveredNodedata->nodeData.vendorId; - objCDiscoveredNodeData.productId = cppDiscoveredNodedata->nodeData.productId; - objCDiscoveredNodeData.longDiscriminator = cppDiscoveredNodedata->nodeData.longDiscriminator; - objCDiscoveredNodeData.commissioningMode = cppDiscoveredNodedata->nodeData.commissioningMode; - objCDiscoveredNodeData.pairingHint = cppDiscoveredNodedata->nodeData.pairingHint; - objCDiscoveredNodeData.deviceName = [NSString stringWithCString:cppDiscoveredNodedata->nodeData.deviceName + objCDiscoveredNodeData.deviceType = cppDiscoveredNodedata->deviceType; + objCDiscoveredNodeData.vendorId = cppDiscoveredNodedata->vendorId; + objCDiscoveredNodeData.productId = cppDiscoveredNodedata->productId; + objCDiscoveredNodeData.longDiscriminator = cppDiscoveredNodedata->longDiscriminator; + objCDiscoveredNodeData.commissioningMode = cppDiscoveredNodedata->commissioningMode; + objCDiscoveredNodeData.pairingHint = cppDiscoveredNodedata->pairingHint; + objCDiscoveredNodeData.deviceName = [NSString stringWithCString:cppDiscoveredNodedata->deviceName encoding:NSUTF8StringEncoding]; - objCDiscoveredNodeData.rotatingIdLen = cppDiscoveredNodedata->nodeData.rotatingIdLen; - objCDiscoveredNodeData.rotatingId = cppDiscoveredNodedata->nodeData.rotatingId; - objCDiscoveredNodeData.instanceName = [NSString stringWithCString:cppDiscoveredNodedata->nodeData.instanceName + objCDiscoveredNodeData.rotatingIdLen = cppDiscoveredNodedata->rotatingIdLen; + objCDiscoveredNodeData.rotatingId = cppDiscoveredNodedata->rotatingId; + objCDiscoveredNodeData.instanceName = [NSString stringWithCString:cppDiscoveredNodedata->instanceName encoding:NSUTF8StringEncoding]; // from CommonResolutionData - objCDiscoveredNodeData.port = cppDiscoveredNodedata->resolutionData.port; - objCDiscoveredNodeData.hostName = [NSString stringWithCString:cppDiscoveredNodedata->resolutionData.hostName + objCDiscoveredNodeData.port = cppDiscoveredNodedata->port; + objCDiscoveredNodeData.hostName = [NSString stringWithCString:cppDiscoveredNodedata->hostName encoding:NSUTF8StringEncoding]; - objCDiscoveredNodeData.platformInterface = cppDiscoveredNodedata->resolutionData.interfaceId.GetPlatformInterface(); - objCDiscoveredNodeData.numIPs = cppDiscoveredNodedata->resolutionData.numIPs; - if (cppDiscoveredNodedata->resolutionData.numIPs > 0) { + objCDiscoveredNodeData.platformInterface = cppDiscoveredNodedata->interfaceId.GetPlatformInterface(); + objCDiscoveredNodeData.numIPs = cppDiscoveredNodedata->numIPs; + if (cppDiscoveredNodedata->numIPs > 0) { objCDiscoveredNodeData.ipAddresses = [NSMutableArray new]; } - for (size_t i = 0; i < cppDiscoveredNodedata->resolutionData.numIPs; i++) { + for (size_t i = 0; i < cppDiscoveredNodedata->numIPs; i++) { char addrCString[chip::Inet::IPAddress::kMaxStringLength]; - cppDiscoveredNodedata->resolutionData.ipAddress[i].ToString(addrCString, chip::Inet::IPAddress::kMaxStringLength); + cppDiscoveredNodedata->ipAddress[i].ToString(addrCString, chip::Inet::IPAddress::kMaxStringLength); objCDiscoveredNodeData.ipAddresses[i] = [NSString stringWithCString:addrCString encoding:NSASCIIStringEncoding]; } return objCDiscoveredNodeData; diff --git a/examples/tv-casting-app/linux/CastingUtils.cpp b/examples/tv-casting-app/linux/CastingUtils.cpp index d4d71b5dd2c0ae..4a89d5bbbe851a 100644 --- a/examples/tv-casting-app/linux/CastingUtils.cpp +++ b/examples/tv-casting-app/linux/CastingUtils.cpp @@ -44,7 +44,7 @@ CHIP_ERROR DiscoverCommissioners() CHIP_ERROR RequestCommissioning(int index) { chip::Optional<TargetVideoPlayerInfo *> associatedConnectableVideoPlayer; - const Dnssd::DiscoveredNodeData * selectedCommissioner = + const Dnssd::CommissionNodeData * selectedCommissioner = CastingServer::GetInstance()->GetDiscoveredCommissioner(index, associatedConnectableVideoPlayer); if (selectedCommissioner == nullptr) { @@ -60,7 +60,7 @@ CHIP_ERROR RequestCommissioning(int index) * If non-null selectedCommissioner is provided, sends user directed commissioning * request to the selectedCommissioner and advertises self as commissionable node over DNS-SD */ -void PrepareForCommissioning(const Dnssd::DiscoveredNodeData * selectedCommissioner) +void PrepareForCommissioning(const Dnssd::CommissionNodeData * selectedCommissioner) { CastingServer::GetInstance()->Init(); @@ -96,7 +96,7 @@ void InitCommissioningFlow(intptr_t commandArg) for (int i = 0; i < CHIP_DEVICE_CONFIG_MAX_DISCOVERED_NODES; i++) { chip::Optional<TargetVideoPlayerInfo *> associatedConnectableVideoPlayer; - const Dnssd::DiscoveredNodeData * commissioner = + const Dnssd::CommissionNodeData * commissioner = CastingServer::GetInstance()->GetDiscoveredCommissioner(i, associatedConnectableVideoPlayer); if (commissioner != nullptr) { @@ -286,7 +286,7 @@ void HandleCommissioningCompleteCallback(CHIP_ERROR err) #if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT void HandleUDCSendExpiration(System::Layer * aSystemLayer, void * context) { - Dnssd::DiscoveredNodeData * selectedCommissioner = (Dnssd::DiscoveredNodeData *) context; + Dnssd::CommissionNodeData * selectedCommissioner = (Dnssd::CommissionNodeData *) context; // Send User Directed commissioning request ReturnOnFailure(CastingServer::GetInstance()->SendUserDirectedCommissioningRequest(selectedCommissioner)); diff --git a/examples/tv-casting-app/linux/CastingUtils.h b/examples/tv-casting-app/linux/CastingUtils.h index d87a8318948c76..1d780da8ebfeaf 100644 --- a/examples/tv-casting-app/linux/CastingUtils.h +++ b/examples/tv-casting-app/linux/CastingUtils.h @@ -34,7 +34,7 @@ CHIP_ERROR DiscoverCommissioners(); CHIP_ERROR RequestCommissioning(int index); -void PrepareForCommissioning(const chip::Dnssd::DiscoveredNodeData * selectedCommissioner = nullptr); +void PrepareForCommissioning(const chip::Dnssd::CommissionNodeData * selectedCommissioner = nullptr); void InitCommissioningFlow(intptr_t commandArg); diff --git a/examples/tv-casting-app/tv-casting-common/core/CastingPlayerDiscovery.cpp b/examples/tv-casting-app/tv-casting-common/core/CastingPlayerDiscovery.cpp index 9dd365d8db559f..531de966810163 100644 --- a/examples/tv-casting-app/tv-casting-common/core/CastingPlayerDiscovery.cpp +++ b/examples/tv-casting-app/tv-casting-common/core/CastingPlayerDiscovery.cpp @@ -73,7 +73,7 @@ CHIP_ERROR CastingPlayerDiscovery::StopDiscovery() return CHIP_NO_ERROR; } -void DeviceDiscoveryDelegateImpl::OnDiscoveredDevice(const chip::Dnssd::DiscoveredNodeData & nodeData) +void DeviceDiscoveryDelegateImpl::OnDiscoveredDevice(const chip::Dnssd::CommissionNodeData & nodeData) { ChipLogProgress(Discovery, "DeviceDiscoveryDelegateImpl::OnDiscoveredDevice() called"); VerifyOrReturn(mClientDelegate != nullptr, @@ -81,24 +81,23 @@ void DeviceDiscoveryDelegateImpl::OnDiscoveredDevice(const chip::Dnssd::Discover // convert nodeData to CastingPlayer CastingPlayerAttributes attributes; - snprintf(attributes.id, kIdMaxLength + 1, "%s%u", nodeData.resolutionData.hostName, nodeData.resolutionData.port); + snprintf(attributes.id, kIdMaxLength + 1, "%s%u", nodeData.hostName, nodeData.port); - chip::Platform::CopyString(attributes.deviceName, chip::Dnssd::kMaxDeviceNameLen + 1, nodeData.nodeData.deviceName); - chip::Platform::CopyString(attributes.hostName, chip::Dnssd::kHostNameMaxLength + 1, nodeData.resolutionData.hostName); - chip::Platform::CopyString(attributes.instanceName, chip::Dnssd::Commission::kInstanceNameMaxLength + 1, - nodeData.nodeData.instanceName); + chip::Platform::CopyString(attributes.deviceName, chip::Dnssd::kMaxDeviceNameLen + 1, nodeData.deviceName); + chip::Platform::CopyString(attributes.hostName, chip::Dnssd::kHostNameMaxLength + 1, nodeData.hostName); + chip::Platform::CopyString(attributes.instanceName, chip::Dnssd::Commission::kInstanceNameMaxLength + 1, nodeData.instanceName); - attributes.numIPs = (unsigned int) nodeData.resolutionData.numIPs; + attributes.numIPs = (unsigned int) nodeData.numIPs; for (unsigned j = 0; j < attributes.numIPs; j++) { - attributes.ipAddresses[j] = nodeData.resolutionData.ipAddress[j]; + attributes.ipAddresses[j] = nodeData.ipAddress[j]; } - attributes.interfaceId = nodeData.resolutionData.interfaceId; - attributes.port = nodeData.resolutionData.port; - attributes.productId = nodeData.nodeData.productId; - attributes.vendorId = nodeData.nodeData.vendorId; - attributes.deviceType = nodeData.nodeData.deviceType; - attributes.supportsCommissionerGeneratedPasscode = nodeData.nodeData.supportsCommissionerGeneratedPasscode; + attributes.interfaceId = nodeData.interfaceId; + attributes.port = nodeData.port; + attributes.productId = nodeData.productId; + attributes.vendorId = nodeData.vendorId; + attributes.deviceType = nodeData.deviceType; + attributes.supportsCommissionerGeneratedPasscode = nodeData.supportsCommissionerGeneratedPasscode; memory::Strong<CastingPlayer> player = std::make_shared<CastingPlayer>(attributes); diff --git a/examples/tv-casting-app/tv-casting-common/core/CastingPlayerDiscovery.h b/examples/tv-casting-app/tv-casting-common/core/CastingPlayerDiscovery.h index 86886ac71be30f..24bbb00ce4907b 100644 --- a/examples/tv-casting-app/tv-casting-common/core/CastingPlayerDiscovery.h +++ b/examples/tv-casting-app/tv-casting-common/core/CastingPlayerDiscovery.h @@ -68,7 +68,7 @@ class DeviceDiscoveryDelegateImpl : public chip::Controller::DeviceDiscoveryDele DeviceDiscoveryDelegateImpl() {} DeviceDiscoveryDelegateImpl(DiscoveryDelegate * delegate) { mClientDelegate = delegate; } - void OnDiscoveredDevice(const chip::Dnssd::DiscoveredNodeData & nodeData) override; + void OnDiscoveredDevice(const chip::Dnssd::CommissionNodeData & nodeData) override; }; /** diff --git a/examples/tv-casting-app/tv-casting-common/include/CastingServer.h b/examples/tv-casting-app/tv-casting-common/include/CastingServer.h index 49eb65d13786fb..da497a3d00c543 100644 --- a/examples/tv-casting-app/tv-casting-common/include/CastingServer.h +++ b/examples/tv-casting-app/tv-casting-common/include/CastingServer.h @@ -73,7 +73,7 @@ class CastingServer : public AppDelegate #endif // CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT CHIP_ERROR DiscoverCommissioners(chip::Controller::DeviceDiscoveryDelegate * deviceDiscoveryDelegate = nullptr); - const chip::Dnssd::DiscoveredNodeData * + const chip::Dnssd::CommissionNodeData * GetDiscoveredCommissioner(int index, chip::Optional<TargetVideoPlayerInfo *> & outAssociatedConnectableVideoPlayer); CHIP_ERROR OpenBasicCommissioningWindow(CommissioningCallbacks commissioningCallbacks, std::function<void(TargetVideoPlayerInfo *)> onConnectionSuccess, @@ -82,7 +82,7 @@ class CastingServer : public AppDelegate #if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT CHIP_ERROR SendUserDirectedCommissioningRequest(chip::Transport::PeerAddress commissioner); - CHIP_ERROR SendUserDirectedCommissioningRequest(chip::Dnssd::DiscoveredNodeData * selectedCommissioner); + CHIP_ERROR SendUserDirectedCommissioningRequest(chip::Dnssd::CommissionNodeData * selectedCommissioner); #endif // CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT TargetVideoPlayerInfo * GetActiveTargetVideoPlayer() { return &mActiveTargetVideoPlayerInfo; } diff --git a/examples/tv-casting-app/tv-casting-common/include/TargetVideoPlayerInfo.h b/examples/tv-casting-app/tv-casting-common/include/TargetVideoPlayerInfo.h index dd799bdf8c776d..9fa0a139bf3d6c 100644 --- a/examples/tv-casting-app/tv-casting-common/include/TargetVideoPlayerInfo.h +++ b/examples/tv-casting-app/tv-casting-common/include/TargetVideoPlayerInfo.h @@ -85,7 +85,7 @@ class TargetVideoPlayerInfo const char * GetHostName() const { return mHostName; } size_t GetNumIPs() const { return mNumIPs; } const chip::Inet::IPAddress * GetIpAddresses() const { return mIpAddress; } - bool IsSameAs(const chip::Dnssd::DiscoveredNodeData * discoveredNodeData); + bool IsSameAs(const chip::Dnssd::CommissionNodeData * discoveredNodeData); bool IsSameAs(const char * hostName, const char * deviceName, size_t numIPs, const chip::Inet::IPAddress * ipAddresses); uint16_t GetPort() const { return mPort; } diff --git a/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp b/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp index ef56d3f1144644..f97db446d8783d 100644 --- a/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp +++ b/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp @@ -253,37 +253,35 @@ chip::Inet::IPAddress * CastingServer::getIpAddressForUDCRequest(chip::Inet::IPA return &ipAddresses[ipIndexToUse]; } -CHIP_ERROR CastingServer::SendUserDirectedCommissioningRequest(Dnssd::DiscoveredNodeData * selectedCommissioner) +CHIP_ERROR CastingServer::SendUserDirectedCommissioningRequest(Dnssd::CommissionNodeData * selectedCommissioner) { mUdcInProgress = true; // Send User Directed commissioning request chip::Inet::IPAddress * ipAddressToUse = - getIpAddressForUDCRequest(selectedCommissioner->resolutionData.ipAddress, selectedCommissioner->resolutionData.numIPs); - ReturnErrorOnFailure(SendUserDirectedCommissioningRequest(chip::Transport::PeerAddress::UDP( - *ipAddressToUse, selectedCommissioner->resolutionData.port, selectedCommissioner->resolutionData.interfaceId))); - mTargetVideoPlayerVendorId = selectedCommissioner->nodeData.vendorId; - mTargetVideoPlayerProductId = selectedCommissioner->nodeData.productId; - mTargetVideoPlayerDeviceType = selectedCommissioner->nodeData.deviceType; - mTargetVideoPlayerNumIPs = selectedCommissioner->resolutionData.numIPs; + getIpAddressForUDCRequest(selectedCommissioner->ipAddress, selectedCommissioner->numIPs); + ReturnErrorOnFailure(SendUserDirectedCommissioningRequest( + chip::Transport::PeerAddress::UDP(*ipAddressToUse, selectedCommissioner->port, selectedCommissioner->interfaceId))); + mTargetVideoPlayerVendorId = selectedCommissioner->vendorId; + mTargetVideoPlayerProductId = selectedCommissioner->productId; + mTargetVideoPlayerDeviceType = selectedCommissioner->deviceType; + mTargetVideoPlayerNumIPs = selectedCommissioner->numIPs; for (size_t i = 0; i < mTargetVideoPlayerNumIPs && i < chip::Dnssd::CommonResolutionData::kMaxIPAddresses; i++) { - mTargetVideoPlayerIpAddress[i] = selectedCommissioner->resolutionData.ipAddress[i]; + mTargetVideoPlayerIpAddress[i] = selectedCommissioner->ipAddress[i]; } - chip::Platform::CopyString(mTargetVideoPlayerDeviceName, chip::Dnssd::kMaxDeviceNameLen + 1, - selectedCommissioner->nodeData.deviceName); - chip::Platform::CopyString(mTargetVideoPlayerHostName, chip::Dnssd::kHostNameMaxLength + 1, - selectedCommissioner->resolutionData.hostName); + chip::Platform::CopyString(mTargetVideoPlayerDeviceName, chip::Dnssd::kMaxDeviceNameLen + 1, selectedCommissioner->deviceName); + chip::Platform::CopyString(mTargetVideoPlayerHostName, chip::Dnssd::kHostNameMaxLength + 1, selectedCommissioner->hostName); chip::Platform::CopyString(mTargetVideoPlayerInstanceName, chip::Dnssd::Commission::kInstanceNameMaxLength + 1, - selectedCommissioner->nodeData.instanceName); - mTargetVideoPlayerPort = selectedCommissioner->resolutionData.port; + selectedCommissioner->instanceName); + mTargetVideoPlayerPort = selectedCommissioner->port; return CHIP_NO_ERROR; } #endif // CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY_CLIENT -const Dnssd::DiscoveredNodeData * +const Dnssd::CommissionNodeData * CastingServer::GetDiscoveredCommissioner(int index, chip::Optional<TargetVideoPlayerInfo *> & outAssociatedConnectableVideoPlayer) { - const Dnssd::DiscoveredNodeData * discoveredNodeData = mCommissionableNodeController.GetDiscoveredCommissioner(index); + const Dnssd::CommissionNodeData * discoveredNodeData = mCommissionableNodeController.GetDiscoveredCommissioner(index); if (discoveredNodeData != nullptr) { for (size_t i = 0; i < kMaxCachedVideoPlayers && mCachedTargetVideoPlayerInfo[i].IsInitialized(); i++) diff --git a/examples/tv-casting-app/tv-casting-common/src/ConversionUtils.cpp b/examples/tv-casting-app/tv-casting-common/src/ConversionUtils.cpp index a57e2548009ada..3c098aa9b4fbf3 100644 --- a/examples/tv-casting-app/tv-casting-common/src/ConversionUtils.cpp +++ b/examples/tv-casting-app/tv-casting-common/src/ConversionUtils.cpp @@ -18,27 +18,30 @@ #include "ConversionUtils.h" -CHIP_ERROR ConvertToDiscoveredNodeData(TargetVideoPlayerInfo * inPlayer, chip::Dnssd::DiscoveredNodeData & outNodeData) +CHIP_ERROR ConvertToDiscoveredNodeData(TargetVideoPlayerInfo * inPlayer, chip::Dnssd::DiscoveredNodeData & outDiscNodeData) { if (inPlayer == nullptr) return CHIP_ERROR_INVALID_ARGUMENT; - outNodeData.nodeData.vendorId = inPlayer->GetVendorId(); - outNodeData.nodeData.productId = static_cast<uint16_t>(inPlayer->GetProductId()); - outNodeData.nodeData.deviceType = inPlayer->GetDeviceType(); - outNodeData.resolutionData.numIPs = inPlayer->GetNumIPs(); + outDiscNodeData.Set<chip::Dnssd::CommissionNodeData>(); + auto & outNodeData = outDiscNodeData.Get<chip::Dnssd::CommissionNodeData>(); + + outNodeData.vendorId = inPlayer->GetVendorId(); + outNodeData.productId = static_cast<uint16_t>(inPlayer->GetProductId()); + outNodeData.deviceType = inPlayer->GetDeviceType(); + outNodeData.numIPs = inPlayer->GetNumIPs(); const chip::Inet::IPAddress * ipAddresses = inPlayer->GetIpAddresses(); if (ipAddresses != nullptr) { - for (size_t i = 0; i < outNodeData.resolutionData.numIPs && i < chip::Dnssd::CommonResolutionData::kMaxIPAddresses; i++) + for (size_t i = 0; i < outNodeData.numIPs && i < chip::Dnssd::CommonResolutionData::kMaxIPAddresses; i++) { - outNodeData.resolutionData.ipAddress[i] = ipAddresses[i]; + outNodeData.ipAddress[i] = ipAddresses[i]; } } - chip::Platform::CopyString(outNodeData.nodeData.deviceName, chip::Dnssd::kMaxDeviceNameLen + 1, inPlayer->GetDeviceName()); - chip::Platform::CopyString(outNodeData.resolutionData.hostName, chip::Dnssd::kHostNameMaxLength + 1, inPlayer->GetHostName()); + chip::Platform::CopyString(outNodeData.deviceName, chip::Dnssd::kMaxDeviceNameLen + 1, inPlayer->GetDeviceName()); + chip::Platform::CopyString(outNodeData.hostName, chip::Dnssd::kHostNameMaxLength + 1, inPlayer->GetHostName()); return CHIP_NO_ERROR; } diff --git a/examples/tv-casting-app/tv-casting-common/src/TargetVideoPlayerInfo.cpp b/examples/tv-casting-app/tv-casting-common/src/TargetVideoPlayerInfo.cpp index c182856039975a..a3ded0d7db8f26 100644 --- a/examples/tv-casting-app/tv-casting-common/src/TargetVideoPlayerInfo.cpp +++ b/examples/tv-casting-app/tv-casting-common/src/TargetVideoPlayerInfo.cpp @@ -224,7 +224,7 @@ bool TargetVideoPlayerInfo::IsSameAs(const char * hostName, const char * deviceN return true; } -bool TargetVideoPlayerInfo::IsSameAs(const chip::Dnssd::DiscoveredNodeData * discoveredNodeData) +bool TargetVideoPlayerInfo::IsSameAs(const chip::Dnssd::CommissionNodeData * discoveredNodeData) { // return false because 'this' VideoPlayer is not null if (discoveredNodeData == nullptr) @@ -232,6 +232,6 @@ bool TargetVideoPlayerInfo::IsSameAs(const chip::Dnssd::DiscoveredNodeData * dis return false; } - return IsSameAs(discoveredNodeData->resolutionData.hostName, discoveredNodeData->nodeData.deviceName, - discoveredNodeData->resolutionData.numIPs, discoveredNodeData->resolutionData.ipAddress); + return IsSameAs(discoveredNodeData->hostName, discoveredNodeData->deviceName, discoveredNodeData->numIPs, + discoveredNodeData->ipAddress); } diff --git a/src/controller/AbstractDnssdDiscoveryController.cpp b/src/controller/AbstractDnssdDiscoveryController.cpp index 4d916e068ddbe6..3d3ca4c8097955 100644 --- a/src/controller/AbstractDnssdDiscoveryController.cpp +++ b/src/controller/AbstractDnssdDiscoveryController.cpp @@ -25,20 +25,23 @@ namespace chip { namespace Controller { -void AbstractDnssdDiscoveryController::OnNodeDiscovered(const chip::Dnssd::DiscoveredNodeData & nodeData) +void AbstractDnssdDiscoveryController::OnNodeDiscovered(const chip::Dnssd::DiscoveredNodeData & discNodeData) { + VerifyOrReturn(discNodeData.Is<chip::Dnssd::CommissionNodeData>()); + auto discoveredNodes = GetDiscoveredNodes(); + auto & nodeData = discNodeData.Get<chip::Dnssd::CommissionNodeData>(); for (auto & discoveredNode : discoveredNodes) { - if (!discoveredNode.resolutionData.IsValid()) + + if (!discoveredNode.IsValid()) { continue; } // TODO(#32576) Check if IP address are the same. Must account for `numIPs` in the list of `ipAddress`. // Additionally, must NOT assume that the ordering is consistent. - if (strcmp(discoveredNode.resolutionData.hostName, nodeData.resolutionData.hostName) == 0 && - discoveredNode.resolutionData.port == nodeData.resolutionData.port && - discoveredNode.resolutionData.numIPs == nodeData.resolutionData.numIPs) + if (strcmp(discoveredNode.hostName, nodeData.hostName) == 0 && discoveredNode.port == nodeData.port && + discoveredNode.numIPs == nodeData.numIPs) { discoveredNode = nodeData; if (mDeviceDiscoveryDelegate != nullptr) @@ -51,7 +54,7 @@ void AbstractDnssdDiscoveryController::OnNodeDiscovered(const chip::Dnssd::Disco // Node not yet in the list for (auto & discoveredNode : discoveredNodes) { - if (!discoveredNode.resolutionData.IsValid()) + if (!discoveredNode.IsValid()) { discoveredNode = nodeData; if (mDeviceDiscoveryDelegate != nullptr) @@ -61,7 +64,7 @@ void AbstractDnssdDiscoveryController::OnNodeDiscovered(const chip::Dnssd::Disco return; } } - ChipLogError(Discovery, "Failed to add discovered node with hostname %s- Insufficient space", nodeData.resolutionData.hostName); + ChipLogError(Discovery, "Failed to add discovered node with hostname %s- Insufficient space", nodeData.hostName); } CHIP_ERROR AbstractDnssdDiscoveryController::SetUpNodeDiscovery() @@ -74,11 +77,11 @@ CHIP_ERROR AbstractDnssdDiscoveryController::SetUpNodeDiscovery() return CHIP_NO_ERROR; } -const Dnssd::DiscoveredNodeData * AbstractDnssdDiscoveryController::GetDiscoveredNode(int idx) +const Dnssd::CommissionNodeData * AbstractDnssdDiscoveryController::GetDiscoveredNode(int idx) { // TODO(cecille): Add assertion about main loop. auto discoveredNodes = GetDiscoveredNodes(); - if (0 <= idx && idx < CHIP_DEVICE_CONFIG_MAX_DISCOVERED_NODES && discoveredNodes.data()[idx].resolutionData.IsValid()) + if (0 <= idx && idx < CHIP_DEVICE_CONFIG_MAX_DISCOVERED_NODES && discoveredNodes.data()[idx].IsValid()) { return discoveredNodes.data() + idx; } diff --git a/src/controller/AbstractDnssdDiscoveryController.h b/src/controller/AbstractDnssdDiscoveryController.h index c8c9053f878ff3..8aeaece1bb521b 100644 --- a/src/controller/AbstractDnssdDiscoveryController.h +++ b/src/controller/AbstractDnssdDiscoveryController.h @@ -45,9 +45,9 @@ class DLL_EXPORT AbstractDnssdDiscoveryController : public Dnssd::DiscoverNodeDe CHIP_ERROR StopDiscovery() { return mDNSResolver.StopDiscovery(); }; protected: - using DiscoveredNodeList = FixedSpan<Dnssd::DiscoveredNodeData, CHIP_DEVICE_CONFIG_MAX_DISCOVERED_NODES>; + using DiscoveredNodeList = FixedSpan<Dnssd::CommissionNodeData, CHIP_DEVICE_CONFIG_MAX_DISCOVERED_NODES>; CHIP_ERROR SetUpNodeDiscovery(); - const Dnssd::DiscoveredNodeData * GetDiscoveredNode(int idx); + const Dnssd::CommissionNodeData * GetDiscoveredNode(int idx); virtual DiscoveredNodeList GetDiscoveredNodes() = 0; DeviceDiscoveryDelegate * mDeviceDiscoveryDelegate = nullptr; Dnssd::ResolverProxy mDNSResolver; diff --git a/src/controller/CHIPCommissionableNodeController.cpp b/src/controller/CHIPCommissionableNodeController.cpp index f116928b585d82..eaf212e90693c7 100644 --- a/src/controller/CHIPCommissionableNodeController.cpp +++ b/src/controller/CHIPCommissionableNodeController.cpp @@ -45,7 +45,7 @@ CommissionableNodeController::~CommissionableNodeController() mDNSResolver.SetDiscoveryDelegate(nullptr); } -const Dnssd::DiscoveredNodeData * CommissionableNodeController::GetDiscoveredCommissioner(int idx) +const Dnssd::CommissionNodeData * CommissionableNodeController::GetDiscoveredCommissioner(int idx) { return GetDiscoveredNode(idx); } diff --git a/src/controller/CHIPCommissionableNodeController.h b/src/controller/CHIPCommissionableNodeController.h index 5c9f57919a2897..9605653cbb87d6 100644 --- a/src/controller/CHIPCommissionableNodeController.h +++ b/src/controller/CHIPCommissionableNodeController.h @@ -49,13 +49,13 @@ class DLL_EXPORT CommissionableNodeController : public AbstractDnssdDiscoveryCon * Otherwise, returns nullptr * See Resolver.h IsValid() */ - const Dnssd::DiscoveredNodeData * GetDiscoveredCommissioner(int idx); + const Dnssd::CommissionNodeData * GetDiscoveredCommissioner(int idx); protected: DiscoveredNodeList GetDiscoveredNodes() override { return DiscoveredNodeList(mDiscoveredCommissioners); } private: - Dnssd::DiscoveredNodeData mDiscoveredCommissioners[CHIP_DEVICE_CONFIG_MAX_DISCOVERED_NODES]; + Dnssd::CommissionNodeData mDiscoveredCommissioners[CHIP_DEVICE_CONFIG_MAX_DISCOVERED_NODES]; }; } // namespace Controller diff --git a/src/controller/CHIPDeviceController.cpp b/src/controller/CHIPDeviceController.cpp index 9103a0ba728156..bb1143265945c2 100644 --- a/src/controller/CHIPDeviceController.cpp +++ b/src/controller/CHIPDeviceController.cpp @@ -1706,7 +1706,7 @@ CHIP_ERROR DeviceCommissioner::StopCommissionableDiscovery() return mDNSResolver.StopDiscovery(); } -const Dnssd::DiscoveredNodeData * DeviceCommissioner::GetDiscoveredDevice(int idx) +const Dnssd::CommissionNodeData * DeviceCommissioner::GetDiscoveredDevice(int idx) { return GetDiscoveredNode(idx); } diff --git a/src/controller/CHIPDeviceController.h b/src/controller/CHIPDeviceController.h index 5290a26fdfbc47..42b8a7e2481541 100644 --- a/src/controller/CHIPDeviceController.h +++ b/src/controller/CHIPDeviceController.h @@ -412,7 +412,7 @@ class DLL_EXPORT DeviceController : public AbstractDnssdDiscoveryController // TODO(cecille): Make this configuarable. static constexpr int kMaxCommissionableNodes = 10; - Dnssd::DiscoveredNodeData mCommissionableNodes[kMaxCommissionableNodes]; + Dnssd::CommissionNodeData mCommissionableNodes[kMaxCommissionableNodes]; DeviceControllerSystemState * mSystemState = nullptr; ControllerDeviceInitParams GetControllerDeviceInitParams(); @@ -730,7 +730,7 @@ class DLL_EXPORT DeviceCommissioner : public DeviceController, * Should be called on main loop thread. * @return const DiscoveredNodeData* info about the selected device. May be nullptr if no information has been returned yet. */ - const Dnssd::DiscoveredNodeData * GetDiscoveredDevice(int idx); + const Dnssd::CommissionNodeData * GetDiscoveredDevice(int idx); /** * @brief diff --git a/src/controller/DeviceDiscoveryDelegate.h b/src/controller/DeviceDiscoveryDelegate.h index a15acaa53cd0eb..8e82f6d32d404e 100644 --- a/src/controller/DeviceDiscoveryDelegate.h +++ b/src/controller/DeviceDiscoveryDelegate.h @@ -29,7 +29,7 @@ class DLL_EXPORT DeviceDiscoveryDelegate { public: virtual ~DeviceDiscoveryDelegate() {} - virtual void OnDiscoveredDevice(const chip::Dnssd::DiscoveredNodeData & nodeData) = 0; + virtual void OnDiscoveredDevice(const chip::Dnssd::CommissionNodeData & nodeData) = 0; }; } // namespace Controller diff --git a/src/controller/SetUpCodePairer.cpp b/src/controller/SetUpCodePairer.cpp index 3a995a6e93579a..c3aecbfdd36f66 100644 --- a/src/controller/SetUpCodePairer.cpp +++ b/src/controller/SetUpCodePairer.cpp @@ -330,24 +330,29 @@ bool SetUpCodePairer::IdIsPresent(uint16_t vendorOrProductID) return vendorOrProductID != kNotAvailable; } -bool SetUpCodePairer::NodeMatchesCurrentFilter(const Dnssd::DiscoveredNodeData & nodeData) const +bool SetUpCodePairer::NodeMatchesCurrentFilter(const Dnssd::DiscoveredNodeData & discNodeData) const { - if (nodeData.nodeData.commissioningMode == 0) + if (!discNodeData.Is<Dnssd::CommissionNodeData>()) + { + return false; + } + + const Dnssd::CommissionNodeData & nodeData = discNodeData.Get<Dnssd::CommissionNodeData>(); + if (nodeData.commissioningMode == 0) { ChipLogProgress(Controller, "Discovered device does not have an open commissioning window."); return false; } // The advertisement may not include a vendor id. - if (IdIsPresent(mPayloadVendorID) && IdIsPresent(nodeData.nodeData.vendorId) && mPayloadVendorID != nodeData.nodeData.vendorId) + if (IdIsPresent(mPayloadVendorID) && IdIsPresent(nodeData.vendorId) && mPayloadVendorID != nodeData.vendorId) { ChipLogProgress(Controller, "Discovered device does not match our vendor id."); return false; } // The advertisement may not include a product id. - if (IdIsPresent(mPayloadProductID) && IdIsPresent(nodeData.nodeData.productId) && - mPayloadProductID != nodeData.nodeData.productId) + if (IdIsPresent(mPayloadProductID) && IdIsPresent(nodeData.productId) && mPayloadProductID != nodeData.productId) { ChipLogProgress(Controller, "Discovered device does not match our product id."); return false; @@ -357,10 +362,10 @@ bool SetUpCodePairer::NodeMatchesCurrentFilter(const Dnssd::DiscoveredNodeData & switch (mCurrentFilter.type) { case Dnssd::DiscoveryFilterType::kShortDiscriminator: - discriminatorMatches = (((nodeData.nodeData.longDiscriminator >> 8) & 0x0F) == mCurrentFilter.code); + discriminatorMatches = (((nodeData.longDiscriminator >> 8) & 0x0F) == mCurrentFilter.code); break; case Dnssd::DiscoveryFilterType::kLongDiscriminator: - discriminatorMatches = (nodeData.nodeData.longDiscriminator == mCurrentFilter.code); + discriminatorMatches = (nodeData.longDiscriminator == mCurrentFilter.code); break; default: ChipLogError(Controller, "Unknown filter type; all matches will fail"); @@ -382,7 +387,7 @@ void SetUpCodePairer::NotifyCommissionableDeviceDiscovered(const Dnssd::Discover ChipLogProgress(Controller, "Discovered device to be commissioned over DNS-SD"); - NotifyCommissionableDeviceDiscovered(nodeData.resolutionData); + NotifyCommissionableDeviceDiscovered(nodeData.Get<Dnssd::CommissionNodeData>()); } void SetUpCodePairer::NotifyCommissionableDeviceDiscovered(const Dnssd::CommonResolutionData & resolutionData) diff --git a/src/controller/java/CHIPDeviceController-JNI.cpp b/src/controller/java/CHIPDeviceController-JNI.cpp index 83c0d029d8ddb7..dd034caf2007ba 100644 --- a/src/controller/java/CHIPDeviceController-JNI.cpp +++ b/src/controller/java/CHIPDeviceController-JNI.cpp @@ -1839,7 +1839,7 @@ JNI_METHOD(jobject, getDiscoveredDevice)(JNIEnv * env, jobject self, jlong handl chip::DeviceLayer::StackLock lock; AndroidDeviceControllerWrapper * wrapper = AndroidDeviceControllerWrapper::FromJNIHandle(handle); - const Dnssd::DiscoveredNodeData * data = wrapper->Controller()->GetDiscoveredDevice(idx); + const Dnssd::CommissionNodeData * data = wrapper->Controller()->GetDiscoveredDevice(idx); if (data == nullptr) { @@ -1866,21 +1866,21 @@ JNI_METHOD(jobject, getDiscoveredDevice)(JNIEnv * env, jobject self, jlong handl jobject discoveredObj = env->NewObject(discoveredDeviceCls, constructor); - env->SetLongField(discoveredObj, discrminatorID, data->nodeData.longDiscriminator); + env->SetLongField(discoveredObj, discrminatorID, data->longDiscriminator); char ipAddress[100]; - data->resolutionData.ipAddress[0].ToString(ipAddress, 100); + data->ipAddress[0].ToString(ipAddress, 100); jstring jniipAdress = env->NewStringUTF(ipAddress); env->SetObjectField(discoveredObj, ipAddressID, jniipAdress); - env->SetIntField(discoveredObj, portID, static_cast<jint>(data->resolutionData.port)); - env->SetLongField(discoveredObj, deviceTypeID, static_cast<jlong>(data->nodeData.deviceType)); - env->SetIntField(discoveredObj, vendorIdID, static_cast<jint>(data->nodeData.vendorId)); - env->SetIntField(discoveredObj, productIdID, static_cast<jint>(data->nodeData.productId)); + env->SetIntField(discoveredObj, portID, static_cast<jint>(data->port)); + env->SetLongField(discoveredObj, deviceTypeID, static_cast<jlong>(data->deviceType)); + env->SetIntField(discoveredObj, vendorIdID, static_cast<jint>(data->vendorId)); + env->SetIntField(discoveredObj, productIdID, static_cast<jint>(data->productId)); jbyteArray jRotatingId; - CHIP_ERROR err = JniReferences::GetInstance().N2J_ByteArray(env, data->nodeData.rotatingId, - static_cast<jsize>(data->nodeData.rotatingIdLen), jRotatingId); + CHIP_ERROR err = + JniReferences::GetInstance().N2J_ByteArray(env, data->rotatingId, static_cast<jsize>(data->rotatingIdLen), jRotatingId); if (err != CHIP_NO_ERROR) { @@ -1888,12 +1888,12 @@ JNI_METHOD(jobject, getDiscoveredDevice)(JNIEnv * env, jobject self, jlong handl return nullptr; } env->SetObjectField(discoveredObj, rotatingIdID, static_cast<jobject>(jRotatingId)); - env->SetObjectField(discoveredObj, instanceNameID, env->NewStringUTF(data->nodeData.instanceName)); - env->SetObjectField(discoveredObj, deviceNameID, env->NewStringUTF(data->nodeData.deviceName)); - env->SetObjectField(discoveredObj, pairingInstructionID, env->NewStringUTF(data->nodeData.pairingInstruction)); + env->SetObjectField(discoveredObj, instanceNameID, env->NewStringUTF(data->instanceName)); + env->SetObjectField(discoveredObj, deviceNameID, env->NewStringUTF(data->deviceName)); + env->SetObjectField(discoveredObj, pairingInstructionID, env->NewStringUTF(data->pairingInstruction)); - env->CallVoidMethod(discoveredObj, setCommissioningModeID, static_cast<jint>(data->nodeData.commissioningMode)); - env->CallVoidMethod(discoveredObj, setPairingHintID, static_cast<jint>(data->nodeData.pairingHint)); + env->CallVoidMethod(discoveredObj, setCommissioningModeID, static_cast<jint>(data->commissioningMode)); + env->CallVoidMethod(discoveredObj, setPairingHintID, static_cast<jint>(data->pairingHint)); return discoveredObj; } diff --git a/src/controller/python/ChipCommissionableNodeController-ScriptBinding.cpp b/src/controller/python/ChipCommissionableNodeController-ScriptBinding.cpp index 39d70e350ae4db..6df32c6940667a 100644 --- a/src/controller/python/ChipCommissionableNodeController-ScriptBinding.cpp +++ b/src/controller/python/ChipCommissionableNodeController-ScriptBinding.cpp @@ -76,58 +76,54 @@ void pychip_CommissionableNodeController_PrintDiscoveredCommissioners( { for (int i = 0; i < CHIP_DEVICE_CONFIG_MAX_DISCOVERED_NODES; ++i) { - const chip::Dnssd::DiscoveredNodeData * dnsSdInfo = commissionableNodeCtrl->GetDiscoveredCommissioner(i); + const chip::Dnssd::CommissionNodeData * dnsSdInfo = commissionableNodeCtrl->GetDiscoveredCommissioner(i); if (dnsSdInfo == nullptr) { continue; } char rotatingId[chip::Dnssd::kMaxRotatingIdLen * 2 + 1] = ""; - Encoding::BytesToUppercaseHexString(dnsSdInfo->nodeData.rotatingId, dnsSdInfo->nodeData.rotatingIdLen, rotatingId, - sizeof(rotatingId)); + Encoding::BytesToUppercaseHexString(dnsSdInfo->rotatingId, dnsSdInfo->rotatingIdLen, rotatingId, sizeof(rotatingId)); ChipLogProgress(Discovery, "Commissioner %d", i); - ChipLogProgress(Discovery, "\tInstance name:\t\t%s", dnsSdInfo->nodeData.instanceName); - ChipLogProgress(Discovery, "\tHost name:\t\t%s", dnsSdInfo->resolutionData.hostName); - ChipLogProgress(Discovery, "\tPort:\t\t\t%u", dnsSdInfo->resolutionData.port); - ChipLogProgress(Discovery, "\tLong discriminator:\t%u", dnsSdInfo->nodeData.longDiscriminator); - ChipLogProgress(Discovery, "\tVendor ID:\t\t%u", dnsSdInfo->nodeData.vendorId); - ChipLogProgress(Discovery, "\tProduct ID:\t\t%u", dnsSdInfo->nodeData.productId); - ChipLogProgress(Discovery, "\tCommissioning Mode\t%u", dnsSdInfo->nodeData.commissioningMode); - ChipLogProgress(Discovery, "\tDevice Type\t\t%u", dnsSdInfo->nodeData.deviceType); - ChipLogProgress(Discovery, "\tDevice Name\t\t%s", dnsSdInfo->nodeData.deviceName); + ChipLogProgress(Discovery, "\tInstance name:\t\t%s", dnsSdInfo->instanceName); + ChipLogProgress(Discovery, "\tHost name:\t\t%s", dnsSdInfo->hostName); + ChipLogProgress(Discovery, "\tPort:\t\t\t%u", dnsSdInfo->port); + ChipLogProgress(Discovery, "\tLong discriminator:\t%u", dnsSdInfo->longDiscriminator); + ChipLogProgress(Discovery, "\tVendor ID:\t\t%u", dnsSdInfo->vendorId); + ChipLogProgress(Discovery, "\tProduct ID:\t\t%u", dnsSdInfo->productId); + ChipLogProgress(Discovery, "\tCommissioning Mode\t%u", dnsSdInfo->commissioningMode); + ChipLogProgress(Discovery, "\tDevice Type\t\t%u", dnsSdInfo->deviceType); + ChipLogProgress(Discovery, "\tDevice Name\t\t%s", dnsSdInfo->deviceName); ChipLogProgress(Discovery, "\tRotating Id\t\t%s", rotatingId); - ChipLogProgress(Discovery, "\tPairing Instruction\t%s", dnsSdInfo->nodeData.pairingInstruction); - ChipLogProgress(Discovery, "\tPairing Hint\t\t%u", dnsSdInfo->nodeData.pairingHint); - if (dnsSdInfo->resolutionData.GetMrpRetryIntervalIdle().HasValue()) + ChipLogProgress(Discovery, "\tPairing Instruction\t%s", dnsSdInfo->pairingInstruction); + ChipLogProgress(Discovery, "\tPairing Hint\t\t%u", dnsSdInfo->pairingHint); + if (dnsSdInfo->GetMrpRetryIntervalIdle().HasValue()) { - ChipLogProgress(Discovery, "\tMrp Interval idle\t%u", - dnsSdInfo->resolutionData.GetMrpRetryIntervalIdle().Value().count()); + ChipLogProgress(Discovery, "\tMrp Interval idle\t%u", dnsSdInfo->GetMrpRetryIntervalIdle().Value().count()); } else { ChipLogProgress(Discovery, "\tMrp Interval idle\tNot present"); } - if (dnsSdInfo->resolutionData.GetMrpRetryIntervalActive().HasValue()) + if (dnsSdInfo->GetMrpRetryIntervalActive().HasValue()) { - ChipLogProgress(Discovery, "\tMrp Interval active\t%u", - dnsSdInfo->resolutionData.GetMrpRetryIntervalActive().Value().count()); + ChipLogProgress(Discovery, "\tMrp Interval active\t%u", dnsSdInfo->GetMrpRetryIntervalActive().Value().count()); } else { ChipLogProgress(Discovery, "\tMrp Interval active\tNot present"); } - ChipLogProgress(Discovery, "\tSupports TCP\t\t%d", dnsSdInfo->resolutionData.supportsTcp); + ChipLogProgress(Discovery, "\tSupports TCP\t\t%d", dnsSdInfo->supportsTcp); - if (dnsSdInfo->resolutionData.isICDOperatingAsLIT.HasValue()) + if (dnsSdInfo->isICDOperatingAsLIT.HasValue()) { - ChipLogProgress(Discovery, "\tICD is operating as a\t%s", - dnsSdInfo->resolutionData.isICDOperatingAsLIT.Value() ? "LIT" : "SIT"); + ChipLogProgress(Discovery, "\tICD is operating as a\t%s", dnsSdInfo->isICDOperatingAsLIT.Value() ? "LIT" : "SIT"); } - for (unsigned j = 0; j < dnsSdInfo->resolutionData.numIPs; ++j) + for (unsigned j = 0; j < dnsSdInfo->numIPs; ++j) { char buf[chip::Inet::IPAddress::kMaxStringLength]; - dnsSdInfo->resolutionData.ipAddress[j].ToString(buf); + dnsSdInfo->ipAddress[j].ToString(buf); ChipLogProgress(Discovery, "\tAddress %d:\t\t%s", j, buf); } } diff --git a/src/controller/python/ChipDeviceController-Discovery.cpp b/src/controller/python/ChipDeviceController-Discovery.cpp index a8896628680a8f..b7589791b41eab 100644 --- a/src/controller/python/ChipDeviceController-Discovery.cpp +++ b/src/controller/python/ChipDeviceController-Discovery.cpp @@ -40,7 +40,7 @@ bool pychip_DeviceController_HasDiscoveredCommissionableNode(Controller::DeviceC { for (int i = 0; i < devCtrl->GetMaxCommissionableNodesSupported(); ++i) { - const Dnssd::DiscoveredNodeData * dnsSdInfo = devCtrl->GetDiscoveredDevice(i); + const Dnssd::CommissionNodeData * dnsSdInfo = devCtrl->GetDiscoveredDevice(i); if (dnsSdInfo == nullptr) { continue; @@ -101,7 +101,7 @@ void pychip_DeviceController_IterateDiscoveredCommissionableNodes(Controller::De for (int i = 0; i < devCtrl->GetMaxCommissionableNodesSupported(); ++i) { - const Dnssd::DiscoveredNodeData * dnsSdInfo = devCtrl->GetDiscoveredDevice(i); + const Dnssd::CommissionNodeData * dnsSdInfo = devCtrl->GetDiscoveredDevice(i); if (dnsSdInfo == nullptr) { continue; @@ -110,49 +110,48 @@ void pychip_DeviceController_IterateDiscoveredCommissionableNodes(Controller::De Json::Value jsonVal; char rotatingId[Dnssd::kMaxRotatingIdLen * 2 + 1] = ""; - Encoding::BytesToUppercaseHexString(dnsSdInfo->nodeData.rotatingId, dnsSdInfo->nodeData.rotatingIdLen, rotatingId, - sizeof(rotatingId)); + Encoding::BytesToUppercaseHexString(dnsSdInfo->rotatingId, dnsSdInfo->rotatingIdLen, rotatingId, sizeof(rotatingId)); ChipLogProgress(Discovery, "Commissionable Node %d", i); - jsonVal["instanceName"] = dnsSdInfo->nodeData.instanceName; - jsonVal["hostName"] = dnsSdInfo->resolutionData.hostName; - jsonVal["port"] = dnsSdInfo->resolutionData.port; - jsonVal["longDiscriminator"] = dnsSdInfo->nodeData.longDiscriminator; - jsonVal["vendorId"] = dnsSdInfo->nodeData.vendorId; - jsonVal["productId"] = dnsSdInfo->nodeData.productId; - jsonVal["commissioningMode"] = dnsSdInfo->nodeData.commissioningMode; - jsonVal["deviceType"] = dnsSdInfo->nodeData.deviceType; - jsonVal["deviceName"] = dnsSdInfo->nodeData.deviceName; - jsonVal["pairingInstruction"] = dnsSdInfo->nodeData.pairingInstruction; - jsonVal["pairingHint"] = dnsSdInfo->nodeData.pairingHint; - if (dnsSdInfo->resolutionData.GetMrpRetryIntervalIdle().HasValue()) + jsonVal["instanceName"] = dnsSdInfo->instanceName; + jsonVal["hostName"] = dnsSdInfo->hostName; + jsonVal["port"] = dnsSdInfo->port; + jsonVal["longDiscriminator"] = dnsSdInfo->longDiscriminator; + jsonVal["vendorId"] = dnsSdInfo->vendorId; + jsonVal["productId"] = dnsSdInfo->productId; + jsonVal["commissioningMode"] = dnsSdInfo->commissioningMode; + jsonVal["deviceType"] = dnsSdInfo->deviceType; + jsonVal["deviceName"] = dnsSdInfo->deviceName; + jsonVal["pairingInstruction"] = dnsSdInfo->pairingInstruction; + jsonVal["pairingHint"] = dnsSdInfo->pairingHint; + if (dnsSdInfo->GetMrpRetryIntervalIdle().HasValue()) { - jsonVal["mrpRetryIntervalIdle"] = dnsSdInfo->resolutionData.GetMrpRetryIntervalIdle().Value().count(); + jsonVal["mrpRetryIntervalIdle"] = dnsSdInfo->GetMrpRetryIntervalIdle().Value().count(); } - if (dnsSdInfo->resolutionData.GetMrpRetryIntervalActive().HasValue()) + if (dnsSdInfo->GetMrpRetryIntervalActive().HasValue()) { - jsonVal["mrpRetryIntervalActive"] = dnsSdInfo->resolutionData.GetMrpRetryIntervalActive().Value().count(); + jsonVal["mrpRetryIntervalActive"] = dnsSdInfo->GetMrpRetryIntervalActive().Value().count(); } - if (dnsSdInfo->resolutionData.GetMrpRetryActiveThreshold().HasValue()) + if (dnsSdInfo->GetMrpRetryActiveThreshold().HasValue()) { - jsonVal["mrpRetryActiveThreshold"] = dnsSdInfo->resolutionData.GetMrpRetryActiveThreshold().Value().count(); + jsonVal["mrpRetryActiveThreshold"] = dnsSdInfo->GetMrpRetryActiveThreshold().Value().count(); } - jsonVal["supportsTcp"] = dnsSdInfo->resolutionData.supportsTcp; + jsonVal["supportsTcp"] = dnsSdInfo->supportsTcp; { Json::Value addresses; - for (unsigned j = 0; j < dnsSdInfo->resolutionData.numIPs; ++j) + for (unsigned j = 0; j < dnsSdInfo->numIPs; ++j) { char buf[Inet::IPAddress::kMaxStringLength]; - dnsSdInfo->resolutionData.ipAddress[j].ToString(buf); + dnsSdInfo->ipAddress[j].ToString(buf); addresses[j] = buf; } jsonVal["addresses"] = addresses; } - if (dnsSdInfo->resolutionData.isICDOperatingAsLIT.HasValue()) + if (dnsSdInfo->isICDOperatingAsLIT.HasValue()) { - jsonVal["isICDOperatingAsLIT"] = dnsSdInfo->resolutionData.isICDOperatingAsLIT.Value(); + jsonVal["isICDOperatingAsLIT"] = dnsSdInfo->isICDOperatingAsLIT.Value(); } - if (dnsSdInfo->nodeData.rotatingIdLen > 0) + if (dnsSdInfo->rotatingIdLen > 0) { jsonVal["rotatingId"] = rotatingId; } @@ -168,56 +167,52 @@ void pychip_DeviceController_PrintDiscoveredDevices(Controller::DeviceCommission { for (int i = 0; i < devCtrl->GetMaxCommissionableNodesSupported(); ++i) { - const Dnssd::DiscoveredNodeData * dnsSdInfo = devCtrl->GetDiscoveredDevice(i); + const Dnssd::CommissionNodeData * dnsSdInfo = devCtrl->GetDiscoveredDevice(i); if (dnsSdInfo == nullptr) { continue; } char rotatingId[Dnssd::kMaxRotatingIdLen * 2 + 1] = ""; - Encoding::BytesToUppercaseHexString(dnsSdInfo->nodeData.rotatingId, dnsSdInfo->nodeData.rotatingIdLen, rotatingId, - sizeof(rotatingId)); + Encoding::BytesToUppercaseHexString(dnsSdInfo->rotatingId, dnsSdInfo->rotatingIdLen, rotatingId, sizeof(rotatingId)); ChipLogProgress(Discovery, "Commissionable Node %d", i); - ChipLogProgress(Discovery, "\tInstance name:\t\t%s", dnsSdInfo->nodeData.instanceName); - ChipLogProgress(Discovery, "\tHost name:\t\t%s", dnsSdInfo->resolutionData.hostName); - ChipLogProgress(Discovery, "\tPort:\t\t\t%u", dnsSdInfo->resolutionData.port); - ChipLogProgress(Discovery, "\tLong discriminator:\t%u", dnsSdInfo->nodeData.longDiscriminator); - ChipLogProgress(Discovery, "\tVendor ID:\t\t%u", dnsSdInfo->nodeData.vendorId); - ChipLogProgress(Discovery, "\tProduct ID:\t\t%u", dnsSdInfo->nodeData.productId); - ChipLogProgress(Discovery, "\tCommissioning Mode\t%u", dnsSdInfo->nodeData.commissioningMode); - ChipLogProgress(Discovery, "\tDevice Type\t\t%u", dnsSdInfo->nodeData.deviceType); - ChipLogProgress(Discovery, "\tDevice Name\t\t%s", dnsSdInfo->nodeData.deviceName); + ChipLogProgress(Discovery, "\tInstance name:\t\t%s", dnsSdInfo->instanceName); + ChipLogProgress(Discovery, "\tHost name:\t\t%s", dnsSdInfo->hostName); + ChipLogProgress(Discovery, "\tPort:\t\t\t%u", dnsSdInfo->port); + ChipLogProgress(Discovery, "\tLong discriminator:\t%u", dnsSdInfo->longDiscriminator); + ChipLogProgress(Discovery, "\tVendor ID:\t\t%u", dnsSdInfo->vendorId); + ChipLogProgress(Discovery, "\tProduct ID:\t\t%u", dnsSdInfo->productId); + ChipLogProgress(Discovery, "\tCommissioning Mode\t%u", dnsSdInfo->commissioningMode); + ChipLogProgress(Discovery, "\tDevice Type\t\t%u", dnsSdInfo->deviceType); + ChipLogProgress(Discovery, "\tDevice Name\t\t%s", dnsSdInfo->deviceName); ChipLogProgress(Discovery, "\tRotating Id\t\t%s", rotatingId); - ChipLogProgress(Discovery, "\tPairing Instruction\t%s", dnsSdInfo->nodeData.pairingInstruction); - ChipLogProgress(Discovery, "\tPairing Hint\t\t%u", dnsSdInfo->nodeData.pairingHint); - if (dnsSdInfo->resolutionData.GetMrpRetryIntervalIdle().HasValue()) + ChipLogProgress(Discovery, "\tPairing Instruction\t%s", dnsSdInfo->pairingInstruction); + ChipLogProgress(Discovery, "\tPairing Hint\t\t%u", dnsSdInfo->pairingHint); + if (dnsSdInfo->GetMrpRetryIntervalIdle().HasValue()) { - ChipLogProgress(Discovery, "\tMrp Interval idle\t%u", - dnsSdInfo->resolutionData.GetMrpRetryIntervalIdle().Value().count()); + ChipLogProgress(Discovery, "\tMrp Interval idle\t%u", dnsSdInfo->GetMrpRetryIntervalIdle().Value().count()); } else { ChipLogProgress(Discovery, "\tMrp Interval idle\tNot present"); } - if (dnsSdInfo->resolutionData.GetMrpRetryIntervalActive().HasValue()) + if (dnsSdInfo->GetMrpRetryIntervalActive().HasValue()) { - ChipLogProgress(Discovery, "\tMrp Interval active\t%u", - dnsSdInfo->resolutionData.GetMrpRetryIntervalActive().Value().count()); + ChipLogProgress(Discovery, "\tMrp Interval active\t%u", dnsSdInfo->GetMrpRetryIntervalActive().Value().count()); } else { ChipLogProgress(Discovery, "\tMrp Interval active\tNot present"); } - ChipLogProgress(Discovery, "\tSupports TCP\t\t%d", dnsSdInfo->resolutionData.supportsTcp); - if (dnsSdInfo->resolutionData.isICDOperatingAsLIT.HasValue()) + ChipLogProgress(Discovery, "\tSupports TCP\t\t%d", dnsSdInfo->supportsTcp); + if (dnsSdInfo->isICDOperatingAsLIT.HasValue()) { - ChipLogProgress(Discovery, "\tICD is operating as a\t%s", - dnsSdInfo->resolutionData.isICDOperatingAsLIT.Value() ? "LIT" : "SIT"); + ChipLogProgress(Discovery, "\tICD is operating as a\t%s", dnsSdInfo->isICDOperatingAsLIT.Value() ? "LIT" : "SIT"); } - for (unsigned j = 0; j < dnsSdInfo->resolutionData.numIPs; ++j) + for (unsigned j = 0; j < dnsSdInfo->numIPs; ++j) { char buf[Inet::IPAddress::kMaxStringLength]; - dnsSdInfo->resolutionData.ipAddress[j].ToString(buf); + dnsSdInfo->ipAddress[j].ToString(buf); ChipLogProgress(Discovery, "\tAddress %d:\t\t%s", j, buf); } } @@ -226,13 +221,13 @@ void pychip_DeviceController_PrintDiscoveredDevices(Controller::DeviceCommission bool pychip_DeviceController_GetIPForDiscoveredDevice(Controller::DeviceCommissioner * devCtrl, int idx, char * addrStr, uint32_t len) { - const Dnssd::DiscoveredNodeData * dnsSdInfo = devCtrl->GetDiscoveredDevice(idx); + const Dnssd::CommissionNodeData * dnsSdInfo = devCtrl->GetDiscoveredDevice(idx); if (dnsSdInfo == nullptr) { return false; } // TODO(cecille): Select which one we actually want. - if (dnsSdInfo->resolutionData.ipAddress[0].ToString(addrStr, len) == addrStr) + if (dnsSdInfo->ipAddress[0].ToString(addrStr, len) == addrStr) { return true; } diff --git a/src/controller/python/ChipDeviceController-ScriptPairingDeviceDiscoveryDelegate.cpp b/src/controller/python/ChipDeviceController-ScriptPairingDeviceDiscoveryDelegate.cpp index a83a56c1b813f9..56b4932e9a8988 100644 --- a/src/controller/python/ChipDeviceController-ScriptPairingDeviceDiscoveryDelegate.cpp +++ b/src/controller/python/ChipDeviceController-ScriptPairingDeviceDiscoveryDelegate.cpp @@ -21,15 +21,15 @@ namespace chip { namespace Controller { -void ScriptPairingDeviceDiscoveryDelegate::OnDiscoveredDevice(const Dnssd::DiscoveredNodeData & nodeData) +void ScriptPairingDeviceDiscoveryDelegate::OnDiscoveredDevice(const Dnssd::CommissionNodeData & nodeData) { // Ignore nodes with closed comissioning window - VerifyOrReturn(nodeData.nodeData.commissioningMode != 0); + VerifyOrReturn(nodeData.commissioningMode != 0); VerifyOrReturn(mActiveDeviceCommissioner != nullptr); - const uint16_t port = nodeData.resolutionData.port; + const uint16_t port = nodeData.port; char buf[chip::Inet::IPAddress::kMaxStringLength]; - nodeData.resolutionData.ipAddress[0].ToString(buf); + nodeData.ipAddress[0].ToString(buf); ChipLogProgress(chipTool, "Discovered Device: %s:%u", buf, port); // Cancel discovery timer. @@ -38,9 +38,8 @@ void ScriptPairingDeviceDiscoveryDelegate::OnDiscoveredDevice(const Dnssd::Disco // Stop Mdns discovery. mActiveDeviceCommissioner->RegisterDeviceDiscoveryDelegate(nullptr); - Inet::InterfaceId interfaceId = - nodeData.resolutionData.ipAddress[0].IsIPv6LinkLocal() ? nodeData.resolutionData.interfaceId : Inet::InterfaceId::Null(); - auto peerAddress = Transport::PeerAddress::UDP(nodeData.resolutionData.ipAddress[0], port, interfaceId); + Inet::InterfaceId interfaceId = nodeData.ipAddress[0].IsIPv6LinkLocal() ? nodeData.interfaceId : Inet::InterfaceId::Null(); + auto peerAddress = Transport::PeerAddress::UDP(nodeData.ipAddress[0], port, interfaceId); RendezvousParameters keyExchangeParams = RendezvousParameters().SetSetupPINCode(mSetupPasscode).SetPeerAddress(peerAddress); diff --git a/src/controller/python/ChipDeviceController-ScriptPairingDeviceDiscoveryDelegate.h b/src/controller/python/ChipDeviceController-ScriptPairingDeviceDiscoveryDelegate.h index 7745bb13de4c15..944e0a0a047851 100644 --- a/src/controller/python/ChipDeviceController-ScriptPairingDeviceDiscoveryDelegate.h +++ b/src/controller/python/ChipDeviceController-ScriptPairingDeviceDiscoveryDelegate.h @@ -44,7 +44,7 @@ class ScriptPairingDeviceDiscoveryDelegate : public DeviceDiscoveryDelegate return chip::DeviceLayer::SystemLayer().StartTimer(System::Clock::Milliseconds32(discoveryTimeoutMsec), OnDiscoveredTimeout, this); } - void OnDiscoveredDevice(const Dnssd::DiscoveredNodeData & nodeData); + void OnDiscoveredDevice(const Dnssd::CommissionNodeData & nodeData); private: static void OnDiscoveredTimeout(System::Layer * layer, void * context) diff --git a/src/controller/tests/TestCommissionableNodeController.cpp b/src/controller/tests/TestCommissionableNodeController.cpp index 760b62e97386b0..5e866b4b25ea72 100644 --- a/src/controller/tests/TestCommissionableNodeController.cpp +++ b/src/controller/tests/TestCommissionableNodeController.cpp @@ -66,33 +66,35 @@ void TestGetDiscoveredCommissioner_HappyCase(nlTestSuite * inSuite, void * inCon { MockResolver resolver; CommissionableNodeController controller(&resolver); - chip::Dnssd::DiscoveredNodeData inNodeData; - Platform::CopyString(inNodeData.resolutionData.hostName, "mockHostName"); - Inet::IPAddress::FromString("192.168.1.10", inNodeData.resolutionData.ipAddress[0]); - inNodeData.resolutionData.numIPs++; - inNodeData.resolutionData.port = 5540; + chip::Dnssd::DiscoveredNodeData discNodeData; + discNodeData.Set<chip::Dnssd::CommissionNodeData>(); + chip::Dnssd::CommissionNodeData & inNodeData = discNodeData.Get<chip::Dnssd::CommissionNodeData>(); + Platform::CopyString(inNodeData.hostName, "mockHostName"); + Inet::IPAddress::FromString("192.168.1.10", inNodeData.ipAddress[0]); + inNodeData.numIPs++; + inNodeData.port = 5540; - controller.OnNodeDiscovered(inNodeData); + controller.OnNodeDiscovered(discNodeData); NL_TEST_ASSERT(inSuite, controller.GetDiscoveredCommissioner(0) != nullptr); - NL_TEST_ASSERT( - inSuite, strcmp(inNodeData.resolutionData.hostName, controller.GetDiscoveredCommissioner(0)->resolutionData.hostName) == 0); - NL_TEST_ASSERT(inSuite, - inNodeData.resolutionData.ipAddress[0] == controller.GetDiscoveredCommissioner(0)->resolutionData.ipAddress[0]); - NL_TEST_ASSERT(inSuite, controller.GetDiscoveredCommissioner(0)->resolutionData.port == 5540); - NL_TEST_ASSERT(inSuite, controller.GetDiscoveredCommissioner(0)->resolutionData.numIPs == 1); + NL_TEST_ASSERT(inSuite, strcmp(inNodeData.hostName, controller.GetDiscoveredCommissioner(0)->hostName) == 0); + NL_TEST_ASSERT(inSuite, inNodeData.ipAddress[0] == controller.GetDiscoveredCommissioner(0)->ipAddress[0]); + NL_TEST_ASSERT(inSuite, controller.GetDiscoveredCommissioner(0)->port == 5540); + NL_TEST_ASSERT(inSuite, controller.GetDiscoveredCommissioner(0)->numIPs == 1); } void TestGetDiscoveredCommissioner_InvalidNodeDiscovered_ReturnsNullptr(nlTestSuite * inSuite, void * inContext) { MockResolver resolver; CommissionableNodeController controller(&resolver); - chip::Dnssd::DiscoveredNodeData inNodeData; - Inet::IPAddress::FromString("192.168.1.10", inNodeData.resolutionData.ipAddress[0]); - inNodeData.resolutionData.numIPs++; - inNodeData.resolutionData.port = 5540; + chip::Dnssd::DiscoveredNodeData discNodeData; + discNodeData.Set<chip::Dnssd::CommissionNodeData>(); + chip::Dnssd::CommissionNodeData & inNodeData = discNodeData.Get<chip::Dnssd::CommissionNodeData>(); + Inet::IPAddress::FromString("192.168.1.10", inNodeData.ipAddress[0]); + inNodeData.numIPs++; + inNodeData.port = 5540; - controller.OnNodeDiscovered(inNodeData); + controller.OnNodeDiscovered(discNodeData); for (int i = 0; i < CHIP_DEVICE_CONFIG_MAX_DISCOVERED_NODES; i++) { @@ -104,27 +106,28 @@ void TestGetDiscoveredCommissioner_HappyCase_OneValidOneInvalidNode(nlTestSuite { MockResolver resolver; CommissionableNodeController controller(&resolver); - chip::Dnssd::DiscoveredNodeData invalidNodeData, validNodeData; - Inet::IPAddress::FromString("192.168.1.10", invalidNodeData.resolutionData.ipAddress[0]); - invalidNodeData.resolutionData.numIPs++; - invalidNodeData.resolutionData.port = 5540; - - Platform::CopyString(validNodeData.resolutionData.hostName, "mockHostName2"); - Inet::IPAddress::FromString("192.168.1.11", validNodeData.resolutionData.ipAddress[0]); - validNodeData.resolutionData.numIPs++; - validNodeData.resolutionData.port = 5540; - - controller.OnNodeDiscovered(validNodeData); - controller.OnNodeDiscovered(invalidNodeData); + chip::Dnssd::DiscoveredNodeData invalidDiscNodeData, validDiscNodeData; + invalidDiscNodeData.Set<chip::Dnssd::CommissionNodeData>(); + validDiscNodeData.Set<chip::Dnssd::CommissionNodeData>(); + chip::Dnssd::CommissionNodeData & invalidNodeData = invalidDiscNodeData.Get<chip::Dnssd::CommissionNodeData>(); + chip::Dnssd::CommissionNodeData & validNodeData = validDiscNodeData.Get<chip::Dnssd::CommissionNodeData>(); + Inet::IPAddress::FromString("192.168.1.10", invalidNodeData.ipAddress[0]); + invalidNodeData.numIPs++; + invalidNodeData.port = 5540; + + Platform::CopyString(validNodeData.hostName, "mockHostName2"); + Inet::IPAddress::FromString("192.168.1.11", validNodeData.ipAddress[0]); + validNodeData.numIPs++; + validNodeData.port = 5540; + + controller.OnNodeDiscovered(validDiscNodeData); + controller.OnNodeDiscovered(invalidDiscNodeData); NL_TEST_ASSERT(inSuite, controller.GetDiscoveredCommissioner(0) != nullptr); - NL_TEST_ASSERT( - inSuite, - strcmp(validNodeData.resolutionData.hostName, controller.GetDiscoveredCommissioner(0)->resolutionData.hostName) == 0); - NL_TEST_ASSERT( - inSuite, validNodeData.resolutionData.ipAddress[0] == controller.GetDiscoveredCommissioner(0)->resolutionData.ipAddress[0]); - NL_TEST_ASSERT(inSuite, controller.GetDiscoveredCommissioner(0)->resolutionData.port == 5540); - NL_TEST_ASSERT(inSuite, controller.GetDiscoveredCommissioner(0)->resolutionData.numIPs == 1); + NL_TEST_ASSERT(inSuite, strcmp(validNodeData.hostName, controller.GetDiscoveredCommissioner(0)->hostName) == 0); + NL_TEST_ASSERT(inSuite, validNodeData.ipAddress[0] == controller.GetDiscoveredCommissioner(0)->ipAddress[0]); + NL_TEST_ASSERT(inSuite, controller.GetDiscoveredCommissioner(0)->port == 5540); + NL_TEST_ASSERT(inSuite, controller.GetDiscoveredCommissioner(0)->numIPs == 1); NL_TEST_ASSERT(inSuite, controller.GetDiscoveredCommissioner(1) == nullptr); } diff --git a/src/darwin/Framework/CHIP/MTRCommissionableBrowser.mm b/src/darwin/Framework/CHIP/MTRCommissionableBrowser.mm index bf975b672decd5..2b3e2814ecd220 100644 --- a/src/darwin/Framework/CHIP/MTRCommissionableBrowser.mm +++ b/src/darwin/Framework/CHIP/MTRCommissionableBrowser.mm @@ -161,7 +161,12 @@ void OnNodeDiscovered(const DiscoveredNodeData & nodeData) override { assertChipStackLockedByCurrentThread(); - auto & commissionData = nodeData.nodeData; + if (!nodeData.Is<CommissionNodeData>()) { + // not commissionable/commissioners node + return; + } + + auto & commissionData = nodeData.Get<CommissionNodeData>(); auto key = [NSString stringWithUTF8String:commissionData.instanceName]; if ([mDiscoveredResults objectForKey:key] == nil) { // It should not happens. @@ -175,7 +180,7 @@ void OnNodeDiscovered(const DiscoveredNodeData & nodeData) override result.discriminator = @(commissionData.longDiscriminator); result.commissioningMode = commissionData.commissioningMode != 0; - auto & resolutionData = nodeData.resolutionData; + const CommonResolutionData & resolutionData = commissionData; auto * interfaces = result.interfaces; interfaces[@(resolutionData.interfaceId.GetPlatformInterface())].resolutionData = chip::MakeOptional(resolutionData); diff --git a/src/lib/dnssd/ActiveResolveAttempts.h b/src/lib/dnssd/ActiveResolveAttempts.h index 1d87bbbba49cbc..55790bd1e3821e 100644 --- a/src/lib/dnssd/ActiveResolveAttempts.h +++ b/src/lib/dnssd/ActiveResolveAttempts.h @@ -153,23 +153,24 @@ class ActiveResolveAttempts { return false; } + auto & nodeData = data.Get<chip::Dnssd::CommissionNodeData>(); switch (browse.filter.type) { case chip::Dnssd::DiscoveryFilterType::kNone: return true; case chip::Dnssd::DiscoveryFilterType::kShortDiscriminator: - return browse.filter.code == static_cast<uint64_t>((data.nodeData.longDiscriminator >> 8) & 0x0F); + return browse.filter.code == static_cast<uint64_t>((nodeData.longDiscriminator >> 8) & 0x0F); case chip::Dnssd::DiscoveryFilterType::kLongDiscriminator: - return browse.filter.code == data.nodeData.longDiscriminator; + return browse.filter.code == nodeData.longDiscriminator; case chip::Dnssd::DiscoveryFilterType::kVendorId: - return browse.filter.code == data.nodeData.vendorId; + return browse.filter.code == nodeData.vendorId; case chip::Dnssd::DiscoveryFilterType::kDeviceType: - return browse.filter.code == data.nodeData.deviceType; + return browse.filter.code == nodeData.deviceType; case chip::Dnssd::DiscoveryFilterType::kCommissioningMode: - return browse.filter.code == data.nodeData.commissioningMode; + return browse.filter.code == nodeData.commissioningMode; case chip::Dnssd::DiscoveryFilterType::kInstanceName: - return strncmp(browse.filter.instanceName, data.nodeData.instanceName, + return strncmp(browse.filter.instanceName, nodeData.instanceName, chip::Dnssd::Commission::kInstanceNameMaxLength + 1) == 0; case chip::Dnssd::DiscoveryFilterType::kCommissioner: case chip::Dnssd::DiscoveryFilterType::kCompressedFabricId: diff --git a/src/lib/dnssd/Discovery_ImplPlatform.cpp b/src/lib/dnssd/Discovery_ImplPlatform.cpp index c12019ca60b5fd..2b6b6cd470c618 100644 --- a/src/lib/dnssd/Discovery_ImplPlatform.cpp +++ b/src/lib/dnssd/Discovery_ImplPlatform.cpp @@ -51,7 +51,7 @@ static void HandleNodeResolve(void * context, DnssdService * result, const Span< DiscoveredNodeData nodeData; result->ToDiscoveredNodeData(addresses, nodeData); - nodeData.LogDetail(); + nodeData.Get<CommissionNodeData>().LogDetail(); discoveryContext->OnNodeDiscovered(nodeData); discoveryContext->Release(); } @@ -339,37 +339,37 @@ void DiscoveryImplPlatform::HandleNodeIdResolve(void * context, DnssdService * r void DnssdService::ToDiscoveredNodeData(const Span<Inet::IPAddress> & addresses, DiscoveredNodeData & nodeData) { - auto & resolutionData = nodeData.resolutionData; - auto & commissionData = nodeData.nodeData; + nodeData.Set<CommissionNodeData>(); + auto & discoveredData = nodeData.Get<CommissionNodeData>(); - Platform::CopyString(resolutionData.hostName, mHostName); - Platform::CopyString(commissionData.instanceName, mName); + Platform::CopyString(discoveredData.hostName, mHostName); + Platform::CopyString(discoveredData.instanceName, mName); IPAddressSorter::Sort(addresses, mInterface); size_t addressesFound = 0; for (auto & ip : addresses) { - if (addressesFound == ArraySize(resolutionData.ipAddress)) + if (addressesFound == ArraySize(discoveredData.ipAddress)) { // Out of space. ChipLogProgress(Discovery, "Can't add more IPs to DiscoveredNodeData"); break; } - resolutionData.ipAddress[addressesFound] = ip; + discoveredData.ipAddress[addressesFound] = ip; ++addressesFound; } - resolutionData.interfaceId = mInterface; - resolutionData.numIPs = addressesFound; - resolutionData.port = mPort; + discoveredData.interfaceId = mInterface; + discoveredData.numIPs = addressesFound; + discoveredData.port = mPort; for (size_t i = 0; i < mTextEntrySize; ++i) { ByteSpan key(reinterpret_cast<const uint8_t *>(mTextEntries[i].mKey), strlen(mTextEntries[i].mKey)); ByteSpan val(mTextEntries[i].mData, mTextEntries[i].mDataSize); - FillNodeDataFromTxt(key, val, resolutionData); - FillNodeDataFromTxt(key, val, commissionData); + FillNodeDataFromTxt(key, val, discoveredData); + FillNodeDataFromTxt(key, val, discoveredData); } } diff --git a/src/lib/dnssd/IncrementalResolve.cpp b/src/lib/dnssd/IncrementalResolve.cpp index 766d979e33a4ba..f083f852d7402f 100644 --- a/src/lib/dnssd/IncrementalResolve.cpp +++ b/src/lib/dnssd/IncrementalResolve.cpp @@ -189,7 +189,7 @@ CHIP_ERROR IncrementalResolver::InitializeParsing(mdns::Minimal::SerializedQName break; case ServiceNameType::kCommissioner: case ServiceNameType::kCommissionable: - mSpecificResolutionData.Set<DnssdNodeData>(); + mSpecificResolutionData.Set<CommissionNodeData>(); { // Commission addresses start with instance name @@ -199,10 +199,10 @@ CHIP_ERROR IncrementalResolver::InitializeParsing(mdns::Minimal::SerializedQName return CHIP_ERROR_INVALID_ARGUMENT; } - Platform::CopyString(mSpecificResolutionData.Get<DnssdNodeData>().instanceName, nameCopy.Value()); + Platform::CopyString(mSpecificResolutionData.Get<CommissionNodeData>().instanceName, nameCopy.Value()); } - LogFoundCommissionSrvRecord(mSpecificResolutionData.Get<DnssdNodeData>().instanceName, mTargetHostName.Get()); + LogFoundCommissionSrvRecord(mSpecificResolutionData.Get<CommissionNodeData>().instanceName, mTargetHostName.Get()); break; default: return CHIP_ERROR_INVALID_ARGUMENT; @@ -306,7 +306,7 @@ CHIP_ERROR IncrementalResolver::OnTxtRecord(const ResourceData & data, BytesRang if (IsActiveBrowseParse()) { - TxtParser<DnssdNodeData> delegate(mSpecificResolutionData.Get<DnssdNodeData>()); + TxtParser<CommissionNodeData> delegate(mSpecificResolutionData.Get<CommissionNodeData>()); if (!ParseTxtRecord(data.GetData(), &delegate)) { return CHIP_ERROR_INVALID_ARGUMENT; @@ -347,8 +347,11 @@ CHIP_ERROR IncrementalResolver::Take(DiscoveredNodeData & outputData) IPAddressSorter::Sort(mCommonResolutionData.ipAddress, mCommonResolutionData.numIPs, mCommonResolutionData.interfaceId); - outputData.resolutionData = mCommonResolutionData; - outputData.nodeData = mSpecificResolutionData.Get<DnssdNodeData>(); + outputData.Set<CommissionNodeData>(); + CommissionNodeData & nodeData = outputData.Get<CommissionNodeData>(); + nodeData = mSpecificResolutionData.Get<CommissionNodeData>(); + CommonResolutionData & resolutionData = nodeData; + resolutionData = mCommonResolutionData; ResetToInactive(); diff --git a/src/lib/dnssd/IncrementalResolve.h b/src/lib/dnssd/IncrementalResolve.h index 17790b6f9f5fe0..4a8bc0c5792ee3 100644 --- a/src/lib/dnssd/IncrementalResolve.h +++ b/src/lib/dnssd/IncrementalResolve.h @@ -100,7 +100,7 @@ class IncrementalResolver /// method. bool IsActive() const { return mSpecificResolutionData.Valid(); } - bool IsActiveBrowseParse() const { return mSpecificResolutionData.Is<DnssdNodeData>(); } + bool IsActiveBrowseParse() const { return mSpecificResolutionData.Is<CommissionNodeData>(); } bool IsActiveOperationalParse() const { return mSpecificResolutionData.Is<OperationalNodeData>(); } ServiceNameType GetCurrentType() const { return mServiceNameType; } @@ -185,7 +185,7 @@ class IncrementalResolver /// Prerequisite: IP address belongs to the right nost name CHIP_ERROR OnIpAddress(Inet::InterfaceId interface, const Inet::IPAddress & addr); - using ParsedRecordSpecificData = Variant<OperationalNodeData, DnssdNodeData>; + using ParsedRecordSpecificData = Variant<OperationalNodeData, CommissionNodeData>; StoredServerName mRecordName; // Record name for what is parsed (SRV/PTR/TXT) StoredServerName mTargetHostName; // `Target` for the SRV record diff --git a/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp b/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp index 3abc11ac659cf8..403da6effcd36c 100644 --- a/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp +++ b/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp @@ -425,12 +425,10 @@ void MinMdnsResolver::AdvancePendingResolverStates() case IncrementalResolver::ServiceNameType::kCommissioner: discoveredNodeIsRelevant = mActiveResolves.HasBrowseFor(chip::Dnssd::DiscoveryType::kCommissionerNode); mActiveResolves.CompleteCommissioner(nodeData); - nodeData.nodeType = DiscoveryType::kCommissionerNode; break; case IncrementalResolver::ServiceNameType::kCommissionable: discoveredNodeIsRelevant = mActiveResolves.HasBrowseFor(chip::Dnssd::DiscoveryType::kCommissionableNode); mActiveResolves.CompleteCommissionable(nodeData); - nodeData.nodeType = DiscoveryType::kCommissionableNode; break; default: ChipLogError(Discovery, "Unexpected type for browse data parsing"); diff --git a/src/lib/dnssd/TxtFields.cpp b/src/lib/dnssd/TxtFields.cpp index c4ec70e342d41a..88a116871ca017 100644 --- a/src/lib/dnssd/TxtFields.cpp +++ b/src/lib/dnssd/TxtFields.cpp @@ -225,7 +225,7 @@ TxtFieldKey GetTxtFieldKey(const ByteSpan & key) } // namespace Internal -void FillNodeDataFromTxt(const ByteSpan & key, const ByteSpan & val, DnssdNodeData & nodeData) +void FillNodeDataFromTxt(const ByteSpan & key, const ByteSpan & val, CommissionNodeData & nodeData) { TxtFieldKey keyType = Internal::GetTxtFieldKey(key); switch (keyType) diff --git a/src/lib/dnssd/TxtFields.h b/src/lib/dnssd/TxtFields.h index 194750451289a4..5546493624119d 100644 --- a/src/lib/dnssd/TxtFields.h +++ b/src/lib/dnssd/TxtFields.h @@ -192,7 +192,7 @@ constexpr size_t ValSize(TxtFieldKey key) } void FillNodeDataFromTxt(const ByteSpan & key, const ByteSpan & value, CommonResolutionData & nodeData); -void FillNodeDataFromTxt(const ByteSpan & key, const ByteSpan & value, DnssdNodeData & nodeData); +void FillNodeDataFromTxt(const ByteSpan & key, const ByteSpan & value, CommissionNodeData & nodeData); } // namespace Dnssd } // namespace chip diff --git a/src/lib/dnssd/Types.h b/src/lib/dnssd/Types.h index 43e55bfbc65e0e..e62c9a52418efe 100644 --- a/src/lib/dnssd/Types.h +++ b/src/lib/dnssd/Types.h @@ -26,6 +26,7 @@ #include <lib/core/PeerId.h> #include <lib/dnssd/Constants.h> #include <lib/support/BytesToHex.h> +#include <lib/support/Variant.h> #include <lib/support/logging/CHIPLogging.h> #include <messaging/ReliableMessageProtocolConfig.h> @@ -205,7 +206,7 @@ inline constexpr size_t kMaxRotatingIdLen = 50; inline constexpr size_t kMaxPairingInstructionLen = 128; /// Data that is specific to commisionable/commissioning node discovery -struct DnssdNodeData +struct CommissionNodeData : public CommonResolutionData { size_t rotatingIdLen = 0; uint32_t deviceType = 0; @@ -220,19 +221,22 @@ struct DnssdNodeData char deviceName[kMaxDeviceNameLen + 1] = {}; char pairingInstruction[kMaxPairingInstructionLen + 1] = {}; - DnssdNodeData() {} + CommissionNodeData() {} void Reset() { // Let constructor clear things as default - this->~DnssdNodeData(); - new (this) DnssdNodeData(); + this->~CommissionNodeData(); + new (this) CommissionNodeData(); } bool IsInstanceName(const char * instance) const { return strcmp(instance, instanceName) == 0; } void LogDetail() const { + ChipLogDetail(Discovery, "Discovered commissionable/commissioner node:"); + CommonResolutionData::LogDetail(); + if (rotatingIdLen > 0) { char rotatingIdString[chip::Dnssd::kMaxRotatingIdLen * 2 + 1] = ""; @@ -293,27 +297,7 @@ struct ResolvedNodeData } }; -struct DiscoveredNodeData -{ - CommonResolutionData resolutionData; - DnssdNodeData nodeData; - DiscoveryType nodeType; - - void Reset() - { - resolutionData.Reset(); - nodeData.Reset(); - nodeType = DiscoveryType::kUnknown; - } - DiscoveredNodeData() { Reset(); } - - void LogDetail() const - { - ChipLogDetail(Discovery, "Discovered node:"); - resolutionData.LogDetail(); - nodeData.LogDetail(); - } -}; +using DiscoveredNodeData = Variant<CommissionNodeData>; /// Callbacks for discovering nodes advertising non-operational status: /// - Commissioners diff --git a/src/lib/dnssd/tests/TestActiveResolveAttempts.cpp b/src/lib/dnssd/tests/TestActiveResolveAttempts.cpp index 58c1cf86dab511..4c2665658f3493 100644 --- a/src/lib/dnssd/tests/TestActiveResolveAttempts.cpp +++ b/src/lib/dnssd/tests/TestActiveResolveAttempts.cpp @@ -124,7 +124,8 @@ TEST(TestActiveResolveAttempts, TestSingleBrowseAddRemove) // once complete, nothing to schedule Dnssd::DiscoveredNodeData data; - data.nodeData.longDiscriminator = 1234; + data.Set<chip::Dnssd::CommissionNodeData>(); + data.Get<chip::Dnssd::CommissionNodeData>().longDiscriminator = 1234; attempts.CompleteCommissionable(data); EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().HasValue()); EXPECT_FALSE(attempts.NextScheduled().HasValue()); @@ -372,7 +373,8 @@ TEST(TestActiveResolveAttempts, TestCombination) attempts.Complete(MakePeerId(2)); attempts.Complete(MakePeerId(1)); Dnssd::DiscoveredNodeData data; - data.nodeData.longDiscriminator = 1234; + data.Set<chip::Dnssd::CommissionNodeData>(); + data.Get<chip::Dnssd::CommissionNodeData>().longDiscriminator = 1234; attempts.CompleteCommissionable(data); EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().HasValue()); diff --git a/src/lib/dnssd/tests/TestIncrementalResolve.cpp b/src/lib/dnssd/tests/TestIncrementalResolve.cpp index 646e4abfe38303..5ed4191319e824 100644 --- a/src/lib/dnssd/tests/TestIncrementalResolve.cpp +++ b/src/lib/dnssd/tests/TestIncrementalResolve.cpp @@ -385,28 +385,31 @@ TEST(TestIncrementalResolve, TestParseCommissionable) EXPECT_FALSE(resolver.GetMissingRequiredInformation().HasAny()); // At this point taking value should work. Once taken, the resolver is reset. - DiscoveredNodeData nodeData; - EXPECT_EQ(resolver.Take(nodeData), CHIP_NO_ERROR); + DiscoveredNodeData discoveredNodeData; + EXPECT_TRUE(resolver.Take(discoveredNodeData) == CHIP_NO_ERROR); EXPECT_FALSE(resolver.IsActive()); + EXPECT_TRUE(discoveredNodeData.Is<CommissionNodeData>()); + CommissionNodeData nodeData = discoveredNodeData.Get<CommissionNodeData>(); + // validate data as it was passed in - EXPECT_EQ(nodeData.resolutionData.numIPs, 2u); - EXPECT_EQ(nodeData.resolutionData.port, 0x1234); - EXPECT_FALSE(nodeData.resolutionData.supportsTcp); - EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); - EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalActive().Value(), chip::System::Clock::Milliseconds32(321)); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_EQ(nodeData.numIPs, 2u); + EXPECT_EQ(nodeData.port, 0x1234); + EXPECT_FALSE(nodeData.supportsTcp); + EXPECT_TRUE(nodeData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_EQ(nodeData.GetMrpRetryIntervalActive().Value(), chip::System::Clock::Milliseconds32(321)); + EXPECT_FALSE(nodeData.GetMrpRetryIntervalIdle().HasValue()); Inet::IPAddress addr; EXPECT_TRUE(Inet::IPAddress::FromString("fe80::abcd:ef11:2233:4455", addr)); - EXPECT_EQ(nodeData.resolutionData.ipAddress[0], addr); + EXPECT_EQ(nodeData.ipAddress[0], addr); EXPECT_TRUE(Inet::IPAddress::FromString("fe80::f0f1:f2f3:f4f5:1234", addr)); - EXPECT_EQ(nodeData.resolutionData.ipAddress[1], addr); + EXPECT_EQ(nodeData.ipAddress[1], addr); // parsed txt data for discovered nodes - EXPECT_EQ(nodeData.nodeData.longDiscriminator, 22345); - EXPECT_EQ(nodeData.nodeData.vendorId, 321); - EXPECT_EQ(nodeData.nodeData.productId, 654); - EXPECT_STREQ(nodeData.nodeData.deviceName, "mytest"); + EXPECT_EQ(nodeData.longDiscriminator, 22345); + EXPECT_EQ(nodeData.vendorId, 321); + EXPECT_EQ(nodeData.productId, 654); + EXPECT_STREQ(nodeData.deviceName, "mytest"); } } // namespace diff --git a/src/lib/dnssd/tests/TestTxtFields.cpp b/src/lib/dnssd/tests/TestTxtFields.cpp index d487c261346c05..ce206e34ae46aa 100644 --- a/src/lib/dnssd/tests/TestTxtFields.cpp +++ b/src/lib/dnssd/tests/TestTxtFields.cpp @@ -300,23 +300,21 @@ TEST(TestTxtFields, TestGetCommissionerPasscode) EXPECT_EQ(GetCommissionerPasscode(GetSpan(cm)), 0); } -bool NodeDataIsEmpty(const DiscoveredNodeData & node) +bool NodeDataIsEmpty(const CommissionNodeData & node) { - if (node.nodeData.longDiscriminator != 0 || node.nodeData.vendorId != 0 || node.nodeData.productId != 0 || - node.nodeData.commissioningMode != 0 || node.nodeData.deviceType != 0 || node.nodeData.rotatingIdLen != 0 || - node.nodeData.pairingHint != 0 || node.resolutionData.mrpRetryIntervalIdle.HasValue() || - node.resolutionData.mrpRetryIntervalActive.HasValue() || node.resolutionData.mrpRetryActiveThreshold.HasValue() || - node.resolutionData.isICDOperatingAsLIT.HasValue() || node.resolutionData.supportsTcp || - node.nodeData.supportsCommissionerGeneratedPasscode != 0) + if (node.longDiscriminator != 0 || node.vendorId != 0 || node.productId != 0 || node.commissioningMode != 0 || + node.deviceType != 0 || node.rotatingIdLen != 0 || node.pairingHint != 0 || node.mrpRetryIntervalIdle.HasValue() || + node.mrpRetryIntervalActive.HasValue() || node.mrpRetryActiveThreshold.HasValue() || node.isICDOperatingAsLIT.HasValue() || + node.supportsTcp || node.supportsCommissionerGeneratedPasscode != 0) { return false; } - if (strcmp(node.nodeData.deviceName, "") != 0 || strcmp(node.nodeData.pairingInstruction, "") != 0) + if (strcmp(node.deviceName, "") != 0 || strcmp(node.pairingInstruction, "") != 0) { return false; } - for (uint8_t id : node.nodeData.rotatingId) + for (uint8_t id : node.rotatingId) { if (id != 0) { @@ -331,83 +329,82 @@ TEST(TestTxtFields, TestFillDiscoveredNodeDataFromTxt) { char key[3]; char val[16]; - DiscoveredNodeData filled; + CommissionNodeData filled; // Long discriminator strcpy(key, "D"); strcpy(val, "840"); - FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - EXPECT_EQ(filled.nodeData.longDiscriminator, 840); - filled.nodeData.longDiscriminator = 0; + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled); + EXPECT_EQ(filled.longDiscriminator, 840); + filled.longDiscriminator = 0; EXPECT_TRUE(NodeDataIsEmpty(filled)); // vendor and product strcpy(key, "VP"); strcpy(val, "123+456"); - FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - EXPECT_EQ(filled.nodeData.vendorId, 123); - EXPECT_EQ(filled.nodeData.productId, 456); - filled.nodeData.vendorId = 0; - filled.nodeData.productId = 0; + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled); + EXPECT_EQ(filled.vendorId, 123); + EXPECT_EQ(filled.productId, 456); + filled.vendorId = 0; + filled.productId = 0; EXPECT_TRUE(NodeDataIsEmpty(filled)); // Commissioning mode strcpy(key, "CM"); strcpy(val, "1"); - FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - EXPECT_EQ(filled.nodeData.commissioningMode, 1); - filled.nodeData.commissioningMode = 0; + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled); + EXPECT_EQ(filled.commissioningMode, 1); + filled.commissioningMode = 0; EXPECT_TRUE(NodeDataIsEmpty(filled)); - // Supports Commissioner Generated Passcode strcpy(key, "CP"); strcpy(val, "1"); - FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - EXPECT_TRUE(filled.nodeData.supportsCommissionerGeneratedPasscode); - filled.nodeData.supportsCommissionerGeneratedPasscode = false; + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled); + EXPECT_TRUE(filled.supportsCommissionerGeneratedPasscode); + filled.supportsCommissionerGeneratedPasscode = false; EXPECT_TRUE(NodeDataIsEmpty(filled)); // Device type strcpy(key, "DT"); strcpy(val, "1"); - FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - EXPECT_EQ(filled.nodeData.deviceType, 1u); - filled.nodeData.deviceType = 0; + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled); + EXPECT_EQ(filled.deviceType, 1u); + filled.deviceType = 0; EXPECT_TRUE(NodeDataIsEmpty(filled)); // Device name strcpy(key, "DN"); strcpy(val, "abc"); - FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - EXPECT_STREQ(filled.nodeData.deviceName, "abc"); - memset(filled.nodeData.deviceName, 0, sizeof(filled.nodeData.deviceName)); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled); + EXPECT_STREQ(filled.deviceName, "abc"); + memset(filled.deviceName, 0, sizeof(filled.deviceName)); EXPECT_TRUE(NodeDataIsEmpty(filled)); // Rotating device id strcpy(key, "RI"); strcpy(val, "1A2B"); - FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - EXPECT_EQ(filled.nodeData.rotatingId[0], 0x1A); - EXPECT_EQ(filled.nodeData.rotatingId[1], 0x2B); - EXPECT_EQ(filled.nodeData.rotatingIdLen, 2u); - filled.nodeData.rotatingIdLen = 0; - memset(filled.nodeData.rotatingId, 0, sizeof(filled.nodeData.rotatingId)); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled); + EXPECT_EQ(filled.rotatingId[0], 0x1A); + EXPECT_EQ(filled.rotatingId[1], 0x2B); + EXPECT_EQ(filled.rotatingIdLen, 2u); + filled.rotatingIdLen = 0; + memset(filled.rotatingId, 0, sizeof(filled.rotatingId)); EXPECT_TRUE(NodeDataIsEmpty(filled)); // Pairing instruction strcpy(key, "PI"); strcpy(val, "hint"); - FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - EXPECT_STREQ(filled.nodeData.pairingInstruction, "hint"); - memset(filled.nodeData.pairingInstruction, 0, sizeof(filled.nodeData.pairingInstruction)); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled); + EXPECT_STREQ(filled.pairingInstruction, "hint"); + memset(filled.pairingInstruction, 0, sizeof(filled.pairingInstruction)); EXPECT_TRUE(NodeDataIsEmpty(filled)); // Pairing hint strcpy(key, "PH"); strcpy(val, "1"); - FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled.nodeData); - EXPECT_EQ(filled.nodeData.pairingHint, 1); - filled.nodeData.pairingHint = 0; + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), filled); + EXPECT_EQ(filled.pairingHint, 1); + filled.pairingHint = 0; EXPECT_TRUE(NodeDataIsEmpty(filled)); } @@ -421,7 +418,7 @@ bool NodeDataIsEmpty(const ResolvedNodeData & nodeData) void ResetRetryIntervalIdle(DiscoveredNodeData & nodeData) { - nodeData.resolutionData.mrpRetryIntervalIdle.ClearValue(); + nodeData.Get<CommissionNodeData>().mrpRetryIntervalIdle.ClearValue(); } void ResetRetryIntervalIdle(ResolvedNodeData & nodeData) @@ -431,7 +428,7 @@ void ResetRetryIntervalIdle(ResolvedNodeData & nodeData) void ResetRetryIntervalActive(DiscoveredNodeData & nodeData) { - nodeData.resolutionData.mrpRetryIntervalActive.ClearValue(); + nodeData.Get<CommissionNodeData>().mrpRetryIntervalActive.ClearValue(); } void ResetRetryIntervalActive(ResolvedNodeData & nodeData) @@ -441,7 +438,7 @@ void ResetRetryIntervalActive(ResolvedNodeData & nodeData) void ResetRetryActiveThreshold(DiscoveredNodeData & nodeData) { - nodeData.resolutionData.mrpRetryActiveThreshold.ClearValue(); + nodeData.Get<CommissionNodeData>().mrpRetryActiveThreshold.ClearValue(); } void ResetRetryActiveThreshold(ResolvedNodeData & nodeData) @@ -449,6 +446,326 @@ void ResetRetryActiveThreshold(ResolvedNodeData & nodeData) nodeData.resolutionData.mrpRetryActiveThreshold.ClearValue(); } +template <class NodeData> +void DiscoveredTxtFieldSessionIdleInterval() +{ + char key[4]; + char val[16]; + DiscoveredNodeData nodeData; + nodeData.Set<NodeData>(); + CommonResolutionData & resolutionData = nodeData.Get<NodeData>(); + + // Minimum + strcpy(key, "SII"); + strcpy(val, "1"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); + EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().Value() == 1_ms32); + + // Maximum + strcpy(key, "SII"); + strcpy(val, "3600000"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); + EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().Value() == 3600000_ms32); + + // Test no other fields were populated + ResetRetryIntervalIdle(nodeData); + EXPECT_TRUE(NodeDataIsEmpty(nodeData.Get<NodeData>())); + + // Invalid SII - negative value + strcpy(key, "SII"); + strcpy(val, "-1"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); + + // Invalid SII - greater than maximum + strcpy(key, "SII"); + strcpy(val, "3600001"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); + + // Invalid SII - much greater than maximum + strcpy(key, "SII"); + strcpy(val, "1095216660481"); // 0xFF00000001 == 1 (mod 2^32) + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); + + // Invalid SII - hexadecimal value + strcpy(key, "SII"); + strcpy(val, "0x20"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); + + // Invalid SII - leading zeros + strcpy(key, "SII"); + strcpy(val, "0700"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); + + // Invalid SII - text at the end + strcpy(key, "SII"); + strcpy(val, "123abc"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); +} + +// Test SAI (formerly CRA) +template <class NodeData> +void DiscoveredTxtFieldSessionActiveInterval() +{ + char key[4]; + char val[16]; + DiscoveredNodeData nodeData; + nodeData.Set<NodeData>(); + CommonResolutionData & resolutionData = nodeData.Get<NodeData>(); + + // Minimum + strcpy(key, "SAI"); + strcpy(val, "1"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); + EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalActive().Value() == 1_ms32); + + // Maximum + strcpy(key, "SAI"); + strcpy(val, "3600000"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); + EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalActive().Value() == 3600000_ms32); + + // Test no other fields were populated + ResetRetryIntervalActive(nodeData); + EXPECT_TRUE(NodeDataIsEmpty(nodeData.Get<NodeData>())); + + // Invalid SAI - negative value + strcpy(key, "SAI"); + strcpy(val, "-1"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); + + // Invalid SAI - greater than maximum + strcpy(key, "SAI"); + strcpy(val, "3600001"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); + + // Invalid SAI - much greater than maximum + strcpy(key, "SAI"); + strcpy(val, "1095216660481"); // 0xFF00000001 == 1 (mod 2^32) + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); + + // Invalid SAI - hexadecimal value + strcpy(key, "SAI"); + strcpy(val, "0x20"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); + + // Invalid SAI - leading zeros + strcpy(key, "SAI"); + strcpy(val, "0700"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); + + // Invalid SAI - text at the end + strcpy(key, "SAI"); + strcpy(val, "123abc"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); +} + +// Test SAT (Session Active Threshold) +template <class NodeData> +void DiscoveredTxtFieldSessionActiveThreshold() +{ + char key[4]; + char val[16]; + DiscoveredNodeData nodeData; + nodeData.Set<NodeData>(); + CommonResolutionData & resolutionData = nodeData.Get<NodeData>(); + + // Minimum + strcpy(key, "SAT"); + strcpy(val, "1"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); + EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().Value() == 1_ms16); + + // Maximum + strcpy(key, "SAT"); + strcpy(val, "65535"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); + EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().Value() == 65535_ms16); + + // Test no other fields were populated + ResetRetryActiveThreshold(nodeData); + EXPECT_TRUE(NodeDataIsEmpty(nodeData.Get<NodeData>())); + + // Invalid SAI - negative value + strcpy(key, "SAT"); + strcpy(val, "-1"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); + + // Invalid SAI - greater than maximum + strcpy(key, "SAT"); + strcpy(val, "65536"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); + + // Invalid SAT - much greater than maximum + strcpy(key, "SAT"); + strcpy(val, "1095216660481"); // 0xFF00000001 == 1 (mod 2^32) + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); + + // Invalid SAT - hexadecimal value + strcpy(key, "SAT"); + strcpy(val, "0x20"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); + + // Invalid SAT - leading zeros + strcpy(key, "SAT"); + strcpy(val, "0700"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); + + // Invalid SAT - text at the end + strcpy(key, "SAT"); + strcpy(val, "123abc"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); +} + +// Test T (TCP support) +template <class NodeData> +void DiscoveredTxtFieldTcpSupport() +{ + char key[4]; + char val[8]; + DiscoveredNodeData nodeData; + nodeData.Set<NodeData>(); + CommonResolutionData & resolutionData = nodeData.Get<NodeData>(); + + // True + strcpy(key, "T"); + strcpy(val, "1"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(nodeData.Get<NodeData>().supportsTcp); + + // Test no other fields were populated + nodeData.Get<NodeData>().supportsTcp = false; + EXPECT_TRUE(NodeDataIsEmpty(nodeData.Get<NodeData>())); + + // False + strcpy(key, "T"); + strcpy(val, "0"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(nodeData.Get<NodeData>().supportsTcp == false); + + // Invalid value, stil false + strcpy(key, "T"); + strcpy(val, "asdf"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(nodeData.Get<NodeData>().supportsTcp == false); +} + +// Test ICD (ICD operation Mode) +template <class NodeData> +void DiscoveredTxtFieldICDoperatesAsLIT() +{ + char key[4]; + char val[16]; + DiscoveredNodeData nodeData; + nodeData.Set<NodeData>(); + CommonResolutionData & resolutionData = nodeData.Get<NodeData>(); + + // ICD is operating as a LIT device + strcpy(key, "ICD"); + strcpy(val, "1"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(nodeData.Get<NodeData>().isICDOperatingAsLIT.HasValue()); + EXPECT_TRUE(nodeData.Get<NodeData>().isICDOperatingAsLIT.Value()); + + // Test no other fields were populated + nodeData.Get<NodeData>().isICDOperatingAsLIT.ClearValue(); + EXPECT_TRUE(NodeDataIsEmpty(nodeData.Get<NodeData>())); + + // ICD is operating as a SIT device + strcpy(key, "ICD"); + strcpy(val, "0"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(nodeData.Get<NodeData>().isICDOperatingAsLIT.HasValue()); + EXPECT_TRUE(nodeData.Get<NodeData>().isICDOperatingAsLIT.Value() == false); + + nodeData.Get<NodeData>().isICDOperatingAsLIT.ClearValue(); + EXPECT_TRUE(NodeDataIsEmpty(nodeData.Get<NodeData>())); + // Invalid value, No key set + strcpy(key, "ICD"); + strcpy(val, "asdf"); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(nodeData.Get<NodeData>().isICDOperatingAsLIT.HasValue() == false); +} + +// Test IsDeviceTreatedAsSleepy() with CRI +template <class NodeData> +void DiscoveredTestIsDeviceSessionIdle() +{ + char key[4]; + char val[32]; + DiscoveredNodeData nodeData; + nodeData.Set<NodeData>(); + const ReliableMessageProtocolConfig defaultMRPConfig(CHIP_CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL, + CHIP_CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL); + CommonResolutionData & resolutionData = nodeData.Get<NodeData>(); + + // No key/val set, so the device can't be sleepy + EXPECT_TRUE(!nodeData.Get<NodeData>().IsDeviceTreatedAsSleepy(&defaultMRPConfig)); + + // If the interval is the default value, the device is not sleepy + strcpy(key, "SII"); + sprintf(val, "%d", static_cast<int>(CHIP_CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL.count())); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().IsDeviceTreatedAsSleepy(&defaultMRPConfig)); + + // If the interval is greater than the default value, the device is sleepy + sprintf(key, "SII"); + sprintf(val, "%d", static_cast<int>(CHIP_CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL.count() + 1)); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(nodeData.Get<NodeData>().IsDeviceTreatedAsSleepy(&defaultMRPConfig)); +} + +// Test IsDeviceTreatedAsSleepy() with CRA +template <class NodeData> +void DiscoveredTestIsDeviceSessionActive() +{ + char key[4]; + char val[32]; + DiscoveredNodeData nodeData; + nodeData.Set<NodeData>(); + const ReliableMessageProtocolConfig defaultMRPConfig(CHIP_CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL, + CHIP_CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL); + CommonResolutionData & resolutionData = nodeData.Get<NodeData>(); + + // No key/val set, so the device can't be sleepy + EXPECT_TRUE(!nodeData.Get<NodeData>().IsDeviceTreatedAsSleepy(&defaultMRPConfig)); + + // If the interval is the default value, the device is not sleepy + sprintf(key, "SAI"); + sprintf(val, "%d", static_cast<int>(CHIP_CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL.count())); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(!nodeData.Get<NodeData>().IsDeviceTreatedAsSleepy(&defaultMRPConfig)); + + // If the interval is greater than the default value, the device is sleepy + strcpy(key, "SAI"); + sprintf(val, "%d", static_cast<int>(CHIP_CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL.count() + 1)); + FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); + EXPECT_TRUE(nodeData.Get<NodeData>().IsDeviceTreatedAsSleepy(&defaultMRPConfig)); +} + // Test SAI (formally CRI) template <class NodeData> void TxtFieldSessionIdleInterval() @@ -514,7 +831,7 @@ void TxtFieldSessionIdleInterval() TEST(TestTxtFields, TxtDiscoveredFieldMrpRetryIntervalIdle) { - TxtFieldSessionIdleInterval<DiscoveredNodeData>(); + DiscoveredTxtFieldSessionIdleInterval<CommissionNodeData>(); } TEST(TestTxtFields, TxtResolvedFieldMrpRetryIntervalIdle) @@ -587,7 +904,7 @@ void TxtFieldSessionActiveInterval() TEST(TestTxtFields, TxtDiscoveredFieldMrpRetryIntervalActive) { - TxtFieldSessionActiveInterval<DiscoveredNodeData>(); + DiscoveredTxtFieldSessionActiveInterval<CommissionNodeData>(); } TEST(TestTxtFields, TxtResolvedFieldMrpRetryIntervalActive) @@ -660,7 +977,7 @@ void TxtFieldSessionActiveThreshold() TEST(TestTxtFields, TxtDiscoveredFieldMrpRetryActiveThreshold) { - TxtFieldSessionActiveThreshold<DiscoveredNodeData>(); + DiscoveredTxtFieldSessionActiveThreshold<CommissionNodeData>(); } TEST(TestTxtFields, TxtResolvedFieldMrpRetryActiveThreshold) @@ -701,7 +1018,7 @@ void TxtFieldTcpSupport() TEST(TestTxtFields, TxtDiscoveredFieldTcpSupport) { - TxtFieldTcpSupport<DiscoveredNodeData>(); + DiscoveredTxtFieldTcpSupport<CommissionNodeData>(); } TEST(TestTxtFields, TxtResolvedFieldTcpSupport) @@ -746,7 +1063,7 @@ void TxtFieldICDoperatesAsLIT() TEST(TestTxtFields, TxtDiscoveredIsICDoperatingAsLIT) { - TxtFieldICDoperatesAsLIT<DiscoveredNodeData>(); + DiscoveredTxtFieldICDoperatesAsLIT<CommissionNodeData>(); } TEST(TestTxtFields, TxtResolvedFieldICDoperatingAsLIT) @@ -782,7 +1099,7 @@ void TestIsDeviceSessionIdle() TEST(TestTxtFields, TxtDiscoveredIsDeviceSessionIdle) { - TestIsDeviceSessionIdle<DiscoveredNodeData>(); + DiscoveredTestIsDeviceSessionIdle<CommissionNodeData>(); } TEST(TestTxtFields, TxtResolvedIsDeviceSessionIdle) @@ -818,7 +1135,7 @@ void TestIsDeviceSessionActive() TEST(TestTxtFields, TxtDiscoveredIsDeviceSessionActive) { - TestIsDeviceSessionActive<DiscoveredNodeData>(); + DiscoveredTestIsDeviceSessionActive<CommissionNodeData>(); } TEST(TestTxtFields, TxtResolvedIsDeviceSessionActive) diff --git a/src/lib/shell/commands/Dns.cpp b/src/lib/shell/commands/Dns.cpp index ff9edad52445a5..04d82313d7d3d4 100644 --- a/src/lib/shell/commands/Dns.cpp +++ b/src/lib/shell/commands/Dns.cpp @@ -83,61 +83,66 @@ class DnsShellResolverDelegate : public Dnssd::DiscoverNodeDelegate, public Addr AddressResolve::NodeLookupHandle & Handle() { return mSelfHandle; } - void OnNodeDiscovered(const Dnssd::DiscoveredNodeData & nodeData) override + void OnNodeDiscovered(const Dnssd::DiscoveredNodeData & discNodeData) override { - if (!nodeData.resolutionData.IsValid()) + if (!discNodeData.Is<Dnssd::CommissionNodeData>()) + { + streamer_printf(streamer_get(), "DNS browse failed - not commission type node \r\n"); + return; + } + + Dnssd::CommissionNodeData nodeData = discNodeData.Get<Dnssd::CommissionNodeData>(); + if (!nodeData.IsValid()) { streamer_printf(streamer_get(), "DNS browse failed - not found valid services \r\n"); return; } char rotatingId[Dnssd::kMaxRotatingIdLen * 2 + 1]; - Encoding::BytesToUppercaseHexString(nodeData.nodeData.rotatingId, nodeData.nodeData.rotatingIdLen, rotatingId, - sizeof(rotatingId)); + Encoding::BytesToUppercaseHexString(nodeData.rotatingId, nodeData.rotatingIdLen, rotatingId, sizeof(rotatingId)); streamer_printf(streamer_get(), "DNS browse succeeded: \r\n"); - streamer_printf(streamer_get(), " Node Type: %u\r\n", nodeData.nodeType); - streamer_printf(streamer_get(), " Hostname: %s\r\n", nodeData.resolutionData.hostName); - streamer_printf(streamer_get(), " Vendor ID: %u\r\n", nodeData.nodeData.vendorId); - streamer_printf(streamer_get(), " Product ID: %u\r\n", nodeData.nodeData.productId); - streamer_printf(streamer_get(), " Long discriminator: %u\r\n", nodeData.nodeData.longDiscriminator); - streamer_printf(streamer_get(), " Device type: %u\r\n", nodeData.nodeData.deviceType); - streamer_printf(streamer_get(), " Device name: %s\n", nodeData.nodeData.deviceName); - streamer_printf(streamer_get(), " Commissioning mode: %d\r\n", static_cast<int>(nodeData.nodeData.commissioningMode)); - streamer_printf(streamer_get(), " Pairing hint: %u\r\n", nodeData.nodeData.pairingHint); - streamer_printf(streamer_get(), " Pairing instruction: %s\r\n", nodeData.nodeData.pairingInstruction); + streamer_printf(streamer_get(), " Hostname: %s\r\n", nodeData.hostName); + streamer_printf(streamer_get(), " Vendor ID: %u\r\n", nodeData.vendorId); + streamer_printf(streamer_get(), " Product ID: %u\r\n", nodeData.productId); + streamer_printf(streamer_get(), " Long discriminator: %u\r\n", nodeData.longDiscriminator); + streamer_printf(streamer_get(), " Device type: %u\r\n", nodeData.deviceType); + streamer_printf(streamer_get(), " Device name: %s\n", nodeData.deviceName); + streamer_printf(streamer_get(), " Commissioning mode: %d\r\n", static_cast<int>(nodeData.commissioningMode)); + streamer_printf(streamer_get(), " Pairing hint: %u\r\n", nodeData.pairingHint); + streamer_printf(streamer_get(), " Pairing instruction: %s\r\n", nodeData.pairingInstruction); streamer_printf(streamer_get(), " Rotating ID %s\r\n", rotatingId); - auto retryInterval = nodeData.resolutionData.GetMrpRetryIntervalIdle(); + auto retryInterval = nodeData.GetMrpRetryIntervalIdle(); if (retryInterval.HasValue()) streamer_printf(streamer_get(), " MRP retry interval (idle): %" PRIu32 "ms\r\n", retryInterval.Value()); - retryInterval = nodeData.resolutionData.GetMrpRetryIntervalActive(); + retryInterval = nodeData.GetMrpRetryIntervalActive(); if (retryInterval.HasValue()) streamer_printf(streamer_get(), " MRP retry interval (active): %" PRIu32 "ms\r\n", retryInterval.Value()); - if (nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()) + if (nodeData.GetMrpRetryActiveThreshold().HasValue()) { streamer_printf(streamer_get(), " MRP retry active threshold time: %" PRIu32 "ms\r\n", - nodeData.resolutionData.GetMrpRetryActiveThreshold().Value()); + nodeData.GetMrpRetryActiveThreshold().Value()); } - streamer_printf(streamer_get(), " Supports TCP: %s\r\n", nodeData.resolutionData.supportsTcp ? "yes" : "no"); + streamer_printf(streamer_get(), " Supports TCP: %s\r\n", nodeData.supportsTcp ? "yes" : "no"); - if (nodeData.resolutionData.isICDOperatingAsLIT.HasValue()) + if (nodeData.isICDOperatingAsLIT.HasValue()) { streamer_printf(streamer_get(), " ICD is operating as a: %s\r\n", - nodeData.resolutionData.isICDOperatingAsLIT.Value() ? "LIT" : "SIT"); + nodeData.isICDOperatingAsLIT.Value() ? "LIT" : "SIT"); } streamer_printf(streamer_get(), " IP addresses:\r\n"); - for (size_t i = 0; i < nodeData.resolutionData.numIPs; i++) + for (size_t i = 0; i < nodeData.numIPs; i++) { - streamer_printf(streamer_get(), " %s\r\n", nodeData.resolutionData.ipAddress[i].ToString(ipAddressBuf)); + streamer_printf(streamer_get(), " %s\r\n", nodeData.ipAddress[i].ToString(ipAddressBuf)); } - if (nodeData.resolutionData.port > 0) + if (nodeData.port > 0) { - streamer_printf(streamer_get(), " Port: %u\r\n", nodeData.resolutionData.port); + streamer_printf(streamer_get(), " Port: %u\r\n", nodeData.port); } } diff --git a/src/protocols/user_directed_commissioning/UserDirectedCommissioningServer.cpp b/src/protocols/user_directed_commissioning/UserDirectedCommissioningServer.cpp index b96c45630166fa..cb953c8a60e5ca 100644 --- a/src/protocols/user_directed_commissioning/UserDirectedCommissioningServer.cpp +++ b/src/protocols/user_directed_commissioning/UserDirectedCommissioningServer.cpp @@ -466,21 +466,26 @@ void UserDirectedCommissioningServer::SetUDCClientProcessingState(char * instanc mUdcClients.MarkUDCClientActive(client); } -void UserDirectedCommissioningServer::OnCommissionableNodeFound(const Dnssd::DiscoveredNodeData & nodeData) +void UserDirectedCommissioningServer::OnCommissionableNodeFound(const Dnssd::DiscoveredNodeData & discNodeData) { - if (nodeData.resolutionData.numIPs == 0) + if (!discNodeData.Is<Dnssd::CommissionNodeData>()) { - ChipLogError(AppServer, "OnCommissionableNodeFound no IP addresses returned for instance name=%s", - nodeData.nodeData.instanceName); return; } - if (nodeData.resolutionData.port == 0) + + const Dnssd::CommissionNodeData & nodeData = discNodeData.Get<Dnssd::CommissionNodeData>(); + if (nodeData.numIPs == 0) + { + ChipLogError(AppServer, "OnCommissionableNodeFound no IP addresses returned for instance name=%s", nodeData.instanceName); + return; + } + if (nodeData.port == 0) { - ChipLogError(AppServer, "OnCommissionableNodeFound no port returned for instance name=%s", nodeData.nodeData.instanceName); + ChipLogError(AppServer, "OnCommissionableNodeFound no port returned for instance name=%s", nodeData.instanceName); return; } - UDCClientState * client = mUdcClients.FindUDCClientState(nodeData.nodeData.instanceName); + UDCClientState * client = mUdcClients.FindUDCClientState(nodeData.instanceName); if (client != nullptr && client->GetUDCClientProcessingState() == UDCClientProcessingState::kDiscoveringNode) { ChipLogDetail(AppServer, "OnCommissionableNodeFound instance: name=%s old_state=%d new_state=%d", client->GetInstanceName(), @@ -490,50 +495,45 @@ void UserDirectedCommissioningServer::OnCommissionableNodeFound(const Dnssd::Dis #if INET_CONFIG_ENABLE_IPV4 // prefer IPv4 if its an option bool foundV4 = false; - for (unsigned i = 0; i < nodeData.resolutionData.numIPs; ++i) + for (unsigned i = 0; i < nodeData.numIPs; ++i) { - if (nodeData.resolutionData.ipAddress[i].IsIPv4()) + if (nodeData.ipAddress[i].IsIPv4()) { foundV4 = true; - client->SetPeerAddress( - chip::Transport::PeerAddress::UDP(nodeData.resolutionData.ipAddress[i], nodeData.resolutionData.port)); + client->SetPeerAddress(chip::Transport::PeerAddress::UDP(nodeData.ipAddress[i], nodeData.port)); break; } } // use IPv6 as last resort if (!foundV4) { - client->SetPeerAddress( - chip::Transport::PeerAddress::UDP(nodeData.resolutionData.ipAddress[0], nodeData.resolutionData.port)); + client->SetPeerAddress(chip::Transport::PeerAddress::UDP(nodeData.ipAddress[0], nodeData.port)); } #else // INET_CONFIG_ENABLE_IPV4 // if we only support V6, then try to find a v6 address bool foundV6 = false; - for (unsigned i = 0; i < nodeData.resolutionData.numIPs; ++i) + for (unsigned i = 0; i < nodeData.numIPs; ++i) { - if (nodeData.resolutionData.ipAddress[i].IsIPv6()) + if (nodeData.ipAddress[i].IsIPv6()) { foundV6 = true; - client->SetPeerAddress( - chip::Transport::PeerAddress::UDP(nodeData.resolutionData.ipAddress[i], nodeData.resolutionData.port)); + client->SetPeerAddress(chip::Transport::PeerAddress::UDP(nodeData.ipAddress[i], nodeData.port)); break; } } // last resort, try with what we have if (!foundV6) { - ChipLogError(AppServer, "OnCommissionableNodeFound no v6 returned for instance name=%s", - nodeData.nodeData.instanceName); - client->SetPeerAddress( - chip::Transport::PeerAddress::UDP(nodeData.resolutionData.ipAddress[0], nodeData.resolutionData.port)); + ChipLogError(AppServer, "OnCommissionableNodeFound no v6 returned for instance name=%s", nodeData.instanceName); + client->SetPeerAddress(chip::Transport::PeerAddress::UDP(nodeData.ipAddress[0], nodeData.port)); } #endif // INET_CONFIG_ENABLE_IPV4 - client->SetDeviceName(nodeData.nodeData.deviceName); - client->SetLongDiscriminator(nodeData.nodeData.longDiscriminator); - client->SetVendorId(nodeData.nodeData.vendorId); - client->SetProductId(nodeData.nodeData.productId); - client->SetRotatingId(nodeData.nodeData.rotatingId, nodeData.nodeData.rotatingIdLen); + client->SetDeviceName(nodeData.deviceName); + client->SetLongDiscriminator(nodeData.longDiscriminator); + client->SetVendorId(nodeData.vendorId); + client->SetProductId(nodeData.productId); + client->SetRotatingId(nodeData.rotatingId, nodeData.rotatingIdLen); // Call the registered mUserConfirmationProvider, if any. if (mUserConfirmationProvider != nullptr) diff --git a/src/protocols/user_directed_commissioning/tests/TestUdcMessages.cpp b/src/protocols/user_directed_commissioning/tests/TestUdcMessages.cpp index a62aa52b94a2e3..3d50682dee5dcf 100644 --- a/src/protocols/user_directed_commissioning/tests/TestUdcMessages.cpp +++ b/src/protocols/user_directed_commissioning/tests/TestUdcMessages.cpp @@ -86,23 +86,27 @@ void TestUDCServerUserConfirmationProvider(nlTestSuite * inSuite, void * inConte // setup for tests udcServer.SetUDCClientProcessingState((char *) instanceName1, UDCClientProcessingState::kUserDeclined); - Dnssd::DiscoveredNodeData nodeData1; - nodeData1.resolutionData.port = 5540; - nodeData1.resolutionData.ipAddress[0] = address; - nodeData1.resolutionData.numIPs = 1; - Platform::CopyString(nodeData1.nodeData.instanceName, instanceName1); - - Dnssd::DiscoveredNodeData nodeData2; - nodeData2.resolutionData.port = 5540; - nodeData2.resolutionData.ipAddress[0] = address; - nodeData2.resolutionData.numIPs = 1; - nodeData2.nodeData.longDiscriminator = disc2; - Platform::CopyString(nodeData2.nodeData.instanceName, instanceName2); - Platform::CopyString(nodeData2.nodeData.deviceName, deviceName2); + Dnssd::DiscoveredNodeData discNodeData1; + discNodeData1.Set<CommissionNodeData>(); + Dnssd::CommissionNodeData & nodeData1 = discNodeData1.Get<CommissionNodeData>(); + nodeData1.port = 5540; + nodeData1.ipAddress[0] = address; + nodeData1.numIPs = 1; + Platform::CopyString(nodeData1.instanceName, instanceName1); + + Dnssd::DiscoveredNodeData discNodeData2; + discNodeData2.Set<CommissionNodeData>(); + Dnssd::CommissionNodeData & nodeData2 = discNodeData2.Get<CommissionNodeData>(); + nodeData2.port = 5540; + nodeData2.ipAddress[0] = address; + nodeData2.numIPs = 1; + nodeData2.longDiscriminator = disc2; + Platform::CopyString(nodeData2.instanceName, instanceName2); + Platform::CopyString(nodeData2.deviceName, deviceName2); // test empty UserConfirmationProvider - udcServer.OnCommissionableNodeFound(nodeData2); - udcServer.OnCommissionableNodeFound(nodeData1); + udcServer.OnCommissionableNodeFound(discNodeData2); + udcServer.OnCommissionableNodeFound(discNodeData1); state = udcServer.GetUDCClients().FindUDCClientState(instanceName1); NL_TEST_EXIT_ON_FAILED_ASSERT(inSuite, nullptr != state); NL_TEST_ASSERT(inSuite, UDCClientProcessingState::kUserDeclined == state->GetUDCClientProcessingState()); @@ -115,8 +119,8 @@ void TestUDCServerUserConfirmationProvider(nlTestSuite * inSuite, void * inConte // test current state check udcServer.SetUDCClientProcessingState((char *) instanceName1, UDCClientProcessingState::kUserDeclined); udcServer.SetUDCClientProcessingState((char *) instanceName2, UDCClientProcessingState::kDiscoveringNode); - udcServer.OnCommissionableNodeFound(nodeData2); - udcServer.OnCommissionableNodeFound(nodeData1); + udcServer.OnCommissionableNodeFound(discNodeData2); + udcServer.OnCommissionableNodeFound(discNodeData1); state = udcServer.GetUDCClients().FindUDCClientState(instanceName1); NL_TEST_EXIT_ON_FAILED_ASSERT(inSuite, nullptr != state); NL_TEST_ASSERT(inSuite, UDCClientProcessingState::kUserDeclined == state->GetUDCClientProcessingState()); @@ -132,9 +136,9 @@ void TestUDCServerUserConfirmationProvider(nlTestSuite * inSuite, void * inConte udcServer.SetUserConfirmationProvider(&testCallback); udcServer.SetUDCClientProcessingState((char *) instanceName1, UDCClientProcessingState::kUserDeclined); udcServer.SetUDCClientProcessingState((char *) instanceName2, UDCClientProcessingState::kDiscoveringNode); - udcServer.OnCommissionableNodeFound(nodeData1); + udcServer.OnCommissionableNodeFound(discNodeData1); NL_TEST_ASSERT(inSuite, !testCallback.mOnUserDirectedCommissioningRequestCalled); - udcServer.OnCommissionableNodeFound(nodeData2); + udcServer.OnCommissionableNodeFound(discNodeData2); NL_TEST_ASSERT(inSuite, testCallback.mOnUserDirectedCommissioningRequestCalled); NL_TEST_ASSERT(inSuite, 0 == strcmp(testCallback.mState.GetInstanceName(), instanceName2)); } From d905835a6a4b2659b1052dd0fdba3660f07ff733 Mon Sep 17 00:00:00 2001 From: feasel <120589145+feasel0@users.noreply.github.com> Date: Thu, 25 Apr 2024 09:44:51 -0400 Subject: [PATCH 035/124] Updated unit tests in src/protocols/bdx/tests/ to use PW instead of NL. (#33084) * Updated unit tests in src/protocols/bdx/tests/ to use PW instead of NL. * Fixed clang and GN formatting. Moved BDXTests from test_components_nl.txt to test_components.txt. * Used ASSERT_* in places where tests should be stopped immediately. Refactored to get rid of else branches that did nothing but ASSERT_TRUE(false). * Simplified TestBdxTransfersession::SetUpTestSuite as per PR suggestion. * Undid the accidental reformatting of the comments at the top. * Semicolon fix. --------- Co-authored-by: Andrei Litvin <andy314@gmail.com> --- src/protocols/bdx/tests/BUILD.gn | 7 +- src/protocols/bdx/tests/TestBdxMessages.cpp | 114 ++--- .../bdx/tests/TestBdxTransferSession.cpp | 424 +++++++----------- src/protocols/bdx/tests/TestBdxUri.cpp | 63 +-- .../openiotsdk/unit-tests/test_components.txt | 1 + .../unit-tests/test_components_nl.txt | 3 +- 6 files changed, 223 insertions(+), 389 deletions(-) diff --git a/src/protocols/bdx/tests/BUILD.gn b/src/protocols/bdx/tests/BUILD.gn index 59d5f01d35a9c1..055301b3432916 100644 --- a/src/protocols/bdx/tests/BUILD.gn +++ b/src/protocols/bdx/tests/BUILD.gn @@ -14,11 +14,10 @@ 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") - -chip_test_suite_using_nltest("tests") { +chip_test_suite("tests") { output_name = "libBDXTests" test_sources = [ @@ -30,9 +29,7 @@ chip_test_suite_using_nltest("tests") { public_deps = [ "${chip_root}/src/lib/core", "${chip_root}/src/lib/support", - "${chip_root}/src/lib/support:testing_nlunit", "${chip_root}/src/protocols/bdx", - "${nlunit_test_root}:nlunit-test", ] cflags = [ "-Wconversion" ] diff --git a/src/protocols/bdx/tests/TestBdxMessages.cpp b/src/protocols/bdx/tests/TestBdxMessages.cpp index 1a6d2c4643fb2e..6475cbd89c14c2 100644 --- a/src/protocols/bdx/tests/TestBdxMessages.cpp +++ b/src/protocols/bdx/tests/TestBdxMessages.cpp @@ -1,11 +1,10 @@ #include <protocols/bdx/BdxMessages.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> #include <lib/support/BufferWriter.h> #include <lib/support/CHIPMem.h> #include <lib/support/CodeUtils.h> -#include <lib/support/UnitTestRegistration.h> #include <limits> @@ -17,29 +16,40 @@ using namespace chip::bdx; * is identical to the origianl. */ template <class MsgType> -void TestHelperWrittenAndParsedMatch(nlTestSuite * inSuite, void * inContext, MsgType & testMsg) +void TestHelperWrittenAndParsedMatch(MsgType & testMsg) { CHIP_ERROR err = CHIP_NO_ERROR; size_t msgSize = testMsg.MessageSize(); Encoding::LittleEndian::PacketBufferWriter bbuf(System::PacketBufferHandle::New(msgSize)); - NL_TEST_ASSERT(inSuite, !bbuf.IsNull()); + ASSERT_FALSE(bbuf.IsNull()); testMsg.WriteToBuffer(bbuf); - NL_TEST_ASSERT(inSuite, bbuf.Fit()); + EXPECT_TRUE(bbuf.Fit()); System::PacketBufferHandle msgBuf = bbuf.Finalize(); - NL_TEST_ASSERT(inSuite, !msgBuf.IsNull()); + ASSERT_FALSE(msgBuf.IsNull()); System::PacketBufferHandle rcvBuf = System::PacketBufferHandle::NewWithData(msgBuf->Start(), msgSize); - NL_TEST_ASSERT(inSuite, !rcvBuf.IsNull()); + ASSERT_FALSE(rcvBuf.IsNull()); MsgType testMsgRcvd; err = testMsgRcvd.Parse(std::move(rcvBuf)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, testMsgRcvd == testMsg); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(testMsgRcvd, testMsg); } -void TestTransferInitMessage(nlTestSuite * inSuite, void * inContext) +struct TestBdxMessages : public ::testing::Test +{ + static void SetUpTestSuite() + { + CHIP_ERROR error = chip::Platform::MemoryInit(); + ASSERT_EQ(error, CHIP_NO_ERROR); + } + + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestBdxMessages, TestTransferInitMessage) { TransferInit testMsg; @@ -60,10 +70,10 @@ void TestTransferInitMessage(nlTestSuite * inSuite, void * inContext) testMsg.MetadataLength = 5; testMsg.Metadata = reinterpret_cast<uint8_t *>(fakeData); - TestHelperWrittenAndParsedMatch<TransferInit>(inSuite, inContext, testMsg); + TestHelperWrittenAndParsedMatch<TransferInit>(testMsg); } -void TestSendAcceptMessage(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBdxMessages, TestSendAcceptMessage) { SendAccept testMsg; @@ -75,10 +85,10 @@ void TestSendAcceptMessage(nlTestSuite * inSuite, void * inContext) testMsg.MetadataLength = 5; testMsg.Metadata = reinterpret_cast<uint8_t *>(fakeData); - TestHelperWrittenAndParsedMatch<SendAccept>(inSuite, inContext, testMsg); + TestHelperWrittenAndParsedMatch<SendAccept>(testMsg); } -void TestReceiveAcceptMessage(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBdxMessages, TestReceiveAcceptMessage) { ReceiveAccept testMsg; @@ -95,19 +105,19 @@ void TestReceiveAcceptMessage(nlTestSuite * inSuite, void * inContext) testMsg.MetadataLength = 5; testMsg.Metadata = reinterpret_cast<uint8_t *>(fakeData); - TestHelperWrittenAndParsedMatch<ReceiveAccept>(inSuite, inContext, testMsg); + TestHelperWrittenAndParsedMatch<ReceiveAccept>(testMsg); } -void TestCounterMessage(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBdxMessages, TestCounterMessage) { CounterMessage testMsg; testMsg.BlockCounter = 4; - TestHelperWrittenAndParsedMatch<CounterMessage>(inSuite, inContext, testMsg); + TestHelperWrittenAndParsedMatch<CounterMessage>(testMsg); } -void TestDataBlockMessage(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBdxMessages, TestDataBlockMessage) { DataBlock testMsg; @@ -116,77 +126,15 @@ void TestDataBlockMessage(nlTestSuite * inSuite, void * inContext) testMsg.DataLength = 5; testMsg.Data = reinterpret_cast<uint8_t *>(fakeData); - TestHelperWrittenAndParsedMatch<DataBlock>(inSuite, inContext, testMsg); + TestHelperWrittenAndParsedMatch<DataBlock>(testMsg); } -void TestBlockQueryWithSkipMessage(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBdxMessages, TestBlockQueryWithSkipMessage) { BlockQueryWithSkip testMsg; testMsg.BlockCounter = 5; testMsg.BytesToSkip = 16; - TestHelperWrittenAndParsedMatch<BlockQueryWithSkip>(inSuite, inContext, testMsg); -} - -// Test Suite - -/** - * Test Suite that lists all the test functions. - */ -// clang-format off -static const nlTest sTests[] = -{ - NL_TEST_DEF("TestTransferInitMessage", TestTransferInitMessage), - NL_TEST_DEF("TestSendAcceptMessage", TestSendAcceptMessage), - NL_TEST_DEF("TestReceiveAcceptMessage", TestReceiveAcceptMessage), - NL_TEST_DEF("TestCounterMessage", TestCounterMessage), - NL_TEST_DEF("TestDataBlockMessage", TestDataBlockMessage), - NL_TEST_DEF("TestBlockQueryWithSkipMessage", TestBlockQueryWithSkipMessage), - - NL_TEST_SENTINEL() -}; -// clang-format on - -/** - * Set up the test suite. - */ -static int TestSetup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - if (error != CHIP_NO_ERROR) - return FAILURE; - return SUCCESS; -} - -/** - * Tear down the test suite. - */ -static int TestTeardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; + TestHelperWrittenAndParsedMatch<BlockQueryWithSkip>(testMsg); } - -// clang-format off -static nlTestSuite sSuite = -{ - "Test-CHIP-BdxMessages", - &sTests[0], - TestSetup, - TestTeardown, -}; -// clang-format on - -/** - * Main - */ -int TestBdxMessages() -{ - // Run test suit against one context - nlTestRunner(&sSuite, nullptr); - - return (nlTestRunnerStats(&sSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestBdxMessages) diff --git a/src/protocols/bdx/tests/TestBdxTransferSession.cpp b/src/protocols/bdx/tests/TestBdxTransferSession.cpp index 9be2d7f5ffc885..a3a76df6bddf67 100644 --- a/src/protocols/bdx/tests/TestBdxTransferSession.cpp +++ b/src/protocols/bdx/tests/TestBdxTransferSession.cpp @@ -4,13 +4,12 @@ #include <string.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> #include <lib/core/TLV.h> #include <lib/support/BufferReader.h> #include <lib/support/CHIPMem.h> #include <lib/support/CodeUtils.h> -#include <lib/support/UnitTestRegistration.h> #include <protocols/secure_channel/Constants.h> #include <protocols/secure_channel/StatusReport.h> #include <system/SystemPacketBuffer.h> @@ -48,8 +47,7 @@ CHIP_ERROR WriteTLVString(uint8_t * buf, uint32_t bufLen, const char * data, uin } // Helper method: read a TLV structure with a single tag and string and verify it matches expected string. -CHIP_ERROR ReadAndVerifyTLVString(nlTestSuite * inSuite, void * inContext, const uint8_t * dataStart, uint32_t len, - const char * expected, size_t expectedLen) +CHIP_ERROR ReadAndVerifyTLVString(const uint8_t * dataStart, uint32_t len, const char * expected, size_t expectedLen) { TLV::TLVReader reader; char tmp[64] = { 0 }; @@ -91,55 +89,45 @@ CHIP_ERROR AttachHeaderAndSend(TransferSession::MessageTypeData typeData, chip:: } // Helper method for verifying that a PacketBufferHandle contains a valid BDX header and message type matches expected. -void VerifyBdxMessageToSend(nlTestSuite * inSuite, void * inContext, const TransferSession::OutputEvent & outEvent, - MessageType expected) +void VerifyBdxMessageToSend(const TransferSession::OutputEvent & outEvent, MessageType expected) { static_assert(std::is_same<std::underlying_type_t<decltype(expected)>, uint8_t>::value, "Cast is not safe"); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kMsgToSend); - NL_TEST_ASSERT(inSuite, !outEvent.MsgData.IsNull()); - NL_TEST_ASSERT(inSuite, outEvent.msgTypeData.ProtocolId == Protocols::BDX::Id); - NL_TEST_ASSERT(inSuite, outEvent.msgTypeData.MessageType == static_cast<uint8_t>(expected)); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kMsgToSend); + EXPECT_FALSE(outEvent.MsgData.IsNull()); + EXPECT_EQ(outEvent.msgTypeData.ProtocolId, Protocols::BDX::Id); + EXPECT_EQ(outEvent.msgTypeData.MessageType, static_cast<uint8_t>(expected)); } // Helper method for verifying that a PacketBufferHandle contains a valid StatusReport message and contains a specific StatusCode. // The msg argument is expected to begin at the message data start, not at the PayloadHeader. -void VerifyStatusReport(nlTestSuite * inSuite, void * inContext, const System::PacketBufferHandle & msg, StatusCode expectedCode) +void VerifyStatusReport(const System::PacketBufferHandle & msg, StatusCode expectedCode) { CHIP_ERROR err = CHIP_NO_ERROR; - if (msg.IsNull()) - { - NL_TEST_ASSERT(inSuite, false); - return; - } + ASSERT_FALSE(msg.IsNull()); System::PacketBufferHandle msgCopy = msg.CloneData(); - if (msgCopy.IsNull()) - { - NL_TEST_ASSERT(inSuite, false); - return; - } + ASSERT_FALSE(msgCopy.IsNull()); SecureChannel::StatusReport report; err = report.Parse(std::move(msgCopy)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, report.GetGeneralCode() == SecureChannel::GeneralStatusCode::kFailure); - NL_TEST_ASSERT(inSuite, report.GetProtocolId() == Protocols::BDX::Id); - NL_TEST_ASSERT(inSuite, report.GetProtocolCode() == static_cast<uint16_t>(expectedCode)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(report.GetGeneralCode(), SecureChannel::GeneralStatusCode::kFailure); + EXPECT_EQ(report.GetProtocolId(), Protocols::BDX::Id); + EXPECT_EQ(report.GetProtocolCode(), static_cast<uint16_t>(expectedCode)); } -void VerifyNoMoreOutput(nlTestSuite * inSuite, void * inContext, TransferSession & transferSession) +void VerifyNoMoreOutput(TransferSession & transferSession) { TransferSession::OutputEvent event; transferSession.PollOutput(event, kNoAdvanceTime); - NL_TEST_ASSERT(inSuite, event.EventType == TransferSession::OutputEventType::kNone); + EXPECT_EQ(event.EventType, TransferSession::OutputEventType::kNone); } // Helper method for initializing two TransferSession objects, generating a TransferInit message, and passing it to a responding // TransferSession. -void SendAndVerifyTransferInit(nlTestSuite * inSuite, void * inContext, TransferSession::OutputEvent & outEvent, - System::Clock::Timeout timeout, TransferSession & initiator, TransferRole initiatorRole, - TransferSession::TransferInitData initData, TransferSession & responder, +void SendAndVerifyTransferInit(TransferSession::OutputEvent & outEvent, System::Clock::Timeout timeout, TransferSession & initiator, + TransferRole initiatorRole, TransferSession::TransferInitData initData, TransferSession & responder, BitFlags<TransferControlFlags> & responderControlOpts, uint16_t responderMaxBlock) { CHIP_ERROR err = CHIP_NO_ERROR; @@ -148,55 +136,45 @@ void SendAndVerifyTransferInit(nlTestSuite * inSuite, void * inContext, Transfer // Initializer responder to wait for transfer err = responder.WaitForTransfer(responderRole, responderControlOpts, responderMaxBlock, timeout); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - VerifyNoMoreOutput(inSuite, inContext, responder); + EXPECT_EQ(err, CHIP_NO_ERROR); + VerifyNoMoreOutput(responder); // Verify initiator outputs respective Init message (depending on role) after StartTransfer() err = initiator.StartTransfer(initiatorRole, initData, timeout); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); initiator.PollOutput(outEvent, kNoAdvanceTime); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kMsgToSend); - VerifyBdxMessageToSend(inSuite, inContext, outEvent, expectedInitMsg); - VerifyNoMoreOutput(inSuite, inContext, initiator); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kMsgToSend); + VerifyBdxMessageToSend(outEvent, expectedInitMsg); + VerifyNoMoreOutput(initiator); // Verify that all parsed TransferInit fields match what was sent by the initiator err = AttachHeaderAndSend(outEvent.msgTypeData, std::move(outEvent.MsgData), responder); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); responder.PollOutput(outEvent, kNoAdvanceTime); - VerifyNoMoreOutput(inSuite, inContext, responder); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kInitReceived); - NL_TEST_ASSERT(inSuite, outEvent.transferInitData.TransferCtlFlags == initData.TransferCtlFlags); - NL_TEST_ASSERT(inSuite, outEvent.transferInitData.MaxBlockSize == initData.MaxBlockSize); - NL_TEST_ASSERT(inSuite, outEvent.transferInitData.StartOffset == initData.StartOffset); - NL_TEST_ASSERT(inSuite, outEvent.transferInitData.Length == initData.Length); - NL_TEST_ASSERT(inSuite, outEvent.transferInitData.FileDesignator != nullptr); - NL_TEST_ASSERT(inSuite, outEvent.transferInitData.FileDesLength == initData.FileDesLength); + VerifyNoMoreOutput(responder); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kInitReceived); + EXPECT_EQ(outEvent.transferInitData.TransferCtlFlags, initData.TransferCtlFlags); + EXPECT_EQ(outEvent.transferInitData.MaxBlockSize, initData.MaxBlockSize); + EXPECT_EQ(outEvent.transferInitData.StartOffset, initData.StartOffset); + EXPECT_EQ(outEvent.transferInitData.Length, initData.Length); + EXPECT_NE(outEvent.transferInitData.FileDesignator, nullptr); + EXPECT_EQ(outEvent.transferInitData.FileDesLength, initData.FileDesLength); if (outEvent.EventType == TransferSession::OutputEventType::kInitReceived && outEvent.transferInitData.FileDesignator != nullptr) { - NL_TEST_ASSERT( - inSuite, - !memcmp(initData.FileDesignator, outEvent.transferInitData.FileDesignator, outEvent.transferInitData.FileDesLength)); + EXPECT_EQ( + 0, memcmp(initData.FileDesignator, outEvent.transferInitData.FileDesignator, outEvent.transferInitData.FileDesLength)); } if (outEvent.transferInitData.Metadata != nullptr) { - NL_TEST_ASSERT(inSuite, outEvent.transferInitData.MetadataLength == initData.MetadataLength); - if (outEvent.transferInitData.MetadataLength == initData.MetadataLength) + ASSERT_EQ(outEvent.transferInitData.MetadataLength, initData.MetadataLength); + // Even if initData.MetadataLength is 0, it is still technically undefined behaviour to call memcmp with a null + bool isNullAndLengthZero = initData.Metadata == nullptr && initData.MetadataLength == 0; + if (!isNullAndLengthZero) { - // Even if initData.MetadataLength is 0, it is still technically undefined behaviour to call memcmp with a null - bool isNullAndLengthZero = initData.Metadata == nullptr && initData.MetadataLength == 0; - if (!isNullAndLengthZero) - { - // Only check that metadata buffers match. The OutputEvent can still be inspected when this function returns to - // parse the metadata and verify that it matches. - NL_TEST_ASSERT( - inSuite, - !memcmp(initData.Metadata, outEvent.transferInitData.Metadata, outEvent.transferInitData.MetadataLength)); - } - } - else - { - NL_TEST_ASSERT(inSuite, false); // Metadata length mismatch + // Only check that metadata buffers match. The OutputEvent can still be inspected when this function returns to + // parse the metadata and verify that it matches. + EXPECT_EQ(0, memcmp(initData.Metadata, outEvent.transferInitData.Metadata, outEvent.transferInitData.MetadataLength)); } } } @@ -207,8 +185,7 @@ void SendAndVerifyTransferInit(nlTestSuite * inSuite, void * inContext, Transfer // receiver should emit a StatusCode event instead. // // The acceptSender is the node that is sending the Accept message (not necessarily the same node that will send Blocks). -void SendAndVerifyAcceptMsg(nlTestSuite * inSuite, void * inContext, TransferSession::OutputEvent & outEvent, - TransferSession & acceptSender, TransferRole acceptSenderRole, +void SendAndVerifyAcceptMsg(TransferSession::OutputEvent & outEvent, TransferSession & acceptSender, TransferRole acceptSenderRole, TransferSession::TransferAcceptData acceptData, TransferSession & acceptReceiver, TransferSession::TransferInitData initData) { @@ -218,90 +195,77 @@ void SendAndVerifyAcceptMsg(nlTestSuite * inSuite, void * inContext, TransferSes MessageType expectedMsg = (acceptSenderRole == TransferRole::kSender) ? MessageType::ReceiveAccept : MessageType::SendAccept; err = acceptSender.AcceptTransfer(acceptData); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Verify Sender emits ReceiveAccept message for sending acceptSender.PollOutput(outEvent, kNoAdvanceTime); - VerifyNoMoreOutput(inSuite, inContext, acceptSender); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kMsgToSend); - VerifyBdxMessageToSend(inSuite, inContext, outEvent, expectedMsg); + VerifyNoMoreOutput(acceptSender); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kMsgToSend); + VerifyBdxMessageToSend(outEvent, expectedMsg); // Pass Accept message to acceptReceiver err = AttachHeaderAndSend(outEvent.msgTypeData, std::move(outEvent.MsgData), acceptReceiver); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Verify received ReceiveAccept. // Client may want to inspect TransferControl, MaxBlockSize, StartOffset, Length, and Metadata, and may choose to reject the // Transfer at this point. acceptReceiver.PollOutput(outEvent, kNoAdvanceTime); - VerifyNoMoreOutput(inSuite, inContext, acceptReceiver); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kAcceptReceived); - NL_TEST_ASSERT(inSuite, outEvent.transferAcceptData.ControlMode == acceptData.ControlMode); - NL_TEST_ASSERT(inSuite, outEvent.transferAcceptData.MaxBlockSize == acceptData.MaxBlockSize); - NL_TEST_ASSERT(inSuite, outEvent.transferAcceptData.StartOffset == acceptData.StartOffset); - NL_TEST_ASSERT(inSuite, outEvent.transferAcceptData.Length == acceptData.Length); + VerifyNoMoreOutput(acceptReceiver); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kAcceptReceived); + EXPECT_EQ(outEvent.transferAcceptData.ControlMode, acceptData.ControlMode); + EXPECT_EQ(outEvent.transferAcceptData.MaxBlockSize, acceptData.MaxBlockSize); + EXPECT_EQ(outEvent.transferAcceptData.StartOffset, acceptData.StartOffset); + EXPECT_EQ(outEvent.transferAcceptData.Length, acceptData.Length); if (outEvent.transferAcceptData.Metadata != nullptr) { - NL_TEST_ASSERT(inSuite, outEvent.transferAcceptData.MetadataLength == acceptData.MetadataLength); - if (outEvent.transferAcceptData.MetadataLength == acceptData.MetadataLength) - { - // Even if acceptData.MetadataLength is 0, it is still technically undefined behaviour to call memcmp with a null - bool isNullAndLengthZero = acceptData.Metadata == nullptr && acceptData.MetadataLength == 0; - if (!isNullAndLengthZero) - { - // Only check that metadata buffers match. The OutputEvent can still be inspected when this function returns to - // parse the metadata and verify that it matches. - NL_TEST_ASSERT( - inSuite, - !memcmp(acceptData.Metadata, outEvent.transferAcceptData.Metadata, outEvent.transferAcceptData.MetadataLength)); - } - } - else + ASSERT_EQ(outEvent.transferAcceptData.MetadataLength, acceptData.MetadataLength); + // Even if acceptData.MetadataLength is 0, it is still technically undefined behaviour to call memcmp with a null + bool isNullAndLengthZero = acceptData.Metadata == nullptr && acceptData.MetadataLength == 0; + if (!isNullAndLengthZero) { - NL_TEST_ASSERT(inSuite, false); // Metadata length mismatch + // Only check that metadata buffers match. The OutputEvent can still be inspected when this function returns to + // parse the metadata and verify that it matches. + EXPECT_EQ( + 0, memcmp(acceptData.Metadata, outEvent.transferAcceptData.Metadata, outEvent.transferAcceptData.MetadataLength)); } } // Verify that MaxBlockSize was set appropriately - NL_TEST_ASSERT(inSuite, acceptReceiver.GetTransferBlockSize() <= initData.MaxBlockSize); + EXPECT_LE(acceptReceiver.GetTransferBlockSize(), initData.MaxBlockSize); } // Helper method for preparing a sending a BlockQuery message between two TransferSession objects. -void SendAndVerifyQuery(nlTestSuite * inSuite, void * inContext, TransferSession & queryReceiver, TransferSession & querySender, - TransferSession::OutputEvent & outEvent) +void SendAndVerifyQuery(TransferSession & queryReceiver, TransferSession & querySender, TransferSession::OutputEvent & outEvent) { // Verify that querySender emits BlockQuery message CHIP_ERROR err = querySender.PrepareBlockQuery(); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); querySender.PollOutput(outEvent, kNoAdvanceTime); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kMsgToSend); - VerifyBdxMessageToSend(inSuite, inContext, outEvent, MessageType::BlockQuery); - VerifyNoMoreOutput(inSuite, inContext, querySender); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kMsgToSend); + VerifyBdxMessageToSend(outEvent, MessageType::BlockQuery); + VerifyNoMoreOutput(querySender); // Pass BlockQuery to queryReceiver and verify queryReceiver emits QueryReceived event err = AttachHeaderAndSend(outEvent.msgTypeData, std::move(outEvent.MsgData), queryReceiver); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); queryReceiver.PollOutput(outEvent, kNoAdvanceTime); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kQueryReceived); - VerifyNoMoreOutput(inSuite, inContext, queryReceiver); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kQueryReceived); + VerifyNoMoreOutput(queryReceiver); } // Helper method for preparing a sending a Block message between two TransferSession objects. The sender refers to the node that is // sending Blocks. Uses a static counter incremented with each call. Also verifies that block data received matches what was sent. -void SendAndVerifyArbitraryBlock(nlTestSuite * inSuite, void * inContext, TransferSession & sender, TransferSession & receiver, - TransferSession::OutputEvent & outEvent, bool isEof, uint32_t inBlockCounter) +void SendAndVerifyArbitraryBlock(TransferSession & sender, TransferSession & receiver, TransferSession::OutputEvent & outEvent, + bool isEof, uint32_t inBlockCounter) { CHIP_ERROR err = CHIP_NO_ERROR; static uint8_t dataCount = 0; uint16_t maxBlockSize = sender.GetTransferBlockSize(); - NL_TEST_ASSERT(inSuite, maxBlockSize > 0); + EXPECT_GT(maxBlockSize, 0); System::PacketBufferHandle fakeDataBuf = System::PacketBufferHandle::New(maxBlockSize); - if (fakeDataBuf.IsNull()) - { - NL_TEST_ASSERT(inSuite, false); - return; - } + ASSERT_FALSE(fakeDataBuf.IsNull()); uint8_t * fakeBlockData = fakeDataBuf->Start(); fakeBlockData[0] = dataCount++; @@ -315,29 +279,29 @@ void SendAndVerifyArbitraryBlock(nlTestSuite * inSuite, void * inContext, Transf // Provide Block data and verify sender emits Block message err = sender.PrepareBlock(blockData); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); sender.PollOutput(outEvent, kNoAdvanceTime); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kMsgToSend); - VerifyBdxMessageToSend(inSuite, inContext, outEvent, expected); - VerifyNoMoreOutput(inSuite, inContext, sender); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kMsgToSend); + VerifyBdxMessageToSend(outEvent, expected); + VerifyNoMoreOutput(sender); // Pass Block message to receiver and verify matching Block is received err = AttachHeaderAndSend(outEvent.msgTypeData, std::move(outEvent.MsgData), receiver); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); receiver.PollOutput(outEvent, kNoAdvanceTime); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kBlockReceived); - NL_TEST_ASSERT(inSuite, outEvent.blockdata.Data != nullptr); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kBlockReceived); + EXPECT_NE(outEvent.blockdata.Data, nullptr); if (outEvent.EventType == TransferSession::OutputEventType::kBlockReceived && outEvent.blockdata.Data != nullptr) { - NL_TEST_ASSERT(inSuite, !memcmp(fakeBlockData, outEvent.blockdata.Data, outEvent.blockdata.Length)); - NL_TEST_ASSERT(inSuite, outEvent.blockdata.BlockCounter == inBlockCounter); + EXPECT_EQ(0, memcmp(fakeBlockData, outEvent.blockdata.Data, outEvent.blockdata.Length)); + EXPECT_EQ(outEvent.blockdata.BlockCounter, inBlockCounter); } - VerifyNoMoreOutput(inSuite, inContext, receiver); + VerifyNoMoreOutput(receiver); } // Helper method for sending a BlockAck or BlockAckEOF, depending on the state of the receiver. -void SendAndVerifyBlockAck(nlTestSuite * inSuite, void * inContext, TransferSession & ackReceiver, TransferSession & ackSender, - TransferSession::OutputEvent & outEvent, bool expectEOF) +void SendAndVerifyBlockAck(TransferSession & ackReceiver, TransferSession & ackSender, TransferSession::OutputEvent & outEvent, + bool expectEOF) { TransferSession::OutputEventType expectedEventType = expectEOF ? TransferSession::OutputEventType::kAckEOFReceived : TransferSession::OutputEventType::kAckReceived; @@ -345,22 +309,29 @@ void SendAndVerifyBlockAck(nlTestSuite * inSuite, void * inContext, TransferSess // Verify PrepareBlockAck() outputs message to send CHIP_ERROR err = ackSender.PrepareBlockAck(); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); ackSender.PollOutput(outEvent, kNoAdvanceTime); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kMsgToSend); - VerifyBdxMessageToSend(inSuite, inContext, outEvent, expectedMsgType); - VerifyNoMoreOutput(inSuite, inContext, ackSender); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kMsgToSend); + VerifyBdxMessageToSend(outEvent, expectedMsgType); + VerifyNoMoreOutput(ackSender); // Pass BlockAck to ackReceiver and verify it was received err = AttachHeaderAndSend(outEvent.msgTypeData, std::move(outEvent.MsgData), ackReceiver); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); ackReceiver.PollOutput(outEvent, kNoAdvanceTime); - NL_TEST_ASSERT(inSuite, outEvent.EventType == expectedEventType); - VerifyNoMoreOutput(inSuite, inContext, ackReceiver); + EXPECT_EQ(outEvent.EventType, expectedEventType); + VerifyNoMoreOutput(ackReceiver); } +struct TestBdxTransferSession : public ::testing::Test +{ + static void SetUpTestSuite() { EXPECT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + // Test a full transfer using a responding receiver and an initiating sender, receiver drive. -void TestInitiatingReceiverReceiverDrive(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBdxTransferSession, TestInitiatingReceiverReceiverDrive) { CHIP_ERROR err = CHIP_NO_ERROR; TransferSession::OutputEvent outEvent; @@ -391,15 +362,15 @@ void TestInitiatingReceiverReceiverDrive(nlTestSuite * inSuite, void * inContext BitFlags<TransferControlFlags> senderOpts; senderOpts.Set(driveMode); - SendAndVerifyTransferInit(inSuite, inContext, outEvent, timeout, initiatingReceiver, TransferRole::kReceiver, initOptions, - respondingSender, senderOpts, proposedBlockSize); + SendAndVerifyTransferInit(outEvent, timeout, initiatingReceiver, TransferRole::kReceiver, initOptions, respondingSender, + senderOpts, proposedBlockSize); // Test metadata for Accept message uint8_t tlvBuf[64] = { 0 }; char metadataStr[11] = { "hi_dad.txt" }; uint32_t bytesWritten = 0; err = WriteTLVString(tlvBuf, sizeof(tlvBuf), metadataStr, bytesWritten); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); uint16_t metadataSize = static_cast<uint16_t>(bytesWritten & 0x0000FFFF); // Compose ReceiveAccept parameters struct and give to respondingSender @@ -411,60 +382,55 @@ void TestInitiatingReceiverReceiverDrive(nlTestSuite * inSuite, void * inContext acceptData.Metadata = tlvBuf; acceptData.MetadataLength = metadataSize; - SendAndVerifyAcceptMsg(inSuite, inContext, outEvent, respondingSender, TransferRole::kSender, acceptData, initiatingReceiver, - initOptions); + SendAndVerifyAcceptMsg(outEvent, respondingSender, TransferRole::kSender, acceptData, initiatingReceiver, initOptions); // Verify that MaxBlockSize was chosen correctly - NL_TEST_ASSERT(inSuite, respondingSender.GetTransferBlockSize() == testSmallerBlockSize); - NL_TEST_ASSERT(inSuite, respondingSender.GetTransferBlockSize() == initiatingReceiver.GetTransferBlockSize()); + EXPECT_EQ(respondingSender.GetTransferBlockSize(), testSmallerBlockSize); + EXPECT_EQ(respondingSender.GetTransferBlockSize(), initiatingReceiver.GetTransferBlockSize()); // Verify parsed TLV metadata matches the original - err = ReadAndVerifyTLVString(inSuite, inContext, outEvent.transferAcceptData.Metadata, + err = ReadAndVerifyTLVString(outEvent.transferAcceptData.Metadata, static_cast<uint32_t>(outEvent.transferAcceptData.MetadataLength), metadataStr, static_cast<uint16_t>(strlen(metadataStr))); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Test BlockQuery -> Block -> BlockAck - SendAndVerifyQuery(inSuite, inContext, respondingSender, initiatingReceiver, outEvent); - SendAndVerifyArbitraryBlock(inSuite, inContext, respondingSender, initiatingReceiver, outEvent, false, numBlocksSent); + SendAndVerifyQuery(respondingSender, initiatingReceiver, outEvent); + SendAndVerifyArbitraryBlock(respondingSender, initiatingReceiver, outEvent, false, numBlocksSent); numBlocksSent++; // Test only one block can be prepared at a time, without receiving a response to the first System::PacketBufferHandle fakeBuf = System::PacketBufferHandle::New(testSmallerBlockSize); TransferSession::BlockData prematureBlock; - if (fakeBuf.IsNull()) - { - NL_TEST_ASSERT(inSuite, false); - return; - } + ASSERT_FALSE(fakeBuf.IsNull()); prematureBlock.Data = fakeBuf->Start(); prematureBlock.Length = testSmallerBlockSize; prematureBlock.IsEof = false; err = respondingSender.PrepareBlock(prematureBlock); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); - VerifyNoMoreOutput(inSuite, inContext, respondingSender); + EXPECT_NE(err, CHIP_NO_ERROR); + VerifyNoMoreOutput(respondingSender); // Test Ack -> Query -> Block - SendAndVerifyBlockAck(inSuite, inContext, respondingSender, initiatingReceiver, outEvent, false); + SendAndVerifyBlockAck(respondingSender, initiatingReceiver, outEvent, false); // Test multiple Blocks sent and received (last Block is BlockEOF) while (numBlocksSent < numBlockSends) { bool isEof = (numBlocksSent == numBlockSends - 1); - SendAndVerifyQuery(inSuite, inContext, respondingSender, initiatingReceiver, outEvent); - SendAndVerifyArbitraryBlock(inSuite, inContext, respondingSender, initiatingReceiver, outEvent, isEof, numBlocksSent); + SendAndVerifyQuery(respondingSender, initiatingReceiver, outEvent); + SendAndVerifyArbitraryBlock(respondingSender, initiatingReceiver, outEvent, isEof, numBlocksSent); numBlocksSent++; } // Verify last block was BlockEOF, then verify response BlockAckEOF message - NL_TEST_ASSERT(inSuite, outEvent.blockdata.IsEof == true); - SendAndVerifyBlockAck(inSuite, inContext, respondingSender, initiatingReceiver, outEvent, true); + EXPECT_TRUE(outEvent.blockdata.IsEof); + SendAndVerifyBlockAck(respondingSender, initiatingReceiver, outEvent, true); } // Partial transfer test using Sender Drive to specifically test Block -> BlockAck -> Block sequence -void TestInitiatingSenderSenderDrive(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBdxTransferSession, TestInitiatingSenderSenderDrive) { CHIP_ERROR err = CHIP_NO_ERROR; TransferSession::OutputEvent outEvent; @@ -486,7 +452,7 @@ void TestInitiatingSenderSenderDrive(nlTestSuite * inSuite, void * inContext) char metadataStr[11] = { "hi_dad.txt" }; uint32_t bytesWritten = 0; err = WriteTLVString(tlvBuf, sizeof(tlvBuf), metadataStr, bytesWritten); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); uint16_t metadataSize = static_cast<uint16_t>(bytesWritten & 0x0000FFFF); // Initialize struct with TransferInit parameters @@ -499,14 +465,14 @@ void TestInitiatingSenderSenderDrive(nlTestSuite * inSuite, void * inContext) initOptions.Metadata = tlvBuf; initOptions.MetadataLength = metadataSize; - SendAndVerifyTransferInit(inSuite, inContext, outEvent, timeout, initiatingSender, TransferRole::kSender, initOptions, - respondingReceiver, receiverOpts, transferBlockSize); + SendAndVerifyTransferInit(outEvent, timeout, initiatingSender, TransferRole::kSender, initOptions, respondingReceiver, + receiverOpts, transferBlockSize); // Verify parsed TLV metadata matches the original - err = ReadAndVerifyTLVString(inSuite, inContext, outEvent.transferInitData.Metadata, - static_cast<uint32_t>(outEvent.transferInitData.MetadataLength), metadataStr, - static_cast<uint16_t>(strlen(metadataStr))); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + err = + ReadAndVerifyTLVString(outEvent.transferInitData.Metadata, static_cast<uint32_t>(outEvent.transferInitData.MetadataLength), + metadataStr, static_cast<uint16_t>(strlen(metadataStr))); + EXPECT_EQ(err, CHIP_NO_ERROR); // Compose SendAccept parameters struct and give to respondingSender uint16_t proposedBlockSize = transferBlockSize; @@ -518,24 +484,23 @@ void TestInitiatingSenderSenderDrive(nlTestSuite * inSuite, void * inContext) acceptData.Metadata = nullptr; acceptData.MetadataLength = 0; - SendAndVerifyAcceptMsg(inSuite, inContext, outEvent, respondingReceiver, TransferRole::kReceiver, acceptData, initiatingSender, - initOptions); + SendAndVerifyAcceptMsg(outEvent, respondingReceiver, TransferRole::kReceiver, acceptData, initiatingSender, initOptions); uint32_t numBlocksSent = 0; // Test multiple Block -> BlockAck -> Block for (int i = 0; i < 3; i++) { - SendAndVerifyArbitraryBlock(inSuite, inContext, initiatingSender, respondingReceiver, outEvent, false, numBlocksSent); - SendAndVerifyBlockAck(inSuite, inContext, initiatingSender, respondingReceiver, outEvent, false); + SendAndVerifyArbitraryBlock(initiatingSender, respondingReceiver, outEvent, false, numBlocksSent); + SendAndVerifyBlockAck(initiatingSender, respondingReceiver, outEvent, false); numBlocksSent++; } - SendAndVerifyArbitraryBlock(inSuite, inContext, initiatingSender, respondingReceiver, outEvent, true, numBlocksSent); - SendAndVerifyBlockAck(inSuite, inContext, initiatingSender, respondingReceiver, outEvent, true); + SendAndVerifyArbitraryBlock(initiatingSender, respondingReceiver, outEvent, true, numBlocksSent); + SendAndVerifyBlockAck(initiatingSender, respondingReceiver, outEvent, true); } // Test that calls to AcceptTransfer() with bad parameters result in an error. -void TestBadAcceptMessageFields(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBdxTransferSession, TestBadAcceptMessageFields) { CHIP_ERROR err = CHIP_NO_ERROR; TransferSession::OutputEvent outEvent; @@ -564,8 +529,8 @@ void TestBadAcceptMessageFields(nlTestSuite * inSuite, void * inContext) BitFlags<TransferControlFlags> responderControl; responderControl.Set(driveMode); - SendAndVerifyTransferInit(inSuite, inContext, outEvent, timeout, initiatingReceiver, TransferRole::kReceiver, initOptions, - respondingSender, responderControl, maxBlockSize); + SendAndVerifyTransferInit(outEvent, timeout, initiatingReceiver, TransferRole::kReceiver, initOptions, respondingSender, + responderControl, maxBlockSize); // Verify AcceptTransfer() returns error for choosing larger max block size TransferSession::TransferAcceptData acceptData; @@ -574,7 +539,7 @@ void TestBadAcceptMessageFields(nlTestSuite * inSuite, void * inContext) acceptData.StartOffset = commonOffset; acceptData.Length = commonLength; err = respondingSender.AcceptTransfer(acceptData); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); // Verify AcceptTransfer() returns error for choosing unsupported transfer control mode TransferSession::TransferAcceptData acceptData2; @@ -584,11 +549,11 @@ void TestBadAcceptMessageFields(nlTestSuite * inSuite, void * inContext) acceptData2.StartOffset = commonOffset; acceptData2.Length = commonLength; err = respondingSender.AcceptTransfer(acceptData2); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); } // Test that a TransferSession will emit kTransferTimeout if the specified timeout is exceeded while waiting for a response. -void TestTimeout(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBdxTransferSession, TestTimeout) { CHIP_ERROR err = CHIP_NO_ERROR; TransferSession initiator; @@ -614,22 +579,22 @@ void TestTimeout(nlTestSuite * inSuite, void * inContext) // Verify initiator outputs respective Init message (depending on role) after StartTransfer() err = initiator.StartTransfer(role, initOptions, timeout); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // First PollOutput() should output the TransferInit message initiator.PollOutput(outEvent, startTime); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kMsgToSend); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kMsgToSend); MessageType expectedInitMsg = (role == TransferRole::kSender) ? MessageType::SendInit : MessageType::ReceiveInit; - VerifyBdxMessageToSend(inSuite, inContext, outEvent, expectedInitMsg); + VerifyBdxMessageToSend(outEvent, expectedInitMsg); // Second PollOutput() with no call to HandleMessageReceived() should result in a timeout. initiator.PollOutput(outEvent, endTime); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kTransferTimeout); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kTransferTimeout); } // Test that sending the same block twice (with same block counter) results in a StatusReport message with BadBlockCounter. Also // test that receiving the StatusReport ends the transfer on the other node. -void TestDuplicateBlockError(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBdxTransferSession, TestDuplicateBlockError) { CHIP_ERROR err = CHIP_NO_ERROR; TransferSession::OutputEvent outEvent; @@ -661,8 +626,8 @@ void TestDuplicateBlockError(nlTestSuite * inSuite, void * inContext) BitFlags<TransferControlFlags> senderOpts; senderOpts.Set(driveMode); - SendAndVerifyTransferInit(inSuite, inContext, outEvent, timeout, initiatingReceiver, TransferRole::kReceiver, initOptions, - respondingSender, senderOpts, blockSize); + SendAndVerifyTransferInit(outEvent, timeout, initiatingReceiver, TransferRole::kReceiver, initOptions, respondingSender, + senderOpts, blockSize); // Compose ReceiveAccept parameters struct and give to respondingSender TransferSession::TransferAcceptData acceptData; @@ -673,10 +638,9 @@ void TestDuplicateBlockError(nlTestSuite * inSuite, void * inContext) acceptData.Metadata = nullptr; acceptData.MetadataLength = 0; - SendAndVerifyAcceptMsg(inSuite, inContext, outEvent, respondingSender, TransferRole::kSender, acceptData, initiatingReceiver, - initOptions); + SendAndVerifyAcceptMsg(outEvent, respondingSender, TransferRole::kSender, acceptData, initiatingReceiver, initOptions); - SendAndVerifyQuery(inSuite, inContext, respondingSender, initiatingReceiver, outEvent); + SendAndVerifyQuery(respondingSender, initiatingReceiver, outEvent); TransferSession::BlockData blockData; blockData.Data = fakeData; @@ -685,106 +649,52 @@ void TestDuplicateBlockError(nlTestSuite * inSuite, void * inContext) // Provide Block data and verify sender emits Block message err = respondingSender.PrepareBlock(blockData); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); respondingSender.PollOutput(eventWithBlock, kNoAdvanceTime); - NL_TEST_ASSERT(inSuite, eventWithBlock.EventType == TransferSession::OutputEventType::kMsgToSend); - VerifyBdxMessageToSend(inSuite, inContext, eventWithBlock, MessageType::Block); - VerifyNoMoreOutput(inSuite, inContext, respondingSender); + EXPECT_EQ(eventWithBlock.EventType, TransferSession::OutputEventType::kMsgToSend); + VerifyBdxMessageToSend(eventWithBlock, MessageType::Block); + VerifyNoMoreOutput(respondingSender); System::PacketBufferHandle blockCopy = System::PacketBufferHandle::NewWithData(eventWithBlock.MsgData->Start(), eventWithBlock.MsgData->DataLength()); // Pass Block message to receiver and verify matching Block is received err = AttachHeaderAndSend(eventWithBlock.msgTypeData, std::move(eventWithBlock.MsgData), initiatingReceiver); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); initiatingReceiver.PollOutput(outEvent, kNoAdvanceTime); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kBlockReceived); - NL_TEST_ASSERT(inSuite, outEvent.blockdata.Data != nullptr); - VerifyNoMoreOutput(inSuite, inContext, initiatingReceiver); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kBlockReceived); + EXPECT_NE(outEvent.blockdata.Data, nullptr); + VerifyNoMoreOutput(initiatingReceiver); - SendAndVerifyQuery(inSuite, inContext, respondingSender, initiatingReceiver, outEvent); + SendAndVerifyQuery(respondingSender, initiatingReceiver, outEvent); // Verify receiving same Block twice fails and results in StatusReport event, and then InternalError event err = AttachHeaderAndSend(eventWithBlock.msgTypeData, std::move(blockCopy), initiatingReceiver); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); initiatingReceiver.PollOutput(outEvent, kNoAdvanceTime); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kMsgToSend); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kMsgToSend); System::PacketBufferHandle statusReportMsg = outEvent.MsgData.Retain(); TransferSession::MessageTypeData statusReportMsgTypeData = outEvent.msgTypeData; - VerifyStatusReport(inSuite, inContext, std::move(outEvent.MsgData), StatusCode::kBadBlockCounter); + VerifyStatusReport(std::move(outEvent.MsgData), StatusCode::kBadBlockCounter); // All subsequent PollOutput() calls should return kInternalError for (int i = 0; i < 5; ++i) { initiatingReceiver.PollOutput(outEvent, kNoAdvanceTime); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kInternalError); - NL_TEST_ASSERT(inSuite, outEvent.statusData.statusCode == StatusCode::kBadBlockCounter); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kInternalError); + EXPECT_EQ(outEvent.statusData.statusCode, StatusCode::kBadBlockCounter); } err = AttachHeaderAndSend(statusReportMsgTypeData, std::move(statusReportMsg), respondingSender); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); respondingSender.PollOutput(outEvent, kNoAdvanceTime); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kStatusReceived); - NL_TEST_ASSERT(inSuite, outEvent.statusData.statusCode == StatusCode::kBadBlockCounter); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kStatusReceived); + EXPECT_EQ(outEvent.statusData.statusCode, StatusCode::kBadBlockCounter); // All subsequent PollOutput() calls should return kInternalError for (int i = 0; i < 5; ++i) { respondingSender.PollOutput(outEvent, kNoAdvanceTime); - NL_TEST_ASSERT(inSuite, outEvent.EventType == TransferSession::OutputEventType::kInternalError); - NL_TEST_ASSERT(inSuite, outEvent.statusData.statusCode == StatusCode::kBadBlockCounter); + EXPECT_EQ(outEvent.EventType, TransferSession::OutputEventType::kInternalError); + EXPECT_EQ(outEvent.statusData.statusCode, StatusCode::kBadBlockCounter); } } - -// Test Suite - -/** - * Test Suite that lists all the test functions. - */ -// clang-format off -static const nlTest sTests[] = -{ - NL_TEST_DEF("TestInitiatingReceiverReceiverDrive", TestInitiatingReceiverReceiverDrive), - NL_TEST_DEF("TestInitiatingSenderSenderDrive", TestInitiatingSenderSenderDrive), - NL_TEST_DEF("TestBadAcceptMessageFields", TestBadAcceptMessageFields), - NL_TEST_DEF("TestTimeout", TestTimeout), - NL_TEST_DEF("TestDuplicateBlockError", TestDuplicateBlockError), - NL_TEST_SENTINEL() -}; -// clang-format on - -int TestBdxTransferSession_Setup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - if (error != CHIP_NO_ERROR) - return FAILURE; - return SUCCESS; -} - -int TestBdxTransferSession_Teardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - -// clang-format off -static nlTestSuite sSuite = -{ - "Test-CHIP-TransferSession", - &sTests[0], - TestBdxTransferSession_Setup, - TestBdxTransferSession_Teardown -}; -// clang-format on - -/** - * Main - */ -int TestBdxTransferSession() -{ - // Run test suit against one context - nlTestRunner(&sSuite, nullptr); - - return (nlTestRunnerStats(&sSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestBdxTransferSession) diff --git a/src/protocols/bdx/tests/TestBdxUri.cpp b/src/protocols/bdx/tests/TestBdxUri.cpp index 8641ee1d4524a6..e94b88ec0d9f21 100644 --- a/src/protocols/bdx/tests/TestBdxUri.cpp +++ b/src/protocols/bdx/tests/TestBdxUri.cpp @@ -15,11 +15,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include <lib/support/UnitTestRegistration.h> #include <protocols/bdx/BdxUri.h> #include <cstring> -#include <nlunit-test.h> +#include <gtest/gtest.h> using namespace ::chip; @@ -30,7 +29,7 @@ CharSpan ToSpan(const char * str) return CharSpan::fromCharString(str); } -void TestParseURI(nlTestSuite * inSuite, void * inContext) +TEST(TestBdxUri, TestParseURI) { NodeId nodeId; CharSpan file; @@ -38,75 +37,55 @@ void TestParseURI(nlTestSuite * inSuite, void * inContext) const auto parse = [&](const char * uri) { return bdx::ParseURI(ToSpan(uri), nodeId, file); }; // Happy path - NL_TEST_ASSERT(inSuite, parse("bdx://1234567890ABCDEF/file_name") == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, nodeId == 0x1234567890ABCDEFULL); - NL_TEST_ASSERT(inSuite, file.data_equal(ToSpan("file_name"))); + EXPECT_EQ(parse("bdx://1234567890ABCDEF/file_name"), CHIP_NO_ERROR); + EXPECT_EQ(nodeId, 0x1234567890ABCDEFULL); + EXPECT_TRUE(file.data_equal(ToSpan("file_name"))); // File designator may contain slashes - NL_TEST_ASSERT(inSuite, parse("bdx://1234567890ABCDEF/file/na/me") == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, nodeId == 0x1234567890ABCDEFULL); - NL_TEST_ASSERT(inSuite, file.data_equal(ToSpan("file/na/me"))); + EXPECT_EQ(parse("bdx://1234567890ABCDEF/file/na/me"), CHIP_NO_ERROR); + EXPECT_EQ(nodeId, 0x1234567890ABCDEFULL); + EXPECT_TRUE(file.data_equal(ToSpan("file/na/me"))); // Wrong scheme - NL_TEST_ASSERT(inSuite, parse("bdy://1234567890ABCDEF/file_name") == CHIP_ERROR_INVALID_SCHEME_PREFIX); + EXPECT_EQ(parse("bdy://1234567890ABCDEF/file_name"), CHIP_ERROR_INVALID_SCHEME_PREFIX); // Node ID contains non-hex digit - NL_TEST_ASSERT(inSuite, parse("bdx://1234567890ABCDEG/file_name") == CHIP_ERROR_INVALID_DESTINATION_NODE_ID); + EXPECT_EQ(parse("bdx://1234567890ABCDEG/file_name"), CHIP_ERROR_INVALID_DESTINATION_NODE_ID); // Node ID too short - NL_TEST_ASSERT(inSuite, parse("bdx://1234567890ABCDE/file_name") == CHIP_ERROR_INVALID_DESTINATION_NODE_ID); + EXPECT_EQ(parse("bdx://1234567890ABCDE/file_name"), CHIP_ERROR_INVALID_DESTINATION_NODE_ID); // Node ID too long - NL_TEST_ASSERT(inSuite, parse("bdx://1234567890ABCDEFEF/file_name") == CHIP_ERROR_MISSING_URI_SEPARATOR); + EXPECT_EQ(parse("bdx://1234567890ABCDEFEF/file_name"), CHIP_ERROR_MISSING_URI_SEPARATOR); // Node ID to non-operational - NL_TEST_ASSERT(inSuite, parse("bdx://FFFFFFFFFFFFFFFF/file_name") == CHIP_ERROR_INVALID_DESTINATION_NODE_ID); + EXPECT_EQ(parse("bdx://FFFFFFFFFFFFFFFF/file_name"), CHIP_ERROR_INVALID_DESTINATION_NODE_ID); // No file designator - NL_TEST_ASSERT(inSuite, parse("bdx://1234567890ABCDEF/") == CHIP_ERROR_INVALID_STRING_LENGTH); + EXPECT_EQ(parse("bdx://1234567890ABCDEF/"), CHIP_ERROR_INVALID_STRING_LENGTH); } -void TestMakeURI(nlTestSuite * inSuite, void * inContext) +TEST(TestBdxUri, TestMakeURI) { char uriBuffer[128]; MutableCharSpan uri(uriBuffer); // Happy path - NL_TEST_ASSERT(inSuite, bdx::MakeURI(0xFEDCBA0987654321ULL, ToSpan("file_name"), uri) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, uri.data_equal(ToSpan("bdx://FEDCBA0987654321/file_name"))); + EXPECT_EQ(bdx::MakeURI(0xFEDCBA0987654321ULL, ToSpan("file_name"), uri), CHIP_NO_ERROR); + EXPECT_TRUE(uri.data_equal(ToSpan("bdx://FEDCBA0987654321/file_name"))); // File designator with slashes uri = MutableCharSpan(uriBuffer); - NL_TEST_ASSERT(inSuite, bdx::MakeURI(0xFEDCBA0987654321ULL, ToSpan("file/na/me"), uri) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, uri.data_equal(ToSpan("bdx://FEDCBA0987654321/file/na/me"))); + EXPECT_EQ(bdx::MakeURI(0xFEDCBA0987654321ULL, ToSpan("file/na/me"), uri), CHIP_NO_ERROR); + EXPECT_TRUE(uri.data_equal(ToSpan("bdx://FEDCBA0987654321/file/na/me"))); // Empty file designator uri = MutableCharSpan(uriBuffer); - NL_TEST_ASSERT(inSuite, bdx::MakeURI(0xFEDCBA0987654321ULL, CharSpan(), uri) != CHIP_NO_ERROR); + EXPECT_NE(bdx::MakeURI(0xFEDCBA0987654321ULL, CharSpan(), uri), CHIP_NO_ERROR); // Too small buffer uri = MutableCharSpan(uriBuffer, 31); - NL_TEST_ASSERT(inSuite, bdx::MakeURI(0xFEDCBA0987654321ULL, CharSpan(), uri) != CHIP_NO_ERROR); + EXPECT_NE(bdx::MakeURI(0xFEDCBA0987654321ULL, CharSpan(), uri), CHIP_NO_ERROR); } -// clang-format off -const nlTest sTests[] = -{ - NL_TEST_DEF("TestParseURI", TestParseURI), - NL_TEST_DEF("TestMakeURI", TestMakeURI), - NL_TEST_SENTINEL() -}; -// clang-format on - -nlTestSuite sSuite = { "Test BDX URI", &sTests[0], nullptr, nullptr }; } // namespace - -int TestBdxUri() -{ - // Run test suit against one context - nlTestRunner(&sSuite, nullptr); - - return (nlTestRunnerStats(&sSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestBdxUri) diff --git a/src/test_driver/openiotsdk/unit-tests/test_components.txt b/src/test_driver/openiotsdk/unit-tests/test_components.txt index 0471f70b7a1a55..c874d341b2d58c 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components.txt @@ -1,6 +1,7 @@ accesstest SystemLayerTests ASN1Tests +BDXTests MinimalMdnsCoreTests ChipCryptoTests MinimalMdnsRecordsTests 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 d9801e9f9cd305..2d1633c33228e7 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,4 @@ AppTests -BDXTests DataModelTests InetLayerTests MessagingLayerTests @@ -9,4 +8,4 @@ SecureChannelTests SetupPayloadTestsNL SupportTestsNL TransportLayerTests -UserDirectedCommissioningTests +UserDirectedCommissioningTests \ No newline at end of file From f27b978f668c2c2c0f2cdf397c2d8b91deb310e7 Mon Sep 17 00:00:00 2001 From: feasel <120589145+feasel0@users.noreply.github.com> Date: Thu, 25 Apr 2024 09:45:16 -0400 Subject: [PATCH 036/124] Updated unit tests in src/transport/retransmit/tests/ to use PW instead of NL. (#33157) * Updated unit tests in src/transport/tests/ to use PW instead of NL. * Restyle --------- Co-authored-by: Andrei Litvin <andy314@gmail.com> --- .../openiotsdk/unit-tests/test_components.txt | 1 + .../unit-tests/test_components_nl.txt | 1 - src/transport/retransmit/tests/BUILD.gn | 10 +- src/transport/retransmit/tests/TestCache.cpp | 195 ++++++++---------- 4 files changed, 88 insertions(+), 119 deletions(-) diff --git a/src/test_driver/openiotsdk/unit-tests/test_components.txt b/src/test_driver/openiotsdk/unit-tests/test_components.txt index c874d341b2d58c..4a61ab84fd3a60 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components.txt @@ -10,6 +10,7 @@ CoreTests MdnsTests CredentialsTest PlatformTests +RetransmitTests TestShell SetupPayloadTests SupportTests 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 2d1633c33228e7..64f1862acfdf6a 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt @@ -3,7 +3,6 @@ DataModelTests InetLayerTests MessagingLayerTests RawTransportTests -RetransmitTests SecureChannelTests SetupPayloadTestsNL SupportTestsNL diff --git a/src/transport/retransmit/tests/BUILD.gn b/src/transport/retransmit/tests/BUILD.gn index a3e2333b4d6b7d..cd762b2c755571 100644 --- a/src/transport/retransmit/tests/BUILD.gn +++ b/src/transport/retransmit/tests/BUILD.gn @@ -14,20 +14,16 @@ 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") -chip_test_suite_using_nltest("tests") { +chip_test_suite("tests") { output_name = "libRetransmitTests" cflags = [ "-Wconversion" ] test_sources = [ "TestCache.cpp" ] - public_deps = [ - "${chip_root}/src/lib/support:testing_nlunit", - "${chip_root}/src/transport/retransmit", - "${nlunit_test_root}:nlunit-test", - ] + public_deps = [ "${chip_root}/src/transport/retransmit" ] } diff --git a/src/transport/retransmit/tests/TestCache.cpp b/src/transport/retransmit/tests/TestCache.cpp index fefdbca67250ec..6142f4910dbf44 100644 --- a/src/transport/retransmit/tests/TestCache.cpp +++ b/src/transport/retransmit/tests/TestCache.cpp @@ -14,11 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include <lib/support/UnitTestRegistration.h> #include <transport/retransmit/Cache.h> #include <bitset> -#include <nlunit-test.h> +#include <gtest/gtest.h> // Helpers for simple payload management namespace { @@ -45,18 +44,16 @@ class TestableCache : public chip::Retransmit::Cache<KeyType, PayloadType, N> class IntPayloadTracker { public: - void Init(nlTestSuite * suite) { mSuite = suite; } - void Acquire(int value) { - NL_TEST_ASSERT(mSuite, (value > 0) && value < kMaxPayloadValue); + EXPECT_TRUE((value > 0) && value < kMaxPayloadValue); mAcquired.set(static_cast<size_t>(value)); } void Release(int value) { - NL_TEST_ASSERT(mSuite, (value > 0) && value < kMaxPayloadValue); - NL_TEST_ASSERT(mSuite, mAcquired.test(static_cast<size_t>(value))); + EXPECT_TRUE((value > 0) && value < kMaxPayloadValue); + EXPECT_TRUE(mAcquired.test(static_cast<size_t>(value))); mAcquired.reset(static_cast<size_t>(value)); } @@ -65,7 +62,6 @@ class IntPayloadTracker bool IsAcquired(int value) const { return mAcquired.test(static_cast<size_t>(value)); } private: - nlTestSuite * mSuite; std::bitset<kMaxPayloadValue> mAcquired; }; @@ -104,176 +100,153 @@ void chip::Retransmit::Lifetime<int>::Release(int & value) namespace { -void TestNoOp(nlTestSuite * inSuite, void * inContext) +TEST(TestCache, TestNoOp) { // unused address cache should not do any Acquire/release at any time - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 0); + EXPECT_EQ(gPayloadTracker.Count(), 0u); { TestableCache<int, int, 20> test; - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 0); + EXPECT_EQ(gPayloadTracker.Count(), 0u); } - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 0); + EXPECT_EQ(gPayloadTracker.Count(), 0u); } -void TestDestructorFree(nlTestSuite * inSuite, void * inContext) +TEST(TestCache, TestDestructorFree) { { TestableCache<int, int, 20> test; - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 0); + EXPECT_EQ(gPayloadTracker.Count(), 0u); - NL_TEST_ASSERT(inSuite, test.AddValue(1, 1) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test.AddValue(2, 2) == CHIP_NO_ERROR); + EXPECT_EQ(test.AddValue(1, 1), CHIP_NO_ERROR); + EXPECT_EQ(test.AddValue(2, 2), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 2); + EXPECT_EQ(gPayloadTracker.Count(), 2u); } // destructor should release the items - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 0); + EXPECT_EQ(gPayloadTracker.Count(), 0u); } -void OutOfSpace(nlTestSuite * inSuite, void * inContext) +TEST(TestCache, OutOfSpace) { { TestableCache<int, int, 4> test; - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 0); + EXPECT_EQ(gPayloadTracker.Count(), 0u); - NL_TEST_ASSERT(inSuite, test.AddValue(1, 1) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test.AddValue(2, 2) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test.AddValue(3, 4) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test.AddValue(4, 6) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 4); + EXPECT_EQ(test.AddValue(1, 1), CHIP_NO_ERROR); + EXPECT_EQ(test.AddValue(2, 2), CHIP_NO_ERROR); + EXPECT_EQ(test.AddValue(3, 4), CHIP_NO_ERROR); + EXPECT_EQ(test.AddValue(4, 6), CHIP_NO_ERROR); + EXPECT_EQ(gPayloadTracker.Count(), 4u); - NL_TEST_ASSERT(inSuite, test.AddValue(5, 8) == CHIP_ERROR_NO_MEMORY); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 4); + EXPECT_EQ(test.AddValue(5, 8), CHIP_ERROR_NO_MEMORY); + EXPECT_EQ(gPayloadTracker.Count(), 4u); - NL_TEST_ASSERT(inSuite, test.AddValue(6, 10) == CHIP_ERROR_NO_MEMORY); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 4); + EXPECT_EQ(test.AddValue(6, 10), CHIP_ERROR_NO_MEMORY); + EXPECT_EQ(gPayloadTracker.Count(), 4u); } - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 0); + EXPECT_EQ(gPayloadTracker.Count(), 0u); } -void AddRemove(nlTestSuite * inSuite, void * inContext) +TEST(TestCache, AddRemove) { TestableCache<int, int, 3> test; - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 0); + EXPECT_EQ(gPayloadTracker.Count(), 0u); - NL_TEST_ASSERT(inSuite, test.AddValue(1, 1) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test.AddValue(2, 2) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test.AddValue(3, 4) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 3); + EXPECT_EQ(test.AddValue(1, 1), CHIP_NO_ERROR); + EXPECT_EQ(test.AddValue(2, 2), CHIP_NO_ERROR); + EXPECT_EQ(test.AddValue(3, 4), CHIP_NO_ERROR); + EXPECT_EQ(gPayloadTracker.Count(), 3u); - NL_TEST_ASSERT(inSuite, test.AddValue(10, 8) == CHIP_ERROR_NO_MEMORY); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 3); + EXPECT_EQ(test.AddValue(10, 8), CHIP_ERROR_NO_MEMORY); + EXPECT_EQ(gPayloadTracker.Count(), 3u); - NL_TEST_ASSERT(inSuite, test.Remove(2) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 2); + EXPECT_EQ(test.Remove(2), CHIP_NO_ERROR); + EXPECT_EQ(gPayloadTracker.Count(), 2u); - NL_TEST_ASSERT(inSuite, test.AddValue(10, 8) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 3); + EXPECT_EQ(test.AddValue(10, 8), CHIP_NO_ERROR); + EXPECT_EQ(gPayloadTracker.Count(), 3u); - NL_TEST_ASSERT(inSuite, test.Remove(14) == CHIP_ERROR_KEY_NOT_FOUND); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 3); + EXPECT_EQ(test.Remove(14), CHIP_ERROR_KEY_NOT_FOUND); + EXPECT_EQ(gPayloadTracker.Count(), 3u); - NL_TEST_ASSERT(inSuite, test.Remove(1) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 2); + EXPECT_EQ(test.Remove(1), CHIP_NO_ERROR); + EXPECT_EQ(gPayloadTracker.Count(), 2u); - NL_TEST_ASSERT(inSuite, test.Remove(3) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 1); + EXPECT_EQ(test.Remove(3), CHIP_NO_ERROR); + EXPECT_EQ(gPayloadTracker.Count(), 1u); - NL_TEST_ASSERT(inSuite, test.Remove(3) == CHIP_ERROR_KEY_NOT_FOUND); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 1); + EXPECT_EQ(test.Remove(3), CHIP_ERROR_KEY_NOT_FOUND); + EXPECT_EQ(gPayloadTracker.Count(), 1u); - NL_TEST_ASSERT(inSuite, test.Remove(10) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 0); + EXPECT_EQ(test.Remove(10), CHIP_NO_ERROR); + EXPECT_EQ(gPayloadTracker.Count(), 0u); - NL_TEST_ASSERT(inSuite, test.Remove(10) == CHIP_ERROR_KEY_NOT_FOUND); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 0); + EXPECT_EQ(test.Remove(10), CHIP_ERROR_KEY_NOT_FOUND); + EXPECT_EQ(gPayloadTracker.Count(), 0u); } -void RemoveMatching(nlTestSuite * inSuite, void * inContext) +TEST(TestCache, RemoveMatching) { TestableCache<int, int, 4> test; - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 0); + EXPECT_EQ(gPayloadTracker.Count(), 0u); - NL_TEST_ASSERT(inSuite, test.AddValue(1, 1) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test.AddValue(2, 2) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test.AddValue(3, 4) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test.AddValue(4, 8) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 4); + EXPECT_EQ(test.AddValue(1, 1), CHIP_NO_ERROR); + EXPECT_EQ(test.AddValue(2, 2), CHIP_NO_ERROR); + EXPECT_EQ(test.AddValue(3, 4), CHIP_NO_ERROR); + EXPECT_EQ(test.AddValue(4, 8), CHIP_NO_ERROR); + EXPECT_EQ(gPayloadTracker.Count(), 4u); test.RemoveMatching(DivisibleBy(2)); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 2); + EXPECT_EQ(gPayloadTracker.Count(), 2u); // keys 1 and 3 remain - NL_TEST_ASSERT(inSuite, gPayloadTracker.IsAcquired(1)); - NL_TEST_ASSERT(inSuite, gPayloadTracker.IsAcquired(4)); + EXPECT_TRUE(gPayloadTracker.IsAcquired(1)); + EXPECT_TRUE(gPayloadTracker.IsAcquired(4)); - NL_TEST_ASSERT(inSuite, test.Remove(3) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, gPayloadTracker.IsAcquired(1)); - NL_TEST_ASSERT(inSuite, !gPayloadTracker.IsAcquired(4)); + EXPECT_EQ(test.Remove(3), CHIP_NO_ERROR); + EXPECT_TRUE(gPayloadTracker.IsAcquired(1)); + EXPECT_FALSE(gPayloadTracker.IsAcquired(4)); } -void FindMatching(nlTestSuite * inSuite, void * inContext) +TEST(TestCache, FindMatching) { TestableCache<int, int, 4> test; - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 0); + EXPECT_EQ(gPayloadTracker.Count(), 0u); - NL_TEST_ASSERT(inSuite, test.AddValue(1, 1) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test.AddValue(2, 2) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test.AddValue(3, 4) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test.AddValue(4, 8) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, gPayloadTracker.Count() == 4); + EXPECT_EQ(test.AddValue(1, 1), CHIP_NO_ERROR); + EXPECT_EQ(test.AddValue(2, 2), CHIP_NO_ERROR); + EXPECT_EQ(test.AddValue(3, 4), CHIP_NO_ERROR); + EXPECT_EQ(test.AddValue(4, 8), CHIP_NO_ERROR); + EXPECT_EQ(gPayloadTracker.Count(), 4u); const int * key; const int * value; - NL_TEST_ASSERT(inSuite, test.Find(DivisibleBy(20), &key, &value) == false); - NL_TEST_ASSERT(inSuite, key == nullptr); - NL_TEST_ASSERT(inSuite, value == nullptr); + EXPECT_FALSE(test.Find(DivisibleBy(20), &key, &value)); + EXPECT_EQ(key, nullptr); + EXPECT_EQ(value, nullptr); // This relies on linear add. May need changing if implementation changes - NL_TEST_ASSERT(inSuite, test.Find(DivisibleBy(2), &key, &value) == true); - NL_TEST_ASSERT(inSuite, *key == 2); - NL_TEST_ASSERT(inSuite, *value == 2); + EXPECT_TRUE(test.Find(DivisibleBy(2), &key, &value)); + EXPECT_EQ(*key, 2); + EXPECT_EQ(*value, 2); - NL_TEST_ASSERT(inSuite, test.Remove(*key) == CHIP_NO_ERROR); + EXPECT_EQ(test.Remove(*key), CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test.Find(DivisibleBy(2), &key, &value) == true); - NL_TEST_ASSERT(inSuite, *key == 4); - NL_TEST_ASSERT(inSuite, *value == 8); + EXPECT_TRUE(test.Find(DivisibleBy(2), &key, &value)); + EXPECT_EQ(*key, 4); + EXPECT_EQ(*value, 8); - NL_TEST_ASSERT(inSuite, test.Remove(*key) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, test.Find(DivisibleBy(2), &key, &value) == false); - NL_TEST_ASSERT(inSuite, key == nullptr); - NL_TEST_ASSERT(inSuite, value == nullptr); + EXPECT_EQ(test.Remove(*key), CHIP_NO_ERROR); + EXPECT_FALSE(test.Find(DivisibleBy(2), &key, &value)); + EXPECT_EQ(key, nullptr); + EXPECT_EQ(value, nullptr); } } // namespace - -// clang-format off -static const nlTest sTests[] = -{ - NL_TEST_DEF("NoOp", TestNoOp), - NL_TEST_DEF("DestructorFree", TestDestructorFree), - NL_TEST_DEF("OutOfSpace", OutOfSpace), - NL_TEST_DEF("AddRemove", AddRemove), - NL_TEST_DEF("RemoveMatching", RemoveMatching), - NL_TEST_DEF("FindMatching", FindMatching), - NL_TEST_SENTINEL() -}; -// clang-format on - -int TestCache() -{ - nlTestSuite theSuite = { "Retransmit-Cache", &sTests[0], nullptr, nullptr }; - gPayloadTracker.Init(&theSuite); - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestCache) From 59557f4d45da0b3de08f7ab0aad946ccd4446b87 Mon Sep 17 00:00:00 2001 From: C Freeman <cecille@google.com> Date: Thu, 25 Apr 2024 11:39:22 -0400 Subject: [PATCH 037/124] TC-DGGEN-3.2: Add (#32995) * TC-DGGEN-3.2: Add * Apply suggestions from code review * lint * move save out of expected outcome * Restyled by autopep8 * spelling * Apply suggestions from code review --------- Co-authored-by: Restyled.io <commits@restyled.io> --- src/python_testing/TC_DGGEN_3_2.py | 48 +++++++++++++ .../test_testing/MockTestRunner.py | 4 +- .../test_testing/test_TC_DGGEN_3_2.py | 71 +++++++++++++++++++ .../test_testing/test_TC_TMP_2_1.py | 2 +- 4 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 src/python_testing/TC_DGGEN_3_2.py create mode 100644 src/python_testing/test_testing/test_TC_DGGEN_3_2.py diff --git a/src/python_testing/TC_DGGEN_3_2.py b/src/python_testing/TC_DGGEN_3_2.py new file mode 100644 index 00000000000000..7e5af6c7a5ea73 --- /dev/null +++ b/src/python_testing/TC_DGGEN_3_2.py @@ -0,0 +1,48 @@ +# +# 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. +# + +import chip.clusters as Clusters +from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main +from mobly import asserts + + +class TC_DGGEN_3_2(MatterBaseTest): + def steps_TC_DGGEN_3_2(self): + return [TestStep(0, "Commission DUT (already done)", is_commissioning=True), + TestStep(1, "TH reads the MaxPathsPerInvoke attribute from the Basic Information Cluster from DUT. Save the value as `max_paths_per_invoke", + "Read is successful"), + TestStep(2, "TH reads FeatureMap attribute from the General Diagnostics Cluster from DUT", + "Verify that the FeatureMap value has the DMTEST feature bit (0) set to 1 if `max_path_per_invoke` > 1") + ] + + @async_test_body + async def test_TC_DGGEN_3_2(self): + # commissioning - already done + self.step(0) + + self.step(1) + max_paths_per_invoke = await self.read_single_attribute_check_success(cluster=Clusters.BasicInformation, attribute=Clusters.BasicInformation.Attributes.MaxPathsPerInvoke) + + self.step(2) + feature_map = await self.read_single_attribute_check_success(cluster=Clusters.GeneralDiagnostics, attribute=Clusters.GeneralDiagnostics.Attributes.FeatureMap) + if max_paths_per_invoke > 1: + asserts.assert_true(feature_map & Clusters.GeneralDiagnostics.Bitmaps.Feature.kDataModelTest, + "DMTEST feature must be set if MaxPathsPerInvoke > 1") + + +if __name__ == "__main__": + default_matter_test_main() diff --git a/src/python_testing/test_testing/MockTestRunner.py b/src/python_testing/test_testing/MockTestRunner.py index 79f6e21e2b434e..451e38d4660ac6 100644 --- a/src/python_testing/test_testing/MockTestRunner.py +++ b/src/python_testing/test_testing/MockTestRunner.py @@ -37,9 +37,9 @@ async def __call__(self, *args, **kwargs): class MockTestRunner(): - def __init__(self, filename: str, classname: str, test: str): + def __init__(self, filename: str, classname: str, test: str, endpoint: int): self.config = MatterTestConfig( - tests=[test], endpoint=1, dut_node_ids=[1]) + tests=[test], endpoint=endpoint, dut_node_ids=[1]) self.stack = MatterStackState(self.config) self.default_controller = self.stack.certificate_authorities[0].adminList[0].NewController( nodeId=self.config.controller_node_id, diff --git a/src/python_testing/test_testing/test_TC_DGGEN_3_2.py b/src/python_testing/test_testing/test_TC_DGGEN_3_2.py new file mode 100644 index 00000000000000..34b80514035945 --- /dev/null +++ b/src/python_testing/test_testing/test_TC_DGGEN_3_2.py @@ -0,0 +1,71 @@ +#!/usr/bin/env -S python3 -B +# +# 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. +# + +import sys +from dataclasses import dataclass + +import chip.clusters as Clusters +from chip.clusters import Attribute +from MockTestRunner import MockTestRunner + + +@dataclass +class TestSpec(): + max_paths: int + dmtest_feature_map: int + expect_pass: bool + + +TEST_CASES = [ + TestSpec(1, 0, True), + TestSpec(1, 1, True), + TestSpec(2, 0, False), + TestSpec(2, 1, True), +] + + +def test_spec_to_attribute_cache(test_spec: TestSpec) -> Attribute.AsyncReadTransaction.ReadResponse: + bi = Clusters.BasicInformation + bi_attr = bi.Attributes + gd = Clusters.GeneralDiagnostics + gd_attr = gd.Attributes + resp = Attribute.AsyncReadTransaction.ReadResponse({}, [], {}) + resp.attributes = {0: {bi: {bi_attr.MaxPathsPerInvoke: test_spec.max_paths}, + gd: {gd_attr.FeatureMap: test_spec.dmtest_feature_map}}} + return resp + + +def main(): + test_runner = MockTestRunner('TC_DGGEN_3_2', 'TC_DGGEN_3_2', 'test_TC_DGGEN_3_2', 0) + failures = [] + for idx, t in enumerate(TEST_CASES): + ok = test_runner.run_test_with_mock_read(test_spec_to_attribute_cache(t)) == t.expect_pass + if not ok: + failures.append(f"Test case failure: {idx} {t}") + + test_runner.Shutdown() + print( + f"Test of tests: run {len(TEST_CASES)}, test response correct: {len(TEST_CASES) - len(failures)} test response incorrect: {len(failures)}") + for f in failures: + print(f) + + return 1 if failures else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/src/python_testing/test_testing/test_TC_TMP_2_1.py b/src/python_testing/test_testing/test_TC_TMP_2_1.py index 5693aced8ba505..fe888a4896cb28 100644 --- a/src/python_testing/test_testing/test_TC_TMP_2_1.py +++ b/src/python_testing/test_testing/test_TC_TMP_2_1.py @@ -160,7 +160,7 @@ def test_spec_to_attribute_cache(test_spec: TestSpec) -> Attribute.AsyncReadTran def main(): - test_runner = MockTestRunner('TC_TMP_2_1', 'TC_TMP_2_1', 'test_TC_TMP_2_1') + test_runner = MockTestRunner('TC_TMP_2_1', 'TC_TMP_2_1', 'test_TC_TMP_2_1', 1) failures = [] for idx, t in enumerate(TEST_CASES): ok = test_runner.run_test_with_mock_read(test_spec_to_attribute_cache(t)) == t.expect_pass From b3cc2700d974d97e06dbf7a571e417b775968dcd Mon Sep 17 00:00:00 2001 From: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> Date: Thu, 25 Apr 2024 12:11:15 -0400 Subject: [PATCH 038/124] [Silabs] Bring Event queue based processing to wifi ncp apps (#33113) * Pull request #1754: MATTER-3434: Port 917c soc Event queue based processing to 9116/917 ncp Merge in WMN_TOOLS/matter from bugfix/ncp_commissioning to RC_2.3.0-1.3 Squashed commit of the following: commit 07682286ca70636224f45a8d9823101bddbee035 Author: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> Date: Sat Apr 13 13:44:11 2024 -0400 Port 917c soc Event queue based processing to 9116/917 ncp * Restyled by whitespace * Restyled by clang-format * Fix build by including a header earlier in the file (temp fix). --------- Co-authored-by: Restyled.io <commits@restyled.io> --- .../platform/silabs/efr32/rs911x/rsi_if.c | 451 +++++++++++------- .../silabs/efr32/rs911x/wfx_rsi_host.cpp | 36 +- examples/platform/silabs/wfx_rsi.h | 11 +- 3 files changed, 293 insertions(+), 205 deletions(-) diff --git a/examples/platform/silabs/efr32/rs911x/rsi_if.c b/examples/platform/silabs/efr32/rs911x/rsi_if.c index 00efeee09a4efb..3596b098b7a1ca 100644 --- a/examples/platform/silabs/efr32/rs911x/rsi_if.c +++ b/examples/platform/silabs/efr32/rs911x/rsi_if.c @@ -26,21 +26,14 @@ #include "em_usart.h" #include "sl_status.h" - -#include "FreeRTOS.h" -#include "event_groups.h" -#include "task.h" - -#include "silabs_utils.h" - +#include <cmsis_os2.h> +// TODO Fix include order issue #33120 #include "wfx_host_events.h" -#include "rsi_driver.h" -#include "rsi_wlan_non_rom.h" - #include "rsi_bootup_config.h" #include "rsi_common_apis.h" #include "rsi_data_types.h" +#include "rsi_driver.h" #include "rsi_error.h" #include "rsi_nwk.h" #include "rsi_socket.h" @@ -48,10 +41,11 @@ #include "rsi_wlan.h" #include "rsi_wlan_apis.h" #include "rsi_wlan_config.h" +#include "rsi_wlan_non_rom.h" +#include "silabs_utils.h" #include "dhcp_client.h" #include "lwip/nd6.h" -#include "wfx_host_events.h" #include "wfx_rsi.h" // TODO convert this file to cpp and use CodeUtils.h @@ -59,6 +53,8 @@ #define MIN(a, b) ((a) < (b) ? (a) : (b)) #endif +#define WFX_QUEUE_SIZE 10 + /* Rsi driver Task will use as its stack */ StackType_t driverRsiTaskStack[WFX_RSI_WLAN_TASK_SZ] = { 0 }; @@ -84,12 +80,54 @@ uint32_t retryInterval = WLAN_MIN_RETRY_TIMER_MS; extern rsi_semaphore_handle_t sl_rs_ble_init_sem; #endif +// DHCP Poll timer +static osTimerId_t sDHCPTimer; +static osMessageQueueId_t sWifiEventQueue = NULL; /* * This file implements the interface to the RSI SAPIs */ static uint8_t wfx_rsi_drv_buf[WFX_RSI_BUF_SZ]; static wfx_wifi_scan_ext_t temp_reset; +static void DHCPTimerEventHandler(void * arg) +{ + WfxEvent_t event; + event.eventType = WFX_EVT_DHCP_POLL; + WfxPostEvent(&event); +} + +static void CancelDHCPTimer() +{ + osStatus_t status; + + // Check if timer started + if (!osTimerIsRunning(sDHCPTimer)) + { + SILABS_LOG("CancelDHCPTimer: timer not running"); + return; + } + + status = osTimerStop(sDHCPTimer); + if (status != osOK) + { + SILABS_LOG("CancelDHCPTimer: failed to stop timer with status: %d", status); + } +} + +static void StartDHCPTimer(uint32_t timeout) +{ + osStatus_t status; + + // Cancel timer if already started + CancelDHCPTimer(); + + status = osTimerStart(sDHCPTimer, pdMS_TO_TICKS(timeout)); + if (status != osOK) + { + SILABS_LOG("StartDHCPTimer: failed to start timer with status: %d", status); + } +} + /****************************************************************** * @fn int32_t wfx_rsi_get_ap_info(wfx_wifi_scan_result_t *ap) * @brief @@ -234,7 +272,7 @@ int32_t wfx_rsi_power_save() *********************************************************************/ static void wfx_rsi_join_cb(uint16_t status, const uint8_t * buf, const uint16_t len) { - SILABS_LOG("%s: status: %02x", __func__, status); + WfxEvent_t WfxEvent; wfx_rsi.dev_state &= ~WFX_RSI_ST_STA_CONNECTING; if (status != RSI_SUCCESS) { @@ -244,7 +282,10 @@ static void wfx_rsi_join_cb(uint16_t status, const uint8_t * buf, const uint16_t SILABS_LOG("%s: failed. retry: %d", __func__, wfx_rsi.join_retries); wfx_retry_interval_handler(is_wifi_disconnection_event, wfx_rsi.join_retries++); if (is_wifi_disconnection_event || wfx_rsi.join_retries <= WFX_RSI_CONFIG_MAX_JOIN) - xEventGroupSetBits(wfx_rsi.events, WFX_EVT_STA_START_JOIN); + { + WfxEvent.eventType = WFX_EVT_STA_START_JOIN; + WfxPostEvent(&WfxEvent); + } } else { @@ -253,7 +294,8 @@ static void wfx_rsi_join_cb(uint16_t status, const uint8_t * buf, const uint16_t */ memset(&temp_reset, 0, sizeof(wfx_wifi_scan_ext_t)); SILABS_LOG("%s: join completed.", __func__); - xEventGroupSetBits(wfx_rsi.events, WFX_EVT_STA_CONN); + WfxEvent.eventType = WFX_EVT_STA_CONN; + WfxPostEvent(&WfxEvent); wfx_rsi.join_retries = 0; retryInterval = WLAN_MIN_RETRY_TIMER_MS; } @@ -272,10 +314,12 @@ static void wfx_rsi_join_cb(uint16_t status, const uint8_t * buf, const uint16_t static void wfx_rsi_join_fail_cb(uint16_t status, uint8_t * buf, uint32_t len) { SILABS_LOG("%s: error: failed status: %02x", __func__, status); + WfxEvent_t WfxEvent; wfx_rsi.join_retries += 1; wfx_rsi.dev_state &= ~(WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED); is_wifi_disconnection_event = true; - xEventGroupSetBits(wfx_rsi.events, WFX_EVT_STA_START_JOIN); + WfxEvent.eventType = WFX_EVT_STA_START_JOIN; + WfxPostEvent(&WfxEvent); } /************************************************************************************* * @fn wfx_rsi_wlan_pkt_cb(uint16_t status, uint8_t *buf, uint32_t len) @@ -380,7 +424,22 @@ static int32_t wfx_rsi_init(void) SILABS_LOG("%s: WLAN: MAC %02x:%02x:%02x %02x:%02x:%02x", __func__, wfx_rsi.sta_mac.octet[0], wfx_rsi.sta_mac.octet[1], wfx_rsi.sta_mac.octet[2], wfx_rsi.sta_mac.octet[3], wfx_rsi.sta_mac.octet[4], wfx_rsi.sta_mac.octet[5]); - wfx_rsi.events = xEventGroupCreateStatic(&rsiDriverEventGroup); + + // Create the message queue + sWifiEventQueue = osMessageQueueNew(WFX_QUEUE_SIZE, sizeof(WfxEvent_t), NULL); + if (sWifiEventQueue == NULL) + { + return SL_STATUS_ALLOCATION_FAILED; + } + + // Create timer for DHCP polling + // TODO: Use LWIP timer instead of creating a new one here + sDHCPTimer = osTimerNew(DHCPTimerEventHandler, osTimerPeriodic, NULL, NULL); + if (sDHCPTimer == NULL) + { + return SL_STATUS_ALLOCATION_FAILED; + } + /* * Register callbacks - We are only interested in the connectivity CBs */ @@ -552,6 +611,191 @@ static void wfx_rsi_do_join(void) } } +/** NotifyConnectivity + * @brief Notify the application about the connectivity status if it has not been notified yet. + * Helper function for HandleDHCPPolling. + */ +void NotifyConnectivity() +{ + if (!hasNotifiedWifiConnectivity) + { + wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &wfx_rsi.ap_mac); + hasNotifiedWifiConnectivity = true; + } +} + +void HandleDHCPPolling() +{ + struct netif * sta_netif; + WfxEvent_t event; + + sta_netif = wfx_get_netif(SL_WFX_STA_INTERFACE); + if (sta_netif == NULL) + { + // TODO: Notify the application that the interface is not set up or Chipdie here because we are in an unkonwn state + SILABS_LOG("HandleDHCPPolling: failed to get STA netif"); + return; + } +#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4) + uint8_t dhcp_state = dhcpclient_poll(sta_netif); + if (dhcp_state == DHCP_ADDRESS_ASSIGNED && !hasNotifiedIPV4) + { + wfx_dhcp_got_ipv4((uint32_t) sta_netif->ip_addr.u_addr.ip4.addr); + hasNotifiedIPV4 = true; + NotifyConnectivity(); + } + else if (dhcp_state == DHCP_OFF) + { + wfx_ip_changed_notify(IP_STATUS_FAIL); + hasNotifiedIPV4 = false; + } +#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */ + /* Checks if the assigned IPv6 address is preferred by evaluating + * the first block of IPv6 address ( block 0) + */ + if ((ip6_addr_ispreferred(netif_ip6_addr_state(sta_netif, 0))) && !hasNotifiedIPV6) + { + wfx_ipv6_notify(GET_IPV6_SUCCESS); + hasNotifiedIPV6 = true; + event.eventType = WFX_EVT_STA_DHCP_DONE; + WfxPostEvent(&event); + NotifyConnectivity(); + } +} + +/** ResetDHCPNotificationFlags + * @brief Reset the flags that are used to notify the application about DHCP connectivity + * and emits a WFX_EVT_STA_DO_DHCP event to trigger DHCP polling checks. Helper function for ProcessEvent. + */ +void ResetDHCPNotificationFlags() +{ + WfxEvent_t outEvent; + +#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4) + hasNotifiedIPV4 = false; +#endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4 + hasNotifiedIPV6 = false; + hasNotifiedWifiConnectivity = false; + + outEvent.eventType = WFX_EVT_STA_DO_DHCP; + WfxPostEvent(&outEvent); +} + +/** + * @brief Post the WfxEvent to tue WiFiEventQueue to be process by the wfx_rsi_task + */ +void WfxPostEvent(WfxEvent_t * event) +{ + sl_status_t status = osMessageQueuePut(sWifiEventQueue, event, 0, 0); + + if (status != osOK) + { + SILABS_LOG("WfxPostEvent: failed to post event with status: %d", status); + // TODO: Handle error, requeue event depending on queue size or notify relevant task, Chipdie, etc. + } +} + +void ProcessEvent(WfxEvent_t inEvent) +{ + // Process event + switch (inEvent.eventType) + { + case WFX_EVT_STA_CONN: + SILABS_LOG("%s: starting LwIP STA", __func__); + wfx_rsi.dev_state |= WFX_RSI_ST_STA_CONNECTED; + ResetDHCPNotificationFlags(); + wfx_lwip_set_sta_link_up(); + /* We need to get AP Mac - TODO */ + // Uncomment once the hook into MATTER is moved to IP connectivty instead + // of AP connectivity. + // wfx_connected_notify(0, &wfx_rsi.ap_mac); // This + // is independant of IP connectivity. + break; + case WFX_EVT_STA_DISCONN: + // TODO: This event is not being posted anywhere, seems to be a dead code or we are missing something + wfx_rsi.dev_state &= + ~(WFX_RSI_ST_STA_READY | WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED | WFX_RSI_ST_STA_DHCP_DONE); + SILABS_LOG("%s: disconnect notify", __func__); + /* TODO: Implement disconnect notify */ + ResetDHCPNotificationFlags(); + wfx_lwip_set_sta_link_down(); // Internally dhcpclient_poll(netif) -> + // wfx_ip_changed_notify(0) for IPV4 +#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4) + wfx_ip_changed_notify(IP_STATUS_FAIL); +#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */ + wfx_ipv6_notify(GET_IPV6_FAIL); + break; + case WFX_EVT_AP_START: + // TODO: Currently unimplemented + break; + case WFX_EVT_AP_STOP: + // TODO: Currently unimplemented + break; + case WFX_EVT_SCAN: +#ifdef SL_WFX_CONFIG_SCAN + rsi_rsp_scan_t scan_rsp = { 0 }; + int32_t status = rsi_wlan_bgscan_profile(1, &scan_rsp, sizeof(scan_rsp)); + + if (status) + { + SILABS_LOG("SSID scan failed: %02x ", status); + } + else + { + rsi_scan_info_t * scan; + wfx_wifi_scan_result_t ap; + for (int x = 0; x < scan_rsp.scan_count[0]; x++) + { + scan = &scan_rsp.scan_info[x]; + // is it a scan all or target scan + if (!wfx_rsi.scan_ssid || (wfx_rsi.scan_ssid && strcmp(wfx_rsi.scan_ssid, (char *) scan->ssid) == CMP_SUCCESS)) + { + strncpy(ap.ssid, (char *) scan->ssid, MIN(sizeof(ap.ssid), sizeof(scan->ssid))); + ap.security = scan->security_mode; + ap.rssi = (-1) * scan->rssi_val; + configASSERT(sizeof(ap.bssid) >= BSSID_MAX_STR_LEN); + configASSERT(sizeof(scan->bssid) >= BSSID_MAX_STR_LEN); + memcpy(ap.bssid, scan->bssid, BSSID_MAX_STR_LEN); + (*wfx_rsi.scan_cb)(&ap); + + if (wfx_rsi.scan_ssid) + { + break; // we found the targeted ssid. + } + } + } + } + + /* Terminate with end of scan which is no ap sent back */ + (*wfx_rsi.scan_cb)((wfx_wifi_scan_result_t *) 0); + wfx_rsi.scan_cb = (void (*)(wfx_wifi_scan_result_t *)) 0; + + if (wfx_rsi.scan_ssid) + { + vPortFree(wfx_rsi.scan_ssid); + wfx_rsi.scan_ssid = (char *) 0; + } + break; +#endif /* SL_WFX_CONFIG_SCAN */ + case WFX_EVT_STA_START_JOIN: + // saving the AP related info + wfx_rsi_save_ap_info(); + // Joining to the network + wfx_rsi_do_join(); + break; + case WFX_EVT_STA_DO_DHCP: + StartDHCPTimer(WFX_RSI_DHCP_POLL_INTERVAL); + break; + case WFX_EVT_STA_DHCP_DONE: + CancelDHCPTimer(); + break; + case WFX_EVT_DHCP_POLL: + HandleDHCPPolling(); + default: + break; + } +} + /********************************************************************************* * @fn void wfx_rsi_task(void *arg) * @brief @@ -565,9 +809,6 @@ static void wfx_rsi_do_join(void) /* ARGSUSED */ void wfx_rsi_task(void * arg) { - EventBits_t flags; - TickType_t last_dhcp_poll, now; - struct netif * sta_netif; (void) arg; uint32_t rsi_status = wfx_rsi_init(); if (rsi_status != RSI_SUCCESS) @@ -575,180 +816,22 @@ void wfx_rsi_task(void * arg) SILABS_LOG("%s: error: wfx_rsi_init with status: %02x", __func__, rsi_status); return; } + WfxEvent_t wfxEvent; wfx_lwip_start(); - last_dhcp_poll = xTaskGetTickCount(); - sta_netif = wfx_get_netif(SL_WFX_STA_INTERFACE); wfx_started_notify(); - SILABS_LOG("%s: starting event wait", __func__); + SILABS_LOG("Starting event loop"); for (;;) { - /* - * This is the main job of this task. - * Wait for commands from the ConnectivityManager - * Make state changes (based on call backs) - */ - flags = xEventGroupWaitBits(wfx_rsi.events, - WFX_EVT_STA_CONN | WFX_EVT_STA_DISCONN | WFX_EVT_STA_START_JOIN -#ifdef SL_WFX_CONFIG_SOFTAP - | WFX_EVT_AP_START | WFX_EVT_AP_STOP -#endif /* SL_WFX_CONFIG_SOFTAP */ -#ifdef SL_WFX_CONFIG_SCAN - | WFX_EVT_SCAN -#endif /* SL_WFX_CONFIG_SCAN */ - | 0, - pdTRUE, /* Clear the bits */ - pdFALSE, /* Wait for any bit */ - pdMS_TO_TICKS(250)); /* 250 mSec */ - - if (flags) - { - SILABS_LOG("%s: wait event encountered: %x", __func__, flags); - } - /* - * Let's handle DHCP polling here - */ - if (wfx_rsi.dev_state & WFX_RSI_ST_STA_CONNECTED) - { - if ((now = xTaskGetTickCount()) > (last_dhcp_poll + pdMS_TO_TICKS(250))) - { -#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4) - uint8_t dhcp_state = dhcpclient_poll(sta_netif); - if (dhcp_state == DHCP_ADDRESS_ASSIGNED && !hasNotifiedIPV4) - { - wfx_dhcp_got_ipv4((uint32_t) sta_netif->ip_addr.u_addr.ip4.addr); - hasNotifiedIPV4 = true; - if (!hasNotifiedWifiConnectivity) - { - wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &wfx_rsi.ap_mac); - hasNotifiedWifiConnectivity = true; - } - } - else if (dhcp_state == DHCP_OFF) - { - wfx_ip_changed_notify(IP_STATUS_FAIL); - hasNotifiedIPV4 = false; - } -#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */ - /* - * Checks if the assigned IPv6 address is preferred by evaluating - * the first block of IPv6 address ( block 0) - */ - if ((ip6_addr_ispreferred(netif_ip6_addr_state(sta_netif, 0))) && !hasNotifiedIPV6) - { - wfx_ipv6_notify(GET_IPV6_SUCCESS); - hasNotifiedIPV6 = true; - if (!hasNotifiedWifiConnectivity) - { - wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &wfx_rsi.ap_mac); - hasNotifiedWifiConnectivity = true; - } - } - last_dhcp_poll = now; - } - } - if (flags & WFX_EVT_STA_START_JOIN) - { - // saving the AP related info - wfx_rsi_save_ap_info(); - // Joining to the network - wfx_rsi_do_join(); - } - if (flags & WFX_EVT_STA_CONN) - { - /* - * Initiate the Join command (assuming we have been provisioned) - */ - SILABS_LOG("%s: starting LwIP STA", __func__); - wfx_rsi.dev_state |= WFX_RSI_ST_STA_CONNECTED; - hasNotifiedWifiConnectivity = false; -#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4) - hasNotifiedIPV4 = false; -#endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4 - hasNotifiedIPV6 = false; - wfx_lwip_set_sta_link_up(); - /* We need to get AP Mac - TODO */ - // Uncomment once the hook into MATTER is moved to IP connectivty instead - // of AP connectivity. wfx_connected_notify(0, &wfx_rsi.ap_mac); // This - // is independant of IP connectivity. - } - if (flags & WFX_EVT_STA_DISCONN) - { - wfx_rsi.dev_state &= - ~(WFX_RSI_ST_STA_READY | WFX_RSI_ST_STA_CONNECTING | WFX_RSI_ST_STA_CONNECTED | WFX_RSI_ST_STA_DHCP_DONE); - SILABS_LOG("%s: disconnect notify", __func__); - /* TODO: Implement disconnect notify */ - wfx_lwip_set_sta_link_down(); // Internally dhcpclient_poll(netif) -> - // wfx_ip_changed_notify(0) for IPV4 -#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4) - wfx_ip_changed_notify(IP_STATUS_FAIL); - hasNotifiedIPV4 = false; -#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */ - wfx_ipv6_notify(GET_IPV6_FAIL); - hasNotifiedIPV6 = false; - hasNotifiedWifiConnectivity = false; - } -#ifdef SL_WFX_CONFIG_SCAN - if (flags & WFX_EVT_SCAN) - { - if (!(wfx_rsi.dev_state & WFX_RSI_ST_SCANSTARTED)) - { - rsi_rsp_scan_t scan_rsp = { 0 }; - int32_t status = rsi_wlan_bgscan_profile(1, &scan_rsp, sizeof(scan_rsp)); - - if (status) - { - SILABS_LOG("SSID scan failed: %02x ", status); - } - else - { - rsi_scan_info_t * scan; - wfx_wifi_scan_result_t ap; - for (int x = 0; x < scan_rsp.scan_count[0]; x++) - { - scan = &scan_rsp.scan_info[x]; - // is it a scan all or target scan - if (!wfx_rsi.scan_ssid || - (wfx_rsi.scan_ssid && strcmp(wfx_rsi.scan_ssid, (char *) scan->ssid) == CMP_SUCCESS)) - { - strncpy(ap.ssid, (char *) scan->ssid, MIN(sizeof(ap.ssid), sizeof(scan->ssid))); - ap.security = scan->security_mode; - ap.rssi = (-1) * scan->rssi_val; - configASSERT(sizeof(ap.bssid) >= BSSID_MAX_STR_LEN); - configASSERT(sizeof(scan->bssid) >= BSSID_MAX_STR_LEN); - memcpy(ap.bssid, scan->bssid, BSSID_MAX_STR_LEN); - (*wfx_rsi.scan_cb)(&ap); - - if (wfx_rsi.scan_ssid) - { - break; // we found the targeted ssid. - } - } - } - } - - wfx_rsi.dev_state &= ~WFX_RSI_ST_SCANSTARTED; - /* Terminate with end of scan which is no ap sent back */ - (*wfx_rsi.scan_cb)((wfx_wifi_scan_result_t *) 0); - wfx_rsi.scan_cb = (void (*)(wfx_wifi_scan_result_t *)) 0; - - if (wfx_rsi.scan_ssid) - { - vPortFree(wfx_rsi.scan_ssid); - wfx_rsi.scan_ssid = (char *) 0; - } - } - } -#endif /* SL_WFX_CONFIG_SCAN */ -#ifdef SL_WFX_CONFIG_SOFTAP - /* TODO */ - if (flags & WFX_EVT_AP_START) + osStatus_t status = osMessageQueueGet(sWifiEventQueue, &wfxEvent, NULL, osWaitForever); + if (status == osOK) { + ProcessEvent(wfxEvent); } - if (flags & WFX_EVT_AP_STOP) + else { + SILABS_LOG("Failed to get event with status: %x", status); } -#endif /* SL_WFX_CONFIG_SOFTAP */ } } diff --git a/examples/platform/silabs/efr32/rs911x/wfx_rsi_host.cpp b/examples/platform/silabs/efr32/rs911x/wfx_rsi_host.cpp index 8764c0a9dda8bb..8d92c0e3dc5c3e 100644 --- a/examples/platform/silabs/efr32/rs911x/wfx_rsi_host.cpp +++ b/examples/platform/silabs/efr32/rs911x/wfx_rsi_host.cpp @@ -31,6 +31,7 @@ #include "FreeRTOS.h" #include "event_groups.h" #include "task.h" + #include "wfx_host_events.h" #include "wfx_rsi.h" @@ -106,16 +107,14 @@ bool wfx_is_sta_mode_enabled(void) ***********************************************************************/ void wfx_get_wifi_mac_addr(sl_wfx_interface_t interface, sl_wfx_mac_address_t * addr) { - sl_wfx_mac_address_t * mac; - + if (addr) + { #ifdef SL_WFX_CONFIG_SOFTAP - mac = (interface == SL_WFX_SOFTAP_INTERFACE) ? &wfx_rsi.softap_mac : &wfx_rsi.sta_mac; + *addr = (interface == SL_WFX_SOFTAP_INTERFACE) ? wfx_rsi.softap_mac : wfx_rsi.sta_mac; #else - mac = &wfx_rsi.sta_mac; + *addr = wfx_rsi.sta_mac; #endif - *addr = *mac; - SILABS_LOG("%s: %02x:%02x:%02x:%02x:%02x:%02x", __func__, mac->octet[0], mac->octet[1], mac->octet[2], mac->octet[3], - mac->octet[4], mac->octet[5]); + } } /********************************************************************* @@ -128,10 +127,11 @@ void wfx_get_wifi_mac_addr(sl_wfx_interface_t interface, sl_wfx_mac_address_t * ***********************************************************************/ void wfx_set_wifi_provision(wfx_wifi_provision_t * cfg) { - SILABS_LOG("%s: SSID: %s", __func__, &wfx_rsi.sec.ssid[0]); - - wfx_rsi.sec = *cfg; - wfx_rsi.dev_state |= WFX_RSI_ST_STA_PROVISIONED; + if (cfg) + { + wfx_rsi.sec = *cfg; + wfx_rsi.dev_state |= WFX_RSI_ST_STA_PROVISIONED; + } } /********************************************************************* @@ -178,14 +178,16 @@ void wfx_clear_wifi_provision(void) ****************************************************************************/ sl_status_t wfx_connect_to_ap(void) { + WfxEvent_t event; if (wfx_rsi.dev_state & WFX_RSI_ST_STA_PROVISIONED) { - SILABS_LOG("%s: connecting to access point -> SSID: %s", __func__, &wfx_rsi.sec.ssid[0]); - xEventGroupSetBits(wfx_rsi.events, WFX_EVT_STA_START_JOIN); + SILABS_LOG("Connecting to access point -> SSID: %s", &wfx_rsi.sec.ssid[0]); + event.eventType = WFX_EVT_STA_START_JOIN; + WfxPostEvent(&event); } else { - SILABS_LOG("%s: error: access point not provisioned", __func__); + SILABS_LOG("Error: access point not provisioned."); return SL_STATUS_INVALID_CONFIGURATION; } return SL_STATUS_OK; @@ -392,7 +394,7 @@ int32_t wfx_reset_counts() bool wfx_start_scan(char * ssid, void (*callback)(wfx_wifi_scan_result_t *)) { int sz; - + WfxEvent_t event; if (wfx_rsi.scan_cb) return false; /* Already in progress */ if (ssid) @@ -405,7 +407,9 @@ bool wfx_start_scan(char * ssid, void (*callback)(wfx_wifi_scan_result_t *)) strcpy(wfx_rsi.scan_ssid, ssid); } wfx_rsi.scan_cb = callback; - xEventGroupSetBits(wfx_rsi.events, WFX_EVT_SCAN); + + event.eventType = WFX_EVT_SCAN; + WfxPostEvent(&event); return true; } diff --git a/examples/platform/silabs/wfx_rsi.h b/examples/platform/silabs/wfx_rsi.h index 445671f4566b49..acebe545c17d3d 100644 --- a/examples/platform/silabs/wfx_rsi.h +++ b/examples/platform/silabs/wfx_rsi.h @@ -17,6 +17,7 @@ #pragma once #include <event_groups.h> +#include <wfx_host_events.h> #ifndef RSI_BLE_ENABLE #define RSI_BLE_ENABLE (1) @@ -69,11 +70,6 @@ typedef struct WfxEvent_s void * eventData; // event data TODO: confirm needed } WfxEvent_t; -/// WfxPostEvent -/// @brief Allows to allocate an event to the WFX task event queue from outside of sl_wifi_if.c -/// @param event The event that will be allocated to the event queue -void WfxPostEvent(WfxEvent_t * event); - typedef struct wfx_rsi_s { // TODO: Change tp WfxEventType_e once the event queue is implemented @@ -124,6 +120,11 @@ int32_t wfx_rsi_power_save(rsi_power_save_profile_mode_t sl_si91x_ble_state, sl_ int32_t wfx_rsi_power_save(); #endif /* SLI_SI917 */ #endif /* SL_ICD_ENABLED */ + +/// WfxPostEvent +/// @brief Allows to allocate an event to the WFX task event queue from outside of sl_wifi_if.c +/// @param event The event that will be allocated to the event queue +void WfxPostEvent(WfxEvent_t * event); #ifdef __cplusplus } #endif From e12ace0fb042e307e9f35a207143cdd464fd1582 Mon Sep 17 00:00:00 2001 From: Arkadiusz Bokowy <a.bokowy@samsung.com> Date: Thu, 25 Apr 2024 18:21:20 +0200 Subject: [PATCH 039/124] Remove dead code from BLE layer class (#33171) * Remove OnChipBleConnectReceived from BleLayer class * Remove HandleReadReceived from BleLayer class * Restyled by clang-format --------- Co-authored-by: Restyled.io <commits@restyled.io> --- src/ble/BleLayer.h | 7 ------- src/platform/ESP32/BLEManagerImpl.h | 2 -- src/platform/ESP32/bluedroid/BLEManagerImpl.cpp | 7 ------- src/platform/ESP32/nimble/BLEManagerImpl.cpp | 12 +----------- src/platform/Linux/BLEManagerImpl.cpp | 7 ------- src/platform/Linux/BLEManagerImpl.h | 2 -- src/platform/cc13xx_26xx/BLEManagerImpl.cpp | 8 +------- .../cc13xx_26xx/cc13x4_26x4/BLEManagerImpl.h | 2 -- src/platform/webos/BLEManagerImpl.cpp | 7 ------- src/platform/webos/BLEManagerImpl.h | 2 -- src/transport/raw/BLE.cpp | 6 ++---- 11 files changed, 4 insertions(+), 58 deletions(-) diff --git a/src/ble/BleLayer.h b/src/ble/BleLayer.h index d9480cbf74ff79..bad3ab3fd62fe7 100644 --- a/src/ble/BleLayer.h +++ b/src/ble/BleLayer.h @@ -229,9 +229,6 @@ class DLL_EXPORT BleLayer void * mAppState = nullptr; BleLayerDelegate * mBleTransport = nullptr; - typedef void (*BleConnectionReceivedFunct)(BLEEndPoint * newEndPoint); - BleConnectionReceivedFunct OnChipBleConnectReceived; - // Public functions: BleLayer(); @@ -302,10 +299,6 @@ class DLL_EXPORT BleLayer /// Call when an outstanding GATT indication receives a positive receipt confirmation. bool HandleIndicationConfirmation(BLE_CONNECTION_OBJECT connObj, const ChipBleUUID * svcId, const ChipBleUUID * charId); - /// Call when a GATT read request is received. - bool HandleReadReceived(BLE_CONNECTION_OBJECT connObj, BLE_READ_REQUEST_CONTEXT requestContext, const ChipBleUUID * svcId, - const ChipBleUUID * charId); - /**< Platform must call this function when any previous operation undertaken by the BleLayer via BleAdapter * fails, such as a characteristic write request or subscribe attempt, or when a BLE connection is closed. * diff --git a/src/platform/ESP32/BLEManagerImpl.h b/src/platform/ESP32/BLEManagerImpl.h index 9364ead642c525..3f466fc24ac97b 100644 --- a/src/platform/ESP32/BLEManagerImpl.h +++ b/src/platform/ESP32/BLEManagerImpl.h @@ -79,8 +79,6 @@ namespace DeviceLayer { namespace Internal { #if CONFIG_ENABLE_ESP32_BLE_CONTROLLER -void HandleIncomingBleConnection(Ble::BLEEndPoint * bleEP); - enum class BleScanState : uint8_t { kNotScanning, diff --git a/src/platform/ESP32/bluedroid/BLEManagerImpl.cpp b/src/platform/ESP32/bluedroid/BLEManagerImpl.cpp index e5d9077ee63ae2..72d738df7e3293 100644 --- a/src/platform/ESP32/bluedroid/BLEManagerImpl.cpp +++ b/src/platform/ESP32/bluedroid/BLEManagerImpl.cpp @@ -220,8 +220,6 @@ CHIP_ERROR BLEManagerImpl::_Init() #if CONFIG_ENABLE_ESP32_BLE_CONTROLLER mFlags.ClearAll().Set(Flags::kAdvertisingEnabled, CHIP_DEVICE_CONFIG_CHIPOBLE_ENABLE_ADVERTISING_AUTOSTART && !mIsCentral); mFlags.Set(Flags::kFastAdvertisingEnabled, !mIsCentral); - OnChipBleConnectReceived = HandleIncomingBleConnection; - #else mFlags.ClearAll().Set(Flags::kAdvertisingEnabled, CHIP_DEVICE_CONFIG_CHIPOBLE_ENABLE_ADVERTISING_AUTOSTART); mFlags.Set(Flags::kFastAdvertisingEnabled, true); @@ -741,11 +739,6 @@ void BLEManagerImpl::ConnectDevice(esp_bd_addr_t & addr, esp_ble_addr_type_t add ChipLogError(Ble, "Failed to connect to rc=%d", rc); } } - -void HandleIncomingBleConnection(BLEEndPoint * bleEP) -{ - ChipLogProgress(DeviceLayer, "CHIPoBLE connection received"); -} #endif bool BLEManagerImpl::SubscribeCharacteristic(BLE_CONNECTION_OBJECT conId, const ChipBleUUID * svcId, const ChipBleUUID * charId) diff --git a/src/platform/ESP32/nimble/BLEManagerImpl.cpp b/src/platform/ESP32/nimble/BLEManagerImpl.cpp index 67b5f9bc4b9530..a69bc169fe26ed 100644 --- a/src/platform/ESP32/nimble/BLEManagerImpl.cpp +++ b/src/platform/ESP32/nimble/BLEManagerImpl.cpp @@ -200,11 +200,6 @@ void BLEManagerImpl::ConnectDevice(const ble_addr_t & addr, uint16_t timeout) ChipLogError(Ble, "Failed to connect to rc=%d", rc); } } - -void HandleIncomingBleConnection(BLEEndPoint * bleEP) -{ - ChipLogProgress(DeviceLayer, "CHIPoBLE connection received"); -} #endif CHIP_ERROR BLEManagerImpl::_Init() @@ -237,12 +232,11 @@ CHIP_ERROR BLEManagerImpl::_Init() #if CONFIG_ENABLE_ESP32_BLE_CONTROLLER mFlags.ClearAll().Set(Flags::kAdvertisingEnabled, CHIP_DEVICE_CONFIG_CHIPOBLE_ENABLE_ADVERTISING_AUTOSTART && !mIsCentral); mFlags.Set(Flags::kFastAdvertisingEnabled, !mIsCentral); - OnChipBleConnectReceived = HandleIncomingBleConnection; #else mFlags.ClearAll().Set(Flags::kAdvertisingEnabled, CHIP_DEVICE_CONFIG_CHIPOBLE_ENABLE_ADVERTISING_AUTOSTART); mFlags.Set(Flags::kFastAdvertisingEnabled, true); - #endif + mNumGAPCons = 0; memset(reinterpret_cast<void *>(mCons), 0, sizeof(mCons)); mServiceMode = ConnectivityManager::kCHIPoBLEServiceMode_Enabled; @@ -266,10 +260,6 @@ void BLEManagerImpl::_Shutdown() mFlags.ClearAll().Set(Flags::kGATTServiceStarted); mServiceMode = ConnectivityManager::kCHIPoBLEServiceMode_Disabled; -#if CONFIG_ENABLE_ESP32_BLE_CONTROLLER - OnChipBleConnectReceived = nullptr; -#endif // CONFIG_ENABLE_ESP32_BLE_CONTROLLER - PlatformMgr().ScheduleWork(DriveBLEState, 0); } diff --git a/src/platform/Linux/BLEManagerImpl.cpp b/src/platform/Linux/BLEManagerImpl.cpp index d9025bdbd5a503..a5bd19f877a6a8 100644 --- a/src/platform/Linux/BLEManagerImpl.cpp +++ b/src/platform/Linux/BLEManagerImpl.cpp @@ -81,11 +81,6 @@ const ChipBleUUID ChipUUID_CHIPoBLEChar_TX = { { 0x18, 0xEE, 0x2E, 0xF5, 0x26, 0 BLEManagerImpl BLEManagerImpl::sInstance; -void HandleIncomingBleConnection(BLEEndPoint * bleEP) -{ - ChipLogProgress(DeviceLayer, "CHIPoBluez con rcvd"); -} - CHIP_ERROR BLEManagerImpl::_Init() { CHIP_ERROR err; @@ -99,8 +94,6 @@ CHIP_ERROR BLEManagerImpl::_Init() memset(mDeviceName, 0, sizeof(mDeviceName)); - OnChipBleConnectReceived = HandleIncomingBleConnection; - DeviceLayer::SystemLayer().ScheduleLambda([this] { DriveBLEState(); }); exit: diff --git a/src/platform/Linux/BLEManagerImpl.h b/src/platform/Linux/BLEManagerImpl.h index e3f3e4186abb7e..200c987539c849 100644 --- a/src/platform/Linux/BLEManagerImpl.h +++ b/src/platform/Linux/BLEManagerImpl.h @@ -39,8 +39,6 @@ namespace chip { namespace DeviceLayer { namespace Internal { -void HandleIncomingBleConnection(Ble::BLEEndPoint * bleEP); - enum class BleScanState : uint8_t { kNotScanning, diff --git a/src/platform/cc13xx_26xx/BLEManagerImpl.cpp b/src/platform/cc13xx_26xx/BLEManagerImpl.cpp index e733184a9314f0..e8bb817a5ad48c 100644 --- a/src/platform/cc13xx_26xx/BLEManagerImpl.cpp +++ b/src/platform/cc13xx_26xx/BLEManagerImpl.cpp @@ -118,8 +118,7 @@ CHIP_ERROR BLEManagerImpl::_Init(void) mFlags.ClearAll().Set(Flags::kAdvertisingEnabled, CHIP_DEVICE_CONFIG_CHIPOBLE_ENABLE_ADVERTISING_AUTOSTART); mFlags.Set(Flags::kFastAdvertisingEnabled, true); - mServiceMode = ConnectivityManager::kCHIPoBLEServiceMode_Enabled; - OnChipBleConnectReceived = HandleIncomingBleConnection; + mServiceMode = ConnectivityManager::kCHIPoBLEServiceMode_Enabled; err = CreateEventHandler(); return err; @@ -367,11 +366,6 @@ bool BLEManagerImpl::SendReadResponse(BLE_CONNECTION_OBJECT conId, BLE_READ_REQU return false; } -void BLEManagerImpl::HandleIncomingBleConnection(BLEEndPoint * bleEP) -{ - BLEMGR_LOG("BLEMGR: HandleIncomingBleConnection"); -} - // ===== Helper Members that implement the Low level BLE Stack behavior. /********************************************************************* diff --git a/src/platform/cc13xx_26xx/cc13x4_26x4/BLEManagerImpl.h b/src/platform/cc13xx_26xx/cc13x4_26x4/BLEManagerImpl.h index b4cf4e26766835..16512930e9fa88 100644 --- a/src/platform/cc13xx_26xx/cc13x4_26x4/BLEManagerImpl.h +++ b/src/platform/cc13xx_26xx/cc13x4_26x4/BLEManagerImpl.h @@ -317,8 +317,6 @@ class BLEManagerImpl final : public BLEManager, private BleLayer, private BlePla void ClearPendingBLEParamUpdate(uint16_t connHandle); void UpdateBLERPA(void); - static void HandleIncomingBleConnection(Ble::BLEEndPoint * bleEP); - /* Static helper function */ static void EventHandler(void * arg); static CHIP_ERROR DriveBLEState(void); diff --git a/src/platform/webos/BLEManagerImpl.cpp b/src/platform/webos/BLEManagerImpl.cpp index 6d9726c9c94742..786ded0d3f4029 100644 --- a/src/platform/webos/BLEManagerImpl.cpp +++ b/src/platform/webos/BLEManagerImpl.cpp @@ -68,11 +68,6 @@ const ChipBleUUID ChipUUID_CHIPoBLEChar_TX = { { 0x18, 0xEE, 0x2E, 0xF5, 0x26, 0 BLEManagerImpl BLEManagerImpl::sInstance; -void HandleIncomingBleConnection(BLEEndPoint * bleEP) -{ - ChipLogProgress(DeviceLayer, "con rcvd"); -} - void BLEManagerImpl::InitConnectionData() { /* Initialize Hashmap */ @@ -115,8 +110,6 @@ CHIP_ERROR BLEManagerImpl::_Init() memset(mDeviceName, 0, sizeof(mDeviceName)); - OnChipBleConnectReceived = HandleIncomingBleConnection; - ret = MainLoop::Instance().Init(_BleInitialize); VerifyOrExit(ret != false, err = CHIP_ERROR_INTERNAL); diff --git a/src/platform/webos/BLEManagerImpl.h b/src/platform/webos/BLEManagerImpl.h index 7336f95c02409c..2bd4e6bcfd7adf 100644 --- a/src/platform/webos/BLEManagerImpl.h +++ b/src/platform/webos/BLEManagerImpl.h @@ -37,8 +37,6 @@ namespace chip { namespace DeviceLayer { namespace Internal { -void HandleIncomingBleConnection(Ble::BLEEndPoint * bleEP); - enum class BleScanState : uint8_t { kNotScanning, diff --git a/src/transport/raw/BLE.cpp b/src/transport/raw/BLE.cpp index 76123afd516415..811969ef0966ea 100644 --- a/src/transport/raw/BLE.cpp +++ b/src/transport/raw/BLE.cpp @@ -46,9 +46,8 @@ void BLEBase::ClearState() if (mBleLayer) { mBleLayer->CancelBleIncompleteConnection(); - mBleLayer->OnChipBleConnectReceived = nullptr; - mBleLayer->mBleTransport = nullptr; - mBleLayer = nullptr; + mBleLayer->mBleTransport = nullptr; + mBleLayer = nullptr; } if (mBleEndPoint) @@ -77,7 +76,6 @@ CHIP_ERROR BLEBase::Init(const BleListenParameters & param) { ChipLogDetail(Inet, "BLEBase::Init - not overriding transport"); } - mBleLayer->OnChipBleConnectReceived = nullptr; mState = State::kInitialized; From 8b21ecfa71c11012435e8d3ae8635581e5ab2a94 Mon Sep 17 00:00:00 2001 From: Wilbur - Schneider <82623798+wilbur-se@users.noreply.github.com> Date: Fri, 26 Apr 2024 01:03:43 +0800 Subject: [PATCH 040/124] set secs_since_valid_hangup larger than secs_since_valid_ping, otherwise the socket will be close directlly after 400s and no ping sent out (#33158) --- examples/common/websocket-server/WebSocketServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/common/websocket-server/WebSocketServer.cpp b/examples/common/websocket-server/WebSocketServer.cpp index 2f5fb9fd2bd0c9..402754d35d51f7 100644 --- a/examples/common/websocket-server/WebSocketServer.cpp +++ b/examples/common/websocket-server/WebSocketServer.cpp @@ -178,7 +178,7 @@ CHIP_ERROR WebSocketServer::Run(chip::Optional<uint16_t> port, WebSocketServerDe info.protocols = protocols; static const lws_retry_bo_t retry = { .secs_since_valid_ping = 400, - .secs_since_valid_hangup = 400, + .secs_since_valid_hangup = 420, }; info.retry_and_idle_policy = &retry; From 6d9dfe98f89760fed33f209aef9b8668b147862c Mon Sep 17 00:00:00 2001 From: Jakub Latusek <j.latusek@samsung.com> Date: Thu, 25 Apr 2024 20:22:21 +0200 Subject: [PATCH 041/124] Replace nl-unit-test with pigweed for system user_directed_commissioning (#33163) * user_directed_commissioning tests to pw * if 0 * update openiotsdk test list --------- Co-authored-by: Arkadiusz Bokowy <a.bokowy@samsung.com> --- .../tests/BUILD.gn | 5 +- .../tests/TestUdcMessages.cpp | 313 ++++++++---------- .../openiotsdk/unit-tests/test_components.txt | 1 + .../unit-tests/test_components_nl.txt | 1 - 4 files changed, 131 insertions(+), 189 deletions(-) diff --git a/src/protocols/user_directed_commissioning/tests/BUILD.gn b/src/protocols/user_directed_commissioning/tests/BUILD.gn index f536273f2e28ce..ee67f0492ece92 100644 --- a/src/protocols/user_directed_commissioning/tests/BUILD.gn +++ b/src/protocols/user_directed_commissioning/tests/BUILD.gn @@ -12,11 +12,10 @@ import("//build_overrides/build.gni") import("//build_overrides/chip.gni") -import("//build_overrides/nlunit_test.gni") import("${chip_root}/build/chip/chip_test_suite.gni") -chip_test_suite_using_nltest("tests") { +chip_test_suite("tests") { output_name = "libUserDirectedCommissioningTests" test_sources = [ "TestUdcMessages.cpp" ] @@ -24,9 +23,7 @@ chip_test_suite_using_nltest("tests") { public_deps = [ "${chip_root}/src/lib/core", "${chip_root}/src/lib/support", - "${chip_root}/src/lib/support:testing_nlunit", "${chip_root}/src/protocols", - "${nlunit_test_root}:nlunit-test", ] cflags = [ "-Wconversion" ] diff --git a/src/protocols/user_directed_commissioning/tests/TestUdcMessages.cpp b/src/protocols/user_directed_commissioning/tests/TestUdcMessages.cpp index 3d50682dee5dcf..9dd05083de6ced 100644 --- a/src/protocols/user_directed_commissioning/tests/TestUdcMessages.cpp +++ b/src/protocols/user_directed_commissioning/tests/TestUdcMessages.cpp @@ -1,6 +1,6 @@ #include <protocols/user_directed_commissioning/UserDirectedCommissioning.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> #include <lib/core/CHIPSafeCasts.h> #include <lib/dnssd/TxtFields.h> @@ -8,8 +8,6 @@ #include <lib/support/CHIPMem.h> #include <lib/support/CHIPMemString.h> #include <lib/support/CodeUtils.h> -#include <lib/support/UnitTestContext.h> -#include <lib/support/UnitTestRegistration.h> #include <transport/TransportMgr.h> #include <transport/raw/MessageHeader.h> #include <transport/raw/UDP.h> @@ -21,6 +19,13 @@ using namespace chip::Protocols::UserDirectedCommissioning; using namespace chip::Dnssd; using namespace chip::Dnssd::Internal; +struct TestUdcMessages : public ::testing::Test +{ + + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + ByteSpan GetSpan(char * key) { size_t len = strlen(key); @@ -57,20 +62,20 @@ class DLL_EXPORT TestCallback : public UserConfirmationProvider, public Instance using DeviceTransportMgr = TransportMgr<Transport::UDP>; -void TestUDCServerClients(nlTestSuite * inSuite, void * inContext) +TEST_F(TestUdcMessages, TestUDCServerClients) { UserDirectedCommissioningServer udcServer; const char * instanceName1 = "servertest1"; // test setting UDC Clients - NL_TEST_ASSERT(inSuite, nullptr == udcServer.GetUDCClients().FindUDCClientState(instanceName1)); + EXPECT_EQ(nullptr, udcServer.GetUDCClients().FindUDCClientState(instanceName1)); udcServer.SetUDCClientProcessingState((char *) instanceName1, UDCClientProcessingState::kUserDeclined); UDCClientState * state = udcServer.GetUDCClients().FindUDCClientState(instanceName1); - NL_TEST_EXIT_ON_FAILED_ASSERT(inSuite, nullptr != state); - NL_TEST_ASSERT(inSuite, UDCClientProcessingState::kUserDeclined == state->GetUDCClientProcessingState()); + ASSERT_NE(nullptr, state); + EXPECT_EQ(UDCClientProcessingState::kUserDeclined, state->GetUDCClientProcessingState()); } -void TestUDCServerUserConfirmationProvider(nlTestSuite * inSuite, void * inContext) +TEST_F(TestUdcMessages, TestUDCServerUserConfirmationProvider) { UserDirectedCommissioningServer udcServer; TestCallback testCallback; @@ -108,13 +113,13 @@ void TestUDCServerUserConfirmationProvider(nlTestSuite * inSuite, void * inConte udcServer.OnCommissionableNodeFound(discNodeData2); udcServer.OnCommissionableNodeFound(discNodeData1); state = udcServer.GetUDCClients().FindUDCClientState(instanceName1); - NL_TEST_EXIT_ON_FAILED_ASSERT(inSuite, nullptr != state); - NL_TEST_ASSERT(inSuite, UDCClientProcessingState::kUserDeclined == state->GetUDCClientProcessingState()); + ASSERT_NE(nullptr, state); + EXPECT_EQ(UDCClientProcessingState::kUserDeclined, state->GetUDCClientProcessingState()); // test other fields on UDCClientState - NL_TEST_ASSERT(inSuite, 0 == strcmp(state->GetInstanceName(), instanceName1)); + EXPECT_STREQ(state->GetInstanceName(), instanceName1); // check that instance2 was found state = udcServer.GetUDCClients().FindUDCClientState(instanceName2); - NL_TEST_ASSERT(inSuite, nullptr == state); + EXPECT_EQ(nullptr, state); // test current state check udcServer.SetUDCClientProcessingState((char *) instanceName1, UDCClientProcessingState::kUserDeclined); @@ -122,28 +127,31 @@ void TestUDCServerUserConfirmationProvider(nlTestSuite * inSuite, void * inConte udcServer.OnCommissionableNodeFound(discNodeData2); udcServer.OnCommissionableNodeFound(discNodeData1); state = udcServer.GetUDCClients().FindUDCClientState(instanceName1); - NL_TEST_EXIT_ON_FAILED_ASSERT(inSuite, nullptr != state); - NL_TEST_ASSERT(inSuite, UDCClientProcessingState::kUserDeclined == state->GetUDCClientProcessingState()); + ASSERT_NE(nullptr, state); + EXPECT_EQ(UDCClientProcessingState::kUserDeclined, state->GetUDCClientProcessingState()); state = udcServer.GetUDCClients().FindUDCClientState(instanceName2); - NL_TEST_EXIT_ON_FAILED_ASSERT(inSuite, nullptr != state); - NL_TEST_ASSERT(inSuite, UDCClientProcessingState::kPromptingUser == state->GetUDCClientProcessingState()); + ASSERT_NE(nullptr, state); + EXPECT_EQ(UDCClientProcessingState::kPromptingUser, state->GetUDCClientProcessingState()); // test other fields on UDCClientState - NL_TEST_ASSERT(inSuite, 0 == strcmp(state->GetInstanceName(), instanceName2)); - NL_TEST_ASSERT(inSuite, 0 == strcmp(state->GetDeviceName(), deviceName2)); - NL_TEST_ASSERT(inSuite, state->GetLongDiscriminator() == disc2); + EXPECT_STREQ(state->GetInstanceName(), instanceName2); + EXPECT_STREQ(state->GetDeviceName(), deviceName2); + EXPECT_EQ(state->GetLongDiscriminator(), disc2); // test non-empty UserConfirmationProvider udcServer.SetUserConfirmationProvider(&testCallback); udcServer.SetUDCClientProcessingState((char *) instanceName1, UDCClientProcessingState::kUserDeclined); udcServer.SetUDCClientProcessingState((char *) instanceName2, UDCClientProcessingState::kDiscoveringNode); udcServer.OnCommissionableNodeFound(discNodeData1); - NL_TEST_ASSERT(inSuite, !testCallback.mOnUserDirectedCommissioningRequestCalled); + EXPECT_FALSE(testCallback.mOnUserDirectedCommissioningRequestCalled); udcServer.OnCommissionableNodeFound(discNodeData2); - NL_TEST_ASSERT(inSuite, testCallback.mOnUserDirectedCommissioningRequestCalled); - NL_TEST_ASSERT(inSuite, 0 == strcmp(testCallback.mState.GetInstanceName(), instanceName2)); + EXPECT_TRUE(testCallback.mOnUserDirectedCommissioningRequestCalled); + EXPECT_STREQ(testCallback.mState.GetInstanceName(), instanceName2); } -void TestUDCServerInstanceNameResolver(nlTestSuite * inSuite, void * inContext) +#if 0 +// TODO Fix test below +// the following test case is not reliable (fails on mac, clang platforms for example) +TEST_F(TestUdcMessages, TestUDCServerInstanceNameResolver) { UserDirectedCommissioningServer udcServer; UserDirectedCommissioningClient udcClient; @@ -175,11 +183,11 @@ void TestUDCServerInstanceNameResolver(nlTestSuite * inSuite, void * inContext) // check if the state is set for the instance name sent state = udcServer.GetUDCClients().FindUDCClientState(nameBuffer); - NL_TEST_EXIT_ON_FAILED_ASSERT(inSuite, nullptr != state); - NL_TEST_ASSERT(inSuite, UDCClientProcessingState::kDiscoveringNode == state->GetUDCClientProcessingState()); + ASSERT_NE(nullptr, state); + EXPECT_EQ(UDCClientProcessingState::kDiscoveringNode, state->GetUDCClientProcessingState()); // check if a callback happened - NL_TEST_ASSERT(inSuite, testCallback.mFindCommissionableNodeCalled); + EXPECT_TRUE(testCallback.mFindCommissionableNodeCalled); // reset callback tracker so we can confirm that when the // same instance name is received, there is no callback @@ -194,7 +202,7 @@ void TestUDCServerInstanceNameResolver(nlTestSuite * inSuite, void * inContext) mUdcTransportMgr->HandleMessageReceived(peerAddress, std::move(payloadBuf)); // verify it was not called - NL_TEST_ASSERT(inSuite, !testCallback.mFindCommissionableNodeCalled); + EXPECT_FALSE(testCallback.mFindCommissionableNodeCalled); // next, reset the cache state and confirm the callback udcServer.ResetUDCClientProcessingStates(); @@ -208,10 +216,12 @@ void TestUDCServerInstanceNameResolver(nlTestSuite * inSuite, void * inContext) mUdcTransportMgr->HandleMessageReceived(peerAddress, std::move(payloadBuf)); // verify it was called - NL_TEST_ASSERT(inSuite, testCallback.mFindCommissionableNodeCalled); + EXPECT_TRUE(testCallback.mFindCommissionableNodeCalled); } -void TestUserDirectedCommissioningClientMessage(nlTestSuite * inSuite, void * inContext) +#endif + +TEST_F(TestUdcMessages, TestUserDirectedCommissioningClientMessage) { char nameBuffer[Dnssd::Commission::kInstanceNameMaxLength + 1] = "Chris"; System::PacketBufferHandle payloadBuf = MessagePacketBuffer::NewWithData(nameBuffer, strlen(nameBuffer)); @@ -223,15 +233,15 @@ void TestUserDirectedCommissioningClientMessage(nlTestSuite * inSuite, void * in // check the packet header fields PacketHeader packetHeader; packetHeader.DecodeAndConsume(payloadBuf); - NL_TEST_ASSERT(inSuite, !packetHeader.IsEncrypted()); + EXPECT_FALSE(packetHeader.IsEncrypted()); // check the payload header fields PayloadHeader payloadHeader; payloadHeader.DecodeAndConsume(payloadBuf); - NL_TEST_ASSERT(inSuite, payloadHeader.GetMessageType() == to_underlying(MsgType::IdentificationDeclaration)); - NL_TEST_ASSERT(inSuite, payloadHeader.GetProtocolID() == Protocols::UserDirectedCommissioning::Id); - NL_TEST_ASSERT(inSuite, !payloadHeader.NeedsAck()); - NL_TEST_ASSERT(inSuite, payloadHeader.IsInitiator()); + EXPECT_EQ(payloadHeader.GetMessageType(), to_underlying(MsgType::IdentificationDeclaration)); + EXPECT_EQ(payloadHeader.GetProtocolID(), Protocols::UserDirectedCommissioning::Id); + EXPECT_FALSE(payloadHeader.NeedsAck()); + EXPECT_TRUE(payloadHeader.IsInitiator()); // check the payload char instanceName[Dnssd::Commission::kInstanceNameMaxLength + 1]; @@ -239,13 +249,13 @@ void TestUserDirectedCommissioningClientMessage(nlTestSuite * inSuite, void * in payloadBuf->Read(Uint8::from_char(instanceName), instanceNameLength); instanceName[instanceNameLength] = '\0'; ChipLogProgress(Inet, "UDC instance=%s", instanceName); - NL_TEST_ASSERT(inSuite, strcmp(instanceName, nameBuffer) == 0); + EXPECT_STREQ(instanceName, nameBuffer); // verify no errors - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); } -void TestUDCClients(nlTestSuite * inSuite, void * inContext) +TEST_F(TestUdcMessages, TestUDCClients) { UDCClients<3> mUdcClients; const char * instanceName1 = "test1"; @@ -255,39 +265,39 @@ void TestUDCClients(nlTestSuite * inSuite, void * inContext) // test base case UDCClientState * state = mUdcClients.FindUDCClientState(instanceName1); - NL_TEST_ASSERT(inSuite, state == nullptr); + ASSERT_EQ(state, nullptr); // test max size - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == mUdcClients.CreateNewUDCClientState(instanceName1, &state)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == mUdcClients.CreateNewUDCClientState(instanceName2, &state)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == mUdcClients.CreateNewUDCClientState(instanceName3, &state)); - NL_TEST_ASSERT(inSuite, CHIP_ERROR_NO_MEMORY == mUdcClients.CreateNewUDCClientState(instanceName4, &state)); + EXPECT_EQ(CHIP_NO_ERROR, mUdcClients.CreateNewUDCClientState(instanceName1, &state)); + EXPECT_EQ(CHIP_NO_ERROR, mUdcClients.CreateNewUDCClientState(instanceName2, &state)); + EXPECT_EQ(CHIP_NO_ERROR, mUdcClients.CreateNewUDCClientState(instanceName3, &state)); + EXPECT_EQ(CHIP_ERROR_NO_MEMORY, mUdcClients.CreateNewUDCClientState(instanceName4, &state)); // test reset mUdcClients.ResetUDCClientStates(); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == mUdcClients.CreateNewUDCClientState(instanceName4, &state)); + EXPECT_EQ(CHIP_NO_ERROR, mUdcClients.CreateNewUDCClientState(instanceName4, &state)); // test find - NL_TEST_ASSERT(inSuite, nullptr == mUdcClients.FindUDCClientState(instanceName1)); - NL_TEST_ASSERT(inSuite, nullptr == mUdcClients.FindUDCClientState(instanceName2)); - NL_TEST_ASSERT(inSuite, nullptr == mUdcClients.FindUDCClientState(instanceName3)); + EXPECT_EQ(nullptr, mUdcClients.FindUDCClientState(instanceName1)); + EXPECT_EQ(nullptr, mUdcClients.FindUDCClientState(instanceName2)); + EXPECT_EQ(nullptr, mUdcClients.FindUDCClientState(instanceName3)); state = mUdcClients.FindUDCClientState(instanceName4); - NL_TEST_ASSERT(inSuite, nullptr != state); + ASSERT_NE(nullptr, state); // test expiry state->Reset(); - NL_TEST_ASSERT(inSuite, nullptr == mUdcClients.FindUDCClientState(instanceName4)); + EXPECT_EQ(nullptr, mUdcClients.FindUDCClientState(instanceName4)); // test re-activation - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == mUdcClients.CreateNewUDCClientState(instanceName4, &state)); + EXPECT_EQ(CHIP_NO_ERROR, mUdcClients.CreateNewUDCClientState(instanceName4, &state)); System::Clock::Timestamp expirationTime = state->GetExpirationTime(); state->SetExpirationTime(expirationTime - System::Clock::Milliseconds64(1)); - NL_TEST_ASSERT(inSuite, (expirationTime - System::Clock::Milliseconds64(1)) == state->GetExpirationTime()); + EXPECT_EQ((expirationTime - System::Clock::Milliseconds64(1)), state->GetExpirationTime()); mUdcClients.MarkUDCClientActive(state); - NL_TEST_ASSERT(inSuite, (expirationTime - System::Clock::Milliseconds64(1)) < state->GetExpirationTime()); + EXPECT_LT((expirationTime - System::Clock::Milliseconds64(1)), state->GetExpirationTime()); } -void TestUDCClientState(nlTestSuite * inSuite, void * inContext) +TEST_F(TestUdcMessages, TestUDCClientState) { UDCClients<3> mUdcClients; const char * instanceName1 = "test1"; @@ -318,56 +328,56 @@ void TestUDCClientState(nlTestSuite * inSuite, void * inContext) rotatingIdLongLen = Encoding::HexToBytes(reinterpret_cast<const char *>(value.data()), value.size(), rotatingIdLong, chip::Dnssd::kMaxRotatingIdLen * 2); - NL_TEST_ASSERT(inSuite, rotatingIdLongLen > chip::Dnssd::kMaxRotatingIdLen); + EXPECT_GT(rotatingIdLongLen, chip::Dnssd::kMaxRotatingIdLen); // test base case UDCClientState * state = mUdcClients.FindUDCClientState(instanceName1); - NL_TEST_ASSERT(inSuite, state == nullptr); + ASSERT_EQ(state, nullptr); // add a default state - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == mUdcClients.CreateNewUDCClientState(instanceName1, &state)); + EXPECT_EQ(CHIP_NO_ERROR, mUdcClients.CreateNewUDCClientState(instanceName1, &state)); // get the state state = mUdcClients.FindUDCClientState(instanceName1); - NL_TEST_EXIT_ON_FAILED_ASSERT(inSuite, nullptr != state); - NL_TEST_ASSERT(inSuite, strcmp(state->GetInstanceName(), instanceName1) == 0); + ASSERT_NE(nullptr, state); + EXPECT_STREQ(state->GetInstanceName(), instanceName1); state->SetPeerAddress(chip::Transport::PeerAddress::UDP(address, port)); - NL_TEST_ASSERT(inSuite, port == state->GetPeerAddress().GetPort()); + EXPECT_EQ(port, state->GetPeerAddress().GetPort()); state->SetDeviceName(deviceName); - NL_TEST_ASSERT(inSuite, strcmp(state->GetDeviceName(), deviceName) == 0); + EXPECT_STREQ(state->GetDeviceName(), deviceName); state->SetLongDiscriminator(longDiscriminator); - NL_TEST_ASSERT(inSuite, longDiscriminator == state->GetLongDiscriminator()); + EXPECT_EQ(longDiscriminator, state->GetLongDiscriminator()); state->SetVendorId(vendorId); - NL_TEST_ASSERT(inSuite, vendorId == state->GetVendorId()); + EXPECT_EQ(vendorId, state->GetVendorId()); state->SetProductId(productId); - NL_TEST_ASSERT(inSuite, productId == state->GetProductId()); + EXPECT_EQ(productId, state->GetProductId()); state->SetRotatingId(rotatingId, rotatingIdLen); - NL_TEST_ASSERT(inSuite, rotatingIdLen == state->GetRotatingIdLength()); + EXPECT_EQ(rotatingIdLen, state->GetRotatingIdLength()); const uint8_t * testRotatingId = state->GetRotatingId(); for (size_t i = 0; i < rotatingIdLen; i++) { - NL_TEST_ASSERT(inSuite, testRotatingId[i] == rotatingId[i]); + EXPECT_EQ(testRotatingId[i], rotatingId[i]); } state->SetRotatingId(rotatingIdLong, rotatingIdLongLen); - NL_TEST_ASSERT(inSuite, chip::Dnssd::kMaxRotatingIdLen == state->GetRotatingIdLength()); + EXPECT_EQ(chip::Dnssd::kMaxRotatingIdLen, state->GetRotatingIdLength()); const uint8_t * testRotatingIdLong = state->GetRotatingId(); for (size_t i = 0; i < chip::Dnssd::kMaxRotatingIdLen; i++) { - NL_TEST_ASSERT(inSuite, testRotatingIdLong[i] == rotatingIdLong[i]); + EXPECT_EQ(testRotatingIdLong[i], rotatingIdLong[i]); } } -void TestUDCIdentificationDeclaration(nlTestSuite * inSuite, void * inContext) +TEST_F(TestUdcMessages, TestUDCIdentificationDeclaration) { IdentificationDeclaration id; IdentificationDeclaration idOut; @@ -416,25 +426,25 @@ void TestUDCIdentificationDeclaration(nlTestSuite * inSuite, void * inContext) id.SetCommissionerPasscode(true); id.SetCommissionerPasscodeReady(true); - NL_TEST_ASSERT(inSuite, id.HasDiscoveryInfo()); - NL_TEST_ASSERT(inSuite, strcmp(id.GetInstanceName(), instanceName) == 0); - NL_TEST_ASSERT(inSuite, vendorId == id.GetVendorId()); - NL_TEST_ASSERT(inSuite, productId == id.GetProductId()); - NL_TEST_ASSERT(inSuite, port == id.GetCdPort()); - NL_TEST_ASSERT(inSuite, strcmp(id.GetDeviceName(), deviceName) == 0); - NL_TEST_ASSERT(inSuite, rotatingIdLen == id.GetRotatingIdLength()); - NL_TEST_ASSERT(inSuite, memcmp(id.GetRotatingId(), rotatingId, rotatingIdLen) == 0); - NL_TEST_ASSERT(inSuite, pairingHint == id.GetPairingHint()); - NL_TEST_ASSERT(inSuite, strcmp(id.GetPairingInst(), pairingInst) == 0); - - NL_TEST_ASSERT(inSuite, id.GetNumTargetAppInfos() == 3); - NL_TEST_ASSERT(inSuite, id.GetTargetAppInfo(0, appInfo) && appInfo.vendorId == 1 && appInfo.productId == 9); - NL_TEST_ASSERT(inSuite, id.GetTargetAppInfo(1, appInfo) && appInfo.vendorId == 2 && appInfo.productId == 8); - NL_TEST_ASSERT(inSuite, id.GetTargetAppInfo(2, appInfo) && appInfo.vendorId == 3 && appInfo.productId == 7); - NL_TEST_ASSERT(inSuite, id.GetNoPasscode() == true); - NL_TEST_ASSERT(inSuite, id.GetCdUponPasscodeDialog() == true); - NL_TEST_ASSERT(inSuite, id.GetCommissionerPasscode() == true); - NL_TEST_ASSERT(inSuite, id.GetCommissionerPasscodeReady() == true); + EXPECT_TRUE(id.HasDiscoveryInfo()); + EXPECT_STREQ(id.GetInstanceName(), instanceName); + EXPECT_EQ(vendorId, id.GetVendorId()); + EXPECT_EQ(productId, id.GetProductId()); + EXPECT_EQ(port, id.GetCdPort()); + EXPECT_STREQ(id.GetDeviceName(), deviceName); + EXPECT_EQ(rotatingIdLen, id.GetRotatingIdLength()); + EXPECT_EQ(memcmp(id.GetRotatingId(), rotatingId, rotatingIdLen), 0); + EXPECT_EQ(pairingHint, id.GetPairingHint()); + EXPECT_STREQ(id.GetPairingInst(), pairingInst); + + EXPECT_EQ(id.GetNumTargetAppInfos(), 3); + EXPECT_TRUE(id.GetTargetAppInfo(0, appInfo) && appInfo.vendorId == 1 && appInfo.productId == 9); + EXPECT_TRUE(id.GetTargetAppInfo(1, appInfo) && appInfo.vendorId == 2 && appInfo.productId == 8); + EXPECT_TRUE(id.GetTargetAppInfo(2, appInfo) && appInfo.vendorId == 3 && appInfo.productId == 7); + EXPECT_EQ(id.GetNoPasscode(), true); + EXPECT_EQ(id.GetCdUponPasscodeDialog(), true); + EXPECT_EQ(id.GetCommissionerPasscode(), true); + EXPECT_EQ(id.GetCommissionerPasscodeReady(), true); // TODO: add an ip @@ -444,32 +454,32 @@ void TestUDCIdentificationDeclaration(nlTestSuite * inSuite, void * inContext) // next, parse this object idOut.ReadPayload(idBuffer, sizeof(idBuffer)); - NL_TEST_ASSERT(inSuite, idOut.HasDiscoveryInfo()); - NL_TEST_ASSERT(inSuite, strcmp(idOut.GetInstanceName(), instanceName) == 0); - NL_TEST_ASSERT(inSuite, vendorId == idOut.GetVendorId()); - NL_TEST_ASSERT(inSuite, productId == idOut.GetProductId()); - NL_TEST_ASSERT(inSuite, port == idOut.GetCdPort()); - NL_TEST_ASSERT(inSuite, strcmp(idOut.GetDeviceName(), deviceName) == 0); - NL_TEST_ASSERT(inSuite, rotatingIdLen == idOut.GetRotatingIdLength()); - NL_TEST_ASSERT(inSuite, memcmp(idOut.GetRotatingId(), rotatingId, rotatingIdLen) == 0); - NL_TEST_ASSERT(inSuite, strcmp(idOut.GetPairingInst(), pairingInst) == 0); - NL_TEST_ASSERT(inSuite, pairingHint == idOut.GetPairingHint()); - - NL_TEST_ASSERT(inSuite, id.GetNumTargetAppInfos() == idOut.GetNumTargetAppInfos()); - NL_TEST_ASSERT(inSuite, idOut.GetTargetAppInfo(0, appInfo) && appInfo.vendorId == 1 && appInfo.productId == 9); - NL_TEST_ASSERT(inSuite, idOut.GetTargetAppInfo(1, appInfo) && appInfo.vendorId == 2 && appInfo.productId == 8); - NL_TEST_ASSERT(inSuite, idOut.GetTargetAppInfo(2, appInfo) && appInfo.vendorId == 3 && appInfo.productId == 7); - - NL_TEST_ASSERT(inSuite, id.GetNoPasscode() == idOut.GetNoPasscode()); - NL_TEST_ASSERT(inSuite, id.GetCdUponPasscodeDialog() == idOut.GetCdUponPasscodeDialog()); - NL_TEST_ASSERT(inSuite, id.GetCommissionerPasscode() == idOut.GetCommissionerPasscode()); - NL_TEST_ASSERT(inSuite, id.GetCommissionerPasscodeReady() == idOut.GetCommissionerPasscodeReady()); + EXPECT_TRUE(idOut.HasDiscoveryInfo()); + EXPECT_STREQ(idOut.GetInstanceName(), instanceName); + EXPECT_EQ(vendorId, idOut.GetVendorId()); + EXPECT_EQ(productId, idOut.GetProductId()); + EXPECT_EQ(port, idOut.GetCdPort()); + EXPECT_STREQ(idOut.GetDeviceName(), deviceName); + EXPECT_EQ(rotatingIdLen, idOut.GetRotatingIdLength()); + EXPECT_EQ(memcmp(idOut.GetRotatingId(), rotatingId, rotatingIdLen), 0); + EXPECT_STREQ(idOut.GetPairingInst(), pairingInst); + EXPECT_EQ(pairingHint, idOut.GetPairingHint()); + + EXPECT_EQ(id.GetNumTargetAppInfos(), idOut.GetNumTargetAppInfos()); + EXPECT_TRUE(idOut.GetTargetAppInfo(0, appInfo) && appInfo.vendorId == 1 && appInfo.productId == 9); + EXPECT_TRUE(idOut.GetTargetAppInfo(1, appInfo) && appInfo.vendorId == 2 && appInfo.productId == 8); + EXPECT_TRUE(idOut.GetTargetAppInfo(2, appInfo) && appInfo.vendorId == 3 && appInfo.productId == 7); + + EXPECT_EQ(id.GetNoPasscode(), idOut.GetNoPasscode()); + EXPECT_EQ(id.GetCdUponPasscodeDialog(), idOut.GetCdUponPasscodeDialog()); + EXPECT_EQ(id.GetCommissionerPasscode(), idOut.GetCommissionerPasscode()); + EXPECT_EQ(id.GetCommissionerPasscodeReady(), idOut.GetCommissionerPasscodeReady()); // TODO: remove following "force-fail" debug line // NL_TEST_ASSERT(inSuite, rotatingIdLen != id.GetRotatingIdLength()); } -void TestUDCCommissionerDeclaration(nlTestSuite * inSuite, void * inContext) +TEST_F(TestUdcMessages, TestUDCCommissionerDeclaration) { CommissionerDeclaration id; CommissionerDeclaration idOut; @@ -483,12 +493,12 @@ void TestUDCCommissionerDeclaration(nlTestSuite * inSuite, void * inContext) id.SetCommissionerPasscode(true); id.SetQRCodeDisplayed(true); - NL_TEST_ASSERT(inSuite, errorCode == id.GetErrorCode()); - NL_TEST_ASSERT(inSuite, id.GetNeedsPasscode() == true); - NL_TEST_ASSERT(inSuite, id.GetNoAppsFound() == true); - NL_TEST_ASSERT(inSuite, id.GetPasscodeDialogDisplayed() == true); - NL_TEST_ASSERT(inSuite, id.GetCommissionerPasscode() == true); - NL_TEST_ASSERT(inSuite, id.GetQRCodeDisplayed() == true); + EXPECT_EQ(errorCode, id.GetErrorCode()); + EXPECT_EQ(id.GetNeedsPasscode(), true); + EXPECT_EQ(id.GetNoAppsFound(), true); + EXPECT_EQ(id.GetPasscodeDialogDisplayed(), true); + EXPECT_EQ(id.GetCommissionerPasscode(), true); + EXPECT_EQ(id.GetQRCodeDisplayed(), true); uint8_t idBuffer[500]; id.WritePayload(idBuffer, sizeof(idBuffer)); @@ -496,75 +506,10 @@ void TestUDCCommissionerDeclaration(nlTestSuite * inSuite, void * inContext) // next, parse this object idOut.ReadPayload(idBuffer, sizeof(idBuffer)); - NL_TEST_ASSERT(inSuite, errorCode == idOut.GetErrorCode()); - NL_TEST_ASSERT(inSuite, id.GetNeedsPasscode() == idOut.GetNeedsPasscode()); - NL_TEST_ASSERT(inSuite, id.GetNoAppsFound() == idOut.GetNoAppsFound()); - NL_TEST_ASSERT(inSuite, id.GetPasscodeDialogDisplayed() == idOut.GetPasscodeDialogDisplayed()); - NL_TEST_ASSERT(inSuite, id.GetCommissionerPasscode() == idOut.GetCommissionerPasscode()); - NL_TEST_ASSERT(inSuite, id.GetQRCodeDisplayed() == idOut.GetQRCodeDisplayed()); -} - -// Test Suite - -/** - * Test Suite that lists all the test functions. - */ -// clang-format off -static const nlTest sTests[] = -{ - NL_TEST_DEF("TestUDCServerClients", TestUDCServerClients), - NL_TEST_DEF("TestUDCServerUserConfirmationProvider", TestUDCServerUserConfirmationProvider), - // the following test case is not reliable (fails on mac, clang platforms for example) - // NL_TEST_DEF("TestUDCServerInstanceNameResolver", TestUDCServerInstanceNameResolver), - NL_TEST_DEF("TestUserDirectedCommissioningClientMessage", TestUserDirectedCommissioningClientMessage), - NL_TEST_DEF("TestUDCClients", TestUDCClients), - NL_TEST_DEF("TestUDCClientState", TestUDCClientState), - NL_TEST_DEF("TestUDCIdentificationDeclaration", TestUDCIdentificationDeclaration), - NL_TEST_DEF("TestUDCCommissionerDeclaration", TestUDCCommissionerDeclaration), - - NL_TEST_SENTINEL() -}; -// clang-format on - -/** - * Set up the test suite. - */ -static int TestSetup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - if (error != CHIP_NO_ERROR) - return FAILURE; - return SUCCESS; + EXPECT_EQ(errorCode, idOut.GetErrorCode()); + EXPECT_EQ(id.GetNeedsPasscode(), idOut.GetNeedsPasscode()); + EXPECT_EQ(id.GetNoAppsFound(), idOut.GetNoAppsFound()); + EXPECT_EQ(id.GetPasscodeDialogDisplayed(), idOut.GetPasscodeDialogDisplayed()); + EXPECT_EQ(id.GetCommissionerPasscode(), idOut.GetCommissionerPasscode()); + EXPECT_EQ(id.GetQRCodeDisplayed(), idOut.GetQRCodeDisplayed()); } - -/** - * Tear down the test suite. - */ -static int TestTeardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - -// clang-format off -static nlTestSuite sSuite = -{ - "Test-CHIP-UdcMessages", - &sTests[0], - TestSetup, - TestTeardown, -}; -// clang-format on - -/** - * Main - */ -int TestUdcMessages() -{ - // Run test suit against one context - nlTestRunner(&sSuite, nullptr); - - return (nlTestRunnerStats(&sSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestUdcMessages) diff --git a/src/test_driver/openiotsdk/unit-tests/test_components.txt b/src/test_driver/openiotsdk/unit-tests/test_components.txt index 4a61ab84fd3a60..bb108309ba1728 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components.txt @@ -14,3 +14,4 @@ RetransmitTests TestShell SetupPayloadTests SupportTests +UserDirectedCommissioningTests 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 64f1862acfdf6a..de9e40de4b5253 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt @@ -7,4 +7,3 @@ SecureChannelTests SetupPayloadTestsNL SupportTestsNL TransportLayerTests -UserDirectedCommissioningTests \ No newline at end of file From f9a36014fa94c52a8a414b24c62ccff0c081623e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arkadiusz=20Ba=C5=82ys?= <arkadiusz.balys@nordicsemi.no> Date: Thu, 25 Apr 2024 20:40:27 +0200 Subject: [PATCH 042/124] [crypto] PSA SPAKE2+ introduction (#32924) * [crypto] Add PSA SPAKE2+ implementation Implement Matter's SPAKE2+ protocol using PSA crypto API. Use the PSA implementation in PASE session for nRF Connect platform. Signed-off-by: Damian Krolik <damian.krolik@nordicsemi.no> * [crypto] Spake2+ alignments regarding the newest PSA version Aligned Spake2+ algorithm to the newest PSA Crypto API version that allows useing the psa_pake_get_shared_key function. * Alignments to the Matter Core. Restyled by gn --------- Signed-off-by: Damian Krolik <damian.krolik@nordicsemi.no> Co-authored-by: Damian Krolik <damian.krolik@nordicsemi.no> --- config/nrfconnect/chip-module/CMakeLists.txt | 3 +- .../nrfconnect/chip-module/Kconfig.defaults | 1 + src/crypto/BUILD.gn | 8 + src/crypto/CHIPCryptoPAL.cpp | 2 +- src/crypto/CHIPCryptoPAL.h | 2 +- src/crypto/CHIPCryptoPALPSA.h | 2 +- src/crypto/PSASessionKeystore.cpp | 2 +- src/crypto/PSASpake2p.cpp | 201 ++++++++++++++++++ src/crypto/PSASpake2p.h | 166 +++++++++++++++ src/crypto/crypto.gni | 6 + src/protocols/secure_channel/CASESession.cpp | 2 +- src/protocols/secure_channel/CASESession.h | 2 +- src/protocols/secure_channel/PASESession.cpp | 2 +- src/protocols/secure_channel/PASESession.h | 9 +- src/protocols/secure_channel/PairingSession.h | 2 +- .../tests/TestPairingSession.cpp | 2 +- 16 files changed, 401 insertions(+), 11 deletions(-) create mode 100644 src/crypto/PSASpake2p.cpp create mode 100644 src/crypto/PSASpake2p.h diff --git a/config/nrfconnect/chip-module/CMakeLists.txt b/config/nrfconnect/chip-module/CMakeLists.txt index 98295406628cc1..51ca4689de1ca1 100644 --- a/config/nrfconnect/chip-module/CMakeLists.txt +++ b/config/nrfconnect/chip-module/CMakeLists.txt @@ -168,7 +168,8 @@ else() endif() if (CONFIG_CHIP_CRYPTO_PSA) - matter_add_gn_arg_string("chip_crypto" "psa") + matter_add_gn_arg_string("chip_crypto" "psa") + matter_add_gn_arg_bool ("chip_crypto_psa_spake2p" CONFIG_PSA_WANT_ALG_SPAKE2P_MATTER) endif() if (BOARD STREQUAL "native_posix") diff --git a/config/nrfconnect/chip-module/Kconfig.defaults b/config/nrfconnect/chip-module/Kconfig.defaults index d7bcfbd2fb0516..562755b14b9c25 100644 --- a/config/nrfconnect/chip-module/Kconfig.defaults +++ b/config/nrfconnect/chip-module/Kconfig.defaults @@ -298,6 +298,7 @@ config MBEDTLS_HEAP_SIZE config CHIP_CRYPTO_PSA default y if !CHIP_WIFI + imply PSA_WANT_ALG_SPAKE2P_MATTER if CHIP_CRYPTO_PSA diff --git a/src/crypto/BUILD.gn b/src/crypto/BUILD.gn index bfd633947c903d..1fb8b94f39a82f 100644 --- a/src/crypto/BUILD.gn +++ b/src/crypto/BUILD.gn @@ -51,6 +51,7 @@ buildconfig_header("crypto_buildconfig") { defines = [ "CHIP_CRYPTO_MBEDTLS=${chip_crypto_mbedtls}", "CHIP_CRYPTO_PSA=${chip_crypto_psa}", + "CHIP_CRYPTO_PSA_SPAKE2P=${chip_crypto_psa_spake2p}", "CHIP_CRYPTO_OPENSSL=${chip_crypto_openssl}", "CHIP_CRYPTO_BORINGSSL=${chip_crypto_boringssl}", "CHIP_CRYPTO_PLATFORM=${chip_crypto_platform}", @@ -156,6 +157,13 @@ static_library("crypto") { ] } + if (chip_crypto_psa_spake2p) { + sources += [ + "PSASpake2p.cpp", + "PSASpake2p.h", + ] + } + public_configs = [] cflags = [ "-Wconversion" ] diff --git a/src/crypto/CHIPCryptoPAL.cpp b/src/crypto/CHIPCryptoPAL.cpp index 3e58db3a480ba9..fa84d786b8eabb 100644 --- a/src/crypto/CHIPCryptoPAL.cpp +++ b/src/crypto/CHIPCryptoPAL.cpp @@ -501,7 +501,7 @@ CHIP_ERROR Spake2p::KeyConfirm(const uint8_t * in, size_t in_len) return CHIP_NO_ERROR; } -CHIP_ERROR Spake2p::GetKeys(SessionKeystore & keystore, HkdfKeyHandle & key) const +CHIP_ERROR Spake2p::GetKeys(SessionKeystore & keystore, HkdfKeyHandle & key) { VerifyOrReturnError(state == CHIP_SPAKE2P_STATE::KC, CHIP_ERROR_INTERNAL); diff --git a/src/crypto/CHIPCryptoPAL.h b/src/crypto/CHIPCryptoPAL.h index 74b7f363d4fb7e..80611e93d12d88 100644 --- a/src/crypto/CHIPCryptoPAL.h +++ b/src/crypto/CHIPCryptoPAL.h @@ -1216,7 +1216,7 @@ class Spake2p * * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise **/ - CHIP_ERROR GetKeys(SessionKeystore & keystore, HkdfKeyHandle & key) const; + CHIP_ERROR GetKeys(SessionKeystore & keystore, HkdfKeyHandle & key); CHIP_ERROR InternalHash(const uint8_t * in, size_t in_len); CHIP_ERROR WriteMN(); diff --git a/src/crypto/CHIPCryptoPALPSA.h b/src/crypto/CHIPCryptoPALPSA.h index 101a6d0b26568b..2f91b3b4d49765 100644 --- a/src/crypto/CHIPCryptoPALPSA.h +++ b/src/crypto/CHIPCryptoPALPSA.h @@ -146,7 +146,7 @@ class PsaKdf private: CHIP_ERROR InitOperation(psa_key_id_t hkdfKey, const ByteSpan & salt, const ByteSpan & info); - psa_key_id_t mSecretKeyId = 0; + psa_key_id_t mSecretKeyId = PSA_KEY_ID_NULL; psa_key_derivation_operation_t mOperation = PSA_KEY_DERIVATION_OPERATION_INIT; }; diff --git a/src/crypto/PSASessionKeystore.cpp b/src/crypto/PSASessionKeystore.cpp index 7a0fc4af106b46..0ae3ed50755495 100644 --- a/src/crypto/PSASessionKeystore.cpp +++ b/src/crypto/PSASessionKeystore.cpp @@ -188,7 +188,7 @@ void PSASessionKeystore::DestroyKey(HkdfKeyHandle & key) auto & keyId = key.AsMutable<psa_key_id_t>(); psa_destroy_key(keyId); - keyId = 0; + keyId = PSA_KEY_ID_NULL; } } // namespace Crypto diff --git a/src/crypto/PSASpake2p.cpp b/src/crypto/PSASpake2p.cpp new file mode 100644 index 00000000000000..ae98b083c8a812 --- /dev/null +++ b/src/crypto/PSASpake2p.cpp @@ -0,0 +1,201 @@ +/* + * 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 "PSASpake2p.h" + +#include "CHIPCryptoPALPSA.h" + +#include <lib/support/CodeUtils.h> + +#include <psa/crypto.h> + +namespace chip { +namespace Crypto { + +CHIP_ERROR PSASpake2p_P256_SHA256_HKDF_HMAC::Init(const uint8_t * context, size_t context_len) +{ + Clear(); + + VerifyOrReturnError(context_len <= sizeof(mContext), CHIP_ERROR_BUFFER_TOO_SMALL); + + memcpy(mContext, context, context_len); + mContextLen = context_len; + + return CHIP_NO_ERROR; +} + +void PSASpake2p_P256_SHA256_HKDF_HMAC::Clear() +{ + IgnoreUnusedVariable(psa_pake_abort(&mOperation)); + mOperation = psa_pake_operation_init(); + + IgnoreUnusedVariable(psa_destroy_key(mKey)); + mKey = PSA_KEY_ID_NULL; +} + +CHIP_ERROR PSASpake2p_P256_SHA256_HKDF_HMAC::BeginVerifier(const uint8_t * my_identity, size_t my_identity_len, + const uint8_t * peer_identity, size_t peer_identity_len, + const uint8_t * w0in, size_t w0in_len, const uint8_t * Lin, + size_t Lin_len) +{ + VerifyOrReturnError(w0in_len <= kSpake2p_WS_Length, CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrReturnError(Lin_len == kP256_Point_Length, CHIP_ERROR_INVALID_ARGUMENT); + + uint8_t password[kSpake2p_WS_Length + kP256_Point_Length]; + psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + psa_pake_cipher_suite_t cp = PSA_PAKE_CIPHER_SUITE_INIT; + + psa_pake_cs_set_algorithm(&cp, PSA_ALG_SPAKE2P_MATTER); + psa_pake_cs_set_primitive(&cp, PSA_PAKE_PRIMITIVE(PSA_PAKE_PRIMITIVE_TYPE_ECC, PSA_ECC_FAMILY_SECP_R1, 256)); + + memcpy(password + 0, w0in, w0in_len); + memcpy(password + w0in_len, Lin, Lin_len); + psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DERIVE); + psa_set_key_algorithm(&attributes, PSA_ALG_SPAKE2P_MATTER); + psa_set_key_type(&attributes, PSA_KEY_TYPE_SPAKE2P_PUBLIC_KEY(PSA_ECC_FAMILY_SECP_R1)); + + psa_status_t status = psa_import_key(&attributes, password, w0in_len + Lin_len, &mKey); + + psa_reset_key_attributes(&attributes); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + status = psa_pake_setup(&mOperation, mKey, &cp); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + mRole = PSA_PAKE_ROLE_SERVER; + status = psa_pake_set_role(&mOperation, PSA_PAKE_ROLE_SERVER); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + status = psa_pake_set_peer(&mOperation, peer_identity, peer_identity_len); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + status = psa_pake_set_user(&mOperation, my_identity, my_identity_len); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + status = psa_pake_set_context(&mOperation, mContext, mContextLen); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR PSASpake2p_P256_SHA256_HKDF_HMAC::BeginProver(const uint8_t * my_identity, size_t my_identity_len, + const uint8_t * peer_identity, size_t peer_identity_len, + const uint8_t * w0in, size_t w0in_len, const uint8_t * w1in, + size_t w1in_len) +{ + VerifyOrReturnError(w0in_len <= kSpake2p_WS_Length, CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrReturnError(w1in_len <= kSpake2p_WS_Length, CHIP_ERROR_INVALID_ARGUMENT); + + uint8_t password[kSpake2p_WS_Length * 2]; + psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + psa_pake_cipher_suite_t cp = PSA_PAKE_CIPHER_SUITE_INIT; + + psa_pake_cs_set_algorithm(&cp, PSA_ALG_SPAKE2P_MATTER); + psa_pake_cs_set_primitive(&cp, PSA_PAKE_PRIMITIVE(PSA_PAKE_PRIMITIVE_TYPE_ECC, PSA_ECC_FAMILY_SECP_R1, 256)); + + memcpy(password + 0, w0in, w0in_len); + memcpy(password + w0in_len, w1in, w1in_len); + psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DERIVE); + psa_set_key_algorithm(&attributes, PSA_ALG_SPAKE2P_MATTER); + psa_set_key_type(&attributes, PSA_KEY_TYPE_SPAKE2P_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1)); + + psa_status_t status = psa_import_key(&attributes, password, w0in_len + w1in_len, &mKey); + + psa_reset_key_attributes(&attributes); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + status = psa_pake_setup(&mOperation, mKey, &cp); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + mRole = PSA_PAKE_ROLE_CLIENT; + status = psa_pake_set_role(&mOperation, PSA_PAKE_ROLE_CLIENT); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + status = psa_pake_set_user(&mOperation, my_identity, my_identity_len); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + status = psa_pake_set_peer(&mOperation, peer_identity, peer_identity_len); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + status = psa_pake_set_context(&mOperation, mContext, mContextLen); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR PSASpake2p_P256_SHA256_HKDF_HMAC::ComputeRoundOne(const uint8_t * pab, size_t pab_len, uint8_t * out, size_t * out_len) +{ + VerifyOrReturnError(out_len != nullptr, CHIP_ERROR_INVALID_ARGUMENT); + + psa_status_t status; + + if (mRole == PSA_PAKE_ROLE_SERVER) + { + status = psa_pake_input(&mOperation, PSA_PAKE_STEP_KEY_SHARE, pab, pab_len); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + } + + status = psa_pake_output(&mOperation, PSA_PAKE_STEP_KEY_SHARE, out, *out_len, out_len); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR PSASpake2p_P256_SHA256_HKDF_HMAC::ComputeRoundTwo(const uint8_t * in, size_t in_len, uint8_t * out, size_t * out_len) +{ + VerifyOrReturnError(out_len != nullptr, CHIP_ERROR_INVALID_ARGUMENT); + + psa_status_t status; + + if (mRole == PSA_PAKE_ROLE_CLIENT) + { + status = psa_pake_input(&mOperation, PSA_PAKE_STEP_KEY_SHARE, in, in_len); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + } + + status = psa_pake_output(&mOperation, PSA_PAKE_STEP_CONFIRM, out, *out_len, out_len); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR PSASpake2p_P256_SHA256_HKDF_HMAC::KeyConfirm(const uint8_t * in, size_t in_len) +{ + psa_status_t status = psa_pake_input(&mOperation, PSA_PAKE_STEP_CONFIRM, in, in_len); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR PSASpake2p_P256_SHA256_HKDF_HMAC::GetKeys(SessionKeystore & keystore, HkdfKeyHandle & key) +{ + auto & keyId = key.AsMutable<psa_key_id_t>(); + + psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; + + psa_set_key_type(&attributes, PSA_KEY_TYPE_DERIVE); + psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DERIVE); + psa_set_key_algorithm(&attributes, PSA_ALG_HKDF(PSA_ALG_SHA_256)); + + psa_status_t status = psa_pake_get_shared_key(&(mOperation), &attributes, &keyId); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + return CHIP_NO_ERROR; +} + +} // namespace Crypto +} // namespace chip diff --git a/src/crypto/PSASpake2p.h b/src/crypto/PSASpake2p.h new file mode 100644 index 00000000000000..9907b1ec09a5bc --- /dev/null +++ b/src/crypto/PSASpake2p.h @@ -0,0 +1,166 @@ +/* + * 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. + */ + +#pragma once + +#include "CHIPCryptoPAL.h" + +#include <psa/crypto.h> + +namespace chip { +namespace Crypto { + +/** + * The below class implements the draft 01 version of the Spake2+ protocol as + * defined in https://www.ietf.org/id/draft-bar-cfrg-spake2plus-01.html. + * + * The following describes the protocol flows: + * + * Commissioner Accessory + * ------------ --------- + * + * Init + * BeginProver + * ComputeRoundOne -------------> + * Init + * BeginVerifier + * /- ComputeRoundOne + * <------------- ComputeRoundTwo + * ComputeRoundTwo -------------> + * KeyConfirm KeyConfirm + * GetKeys GetKeys + * + **/ +class PSASpake2p_P256_SHA256_HKDF_HMAC +{ +public: + /** + * @brief Initialize Spake2+ with some context specific information. + * + * @param context The context is arbitrary but should include information about the + * protocol being run, contain the transcript for negotiation, include + * the PKBDF parameters, etc. + * @param context_len The length of the context. + * + * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise + **/ + CHIP_ERROR Init(const uint8_t * context, size_t context_len); + + /** + * @brief Free Spake2+ underlying objects. + **/ + void Clear(); + + /** + * @brief Start the Spake2+ process as a verifier (i.e. an accessory being provisioned). + * + * @param my_identity The verifier identity. May be NULL if identities are not established. + * @param my_identity_len The verifier identity length. + * @param peer_identity The peer identity. May be NULL if identities are not established. + * @param peer_identity_len The peer identity length. + * @param w0in The input w0 (a parameter baked into the device or computed with ComputeW0). + * @param w0in_len The input w0 length. + * @param Lin The input L (a parameter baked into the device or computed with ComputeL). + * @param Lin_len The input L length. + * + * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise + **/ + CHIP_ERROR BeginVerifier(const uint8_t * my_identity, size_t my_identity_len, const uint8_t * peer_identity, + size_t peer_identity_len, const uint8_t * w0in, size_t w0in_len, const uint8_t * Lin, size_t Lin_len); + + /** + * @brief Start the Spake2+ process as a prover (i.e. a commissioner). + * + * @param my_identity The prover identity. May be NULL if identities are not established. + * @param my_identity_len The prover identity length. + * @param peer_identity The peer identity. May be NULL if identities are not established. + * @param peer_identity_len The peer identity length. + * @param w0in The input w0 (an output from the PBKDF). + * @param w0in_len The input w0 length. + * @param w1in The input w1 (an output from the PBKDF). + * @param w1in_len The input w1 length. + * + * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise + **/ + CHIP_ERROR BeginProver(const uint8_t * my_identity, size_t my_identity_len, const uint8_t * peer_identity, + size_t peer_identity_len, const uint8_t * w0in, size_t w0in_len, const uint8_t * w1in, size_t w1in_len); + + /** + * @brief Compute the first round of the protocol. + * + * @param pab X value from commissioner. + * @param pab_len X length. + * @param out The output first round Spake2+ contribution. + * @param out_len The output first round Spake2+ contribution length. + * + * The out_len parameter is expected to point to an integer that holds + * the size of the buffer to put the first round Spake2+ contribution. + * After successful execution of this method, the variable is set to the + * actual size of the generated output. + * + * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise + **/ + CHIP_ERROR ComputeRoundOne(const uint8_t * pab, size_t pab_len, uint8_t * out, size_t * out_len); + + /** + * @brief Compute the second round of the protocol. + * + * @param in The peer first round Spake2+ contribution. + * @param in_len The peer first round Spake2+ contribution length. + * @param out The output second round Spake2+ contribution. + * @param out_len The output second round Spake2+ contribution length. + * + * The out_len parameter is expected to point to an integer that holds + * the size of the buffer to put the second round Spake2+ contribution. + * After successful execution of this method, the variable is set to the + * actual size of the generated output. + * + * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise + **/ + CHIP_ERROR ComputeRoundTwo(const uint8_t * in, size_t in_len, uint8_t * out, size_t * out_len); + + /** + * @brief Confirm that each party computed the same keys. + * + * @param in The peer second round Spake2+ contribution. + * @param in_len The peer second round Spake2+ contribution length. + * + * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise + **/ + CHIP_ERROR KeyConfirm(const uint8_t * in, size_t in_len); + + /** + * @brief Return the shared secret. + * + * @param out The output secret. + * @param out_len The output secret length. + * + * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise + **/ + CHIP_ERROR GetKeys(SessionKeystore & keystore, HkdfKeyHandle & key); + +private: + psa_pake_operation_t mOperation = PSA_PAKE_OPERATION_INIT; + psa_key_id_t mKey = PSA_KEY_ID_NULL; + + psa_pake_role_t mRole; + uint8_t mContext[kSHA256_Hash_Length]; + size_t mContextLen; +}; + +} // namespace Crypto +} // namespace chip diff --git a/src/crypto/crypto.gni b/src/crypto/crypto.gni index 4fc63b800826b8..96f506033bb56e 100644 --- a/src/crypto/crypto.gni +++ b/src/crypto/crypto.gni @@ -19,8 +19,14 @@ declare_args() { # Compile mbedtls externally. Only used if chip_crypto == "mbedtls" chip_external_mbedtls = false + + # Use PSA Spake2+ implementation. Only used if chip_crypto == "psa" + chip_crypto_psa_spake2p = false } assert( !chip_external_mbedtls || chip_crypto == "mbedtls" || chip_crypto == "psa", "Use of external mbedtls requires the mbedtls or psa crypto impl") + +assert(!chip_crypto_psa_spake2p || chip_crypto == "psa", + "Use of psa spake2+ requires the psa crypto impl") diff --git a/src/protocols/secure_channel/CASESession.cpp b/src/protocols/secure_channel/CASESession.cpp index 4436d7fbb77881..e1bac768f81da6 100644 --- a/src/protocols/secure_channel/CASESession.cpp +++ b/src/protocols/secure_channel/CASESession.cpp @@ -571,7 +571,7 @@ void CASESession::AbortPendingEstablish(CHIP_ERROR err) NotifySessionEstablishmentError(err, state); } -CHIP_ERROR CASESession::DeriveSecureSession(CryptoContext & session) const +CHIP_ERROR CASESession::DeriveSecureSession(CryptoContext & session) { switch (mState) { diff --git a/src/protocols/secure_channel/CASESession.h b/src/protocols/secure_channel/CASESession.h index 9e41f6c69fbe84..b7c6b429b950ad 100644 --- a/src/protocols/secure_channel/CASESession.h +++ b/src/protocols/secure_channel/CASESession.h @@ -146,7 +146,7 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler, * @param session Reference to the secure session that will be initialized once session establishment is complete * @return CHIP_ERROR The result of session derivation */ - CHIP_ERROR DeriveSecureSession(CryptoContext & session) const override; + CHIP_ERROR DeriveSecureSession(CryptoContext & session) override; //// UnsolicitedMessageHandler Implementation //// CHIP_ERROR OnUnsolicitedMessageReceived(const PayloadHeader & payloadHeader, ExchangeDelegate *& newDelegate) override diff --git a/src/protocols/secure_channel/PASESession.cpp b/src/protocols/secure_channel/PASESession.cpp index ca2524d5e3f302..e0f409616ab26c 100644 --- a/src/protocols/secure_channel/PASESession.cpp +++ b/src/protocols/secure_channel/PASESession.cpp @@ -258,7 +258,7 @@ void PASESession::OnResponseTimeout(ExchangeContext * ec) NotifySessionEstablishmentError(CHIP_ERROR_TIMEOUT); } -CHIP_ERROR PASESession::DeriveSecureSession(CryptoContext & session) const +CHIP_ERROR PASESession::DeriveSecureSession(CryptoContext & session) { VerifyOrReturnError(mPairingComplete, CHIP_ERROR_INCORRECT_STATE); diff --git a/src/protocols/secure_channel/PASESession.h b/src/protocols/secure_channel/PASESession.h index f90c2545b7d787..2e731283c88aa8 100644 --- a/src/protocols/secure_channel/PASESession.h +++ b/src/protocols/secure_channel/PASESession.h @@ -27,6 +27,9 @@ #pragma once #include <crypto/CHIPCryptoPAL.h> +#if CHIP_CRYPTO_PSA_SPAKE2P +#include <crypto/PSASpake2p.h> +#endif #include <lib/support/Base64.h> #include <messaging/ExchangeContext.h> #include <messaging/ExchangeDelegate.h> @@ -125,7 +128,7 @@ class DLL_EXPORT PASESession : public Messaging::UnsolicitedMessageHandler, * @param session Reference to the secure session that will be initialized once pairing is complete * @return CHIP_ERROR The result of session derivation */ - CHIP_ERROR DeriveSecureSession(CryptoContext & session) const override; + CHIP_ERROR DeriveSecureSession(CryptoContext & session) override; // TODO: remove Clear, we should create a new instance instead reset the old instance. /** @brief This function zeroes out and resets the memory used by the object. @@ -198,7 +201,11 @@ class DLL_EXPORT PASESession : public Messaging::UnsolicitedMessageHandler, // mNextExpectedMsg is set when we are expecting a message. Optional<Protocols::SecureChannel::MsgType> mNextExpectedMsg; +#if CHIP_CRYPTO_PSA_SPAKE2P + Crypto::PSASpake2p_P256_SHA256_HKDF_HMAC mSpake2p; +#else Crypto::Spake2p_P256_SHA256_HKDF_HMAC mSpake2p; +#endif Crypto::Spake2pVerifier mPASEVerifier; diff --git a/src/protocols/secure_channel/PairingSession.h b/src/protocols/secure_channel/PairingSession.h index ea69f65bfaccb7..fa639a7dd9459a 100644 --- a/src/protocols/secure_channel/PairingSession.h +++ b/src/protocols/secure_channel/PairingSession.h @@ -96,7 +96,7 @@ class DLL_EXPORT PairingSession : public SessionDelegate * @param session Reference to the secure session that will be initialized once pairing is complete * @return CHIP_ERROR The result of session derivation */ - virtual CHIP_ERROR DeriveSecureSession(CryptoContext & session) const = 0; + virtual CHIP_ERROR DeriveSecureSession(CryptoContext & session) = 0; const ReliableMessageProtocolConfig & GetRemoteMRPConfig() const { return mRemoteSessionParams.GetMRPConfig(); } const SessionParameters & GetRemoteSessionParameters() const { return mRemoteSessionParams; } diff --git a/src/protocols/secure_channel/tests/TestPairingSession.cpp b/src/protocols/secure_channel/tests/TestPairingSession.cpp index e0e4a7cd9601c8..4a3fe88d55c7aa 100644 --- a/src/protocols/secure_channel/tests/TestPairingSession.cpp +++ b/src/protocols/secure_channel/tests/TestPairingSession.cpp @@ -48,7 +48,7 @@ class TestPairingSession : public PairingSession const ReliableMessageProtocolConfig & GetRemoteMRPConfig() const { return PairingSession::GetRemoteMRPConfig(); } - CHIP_ERROR DeriveSecureSession(CryptoContext & session) const override { return CHIP_NO_ERROR; } + CHIP_ERROR DeriveSecureSession(CryptoContext & session) override { return CHIP_NO_ERROR; } CHIP_ERROR DecodeMRPParametersIfPresent(TLV::Tag expectedTag, System::PacketBufferTLVReader & tlvReader) { From 7cdea9b7f6b6e71ec8023e105848c82d3e2ab2e4 Mon Sep 17 00:00:00 2001 From: Shao Ling Tan <161761051+shaoltan-amazon@users.noreply.github.com> Date: Thu, 25 Apr 2024 12:17:01 -0700 Subject: [PATCH 043/124] Create test script to verify that the Linux tv-casting-app is able to discover the Linux tv-app. (#32919) --- .../examples-linux-tv-casting-app.yaml | 8 +- scripts/tests/run_tv_casting_test.py | 225 ++++++++++++++++++ 2 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 scripts/tests/run_tv_casting_test.py diff --git a/.github/workflows/examples-linux-tv-casting-app.yaml b/.github/workflows/examples-linux-tv-casting-app.yaml index e7ecb5bdddecc7..679f4be57a35db 100644 --- a/.github/workflows/examples-linux-tv-casting-app.yaml +++ b/.github/workflows/examples-linux-tv-casting-app.yaml @@ -17,7 +17,7 @@ name: Test TV Casting Example on: push: branches-ignore: - - 'dependabot/**' + - "dependabot/**" pull_request: merge_group: @@ -63,6 +63,12 @@ jobs: ./scripts/run_in_build_env.sh \ "scripts/examples/gn_build_example.sh examples/tv-casting-app/linux/ out/tv-casting-app" + - name: Test casting from Linux tv-casting-app to Linux tv-app + run: | + ./scripts/run_in_build_env.sh \ + "python3 ./scripts/tests/run_tv_casting_test.py" + timeout-minutes: 1 + - name: Uploading Size Reports uses: ./.github/actions/upload-size-reports if: ${{ !env.ACT }} diff --git a/scripts/tests/run_tv_casting_test.py b/scripts/tests/run_tv_casting_test.py new file mode 100644 index 00000000000000..7e783102a2fbc5 --- /dev/null +++ b/scripts/tests/run_tv_casting_test.py @@ -0,0 +1,225 @@ +#!/usr/bin/env -S python3 -B + +# 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 logging +import os +import subprocess +import sys +import tempfile +import time +from typing import List, Optional, TextIO, Tuple + +import click + +# Configure logging format. +logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s') + +# The maximum amount of time to wait for the Linux tv-app to start before timeout. +TV_APP_MAX_START_WAIT_SEC = 2 + +# File names of logs for the Linux tv-casting-app and the Linux tv-app. +LINUX_TV_APP_LOGS = 'Linux-tv-app-logs.txt' +LINUX_TV_CASTING_APP_LOGS = 'Linux-tv-casting-app-logs.txt' + +# Values that identify the Linux tv-app and are noted in the 'Device Configuration' in the Linux tv-app output +# as well as under the 'Discovered Commissioner' details in the Linux tv-casting-app output. +VENDOR_ID = 0xFFF1 # Spec 7.20.2.1 MEI code: test vendor IDs are 0xFFF1 to 0xFFF4 +PRODUCT_ID = 0x8001 # Test product id +DEVICE_TYPE_CASTING_VIDEO_PLAYER = 0x23 # Device type library 10.3: Casting Video Player + + +class ProcessManager: + """A context manager for managing subprocesses. + + This class provides a context manager for safely starting and stopping a subprocess. + """ + + def __init__(self, command: List[str], stdout, stderr): + self.command = command + self.stdout = stdout + self.stderr = stderr + + def __enter__(self): + self.process = subprocess.Popen(self.command, stdout=self.stdout, stderr=self.stderr, text=True) + return self.process + + def __exit__(self, exception_type, exception_value, traceback): + self.process.terminate() + self.process.wait() + + +def dump_temporary_logs_to_console(log_file_path: str): + """Dump log file to the console; log file will be removed once the function exits.""" + """Write the entire content of `log_file_path` to the console.""" + print('\nDumping logs from: ', log_file_path) + + with open(log_file_path, 'r') as file: + for line in file: + print(line.rstrip()) + + +def handle_discovery_failure(log_file_paths: List[str]): + """Log 'Discovery failed!' as error, dump log files to console, exit on error.""" + logging.error('Discovery failed!') + + for log_file_path in log_file_paths: + try: + dump_temporary_logs_to_console(log_file_path) + except Exception as e: + logging.exception(f"Failed to dump {log_file_path}: {e}") + + sys.exit(1) + + +def extract_value_from_string(line: str) -> int: + """Extract and return integer value from given output string. + + The string is expected to be in the following format as it is received + from the Linux tv-casting-app output: + \x1b[0;34m[1713741926895] [7276:9521344] [DIS] Vendor ID: 65521\x1b[0m + The integer value to be extracted here is 65521. + """ + value = line.split(':')[-1].strip().replace('\x1b[0m', '') + value = int(value) + + return value + + +def validate_value(expected_value: int, log_paths: List[str], line: str, value_name: str) -> Optional[str]: + """Validate a value in a string against an expected value.""" + value = extract_value_from_string(line) + + if value != expected_value: + logging.error(f'{value_name} does not match the expected value!') + logging.error(f'Expected {value_name}: {expected_value}') + logging.error(line.rstrip('\n')) + handle_discovery_failure(log_paths) + return None + + # Return the line containing the valid value. + return line.rstrip('\n') + + +def start_up_tv_app_success(tv_app_process: subprocess.Popen, linux_tv_app_log_file: TextIO) -> bool: + """Check if the Linux tv-app is able to successfully start or until timeout occurs.""" + start_wait_time = time.time() + + while True: + # Check if the time elapsed since the start wait time exceeds the maximum allowed startup time for the TV app. + if time.time() - start_wait_time > TV_APP_MAX_START_WAIT_SEC: + logging.error("The Linux tv-app process did not start successfully within the timeout.") + return False + + tv_app_output_line = tv_app_process.stdout.readline() + + linux_tv_app_log_file.write(tv_app_output_line) + linux_tv_app_log_file.flush() + + # Check if the Linux tv-app started successfully. + if "Started commissioner" in tv_app_output_line: + logging.info('Linux tv-app is up and running!') + return True + + +def parse_output_for_valid_commissioner(tv_casting_app_info: Tuple[subprocess.Popen, TextIO], log_paths: List[str]): + """Parse the output of the Linux tv-casting-app to find a valid commissioner.""" + tv_casting_app_process, linux_tv_casting_app_log_file = tv_casting_app_info + + valid_discovered_commissioner = None + valid_vendor_id = None + valid_product_id = None + valid_device_type = None + + # Read the output as we receive it from the tv-casting-app subprocess. + for line in tv_casting_app_process.stdout: + linux_tv_casting_app_log_file.write(line) + linux_tv_casting_app_log_file.flush() + + # Fail fast if "No commissioner discovered" string found. + if "No commissioner discovered" in line: + logging.error(line.rstrip('\n')) + handle_discovery_failure(log_paths) + + elif "Discovered Commissioner" in line: + valid_discovered_commissioner = line.rstrip('\n') + + elif valid_discovered_commissioner: + # Continue parsing the output for the information of interest under 'Discovered Commissioner' + if 'Vendor ID:' in line: + valid_vendor_id = validate_value(VENDOR_ID, log_paths, line, 'Vendor ID') + + elif 'Product ID:' in line: + valid_product_id = validate_value(PRODUCT_ID, log_paths, line, 'Product ID') + + elif 'Device Type:' in line: + valid_device_type = validate_value(DEVICE_TYPE_CASTING_VIDEO_PLAYER, log_paths, line, 'Device Type') + + # A valid commissioner has VENDOR_ID, PRODUCT_ID, and DEVICE TYPE in its list of entries. + if valid_vendor_id and valid_product_id and valid_device_type: + logging.info('Found a valid commissioner in the Linux tv-casting-app logs:') + logging.info(valid_discovered_commissioner) + logging.info(valid_vendor_id) + logging.info(valid_product_id) + logging.info(valid_device_type) + logging.info('Discovery success!') + break + + +@click.command() +@click.option('--tv-app-rel-path', type=str, default='out/tv-app/chip-tv-app', help='Path to the Linux tv-app executable.') +@click.option('--tv-casting-app-rel-path', type=str, default='out/tv-casting-app/chip-tv-casting-app', help='Path to the Linux tv-casting-app executable.') +def test_discovery_fn(tv_app_rel_path, tv_casting_app_rel_path): + """Test if the Linux tv-casting-app is able to discover the Linux tv-app. + + Default paths for the executables are provided but can be overridden via command line arguments. + For example: python3 run_tv_casting_test.py --tv-app-rel-path=path/to/tv-app + --tv-casting-app-rel-path=path/to/tv-casting-app + """ + # Store the log files to a temporary directory. + with tempfile.TemporaryDirectory() as temp_dir: + linux_tv_app_log_path = os.path.join(temp_dir, LINUX_TV_APP_LOGS) + linux_tv_casting_app_log_path = os.path.join(temp_dir, LINUX_TV_CASTING_APP_LOGS) + + with open(linux_tv_app_log_path, 'w') as linux_tv_app_log_file, open(linux_tv_casting_app_log_path, 'w') as linux_tv_casting_app_log_file: + + # Configure command options to disable stdout buffering during tests. + disable_stdout_buffering_cmd = [] + # On Unix-like systems, use stdbuf to disable stdout buffering. + if sys.platform == 'darwin' or sys.platform == 'linux': + disable_stdout_buffering_cmd = ['stdbuf', '-o0', '-i0'] + + tv_app_abs_path = os.path.abspath(tv_app_rel_path) + # Run the Linux tv-app subprocess. + with ProcessManager(disable_stdout_buffering_cmd + [tv_app_abs_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE) as tv_app_process: + + if not start_up_tv_app_success(tv_app_process, linux_tv_app_log_file): + handle_discovery_failure([linux_tv_app_log_path]) + + tv_casting_app_abs_path = os.path.abspath(tv_casting_app_rel_path) + # Run the Linux tv-casting-app subprocess. + with ProcessManager(disable_stdout_buffering_cmd + [tv_casting_app_abs_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE) as tv_casting_app_process: + log_paths = [linux_tv_app_log_path, linux_tv_casting_app_log_path] + tv_casting_app_info = (tv_casting_app_process, linux_tv_casting_app_log_file) + parse_output_for_valid_commissioner(tv_casting_app_info, log_paths) + + +if __name__ == '__main__': + + # Start with a clean slate by removing any previously cached entries. + os.system('rm -f /tmp/chip_*') + + # Test discovery between the Linux tv-casting-app and the tv-app. + test_discovery_fn() From 5e2bf15db99c5ba3205495a5a4594ec7077d58a9 Mon Sep 17 00:00:00 2001 From: Amine Alami <43780877+Alami-Amine@users.noreply.github.com> Date: Thu, 25 Apr 2024 21:19:53 +0200 Subject: [PATCH 044/124] pw_unit_test migration: setup_payload batch #2 (with fixtures) (#33112) * pw_unit_test migration: setup_payload batch #2 (with fixtures) * restyle fix * integrating comments * restyle * Update test_components_nl.txt --------- Co-authored-by: Andrei Litvin <andy314@gmail.com> --- src/BUILD.gn | 1 - src/setup_payload/tests/BUILD.gn | 20 +- .../tests/TestAdditionalDataPayload.cpp | 183 +++++----------- src/setup_payload/tests/TestQRCodeTLV.cpp | 206 ++++++------------ .../unit-tests/test_components_nl.txt | 1 - 5 files changed, 127 insertions(+), 284 deletions(-) diff --git a/src/BUILD.gn b/src/BUILD.gn index 60ba11c0d28f61..dd69734ffc68e6 100644 --- a/src/BUILD.gn +++ b/src/BUILD.gn @@ -86,7 +86,6 @@ if (chip_build_tests) { chip_device_platform != "efr32") { tests += [ "${chip_root}/src/setup_payload/tests", - "${chip_root}/src/setup_payload/tests:tests_nltest", "${chip_root}/src/transport/raw/tests", ] } diff --git a/src/setup_payload/tests/BUILD.gn b/src/setup_payload/tests/BUILD.gn index 0f672c274fc941..b08d18a5a4fc15 100644 --- a/src/setup_payload/tests/BUILD.gn +++ b/src/setup_payload/tests/BUILD.gn @@ -23,25 +23,9 @@ chip_test_suite("tests") { output_name = "libSetupPayloadTests" test_sources = [ + "TestAdditionalDataPayload.cpp", "TestManualCode.cpp", "TestQRCode.cpp", - ] - - sources = [ "TestHelpers.h" ] - - cflags = [ "-Wconversion" ] - - public_deps = [ - "${chip_root}/src/platform", - "${chip_root}/src/setup_payload", - ] -} - -chip_test_suite_using_nltest("tests_nltest") { - output_name = "libSetupPayloadTestsNL" - - test_sources = [ - "TestAdditionalDataPayload.cpp", "TestQRCodeTLV.cpp", ] @@ -50,9 +34,7 @@ chip_test_suite_using_nltest("tests_nltest") { cflags = [ "-Wconversion" ] public_deps = [ - "${chip_root}/src/lib/support:testing_nlunit", "${chip_root}/src/platform", "${chip_root}/src/setup_payload", - "${nlunit_test_root}:nlunit-test", ] } diff --git a/src/setup_payload/tests/TestAdditionalDataPayload.cpp b/src/setup_payload/tests/TestAdditionalDataPayload.cpp index f64846222323e9..36ec0e6a970b90 100644 --- a/src/setup_payload/tests/TestAdditionalDataPayload.cpp +++ b/src/setup_payload/tests/TestAdditionalDataPayload.cpp @@ -24,22 +24,20 @@ #include <math.h> #include <memory> -#include <nlunit-test.h> #include <stdio.h> +#include <gtest/gtest.h> + #include <lib/support/BytesToHex.h> #include <lib/support/CHIPMem.h> #include <lib/support/CHIPMemString.h> #include <lib/support/CHIPPlatformMemory.h> -#include <lib/support/UnitTestContext.h> +#include <lib/support/verhoeff/Verhoeff.h> #include <setup_payload/AdditionalDataPayloadGenerator.h> #include <setup_payload/AdditionalDataPayloadParser.h> #include <setup_payload/SetupPayload.h> #include <system/SystemPacketBuffer.h> -#include <lib/support/UnitTestRegistration.h> -#include <lib/support/verhoeff/Verhoeff.h> - using namespace chip; namespace { @@ -59,7 +57,7 @@ constexpr uint16_t kLifetimeCounter constexpr uint16_t kShortRotatingIdLength = 5; #endif // CHIP_ENABLE_ROTATING_DEVICE_ID -CHIP_ERROR GenerateAdditionalDataPayload(nlTestSuite * inSuite, AdditionalDataPayloadGeneratorParams & additionalDataPayloadParams, +CHIP_ERROR GenerateAdditionalDataPayload(AdditionalDataPayloadGeneratorParams & additionalDataPayloadParams, BitFlags<AdditionalDataFields> additionalDataFields, char * additionalDataPayloadOutput) { CHIP_ERROR err = CHIP_NO_ERROR; @@ -69,7 +67,7 @@ CHIP_ERROR GenerateAdditionalDataPayload(nlTestSuite * inSuite, AdditionalDataPa additionalDataFields); if (err == CHIP_NO_ERROR) { - NL_TEST_ASSERT(inSuite, !bufferHandle.IsNull()); + EXPECT_FALSE(bufferHandle.IsNull()); } else { @@ -99,20 +97,25 @@ CHIP_ERROR ParseAdditionalDataPayload(const char * additionalDataPayload, size_t return AdditionalDataPayloadParser(additionalDataPayloadBytes.get(), bufferSize).populatePayload(outPayload); } -void TestGeneratingAdditionalDataPayloadWithoutRotatingDeviceId(nlTestSuite * inSuite, void * inContext) +class TestAdditionalDataPayload : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestAdditionalDataPayload, TestGeneratingAdditionalDataPayloadWithoutRotatingDeviceId) { BitFlags<AdditionalDataFields> additionalDataFields; char output[kAdditionalDataPayloadLength]; AdditionalDataPayloadGeneratorParams additionalDataPayloadParams; - NL_TEST_ASSERT(inSuite, - GenerateAdditionalDataPayload(inSuite, additionalDataPayloadParams, additionalDataFields, output) == - CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(output, kAdditionalDataPayloadWithoutRotatingDeviceId) == 0); + EXPECT_EQ(GenerateAdditionalDataPayload(additionalDataPayloadParams, additionalDataFields, output), CHIP_NO_ERROR); + EXPECT_STREQ(output, kAdditionalDataPayloadWithoutRotatingDeviceId); } #if CHIP_ENABLE_ROTATING_DEVICE_ID -void TestGeneratingAdditionalDataPayloadWithRotatingDeviceId(nlTestSuite * inSuite, void * inContext) +TEST_F(TestAdditionalDataPayload, TestGeneratingAdditionalDataPayloadWithRotatingDeviceId) { BitFlags<AdditionalDataFields> additionalDataFields; additionalDataFields.Set(AdditionalDataFields::RotatingDeviceId); @@ -121,13 +124,11 @@ void TestGeneratingAdditionalDataPayloadWithRotatingDeviceId(nlTestSuite * inSui additionalDataPayloadParams.rotatingDeviceIdUniqueId = ByteSpan(kUniqueId); char output[kAdditionalDataPayloadLength]; - NL_TEST_ASSERT(inSuite, - GenerateAdditionalDataPayload(inSuite, additionalDataPayloadParams, additionalDataFields, output) == - CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(output, kAdditionalDataPayloadWithRotatingDeviceId) == 0); + EXPECT_EQ(GenerateAdditionalDataPayload(additionalDataPayloadParams, additionalDataFields, output), CHIP_NO_ERROR); + EXPECT_STREQ(output, kAdditionalDataPayloadWithRotatingDeviceId); } -void TestGeneratingAdditionalDataPayloadWithRotatingDeviceIdAndMaxLifetimeCounter(nlTestSuite * inSuite, void * inContext) +TEST_F(TestAdditionalDataPayload, TestGeneratingAdditionalDataPayloadWithRotatingDeviceIdAndMaxLifetimeCounter) { BitFlags<AdditionalDataFields> additionalDataFields; additionalDataFields.Set(AdditionalDataFields::RotatingDeviceId); @@ -136,25 +137,22 @@ void TestGeneratingAdditionalDataPayloadWithRotatingDeviceIdAndMaxLifetimeCounte additionalDataPayloadParams.rotatingDeviceIdUniqueId = ByteSpan(kUniqueId); char output[kAdditionalDataPayloadLength]; - NL_TEST_ASSERT(inSuite, - GenerateAdditionalDataPayload(inSuite, additionalDataPayloadParams, additionalDataFields, output) == - CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(output, kAdditionalDataPayloadWithRotatingDeviceIdAndMaxLifetimeCounter) == 0); + EXPECT_EQ(GenerateAdditionalDataPayload(additionalDataPayloadParams, additionalDataFields, output), CHIP_NO_ERROR); + EXPECT_STREQ(output, kAdditionalDataPayloadWithRotatingDeviceIdAndMaxLifetimeCounter); } -void TestGeneratingAdditionalDataPayloadWithRotatingDeviceIdWithNullInputs(nlTestSuite * inSuite, void * inContext) +TEST_F(TestAdditionalDataPayload, TestGeneratingAdditionalDataPayloadWithRotatingDeviceIdWithNullInputs) { BitFlags<AdditionalDataFields> additionalDataFields; additionalDataFields.Set(AdditionalDataFields::RotatingDeviceId); AdditionalDataPayloadGeneratorParams additionalDataPayloadParams; char output[kAdditionalDataPayloadLength]; - NL_TEST_ASSERT(inSuite, - GenerateAdditionalDataPayload(inSuite, additionalDataPayloadParams, additionalDataFields, output) == - CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(GenerateAdditionalDataPayload(additionalDataPayloadParams, additionalDataFields, output), + CHIP_ERROR_INVALID_ARGUMENT); } -void TestGeneratingRotatingDeviceIdAsString(nlTestSuite * inSuite, void * inContext) +TEST_F(TestAdditionalDataPayload, TestGeneratingRotatingDeviceIdAsString) { CHIP_ERROR err = CHIP_NO_ERROR; char rotatingDeviceIdHexBuffer[RotatingDeviceId::kHexMaxLength]; @@ -165,8 +163,8 @@ void TestGeneratingRotatingDeviceIdAsString(nlTestSuite * inSuite, void * inCont err = AdditionalDataPayloadGenerator().generateRotatingDeviceIdAsHexString( additionalDataPayloadParams, rotatingDeviceIdHexBuffer, ArraySize(rotatingDeviceIdHexBuffer), rotatingDeviceIdValueOutputSize); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(rotatingDeviceIdHexBuffer, kRotatingDeviceId) == 0); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_STREQ(rotatingDeviceIdHexBuffer, kRotatingDeviceId); // Parsing out the lifetime counter value long lifetimeCounter; char lifetimeCounterStr[3]; @@ -174,10 +172,10 @@ void TestGeneratingRotatingDeviceIdAsString(nlTestSuite * inSuite, void * inCont char * parseEnd; lifetimeCounter = strtol(lifetimeCounterStr, &parseEnd, 16); - NL_TEST_ASSERT(inSuite, lifetimeCounter == kLifetimeCounter); + EXPECT_EQ(lifetimeCounter, kLifetimeCounter); } -void TestGeneratingRotatingDeviceIdAsStringWithNullInputs(nlTestSuite * inSuite, void * inContext) +TEST_F(TestAdditionalDataPayload, TestGeneratingRotatingDeviceIdAsStringWithNullInputs) { CHIP_ERROR err = CHIP_NO_ERROR; char rotatingDeviceIdHexBuffer[RotatingDeviceId::kHexMaxLength]; @@ -188,10 +186,10 @@ void TestGeneratingRotatingDeviceIdAsStringWithNullInputs(nlTestSuite * inSuite, err = AdditionalDataPayloadGenerator().generateRotatingDeviceIdAsHexString( additionalDataPayloadParams, rotatingDeviceIdHexBuffer, ArraySize(rotatingDeviceIdHexBuffer), rotatingDeviceIdValueOutputSize); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT); } -void TestGeneratingRotatingDeviceIdWithSmallBuffer(nlTestSuite * inSuite, void * inContext) +TEST_F(TestAdditionalDataPayload, TestGeneratingRotatingDeviceIdWithSmallBuffer) { CHIP_ERROR err = CHIP_NO_ERROR; char rotatingDeviceIdHexBuffer[kShortRotatingIdLength]; @@ -202,122 +200,51 @@ void TestGeneratingRotatingDeviceIdWithSmallBuffer(nlTestSuite * inSuite, void * err = AdditionalDataPayloadGenerator().generateRotatingDeviceIdAsHexString( additionalDataPayloadParams, rotatingDeviceIdHexBuffer, ArraySize(rotatingDeviceIdHexBuffer), rotatingDeviceIdValueOutputSize); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_BUFFER_TOO_SMALL); + EXPECT_EQ(err, CHIP_ERROR_BUFFER_TOO_SMALL); } #endif // CHIP_ENABLE_ROTATING_DEVICE_ID -void TestParsingAdditionalDataPayloadWithRotatingDeviceId(nlTestSuite * inSuite, void * inContext) +TEST_F(TestAdditionalDataPayload, TestParsingAdditionalDataPayloadWithRotatingDeviceId) { chip::SetupPayloadData::AdditionalDataPayload resultPayload; - NL_TEST_ASSERT(inSuite, - ParseAdditionalDataPayload(kAdditionalDataPayloadWithRotatingDeviceId, - strlen(kAdditionalDataPayloadWithRotatingDeviceId), resultPayload) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(resultPayload.rotatingDeviceId.c_str(), kRotatingDeviceId) == 0); + EXPECT_EQ(ParseAdditionalDataPayload(kAdditionalDataPayloadWithRotatingDeviceId, + strlen(kAdditionalDataPayloadWithRotatingDeviceId), resultPayload), + CHIP_NO_ERROR); + EXPECT_STREQ(resultPayload.rotatingDeviceId.c_str(), kRotatingDeviceId); } -void TestParsingAdditionalDataPayloadWithoutRotatingDeviceId(nlTestSuite * inSuite, void * inContext) +TEST_F(TestAdditionalDataPayload, TestParsingAdditionalDataPayloadWithoutRotatingDeviceId) { chip::SetupPayloadData::AdditionalDataPayload resultPayload; - NL_TEST_ASSERT(inSuite, - ParseAdditionalDataPayload(kAdditionalDataPayloadWithoutRotatingDeviceId, - strlen(kAdditionalDataPayloadWithoutRotatingDeviceId), - resultPayload) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(resultPayload.rotatingDeviceId.c_str(), "") == 0); + EXPECT_EQ(ParseAdditionalDataPayload(kAdditionalDataPayloadWithoutRotatingDeviceId, + strlen(kAdditionalDataPayloadWithoutRotatingDeviceId), resultPayload), + CHIP_NO_ERROR); + EXPECT_STREQ(resultPayload.rotatingDeviceId.c_str(), ""); } -void TestParsingAdditionalDataPayloadWithInvalidRotatingDeviceIdLength(nlTestSuite * inSuite, void * inContext) +TEST_F(TestAdditionalDataPayload, TestParsingAdditionalDataPayloadWithInvalidRotatingDeviceIdLength) { chip::SetupPayloadData::AdditionalDataPayload resultPayload; - NL_TEST_ASSERT(inSuite, - ParseAdditionalDataPayload(kAdditionalDataPayloadWithInvalidRotatingDeviceIdLength, - strlen(kAdditionalDataPayloadWithInvalidRotatingDeviceIdLength), - resultPayload) == CHIP_ERROR_TLV_UNDERRUN); + EXPECT_EQ(ParseAdditionalDataPayload(kAdditionalDataPayloadWithInvalidRotatingDeviceIdLength, + strlen(kAdditionalDataPayloadWithInvalidRotatingDeviceIdLength), resultPayload), + CHIP_ERROR_TLV_UNDERRUN); } -void TestParsingAdditionalDataPayloadWithLongRotatingDeviceId(nlTestSuite * inSuite, void * inContext) +TEST_F(TestAdditionalDataPayload, TestParsingAdditionalDataPayloadWithLongRotatingDeviceId) { chip::SetupPayloadData::AdditionalDataPayload resultPayload; - NL_TEST_ASSERT(inSuite, - ParseAdditionalDataPayload(kAdditionalDataPayloadWithLongRotatingDeviceId, - strlen(kAdditionalDataPayloadWithLongRotatingDeviceId), - resultPayload) == CHIP_ERROR_INVALID_STRING_LENGTH); + EXPECT_EQ(ParseAdditionalDataPayload(kAdditionalDataPayloadWithLongRotatingDeviceId, + strlen(kAdditionalDataPayloadWithLongRotatingDeviceId), resultPayload), + CHIP_ERROR_INVALID_STRING_LENGTH); } -void TestParsingAdditionalDataPayloadWithShortRotatingDeviceId(nlTestSuite * inSuite, void * inContext) +TEST_F(TestAdditionalDataPayload, TestParsingAdditionalDataPayloadWithShortRotatingDeviceId) { chip::SetupPayloadData::AdditionalDataPayload resultPayload; - NL_TEST_ASSERT(inSuite, - ParseAdditionalDataPayload(kAdditionalDataPayloadWithShortRotatingDeviceId, - strlen(kAdditionalDataPayloadWithShortRotatingDeviceId), - resultPayload) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(resultPayload.rotatingDeviceId.c_str(), kShortRotatingDeviceId) == 0); + EXPECT_EQ(ParseAdditionalDataPayload(kAdditionalDataPayloadWithShortRotatingDeviceId, + strlen(kAdditionalDataPayloadWithShortRotatingDeviceId), resultPayload), + CHIP_NO_ERROR); + EXPECT_STREQ(resultPayload.rotatingDeviceId.c_str(), kShortRotatingDeviceId); } -/** - * Test Suite that lists all the Test functions. - */ -// clang-format off -const nlTest sTests[] = -{ - NL_TEST_DEF("Test Generating Additional Data Payload without Rotatin gDevice Id", TestGeneratingAdditionalDataPayloadWithoutRotatingDeviceId), - #if CHIP_ENABLE_ROTATING_DEVICE_ID - NL_TEST_DEF("Test Generating Additional Data Payload with Rotating Device Id", TestGeneratingAdditionalDataPayloadWithRotatingDeviceId), - NL_TEST_DEF("Test Generating Additional Data Payload with Rotating Device Id + Max Lifetime Counter", TestGeneratingAdditionalDataPayloadWithRotatingDeviceIdAndMaxLifetimeCounter), - NL_TEST_DEF("Test Generating Additional Data Payload with Rotating Device Id + Null/Empty Inputs", TestGeneratingAdditionalDataPayloadWithRotatingDeviceIdWithNullInputs), - NL_TEST_DEF("Test Generating Rotating Device Id as string", TestGeneratingRotatingDeviceIdAsString), - NL_TEST_DEF("Test Generating Rotating Device Id as string with null/invalid inputs", TestGeneratingRotatingDeviceIdAsStringWithNullInputs), - NL_TEST_DEF("Test Generating Rotating Device Id as string with small buffer", TestGeneratingRotatingDeviceIdWithSmallBuffer), - #endif - NL_TEST_DEF("Test Parsing Additional Data Payload with Rotating Device Id", TestParsingAdditionalDataPayloadWithRotatingDeviceId), - NL_TEST_DEF("Test Parsing Additional Data Payload without Rotating Device Id", TestParsingAdditionalDataPayloadWithoutRotatingDeviceId), - NL_TEST_DEF("Test Parsing Additional Data Payload with Invalid Rotating Device Id Length", TestParsingAdditionalDataPayloadWithInvalidRotatingDeviceIdLength), - NL_TEST_DEF("Test Parsing Additional Data Payload with Long Rotating Device Id", TestParsingAdditionalDataPayloadWithLongRotatingDeviceId), - NL_TEST_DEF("Test Parsing Additional Data Payload with Short Rotating Device Id", TestParsingAdditionalDataPayloadWithShortRotatingDeviceId), - NL_TEST_SENTINEL() -}; -// clang-format on - } // namespace - -/** - * Set up the test suite. - */ -int TestAdditionalDataPayload_Setup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - if (error != CHIP_NO_ERROR) - return FAILURE; - return SUCCESS; -} - -/** - * Tear down the test suite. - */ -int TestAdditionalDataPayload_Teardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - -/** - * Main - */ -int TestAdditionalDataPayload() -{ - // clang-format off - nlTestSuite theSuite = - { - "chip-additional-data-payload-general-Tests", - &sTests[0], - TestAdditionalDataPayload_Setup, - TestAdditionalDataPayload_Teardown - }; - // clang-format on - - // Generate machine-readable, comma-separated value (CSV) output. - nl_test_set_output_style(OUTPUT_CSV); - - return chip::ExecuteTestsWithoutContext(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestAdditionalDataPayload); diff --git a/src/setup_payload/tests/TestQRCodeTLV.cpp b/src/setup_payload/tests/TestQRCodeTLV.cpp index 739a074184b0ca..cdf6048a49b9a0 100644 --- a/src/setup_payload/tests/TestQRCodeTLV.cpp +++ b/src/setup_payload/tests/TestQRCodeTLV.cpp @@ -16,81 +16,86 @@ */ #include "TestHelpers.h" +#include <gtest/gtest.h> #include <nlbyteorder.h> -#include <nlunit-test.h> #include <lib/support/ScopedBuffer.h> -#include <lib/support/UnitTestContext.h> -#include <lib/support/UnitTestRegistration.h> using namespace chip; using namespace std; namespace { -void TestOptionalDataAddRemove(nlTestSuite * inSuite, void * inContext) +class TestQRCodeTLV : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestQRCodeTLV, TestOptionalDataAddRemove) { SetupPayload payload = GetDefaultPayload(); vector<OptionalQRCodeInfo> optionalData; CHIP_ERROR err; optionalData = payload.getAllOptionalVendorData(); - NL_TEST_ASSERT(inSuite, optionalData.empty()); + EXPECT_TRUE(optionalData.empty()); err = payload.addOptionalVendorData(kOptionalDefaultStringTag, kOptionalDefaultStringValue); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); optionalData = payload.getAllOptionalVendorData(); - NL_TEST_ASSERT(inSuite, optionalData.size() == 1); + EXPECT_TRUE(optionalData.size()); err = payload.addOptionalVendorData(kOptionalDefaultIntTag, kOptionalDefaultIntValue); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); optionalData = payload.getAllOptionalVendorData(); - NL_TEST_ASSERT(inSuite, optionalData.size() == 2); + EXPECT_EQ(optionalData.size(), 2u); err = payload.removeOptionalVendorData(kOptionalDefaultStringTag); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); optionalData = payload.getAllOptionalVendorData(); - NL_TEST_ASSERT(inSuite, optionalData.size() == 1); + EXPECT_EQ(optionalData.size(), 1u); payload.removeOptionalVendorData(kOptionalDefaultIntTag); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); optionalData = payload.getAllOptionalVendorData(); - NL_TEST_ASSERT(inSuite, optionalData.empty()); + EXPECT_TRUE(optionalData.empty()); err = payload.removeOptionalVendorData(kOptionalDefaultStringTag); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_KEY_NOT_FOUND); + EXPECT_EQ(err, CHIP_ERROR_KEY_NOT_FOUND); optionalData = payload.getAllOptionalVendorData(); - NL_TEST_ASSERT(inSuite, optionalData.empty()); + EXPECT_TRUE(optionalData.empty()); err = payload.removeOptionalVendorData(kOptionalDefaultIntTag); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_KEY_NOT_FOUND); + EXPECT_EQ(err, CHIP_ERROR_KEY_NOT_FOUND); optionalData = payload.getAllOptionalVendorData(); - NL_TEST_ASSERT(inSuite, optionalData.empty()); + EXPECT_TRUE(optionalData.empty()); } -void TestSimpleWrite(nlTestSuite * inSuite, void * inContext) +TEST_F(TestQRCodeTLV, TestSimpleWrite) { SetupPayload inPayload = GetDefaultPayload(); QRCodeSetupPayloadGenerator generator(inPayload); string result; CHIP_ERROR err = generator.payloadBase38Representation(result); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); string result2; err = generator.payloadBase38RepresentationWithAutoTLVBuffer(result2); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, result == result2); + EXPECT_EQ(result, result2); } -void TestSimpleRead(nlTestSuite * inSuite, void * inContext) +TEST_F(TestQRCodeTLV, TestSimpleRead) { SetupPayload inPayload = GetDefaultPayload(); SetupPayload outPayload; @@ -98,81 +103,81 @@ void TestSimpleRead(nlTestSuite * inSuite, void * inContext) QRCodeSetupPayloadGenerator generator(inPayload); string result; CHIP_ERROR err = generator.payloadBase38Representation(result); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); QRCodeSetupPayloadParser parser = QRCodeSetupPayloadParser(result); err = parser.populatePayload(outPayload); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, inPayload == outPayload); + EXPECT_TRUE(inPayload == outPayload); } -void TestOptionalTagValues(nlTestSuite * inSuite, void * inContext) +TEST_F(TestQRCodeTLV, TestOptionalTagValues) { SetupPayload payload = GetDefaultPayload(); CHIP_ERROR err; err = payload.addOptionalVendorData(kOptionalDefaultStringTag, kOptionalDefaultStringValue); // Vendor specific tag - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = payload.addOptionalVendorData(0x80, kOptionalDefaultStringValue); // Vendor specific tag - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = payload.addOptionalVendorData(0x82, kOptionalDefaultStringValue); // Vendor specific tag - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = payload.addOptionalVendorData(127, kOptionalDefaultStringValue); // Common tag - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT); err = payload.addOptionalVendorData(0, kOptionalDefaultStringValue); // Common tag - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(err, CHIP_ERROR_INVALID_ARGUMENT); } -void TestSerialNumberAddRemove(nlTestSuite * inSuite, void * inContext) +TEST_F(TestQRCodeTLV, TestSerialNumberAddRemove) { SetupPayload inPayload = GetDefaultPayload(); string sn; - NL_TEST_ASSERT(inSuite, inPayload.getSerialNumber(sn) == CHIP_ERROR_KEY_NOT_FOUND); - NL_TEST_ASSERT(inSuite, inPayload.removeSerialNumber() == CHIP_ERROR_KEY_NOT_FOUND); + EXPECT_EQ(inPayload.getSerialNumber(sn), CHIP_ERROR_KEY_NOT_FOUND); + EXPECT_EQ(inPayload.removeSerialNumber(), CHIP_ERROR_KEY_NOT_FOUND); - NL_TEST_ASSERT(inSuite, inPayload.addSerialNumber(kSerialNumberDefaultStringValue) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, inPayload.getSerialNumber(sn) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, sn == kSerialNumberDefaultStringValue); + EXPECT_EQ(inPayload.addSerialNumber(kSerialNumberDefaultStringValue), CHIP_NO_ERROR); + EXPECT_EQ(inPayload.getSerialNumber(sn), CHIP_NO_ERROR); + EXPECT_EQ(sn, kSerialNumberDefaultStringValue); - NL_TEST_ASSERT(inSuite, inPayload.addSerialNumber(kSerialNumberDefaultUInt32Value) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, inPayload.getSerialNumber(sn) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, sn == to_string(kSerialNumberDefaultUInt32Value)); + EXPECT_EQ(inPayload.addSerialNumber(kSerialNumberDefaultUInt32Value), CHIP_NO_ERROR); + EXPECT_EQ(inPayload.getSerialNumber(sn), CHIP_NO_ERROR); + EXPECT_EQ(sn, to_string(kSerialNumberDefaultUInt32Value)); - NL_TEST_ASSERT(inSuite, inPayload.removeSerialNumber() == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, inPayload.getSerialNumber(sn) == CHIP_ERROR_KEY_NOT_FOUND); - NL_TEST_ASSERT(inSuite, inPayload.removeSerialNumber() == CHIP_ERROR_KEY_NOT_FOUND); + EXPECT_EQ(inPayload.removeSerialNumber(), CHIP_NO_ERROR); + EXPECT_EQ(inPayload.getSerialNumber(sn), CHIP_ERROR_KEY_NOT_FOUND); + EXPECT_EQ(inPayload.removeSerialNumber(), CHIP_ERROR_KEY_NOT_FOUND); } -void TestOptionalDataWriteSerial(nlTestSuite * inSuite, void * inContext) +TEST_F(TestQRCodeTLV, TestOptionalDataWriteSerial) { CHIP_ERROR err = CHIP_NO_ERROR; SetupPayload inPayload = GetDefaultPayload(); err = inPayload.addSerialNumber("1"); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); QRCodeSetupPayloadGenerator generator(inPayload); string result; err = generator.payloadBase38Representation(result); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); uint8_t optionalInfo[kDefaultBufferSizeInBytes]; err = generator.payloadBase38Representation(result, optionalInfo, sizeof(optionalInfo)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); string result2; err = generator.payloadBase38RepresentationWithAutoTLVBuffer(result2); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, result == result2); + EXPECT_EQ(result, result2); } -void TestOptionalDataWrite(nlTestSuite * inSuite, void * inContext) +TEST_F(TestQRCodeTLV, TestOptionalDataWrite) { SetupPayload inPayload = GetDefaultPayloadWithOptionalDefaults(); @@ -180,60 +185,60 @@ void TestOptionalDataWrite(nlTestSuite * inSuite, void * inContext) string result; uint8_t optionalInfo[kDefaultBufferSizeInBytes]; CHIP_ERROR err = generator.payloadBase38Representation(result, optionalInfo, sizeof(optionalInfo)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); string result2; err = generator.payloadBase38RepresentationWithAutoTLVBuffer(result2); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, result == result2); + EXPECT_EQ(result, result2); } -void TestOptionalDataReadSerial(nlTestSuite * inSuite, void * inContext) +TEST_F(TestQRCodeTLV, TestOptionalDataReadSerial) { SetupPayload inPayload = GetDefaultPayload(); inPayload.addSerialNumber(kSerialNumberDefaultStringValue); - NL_TEST_ASSERT(inSuite, CheckWriteRead(inPayload)); + EXPECT_TRUE(CheckWriteRead(inPayload)); inPayload.addSerialNumber(kSerialNumberDefaultUInt32Value); - NL_TEST_ASSERT(inSuite, CheckWriteRead(inPayload)); + EXPECT_TRUE(CheckWriteRead(inPayload)); } -void TestOptionalDataReadVendorInt(nlTestSuite * inSuite, void * inContext) +TEST_F(TestQRCodeTLV, TestOptionalDataReadVendorInt) { SetupPayload inPayload = GetDefaultPayload(); inPayload.addOptionalVendorData(kOptionalDefaultIntTag, kOptionalDefaultIntValue); - NL_TEST_ASSERT(inSuite, CheckWriteRead(inPayload)); + EXPECT_TRUE(CheckWriteRead(inPayload)); } -void TestOptionalDataReadVendorString(nlTestSuite * inSuite, void * inContext) +TEST_F(TestQRCodeTLV, TestOptionalDataReadVendorString) { SetupPayload inPayload = GetDefaultPayload(); inPayload.addOptionalVendorData(kOptionalDefaultStringTag, kOptionalDefaultStringValue); - NL_TEST_ASSERT(inSuite, CheckWriteRead(inPayload)); + EXPECT_TRUE(CheckWriteRead(inPayload)); } -void TestOptionalDataRead(nlTestSuite * inSuite, void * inContext) +TEST_F(TestQRCodeTLV, TestOptionalDataRead) { SetupPayload inPayload = GetDefaultPayloadWithOptionalDefaults(); - NL_TEST_ASSERT(inSuite, CheckWriteRead(inPayload)); + EXPECT_TRUE(CheckWriteRead(inPayload)); } -void TestOptionalDataWriteNoBuffer(nlTestSuite * inSuite, void * inContext) +TEST_F(TestQRCodeTLV, TestOptionalDataWriteNoBuffer) { SetupPayload inPayload = GetDefaultPayloadWithOptionalDefaults(); QRCodeSetupPayloadGenerator generator(inPayload); string result; CHIP_ERROR err = generator.payloadBase38Representation(result); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + EXPECT_NE(err, CHIP_NO_ERROR); } -void TestOptionalDataWriteSmallBuffer(nlTestSuite * inSuite, void * inContext) +TEST_F(TestQRCodeTLV, TestOptionalDataWriteSmallBuffer) { SetupPayload inPayload = GetDefaultPayloadWithOptionalDefaults(); @@ -241,76 +246,7 @@ void TestOptionalDataWriteSmallBuffer(nlTestSuite * inSuite, void * inContext) string result; uint8_t optionalInfo[kSmallBufferSizeInBytes]; CHIP_ERROR err = generator.payloadBase38Representation(result, optionalInfo, sizeof(optionalInfo)); - NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); -} - -// Test Suite - -/** - * Test Suite that lists all the test functions. - */ -// clang-format off -const nlTest sTests[] = -{ - NL_TEST_DEF("Test Simple Write", TestSimpleWrite), - NL_TEST_DEF("Test Simple Read", TestSimpleRead), - NL_TEST_DEF("Test Optional Add Remove", TestOptionalDataAddRemove), - NL_TEST_DEF("Test Serial Number Add Remove", TestSerialNumberAddRemove), - NL_TEST_DEF("Test Optional Write", TestOptionalDataWrite), - NL_TEST_DEF("Test Optional Write Serial", TestOptionalDataWriteSerial), - NL_TEST_DEF("Test Optional Write No Buffer", TestOptionalDataWriteNoBuffer), - NL_TEST_DEF("Test Optional Write Small Buffer", TestOptionalDataWriteSmallBuffer), - NL_TEST_DEF("Test Optional Read Serial", TestOptionalDataReadSerial), - NL_TEST_DEF("Test Optional Read Vendor String", TestOptionalDataReadVendorString), - NL_TEST_DEF("Test Optional Read Vendor Int", TestOptionalDataReadVendorInt), - NL_TEST_DEF("Test Optional Read", TestOptionalDataRead), - NL_TEST_DEF("Test Optional Tag Values", TestOptionalTagValues), - - NL_TEST_SENTINEL() -}; -// clang-format on - -/** - * Set up the test suite. - */ -int TestQRCodeTLV_Setup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - if (error != CHIP_NO_ERROR) - return FAILURE; - return SUCCESS; -} - -/** - * Tear down the test suite. - */ -int TestQRCodeTLV_Teardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; + EXPECT_NE(err, CHIP_NO_ERROR); } } // namespace - -/** - * Main - */ -int TestQRCodeTLV() -{ - // clang-format off - nlTestSuite theSuite = - { - "chip-qrcode-optional-info-tests", - &sTests[0], - TestQRCodeTLV_Setup, - TestQRCodeTLV_Teardown - }; - // clang-format on - - // Generate machine-readable, comma-separated value (CSV) output. - nl_test_set_output_style(OUTPUT_CSV); - - return chip::ExecuteTestsWithoutContext(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestQRCodeTLV); 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 de9e40de4b5253..8631aacb9561a4 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt @@ -4,6 +4,5 @@ InetLayerTests MessagingLayerTests RawTransportTests SecureChannelTests -SetupPayloadTestsNL SupportTestsNL TransportLayerTests From 42bb75cb16707b78f10d802508e33cd22a11c217 Mon Sep 17 00:00:00 2001 From: Stefan Agner <stefan@agner.ch> Date: Thu, 25 Apr 2024 21:27:40 +0200 Subject: [PATCH 045/124] [Python] Fix OnRead[Event|Attribute]DataCallback for Arm64 Apple Patform devices (#33178) On M1/Arm64 macOS systems, the OnReadEventDataCallback often returned an invalid status, e.g.: ValueError: 16 is not a valid Status Use size_t consistently to fix this issue. --- src/controller/python/chip/clusters/attribute.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/controller/python/chip/clusters/attribute.cpp b/src/controller/python/chip/clusters/attribute.cpp index e31f3431b8b2a0..b73b4a49b44d1f 100644 --- a/src/controller/python/chip/clusters/attribute.cpp +++ b/src/controller/python/chip/clusters/attribute.cpp @@ -71,10 +71,10 @@ struct __attribute__((packed)) DataVersionFilter using OnReadAttributeDataCallback = void (*)(PyObject * appContext, chip::DataVersion version, chip::EndpointId endpointId, chip::ClusterId clusterId, chip::AttributeId attributeId, std::underlying_type_t<Protocols::InteractionModel::Status> imstatus, uint8_t * data, - uint32_t dataLen); + size_t dataLen); using OnReadEventDataCallback = void (*)(PyObject * appContext, chip::EndpointId endpointId, chip::ClusterId clusterId, chip::EventId eventId, chip::EventNumber eventNumber, uint8_t priority, uint64_t timestamp, - uint8_t timestampType, uint8_t * data, uint32_t dataLen, + uint8_t timestampType, uint8_t * data, size_t dataLen, std::underlying_type_t<Protocols::InteractionModel::Status> imstatus); using OnSubscriptionEstablishedCallback = void (*)(PyObject * appContext, SubscriptionId subscriptionId); using OnResubscriptionAttemptedCallback = void (*)(PyObject * appContext, PyChipError aTerminationCause, @@ -114,7 +114,7 @@ class ReadClientCallback : public ReadClient::Callback VerifyOrDie(!aPath.IsListItemOperation()); size_t bufferLen = (apData == nullptr ? 0 : apData->GetRemainingLength() + apData->GetLengthRead()); std::unique_ptr<uint8_t[]> buffer = std::unique_ptr<uint8_t[]>(apData == nullptr ? nullptr : new uint8_t[bufferLen]); - uint32_t size = 0; + size_t size = 0; // When the apData is nullptr, means we did not receive a valid attribute data from server, status will be some error // status. if (apData != nullptr) @@ -166,7 +166,7 @@ class ReadClientCallback : public ReadClient::Callback void OnEventData(const EventHeader & aEventHeader, TLV::TLVReader * apData, const StatusIB * apStatus) override { uint8_t buffer[CHIP_CONFIG_DEFAULT_UDP_MTU_SIZE]; - uint32_t size = 0; + size_t size = 0; CHIP_ERROR err = CHIP_NO_ERROR; // When the apData is nullptr, means we did not receive a valid event data from server, status will be some error // status. From d342d9b2a0a3f12cd324aee92ecd76388481157b Mon Sep 17 00:00:00 2001 From: Arkadiusz Bokowy <a.bokowy@samsung.com> Date: Thu, 25 Apr 2024 22:06:16 +0200 Subject: [PATCH 046/124] Ignore virtual-device-app build directory (#33169) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d6aefb1d928c1b..1c2d1430263594 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ # Build System out/ +/examples/virtual-device-app/android/App/buildSrc/build/ /src/test_driver/nrfconnect/build/ /src/darwin/Framework/build/ From a28965b0d8297d8aea3b0ba01290f5fac91dc3d8 Mon Sep 17 00:00:00 2001 From: Arkadiusz Bokowy <a.bokowy@samsung.com> Date: Thu, 25 Apr 2024 22:38:43 +0200 Subject: [PATCH 047/124] Allow building host tests with code coverage (#33141) * Fix access for == operator defined for AccessControl * Fix nested if warning * Fix access to ==operator and fix mismatched types * Allow building host tests with code coverage * Ignore virtual-device-app build directory * Fix initialization of CHIPoBLEStackMgr with google test * Fix find -exec syntax * Exclude tests from the coverage report * Revert "Ignore virtual-device-app build directory" This reverts commit 2215235dbef9890fa3252ccd200c1aff87f951b8. --- scripts/build/build/target.py | 2 +- scripts/build/build/targets.py | 2 +- scripts/build/builders/host.py | 6 ++-- src/access/tests/TestAccessControl.cpp | 6 ++-- src/lib/core/tests/TestTLV.cpp | 3 +- src/platform/tests/BUILD.gn | 1 - src/platform/tests/TestCHIPoBLEStackMgr.h | 30 ------------------- .../tests/TestCHIPoBLEStackMgrDriver.cpp | 5 +--- src/system/SystemPacketBuffer.h | 5 ++-- src/system/tests/TestSystemPacketBuffer.cpp | 30 +++++++++---------- 10 files changed, 30 insertions(+), 60 deletions(-) delete mode 100644 src/platform/tests/TestCHIPoBLEStackMgr.h diff --git a/scripts/build/build/target.py b/scripts/build/build/target.py index 8411ff9432c2c7..7f1716170178a8 100644 --- a/scripts/build/build/target.py +++ b/scripts/build/build/target.py @@ -406,7 +406,7 @@ def Create(self, name: str, runner, repository_path: str, output_prefix: str, builder.target = self builder.identifier = name builder.output_dir = os.path.join(output_prefix, name) - builder.chip_dir = repository_path + builder.chip_dir = os.path.abspath(repository_path) builder.options = builder_options return builder diff --git a/scripts/build/build/targets.py b/scripts/build/build/targets.py index 3f5fc57a616901..9eb2ebfb704e23 100755 --- a/scripts/build/build/targets.py +++ b/scripts/build/build/targets.py @@ -177,7 +177,7 @@ def BuildHostTarget(): target.AppendModifier("ossfuzz", fuzzing_type=HostFuzzingType.OSS_FUZZ).OnlyIfRe( "-clang").ExceptIfRe('-libfuzzer') target.AppendModifier('coverage', use_coverage=True).OnlyIfRe( - '-(chip-tool|all-clusters)') + '-(chip-tool|all-clusters|tests)') target.AppendModifier('dmalloc', use_dmalloc=True) target.AppendModifier('clang', use_clang=True) target.AppendModifier('test', extra_tests=True) diff --git a/scripts/build/builders/host.py b/scripts/build/builders/host.py index fcb609c70e941f..c1c81dbdc30f9c 100644 --- a/scripts/build/builders/host.py +++ b/scripts/build/builders/host.py @@ -512,19 +512,21 @@ def generate(self): def PreBuildCommand(self): if self.app == HostApp.TESTS and self.use_coverage: self._Execute(['ninja', '-C', self.output_dir, 'default'], title="Build-only") - self._Execute(['find', os.path.join(self.output_dir, 'obj/src/'), '-depth', - '-name', 'tests', '-exec', 'rm -rf {} \\;'], title="Cleanup unit tests") self._Execute(['lcov', '--initial', '--capture', '--directory', os.path.join(self.output_dir, 'obj'), + '--exclude', os.path.join(self.chip_dir, '**/tests/*'), '--exclude', os.path.join(self.chip_dir, 'zzz_generated/*'), '--exclude', os.path.join(self.chip_dir, 'third_party/*'), + '--exclude', os.path.join(self.chip_dir, 'out/*'), '--exclude', '/usr/include/*', '--output-file', os.path.join(self.coverage_dir, 'lcov_base.info')], title="Initial coverage baseline") def PostBuildCommand(self): if self.app == HostApp.TESTS and self.use_coverage: self._Execute(['lcov', '--capture', '--directory', os.path.join(self.output_dir, 'obj'), + '--exclude', os.path.join(self.chip_dir, '**/tests/*'), '--exclude', os.path.join(self.chip_dir, 'zzz_generated/*'), '--exclude', os.path.join(self.chip_dir, 'third_party/*'), + '--exclude', os.path.join(self.chip_dir, 'out/*'), '--exclude', '/usr/include/*', '--output-file', os.path.join(self.coverage_dir, 'lcov_test.info')], title="Update coverage") self._Execute(['lcov', '--add-tracefile', os.path.join(self.coverage_dir, 'lcov_base.info'), diff --git a/src/access/tests/TestAccessControl.cpp b/src/access/tests/TestAccessControl.cpp index 2d25a7c3d33ee4..16f30284fbc4d1 100644 --- a/src/access/tests/TestAccessControl.cpp +++ b/src/access/tests/TestAccessControl.cpp @@ -23,7 +23,8 @@ #include <gtest/gtest.h> -namespace { +namespace chip { +namespace Access { using namespace chip; using namespace chip::Access; @@ -2189,4 +2190,5 @@ TEST_F(TestAccessControl, TestUpdateEntry) } } -} // namespace +} // namespace Access +} // namespace chip diff --git a/src/lib/core/tests/TestTLV.cpp b/src/lib/core/tests/TestTLV.cpp index 4b391c4983f701..19b4c77ac35280 100644 --- a/src/lib/core/tests/TestTLV.cpp +++ b/src/lib/core/tests/TestTLV.cpp @@ -859,8 +859,7 @@ void WriteEncoding3(TLVWriter & writer) TLVWriter writer1; err = writer.OpenContainer(ProfileTag(TestProfile_1, 1), kTLVType_Structure, writer1); - if (err != CHIP_NO_ERROR) - EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = writer1.PutBoolean(ProfileTag(TestProfile_2, 2), false); EXPECT_EQ(err, CHIP_NO_ERROR); diff --git a/src/platform/tests/BUILD.gn b/src/platform/tests/BUILD.gn index 11e8bd5c746029..bf4c2ee6ff90f4 100644 --- a/src/platform/tests/BUILD.gn +++ b/src/platform/tests/BUILD.gn @@ -78,7 +78,6 @@ if (chip_device_platform != "none" && chip_device_platform != "fake") { # sources = [ "TestCHIPoBLEStackMgr.cpp", - "TestCHIPoBLEStackMgr.h", "TestCHIPoBLEStackMgrDriver.cpp", ] tests = [ "TestCHIPoBLEStackMgr" ] diff --git a/src/platform/tests/TestCHIPoBLEStackMgr.h b/src/platform/tests/TestCHIPoBLEStackMgr.h deleted file mode 100644 index b0f4f59516f2b1..00000000000000 --- a/src/platform/tests/TestCHIPoBLEStackMgr.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * - * Copyright (c) 2020 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. - */ - -/** - * @file - * This file declares test entry point for CHIP over BLE code unit tests in Linux - * - */ - -#pragma once - -#include <platform/CHIPDeviceConfig.h> - -#if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE -int TestCHIPoBLEStackManager(); -#endif // CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE diff --git a/src/platform/tests/TestCHIPoBLEStackMgrDriver.cpp b/src/platform/tests/TestCHIPoBLEStackMgrDriver.cpp index 2635ebe81eb273..38e3f23a10b59c 100644 --- a/src/platform/tests/TestCHIPoBLEStackMgrDriver.cpp +++ b/src/platform/tests/TestCHIPoBLEStackMgrDriver.cpp @@ -15,19 +15,16 @@ * limitations under the License. */ -#include "TestCHIPoBLEStackMgr.h" #include <gtest/gtest.h> #include <platform/CHIPDeviceConfig.h> #include <stdlib.h> int main(int argc, char * argv[]) { -#if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE + testing::InitGoogleTest(&argc, argv); if (argc == 2 && atoi(argv[1]) == 1) { - testing::InitGoogleTest(nullptr, nullptr); return RUN_ALL_TESTS(); } return 0; -#endif // CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE } diff --git a/src/system/SystemPacketBuffer.h b/src/system/SystemPacketBuffer.h index 513f0b4fbc0cdb..928743762e3de7 100644 --- a/src/system/SystemPacketBuffer.h +++ b/src/system/SystemPacketBuffer.h @@ -657,6 +657,8 @@ class DLL_EXPORT PacketBufferHandle #endif } + bool operator==(const PacketBufferHandle & aOther) const { return mBuffer == aOther.mBuffer; } + protected: #if CHIP_SYSTEM_CONFIG_USE_LWIP // For use via LwIPPacketBufferView only. @@ -684,8 +686,7 @@ class DLL_EXPORT PacketBufferHandle } PacketBuffer * Get() const { return mBuffer; } - - bool operator==(const PacketBufferHandle & aOther) const { return mBuffer == aOther.mBuffer; } + PacketBuffer * GetNext() const { return static_cast<PacketBuffer *>(mBuffer->next); } #if CHIP_SYSTEM_PACKETBUFFER_HAS_RIGHTSIZE void InternalRightSize(); diff --git a/src/system/tests/TestSystemPacketBuffer.cpp b/src/system/tests/TestSystemPacketBuffer.cpp index 5b3f709a5bee67..5ee708fcd476ed 100644 --- a/src/system/tests/TestSystemPacketBuffer.cpp +++ b/src/system/tests/TestSystemPacketBuffer.cpp @@ -469,13 +469,13 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckSetDataLength) { EXPECT_EQ(config_2.handle->len, (config_2.end_buffer - config_2.payload_ptr)); EXPECT_EQ(config_2.handle->tot_len, (config_2.end_buffer - config_2.payload_ptr)); - EXPECT_EQ(config_2.handle->next, nullptr); + EXPECT_EQ(config_2.handle.GetNext(), nullptr); } else { EXPECT_EQ(config_2.handle->len, length); EXPECT_EQ(config_2.handle->tot_len, length); - EXPECT_EQ(config_2.handle->next, nullptr); + EXPECT_EQ(config_2.handle.GetNext(), nullptr); } } else @@ -487,7 +487,7 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckSetDataLength) { EXPECT_EQ(config_2.handle->len, (config_2.end_buffer - config_2.payload_ptr)); EXPECT_EQ(config_2.handle->tot_len, (config_2.end_buffer - config_2.payload_ptr)); - EXPECT_EQ(config_2.handle->next, nullptr); + EXPECT_EQ(config_2.handle.GetNext(), nullptr); EXPECT_EQ(config_1.handle->tot_len, (config_1.init_len + static_cast<int32_t>(config_2.end_buffer - config_2.payload_ptr) - @@ -497,7 +497,7 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckSetDataLength) { EXPECT_EQ(config_2.handle->len, length); EXPECT_EQ(config_2.handle->tot_len, length); - EXPECT_EQ(config_2.handle->next, nullptr); + EXPECT_EQ(config_2.handle.GetNext(), nullptr); EXPECT_EQ(config_1.handle->tot_len, (config_1.init_len + static_cast<int32_t>(length) - static_cast<int32_t>(config_2.init_len))); @@ -632,9 +632,9 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckAddToEnd) EXPECT_EQ(config_3.handle->ref, 1); // config_3.handle EXPECT_EQ(config_1.handle->tot_len, (config_1.init_len + config_2.init_len)); - EXPECT_EQ(config_1.handle->next, config_2.handle.Get()); - EXPECT_EQ(config_2.handle->next, nullptr); - EXPECT_EQ(config_3.handle->next, nullptr); + EXPECT_EQ(config_1.handle.GetNext(), config_2.handle.Get()); + EXPECT_EQ(config_2.handle.GetNext(), nullptr); + EXPECT_EQ(config_3.handle.GetNext(), nullptr); config_1.handle->AddToEnd(config_3.handle.Retain()); EXPECT_EQ(config_1.handle->ref, 1); // config_1.handle @@ -642,9 +642,9 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckAddToEnd) EXPECT_EQ(config_3.handle->ref, 2); // config_3.handle and config_2.handle->next EXPECT_EQ(config_1.handle->tot_len, (config_1.init_len + config_2.init_len + config_3.init_len)); - EXPECT_EQ(config_1.handle->next, config_2.handle.Get()); - EXPECT_EQ(config_2.handle->next, config_3.handle.Get()); - EXPECT_EQ(config_3.handle->next, nullptr); + EXPECT_EQ(config_1.handle.GetNext(), config_2.handle.Get()); + EXPECT_EQ(config_2.handle.GetNext(), config_3.handle.Get()); + EXPECT_EQ(config_3.handle.GetNext(), nullptr); config_1.handle = nullptr; config_2.handle = nullptr; @@ -703,7 +703,7 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckPopHead) const PacketBufferHandle popped = config_1.handle.PopHead(); EXPECT_EQ(config_1.handle, config_2.handle); - EXPECT_EQ(config_1.handle->next, nullptr); + EXPECT_EQ(config_1.handle.GetNext(), nullptr); EXPECT_EQ(config_1.handle->tot_len, config_1.init_len); } } @@ -786,7 +786,7 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckCompactHead) { EXPECT_EQ(config_1.handle->len, config_1.handle->MaxDataLength()); EXPECT_EQ(buffer_2->len, config_1.handle->tot_len - config_1.handle->MaxDataLength()); - EXPECT_EQ(config_1.handle->next, buffer_2); + EXPECT_EQ(config_1.handle.GetNext(), buffer_2); EXPECT_EQ(config_1.handle->ref, 2); EXPECT_EQ(buffer_2->ref, 1); } @@ -796,13 +796,13 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckCompactHead) if (data_length_1 >= config_1.handle->MaxDataLength() && data_length_2 == 0) { /* make sure the second buffer is not freed */ - EXPECT_EQ(config_1.handle->next, buffer_2); + EXPECT_EQ(config_1.handle.GetNext(), buffer_2); EXPECT_EQ(buffer_2->ref, 1); } else { /* make sure the second buffer is freed */ - EXPECT_EQ(config_1.handle->next, nullptr); + EXPECT_EQ(config_1.handle.GetNext(), nullptr); buffer_2 = nullptr; } } @@ -1263,7 +1263,7 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckFree) // Verify that head ref count is decremented. EXPECT_EQ(config_1.handle->ref, initial_refs_1 - 1); // Verify that chain is maintained. - EXPECT_EQ(config_1.handle->next, config_2.handle.Get()); + EXPECT_EQ(config_1.handle.GetNext(), config_2.handle.Get()); // Verify that chained buffer ref count has not changed. EXPECT_EQ(config_2.handle->ref, initial_refs_2); } From 9d0a734b9acb256ef51f6dc31f1499e34fa10f2b Mon Sep 17 00:00:00 2001 From: Andrei Litvin <andy314@gmail.com> Date: Thu, 25 Apr 2024 17:32:13 -0400 Subject: [PATCH 048/124] [Bloat report]: Report zip file reading exception without failing everything. (#33181) * Report zip file reading exception without failing everything. * Fix bare except --- scripts/tools/memory/gh_report.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/tools/memory/gh_report.py b/scripts/tools/memory/gh_report.py index ddaa23a45e79ba..d28e2098d8e670 100755 --- a/scripts/tools/memory/gh_report.py +++ b/scripts/tools/memory/gh_report.py @@ -20,6 +20,7 @@ import logging import re import sys +import traceback from typing import Dict import fastcore # type: ignore @@ -163,8 +164,13 @@ def add_sizes_from_github(self): for i in required_artifact_ids: blob = self.gh.download_artifact(i) if blob: - self.db.add_sizes_from_zipfile(io.BytesIO(blob), - {'artifact': i}) + try: + self.db.add_sizes_from_zipfile(io.BytesIO(blob), + {'artifact': i}) + except Exception: + # Report in case the zipfile is invalid, however do not fail + # all the rest (behave as if artifact download has failed) + traceback.print_last() def read_inputs(self): """Read size report from github and/or local files.""" From b2234c248931d3666bf1a81edc6a6328e6ee74a4 Mon Sep 17 00:00:00 2001 From: Andrei Litvin <andy314@gmail.com> Date: Thu, 25 Apr 2024 17:37:20 -0400 Subject: [PATCH 049/124] Typo fix: not print last, print exc (#33182) --- scripts/tools/memory/gh_report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/tools/memory/gh_report.py b/scripts/tools/memory/gh_report.py index d28e2098d8e670..ba30cdec4b12b9 100755 --- a/scripts/tools/memory/gh_report.py +++ b/scripts/tools/memory/gh_report.py @@ -170,7 +170,7 @@ def add_sizes_from_github(self): except Exception: # Report in case the zipfile is invalid, however do not fail # all the rest (behave as if artifact download has failed) - traceback.print_last() + traceback.print_exc() def read_inputs(self): """Read size report from github and/or local files.""" From b99f6c62a576749905e012365b4df2a6ca2e1136 Mon Sep 17 00:00:00 2001 From: mkardous-silabs <84793247+mkardous-silabs@users.noreply.github.com> Date: Thu, 25 Apr 2024 20:43:02 -0400 Subject: [PATCH 050/124] Add missing define check for LCD calls (#33180) --- examples/lit-icd-app/silabs/src/AppTask.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/lit-icd-app/silabs/src/AppTask.cpp b/examples/lit-icd-app/silabs/src/AppTask.cpp index 0fb98266d2a81d..0f330e700b9548 100644 --- a/examples/lit-icd-app/silabs/src/AppTask.cpp +++ b/examples/lit-icd-app/silabs/src/AppTask.cpp @@ -170,11 +170,15 @@ void AppTask::ButtonEventHandler(uint8_t button, uint8_t btnAction) // DO NOT COPY for product logic. LIT ICD app is a test app with very simple application logic to enable testing. void AppTask::OnEnterActiveMode() { +#ifdef DISPLAY_ENABLED sAppTask.GetLCD().WriteDemoUI(true); +#endif } // DO NOT COPY for product logic. LIT ICD app is a test app with very simple application logic to enable testing. void AppTask::OnEnterIdleMode() { +#ifdef DISPLAY_ENABLED sAppTask.GetLCD().WriteDemoUI(false); +#endif } From 8b1fd136189433e1104d21618ca8969ab90a9e8f Mon Sep 17 00:00:00 2001 From: Boris Zbarsky <bzbarsky@apple.com> Date: Thu, 25 Apr 2024 21:40:46 -0400 Subject: [PATCH 051/124] Fix handling of non-permitted messages in ExchangeContext. (#33148) They should not count as responses, since we don't notify our delegate about them. --- src/messaging/ExchangeContext.cpp | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/messaging/ExchangeContext.cpp b/src/messaging/ExchangeContext.cpp index 3869ab4c48c921..f36a274be1da2a 100644 --- a/src/messaging/ExchangeContext.cpp +++ b/src/messaging/ExchangeContext.cpp @@ -596,21 +596,26 @@ CHIP_ERROR ExchangeContext::HandleMessage(uint32_t messageCounter, const Payload // Set kFlagReceivedAtLeastOneMessage to true since we have received at least one new application level message SetHasReceivedAtLeastOneMessage(true); - if (IsResponseExpected()) + // Don't send messages on to our delegate if our dispatch does not allow + // those messages. Those messages should also not be treated as responses, + // since if our delegate is expecting a response we will not notify it about + // these messages. + if (mDispatch.MessagePermitted(payloadHeader.GetProtocolID(), payloadHeader.GetMessageType())) { - // Since we got the response, cancel the response timer. - CancelResponseTimer(); + if (IsResponseExpected()) + { + // Since we got the response, cancel the response timer. + CancelResponseTimer(); - // If the context was expecting a response to a previously sent message, this message - // is implicitly that response. - SetResponseExpected(false); - } + // If the context was expecting a response to a previously sent message, this message + // is implicitly that response. + SetResponseExpected(false); + } - // Don't send messages on to our delegate if our dispatch does not allow - // those messages. - if (mDelegate != nullptr && mDispatch.MessagePermitted(payloadHeader.GetProtocolID(), payloadHeader.GetMessageType())) - { - return mDelegate->OnMessageReceived(this, payloadHeader, std::move(msgBuf)); + if (mDelegate != nullptr) + { + return mDelegate->OnMessageReceived(this, payloadHeader, std::move(msgBuf)); + } } DefaultOnMessageReceived(this, payloadHeader.GetProtocolID(), payloadHeader.GetMessageType(), messageCounter, From cfb940406b56f13c62fd9eb4c6d24c9aeed72826 Mon Sep 17 00:00:00 2001 From: shripad621git <79364691+shripad621git@users.noreply.github.com> Date: Fri, 26 Apr 2024 13:00:37 +0530 Subject: [PATCH 052/124] [ESP32] Fixed the output file name in log output for ESP32 factory partition script. (#33162) * Fixed the output file name in log output for ESP32 factory partition script * Restyled by autopep8 --------- Co-authored-by: Restyled.io <commits@restyled.io> --- .../tools/generate_esp32_chip_factory_bin.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/scripts/tools/generate_esp32_chip_factory_bin.py b/scripts/tools/generate_esp32_chip_factory_bin.py index ff00daedb53682..262be540a9bfed 100755 --- a/scripts/tools/generate_esp32_chip_factory_bin.py +++ b/scripts/tools/generate_esp32_chip_factory_bin.py @@ -382,7 +382,7 @@ def gen_raw_ec_keypair_from_der(key_file, pubkey_raw_file, privkey_raw_file): f.write(public_number_y.to_bytes(32, byteorder='big')) -def generate_nvs_csv(out_csv_filename): +def generate_nvs_csv(output_dir, out_csv_filename): csv_content = 'key,type,encoding,value\n' csv_content += 'chip-factory,namespace,,\n' @@ -391,10 +391,11 @@ def generate_nvs_csv(out_csv_filename): continue csv_content += f"{k},{v['type']},{v['encoding']},{v['value']}\n" - with open(out_csv_filename, 'w') as f: + with open(os.path.join(output_dir, out_csv_filename), 'w') as f: f.write(csv_content) - logging.info('Generated the factory partition csv file : {}'.format(os.path.abspath(out_csv_filename))) + logging.info('Generated the factory partition csv file : {}'.format( + os.path.abspath(os.path.join(output_dir, out_csv_filename)))) def generate_nvs_bin(encrypt, size, csv_filename, bin_filename, output_dir): @@ -412,13 +413,13 @@ def generate_nvs_bin(encrypt, size, csv_filename, bin_filename, output_dir): nvs_partition_gen.generate(nvs_args) -def print_flashing_help(encrypt, bin_filename): +def print_flashing_help(encrypt, output_dir, bin_filename): logging.info('Run below command to flash {}'.format(bin_filename)) - logging.info('esptool.py -p (PORT) write_flash (FACTORY_PARTITION_ADDR) {}'.format(os.path.join(os.getcwd(), bin_filename))) + logging.info('esptool.py -p (PORT) write_flash (FACTORY_PARTITION_ADDR) {}'.format(os.path.join(os.getcwd(), output_dir, bin_filename))) if (encrypt): logging.info('Run below command to flash {}'.format(NVS_KEY_PARTITION_BIN)) logging.info('esptool.py -p (PORT) write_flash --encrypt (NVS_KEY_PARTITION_ADDR) {}'.format( - os.path.join(os.getcwd(), 'keys', NVS_KEY_PARTITION_BIN))) + os.path.join(os.getcwd(), output_dir, 'keys', NVS_KEY_PARTITION_BIN))) def clean_up(): @@ -478,7 +479,7 @@ def any_base_int(s): return int(s, 0) help='Encrypt the factory parititon NVS binary') parser.add_argument('--no-bin', action='store_false', dest='generate_bin', help='Do not generate the factory partition binary') - parser.add_argument('--output_dir', type=str, default='bin', help='Created image output file path') + parser.add_argument('--output_dir', type=str, default='out', help='Created image output file path') parser.add_argument('-cf', '--commissioning-flow', type=any_base_int, default=0, help='Device commissioning flow, 0:Standard, 1:User-Intent, 2:Custom. \ @@ -506,10 +507,10 @@ def set_up_factory_data(args): def generate_factory_partiton_binary(args): - generate_nvs_csv(FACTORY_PARTITION_CSV) + generate_nvs_csv(args.output_dir, FACTORY_PARTITION_CSV) if args.generate_bin: generate_nvs_bin(args.encrypt, args.size, FACTORY_PARTITION_CSV, FACTORY_PARTITION_BIN, args.output_dir) - print_flashing_help(args.encrypt, FACTORY_PARTITION_BIN) + print_flashing_help(args.encrypt, args.output_dir, FACTORY_PARTITION_BIN) clean_up() From 5a23ad5f30b5ca47359de472aa555382f5b1d235 Mon Sep 17 00:00:00 2001 From: Kamil Kasperczyk <66371704+kkasperczyk-no@users.noreply.github.com> Date: Fri, 26 Apr 2024 15:52:29 +0200 Subject: [PATCH 053/124] [nrfconnect] Introduced several platform configuration fixes (#33194) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [nrfconnect] Disable Zephyr socket extensions The recvmsg() is now implemented natively in Zephyr, so we are not supposed to define a custom one. Signed-off-by: Marcin Kajor <marcin.kajor@nordicsemi.no> * [nrfconnect] Remove D_SYS__PTHREADTYPES_H_ flag ... from the gnu17 configuration to avoid missing pthread types definitions (_pthreadtypes.h). This tricked the preprocessor the header was already included, hence we didn't get its content. Signed-off-by: Marcin Kajor <marcin.kajor@nordicsemi.no> * [nrfconnect] Use newlib as a default libc implementation. The PICOLIB is now used by the default. NEWLIB_LIBC symbol is no longer selected by hostap. OpenThread selects NEWLIB_LIBC anyway. Signed-off-by: Marcin Kajor <marcin.kajor@nordicsemi.no> * [zephyr] Added OpenThread dependencies to a few Kconfigs Co-authored-by: Damian Krolik <damian.krolik@nordicsemi.no> * [zephyr] Lock Thread stack before factory reset This fixes a problem with Thread activity interrupting factory reset. This activity used to led to “Factory reset fail: -6”. Writing to the cleared nvm flash pages caused the problem. Signed-off-by: Patryk Lipinski <patryk.lipinski@nordicsemi.no> Signed-off-by: Michał Szablowski <michal.szablowski@nordicsemi.no> * [nrfconnect] Increase default number of packet buffers and stack size This commit reverts the previous optimization of reducing the number of packet buffers in the system. Additionally increase of stack size is needed to accomodate LTO. Signed-off-by: Łukasz Duda <lukasz.duda@nordicsemi.no> * [nrfconnect] Select Experimental for persistent subscriptions Currently, there is an issue with persistent subscriptions when multiple controllers create subscriptions. * [nrfconnect] Fixed mcuboot default configuration Removed the defaults from Kconfig.mcuboot.defaults configuration that should not be set there: * BOOT_ENCRYPT_X - are configs without a prompt, so it should not be modified outside of the mcuboot module * SPI_NOR and NORDIC_QSPI_NOR - are set based on the device tree configuration, so we should not set it, as it may lead to configuration and dts mismatch. Signed-off-by: Kamil Kasperczyk <kamil.kasperczyk@nordicsemi.no> * Revert "[nrfconnect] Disable Zephyr socket extensions" This reverts commit bb09061209748fe634a4b837f4db1db4f8b2d140. --------- Signed-off-by: Marcin Kajor <marcin.kajor@nordicsemi.no> Signed-off-by: Patryk Lipinski <patryk.lipinski@nordicsemi.no> Signed-off-by: Michał Szablowski <michal.szablowski@nordicsemi.no> Signed-off-by: Łukasz Duda <lukasz.duda@nordicsemi.no> Signed-off-by: Kamil Kasperczyk <kamil.kasperczyk@nordicsemi.no> Co-authored-by: Marcin Kajor <marcin.kajor@nordicsemi.no> Co-authored-by: Damian Krolik <damian.krolik@nordicsemi.no> Co-authored-by: Patryk Lipinski <patryk.lipinski@nordicsemi.no> Co-authored-by: Łukasz Duda <lukasz.duda@nordicsemi.no> Co-authored-by: Arkadiusz Balys <arkadiusz.balys@nordicsemi.no> --- config/nrfconnect/app/enable-gnu-std.cmake | 3 +-- config/nrfconnect/chip-module/Kconfig | 5 +++++ config/nrfconnect/chip-module/Kconfig.defaults | 12 ++++++++---- config/nrfconnect/chip-module/Kconfig.features | 4 +--- .../chip-module/Kconfig.mcuboot.defaults | 17 +---------------- config/zephyr/Kconfig | 7 +++++-- .../Zephyr/ConfigurationManagerImpl.cpp | 9 +++++++++ .../nrfconnect/CHIPDevicePlatformConfig.h | 4 ++++ src/platform/nrfconnect/SystemPlatformConfig.h | 2 +- 9 files changed, 35 insertions(+), 28 deletions(-) diff --git a/config/nrfconnect/app/enable-gnu-std.cmake b/config/nrfconnect/app/enable-gnu-std.cmake index 5f31e1a5c62ab8..4019bbd31bf27a 100644 --- a/config/nrfconnect/app/enable-gnu-std.cmake +++ b/config/nrfconnect/app/enable-gnu-std.cmake @@ -1,6 +1,5 @@ add_library(gnu17 INTERFACE) target_compile_options(gnu17 INTERFACE - $<$<COMPILE_LANGUAGE:CXX>:-std=gnu++17> - -D_SYS__PTHREADTYPES_H_) + $<$<COMPILE_LANGUAGE:CXX>:-std=gnu++17>) target_link_libraries(app PRIVATE gnu17) diff --git a/config/nrfconnect/chip-module/Kconfig b/config/nrfconnect/chip-module/Kconfig index 5d03e82530c84e..e3c5a86bf96c1d 100644 --- a/config/nrfconnect/chip-module/Kconfig +++ b/config/nrfconnect/chip-module/Kconfig @@ -302,4 +302,9 @@ config CHIP_FACTORY_RESET_ON_KEY_MIGRATION_FAILURE Perform factory reset of the device if the operational key for Fabric has not been migrated properly to PSA ITS storage. +config CHIP_PERSISTENT_SUBSCRIPTIONS + default n + # selecting experimental for this feature since there is an issue with multiple controllers. + select EXPERIMENTAL + endif # CHIP diff --git a/config/nrfconnect/chip-module/Kconfig.defaults b/config/nrfconnect/chip-module/Kconfig.defaults index 562755b14b9c25..7e3c2a6077d5ce 100644 --- a/config/nrfconnect/chip-module/Kconfig.defaults +++ b/config/nrfconnect/chip-module/Kconfig.defaults @@ -24,6 +24,10 @@ if CHIP # System configuration # ============================================================================== +choice LIBC_IMPLEMENTATION + default NEWLIB_LIBC +endchoice + config ASSERT default y @@ -318,13 +322,13 @@ if PSA_CRYPTO_DRIVER_CC3XX && PSA_CRYPTO_DRIVER_OBERON config PSA_USE_CC3XX_HASH_DRIVER default n -endif +endif # PSA_CRYPTO_DRIVER_CC3XX && PSA_CRYPTO_DRIVER_OBERON # Spake2+ support config MBEDTLS_MD_C default y -endif +endif # CHIP_CRYPTO_PSA if !CHIP_CRYPTO_PSA @@ -367,7 +371,7 @@ config MBEDTLS_ECP_C config MBEDTLS_ECP_DP_SECP256R1_ENABLED default y -endif +endif # !CHIP_CRYPTO_PSA config MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG default n if CHIP_WIFI @@ -487,4 +491,4 @@ config OPENTHREAD_SHELL endif # SHELL -endif \ No newline at end of file +endif # CHIP diff --git a/config/nrfconnect/chip-module/Kconfig.features b/config/nrfconnect/chip-module/Kconfig.features index 369f992c9a5070..e6a4e52d500e13 100644 --- a/config/nrfconnect/chip-module/Kconfig.features +++ b/config/nrfconnect/chip-module/Kconfig.features @@ -42,15 +42,13 @@ config CHIP_WIFI config CHIP_QSPI_NOR bool "Enable QSPI NOR feature set" + imply NORDIC_QSPI_NOR help Enables QSPI NOR flash with a set of options for configuring pages and buffer sizes. if CHIP_QSPI_NOR -config NORDIC_QSPI_NOR - default y - config NORDIC_QSPI_NOR_STACK_WRITE_BUFFER_SIZE default 16 diff --git a/config/nrfconnect/chip-module/Kconfig.mcuboot.defaults b/config/nrfconnect/chip-module/Kconfig.mcuboot.defaults index 31759beba22ffc..224dc57bfc2769 100644 --- a/config/nrfconnect/chip-module/Kconfig.mcuboot.defaults +++ b/config/nrfconnect/chip-module/Kconfig.mcuboot.defaults @@ -19,16 +19,7 @@ config MAIN_STACK_SIZE default 10240 -config BOOT_SWAP_SAVE_ENCTLV - default n - -config BOOT_ENCRYPT_RSA - default n - -config BOOT_ENCRYPT_EC256 - default n - -config BOOT_ENCRYPT_X25519 +config BOOT_ENCRYPT_IMAGE default n config BOOT_BOOTSTRAP @@ -53,9 +44,6 @@ if BOARD_NRF7002DK_NRF5340_CPUAPP config SPI default y -config SPI_NOR - default y - choice SPI_NOR_SFDP default SPI_NOR_SFDP_DEVICETREE endchoice @@ -74,9 +62,6 @@ endif # All boards beside nRF7002DK use QSPI NOR external flash if BOARD_NRF5340DK_NRF5340_CPUAPP || BOARD_NRF52840DK_NRF52840 -config NORDIC_QSPI_NOR - default y - config NORDIC_QSPI_NOR_FLASH_LAYOUT_PAGE_SIZE default 4096 diff --git a/config/zephyr/Kconfig b/config/zephyr/Kconfig index bdfa709592adff..c806ceed805385 100644 --- a/config/zephyr/Kconfig +++ b/config/zephyr/Kconfig @@ -309,7 +309,8 @@ config CHIP_PROJECT_CONFIG config CHIP_ENABLE_DNSSD_SRP bool "OpenThread Service Registration Protocol" - default y if NET_L2_OPENTHREAD + default y + depends on NET_L2_OPENTHREAD imply OPENTHREAD_ECDSA imply OPENTHREAD_SRP_CLIENT help @@ -318,7 +319,8 @@ config CHIP_ENABLE_DNSSD_SRP config CHIP_ENABLE_DNS_CLIENT bool "OpenThread DNS client" - default y if NET_L2_OPENTHREAD + default y + depends on NET_L2_OPENTHREAD imply OPENTHREAD_DNS_CLIENT help Enables using the OpenThread DNS client for the Matter service discovery. @@ -413,6 +415,7 @@ config CHIP_THREAD_SSED config CHIP_OPENTHREAD_CONFIG string "Custom OpenThread configuration file" + depends on NET_L2_OPENTHREAD help Provides a path to an OpenThread configuration file. The path can be either absolute or relative to the application directory. When this option diff --git a/src/platform/Zephyr/ConfigurationManagerImpl.cpp b/src/platform/Zephyr/ConfigurationManagerImpl.cpp index f41eed0492080f..2e937c95f0f9e0 100644 --- a/src/platform/Zephyr/ConfigurationManagerImpl.cpp +++ b/src/platform/Zephyr/ConfigurationManagerImpl.cpp @@ -40,6 +40,10 @@ #include <zephyr/settings/settings.h> #endif +#ifdef CONFIG_NET_L2_OPENTHREAD +#include <platform/ThreadStackManager.h> +#endif + namespace chip { namespace DeviceLayer { @@ -179,6 +183,11 @@ void ConfigurationManagerImpl::DoFactoryReset(intptr_t arg) { ChipLogProgress(DeviceLayer, "Performing factory reset"); +// Lock the Thread stack to avoid unwanted interaction with settings NVS during factory reset. +#ifdef CONFIG_NET_L2_OPENTHREAD + ThreadStackMgr().LockThreadStack(); +#endif + #ifdef CONFIG_CHIP_FACTORY_RESET_ERASE_NVS void * storage = nullptr; int status = settings_storage_get(&storage); diff --git a/src/platform/nrfconnect/CHIPDevicePlatformConfig.h b/src/platform/nrfconnect/CHIPDevicePlatformConfig.h index f9e445f35fb3d4..2e3c93289f8516 100644 --- a/src/platform/nrfconnect/CHIPDevicePlatformConfig.h +++ b/src/platform/nrfconnect/CHIPDevicePlatformConfig.h @@ -161,7 +161,11 @@ #endif // CHIP_DEVICE_CONFIG_CHIP_TASK_PRIORITY #ifndef CHIP_DEVICE_CONFIG_CHIP_TASK_STACK_SIZE +#if defined(CONFIG_LTO) +#define CHIP_DEVICE_CONFIG_CHIP_TASK_STACK_SIZE 10240 +#else #define CHIP_DEVICE_CONFIG_CHIP_TASK_STACK_SIZE 6144 +#endif // CONFIG_LTO #endif // CHIP_DEVICE_CONFIG_CHIP_TASK_STACK_SIZE #define CHIP_DEVICE_CONFIG_MAX_EVENT_QUEUE_SIZE 64 diff --git a/src/platform/nrfconnect/SystemPlatformConfig.h b/src/platform/nrfconnect/SystemPlatformConfig.h index 60d9c354d01ab1..fb544466dcdd75 100644 --- a/src/platform/nrfconnect/SystemPlatformConfig.h +++ b/src/platform/nrfconnect/SystemPlatformConfig.h @@ -48,7 +48,7 @@ struct ChipDeviceEvent; #define CHIP_SYSTEM_CONFIG_USE_SOCKETS 1 #ifndef CONFIG_ARCH_POSIX -#define CHIP_SYSTEM_CONFIG_PACKETBUFFER_POOL_SIZE 8 +#define CHIP_SYSTEM_CONFIG_PACKETBUFFER_POOL_SIZE 15 #endif #ifndef CHIP_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX From 2495011c26fb28426e5617a616c5ccecd19e5106 Mon Sep 17 00:00:00 2001 From: Marius Tache <102153746+marius-alex-tache@users.noreply.github.com> Date: Fri, 26 Apr 2024 16:54:41 +0300 Subject: [PATCH 054/124] [k32w0] Fix app partition info in readme file (#33139) Signed-off-by: marius-alex-tache <marius.tache@nxp.com> --- examples/contact-sensor-app/nxp/k32w/k32w0/README.md | 4 ++-- examples/lighting-app/nxp/k32w/k32w0/README.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/contact-sensor-app/nxp/k32w/k32w0/README.md b/examples/contact-sensor-app/nxp/k32w/k32w0/README.md index 5ad31921b665ae..5785c1143671d1 100644 --- a/examples/contact-sensor-app/nxp/k32w/k32w0/README.md +++ b/examples/contact-sensor-app/nxp/k32w/k32w0/README.md @@ -559,10 +559,10 @@ This is the list of all supported partitions: 00 -----------------> 0x00 Bootable flag 00 -----------------> 0x00 Image type (0x00 = SSBL) -004000000f020101: Application partition +00400000c9040101: Application partition 00400000 -----------> 0x00004000 Start Address - 0f02 ---------------> 0x020f Number of 512-bytes pages + c904 ---------------> 0x04c9 Number of 512-bytes pages 01 -----------------> 0x01 Bootable flag 01 -----------------> 0x01 Image type (0x01 = Application) diff --git a/examples/lighting-app/nxp/k32w/k32w0/README.md b/examples/lighting-app/nxp/k32w/k32w0/README.md index 106a614191c5f0..7cd4dd7d636ffc 100644 --- a/examples/lighting-app/nxp/k32w/k32w0/README.md +++ b/examples/lighting-app/nxp/k32w/k32w0/README.md @@ -534,10 +534,10 @@ This is the list of all supported partitions: 00 -----------------> 0x00 Bootable flag 00 -----------------> 0x00 Image type (0x00 = SSBL) -004000000f020101: Application partition +00400000c9040101: Application partition 00400000 -----------> 0x00004000 Start Address - 0f02 ---------------> 0x020f Number of 512-bytes pages + c904 ---------------> 0x04c9 Number of 512-bytes pages 01 -----------------> 0x01 Bootable flag 01 -----------------> 0x01 Image type (0x01 = Application) From 1174bdc75195a80b0c22b8910cc5fafb3e67cdd0 Mon Sep 17 00:00:00 2001 From: Matthew Swartwout <mwswartwout@users.noreply.github.com> Date: Fri, 26 Apr 2024 08:31:55 -0700 Subject: [PATCH 055/124] Fix initialization-order-fiasco (#32854) * Fix initialization-order-fiasco * Restyled by clang-format * Fix pointer declaration * Restyled by clang-format * Do not set mLocalMRPConfig in PairingSession constructor * Revert "Restyled by clang-format" This reverts commit 7b9c3a7f14f6e91830df0bf25944219036d18bc1. * Revert "Fix pointer declaration" This reverts commit d5282f6b0634150f32ee990a5e3b4c0eb6f1470e. * Revert "Restyled by clang-format" This reverts commit d73e6e1ca1b4798924a9131e661426346e2d5020. * Revert "Fix initialization-order-fiasco" This reverts commit e9510a243f84e3b96a5985974953a092343d1d32. * Add missing MakeOptional --------- Co-authored-by: Restyled.io <commits@restyled.io> --- src/protocols/secure_channel/CASESession.cpp | 13 ++++++++----- src/protocols/secure_channel/PASESession.cpp | 10 ++++++---- src/protocols/secure_channel/PairingSession.h | 3 ++- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/protocols/secure_channel/CASESession.cpp b/src/protocols/secure_channel/CASESession.cpp index e1bac768f81da6..aa6084d3680127 100644 --- a/src/protocols/secure_channel/CASESession.cpp +++ b/src/protocols/secure_channel/CASESession.cpp @@ -477,7 +477,7 @@ CASESession::PrepareForSessionEstablishment(SessionManager & sessionManager, Fab mFabricsTable = fabricTable; mRole = CryptoContext::SessionRole::kResponder; mSessionResumptionStorage = sessionResumptionStorage; - mLocalMRPConfig = mrpLocalConfig.ValueOr(GetDefaultMRPConfig()); + mLocalMRPConfig = MakeOptional(mrpLocalConfig.ValueOr(GetDefaultMRPConfig())); ChipLogDetail(SecureChannel, "Allocated SecureSession (%p) - waiting for Sigma1 msg", mSecureSessionHolder.Get().Value()->AsSecureSession()); @@ -525,7 +525,7 @@ CHIP_ERROR CASESession::EstablishSession(SessionManager & sessionManager, Fabric mFabricsTable = fabricTable; mFabricIndex = fabricInfo->GetFabricIndex(); mSessionResumptionStorage = sessionResumptionStorage; - mLocalMRPConfig = mrpLocalConfig.ValueOr(GetDefaultMRPConfig()); + mLocalMRPConfig = MakeOptional(mrpLocalConfig.ValueOr(GetDefaultMRPConfig())); mExchangeCtxt.Value()->UseSuggestedResponseTimeout(kExpectedSigma1ProcessingTime); mPeerNodeId = peerScopedNodeId.GetNodeId(); @@ -708,7 +708,8 @@ CHIP_ERROR CASESession::SendSigma1() ReturnErrorOnFailure( tlvWriter.PutBytes(TLV::ContextTag(4), mEphemeralKey->Pubkey(), static_cast<uint32_t>(mEphemeralKey->Pubkey().Length()))); - ReturnErrorOnFailure(EncodeSessionParameters(TLV::ContextTag(5), mLocalMRPConfig, tlvWriter)); + VerifyOrReturnError(mLocalMRPConfig.HasValue(), CHIP_ERROR_INCORRECT_STATE); + ReturnErrorOnFailure(EncodeSessionParameters(TLV::ContextTag(5), mLocalMRPConfig.Value(), tlvWriter)); // Try to find persistent session, and resume it. bool resuming = false; @@ -955,7 +956,8 @@ CHIP_ERROR CASESession::SendSigma2Resume() ReturnErrorOnFailure(tlvWriter.Put(TLV::ContextTag(3), GetLocalSessionId().Value())); - ReturnErrorOnFailure(EncodeSessionParameters(TLV::ContextTag(4), mLocalMRPConfig, tlvWriter)); + VerifyOrReturnError(mLocalMRPConfig.HasValue(), CHIP_ERROR_INCORRECT_STATE); + ReturnErrorOnFailure(EncodeSessionParameters(TLV::ContextTag(4), mLocalMRPConfig.Value(), tlvWriter)); ReturnErrorOnFailure(tlvWriter.EndContainer(outerContainerType)); ReturnErrorOnFailure(tlvWriter.Finalize(&msg_R2_resume)); @@ -1091,7 +1093,8 @@ CHIP_ERROR CASESession::SendSigma2() ReturnErrorOnFailure(tlvWriterMsg2.PutBytes(TLV::ContextTag(4), msg_R2_Encrypted.Get(), static_cast<uint32_t>(msg_r2_signed_enc_len + CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES))); - ReturnErrorOnFailure(EncodeSessionParameters(TLV::ContextTag(5), mLocalMRPConfig, tlvWriterMsg2)); + VerifyOrReturnError(mLocalMRPConfig.HasValue(), CHIP_ERROR_INCORRECT_STATE); + ReturnErrorOnFailure(EncodeSessionParameters(TLV::ContextTag(5), mLocalMRPConfig.Value(), tlvWriterMsg2)); ReturnErrorOnFailure(tlvWriterMsg2.EndContainer(outerContainerType)); ReturnErrorOnFailure(tlvWriterMsg2.Finalize(&msg_R2)); diff --git a/src/protocols/secure_channel/PASESession.cpp b/src/protocols/secure_channel/PASESession.cpp index e0f409616ab26c..1702a159bb111c 100644 --- a/src/protocols/secure_channel/PASESession.cpp +++ b/src/protocols/secure_channel/PASESession.cpp @@ -195,7 +195,7 @@ CHIP_ERROR PASESession::WaitForPairing(SessionManager & sessionManager, const Sp mIterationCount = pbkdf2IterCount; mNextExpectedMsg.SetValue(MsgType::PBKDFParamRequest); mPairingComplete = false; - mLocalMRPConfig = mrpLocalConfig.ValueOr(GetDefaultMRPConfig()); + mLocalMRPConfig = MakeOptional(mrpLocalConfig.ValueOr(GetDefaultMRPConfig())); ChipLogDetail(SecureChannel, "Waiting for PBKDF param request"); @@ -225,7 +225,7 @@ CHIP_ERROR PASESession::Pair(SessionManager & sessionManager, uint32_t peerSetUp mExchangeCtxt.Value()->UseSuggestedResponseTimeout(kExpectedLowProcessingTime); - mLocalMRPConfig = mrpLocalConfig.ValueOr(GetDefaultMRPConfig()); + mLocalMRPConfig = MakeOptional(mrpLocalConfig.ValueOr(GetDefaultMRPConfig())); err = SendPBKDFParamRequest(); SuccessOrExit(err); @@ -300,7 +300,8 @@ CHIP_ERROR PASESession::SendPBKDFParamRequest() ReturnErrorOnFailure(tlvWriter.Put(TLV::ContextTag(3), kDefaultCommissioningPasscodeId)); ReturnErrorOnFailure(tlvWriter.PutBoolean(TLV::ContextTag(4), mHavePBKDFParameters)); - ReturnErrorOnFailure(EncodeSessionParameters(TLV::ContextTag(5), mLocalMRPConfig, tlvWriter)); + VerifyOrReturnError(mLocalMRPConfig.HasValue(), CHIP_ERROR_INCORRECT_STATE); + ReturnErrorOnFailure(EncodeSessionParameters(TLV::ContextTag(5), mLocalMRPConfig.Value(), tlvWriter)); ReturnErrorOnFailure(tlvWriter.EndContainer(outerContainerType)); ReturnErrorOnFailure(tlvWriter.Finalize(&req)); @@ -420,7 +421,8 @@ CHIP_ERROR PASESession::SendPBKDFParamResponse(ByteSpan initiatorRandom, bool in ReturnErrorOnFailure(tlvWriter.EndContainer(pbkdfParamContainer)); } - ReturnErrorOnFailure(EncodeSessionParameters(TLV::ContextTag(5), mLocalMRPConfig, tlvWriter)); + VerifyOrReturnError(mLocalMRPConfig.HasValue(), CHIP_ERROR_INCORRECT_STATE); + ReturnErrorOnFailure(EncodeSessionParameters(TLV::ContextTag(5), mLocalMRPConfig.Value(), tlvWriter)); ReturnErrorOnFailure(tlvWriter.EndContainer(outerContainerType)); ReturnErrorOnFailure(tlvWriter.Finalize(&resp)); diff --git a/src/protocols/secure_channel/PairingSession.h b/src/protocols/secure_channel/PairingSession.h index fa639a7dd9459a..abdb69786c59f6 100644 --- a/src/protocols/secure_channel/PairingSession.h +++ b/src/protocols/secure_channel/PairingSession.h @@ -244,7 +244,8 @@ class DLL_EXPORT PairingSession : public SessionDelegate // mLocalMRPConfig is our config which is sent to the other end and used by the peer session. // mRemoteSessionParams is received from other end and set to our session. - ReliableMessageProtocolConfig mLocalMRPConfig = GetLocalMRPConfig().ValueOr(GetDefaultMRPConfig()); + // It is set the first time that session establishment is initiated. + Optional<ReliableMessageProtocolConfig> mLocalMRPConfig; SessionParameters mRemoteSessionParams; private: From 672269348217822d4eaf8675855dabd43b2e8721 Mon Sep 17 00:00:00 2001 From: Matthew Swartwout <mwswartwout@users.noreply.github.com> Date: Fri, 26 Apr 2024 08:35:42 -0700 Subject: [PATCH 056/124] Add std::source_location to ChipError for C++20 builds (#32935) * Add std::source_location to ChipError for C++20 builds * Fix errors due to CHIP_ERROR default constructor no longer being trivial * Restyled by clang-format * A few more fixes * Replace semicolon with comma * Add enum->int cast * Add tests and simplify constructor * Convert to gtest * Restyled by clang-format * Restyled by gn --------- Co-authored-by: Restyled.io <commits@restyled.io> --- src/app/FailSafeContext.cpp | 11 ++- src/app/clusters/bindings/bindings.cpp | 5 +- src/include/platform/CHIPDeviceEvent.h | 1 - .../GenericConnectivityManagerImpl_Thread.ipp | 9 +- src/lib/core/CHIPError.h | 56 ++++++++++--- src/lib/core/tests/BUILD.gn | 1 + src/lib/core/tests/TestCHIPError.cpp | 72 ++++++++++++++++ src/platform/DeviceControlServer.cpp | 24 +++--- src/platform/Linux/BLEManagerImpl.cpp | 82 ++++++++----------- .../Linux/ConnectivityManagerImpl.cpp | 8 +- src/platform/Linux/PlatformManagerImpl.cpp | 7 +- src/platform/Linux/ThreadStackManagerImpl.cpp | 18 ++-- ...nericThreadStackManagerImpl_OpenThread.hpp | 29 ++++--- src/platform/PlatformEventSupport.cpp | 4 +- 14 files changed, 200 insertions(+), 127 deletions(-) create mode 100644 src/lib/core/tests/TestCHIPError.cpp diff --git a/src/app/FailSafeContext.cpp b/src/app/FailSafeContext.cpp index 699fcb8c0ce280..95a5b267f2aa5e 100644 --- a/src/app/FailSafeContext.cpp +++ b/src/app/FailSafeContext.cpp @@ -85,12 +85,11 @@ void FailSafeContext::ScheduleFailSafeCleanup(FabricIndex fabricIndex, bool addN SetFailSafeArmed(false); - ChipDeviceEvent event; - event.Type = DeviceEventType::kFailSafeTimerExpired; - event.FailSafeTimerExpired.fabricIndex = fabricIndex; - event.FailSafeTimerExpired.addNocCommandHasBeenInvoked = addNocCommandInvoked; - event.FailSafeTimerExpired.updateNocCommandHasBeenInvoked = updateNocCommandInvoked; - CHIP_ERROR status = PlatformMgr().PostEvent(&event); + ChipDeviceEvent event{ .Type = DeviceEventType::kFailSafeTimerExpired, + .FailSafeTimerExpired = { .fabricIndex = fabricIndex, + .addNocCommandHasBeenInvoked = addNocCommandInvoked, + .updateNocCommandHasBeenInvoked = updateNocCommandInvoked } }; + CHIP_ERROR status = PlatformMgr().PostEvent(&event); if (status != CHIP_NO_ERROR) { diff --git a/src/app/clusters/bindings/bindings.cpp b/src/app/clusters/bindings/bindings.cpp index cd96e0d32fea78..d7c1712baf9672 100644 --- a/src/app/clusters/bindings/bindings.cpp +++ b/src/app/clusters/bindings/bindings.cpp @@ -259,9 +259,8 @@ CHIP_ERROR BindingTableAccess::WriteBindingTable(const ConcreteDataAttributePath CHIP_ERROR BindingTableAccess::NotifyBindingsChanged() { - DeviceLayer::ChipDeviceEvent event; - event.Type = DeviceLayer::DeviceEventType::kBindingsChangedViaCluster; - event.BindingsChanged.fabricIndex = mAccessingFabricIndex; + DeviceLayer::ChipDeviceEvent event{ .Type = DeviceLayer::DeviceEventType::kBindingsChangedViaCluster, + .BindingsChanged = { .fabricIndex = mAccessingFabricIndex } }; return chip::DeviceLayer::PlatformMgr().PostEvent(&event); } diff --git a/src/include/platform/CHIPDeviceEvent.h b/src/include/platform/CHIPDeviceEvent.h index 9d4f293cd3c3b0..cbab1d9817aed2 100644 --- a/src/include/platform/CHIPDeviceEvent.h +++ b/src/include/platform/CHIPDeviceEvent.h @@ -530,7 +530,6 @@ struct ChipDeviceEvent final } OtaStateChanged; }; - void Clear() { memset(this, 0, sizeof(*this)); } bool IsPublic() const { return DeviceEventType::IsPublic(Type); } bool IsInternal() const { return DeviceEventType::IsInternal(Type); } bool IsPlatformSpecific() const { return DeviceEventType::IsPlatformSpecific(Type); } diff --git a/src/include/platform/internal/GenericConnectivityManagerImpl_Thread.ipp b/src/include/platform/internal/GenericConnectivityManagerImpl_Thread.ipp index 403ddd643b7193..23b626033593ef 100644 --- a/src/include/platform/internal/GenericConnectivityManagerImpl_Thread.ipp +++ b/src/include/platform/internal/GenericConnectivityManagerImpl_Thread.ipp @@ -70,11 +70,10 @@ void GenericConnectivityManagerImpl_Thread<ImplClass>::UpdateServiceConnectivity mFlags.Set(Flags::kHaveServiceConnectivity, haveServiceConnectivity); { - ChipDeviceEvent event; - event.Clear(); - event.Type = DeviceEventType::kServiceConnectivityChange; - event.ServiceConnectivityChange.ViaThread.Result = - (haveServiceConnectivity) ? kConnectivity_Established : kConnectivity_Lost; + ChipDeviceEvent event{ .Type = DeviceEventType::kServiceConnectivityChange, + .ServiceConnectivityChange = { .ViaThread = { .Result = (haveServiceConnectivity) + ? kConnectivity_Established + : kConnectivity_Lost } } }; event.ServiceConnectivityChange.Overall.Result = event.ServiceConnectivityChange.ViaThread.Result; CHIP_ERROR status = PlatformMgr().PostEvent(&event); if (status != CHIP_NO_ERROR) diff --git a/src/lib/core/CHIPError.h b/src/lib/core/CHIPError.h index 38b76bca539c2a..37001c8c6971a2 100644 --- a/src/lib/core/CHIPError.h +++ b/src/lib/core/CHIPError.h @@ -35,6 +35,10 @@ #include <limits> #include <type_traits> +#if __cplusplus >= 202002L +#include <source_location> +#endif // __cplusplus >= 202002L + namespace chip { /** @@ -112,9 +116,13 @@ class ChipError // Helper for declaring constructors without too much repetition. #if CHIP_CONFIG_ERROR_SOURCE -#define CHIP_INITIALIZE_ERROR_SOURCE(f, l) , mFile((f)), mLine((l)) -#else // CHIP_CONFIG_ERROR_SOURCE -#define CHIP_INITIALIZE_ERROR_SOURCE(f, l) +#if __cplusplus >= 202002L +#define CHIP_INITIALIZE_ERROR_SOURCE(f, l, loc) , mFile((f)), mLine((l)), mSourceLocation((loc)) +#else +#define CHIP_INITIALIZE_ERROR_SOURCE(f, l, loc) , mFile((f)), mLine((l)) +#endif // __cplusplus >= 202002L +#else // CHIP_CONFIG_ERROR_SOURCE +#define CHIP_INITIALIZE_ERROR_SOURCE(f, l, loc) #endif // CHIP_CONFIG_ERROR_SOURCE /** @@ -123,12 +131,17 @@ class ChipError * @note * The result is valid only if CanEncapsulate() is true. */ - constexpr ChipError(Range range, ValueType value) : - mError(MakeInteger(range, (value & MakeMask(0, kValueLength)))) CHIP_INITIALIZE_ERROR_SOURCE(nullptr, 0) + constexpr ChipError(Range range, ValueType value) : ChipError(range, value, /*file=*/nullptr, /*line=*/0) {} +#if __cplusplus >= 202002L + constexpr ChipError(Range range, ValueType value, const char * file, unsigned int line, + std::source_location location = std::source_location::current()) : + mError(MakeInteger(range, (value & MakeMask(0, kValueLength)))) CHIP_INITIALIZE_ERROR_SOURCE(file, line, location) {} +#else constexpr ChipError(Range range, ValueType value, const char * file, unsigned int line) : - mError(MakeInteger(range, (value & MakeMask(0, kValueLength)))) CHIP_INITIALIZE_ERROR_SOURCE(file, line) + mError(MakeInteger(range, (value & MakeMask(0, kValueLength)))) CHIP_INITIALIZE_ERROR_SOURCE(file, line, /*loc=*/nullptr) {} +#endif // __cplusplus >= 202002L /** * Construct a CHIP_ERROR for SdkPart @a part with @a code. @@ -136,10 +149,17 @@ class ChipError * @note * The macro version CHIP_SDK_ERROR checks that the numeric value is constant and well-formed. */ - constexpr ChipError(SdkPart part, uint8_t code) : mError(MakeInteger(part, code)) CHIP_INITIALIZE_ERROR_SOURCE(nullptr, 0) {} + constexpr ChipError(SdkPart part, uint8_t code) : ChipError(part, code, /*file=*/nullptr, /*line=*/0) {} +#if __cplusplus >= 202002L + constexpr ChipError(SdkPart part, uint8_t code, const char * file, unsigned int line, + std::source_location location = std::source_location::current()) : + mError(MakeInteger(part, code)) CHIP_INITIALIZE_ERROR_SOURCE(file, line, location) + {} +#else constexpr ChipError(SdkPart part, uint8_t code, const char * file, unsigned int line) : - mError(MakeInteger(part, code)) CHIP_INITIALIZE_ERROR_SOURCE(file, line) + mError(MakeInteger(part, code)) CHIP_INITIALIZE_ERROR_SOURCE(file, line, /*loc=*/nullptr) {} +#endif // __cplusplus >= 202002L /** * Construct a CHIP_ERROR constant for SdkPart @a part with @a code at the current source line. @@ -159,10 +179,17 @@ class ChipError * @note * This is intended to be used only in foreign function interfaces. */ - explicit constexpr ChipError(StorageType error) : mError(error) CHIP_INITIALIZE_ERROR_SOURCE(nullptr, 0) {} + explicit constexpr ChipError(StorageType error) : ChipError(error, /*file=*/nullptr, /*line=*/0) {} +#if __cplusplus >= 202002L + explicit constexpr ChipError(StorageType error, const char * file, unsigned int line, + std::source_location location = std::source_location::current()) : + mError(error) CHIP_INITIALIZE_ERROR_SOURCE(file, line, location) + {} +#else explicit constexpr ChipError(StorageType error, const char * file, unsigned int line) : - mError(error) CHIP_INITIALIZE_ERROR_SOURCE(file, line) + mError(error) CHIP_INITIALIZE_ERROR_SOURCE(file, line, /*loc=*/nullptr) {} +#endif // __cplusplus >= 202002L #undef CHIP_INITIALIZE_ERROR_SOURCE @@ -299,6 +326,12 @@ class ChipError */ unsigned int GetLine() const { return mLine; } +#if __cplusplus >= 202002L + /** + * Get the source_location of the point where the error occurred. + */ + const std::source_location & GetSourceLocation() { return mSourceLocation; } +#endif // __cplusplus >= 202002L #endif // CHIP_CONFIG_ERROR_SOURCE private: @@ -365,6 +398,9 @@ class ChipError #if CHIP_CONFIG_ERROR_SOURCE const char * mFile; unsigned int mLine; +#if __cplusplus >= 202002L + std::source_location mSourceLocation; +#endif // __cplusplus >= 202002L #endif // CHIP_CONFIG_ERROR_SOURCE public: diff --git a/src/lib/core/tests/BUILD.gn b/src/lib/core/tests/BUILD.gn index 3092ac36809f59..30d50ee9493699 100644 --- a/src/lib/core/tests/BUILD.gn +++ b/src/lib/core/tests/BUILD.gn @@ -24,6 +24,7 @@ chip_test_suite("tests") { test_sources = [ "TestCATValues.cpp", "TestCHIPCallback.cpp", + "TestCHIPError.cpp", "TestCHIPErrorStr.cpp", "TestOTAImageHeader.cpp", "TestOptional.cpp", diff --git a/src/lib/core/tests/TestCHIPError.cpp b/src/lib/core/tests/TestCHIPError.cpp new file mode 100644 index 00000000000000..ba0c25906623a8 --- /dev/null +++ b/src/lib/core/tests/TestCHIPError.cpp @@ -0,0 +1,72 @@ +/* + * + * 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 <string> + +#include <lib/core/CHIPError.h> + +#include <gtest/gtest.h> + +namespace chip { +namespace { + +TEST(ChipErrorTest, RangeConstructor) +{ + ChipError error(ChipError::Range::kSDK, /*value=*/1, __FILE__, __LINE__); +#if CHIP_CONFIG_ERROR_SOURCE + EXPECT_EQ(error.GetFile(), __FILE__); + EXPECT_EQ(error.GetLine(), 30u); +#if __cplusplus >= 202002L + std::source_location location = error.GetSourceLocation(); + EXPECT_EQ(location.line(), 30u); + EXPECT_EQ(location.file_name(), __FILE__); +#endif // __cplusplus >= 202002L +#endif // CHIP_CONFIG_ERROR_SOURCE +} + +TEST(ChipErrorTest, SdkPartConstructor) +{ + ChipError error(ChipError::SdkPart::kCore, /*code=*/1, __FILE__, __LINE__); +#if CHIP_CONFIG_ERROR_SOURCE + EXPECT_EQ(error.GetFile(), __FILE__); + EXPECT_EQ(error.GetLine(), 44u); +#if __cplusplus >= 202002L + std::source_location location = error.GetSourceLocation(); + EXPECT_EQ(location.line(), 44u); + EXPECT_EQ(location.file_name(), __FILE__); +#endif // __cplusplus >= 202002L +#endif // CHIP_CONFIG_ERROR_SOURCE +} + +TEST(ChipErrorTest, StorageTypeConstructor) +{ + ChipError error(/*error=*/1, __FILE__, __LINE__); + EXPECT_EQ(error.AsInteger(), 1u); +#if CHIP_CONFIG_ERROR_SOURCE + EXPECT_EQ(error.GetFile(), __FILE__); + EXPECT_EQ(error.GetLine(), 58u); +#if __cplusplus >= 202002L + std::source_location location = error.GetSourceLocation(); + EXPECT_EQ(location.line(), 58u); + EXPECT_EQ(location.file_name(), __FILE__); +#endif // __cplusplus >= 202002L +#endif // CHIP_CONFIG_ERROR_SOURCE +} + +} // namespace +} // namespace chip diff --git a/src/platform/DeviceControlServer.cpp b/src/platform/DeviceControlServer.cpp index ec348669aec213..584ddbc08f056e 100644 --- a/src/platform/DeviceControlServer.cpp +++ b/src/platform/DeviceControlServer.cpp @@ -36,11 +36,11 @@ DeviceControlServer & DeviceControlServer::DeviceControlSvr() CHIP_ERROR DeviceControlServer::PostCommissioningCompleteEvent(NodeId peerNodeId, FabricIndex accessingFabricIndex) { - ChipDeviceEvent event; + ChipDeviceEvent event{ - event.Type = DeviceEventType::kCommissioningComplete; - event.CommissioningComplete.nodeId = peerNodeId; - event.CommissioningComplete.fabricIndex = accessingFabricIndex; + .Type = DeviceEventType::kCommissioningComplete, + .CommissioningComplete = { .nodeId = peerNodeId, .fabricIndex = accessingFabricIndex } + }; return PlatformMgr().PostEvent(&event); } @@ -66,31 +66,27 @@ CHIP_ERROR DeviceControlServer::SetRegulatoryConfig(uint8_t location, const Char CHIP_ERROR DeviceControlServer::PostConnectedToOperationalNetworkEvent(ByteSpan networkID) { - ChipDeviceEvent event; - event.Type = DeviceEventType::kOperationalNetworkEnabled; - // TODO(cecille): This should be some way to specify thread or wifi. - event.OperationalNetwork.network = 0; + ChipDeviceEvent event{ .Type = DeviceEventType::kOperationalNetworkEnabled, + // TODO(cecille): This should be some way to specify thread or wifi. + .OperationalNetwork = { .network = 0 } }; return PlatformMgr().PostEvent(&event); } CHIP_ERROR DeviceControlServer::PostCloseAllBLEConnectionsToOperationalNetworkEvent() { - ChipDeviceEvent event; - event.Type = DeviceEventType::kCloseAllBleConnections; + ChipDeviceEvent event{ .Type = DeviceEventType::kCloseAllBleConnections }; return PlatformMgr().PostEvent(&event); } CHIP_ERROR DeviceControlServer::PostWiFiDeviceAvailableNetworkEvent() { - ChipDeviceEvent event; - event.Type = DeviceEventType::kWiFiDeviceAvailable; + ChipDeviceEvent event{ .Type = DeviceEventType::kWiFiDeviceAvailable }; return PlatformMgr().PostEvent(&event); } CHIP_ERROR DeviceControlServer::PostOperationalNetworkStartedEvent() { - ChipDeviceEvent event; - event.Type = DeviceEventType::kOperationalNetworkStarted; + ChipDeviceEvent event{ .Type = DeviceEventType::kOperationalNetworkStarted }; return PlatformMgr().PostEvent(&event); } diff --git a/src/platform/Linux/BLEManagerImpl.cpp b/src/platform/Linux/BLEManagerImpl.cpp index a5bd19f877a6a8..a61c6e2403de02 100644 --- a/src/platform/Linux/BLEManagerImpl.cpp +++ b/src/platform/Linux/BLEManagerImpl.cpp @@ -204,8 +204,7 @@ void BLEManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event) case DeviceEventType::kCHIPoBLESubscribe: HandleSubscribeReceived(event->CHIPoBLESubscribe.ConId, &CHIP_BLE_SVC_ID, &ChipUUID_CHIPoBLEChar_TX); { - ChipDeviceEvent connectionEvent; - connectionEvent.Type = DeviceEventType::kCHIPoBLEConnectionEstablished; + ChipDeviceEvent connectionEvent{ .Type = DeviceEventType::kCHIPoBLEConnectionEstablished }; PlatformMgr().PostEventOrDie(&connectionEvent); } break; @@ -464,9 +463,8 @@ void BLEManagerImpl::HandleNewConnection(BLE_CONNECTION_OBJECT conId) { if (sInstance.mIsCentral) { - ChipDeviceEvent event; - event.Type = DeviceEventType::kPlatformLinuxBLECentralConnected; - event.Platform.BLECentralConnected.mConnection = conId; + ChipDeviceEvent event{ .Type = DeviceEventType::kPlatformLinuxBLECentralConnected, + .Platform = { .BLECentralConnected = { .mConnection = conId } } }; PlatformMgr().PostEventOrDie(&event); } } @@ -475,27 +473,23 @@ void BLEManagerImpl::HandleConnectFailed(CHIP_ERROR error) { if (sInstance.mIsCentral) { - ChipDeviceEvent event; - event.Type = DeviceEventType::kPlatformLinuxBLECentralConnectFailed; - event.Platform.BLECentralConnectFailed.mError = error; + ChipDeviceEvent event{ .Type = DeviceEventType::kPlatformLinuxBLECentralConnectFailed, + .Platform = { .BLECentralConnectFailed = { .mError = error } } }; PlatformMgr().PostEventOrDie(&event); } } void BLEManagerImpl::HandleWriteComplete(BLE_CONNECTION_OBJECT conId) { - ChipDeviceEvent event; - event.Type = DeviceEventType::kPlatformLinuxBLEWriteComplete; - event.Platform.BLEWriteComplete.mConnection = conId; + ChipDeviceEvent event{ .Type = DeviceEventType::kPlatformLinuxBLEWriteComplete, + .Platform = { .BLEWriteComplete = { .mConnection = conId } } }; PlatformMgr().PostEventOrDie(&event); } void BLEManagerImpl::HandleSubscribeOpComplete(BLE_CONNECTION_OBJECT conId, bool subscribed) { - ChipDeviceEvent event; - event.Type = DeviceEventType::kPlatformLinuxBLESubscribeOpComplete; - event.Platform.BLESubscribeOpComplete.mConnection = conId; - event.Platform.BLESubscribeOpComplete.mIsSubscribed = subscribed; + ChipDeviceEvent event{ .Type = DeviceEventType::kPlatformLinuxBLESubscribeOpComplete, + .Platform = { .BLESubscribeOpComplete = { .mConnection = conId, .mIsSubscribed = subscribed } } }; PlatformMgr().PostEventOrDie(&event); } @@ -506,12 +500,12 @@ void BLEManagerImpl::HandleTXCharChanged(BLE_CONNECTION_OBJECT conId, const uint ChipLogDetail(DeviceLayer, "Indication received, conn = %p", conId); + ChipDeviceEvent event{ .Type = DeviceEventType::kPlatformLinuxBLEIndicationReceived, + .Platform = { .BLEIndicationReceived = { .mConnection = conId } } }; + VerifyOrExit(!buf.IsNull(), err = CHIP_ERROR_NO_MEMORY); - ChipDeviceEvent event; - event.Type = DeviceEventType::kPlatformLinuxBLEIndicationReceived; - event.Platform.BLEIndicationReceived.mConnection = conId; - event.Platform.BLEIndicationReceived.mData = std::move(buf).UnsafeRelease(); + event.Platform.BLEIndicationReceived.mData = std::move(buf).UnsafeRelease(); PlatformMgr().PostEventOrDie(&event); exit: @@ -530,11 +524,9 @@ void BLEManagerImpl::HandleRXCharWrite(BLE_CONNECTION_OBJECT conId, const uint8_ // Post an event to the Chip queue to deliver the data into the Chip stack. { - ChipDeviceEvent event; - event.Type = DeviceEventType::kCHIPoBLEWriteReceived; ChipLogProgress(Ble, "Write request received debug %p", conId); - event.CHIPoBLEWriteReceived.ConId = conId; - event.CHIPoBLEWriteReceived.Data = std::move(buf).UnsafeRelease(); + ChipDeviceEvent event{ .Type = DeviceEventType::kCHIPoBLEWriteReceived, + .CHIPoBLEWriteReceived = { .ConId = conId, .Data = std::move(buf).UnsafeRelease() } }; PlatformMgr().PostEventOrDie(&event); } @@ -551,10 +543,8 @@ void BLEManagerImpl::CHIPoBluez_ConnectionClosed(BLE_CONNECTION_OBJECT conId) // If this was a CHIPoBLE connection, post an event to deliver a connection error to the CHIPoBLE layer. { - ChipDeviceEvent event; - event.Type = DeviceEventType::kCHIPoBLEConnectionError; - event.CHIPoBLEConnectionError.ConId = conId; - event.CHIPoBLEConnectionError.Reason = BLE_ERROR_REMOTE_DEVICE_DISCONNECTED; + ChipDeviceEvent event{ .Type = DeviceEventType::kCHIPoBLEConnectionError, + .CHIPoBLEConnectionError = { .ConId = conId, .Reason = BLE_ERROR_REMOTE_DEVICE_DISCONNECTED } }; PlatformMgr().PostEventOrDie(&event); } } @@ -566,9 +556,9 @@ void BLEManagerImpl::HandleTXCharCCCDWrite(BLE_CONNECTION_OBJECT conId) // Post an event to the Chip queue to process either a CHIPoBLE Subscribe or Unsubscribe based on // whether the client is enabling or disabling indications. - ChipDeviceEvent event; - event.Type = conId->IsNotifyAcquired() ? DeviceEventType::kCHIPoBLESubscribe : DeviceEventType::kCHIPoBLEUnsubscribe; - event.CHIPoBLESubscribe.ConId = conId; + ChipDeviceEvent event{ .Type = conId->IsNotifyAcquired() ? static_cast<uint16_t>(DeviceEventType::kCHIPoBLESubscribe) + : static_cast<uint16_t>(DeviceEventType::kCHIPoBLEUnsubscribe), + .CHIPoBLESubscribe = { .ConId = conId } }; PlatformMgr().PostEventOrDie(&event); ChipLogProgress(DeviceLayer, "CHIPoBLE %s received", @@ -578,9 +568,7 @@ void BLEManagerImpl::HandleTXCharCCCDWrite(BLE_CONNECTION_OBJECT conId) void BLEManagerImpl::HandleTXComplete(BLE_CONNECTION_OBJECT conId) { // Post an event to the Chip queue to process the indicate confirmation. - ChipDeviceEvent event; - event.Type = DeviceEventType::kCHIPoBLEIndicateConfirm; - event.CHIPoBLEIndicateConfirm.ConId = conId; + ChipDeviceEvent event{ .Type = DeviceEventType::kCHIPoBLEIndicateConfirm, .CHIPoBLEIndicateConfirm = { .ConId = conId } }; PlatformMgr().PostEventOrDie(&event); } @@ -835,50 +823,44 @@ CHIP_ERROR BLEManagerImpl::CancelConnection() void BLEManagerImpl::NotifyBLEAdapterAdded(unsigned int aAdapterId, const char * aAdapterAddress) { - ChipDeviceEvent event; - event.Type = DeviceEventType::kPlatformLinuxBLEAdapterAdded; - event.Platform.BLEAdapter.mAdapterId = aAdapterId; + ChipDeviceEvent event{ .Type = DeviceEventType::kPlatformLinuxBLEAdapterAdded, + .Platform = { .BLEAdapter = { .mAdapterId = aAdapterId } } }; Platform::CopyString(event.Platform.BLEAdapter.mAdapterAddress, aAdapterAddress); PlatformMgr().PostEventOrDie(&event); } void BLEManagerImpl::NotifyBLEAdapterRemoved(unsigned int aAdapterId, const char * aAdapterAddress) { - ChipDeviceEvent event; - event.Type = DeviceEventType::kPlatformLinuxBLEAdapterRemoved; - event.Platform.BLEAdapter.mAdapterId = aAdapterId; + ChipDeviceEvent event{ .Type = DeviceEventType::kPlatformLinuxBLEAdapterRemoved, + .Platform = { .BLEAdapter = { .mAdapterId = aAdapterId } } }; Platform::CopyString(event.Platform.BLEAdapter.mAdapterAddress, aAdapterAddress); PlatformMgr().PostEventOrDie(&event); } void BLEManagerImpl::NotifyBLEPeripheralRegisterAppComplete(CHIP_ERROR error) { - ChipDeviceEvent event; - event.Type = DeviceEventType::kPlatformLinuxBLEPeripheralRegisterAppComplete; - event.Platform.BLEPeripheralRegisterAppComplete.mError = error; + ChipDeviceEvent event{ .Type = DeviceEventType::kPlatformLinuxBLEPeripheralRegisterAppComplete, + .Platform = { .BLEPeripheralRegisterAppComplete = { .mError = error } } }; PlatformMgr().PostEventOrDie(&event); } void BLEManagerImpl::NotifyBLEPeripheralAdvStartComplete(CHIP_ERROR error) { - ChipDeviceEvent event; - event.Type = DeviceEventType::kPlatformLinuxBLEPeripheralAdvStartComplete; - event.Platform.BLEPeripheralAdvStartComplete.mError = error; + ChipDeviceEvent event{ .Type = DeviceEventType::kPlatformLinuxBLEPeripheralAdvStartComplete, + .Platform = { .BLEPeripheralAdvStartComplete = { .mError = error } } }; PlatformMgr().PostEventOrDie(&event); } void BLEManagerImpl::NotifyBLEPeripheralAdvStopComplete(CHIP_ERROR error) { - ChipDeviceEvent event; - event.Type = DeviceEventType::kPlatformLinuxBLEPeripheralAdvStopComplete; - event.Platform.BLEPeripheralAdvStopComplete.mError = error; + ChipDeviceEvent event{ .Type = DeviceEventType::kPlatformLinuxBLEPeripheralAdvStopComplete, + .Platform = { .BLEPeripheralAdvStopComplete = { .mError = error } } }; PlatformMgr().PostEventOrDie(&event); } void BLEManagerImpl::NotifyBLEPeripheralAdvReleased() { - ChipDeviceEvent event; - event.Type = DeviceEventType::kPlatformLinuxBLEPeripheralAdvReleased; + ChipDeviceEvent event{ .Type = DeviceEventType::kPlatformLinuxBLEPeripheralAdvReleased }; PlatformMgr().PostEventOrDie(&event); } diff --git a/src/platform/Linux/ConnectivityManagerImpl.cpp b/src/platform/Linux/ConnectivityManagerImpl.cpp index f7edd474e2d7ea..cd3922baaf2b02 100644 --- a/src/platform/Linux/ConnectivityManagerImpl.cpp +++ b/src/platform/Linux/ConnectivityManagerImpl.cpp @@ -1278,11 +1278,9 @@ void ConnectivityManagerImpl::PostNetworkConnect() chip::Inet::IPAddress addr; if ((it.GetAddress(addr) == CHIP_NO_ERROR) && addr.IsIPv4()) { - ChipDeviceEvent event; - event.Type = DeviceEventType::kInternetConnectivityChange; - event.InternetConnectivityChange.IPv4 = kConnectivity_Established; - event.InternetConnectivityChange.IPv6 = kConnectivity_NoChange; - event.InternetConnectivityChange.ipAddress = addr; + ChipDeviceEvent event{ .Type = DeviceEventType::kInternetConnectivityChange, + .InternetConnectivityChange = { + .IPv4 = kConnectivity_Established, .IPv6 = kConnectivity_NoChange, .ipAddress = addr } }; char ipStrBuf[chip::Inet::IPAddress::kMaxStringLength] = { 0 }; addr.ToString(ipStrBuf); diff --git a/src/platform/Linux/PlatformManagerImpl.cpp b/src/platform/Linux/PlatformManagerImpl.cpp index 401d72bbe413bd..68f3d58c1ac87b 100644 --- a/src/platform/Linux/PlatformManagerImpl.cpp +++ b/src/platform/Linux/PlatformManagerImpl.cpp @@ -123,10 +123,9 @@ gboolean WiFiIPChangeListener(GIOChannel * ch, GIOCondition /* condition */, voi inet_ntop(AF_INET, RTA_DATA(routeInfo), ipStrBuf, sizeof(ipStrBuf)); ChipLogDetail(DeviceLayer, "Got IP address on interface: %s IP: %s", name, ipStrBuf); - ChipDeviceEvent event; - event.Type = DeviceEventType::kInternetConnectivityChange; - event.InternetConnectivityChange.IPv4 = kConnectivity_Established; - event.InternetConnectivityChange.IPv6 = kConnectivity_NoChange; + ChipDeviceEvent event{ .Type = DeviceEventType::kInternetConnectivityChange, + .InternetConnectivityChange = { .IPv4 = kConnectivity_Established, + .IPv6 = kConnectivity_NoChange } }; if (!chip::Inet::IPAddress::FromString(ipStrBuf, event.InternetConnectivityChange.ipAddress)) { diff --git a/src/platform/Linux/ThreadStackManagerImpl.cpp b/src/platform/Linux/ThreadStackManagerImpl.cpp index 40bd31ecaeee44..126d30164492fe 100644 --- a/src/platform/Linux/ThreadStackManagerImpl.cpp +++ b/src/platform/Linux/ThreadStackManagerImpl.cpp @@ -148,13 +148,11 @@ void ThreadStackManagerImpl::ThreadDeviceRoleChangedHandler(const gchar * role) { bool attached = strcmp(role, kOpenthreadDeviceRoleDetached) != 0 && strcmp(role, kOpenthreadDeviceRoleDisabled) != 0; - ChipDeviceEvent event = ChipDeviceEvent{}; - if (attached != mAttached) { - event.Type = DeviceEventType::kThreadConnectivityChange; - event.ThreadConnectivityChange.Result = - attached ? ConnectivityChange::kConnectivity_Established : ConnectivityChange::kConnectivity_Lost; + ChipDeviceEvent event{ .Type = DeviceEventType::kThreadConnectivityChange, + .ThreadConnectivityChange = { .Result = attached ? ConnectivityChange::kConnectivity_Established + : ConnectivityChange::kConnectivity_Lost } }; CHIP_ERROR status = PlatformMgr().PostEvent(&event); if (status != CHIP_NO_ERROR) { @@ -163,9 +161,8 @@ void ThreadStackManagerImpl::ThreadDeviceRoleChangedHandler(const gchar * role) } mAttached = attached; - event.Type = DeviceEventType::kThreadStateChange; - event.ThreadStateChange.RoleChanged = true; - CHIP_ERROR status = PlatformMgr().PostEvent(&event); + ChipDeviceEvent event{ .Type = DeviceEventType::kThreadStateChange, .ThreadStateChange = { .RoleChanged = true } }; + CHIP_ERROR status = PlatformMgr().PostEvent(&event); if (status != CHIP_NO_ERROR) { ChipLogError(DeviceLayer, "Failed to post thread state change: %" CHIP_ERROR_FORMAT, status.Format()); @@ -257,9 +254,8 @@ CHIP_ERROR ThreadStackManagerImpl::_SetThreadProvision(ByteSpan netInfo) VerifyOrReturnError(err == CHIP_NO_ERROR, err, ChipLogError(DeviceLayer, "openthread: failed to set active dataset")); // post an event alerting other subsystems about change in provisioning state - ChipDeviceEvent event; - event.Type = DeviceEventType::kServiceProvisioningChange; - event.ServiceProvisioningChange.IsServiceProvisioned = true; + ChipDeviceEvent event{ .Type = DeviceEventType::kServiceProvisioningChange, + .ServiceProvisioningChange = { .IsServiceProvisioned = true } }; return PlatformMgr().PostEvent(&event); } diff --git a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp index 7c3111a2082339..f4548e67829582 100644 --- a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp +++ b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp @@ -123,13 +123,14 @@ NetworkCommissioning::otScanResponseIterator<NetworkCommissioning::ThreadScanRes template <class ImplClass> void GenericThreadStackManagerImpl_OpenThread<ImplClass>::OnOpenThreadStateChange(uint32_t flags, void * context) { - ChipDeviceEvent event; - event.Type = DeviceEventType::kThreadStateChange; - event.ThreadStateChange.RoleChanged = (flags & OT_CHANGED_THREAD_ROLE) != 0; - event.ThreadStateChange.AddressChanged = (flags & (OT_CHANGED_IP6_ADDRESS_ADDED | OT_CHANGED_IP6_ADDRESS_REMOVED)) != 0; - event.ThreadStateChange.NetDataChanged = (flags & OT_CHANGED_THREAD_NETDATA) != 0; - event.ThreadStateChange.ChildNodesChanged = (flags & (OT_CHANGED_THREAD_CHILD_ADDED | OT_CHANGED_THREAD_CHILD_REMOVED)) != 0; - event.ThreadStateChange.OpenThread.Flags = flags; + ChipDeviceEvent event{ .Type = DeviceEventType::kThreadStateChange, + .ThreadStateChange = { + .RoleChanged = (flags & OT_CHANGED_THREAD_ROLE) != 0, + .AddressChanged = (flags & (OT_CHANGED_IP6_ADDRESS_ADDED | OT_CHANGED_IP6_ADDRESS_REMOVED)) != 0, + .NetDataChanged = (flags & OT_CHANGED_THREAD_NETDATA) != 0, + .ChildNodesChanged = + (flags & (OT_CHANGED_THREAD_CHILD_ADDED | OT_CHANGED_THREAD_CHILD_REMOVED)) != 0, + .OpenThread = { .Flags = flags } } }; CHIP_ERROR status = PlatformMgr().PostEvent(&event); if (status != CHIP_NO_ERROR) @@ -211,11 +212,10 @@ void GenericThreadStackManagerImpl_OpenThread<ImplClass>::_OnPlatformEvent(const // Avoid sending muliple events if the attachement state didn't change (Child->router or disable->Detached) if (event->ThreadStateChange.RoleChanged && (isThreadAttached != mIsAttached)) { - ChipDeviceEvent attachEvent; - attachEvent.Clear(); - attachEvent.Type = DeviceEventType::kThreadConnectivityChange; - attachEvent.ThreadConnectivityChange.Result = (isThreadAttached) ? kConnectivity_Established : kConnectivity_Lost; - CHIP_ERROR status = PlatformMgr().PostEvent(&attachEvent); + ChipDeviceEvent attachEvent{ .Type = DeviceEventType::kThreadConnectivityChange, + .ThreadConnectivityChange = { .Result = (isThreadAttached) ? kConnectivity_Established + : kConnectivity_Lost } }; + CHIP_ERROR status = PlatformMgr().PostEvent(&attachEvent); if (status == CHIP_NO_ERROR) { mIsAttached = isThreadAttached; @@ -317,9 +317,8 @@ CHIP_ERROR GenericThreadStackManagerImpl_OpenThread<ImplClass>::_SetThreadProvis } // post an event alerting other subsystems about change in provisioning state - ChipDeviceEvent event; - event.Type = DeviceEventType::kServiceProvisioningChange; - event.ServiceProvisioningChange.IsServiceProvisioned = true; + ChipDeviceEvent event{ .Type = DeviceEventType::kServiceProvisioningChange, + .ServiceProvisioningChange = { .IsServiceProvisioned = true } }; return PlatformMgr().PostEvent(&event); } diff --git a/src/platform/PlatformEventSupport.cpp b/src/platform/PlatformEventSupport.cpp index 1572a3da865457..947a7f2fe691f8 100644 --- a/src/platform/PlatformEventSupport.cpp +++ b/src/platform/PlatformEventSupport.cpp @@ -34,9 +34,7 @@ using namespace ::chip::DeviceLayer; CHIP_ERROR PlatformEventing::ScheduleLambdaBridge(System::Layer & aLayer, LambdaBridge && bridge) { - ChipDeviceEvent event; - event.Type = DeviceEventType::kChipLambdaEvent; - event.LambdaEvent = std::move(bridge); + ChipDeviceEvent event{ .Type = DeviceEventType::kChipLambdaEvent, .LambdaEvent = std::move(bridge) }; return PlatformMgr().PostEvent(&event); } From 06caebe6b6db58dadadd075c8acf477bec83e0cc Mon Sep 17 00:00:00 2001 From: C Freeman <cecille@google.com> Date: Fri, 26 Apr 2024 11:40:07 -0400 Subject: [PATCH 057/124] Python scripting: Add a test plan generator script (#32718) * Python scriptiong: Add a test plan generator script * Fix linter * Restyled by isort * fix spacing * update spacing on expected outcome * remove init file - it snuck in, but isn't needed * Add documnetation and better error reporting. * make print a little nicer for help * linter... * Restyled by isort * make defined steps function public --------- Co-authored-by: Restyled.io <commits@restyled.io> --- src/python_testing/matter_testing_support.py | 8 +- .../test_plan_table_generator.py | 95 +++++++++++++++++++ 2 files changed, 99 insertions(+), 4 deletions(-) create mode 100755 src/python_testing/test_plan_table_generator.py diff --git a/src/python_testing/matter_testing_support.py b/src/python_testing/matter_testing_support.py index 9ec12dca5fb081..4861cae7ea8c61 100644 --- a/src/python_testing/matter_testing_support.py +++ b/src/python_testing/matter_testing_support.py @@ -684,10 +684,10 @@ def get_test_steps(self, test: str) -> list[TestStep]: in order using self.step(number), where number is the test_plan_number from each TestStep. ''' - steps = self._get_defined_test_steps(test) + steps = self.get_defined_test_steps(test) return [TestStep(1, "Run entire test")] if steps is None else steps - def _get_defined_test_steps(self, test: str) -> list[TestStep]: + def get_defined_test_steps(self, test: str) -> list[TestStep]: steps_name = 'steps_' + test[5:] try: fn = getattr(self, steps_name) @@ -781,7 +781,7 @@ def setup_test(self): self.step_skipped = False if self.runner_hook and not self.is_commissioning: test_name = self.current_test_info.name - steps = self._get_defined_test_steps(test_name) + steps = self.get_defined_test_steps(test_name) num_steps = 1 if steps is None else len(steps) filename = inspect.getfile(self.__class__) desc = self.get_test_desc(test_name) @@ -977,7 +977,7 @@ def on_pass(self, record): self.runner_hook.step_success(logger=None, logs=None, duration=step_duration, request=None) # TODO: this check could easily be annoying when doing dev. flag it somehow? Ditto with the in-order check - steps = self._get_defined_test_steps(record.test_name) + steps = self.get_defined_test_steps(record.test_name) if steps is None: # if we don't have a list of steps, assume they were all run all_steps_run = True diff --git a/src/python_testing/test_plan_table_generator.py b/src/python_testing/test_plan_table_generator.py new file mode 100755 index 00000000000000..bed4fa3eaa747e --- /dev/null +++ b/src/python_testing/test_plan_table_generator.py @@ -0,0 +1,95 @@ +#!/usr/bin/env -S python3 -B +# +# 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. +# +import importlib +import logging +import os +import sys +from pathlib import Path + +import click +from matter_testing_support import MatterTestConfig, generate_mobly_test_config + + +def indent_multiline(multiline: str, num_spaces: int) -> str: + ''' Indents subsequent lines of a multiline string by num_spaces spaces''' + s = multiline.split('\n') + s = [(num_spaces * ' ' + line.lstrip()).rstrip() for line in s] + return '\n'.join(s).lstrip() + + +@click.command() +@click.argument('filename', type=click.Path(exists=True)) +@click.argument('classname', type=str) +@click.argument('test', type=str) +def main(filename, classname, test): + ''' + This script generates the Test Procedure table for the test plans document + from the python script steps. In order to use this generator, the test + automation script conform to the following requirements: + + - automated in python\n + - test implements the steps_ function to provide steps information to the TH\n + - TestStep list returned from the steps_ function includes both description and expectation fields\n + - test does not gate any steps on PICS (top level PICS ok)\n + + + Usage: test_plan_table_generator.py filename classname test + + filename - name of the file where the test is automated\n + classname - name of the MatterBaseTest class\n + test - name of the test to generate the table for (include the test_ portion)\n + ''' + try: + module = importlib.import_module(Path(os.path.basename(filename)).stem) + except ModuleNotFoundError: + logging.error(f'Unable to load python module from {filename}. Please ensure this is a valid python file path') + return -1 + + try: + test_class = getattr(module, classname) + except AttributeError: + logging.error(f'Unable to load the test class {classname}. Please ensure this class is implemented in {filename}') + return -1 + + config = generate_mobly_test_config(MatterTestConfig()) + test_instance = test_class(config) + steps = test_instance.get_defined_test_steps(test) + if not steps: + logging.error(f'Unable to find steps for test {test}. Please ensure the steps_ function is implemented') + return -1 + + indent = 6 + header_num = f'{"**#**":<{indent}}' + header_num_step = f'|{header_num} |*TestStep* ' + s = ('[cols="5%,45%,45%"]\n' + '|===\n' + f'{header_num_step}|*Expected Outcome*\n') + for step in steps: + step_num = f'|{step.test_plan_number:<{indent}}a|' + s += f'{step_num}{indent_multiline(step.description, len(step_num))}\n' + + padding = (len(header_num_step) - 1) * ' ' + # add 2 to indent for a| at start + s += f'{padding}a|{indent_multiline(step.expectation, len(padding)+2)}\n\n' + s += '|===\n' + + print(s) + + +if __name__ == "__main__": + sys.exit(main()) From 29cfb7f1201f8fff2fe54b3dc8b61b50c579d4b4 Mon Sep 17 00:00:00 2001 From: Andrei Litvin <andy314@gmail.com> Date: Fri, 26 Apr 2024 12:18:42 -0400 Subject: [PATCH 058/124] [Chore] Convert chip::Optional to std::optional for dnssd/types.h (#33179) * Replace some chip Optional with std::optional * Restyle * a few more updates * Also fix RemoteDataLogger.cpp * Code review feedback: added some bracketing * Re-do the bracketing * Fix some of the unchecked optional access warnings * Also fix TestIncrementalResolve * Fix Commissionable script binding * Fix more files * Restyle --------- Co-authored-by: Andrei Litvin <andreilitvin@google.com> --- .../commands/common/RemoteDataModelLogger.cpp | 16 +- src/controller/SetUpCodePairer.cpp | 8 +- ...issionableNodeController-ScriptBinding.cpp | 16 +- .../python/ChipDeviceController-Discovery.cpp | 39 ++-- .../AddressResolve_DefaultImpl.cpp | 4 +- src/lib/dnssd/TxtFields.cpp | 18 +- src/lib/dnssd/Types.h | 50 +++--- .../dnssd/tests/TestIncrementalResolve.cpp | 10 +- src/lib/dnssd/tests/TestTxtFields.cpp | 166 ++++++++---------- src/lib/shell/commands/Dns.cpp | 20 +-- 10 files changed, 173 insertions(+), 174 deletions(-) diff --git a/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp b/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp index 9a996051957ccf..9e4f29c5534757 100644 --- a/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp +++ b/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp @@ -245,24 +245,24 @@ CHIP_ERROR LogDiscoveredNodeData(const chip::Dnssd::CommissionNodeData & nodeDat value["port"] = resolutionData.port; value["numIPs"] = static_cast<uint8_t>(resolutionData.numIPs); - if (resolutionData.mrpRetryIntervalIdle.HasValue()) + if (resolutionData.mrpRetryIntervalIdle.has_value()) { - value["mrpRetryIntervalIdle"] = resolutionData.mrpRetryIntervalIdle.Value().count(); + value["mrpRetryIntervalIdle"] = resolutionData.mrpRetryIntervalIdle->count(); } - if (resolutionData.mrpRetryIntervalActive.HasValue()) + if (resolutionData.mrpRetryIntervalActive.has_value()) { - value["mrpRetryIntervalActive"] = resolutionData.mrpRetryIntervalActive.Value().count(); + value["mrpRetryIntervalActive"] = resolutionData.mrpRetryIntervalActive->count(); } - if (resolutionData.mrpRetryActiveThreshold.HasValue()) + if (resolutionData.mrpRetryActiveThreshold.has_value()) { - value["mrpRetryActiveThreshold"] = resolutionData.mrpRetryActiveThreshold.Value().count(); + value["mrpRetryActiveThreshold"] = resolutionData.mrpRetryActiveThreshold->count(); } - if (resolutionData.isICDOperatingAsLIT.HasValue()) + if (resolutionData.isICDOperatingAsLIT.has_value()) { - value["isICDOperatingAsLIT"] = resolutionData.isICDOperatingAsLIT.Value(); + value["isICDOperatingAsLIT"] = *(resolutionData.isICDOperatingAsLIT); } Json::Value rootValue; diff --git a/src/controller/SetUpCodePairer.cpp b/src/controller/SetUpCodePairer.cpp index c3aecbfdd36f66..cf7ba2abd43d89 100644 --- a/src/controller/SetUpCodePairer.cpp +++ b/src/controller/SetUpCodePairer.cpp @@ -620,14 +620,14 @@ SetUpCodePairerParameters::SetUpCodePairerParameters(const Dnssd::CommonResoluti auto & ip = data.ipAddress[index]; SetPeerAddress(Transport::PeerAddress::UDP(ip, data.port, ip.IsIPv6LinkLocal() ? data.interfaceId : Inet::InterfaceId::Null())); - if (data.mrpRetryIntervalIdle.HasValue()) + if (data.mrpRetryIntervalIdle.has_value()) { - SetIdleInterval(data.mrpRetryIntervalIdle.Value()); + SetIdleInterval(*data.mrpRetryIntervalIdle); } - if (data.mrpRetryIntervalActive.HasValue()) + if (data.mrpRetryIntervalActive.has_value()) { - SetActiveInterval(data.mrpRetryIntervalActive.Value()); + SetActiveInterval(*data.mrpRetryIntervalActive); } } diff --git a/src/controller/python/ChipCommissionableNodeController-ScriptBinding.cpp b/src/controller/python/ChipCommissionableNodeController-ScriptBinding.cpp index 6df32c6940667a..157789f5d64136 100644 --- a/src/controller/python/ChipCommissionableNodeController-ScriptBinding.cpp +++ b/src/controller/python/ChipCommissionableNodeController-ScriptBinding.cpp @@ -97,17 +97,21 @@ void pychip_CommissionableNodeController_PrintDiscoveredCommissioners( ChipLogProgress(Discovery, "\tRotating Id\t\t%s", rotatingId); ChipLogProgress(Discovery, "\tPairing Instruction\t%s", dnsSdInfo->pairingInstruction); ChipLogProgress(Discovery, "\tPairing Hint\t\t%u", dnsSdInfo->pairingHint); - if (dnsSdInfo->GetMrpRetryIntervalIdle().HasValue()) + + auto idleInterval = dnsSdInfo->GetMrpRetryIntervalIdle(); + if (idleInterval.has_value()) { - ChipLogProgress(Discovery, "\tMrp Interval idle\t%u", dnsSdInfo->GetMrpRetryIntervalIdle().Value().count()); + ChipLogProgress(Discovery, "\tMrp Interval idle\t%u", idleInterval->count()); } else { ChipLogProgress(Discovery, "\tMrp Interval idle\tNot present"); } - if (dnsSdInfo->GetMrpRetryIntervalActive().HasValue()) + + auto activeInterval = dnsSdInfo->GetMrpRetryIntervalIdle(); + if (activeInterval.has_value()) { - ChipLogProgress(Discovery, "\tMrp Interval active\t%u", dnsSdInfo->GetMrpRetryIntervalActive().Value().count()); + ChipLogProgress(Discovery, "\tMrp Interval active\t%u", activeInterval->count()); } else { @@ -115,9 +119,9 @@ void pychip_CommissionableNodeController_PrintDiscoveredCommissioners( } ChipLogProgress(Discovery, "\tSupports TCP\t\t%d", dnsSdInfo->supportsTcp); - if (dnsSdInfo->isICDOperatingAsLIT.HasValue()) + if (dnsSdInfo->isICDOperatingAsLIT.has_value()) { - ChipLogProgress(Discovery, "\tICD is operating as a\t%s", dnsSdInfo->isICDOperatingAsLIT.Value() ? "LIT" : "SIT"); + ChipLogProgress(Discovery, "\tICD is operating as a\t%s", *(dnsSdInfo->isICDOperatingAsLIT) ? "LIT" : "SIT"); } for (unsigned j = 0; j < dnsSdInfo->numIPs; ++j) diff --git a/src/controller/python/ChipDeviceController-Discovery.cpp b/src/controller/python/ChipDeviceController-Discovery.cpp index b7589791b41eab..4ad6db56bf6739 100644 --- a/src/controller/python/ChipDeviceController-Discovery.cpp +++ b/src/controller/python/ChipDeviceController-Discovery.cpp @@ -124,17 +124,23 @@ void pychip_DeviceController_IterateDiscoveredCommissionableNodes(Controller::De jsonVal["deviceName"] = dnsSdInfo->deviceName; jsonVal["pairingInstruction"] = dnsSdInfo->pairingInstruction; jsonVal["pairingHint"] = dnsSdInfo->pairingHint; - if (dnsSdInfo->GetMrpRetryIntervalIdle().HasValue()) + + auto idleInterval = dnsSdInfo->GetMrpRetryIntervalIdle(); + if (idleInterval.has_value()) { - jsonVal["mrpRetryIntervalIdle"] = dnsSdInfo->GetMrpRetryIntervalIdle().Value().count(); + jsonVal["mrpRetryIntervalIdle"] = idleInterval->count(); } - if (dnsSdInfo->GetMrpRetryIntervalActive().HasValue()) + + auto activeInterval = dnsSdInfo->GetMrpRetryIntervalActive(); + if (activeInterval.has_value()) { - jsonVal["mrpRetryIntervalActive"] = dnsSdInfo->GetMrpRetryIntervalActive().Value().count(); + jsonVal["mrpRetryIntervalActive"] = activeInterval->count(); } - if (dnsSdInfo->GetMrpRetryActiveThreshold().HasValue()) + + auto activeThreshold = dnsSdInfo->GetMrpRetryActiveThreshold(); + if (activeThreshold.has_value()) { - jsonVal["mrpRetryActiveThreshold"] = dnsSdInfo->GetMrpRetryActiveThreshold().Value().count(); + jsonVal["mrpRetryActiveThreshold"] = activeThreshold->count(); } jsonVal["supportsTcp"] = dnsSdInfo->supportsTcp; { @@ -147,9 +153,9 @@ void pychip_DeviceController_IterateDiscoveredCommissionableNodes(Controller::De } jsonVal["addresses"] = addresses; } - if (dnsSdInfo->isICDOperatingAsLIT.HasValue()) + if (dnsSdInfo->isICDOperatingAsLIT.has_value()) { - jsonVal["isICDOperatingAsLIT"] = dnsSdInfo->isICDOperatingAsLIT.Value(); + jsonVal["isICDOperatingAsLIT"] = *(dnsSdInfo->isICDOperatingAsLIT); } if (dnsSdInfo->rotatingIdLen > 0) { @@ -188,26 +194,31 @@ void pychip_DeviceController_PrintDiscoveredDevices(Controller::DeviceCommission ChipLogProgress(Discovery, "\tRotating Id\t\t%s", rotatingId); ChipLogProgress(Discovery, "\tPairing Instruction\t%s", dnsSdInfo->pairingInstruction); ChipLogProgress(Discovery, "\tPairing Hint\t\t%u", dnsSdInfo->pairingHint); - if (dnsSdInfo->GetMrpRetryIntervalIdle().HasValue()) + + auto idleInterval = dnsSdInfo->GetMrpRetryIntervalIdle(); + if (idleInterval.has_value()) { - ChipLogProgress(Discovery, "\tMrp Interval idle\t%u", dnsSdInfo->GetMrpRetryIntervalIdle().Value().count()); + ChipLogProgress(Discovery, "\tMrp Interval idle\t%u", idleInterval->count()); } else { ChipLogProgress(Discovery, "\tMrp Interval idle\tNot present"); } - if (dnsSdInfo->GetMrpRetryIntervalActive().HasValue()) + + auto activeInterval = dnsSdInfo->GetMrpRetryIntervalActive(); + if (activeInterval.has_value()) { - ChipLogProgress(Discovery, "\tMrp Interval active\t%u", dnsSdInfo->GetMrpRetryIntervalActive().Value().count()); + ChipLogProgress(Discovery, "\tMrp Interval active\t%u", activeInterval->count()); } else { ChipLogProgress(Discovery, "\tMrp Interval active\tNot present"); } + ChipLogProgress(Discovery, "\tSupports TCP\t\t%d", dnsSdInfo->supportsTcp); - if (dnsSdInfo->isICDOperatingAsLIT.HasValue()) + if (dnsSdInfo->isICDOperatingAsLIT.has_value()) { - ChipLogProgress(Discovery, "\tICD is operating as a\t%s", dnsSdInfo->isICDOperatingAsLIT.Value() ? "LIT" : "SIT"); + ChipLogProgress(Discovery, "\tICD is operating as a\t%s", *(dnsSdInfo->isICDOperatingAsLIT) ? "LIT" : "SIT"); } for (unsigned j = 0; j < dnsSdInfo->numIPs; ++j) { diff --git a/src/lib/address_resolve/AddressResolve_DefaultImpl.cpp b/src/lib/address_resolve/AddressResolve_DefaultImpl.cpp index 6e461a4b99c72d..5a9651ff76ba3d 100644 --- a/src/lib/address_resolve/AddressResolve_DefaultImpl.cpp +++ b/src/lib/address_resolve/AddressResolve_DefaultImpl.cpp @@ -290,9 +290,9 @@ void Resolver::OnOperationalNodeResolved(const Dnssd::ResolvedNodeData & nodeDat result.mrpRemoteConfig = nodeData.resolutionData.GetRemoteMRPConfig(); result.supportsTcp = nodeData.resolutionData.supportsTcp; - if (nodeData.resolutionData.isICDOperatingAsLIT.HasValue()) + if (nodeData.resolutionData.isICDOperatingAsLIT.has_value()) { - result.isICDOperatingAsLIT = nodeData.resolutionData.isICDOperatingAsLIT.Value(); + result.isICDOperatingAsLIT = *(nodeData.resolutionData.isICDOperatingAsLIT); } for (size_t i = 0; i < nodeData.resolutionData.numIPs; i++) diff --git a/src/lib/dnssd/TxtFields.cpp b/src/lib/dnssd/TxtFields.cpp index 88a116871ca017..6ac2cfa19e8ece 100644 --- a/src/lib/dnssd/TxtFields.cpp +++ b/src/lib/dnssd/TxtFields.cpp @@ -105,14 +105,14 @@ bool MakeBoolFromAsciiDecimal(const ByteSpan & val) return val.size() == 1 && static_cast<char>(*val.data()) == '1'; } -Optional<bool> MakeOptionalBoolFromAsciiDecimal(const ByteSpan & val) +std::optional<bool> MakeOptionalBoolFromAsciiDecimal(const ByteSpan & val) { char character = static_cast<char>(*val.data()); if (val.size() == 1 && ((character == '1') || (character == '0'))) { - return MakeOptional(character == '1'); + return std::make_optional(character == '1'); } - return NullOptional; + return std::nullopt; } size_t GetPlusSignIdx(const ByteSpan & value) @@ -188,27 +188,27 @@ uint8_t GetCommissionerPasscode(const ByteSpan & value) return MakeBoolFromAsciiDecimal(value); } -Optional<System::Clock::Milliseconds32> GetRetryInterval(const ByteSpan & value) +std::optional<System::Clock::Milliseconds32> GetRetryInterval(const ByteSpan & value) { const auto undefined = std::numeric_limits<uint32_t>::max(); const auto retryInterval = MakeU32FromAsciiDecimal(value, undefined); if (retryInterval != undefined && retryInterval <= kMaxRetryInterval.count()) - return MakeOptional(System::Clock::Milliseconds32(retryInterval)); + return std::make_optional(System::Clock::Milliseconds32(retryInterval)); - return NullOptional; + return std::nullopt; } -Optional<System::Clock::Milliseconds16> GetRetryActiveThreshold(const ByteSpan & value) +std::optional<System::Clock::Milliseconds16> GetRetryActiveThreshold(const ByteSpan & value) { const auto retryInterval = MakeU16FromAsciiDecimal(value); if (retryInterval == 0) { - return NullOptional; + return std::nullopt; } - return MakeOptional(System::Clock::Milliseconds16(retryInterval)); + return std::make_optional(System::Clock::Milliseconds16(retryInterval)); } TxtFieldKey GetTxtFieldKey(const ByteSpan & key) diff --git a/src/lib/dnssd/Types.h b/src/lib/dnssd/Types.h index e62c9a52418efe..c88dd0a9c73522 100644 --- a/src/lib/dnssd/Types.h +++ b/src/lib/dnssd/Types.h @@ -19,10 +19,10 @@ #include <cstdint> #include <cstring> +#include <optional> #include <inet/InetInterface.h> #include <lib/core/CHIPError.h> -#include <lib/core/Optional.h> #include <lib/core/PeerId.h> #include <lib/dnssd/Constants.h> #include <lib/support/BytesToHex.h> @@ -91,10 +91,10 @@ struct CommonResolutionData uint16_t port = 0; char hostName[kHostNameMaxLength + 1] = {}; bool supportsTcp = false; - Optional<bool> isICDOperatingAsLIT; - Optional<System::Clock::Milliseconds32> mrpRetryIntervalIdle; - Optional<System::Clock::Milliseconds32> mrpRetryIntervalActive; - Optional<System::Clock::Milliseconds16> mrpRetryActiveThreshold; + std::optional<bool> isICDOperatingAsLIT; + std::optional<System::Clock::Milliseconds32> mrpRetryIntervalIdle; + std::optional<System::Clock::Milliseconds32> mrpRetryIntervalActive; + std::optional<System::Clock::Milliseconds16> mrpRetryActiveThreshold; CommonResolutionData() { Reset(); } @@ -103,21 +103,21 @@ struct CommonResolutionData ReliableMessageProtocolConfig GetRemoteMRPConfig() const { const ReliableMessageProtocolConfig defaultConfig = GetDefaultMRPConfig(); - return ReliableMessageProtocolConfig(GetMrpRetryIntervalIdle().ValueOr(defaultConfig.mIdleRetransTimeout), - GetMrpRetryIntervalActive().ValueOr(defaultConfig.mActiveRetransTimeout), - GetMrpRetryActiveThreshold().ValueOr(defaultConfig.mActiveThresholdTime)); + return ReliableMessageProtocolConfig(GetMrpRetryIntervalIdle().value_or(defaultConfig.mIdleRetransTimeout), + GetMrpRetryIntervalActive().value_or(defaultConfig.mActiveRetransTimeout), + GetMrpRetryActiveThreshold().value_or(defaultConfig.mActiveThresholdTime)); } - Optional<System::Clock::Milliseconds32> GetMrpRetryIntervalIdle() const { return mrpRetryIntervalIdle; } - Optional<System::Clock::Milliseconds32> GetMrpRetryIntervalActive() const { return mrpRetryIntervalActive; } - Optional<System::Clock::Milliseconds16> GetMrpRetryActiveThreshold() const { return mrpRetryActiveThreshold; } + std::optional<System::Clock::Milliseconds32> GetMrpRetryIntervalIdle() const { return mrpRetryIntervalIdle; } + std::optional<System::Clock::Milliseconds32> GetMrpRetryIntervalActive() const { return mrpRetryIntervalActive; } + std::optional<System::Clock::Milliseconds16> GetMrpRetryActiveThreshold() const { return mrpRetryActiveThreshold; } bool IsDeviceTreatedAsSleepy(const ReliableMessageProtocolConfig * defaultMRPConfig) const { // If either session interval (Idle - SII, Active - SAI) has a value and that value is greater // than the value passed to this function, then the peer device will be treated as if it is // a Sleepy End Device (SED) - return (mrpRetryIntervalIdle.HasValue() && (mrpRetryIntervalIdle.Value() > defaultMRPConfig->mIdleRetransTimeout)) || - (mrpRetryIntervalActive.HasValue() && (mrpRetryIntervalActive.Value() > defaultMRPConfig->mActiveRetransTimeout)); + return (mrpRetryIntervalIdle.has_value() && (*mrpRetryIntervalIdle > defaultMRPConfig->mIdleRetransTimeout)) || + (mrpRetryIntervalActive.has_value() && (*mrpRetryIntervalActive > defaultMRPConfig->mActiveRetransTimeout)); } bool IsHost(const char * host) const { return strcmp(host, hostName) == 0; } @@ -125,10 +125,10 @@ struct CommonResolutionData void Reset() { memset(hostName, 0, sizeof(hostName)); - mrpRetryIntervalIdle = NullOptional; - mrpRetryIntervalActive = NullOptional; - mrpRetryActiveThreshold = NullOptional; - isICDOperatingAsLIT = NullOptional; + mrpRetryIntervalIdle = std::nullopt; + mrpRetryIntervalActive = std::nullopt; + mrpRetryActiveThreshold = std::nullopt; + isICDOperatingAsLIT = std::nullopt; numIPs = 0; port = 0; supportsTcp = false; @@ -157,34 +157,34 @@ struct CommonResolutionData { ChipLogDetail(Discovery, "\tPort: %u", port); } - if (mrpRetryIntervalIdle.HasValue()) + if (mrpRetryIntervalIdle.has_value()) { - ChipLogDetail(Discovery, "\tMrp Interval idle: %" PRIu32 " ms", mrpRetryIntervalIdle.Value().count()); + ChipLogDetail(Discovery, "\tMrp Interval idle: %" PRIu32 " ms", mrpRetryIntervalIdle->count()); } else { ChipLogDetail(Discovery, "\tMrp Interval idle: not present"); } - if (mrpRetryIntervalActive.HasValue()) + if (mrpRetryIntervalActive.has_value()) { - ChipLogDetail(Discovery, "\tMrp Interval active: %" PRIu32 " ms", mrpRetryIntervalActive.Value().count()); + ChipLogDetail(Discovery, "\tMrp Interval active: %" PRIu32 " ms", mrpRetryIntervalActive->count()); } else { ChipLogDetail(Discovery, "\tMrp Interval active: not present"); } - if (mrpRetryActiveThreshold.HasValue()) + if (mrpRetryActiveThreshold.has_value()) { - ChipLogDetail(Discovery, "\tMrp Active Threshold: %u ms", mrpRetryActiveThreshold.Value().count()); + ChipLogDetail(Discovery, "\tMrp Active Threshold: %u ms", mrpRetryActiveThreshold->count()); } else { ChipLogDetail(Discovery, "\tMrp Active Threshold: not present"); } ChipLogDetail(Discovery, "\tTCP Supported: %d", supportsTcp); - if (isICDOperatingAsLIT.HasValue()) + if (isICDOperatingAsLIT.has_value()) { - ChipLogDetail(Discovery, "\tThe ICD operates in %s", isICDOperatingAsLIT.Value() ? "LIT" : "SIT"); + ChipLogDetail(Discovery, "\tThe ICD operates in %s", *isICDOperatingAsLIT ? "LIT" : "SIT"); } else { diff --git a/src/lib/dnssd/tests/TestIncrementalResolve.cpp b/src/lib/dnssd/tests/TestIncrementalResolve.cpp index 5ed4191319e824..0b5f26abbcd405 100644 --- a/src/lib/dnssd/tests/TestIncrementalResolve.cpp +++ b/src/lib/dnssd/tests/TestIncrementalResolve.cpp @@ -307,9 +307,8 @@ TEST(TestIncrementalResolve, TestParseOperational) EXPECT_EQ(nodeData.resolutionData.numIPs, 1u); EXPECT_EQ(nodeData.resolutionData.port, 0x1234); EXPECT_FALSE(nodeData.resolutionData.supportsTcp); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); - EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); - EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalIdle().Value(), chip::System::Clock::Milliseconds32(23)); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().has_value()); + EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalIdle(), std::make_optional(chip::System::Clock::Milliseconds32(23))); Inet::IPAddress addr; EXPECT_TRUE(Inet::IPAddress::FromString("fe80::abcd:ef11:2233:4455", addr)); @@ -396,9 +395,8 @@ TEST(TestIncrementalResolve, TestParseCommissionable) EXPECT_EQ(nodeData.numIPs, 2u); EXPECT_EQ(nodeData.port, 0x1234); EXPECT_FALSE(nodeData.supportsTcp); - EXPECT_TRUE(nodeData.GetMrpRetryIntervalActive().HasValue()); - EXPECT_EQ(nodeData.GetMrpRetryIntervalActive().Value(), chip::System::Clock::Milliseconds32(321)); - EXPECT_FALSE(nodeData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_EQ(nodeData.GetMrpRetryIntervalActive(), std::make_optional(chip::System::Clock::Milliseconds32(321))); + EXPECT_FALSE(nodeData.GetMrpRetryIntervalIdle().has_value()); Inet::IPAddress addr; EXPECT_TRUE(Inet::IPAddress::FromString("fe80::abcd:ef11:2233:4455", addr)); diff --git a/src/lib/dnssd/tests/TestTxtFields.cpp b/src/lib/dnssd/tests/TestTxtFields.cpp index ce206e34ae46aa..b80f1c0682ef32 100644 --- a/src/lib/dnssd/tests/TestTxtFields.cpp +++ b/src/lib/dnssd/tests/TestTxtFields.cpp @@ -304,9 +304,9 @@ bool NodeDataIsEmpty(const CommissionNodeData & node) { if (node.longDiscriminator != 0 || node.vendorId != 0 || node.productId != 0 || node.commissioningMode != 0 || - node.deviceType != 0 || node.rotatingIdLen != 0 || node.pairingHint != 0 || node.mrpRetryIntervalIdle.HasValue() || - node.mrpRetryIntervalActive.HasValue() || node.mrpRetryActiveThreshold.HasValue() || node.isICDOperatingAsLIT.HasValue() || - node.supportsTcp || node.supportsCommissionerGeneratedPasscode != 0) + node.deviceType != 0 || node.rotatingIdLen != 0 || node.pairingHint != 0 || node.mrpRetryIntervalIdle.has_value() || + node.mrpRetryIntervalActive.has_value() || node.mrpRetryActiveThreshold.has_value() || + node.isICDOperatingAsLIT.has_value() || node.supportsTcp || node.supportsCommissionerGeneratedPasscode != 0) { return false; } @@ -411,39 +411,39 @@ TEST(TestTxtFields, TestFillDiscoveredNodeDataFromTxt) bool NodeDataIsEmpty(const ResolvedNodeData & nodeData) { return nodeData.operationalData.peerId == PeerId{} && nodeData.resolutionData.numIPs == 0 && - nodeData.resolutionData.port == 0 && !nodeData.resolutionData.mrpRetryIntervalIdle.HasValue() && - !nodeData.resolutionData.mrpRetryIntervalActive.HasValue() && !nodeData.resolutionData.supportsTcp && - !nodeData.resolutionData.isICDOperatingAsLIT.HasValue(); + nodeData.resolutionData.port == 0 && !nodeData.resolutionData.mrpRetryIntervalIdle.has_value() && + !nodeData.resolutionData.mrpRetryIntervalActive.has_value() && !nodeData.resolutionData.supportsTcp && + !nodeData.resolutionData.isICDOperatingAsLIT.has_value(); } void ResetRetryIntervalIdle(DiscoveredNodeData & nodeData) { - nodeData.Get<CommissionNodeData>().mrpRetryIntervalIdle.ClearValue(); + nodeData.Get<CommissionNodeData>().mrpRetryIntervalIdle.reset(); } void ResetRetryIntervalIdle(ResolvedNodeData & nodeData) { - nodeData.resolutionData.mrpRetryIntervalIdle.ClearValue(); + nodeData.resolutionData.mrpRetryIntervalIdle.reset(); } void ResetRetryIntervalActive(DiscoveredNodeData & nodeData) { - nodeData.Get<CommissionNodeData>().mrpRetryIntervalActive.ClearValue(); + nodeData.Get<CommissionNodeData>().mrpRetryIntervalActive.reset(); } void ResetRetryIntervalActive(ResolvedNodeData & nodeData) { - nodeData.resolutionData.mrpRetryIntervalActive.ClearValue(); + nodeData.resolutionData.mrpRetryIntervalActive.reset(); } void ResetRetryActiveThreshold(DiscoveredNodeData & nodeData) { - nodeData.Get<CommissionNodeData>().mrpRetryActiveThreshold.ClearValue(); + nodeData.Get<CommissionNodeData>().mrpRetryActiveThreshold.reset(); } void ResetRetryActiveThreshold(ResolvedNodeData & nodeData) { - nodeData.resolutionData.mrpRetryActiveThreshold.ClearValue(); + nodeData.resolutionData.mrpRetryActiveThreshold.reset(); } template <class NodeData> @@ -459,15 +459,13 @@ void DiscoveredTxtFieldSessionIdleInterval() strcpy(key, "SII"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); - EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().Value() == 1_ms32); + EXPECT_EQ(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle(), std::make_optional(1_ms32)); // Maximum strcpy(key, "SII"); strcpy(val, "3600000"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); - EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().Value() == 3600000_ms32); + EXPECT_EQ(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle(), std::make_optional(3600000_ms32)); // Test no other fields were populated ResetRetryIntervalIdle(nodeData); @@ -477,37 +475,37 @@ void DiscoveredTxtFieldSessionIdleInterval() strcpy(key, "SII"); strcpy(val, "-1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().has_value()); // Invalid SII - greater than maximum strcpy(key, "SII"); strcpy(val, "3600001"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().has_value()); // Invalid SII - much greater than maximum strcpy(key, "SII"); strcpy(val, "1095216660481"); // 0xFF00000001 == 1 (mod 2^32) FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().has_value()); // Invalid SII - hexadecimal value strcpy(key, "SII"); strcpy(val, "0x20"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().has_value()); // Invalid SII - leading zeros strcpy(key, "SII"); strcpy(val, "0700"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().has_value()); // Invalid SII - text at the end strcpy(key, "SII"); strcpy(val, "123abc"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryIntervalIdle().has_value()); } // Test SAI (formerly CRA) @@ -524,15 +522,13 @@ void DiscoveredTxtFieldSessionActiveInterval() strcpy(key, "SAI"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); - EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalActive().Value() == 1_ms32); + EXPECT_EQ(nodeData.Get<NodeData>().GetMrpRetryIntervalActive(), std::make_optional(1_ms32)); // Maximum strcpy(key, "SAI"); strcpy(val, "3600000"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); - EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryIntervalActive().Value() == 3600000_ms32); + EXPECT_EQ(nodeData.Get<NodeData>().GetMrpRetryIntervalActive(), std::make_optional(3600000_ms32)); // Test no other fields were populated ResetRetryIntervalActive(nodeData); @@ -542,37 +538,37 @@ void DiscoveredTxtFieldSessionActiveInterval() strcpy(key, "SAI"); strcpy(val, "-1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryIntervalActive().has_value()); // Invalid SAI - greater than maximum strcpy(key, "SAI"); strcpy(val, "3600001"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryIntervalActive().has_value()); // Invalid SAI - much greater than maximum strcpy(key, "SAI"); strcpy(val, "1095216660481"); // 0xFF00000001 == 1 (mod 2^32) FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryIntervalActive().has_value()); // Invalid SAI - hexadecimal value strcpy(key, "SAI"); strcpy(val, "0x20"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryIntervalActive().has_value()); // Invalid SAI - leading zeros strcpy(key, "SAI"); strcpy(val, "0700"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryIntervalActive().has_value()); // Invalid SAI - text at the end strcpy(key, "SAI"); strcpy(val, "123abc"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryIntervalActive().has_value()); } // Test SAT (Session Active Threshold) @@ -589,15 +585,13 @@ void DiscoveredTxtFieldSessionActiveThreshold() strcpy(key, "SAT"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); - EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().Value() == 1_ms16); + EXPECT_EQ(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold(), std::make_optional(1_ms16)); // Maximum strcpy(key, "SAT"); strcpy(val, "65535"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); - EXPECT_TRUE(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().Value() == 65535_ms16); + EXPECT_EQ(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold(), std::make_optional(65535_ms16)); // Test no other fields were populated ResetRetryActiveThreshold(nodeData); @@ -607,37 +601,37 @@ void DiscoveredTxtFieldSessionActiveThreshold() strcpy(key, "SAT"); strcpy(val, "-1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().has_value()); // Invalid SAI - greater than maximum strcpy(key, "SAT"); strcpy(val, "65536"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().has_value()); // Invalid SAT - much greater than maximum strcpy(key, "SAT"); strcpy(val, "1095216660481"); // 0xFF00000001 == 1 (mod 2^32) FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().has_value()); // Invalid SAT - hexadecimal value strcpy(key, "SAT"); strcpy(val, "0x20"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().has_value()); // Invalid SAT - leading zeros strcpy(key, "SAT"); strcpy(val, "0700"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().has_value()); // Invalid SAT - text at the end strcpy(key, "SAT"); strcpy(val, "123abc"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.Get<NodeData>().GetMrpRetryActiveThreshold().has_value()); } // Test T (TCP support) @@ -687,27 +681,25 @@ void DiscoveredTxtFieldICDoperatesAsLIT() strcpy(key, "ICD"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(nodeData.Get<NodeData>().isICDOperatingAsLIT.HasValue()); - EXPECT_TRUE(nodeData.Get<NodeData>().isICDOperatingAsLIT.Value()); + EXPECT_EQ(nodeData.Get<NodeData>().isICDOperatingAsLIT, std::make_optional(true)); // Test no other fields were populated - nodeData.Get<NodeData>().isICDOperatingAsLIT.ClearValue(); + nodeData.Get<NodeData>().isICDOperatingAsLIT.reset(); EXPECT_TRUE(NodeDataIsEmpty(nodeData.Get<NodeData>())); // ICD is operating as a SIT device strcpy(key, "ICD"); strcpy(val, "0"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(nodeData.Get<NodeData>().isICDOperatingAsLIT.HasValue()); - EXPECT_TRUE(nodeData.Get<NodeData>().isICDOperatingAsLIT.Value() == false); + EXPECT_EQ(nodeData.Get<NodeData>().isICDOperatingAsLIT, std::make_optional(false)); - nodeData.Get<NodeData>().isICDOperatingAsLIT.ClearValue(); + nodeData.Get<NodeData>().isICDOperatingAsLIT.reset(); EXPECT_TRUE(NodeDataIsEmpty(nodeData.Get<NodeData>())); // Invalid value, No key set strcpy(key, "ICD"); strcpy(val, "asdf"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(nodeData.Get<NodeData>().isICDOperatingAsLIT.HasValue() == false); + EXPECT_FALSE(nodeData.Get<NodeData>().isICDOperatingAsLIT.has_value()); } // Test IsDeviceTreatedAsSleepy() with CRI @@ -723,13 +715,13 @@ void DiscoveredTestIsDeviceSessionIdle() CommonResolutionData & resolutionData = nodeData.Get<NodeData>(); // No key/val set, so the device can't be sleepy - EXPECT_TRUE(!nodeData.Get<NodeData>().IsDeviceTreatedAsSleepy(&defaultMRPConfig)); + EXPECT_FALSE(nodeData.Get<NodeData>().IsDeviceTreatedAsSleepy(&defaultMRPConfig)); // If the interval is the default value, the device is not sleepy strcpy(key, "SII"); sprintf(val, "%d", static_cast<int>(CHIP_CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL.count())); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().IsDeviceTreatedAsSleepy(&defaultMRPConfig)); + EXPECT_FALSE(nodeData.Get<NodeData>().IsDeviceTreatedAsSleepy(&defaultMRPConfig)); // If the interval is greater than the default value, the device is sleepy sprintf(key, "SII"); @@ -751,13 +743,13 @@ void DiscoveredTestIsDeviceSessionActive() CommonResolutionData & resolutionData = nodeData.Get<NodeData>(); // No key/val set, so the device can't be sleepy - EXPECT_TRUE(!nodeData.Get<NodeData>().IsDeviceTreatedAsSleepy(&defaultMRPConfig)); + EXPECT_FALSE(nodeData.Get<NodeData>().IsDeviceTreatedAsSleepy(&defaultMRPConfig)); // If the interval is the default value, the device is not sleepy sprintf(key, "SAI"); sprintf(val, "%d", static_cast<int>(CHIP_CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL.count())); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), resolutionData); - EXPECT_TRUE(!nodeData.Get<NodeData>().IsDeviceTreatedAsSleepy(&defaultMRPConfig)); + EXPECT_FALSE(nodeData.Get<NodeData>().IsDeviceTreatedAsSleepy(&defaultMRPConfig)); // If the interval is greater than the default value, the device is sleepy strcpy(key, "SAI"); @@ -778,15 +770,13 @@ void TxtFieldSessionIdleInterval() strcpy(key, "SII"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); - EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalIdle().Value(), 1_ms32); + EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalIdle(), std::make_optional(1_ms32)); // Maximum strcpy(key, "SII"); strcpy(val, "3600000"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); - EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalIdle().Value(), 3600000_ms32); + EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalIdle(), std::make_optional(3600000_ms32)); // Test no other fields were populated ResetRetryIntervalIdle(nodeData); @@ -796,37 +786,37 @@ void TxtFieldSessionIdleInterval() strcpy(key, "SII"); strcpy(val, "-1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().has_value()); // Invalid SII - greater than maximum strcpy(key, "SII"); strcpy(val, "3600001"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().has_value()); // Invalid SII - much greater than maximum strcpy(key, "SII"); strcpy(val, "1095216660481"); // 0xFF00000001 == 1 (mod 2^32) FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().has_value()); // Invalid SII - hexadecimal value strcpy(key, "SII"); strcpy(val, "0x20"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().has_value()); // Invalid SII - leading zeros strcpy(key, "SII"); strcpy(val, "0700"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().has_value()); // Invalid SII - text at the end strcpy(key, "SII"); strcpy(val, "123abc"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalIdle().has_value()); } TEST(TestTxtFields, TxtDiscoveredFieldMrpRetryIntervalIdle) @@ -851,15 +841,13 @@ void TxtFieldSessionActiveInterval() strcpy(key, "SAI"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); - EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalActive().Value(), 1_ms32); + EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalActive(), std::make_optional(1_ms32)); // Maximum strcpy(key, "SAI"); strcpy(val, "3600000"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); - EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalActive().Value(), 3600000_ms32); + EXPECT_EQ(nodeData.resolutionData.GetMrpRetryIntervalActive(), std::make_optional(3600000_ms32)); // Test no other fields were populated ResetRetryIntervalActive(nodeData); @@ -869,37 +857,37 @@ void TxtFieldSessionActiveInterval() strcpy(key, "SAI"); strcpy(val, "-1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().has_value()); // Invalid SAI - greater than maximum strcpy(key, "SAI"); strcpy(val, "3600001"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().has_value()); // Invalid SAI - much greater than maximum strcpy(key, "SAI"); strcpy(val, "1095216660481"); // 0xFF00000001 == 1 (mod 2^32) FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().has_value()); // Invalid SAI - hexadecimal value strcpy(key, "SAI"); strcpy(val, "0x20"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().has_value()); // Invalid SAI - leading zeros strcpy(key, "SAI"); strcpy(val, "0700"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().has_value()); // Invalid SAI - text at the end strcpy(key, "SAI"); strcpy(val, "123abc"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryIntervalActive().has_value()); } TEST(TestTxtFields, TxtDiscoveredFieldMrpRetryIntervalActive) @@ -924,15 +912,13 @@ void TxtFieldSessionActiveThreshold() strcpy(key, "SAT"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); - EXPECT_EQ(nodeData.resolutionData.GetMrpRetryActiveThreshold().Value(), 1_ms16); + EXPECT_EQ(nodeData.resolutionData.GetMrpRetryActiveThreshold(), std::make_optional(1_ms16)); // Maximum strcpy(key, "SAT"); strcpy(val, "65535"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_TRUE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); - EXPECT_EQ(nodeData.resolutionData.GetMrpRetryActiveThreshold().Value(), 65535_ms16); + EXPECT_EQ(nodeData.resolutionData.GetMrpRetryActiveThreshold(), std::make_optional(65535_ms16)); // Test no other fields were populated ResetRetryActiveThreshold(nodeData); @@ -942,37 +928,37 @@ void TxtFieldSessionActiveThreshold() strcpy(key, "SAT"); strcpy(val, "-1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().has_value()); // Invalid SAI - greater than maximum strcpy(key, "SAT"); strcpy(val, "65536"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().has_value()); // Invalid SAT - much greater than maximum strcpy(key, "SAT"); strcpy(val, "1095216660481"); // 0xFF00000001 == 1 (mod 2^32) FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().has_value()); // Invalid SAT - hexadecimal value strcpy(key, "SAT"); strcpy(val, "0x20"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().has_value()); // Invalid SAT - leading zeros strcpy(key, "SAT"); strcpy(val, "0700"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().has_value()); // Invalid SAT - text at the end strcpy(key, "SAT"); strcpy(val, "123abc"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().HasValue()); + EXPECT_FALSE(nodeData.resolutionData.GetMrpRetryActiveThreshold().has_value()); } TEST(TestTxtFields, TxtDiscoveredFieldMrpRetryActiveThreshold) @@ -1038,27 +1024,27 @@ void TxtFieldICDoperatesAsLIT() strcpy(key, "ICD"); strcpy(val, "1"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_TRUE(nodeData.resolutionData.isICDOperatingAsLIT.HasValue()); - EXPECT_TRUE(nodeData.resolutionData.isICDOperatingAsLIT.Value()); + EXPECT_TRUE(nodeData.resolutionData.isICDOperatingAsLIT.has_value()); + EXPECT_TRUE(nodeData.resolutionData.isICDOperatingAsLIT.value_or(false)); // Test no other fields were populated - nodeData.resolutionData.isICDOperatingAsLIT.ClearValue(); + nodeData.resolutionData.isICDOperatingAsLIT.reset(); EXPECT_TRUE(NodeDataIsEmpty(nodeData)); // ICD is operating as a SIT device strcpy(key, "ICD"); strcpy(val, "0"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_TRUE(nodeData.resolutionData.isICDOperatingAsLIT.HasValue()); - EXPECT_EQ(nodeData.resolutionData.isICDOperatingAsLIT.Value(), false); + EXPECT_TRUE(nodeData.resolutionData.isICDOperatingAsLIT.has_value()); + EXPECT_EQ(nodeData.resolutionData.isICDOperatingAsLIT.value_or(true), false); - nodeData.resolutionData.isICDOperatingAsLIT.ClearValue(); + nodeData.resolutionData.isICDOperatingAsLIT.reset(); EXPECT_TRUE(NodeDataIsEmpty(nodeData)); // Invalid value, No key set strcpy(key, "ICD"); strcpy(val, "asdf"); FillNodeDataFromTxt(GetSpan(key), GetSpan(val), nodeData.resolutionData); - EXPECT_EQ(nodeData.resolutionData.isICDOperatingAsLIT.HasValue(), false); + EXPECT_EQ(nodeData.resolutionData.isICDOperatingAsLIT.has_value(), false); } TEST(TestTxtFields, TxtDiscoveredIsICDoperatingAsLIT) diff --git a/src/lib/shell/commands/Dns.cpp b/src/lib/shell/commands/Dns.cpp index 04d82313d7d3d4..7fac0186da912f 100644 --- a/src/lib/shell/commands/Dns.cpp +++ b/src/lib/shell/commands/Dns.cpp @@ -115,25 +115,25 @@ class DnsShellResolverDelegate : public Dnssd::DiscoverNodeDelegate, public Addr auto retryInterval = nodeData.GetMrpRetryIntervalIdle(); - if (retryInterval.HasValue()) - streamer_printf(streamer_get(), " MRP retry interval (idle): %" PRIu32 "ms\r\n", retryInterval.Value()); + if (retryInterval.has_value()) + streamer_printf(streamer_get(), " MRP retry interval (idle): %" PRIu32 "ms\r\n", *retryInterval); retryInterval = nodeData.GetMrpRetryIntervalActive(); - if (retryInterval.HasValue()) - streamer_printf(streamer_get(), " MRP retry interval (active): %" PRIu32 "ms\r\n", retryInterval.Value()); + if (retryInterval.has_value()) + streamer_printf(streamer_get(), " MRP retry interval (active): %" PRIu32 "ms\r\n", *retryInterval); - if (nodeData.GetMrpRetryActiveThreshold().HasValue()) + auto activeThreshold = nodeData.GetMrpRetryActiveThreshold(); + + if (activeThreshold.has_value()) { - streamer_printf(streamer_get(), " MRP retry active threshold time: %" PRIu32 "ms\r\n", - nodeData.GetMrpRetryActiveThreshold().Value()); + streamer_printf(streamer_get(), " MRP retry active threshold time: %" PRIu32 "ms\r\n", *activeThreshold); } streamer_printf(streamer_get(), " Supports TCP: %s\r\n", nodeData.supportsTcp ? "yes" : "no"); - if (nodeData.isICDOperatingAsLIT.HasValue()) + if (nodeData.isICDOperatingAsLIT.has_value()) { - streamer_printf(streamer_get(), " ICD is operating as a: %s\r\n", - nodeData.isICDOperatingAsLIT.Value() ? "LIT" : "SIT"); + streamer_printf(streamer_get(), " ICD is operating as a: %s\r\n", *(nodeData.isICDOperatingAsLIT) ? "LIT" : "SIT"); } streamer_printf(streamer_get(), " IP addresses:\r\n"); for (size_t i = 0; i < nodeData.numIPs; i++) From 10886ac665d85eac19506eceb95fb68aca613991 Mon Sep 17 00:00:00 2001 From: Matthew Swartwout <mwswartwout@users.noreply.github.com> Date: Fri, 26 Apr 2024 10:00:07 -0700 Subject: [PATCH 059/124] Add equality operator to StatusIB (#33156) --- src/app/MessageDef/StatusIB.h | 10 +++++++++ src/app/tests/TestStatusIB.cpp | 39 ++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/src/app/MessageDef/StatusIB.h b/src/app/MessageDef/StatusIB.h index 0dadccc58ee527..f5ade6cc71c628 100644 --- a/src/app/MessageDef/StatusIB.h +++ b/src/app/MessageDef/StatusIB.h @@ -117,5 +117,15 @@ struct StatusIB }; // struct StatusIB +constexpr bool operator==(const StatusIB & one, const StatusIB & two) +{ + return one.mStatus == two.mStatus && one.mClusterStatus == two.mClusterStatus; +} + +constexpr bool operator!=(const StatusIB & one, const StatusIB & two) +{ + return !(one == two); +} + }; // namespace app }; // namespace chip diff --git a/src/app/tests/TestStatusIB.cpp b/src/app/tests/TestStatusIB.cpp index 3eb47f438f67df..2e5f78f7da64f7 100644 --- a/src/app/tests/TestStatusIB.cpp +++ b/src/app/tests/TestStatusIB.cpp @@ -113,6 +113,44 @@ void TestStatusIBErrorToString(nlTestSuite * aSuite, void * aContext) } #endif // !CHIP_CONFIG_SHORT_ERROR_STR +void TestStatusIBEqualityOperator(nlTestSuite * aSuite, void * /*aContext*/) +{ + // Equality against self is true. + StatusIB one; + NL_TEST_ASSERT(aSuite, one == one); + + // Default constructors are equal. + NL_TEST_ASSERT(aSuite, one == StatusIB()); + + // Different imStatus is not equal. + StatusIB with_imstatus(Status::Failure); + NL_TEST_ASSERT(aSuite, one != with_imstatus); + + // Same imStatus are equal. + NL_TEST_ASSERT(aSuite, with_imstatus == StatusIB(Status::Failure)); + + // Same imStatus but different clusterStatus are not equal. + StatusIB with_cluster_status(Status::Failure, /*clusterStatus=*/2); + NL_TEST_ASSERT(aSuite, with_imstatus != with_cluster_status); + + // Different imStatus but same clusterStatus are not equal. + NL_TEST_ASSERT(aSuite, with_cluster_status != StatusIB(Status::Success, /*clusterStatus=*/2)); + + // Same imStatus and clusterStatus are equal. + NL_TEST_ASSERT(aSuite, with_cluster_status == StatusIB(Status::Failure, /*clusterStatus=*/2)); + + // From same CHIP_ERROR are equal. + StatusIB invalid_argument(CHIP_ERROR_INVALID_ARGUMENT); + NL_TEST_ASSERT(aSuite, invalid_argument == StatusIB(CHIP_ERROR_INVALID_ARGUMENT)); + + // Different CHIP_ERROR are equal if they are not from kIMClusterStatus or + // kIMGlobalStatus. + NL_TEST_ASSERT(aSuite, invalid_argument == StatusIB(CHIP_ERROR_INCORRECT_STATE)); + + // Error never equals NO_ERROR + NL_TEST_ASSERT(aSuite, invalid_argument != StatusIB(CHIP_NO_ERROR)); +} + // clang-format off const nlTest sTests[] = { @@ -120,6 +158,7 @@ const nlTest sTests[] = #if !CHIP_CONFIG_SHORT_ERROR_STR NL_TEST_DEF("StatusIBErrorToString", TestStatusIBErrorToString), #endif // !CHIP_CONFIG_SHORT_ERROR_STR + NL_TEST_DEF("StatusIBEqualityOperator", TestStatusIBEqualityOperator), NL_TEST_SENTINEL() }; // clang-format on From f141aebe1c76724b04c6be82bfea504f274204b3 Mon Sep 17 00:00:00 2001 From: Amine Alami <43780877+Alami-Amine@users.noreply.github.com> Date: Fri, 26 Apr 2024 20:02:53 +0200 Subject: [PATCH 060/124] pw_unit_test migration: lib support batch 3 (#33177) * pw_unit_test migration: lib support batch 3 * BUILD.gn typo fix * integrating comments, changing EXPECT_NE to ASSERT_NE when checking pointers for null --- src/lib/support/tests/BUILD.gn | 20 +- src/lib/support/tests/TestBufferWriter.cpp | 112 +++---- .../support/tests/TestBytesCircularBuffer.cpp | 305 ++++++++---------- src/lib/support/tests/TestErrorStr.cpp | 97 ++---- src/lib/support/tests/TestPrivateHeap.cpp | 145 ++++----- src/lib/support/tests/TestScopedBuffer.cpp | 104 +++--- src/lib/support/tests/TestSorting.cpp | 42 +-- src/lib/support/tests/TestStringBuilder.cpp | 134 ++++---- src/lib/support/tests/TestStringSplitter.cpp | 137 ++++---- src/lib/support/tests/TestTimeUtils.cpp | 59 +--- src/lib/support/tests/TestVariant.cpp | 226 ++++++------- 11 files changed, 558 insertions(+), 823 deletions(-) diff --git a/src/lib/support/tests/BUILD.gn b/src/lib/support/tests/BUILD.gn index 585233b1e6667d..7a19ea2415e895 100644 --- a/src/lib/support/tests/BUILD.gn +++ b/src/lib/support/tests/BUILD.gn @@ -25,18 +25,28 @@ chip_test_suite("tests") { test_sources = [ "TestBitMask.cpp", "TestBufferReader.cpp", + "TestBufferWriter.cpp", + "TestBytesCircularBuffer.cpp", "TestBytesToHex.cpp", "TestDefer.cpp", + "TestErrorStr.cpp", "TestFixedBufferAllocator.cpp", "TestFold.cpp", "TestIniEscaping.cpp", + "TestPrivateHeap.cpp", "TestSafeInt.cpp", "TestSafeString.cpp", "TestScoped.cpp", + "TestScopedBuffer.cpp", + "TestSorting.cpp", "TestSpan.cpp", "TestStaticSupportSmartPtr.cpp", + "TestStringBuilder.cpp", + "TestStringSplitter.cpp", "TestTestPersistentStorageDelegate.cpp", + "TestTimeUtils.cpp", "TestUtf8.cpp", + "TestVariant.cpp", ] sources = [] @@ -64,28 +74,18 @@ chip_test_suite_using_nltest("tests_nltest") { output_name = "libSupportTestsNL" test_sources = [ - "TestBufferWriter.cpp", - "TestBytesCircularBuffer.cpp", "TestCHIPCounter.cpp", "TestCHIPMem.cpp", "TestCHIPMemString.cpp", - "TestErrorStr.cpp", "TestIntrusiveList.cpp", "TestJsonToTlv.cpp", "TestJsonToTlvToJson.cpp", "TestPersistedCounter.cpp", "TestPool.cpp", - "TestPrivateHeap.cpp", - "TestScopedBuffer.cpp", - "TestSorting.cpp", "TestStateMachine.cpp", - "TestStringBuilder.cpp", - "TestStringSplitter.cpp", "TestThreadOperationalDataset.cpp", - "TestTimeUtils.cpp", "TestTlvJson.cpp", "TestTlvToJson.cpp", - "TestVariant.cpp", "TestZclString.cpp", ] sources = [] diff --git a/src/lib/support/tests/TestBufferWriter.cpp b/src/lib/support/tests/TestBufferWriter.cpp index 2e8d187ae6a15d..e5d8951d4cf152 100644 --- a/src/lib/support/tests/TestBufferWriter.cpp +++ b/src/lib/support/tests/TestBufferWriter.cpp @@ -15,9 +15,8 @@ * limitations under the License. */ #include <lib/support/BufferWriter.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> namespace { @@ -77,7 +76,7 @@ class BWTest : public Base using namespace chip::Encoding; -void TestSpanVersusRegular(nlTestSuite * inSuite, void * inContext) +TEST(TestBufferWriter, TestSpanVersusRegular) { uint8_t buf_regular[5] = { 0, 0, 0, 0, 0 }; uint8_t buf_span[5] = { 0, 0, 0, 0, 0 }; @@ -87,232 +86,213 @@ void TestSpanVersusRegular(nlTestSuite * inSuite, void * inContext) BufferWriter regular_writer(buf_regular, sizeof(buf_regular)); BufferWriter span_writer(chip::MutableByteSpan{ buf_span }); - NL_TEST_ASSERT(inSuite, regular_writer.Available() == sizeof(buf_regular)); - NL_TEST_ASSERT(inSuite, span_writer.Available() == sizeof(buf_span)); + EXPECT_EQ(regular_writer.Available(), sizeof(buf_regular)); + EXPECT_EQ(span_writer.Available(), sizeof(buf_span)); - NL_TEST_ASSERT(inSuite, 0 == memcmp(buf_regular, all_zeroes, sizeof(all_zeroes))); - NL_TEST_ASSERT(inSuite, 0 == memcmp(buf_span, all_zeroes, sizeof(all_zeroes))); + EXPECT_EQ(0, memcmp(buf_regular, all_zeroes, sizeof(all_zeroes))); + EXPECT_EQ(0, memcmp(buf_span, all_zeroes, sizeof(all_zeroes))); - NL_TEST_ASSERT(inSuite, regular_writer.Put(1).Put(2).Put(3).Put(4).Fit()); - NL_TEST_ASSERT(inSuite, span_writer.Put(1).Put(2).Put(3).Put(4).Fit()); + EXPECT_TRUE(regular_writer.Put(1).Put(2).Put(3).Put(4).Fit()); + EXPECT_TRUE(span_writer.Put(1).Put(2).Put(3).Put(4).Fit()); - NL_TEST_ASSERT(inSuite, 0 == memcmp(buf_regular, final_expected, sizeof(final_expected))); - NL_TEST_ASSERT(inSuite, 0 == memcmp(buf_span, final_expected, sizeof(final_expected))); + EXPECT_EQ(0, memcmp(buf_regular, final_expected, sizeof(final_expected))); + EXPECT_EQ(0, memcmp(buf_span, final_expected, sizeof(final_expected))); } -void TestStringWrite(nlTestSuite * inSuite, void * inContext) +TEST(TestBufferWriter, TestStringWrite) { { BWTest<BufferWriter> bb(2); bb.Put("hi"); - NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0)); + EXPECT_TRUE(bb.expect("hi", 2, 0)); } { BWTest<BufferWriter> bb(1); bb.Put("hi"); - NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0)); + EXPECT_TRUE(bb.expect("hi", 2, 0)); } { BWTest<LittleEndian::BufferWriter> bb(2); bb.Put("hi"); - NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0)); + EXPECT_TRUE(bb.expect("hi", 2, 0)); } { BWTest<LittleEndian::BufferWriter> bb(1); bb.Put("hi"); - NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0)); + EXPECT_TRUE(bb.expect("hi", 2, 0)); } { BWTest<BigEndian::BufferWriter> bb(2); bb.Put("hi"); - NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0)); + EXPECT_TRUE(bb.expect("hi", 2, 0)); } { BWTest<BigEndian::BufferWriter> bb(1); bb.Put("hi"); - NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0)); + EXPECT_TRUE(bb.expect("hi", 2, 0)); } } -void TestBufferWrite(nlTestSuite * inSuite, void * inContext) +TEST(TestBufferWriter, TestBufferWrite) { { BWTest<BufferWriter> bb(2); bb.Put("hithere", 2); - NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0)); + EXPECT_TRUE(bb.expect("hi", 2, 0)); } { BWTest<BufferWriter> bb(1); bb.Put("hithere", 2); - NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0)); + EXPECT_TRUE(bb.expect("hi", 2, 0)); } { BWTest<LittleEndian::BufferWriter> bb(2); bb.Put("hithere", 2); - NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0)); + EXPECT_TRUE(bb.expect("hi", 2, 0)); } { BWTest<LittleEndian::BufferWriter> bb(1); bb.Put("hithere", 2); - NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0)); + EXPECT_TRUE(bb.expect("hi", 2, 0)); } { BWTest<BigEndian::BufferWriter> bb(2); bb.Put("hithere", 2); - NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0)); + EXPECT_TRUE(bb.expect("hi", 2, 0)); } { BWTest<BigEndian::BufferWriter> bb(1); bb.Put("hithere", 2); - NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0)); + EXPECT_TRUE(bb.expect("hi", 2, 0)); } } -void TestPutLittleEndian(nlTestSuite * inSuite, void * inContext) +TEST(TestBufferWriter, TestPutLittleEndian) { { BWTest<LittleEndian::BufferWriter> bb(2); bb.Put16('h' + 'i' * 256); - NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0)); + EXPECT_TRUE(bb.expect("hi", 2, 0)); } { BWTest<LittleEndian::BufferWriter> bb(4); bb.Put32(0x01020304); - NL_TEST_ASSERT(inSuite, bb.expect("\x04\x03\x02\x01", 4, 0)); + EXPECT_TRUE(bb.expect("\x04\x03\x02\x01", 4, 0)); } { BWTest<LittleEndian::BufferWriter> bb(8); bb.Put64(0x0102030405060708); - NL_TEST_ASSERT(inSuite, bb.expect("\x08\x07\x06\x05\x04\x03\x02\x01", 8, 0)); + EXPECT_TRUE(bb.expect("\x08\x07\x06\x05\x04\x03\x02\x01", 8, 0)); } { BWTest<LittleEndian::BufferWriter> bb(3); bb.EndianPut(0x0102030405060708u, 3); - NL_TEST_ASSERT(inSuite, bb.expect("\x08\x07\x06", 3, 0)); + EXPECT_TRUE(bb.expect("\x08\x07\x06", 3, 0)); } { BWTest<LittleEndian::BufferWriter> bb(4); bb.PutSigned8(static_cast<int8_t>(-6)); - NL_TEST_ASSERT(inSuite, bb.expect("\xfa", 1, 3)); + EXPECT_TRUE(bb.expect("\xfa", 1, 3)); } { BWTest<LittleEndian::BufferWriter> bb(4); bb.PutSigned16(static_cast<int16_t>(-2)); - NL_TEST_ASSERT(inSuite, bb.expect("\xfe\xff", 2, 2)); + EXPECT_TRUE(bb.expect("\xfe\xff", 2, 2)); } { BWTest<LittleEndian::BufferWriter> bb(4); bb.PutSigned32(static_cast<int32_t>(-2)); - NL_TEST_ASSERT(inSuite, bb.expect("\xfe\xff\xff\xff", 4, 0)); + EXPECT_TRUE(bb.expect("\xfe\xff\xff\xff", 4, 0)); } { BWTest<LittleEndian::BufferWriter> bb(8); bb.PutSigned64(static_cast<int64_t>(-2)); - NL_TEST_ASSERT(inSuite, bb.expect("\xfe\xff\xff\xff\xff\xff\xff\xff", 8, 0)); + EXPECT_TRUE(bb.expect("\xfe\xff\xff\xff\xff\xff\xff\xff", 8, 0)); } { BWTest<LittleEndian::BufferWriter> bb(7); bb.PutSigned64(static_cast<int64_t>(-2)); - NL_TEST_ASSERT(inSuite, bb.expect("\xfe\xff\xff\xff\xff\xff\xff", 8, 0)); + EXPECT_TRUE(bb.expect("\xfe\xff\xff\xff\xff\xff\xff", 8, 0)); } { BWTest<LittleEndian::BufferWriter> bb(9); bb.PutSigned64(static_cast<int64_t>(9223372036854775807LL)); - NL_TEST_ASSERT(inSuite, bb.expect("\xff\xff\xff\xff\xff\xff\xff\x7f", 8, 1)); + EXPECT_TRUE(bb.expect("\xff\xff\xff\xff\xff\xff\xff\x7f", 8, 1)); } } -void TestPutBigEndian(nlTestSuite * inSuite, void * inContext) +TEST(TestBufferWriter, TestPutBigEndian) { { BWTest<BigEndian::BufferWriter> bb(2); bb.Put16('i' + 'h' * 256); - NL_TEST_ASSERT(inSuite, bb.expect("hi", 2, 0)); + EXPECT_TRUE(bb.expect("hi", 2, 0)); } { BWTest<BigEndian::BufferWriter> bb(4); bb.Put32(0x01020304); - NL_TEST_ASSERT(inSuite, bb.expect("\x01\x02\x03\x04", 4, 0)); + EXPECT_TRUE(bb.expect("\x01\x02\x03\x04", 4, 0)); } { BWTest<BigEndian::BufferWriter> bb(8); bb.Put64(0x0102030405060708); - NL_TEST_ASSERT(inSuite, bb.expect("\x01\x02\x03\x04\x05\x06\x07\x08", 8, 0)); + EXPECT_TRUE(bb.expect("\x01\x02\x03\x04\x05\x06\x07\x08", 8, 0)); } { BWTest<BigEndian::BufferWriter> bb(3); bb.EndianPut(0x0102030405060708u, 3); - NL_TEST_ASSERT(inSuite, bb.expect("\x06\x07\x08", 3, 0)); + EXPECT_TRUE(bb.expect("\x06\x07\x08", 3, 0)); } { BWTest<BigEndian::BufferWriter> bb(4); bb.PutSigned8(static_cast<int8_t>(-6)); - NL_TEST_ASSERT(inSuite, bb.expect("\xfa", 1, 3)); + EXPECT_TRUE(bb.expect("\xfa", 1, 3)); } { BWTest<BigEndian::BufferWriter> bb(4); bb.PutSigned16(static_cast<int16_t>(-2)); - NL_TEST_ASSERT(inSuite, bb.expect("\xff\xfe", 2, 2)); + EXPECT_TRUE(bb.expect("\xff\xfe", 2, 2)); } { BWTest<BigEndian::BufferWriter> bb(4); bb.PutSigned32(static_cast<int32_t>(-2)); - NL_TEST_ASSERT(inSuite, bb.expect("\xff\xff\xff\xfe", 4, 0)); + EXPECT_TRUE(bb.expect("\xff\xff\xff\xfe", 4, 0)); } { BWTest<BigEndian::BufferWriter> bb(8); bb.PutSigned64(static_cast<int64_t>(-2)); - NL_TEST_ASSERT(inSuite, bb.expect("\xff\xff\xff\xff\xff\xff\xff\xfe", 8, 0)); + EXPECT_TRUE(bb.expect("\xff\xff\xff\xff\xff\xff\xff\xfe", 8, 0)); } { BWTest<BigEndian::BufferWriter> bb(7); bb.PutSigned64(static_cast<int64_t>(-2)); - NL_TEST_ASSERT(inSuite, bb.expect("\xff\xff\xff\xff\xff\xff\xff", 8, 0)); + EXPECT_TRUE(bb.expect("\xff\xff\xff\xff\xff\xff\xff", 8, 0)); } { BWTest<BigEndian::BufferWriter> bb(9); bb.PutSigned64(static_cast<int64_t>(9223372036854775807LL)); - NL_TEST_ASSERT(inSuite, bb.expect("\x7f\xff\xff\xff\xff\xff\xff\xff", 8, 1)); + EXPECT_TRUE(bb.expect("\x7f\xff\xff\xff\xff\xff\xff\xff", 8, 1)); } } - -const nlTest sTests[] = { - NL_TEST_DEF("TestSpanVersusRegular", TestSpanVersusRegular), // - NL_TEST_DEF("TestStringWrite", TestStringWrite), // - NL_TEST_DEF("TestBufferWrite", TestBufferWrite), // - NL_TEST_DEF("TestPutLittleEndian", TestPutLittleEndian), // - NL_TEST_DEF("TestPutBigEndian", TestPutBigEndian), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestBufferWriter() -{ - nlTestSuite theSuite = { "BufferWriter", sTests, nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestBufferWriter) diff --git a/src/lib/support/tests/TestBytesCircularBuffer.cpp b/src/lib/support/tests/TestBytesCircularBuffer.cpp index be1576cedc5fdc..90305e0cf8590a 100644 --- a/src/lib/support/tests/TestBytesCircularBuffer.cpp +++ b/src/lib/support/tests/TestBytesCircularBuffer.cpp @@ -23,35 +23,44 @@ #include <string.h> #include <vector> -#include <lib/support/BytesCircularBuffer.h> -#include <lib/support/UnitTestRegistration.h> +#include <gtest/gtest.h> -#include <nlunit-test.h> +#include <lib/support/BytesCircularBuffer.h> namespace { using namespace chip; -void TestPushInvalid(nlTestSuite * inSuite, void * inContext) +class TestBytesCircularBuffer : public ::testing::Test +{ +public: + static void SetUpTestSuite() + { + unsigned seed = static_cast<unsigned>(std::time(nullptr)); + printf("Running " __FILE__ " using seed %d \n", seed); + std::srand(seed); + } +}; + +TEST_F(TestBytesCircularBuffer, TestPushInvalid) { uint8_t storage[10]; BytesCircularBuffer buffer(storage, sizeof(storage)); const uint8_t s[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' }; - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); + EXPECT_TRUE(buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s, static_cast<size_t>(-1))) == CHIP_ERROR_INVALID_ARGUMENT); - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); + EXPECT_EQ(buffer.Push(ByteSpan(s, static_cast<size_t>(-1))), CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_TRUE(buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s, 8)) == CHIP_ERROR_INVALID_ARGUMENT); - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s, 9)) == CHIP_ERROR_INVALID_ARGUMENT); - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s, 7)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); + EXPECT_EQ(buffer.Push(ByteSpan(s, 8)), CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_TRUE(buffer.IsEmpty()); + EXPECT_EQ(buffer.Push(ByteSpan(s, 9)), CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_TRUE(buffer.IsEmpty()); + EXPECT_EQ(buffer.Push(ByteSpan(s, 7)), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); } -void RandomPushPop(nlTestSuite * inSuite, void * inContext, BytesCircularBuffer & buffer, - std::list<std::vector<uint8_t>> & alreadyInBuffer) +void RandomPushPop(BytesCircularBuffer & buffer, std::list<std::vector<uint8_t>> & alreadyInBuffer) { auto randomString = [] { std::vector<uint8_t> str(static_cast<size_t>(std::rand()) % 8); @@ -64,21 +73,21 @@ void RandomPushPop(nlTestSuite * inSuite, void * inContext, BytesCircularBuffer [](auto s, auto str) { return s + str.size() + 2; }); }; - auto verify = [&inSuite, &alreadyInBuffer, &buffer] { + auto verify = [&alreadyInBuffer, &buffer] { if (alreadyInBuffer.empty()) { - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); + EXPECT_TRUE(buffer.IsEmpty()); } else { - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); + EXPECT_FALSE(buffer.IsEmpty()); auto length = alreadyInBuffer.front().size(); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == length); + EXPECT_EQ(buffer.GetFrontSize(), length); std::vector<uint8_t> str(length); MutableByteSpan readSpan(str.data(), length); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, readSpan.size() == length); - NL_TEST_ASSERT(inSuite, alreadyInBuffer.front() == str); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_EQ(readSpan.size(), length); + EXPECT_EQ(alreadyInBuffer.front(), str); } }; @@ -90,7 +99,7 @@ void RandomPushPop(nlTestSuite * inSuite, void * inContext, BytesCircularBuffer if (!buffer.IsEmpty() && std::rand() % 3 == 0) { // pop - NL_TEST_ASSERT(inSuite, buffer.Pop() == CHIP_NO_ERROR); + EXPECT_EQ(buffer.Pop(), CHIP_NO_ERROR); alreadyInBuffer.pop_front(); verify(); @@ -99,7 +108,7 @@ void RandomPushPop(nlTestSuite * inSuite, void * inContext, BytesCircularBuffer { // push random string auto str = randomString(); - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(str.data(), str.size())) == CHIP_NO_ERROR); + EXPECT_EQ(buffer.Push(ByteSpan(str.data(), str.size())), CHIP_NO_ERROR); alreadyInBuffer.push_back(str); while (bufferSize() > 9) @@ -112,144 +121,144 @@ void RandomPushPop(nlTestSuite * inSuite, void * inContext, BytesCircularBuffer } } -void TestPushPopRandom(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBytesCircularBuffer, TestPushPopRandom) { uint8_t storage[10]; BytesCircularBuffer buffer(storage, sizeof(storage)); - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); + EXPECT_TRUE(buffer.IsEmpty()); std::list<std::vector<uint8_t>> alreadyInBuffer; - RandomPushPop(inSuite, inContext, buffer, alreadyInBuffer); + RandomPushPop(buffer, alreadyInBuffer); } -void TestPushToJustFull(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBytesCircularBuffer, TestPushToJustFull) { uint8_t storage[10]; // Total space = 9 BytesCircularBuffer buffer(storage, sizeof(storage)); - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); + EXPECT_TRUE(buffer.IsEmpty()); const uint8_t s1[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' }; const uint8_t s2[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' }; uint8_t o[sizeof(s1)]; MutableByteSpan readSpan(o); - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); + EXPECT_TRUE(buffer.IsEmpty()); // Used = 6, Free = 3 - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s1, 4)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 4); + EXPECT_EQ(buffer.Push(ByteSpan(s1, 4)), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_EQ(buffer.GetFrontSize(), 4u); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s1, readSpan.data(), 4) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_FALSE(memcmp(s1, readSpan.data(), 4)); // Used = 9, Free = 0 - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s2, 1)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 4); + EXPECT_EQ(buffer.Push(ByteSpan(s2, 1)), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_EQ(buffer.GetFrontSize(), 4u); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s1, readSpan.data(), 4) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_FALSE(memcmp(s1, readSpan.data(), 4)); // Try normal push/pop again std::list<std::vector<uint8_t>> alreadyInBuffer; alreadyInBuffer.push_back(std::vector<uint8_t>{ s1[0], s1[1], s1[2], s1[3] }); alreadyInBuffer.push_back(std::vector<uint8_t>{ s2[0] }); - RandomPushPop(inSuite, inContext, buffer, alreadyInBuffer); + RandomPushPop(buffer, alreadyInBuffer); } -void TestPushToJustFullOverOne(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBytesCircularBuffer, TestPushToJustFullOverOne) { uint8_t storage[10]; // Total space = 9 BytesCircularBuffer buffer(storage, sizeof(storage)); - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); + EXPECT_TRUE(buffer.IsEmpty()); const uint8_t s1[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' }; const uint8_t s2[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' }; uint8_t o[sizeof(s1)]; MutableByteSpan readSpan(o); - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); + EXPECT_TRUE(buffer.IsEmpty()); // Used = 6, Free = 3 - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s1, 4)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 4); + EXPECT_EQ(buffer.Push(ByteSpan(s1, 4)), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_EQ(buffer.GetFrontSize(), 4u); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s1, readSpan.data(), 4) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(s1, readSpan.data(), 4), 0); // Used = 4, Free = 5 - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s2, 2)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 2); + EXPECT_EQ(buffer.Push(ByteSpan(s2, 2)), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_EQ(buffer.GetFrontSize(), 2u); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s2, readSpan.data(), 2) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(s2, readSpan.data(), 2), 0); // Try normal push/pop again std::list<std::vector<uint8_t>> alreadyInBuffer; alreadyInBuffer.push_back(std::vector<uint8_t>{ s2[0], s2[1] }); - RandomPushPop(inSuite, inContext, buffer, alreadyInBuffer); + RandomPushPop(buffer, alreadyInBuffer); } -void TestPushWrap(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBytesCircularBuffer, TestPushWrap) { uint8_t storage[10]; // Total space = 9 BytesCircularBuffer buffer(storage, sizeof(storage)); - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); + EXPECT_TRUE(buffer.IsEmpty()); const uint8_t s1[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' }; const uint8_t s2[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' }; uint8_t o[sizeof(s1)]; MutableByteSpan readSpan(o); - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); + EXPECT_TRUE(buffer.IsEmpty()); // Used = 6, Free = 3 - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s1, 4)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 4); + EXPECT_EQ(buffer.Push(ByteSpan(s1, 4)), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_EQ(buffer.GetFrontSize(), 4u); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s1, readSpan.data(), 4) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(s1, readSpan.data(), 4), 0); // Used = 6, Free = 3, s1 was discarded due to lack of storage - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s2, 4)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 4); + EXPECT_EQ(buffer.Push(ByteSpan(s2, 4)), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_EQ(buffer.GetFrontSize(), 4u); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s2, readSpan.data(), 4) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(s2, readSpan.data(), 4), 0); // Used = 9, Free = 0 - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s1, 1)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 4); + EXPECT_EQ(buffer.Push(ByteSpan(s1, 1)), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_EQ(buffer.GetFrontSize(), 4u); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s2, readSpan.data(), 4) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(s2, readSpan.data(), 4), 0); // Used = 3, Free = 6 - NL_TEST_ASSERT(inSuite, buffer.Pop() == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 1); + EXPECT_EQ(buffer.Pop(), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_TRUE(buffer.GetFrontSize()); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s1, readSpan.data(), 1) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(s1, readSpan.data(), 1), 0); // All freed - NL_TEST_ASSERT(inSuite, buffer.Pop() == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); + EXPECT_EQ(buffer.Pop(), CHIP_NO_ERROR); + EXPECT_TRUE(buffer.IsEmpty()); } -void TestPushWrapStartAtEdge(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBytesCircularBuffer, TestPushWrapStartAtEdge) { uint8_t storage[10]; const uint8_t s1[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' }; @@ -259,47 +268,47 @@ void TestPushWrapStartAtEdge(nlTestSuite * inSuite, void * inContext) // Total space = 9 BytesCircularBuffer buffer(storage, sizeof(storage)); - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); + EXPECT_TRUE(buffer.IsEmpty()); // Used = 6, Free = 3, mDataStart = 0, mDataEnd = 6 - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s1, 4)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 4); + EXPECT_EQ(buffer.Push(ByteSpan(s1, 4)), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_EQ(buffer.GetFrontSize(), 4u); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s1, readSpan.data(), 4) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(s1, readSpan.data(), 4), 0); // Used = 4, Free = 5, mDataStart = 6, mDataEnd = 0 wrap mDataEnd - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s2, 2)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 2); + EXPECT_EQ(buffer.Push(ByteSpan(s2, 2)), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_EQ(buffer.GetFrontSize(), 2u); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s2, readSpan.data(), 2) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(s2, readSpan.data(), 2), 0); // Used = 7, Free = 2, mDataStart = 6, mDataEnd = 3 wrap mDataEnd - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s1, 1)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 2); + EXPECT_EQ(buffer.Push(ByteSpan(s1, 1)), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_EQ(buffer.GetFrontSize(), 2u); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s2, readSpan.data(), 2) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(s2, readSpan.data(), 2), 0); // Used = 3, Free = 6, mDataStart = 0, mDataEnd = 3 - NL_TEST_ASSERT(inSuite, buffer.Pop() == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 1); + EXPECT_EQ(buffer.Pop(), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_EQ(buffer.GetFrontSize(), 1u); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s1, readSpan.data(), 1) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(s1, readSpan.data(), 1), 0); // Try normal push/pop again std::list<std::vector<uint8_t>> alreadyInBuffer; alreadyInBuffer.push_back(std::vector<uint8_t>{ s1[0] }); - RandomPushPop(inSuite, inContext, buffer, alreadyInBuffer); + RandomPushPop(buffer, alreadyInBuffer); } -void TestPushWrapEndAtEdge(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBytesCircularBuffer, TestPushWrapEndAtEdge) { uint8_t storage[10]; const uint8_t s1[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' }; @@ -309,31 +318,31 @@ void TestPushWrapEndAtEdge(nlTestSuite * inSuite, void * inContext) // Total space = 9 BytesCircularBuffer buffer(storage, sizeof(storage)); - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); + EXPECT_TRUE(buffer.IsEmpty()); // Used = 6, Free = 3, mDataStart = 0, mDataEnd = 6 - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s1, 4)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 4); + EXPECT_EQ(buffer.Push(ByteSpan(s1, 4)), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_EQ(buffer.GetFrontSize(), 4u); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s1, readSpan.data(), 4) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(s1, readSpan.data(), 4), 0); // Used = 4, Free = 5, mDataStart = 6, mDataEnd = 0 wrap mDataEnd - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s2, 2)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 2); + EXPECT_EQ(buffer.Push(ByteSpan(s2, 2)), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_EQ(buffer.GetFrontSize(), 2u); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s2, readSpan.data(), 2) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(s2, readSpan.data(), 2), 0); // Try normal push/pop again std::list<std::vector<uint8_t>> alreadyInBuffer; alreadyInBuffer.push_back(std::vector<uint8_t>{ s2[0], s2[1] }); - RandomPushPop(inSuite, inContext, buffer, alreadyInBuffer); + RandomPushPop(buffer, alreadyInBuffer); } -void TestPushWhenFull(nlTestSuite * inSuite, void * inContext) +TEST_F(TestBytesCircularBuffer, TestPushWhenFull) { uint8_t storage[10]; const uint8_t s1[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' }; @@ -343,65 +352,31 @@ void TestPushWhenFull(nlTestSuite * inSuite, void * inContext) // Total space = 9 BytesCircularBuffer buffer(storage, sizeof(storage)); - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); + EXPECT_TRUE(buffer.IsEmpty()); // Used = 9, Free = 0 - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s1, 7)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 7); + EXPECT_EQ(buffer.Push(ByteSpan(s1, 7)), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_EQ(buffer.GetFrontSize(), 7u); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s1, readSpan.data(), 7) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(s1, readSpan.data(), 7), 0); // Used = 5, Free = 4 - NL_TEST_ASSERT(inSuite, buffer.Push(ByteSpan(s2, 3)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, !buffer.IsEmpty()); - NL_TEST_ASSERT(inSuite, buffer.GetFrontSize() == 3); + EXPECT_EQ(buffer.Push(ByteSpan(s2, 3)), CHIP_NO_ERROR); + EXPECT_FALSE(buffer.IsEmpty()); + EXPECT_EQ(buffer.GetFrontSize(), 3u); readSpan = MutableByteSpan(o); - NL_TEST_ASSERT(inSuite, buffer.ReadFront(readSpan) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(s2, readSpan.data(), 3) == 0); + EXPECT_EQ(buffer.ReadFront(readSpan), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(s2, readSpan.data(), 3), 0); // All freed - NL_TEST_ASSERT(inSuite, buffer.Pop() == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, buffer.IsEmpty()); + EXPECT_EQ(buffer.Pop(), CHIP_NO_ERROR); + EXPECT_TRUE(buffer.IsEmpty()); // Try normal push/pop again std::list<std::vector<uint8_t>> alreadyInBuffer; - RandomPushPop(inSuite, inContext, buffer, alreadyInBuffer); -} - -int Setup(void * inContext) -{ - return SUCCESS; -} - -int Teardown(void * inContext) -{ - return SUCCESS; + RandomPushPop(buffer, alreadyInBuffer); } } // namespace - -#define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn) -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { - NL_TEST_DEF_FN(TestPushPopRandom), NL_TEST_DEF_FN(TestPushInvalid), NL_TEST_DEF_FN(TestPushToJustFull), - NL_TEST_DEF_FN(TestPushToJustFullOverOne), NL_TEST_DEF_FN(TestPushWrap), NL_TEST_DEF_FN(TestPushWrapStartAtEdge), - NL_TEST_DEF_FN(TestPushWrapEndAtEdge), NL_TEST_DEF_FN(TestPushWhenFull), NL_TEST_SENTINEL() -}; - -int TestBytesCircularBuffer() -{ - nlTestSuite theSuite = { "CHIP BytesCircularBuffer tests", &sTests[0], Setup, Teardown }; - - unsigned seed = static_cast<unsigned>(std::time(nullptr)); - printf("Running " __FILE__ " using seed %d", seed); - std::srand(seed); - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestBytesCircularBuffer); diff --git a/src/lib/support/tests/TestErrorStr.cpp b/src/lib/support/tests/TestErrorStr.cpp index 45133e0401f560..49ae9f5a9b40ac 100644 --- a/src/lib/support/tests/TestErrorStr.cpp +++ b/src/lib/support/tests/TestErrorStr.cpp @@ -19,33 +19,31 @@ #include <stdlib.h> #include <string.h> -#include <lib/core/CHIPCore.h> +#include <gtest/gtest.h> +#include <lib/core/CHIPCore.h> #include <lib/core/ErrorStr.h> -#include <lib/support/UnitTestRegistration.h> - -#include <nlunit-test.h> using namespace chip; #if CHIP_CONFIG_ERROR_SOURCE && !CHIP_CONFIG_SHORT_ERROR_STR -const char * CheckAndSkipSource(nlTestSuite * inSuite, const char * s, const char * file, unsigned int line) +const char * CheckAndSkipSource(const char * s, const char * file, unsigned int line) { size_t fileLength = strlen(file); - NL_TEST_ASSERT(inSuite, strncmp(s, file, fileLength) == 0); - NL_TEST_ASSERT(inSuite, s[fileLength] == ':'); + EXPECT_EQ(strncmp(s, file, fileLength), 0); + EXPECT_EQ(s[fileLength], ':'); char * end; - NL_TEST_ASSERT(inSuite, strtoul(&s[fileLength + 1], &end, 10) == line); - NL_TEST_ASSERT(inSuite, strncmp(end, ": ", 2) == 0); + EXPECT_EQ(strtoul(&s[fileLength + 1], &end, 10), line); + EXPECT_EQ(strncmp(end, ": ", 2), 0); return end + 2; } -#define CHECK_AND_SKIP_SOURCE(suite, s) CheckAndSkipSource((suite), (s), __FILE__, __LINE__) +#define CHECK_AND_SKIP_SOURCE(s) CheckAndSkipSource((s), __FILE__, __LINE__) #else // CHIP_CONFIG_ERROR_SOURCE && !CHIP_CONFIG_SHORT_ERROR_STR -#define CHECK_AND_SKIP_SOURCE(suite, s) (s) +#define CHECK_AND_SKIP_SOURCE(s) (s) #endif // CHIP_CONFIG_ERROR_SOURCE && !CHIP_CONFIG_SHORT_ERROR_STR @@ -68,7 +66,7 @@ static bool trueFormat(char * buf, uint16_t bufSize, CHIP_ERROR err) return true; // means I handled it } -static void CheckRegisterDeregisterErrorFormatter(nlTestSuite * inSuite, void * inContext) +TEST(TestErrorStr, CheckRegisterDeregisterErrorFormatter) { static ErrorFormatter falseFormatter = { falseFormat, nullptr }; static ErrorFormatter falseFormatter2 = { falseFormat2, nullptr }; @@ -77,22 +75,22 @@ static void CheckRegisterDeregisterErrorFormatter(nlTestSuite * inSuite, void * // simple case RegisterErrorFormatter(&falseFormatter); ErrorStr(CHIP_ERROR_INTERNAL); - NL_TEST_ASSERT(inSuite, falseFormatCalled == 1); + EXPECT_EQ(falseFormatCalled, 1); // reset falseFormatCalled = 0; // re-registration should be ignored RegisterErrorFormatter(&falseFormatter); ErrorStr(CHIP_ERROR_INTERNAL); - NL_TEST_ASSERT(inSuite, falseFormatCalled == 1); + EXPECT_EQ(falseFormatCalled, 1); // reset falseFormatCalled = 0; // registration of a new handler, nobody handling anything RegisterErrorFormatter(&falseFormatter2); ErrorStr(CHIP_ERROR_INTERNAL); - NL_TEST_ASSERT(inSuite, falseFormatCalled == 1); - NL_TEST_ASSERT(inSuite, falseFormat2Called == 1); + EXPECT_EQ(falseFormatCalled, 1); + EXPECT_EQ(falseFormat2Called, 1); // reset falseFormatCalled = 0; falseFormat2Called = 0; @@ -100,29 +98,29 @@ static void CheckRegisterDeregisterErrorFormatter(nlTestSuite * inSuite, void * // registration of a true handler, gets first crack RegisterErrorFormatter(&trueFormatter); ErrorStr(CHIP_ERROR_INTERNAL); - NL_TEST_ASSERT(inSuite, trueFormatCalled == 1); - NL_TEST_ASSERT(inSuite, falseFormatCalled == 0); - NL_TEST_ASSERT(inSuite, falseFormat2Called == 0); + EXPECT_EQ(trueFormatCalled, 1); + EXPECT_EQ(falseFormatCalled, 0); + EXPECT_EQ(falseFormat2Called, 0); // reset trueFormatCalled = 0; // deregister true DeregisterErrorFormatter(&trueFormatter); ErrorStr(CHIP_ERROR_INTERNAL); - NL_TEST_ASSERT(inSuite, trueFormatCalled == 0); - NL_TEST_ASSERT(inSuite, falseFormatCalled == 1); - NL_TEST_ASSERT(inSuite, falseFormat2Called == 1); + EXPECT_EQ(trueFormatCalled, 0); + EXPECT_EQ(falseFormatCalled, 1); + EXPECT_EQ(falseFormat2Called, 1); // verify this doesn't crash DeregisterErrorFormatter(&trueFormatter); } -static void CheckNoError(nlTestSuite * inSuite, void * inContext) +TEST(TestErrorStr, CheckNoError) { - NL_TEST_ASSERT(inSuite, strcmp(CHECK_AND_SKIP_SOURCE(inSuite, ErrorStr(CHIP_NO_ERROR)), CHIP_NO_ERROR_STRING) == 0); + EXPECT_STREQ(CHECK_AND_SKIP_SOURCE(ErrorStr(CHIP_NO_ERROR)), CHIP_NO_ERROR_STRING); } -static void CheckFormatErr(nlTestSuite * inSuite, void * inContext) +TEST(TestErrorStr, CheckFormatErr) { #if CHIP_CONFIG_SHORT_ERROR_STR @@ -137,63 +135,28 @@ static void CheckFormatErr(nlTestSuite * inSuite, void * inContext) strcpy(buf, "hi"); // shouldn't touch the buffer FormatError(buf, 0, subsys, CHIP_ERROR_INTERNAL, desc); - NL_TEST_ASSERT(inSuite, strcmp(buf, "hi") == 0); + EXPECT_STREQ(buf, "hi"); // guarantees null termination, doesn't touch past 1st byte strcpy(buf, "hi"); FormatError(buf, 1, subsys, CHIP_ERROR_INTERNAL, desc); - NL_TEST_ASSERT(inSuite, strcmp(buf, "") == 0); - NL_TEST_ASSERT(inSuite, buf[1] == 'i'); + EXPECT_STREQ(buf, ""); + EXPECT_EQ(buf[1], 'i'); // whole shebang FormatError(buf, kBufSize, subsys, CHIP_CORE_ERROR(1), desc); - NL_TEST_ASSERT(inSuite, strcmp(buf, "subsys Error 0x00000001: desc") == 0); + EXPECT_STREQ(buf, "subsys Error 0x00000001: desc"); // skip desc FormatError(buf, kBufSize, subsys, CHIP_CORE_ERROR(1), nullptr); - NL_TEST_ASSERT(inSuite, strcmp(buf, "subsys Error 0x00000001") == 0); + EXPECT_STREQ(buf, "subsys Error 0x00000001"); // skip subsys FormatError(buf, kBufSize, nullptr, CHIP_CORE_ERROR(1), desc); - NL_TEST_ASSERT(inSuite, strcmp(buf, "Error 0x00000001: desc") == 0); + EXPECT_STREQ(buf, "Error 0x00000001: desc"); // skip both FormatError(buf, kBufSize, nullptr, CHIP_CORE_ERROR(1), nullptr); - NL_TEST_ASSERT(inSuite, strcmp(buf, "Error 0x00000001") == 0); + EXPECT_STREQ(buf, "Error 0x00000001"); #endif } - -/** - * Test Suite. It lists all the test functions. - */ - -// clang-format off -static const nlTest sTests[] = -{ - NL_TEST_DEF("NoError", CheckNoError), - NL_TEST_DEF("RegisterDeregisterErrorFormatter", CheckRegisterDeregisterErrorFormatter), - NL_TEST_DEF("FormatErr", CheckFormatErr), - - NL_TEST_SENTINEL() -}; -// clang-format on - -int TestErrorStr() -{ - // clang-format off - nlTestSuite theSuite = - { - "Test the ErrorStr primitives", - &sTests[0], - nullptr, - nullptr - }; - // clang-format on - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestErrorStr) diff --git a/src/lib/support/tests/TestPrivateHeap.cpp b/src/lib/support/tests/TestPrivateHeap.cpp index dae83951a2faa8..f808c16cb8e5f6 100644 --- a/src/lib/support/tests/TestPrivateHeap.cpp +++ b/src/lib/support/tests/TestPrivateHeap.cpp @@ -16,12 +16,11 @@ * limitations under the License. */ -#include <lib/support/PrivateHeap.h> -#include <lib/support/UnitTestRegistration.h> - #include <string.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> + +#include <lib/support/PrivateHeap.h> namespace { @@ -47,14 +46,14 @@ class PrivateHeapAllocator } mHeap; }; -void SingleHeapAllocAndFree(nlTestSuite * inSuite, void * inContext) +TEST(TestPrivateHeap, TestSingleHeapAllocAndFree) { PrivateHeapAllocator<16 + 2 * kBlockHeaderSize> allocator; - NL_TEST_ASSERT(inSuite, nullptr == allocator.HeapAlloc(17)); // insufficient size + EXPECT_EQ(nullptr, allocator.HeapAlloc(17)); // insufficient size void * ptr = allocator.HeapAlloc(16); - NL_TEST_ASSERT(inSuite, nullptr != ptr); - NL_TEST_ASSERT(inSuite, nullptr == allocator.HeapAlloc(1)); // insufficient size + ASSERT_NE(nullptr, ptr); + EXPECT_EQ(nullptr, allocator.HeapAlloc(1)); // insufficient size memset(ptr, 0xab, 16); allocator.HeapFree(ptr); @@ -62,25 +61,25 @@ void SingleHeapAllocAndFree(nlTestSuite * inSuite, void * inContext) for (size_t i = 1; i < 17; ++i) { ptr = allocator.HeapAlloc(i); - NL_TEST_ASSERT(inSuite, nullptr != ptr); - NL_TEST_ASSERT(inSuite, nullptr == allocator.HeapAlloc(17 - i)); // insufficient size + ASSERT_NE(nullptr, ptr); + EXPECT_EQ(nullptr, allocator.HeapAlloc(17 - i)); // insufficient size allocator.HeapFree(ptr); } } -void SplitHeapAllocAndFree(nlTestSuite * inSuite, void * inContext) +TEST(TestPrivateHeap, TestSplitHeapAllocAndFree) { PrivateHeapAllocator<128> allocator; // allocator state: // <HDR-FREE> 96 <HDR-END> void * p1 = allocator.HeapAlloc(30); - NL_TEST_ASSERT(inSuite, nullptr != p1); + ASSERT_NE(nullptr, p1); // allocator state: // <HDR-IN_USE> 32 <HRD-FREE> 48 <HDR-END> void * p2 = allocator.HeapAlloc(4); - NL_TEST_ASSERT(inSuite, nullptr != p2); + ASSERT_NE(nullptr, p2); // allocator state: // <HDR-IN_USE> 32 <HRD-IN_USE> 8 <HDR-FREE> 24 <HDR-END> @@ -93,20 +92,20 @@ void SplitHeapAllocAndFree(nlTestSuite * inSuite, void * inContext) // <HDR-FREE> 96 <HDR-END> p1 = allocator.HeapAlloc(90); - NL_TEST_ASSERT(inSuite, nullptr != p1); + ASSERT_NE(nullptr, p1); allocator.HeapFree(p1); } -void FreeMergeNext(nlTestSuite * inSuite, void * inContext) +TEST(TestPrivateHeap, TestFreeMergeNext) { PrivateHeapAllocator<5 * 16> allocator; void * p1 = allocator.HeapAlloc(16); void * p2 = allocator.HeapAlloc(16); - NL_TEST_ASSERT(inSuite, nullptr != p1); - NL_TEST_ASSERT(inSuite, nullptr != p2); - NL_TEST_ASSERT(inSuite, nullptr == allocator.HeapAlloc(1)); + ASSERT_NE(nullptr, p1); + ASSERT_NE(nullptr, p2); + EXPECT_EQ(nullptr, allocator.HeapAlloc(1)); memset(p1, 0xab, 16); memset(p2, 0xcd, 16); @@ -116,20 +115,20 @@ void FreeMergeNext(nlTestSuite * inSuite, void * inContext) allocator.HeapFree(p2); p1 = allocator.HeapAlloc(3 * 16); - NL_TEST_ASSERT(inSuite, nullptr != p1); + ASSERT_NE(nullptr, p1); allocator.HeapFree(p1); } -void FreeMergePrevious(nlTestSuite * inSuite, void * inContext) +TEST(TestPrivateHeap, TestFreeMergePrevious) { PrivateHeapAllocator<5 * 16> allocator; void * p1 = allocator.HeapAlloc(16); void * p2 = allocator.HeapAlloc(16); - NL_TEST_ASSERT(inSuite, nullptr != p1); - NL_TEST_ASSERT(inSuite, nullptr != p2); - NL_TEST_ASSERT(inSuite, nullptr == allocator.HeapAlloc(1)); + ASSERT_NE(nullptr, p1); + ASSERT_NE(nullptr, p2); + EXPECT_EQ(nullptr, allocator.HeapAlloc(1)); memset(p1, 0xab, 16); memset(p2, 0xcd, 16); @@ -138,11 +137,11 @@ void FreeMergePrevious(nlTestSuite * inSuite, void * inContext) allocator.HeapFree(p2); allocator.HeapFree(p1); p1 = allocator.HeapAlloc(3 * 16); - NL_TEST_ASSERT(inSuite, nullptr != p1); + ASSERT_NE(nullptr, p1); allocator.HeapFree(p1); } -void FreeMergePreviousAndNext(nlTestSuite * inSuite, void * inContext) +TEST(TestPrivateHeap, TestFreeMergePreviousAndNext) { PrivateHeapAllocator<7 * 16> allocator; @@ -151,10 +150,10 @@ void FreeMergePreviousAndNext(nlTestSuite * inSuite, void * inContext) void * p2 = allocator.HeapAlloc(16); void * p3 = allocator.HeapAlloc(16); - NL_TEST_ASSERT(inSuite, nullptr != p1); - NL_TEST_ASSERT(inSuite, nullptr != p2); - NL_TEST_ASSERT(inSuite, nullptr != p3); - NL_TEST_ASSERT(inSuite, nullptr == allocator.HeapAlloc(1)); + ASSERT_NE(nullptr, p1); + ASSERT_NE(nullptr, p2); + ASSERT_NE(nullptr, p3); + EXPECT_EQ(nullptr, allocator.HeapAlloc(1)); memset(p1, 0xab, 16); memset(p2, 0xcd, 16); @@ -163,16 +162,16 @@ void FreeMergePreviousAndNext(nlTestSuite * inSuite, void * inContext) allocator.HeapFree(p1); allocator.HeapFree(p3); // we have 2 slots of size 16 available now - NL_TEST_ASSERT(inSuite, nullptr == allocator.HeapAlloc(17)); + EXPECT_EQ(nullptr, allocator.HeapAlloc(17)); // Freeing p2 makes enoug space allocator.HeapFree(p2); p1 = allocator.HeapAlloc(5 * 16); - NL_TEST_ASSERT(inSuite, nullptr != p1); + ASSERT_NE(nullptr, p1); allocator.HeapFree(p1); } -void MultipleMerge(nlTestSuite * inSuite, void * inContext) +TEST(TestPrivateHeap, TestMultipleMerge) { PrivateHeapAllocator<32 * kBlockHeaderSize> allocator; @@ -184,19 +183,19 @@ void MultipleMerge(nlTestSuite * inSuite, void * inContext) void * p5 = allocator.HeapAlloc(7 * kBlockHeaderSize); // uses up 8 blocks void * p6 = allocator.HeapAlloc(2 * kBlockHeaderSize); // uses up 2 (last given) - NL_TEST_ASSERT(inSuite, nullptr != p1); - NL_TEST_ASSERT(inSuite, nullptr != p2); - NL_TEST_ASSERT(inSuite, nullptr != p3); - NL_TEST_ASSERT(inSuite, nullptr != p4); - NL_TEST_ASSERT(inSuite, nullptr != p5); - NL_TEST_ASSERT(inSuite, nullptr != p6); + ASSERT_NE(nullptr, p1); + ASSERT_NE(nullptr, p2); + ASSERT_NE(nullptr, p3); + ASSERT_NE(nullptr, p4); + ASSERT_NE(nullptr, p5); + ASSERT_NE(nullptr, p6); allocator.HeapFree(p3); allocator.HeapFree(p4); // 10 blocks available (9 from p3 without HDR and 2 from p4 + HDR) p3 = allocator.HeapAlloc(10 * kBlockHeaderSize); - NL_TEST_ASSERT(inSuite, nullptr != p3); - NL_TEST_ASSERT(inSuite, nullptr == allocator.HeapAlloc(1)); // full + ASSERT_NE(nullptr, p3); + EXPECT_EQ(nullptr, allocator.HeapAlloc(1)); // full allocator.HeapFree(p6); allocator.HeapFree(p5); @@ -205,11 +204,11 @@ void MultipleMerge(nlTestSuite * inSuite, void * inContext) allocator.HeapFree(p1); p1 = allocator.HeapAlloc(30 * kBlockHeaderSize); - NL_TEST_ASSERT(inSuite, nullptr != p1); + ASSERT_NE(nullptr, p1); allocator.HeapFree(p1); } -void ForwardFreeAndRealloc(nlTestSuite * inSuite, void * inContext) +TEST(TestPrivateHeap, TestForwardFreeAndRealloc) { constexpr int kNumBlocks = 16; PrivateHeapAllocator<(2 * kNumBlocks + 1) * kBlockHeaderSize> allocator; @@ -218,7 +217,7 @@ void ForwardFreeAndRealloc(nlTestSuite * inSuite, void * inContext) for (auto & ptr : ptrs) { ptr = allocator.HeapAlloc(kBlockHeaderSize); - NL_TEST_ASSERT(inSuite, nullptr != ptr); + ASSERT_NE(nullptr, ptr); memset(ptr, 0xab, kBlockHeaderSize); } @@ -232,12 +231,12 @@ void ForwardFreeAndRealloc(nlTestSuite * inSuite, void * inContext) allocator.HeapFree(ptrs[i]); ptrs[0] = allocator.HeapAlloc((1 + 2 * i) * kBlockHeaderSize); - NL_TEST_ASSERT(inSuite, nullptr != ptrs[0]); + ASSERT_NE(nullptr, ptrs[0]); } allocator.HeapFree(ptrs[0]); } -void BackwardFreeAndRealloc(nlTestSuite * inSuite, void * inContext) +TEST(TestPrivateHeap, TestBackwardFreeAndRealloc) { constexpr int kNumBlocks = 16; PrivateHeapAllocator<(2 * kNumBlocks + 1) * kBlockHeaderSize> allocator; @@ -246,7 +245,7 @@ void BackwardFreeAndRealloc(nlTestSuite * inSuite, void * inContext) for (auto & ptr : ptrs) { ptr = allocator.HeapAlloc(kBlockHeaderSize); - NL_TEST_ASSERT(inSuite, nullptr != ptr); + ASSERT_NE(nullptr, ptr); memset(ptr, 0xab, kBlockHeaderSize); } @@ -260,7 +259,7 @@ void BackwardFreeAndRealloc(nlTestSuite * inSuite, void * inContext) allocator.HeapFree(ptrs[kNumBlocks - i - 1]); ptrs[kNumBlocks - 1] = allocator.HeapAlloc((1 + 2 * i) * kBlockHeaderSize); - NL_TEST_ASSERT(inSuite, nullptr != ptrs[kNumBlocks - 1]); + ASSERT_NE(nullptr, ptrs[kNumBlocks - 1]); } allocator.HeapFree(ptrs[kNumBlocks - 1]); } @@ -293,71 +292,49 @@ bool IsKnownPattern(void * buffer, size_t size, uint8_t start) return true; } -void Realloc(nlTestSuite * inSuite, void * inContext) +TEST(TestPrivateHeap, TestRealloc) { PrivateHeapAllocator<6 * 16> allocator; void * p1 = allocator.HeapRealloc(nullptr, 16); // malloc basically - NL_TEST_ASSERT(inSuite, p1 != nullptr); + ASSERT_NE(p1, nullptr); FillKnownPattern(p1, 16, 11); void * p2 = allocator.HeapRealloc(p1, 8); // resize, should fit - NL_TEST_ASSERT(inSuite, p1 == p2); - NL_TEST_ASSERT(inSuite, IsKnownPattern(p1, 8, 11)); + EXPECT_EQ(p1, p2); + EXPECT_TRUE(IsKnownPattern(p1, 8, 11)); p2 = allocator.HeapRealloc(p1, 16); // resize, should fit - NL_TEST_ASSERT(inSuite, p1 == p2); - NL_TEST_ASSERT(inSuite, IsKnownPattern(p2, 8, 11)); // only 8 bytes are guaranteed + EXPECT_EQ(p1, p2); + EXPECT_TRUE(IsKnownPattern(p2, 8, 11)); // only 8 bytes are guaranteed FillKnownPattern(p1, 16, 33); p2 = allocator.HeapRealloc(p1, 32); // resize, does not fit. This frees p1 - NL_TEST_ASSERT(inSuite, p2 != nullptr); - NL_TEST_ASSERT(inSuite, p2 != p1); // new reallocation occurred - NL_TEST_ASSERT(inSuite, IsKnownPattern(p2, 16, 33)); + ASSERT_NE(p2, nullptr); + EXPECT_NE(p2, p1); // new reallocation occurred + EXPECT_TRUE(IsKnownPattern(p2, 16, 33)); void * p3 = allocator.HeapAlloc(48); // insufficient heap for this - NL_TEST_ASSERT(inSuite, p3 == nullptr); + EXPECT_EQ(p3, nullptr); p1 = allocator.HeapRealloc(p2, 16); // reallocation does not change block size - NL_TEST_ASSERT(inSuite, p1 == p2); + EXPECT_EQ(p1, p2); p3 = allocator.HeapAlloc(48); // still insufficient heap for this - NL_TEST_ASSERT(inSuite, p3 == nullptr); + EXPECT_EQ(p3, nullptr); p2 = allocator.HeapRealloc(p1, 48); // insufficient heap, p1 is NOT freed - NL_TEST_ASSERT(inSuite, p2 == nullptr); + EXPECT_EQ(p2, nullptr); p2 = allocator.HeapRealloc(p1, 48); // Repeat the test to ensure p1 is not freed - NL_TEST_ASSERT(inSuite, p2 == nullptr); + EXPECT_EQ(p2, nullptr); allocator.HeapFree(p1); p3 = allocator.HeapAlloc(48); // above free should have made sufficient space - NL_TEST_ASSERT(inSuite, p3 != nullptr); + ASSERT_NE(p3, nullptr); allocator.HeapFree(p3); } -const nlTest sTests[] = { - NL_TEST_DEF("SingleHeapAllocAndFree", SingleHeapAllocAndFree), // - NL_TEST_DEF("SplitHeapAllocAndFree", SplitHeapAllocAndFree), // - NL_TEST_DEF("FreeMergeNext", FreeMergeNext), // - NL_TEST_DEF("FreeMergePrevious", FreeMergePrevious), // - NL_TEST_DEF("FreeMergePreviousAndNext", FreeMergePreviousAndNext), // - NL_TEST_DEF("MultipleMerge", MultipleMerge), // - NL_TEST_DEF("ForwardFreeAndRealloc", ForwardFreeAndRealloc), // - NL_TEST_DEF("BackwardFreeAndRealloc", BackwardFreeAndRealloc), // - NL_TEST_DEF("Realloc", Realloc), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestPrivateHeap() -{ - nlTestSuite theSuite = { "PrivateHeap", sTests, nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestPrivateHeap) diff --git a/src/lib/support/tests/TestScopedBuffer.cpp b/src/lib/support/tests/TestScopedBuffer.cpp index 8e77ba75751312..c7ec072726c2be 100644 --- a/src/lib/support/tests/TestScopedBuffer.cpp +++ b/src/lib/support/tests/TestScopedBuffer.cpp @@ -16,13 +16,19 @@ * limitations under the License. */ -#include <lib/support/ScopedBuffer.h> -#include <lib/support/UnitTestRegistration.h> +#include <gtest/gtest.h> -#include <nlunit-test.h> +#include <lib/support/ScopedBuffer.h> namespace { +class TestScopedBuffer : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + class TestCounterMemoryManagement { public: @@ -52,102 +58,66 @@ int TestCounterMemoryManagement::mAllocCount = 0; using TestCounterScopedBuffer = chip::Platform::ScopedMemoryBuffer<char, TestCounterMemoryManagement>; -void TestAutoFree(nlTestSuite * inSuite, void * inContext) +TEST_F(TestScopedBuffer, TestAutoFree) { - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0); + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 0); { TestCounterScopedBuffer buffer; - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0); - NL_TEST_ASSERT(inSuite, buffer.Alloc(128)); - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 1); + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 0); + EXPECT_TRUE(buffer.Alloc(128)); + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 1); } - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0); + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 0); } -void TestFreeDuringAllocs(nlTestSuite * inSuite, void * inContext) +TEST_F(TestScopedBuffer, TestFreeDuringAllocs) { - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0); + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 0); { TestCounterScopedBuffer buffer; - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0); - NL_TEST_ASSERT(inSuite, buffer.Alloc(128)); - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 1); - NL_TEST_ASSERT(inSuite, buffer.Alloc(64)); - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 1); - NL_TEST_ASSERT(inSuite, buffer.Calloc(10)); - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 1); + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 0); + EXPECT_TRUE(buffer.Alloc(128)); + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 1); + EXPECT_TRUE(buffer.Alloc(64)); + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 1); + EXPECT_TRUE(buffer.Calloc(10)); + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 1); } - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0); + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 0); } -void TestRelease(nlTestSuite * inSuite, void * inContext) +TEST_F(TestScopedBuffer, TestRelease) { - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0); + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 0); void * ptr = nullptr; { TestCounterScopedBuffer buffer; - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0); - NL_TEST_ASSERT(inSuite, buffer.Alloc(128)); - NL_TEST_ASSERT(inSuite, buffer.Get() != nullptr); + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 0); + EXPECT_TRUE(buffer.Alloc(128)); + EXPECT_NE(buffer.Get(), nullptr); ptr = buffer.Release(); - NL_TEST_ASSERT(inSuite, ptr != nullptr); - NL_TEST_ASSERT(inSuite, buffer.Get() == nullptr); + EXPECT_NE(ptr, nullptr); + EXPECT_EQ(buffer.Get(), nullptr); } - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 1); + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 1); { TestCounterScopedBuffer buffer; - NL_TEST_ASSERT(inSuite, buffer.Alloc(128)); - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 2); + EXPECT_TRUE(buffer.Alloc(128)); + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 2); TestCounterMemoryManagement::MemoryFree(ptr); - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 1); + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 1); } - NL_TEST_ASSERT(inSuite, TestCounterMemoryManagement::Counter() == 0); -} - -int Setup(void * inContext) -{ - CHIP_ERROR error = chip::Platform::MemoryInit(); - if (error != CHIP_NO_ERROR) - return FAILURE; - return SUCCESS; -} - -int Teardown(void * inContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; + EXPECT_EQ(TestCounterMemoryManagement::Counter(), 0); } } // namespace - -#define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn) -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { - NL_TEST_DEF_FN(TestAutoFree), // - NL_TEST_DEF_FN(TestFreeDuringAllocs), // - NL_TEST_DEF_FN(TestRelease), // - NL_TEST_SENTINEL() // -}; - -int TestScopedBuffer() -{ - nlTestSuite theSuite = { "CHIP ScopedBuffer tests", &sTests[0], Setup, Teardown }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestScopedBuffer) diff --git a/src/lib/support/tests/TestSorting.cpp b/src/lib/support/tests/TestSorting.cpp index 4fd5c0954519e5..1d04604c110fd5 100644 --- a/src/lib/support/tests/TestSorting.cpp +++ b/src/lib/support/tests/TestSorting.cpp @@ -20,12 +20,11 @@ #include <array> #include <stdio.h> +#include <gtest/gtest.h> + #include <lib/support/SortUtils.h> #include <lib/support/Span.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> - using namespace chip; using namespace chip::Sorting; @@ -71,7 +70,7 @@ class InsertionSorter : public Sorter } }; -void DoBasicSortTest(nlTestSuite * inSuite, Sorter & sorter) +void DoBasicSortTest(Sorter & sorter) { Span<Datum> empty_to_sort; Span<Datum> empty_expected; @@ -115,7 +114,7 @@ void DoBasicSortTest(nlTestSuite * inSuite, Sorter & sorter) const auto & expected = expected_outs[case_idx]; sorter.Sort(to_sort); - NL_TEST_ASSERT(inSuite, to_sort.data_equal(expected)); + EXPECT_TRUE(to_sort.data_equal(expected)); if (!to_sort.data_equal(expected)) { for (size_t idx = 0; idx < to_sort.size(); ++idx) @@ -126,44 +125,17 @@ void DoBasicSortTest(nlTestSuite * inSuite, Sorter & sorter) sorted_item.associated_data, expected_item.key, expected_item.associated_data); } } - NL_TEST_ASSERT(inSuite, sorter.compare_count() <= (to_sort.size() * to_sort.size())); + EXPECT_LE(sorter.compare_count(), (to_sort.size() * to_sort.size())); printf("Compare counts: %d\n", static_cast<int>(sorter.compare_count())); sorter.Reset(); } } -void TestBasicSort(nlTestSuite * inSuite, void * inContext) +TEST(TestSorting, TestBasicSort) { printf("Testing insertion sorter.\n"); InsertionSorter insertion_sorter; - DoBasicSortTest(inSuite, insertion_sorter); + DoBasicSortTest(insertion_sorter); } -// clang-format off -static const nlTest sTests[] = -{ - NL_TEST_DEF("Basic sort tests for custom sort utilities", TestBasicSort), - NL_TEST_SENTINEL() -}; -// clang-format on - } // namespace - -int TestSortUtils() -{ - // clang-format off - nlTestSuite theSuite = - { - "Test for SortUtils", - &sTests[0], - nullptr, - nullptr - }; - // clang-format on - - nlTestRunner(&theSuite, nullptr); - - return (nlTestRunnerStats(&theSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestSortUtils) diff --git a/src/lib/support/tests/TestStringBuilder.cpp b/src/lib/support/tests/TestStringBuilder.cpp index 34d04304f4eff1..2f4ad518da3dd1 100644 --- a/src/lib/support/tests/TestStringBuilder.cpp +++ b/src/lib/support/tests/TestStringBuilder.cpp @@ -15,78 +15,77 @@ * limitations under the License. */ #include <lib/support/StringBuilder.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> namespace { using namespace chip; -void TestStringBuilder(nlTestSuite * inSuite, void * inContext) +TEST(TestStringBuilder, TestStringBuilder) { StringBuilder<64> builder; - NL_TEST_ASSERT(inSuite, builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "") == 0); + EXPECT_TRUE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), ""); builder.Add("foo"); - NL_TEST_ASSERT(inSuite, builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "foo") == 0); + EXPECT_TRUE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "foo"); builder.Add("bar"); - NL_TEST_ASSERT(inSuite, builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "foobar") == 0); + EXPECT_TRUE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "foobar"); } -void TestIntegerAppend(nlTestSuite * inSuite, void * inContext) +TEST(TestStringBuilder, TestIntegerAppend) { StringBuilder<64> builder; builder.Add("nr: ").Add(1234); - NL_TEST_ASSERT(inSuite, builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "nr: 1234") == 0); + EXPECT_TRUE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "nr: 1234"); builder.Add(", ").Add(-22); - NL_TEST_ASSERT(inSuite, builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "nr: 1234, -22") == 0); + EXPECT_TRUE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "nr: 1234, -22"); } -void TestOverflow(nlTestSuite * inSuite, void * inContext) +TEST(TestStringBuilder, TestOverflow) { { StringBuilder<4> builder; builder.Add("foo"); - NL_TEST_ASSERT(inSuite, builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "foo") == 0); + EXPECT_TRUE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "foo"); builder.Add("bar"); - NL_TEST_ASSERT(inSuite, !builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "foo") == 0); + EXPECT_FALSE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "foo"); } { StringBuilder<7> builder; builder.Add("x: ").Add(12345); - NL_TEST_ASSERT(inSuite, !builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "x: 123") == 0); + EXPECT_FALSE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "x: 123"); } } -void TestFormat(nlTestSuite * inSuite, void * inContext) +TEST(TestStringBuilder, TestFormat) { { StringBuilder<100> builder; builder.AddFormat("Test: %d Hello %s\n", 123, "world"); - NL_TEST_ASSERT(inSuite, builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "Test: 123 Hello world\n") == 0); + EXPECT_TRUE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "Test: 123 Hello world\n"); } { @@ -94,8 +93,8 @@ void TestFormat(nlTestSuite * inSuite, void * inContext) builder.AddFormat("Align: %-5s", "abc"); - NL_TEST_ASSERT(inSuite, builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "Align: abc ") == 0); + EXPECT_TRUE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "Align: abc "); } { @@ -104,20 +103,20 @@ void TestFormat(nlTestSuite * inSuite, void * inContext) builder.AddFormat("Multi: %d", 1234); builder.AddFormat(", then 0x%04X", 0xab); - NL_TEST_ASSERT(inSuite, builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "Multi: 1234, then 0x00AB") == 0); + EXPECT_TRUE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "Multi: 1234, then 0x00AB"); } } -void TestFormatOverflow(nlTestSuite * inSuite, void * inContext) +TEST(TestStringBuilder, TestFormatOverflow) { { StringBuilder<13> builder; builder.AddFormat("Test: %d Hello %s\n", 123, "world"); - NL_TEST_ASSERT(inSuite, !builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "Test: 123 He") == 0); + EXPECT_FALSE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "Test: 123 He"); } { @@ -125,48 +124,48 @@ void TestFormatOverflow(nlTestSuite * inSuite, void * inContext) builder.AddFormat("%d %d %d %d %d", 1, 2, 3, 4, 1234); - NL_TEST_ASSERT(inSuite, !builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "1 2 3 4 12") == 0); + EXPECT_FALSE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "1 2 3 4 12"); builder.AddMarkerIfOverflow(); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "1 2 3 4...") == 0); + EXPECT_STREQ(builder.c_str(), "1 2 3 4..."); } { StringBuilder<11> builder; builder.AddFormat("%d", 1234); - NL_TEST_ASSERT(inSuite, builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "1234") == 0); + EXPECT_TRUE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "1234"); builder.AddFormat("%s", "abc"); - NL_TEST_ASSERT(inSuite, builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "1234abc") == 0); + EXPECT_TRUE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "1234abc"); builder.AddMarkerIfOverflow(); // no overflow - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "1234abc") == 0); + EXPECT_STREQ(builder.c_str(), "1234abc"); builder.AddFormat("%08x", 0x123456); - NL_TEST_ASSERT(inSuite, !builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "1234abc001") == 0); + EXPECT_FALSE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "1234abc001"); builder.AddMarkerIfOverflow(); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "1234abc...") == 0); + EXPECT_STREQ(builder.c_str(), "1234abc..."); } } -void TestOverflowMarker(nlTestSuite * inSuite, void * inContext) +TEST(TestStringBuilder, TestOverflowMarker) { { StringBuilder<1> builder; // useless builder, but ok builder.Add("abc123"); - NL_TEST_ASSERT(inSuite, !builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "") == 0); + EXPECT_FALSE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), ""); builder.AddMarkerIfOverflow(); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "") == 0); + EXPECT_STREQ(builder.c_str(), ""); } { @@ -174,11 +173,11 @@ void TestOverflowMarker(nlTestSuite * inSuite, void * inContext) builder.Add("abc123"); - NL_TEST_ASSERT(inSuite, !builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "a") == 0); + EXPECT_FALSE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "a"); builder.AddMarkerIfOverflow(); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), ".") == 0); + EXPECT_STREQ(builder.c_str(), "."); } { @@ -186,11 +185,11 @@ void TestOverflowMarker(nlTestSuite * inSuite, void * inContext) builder.Add("abc123"); - NL_TEST_ASSERT(inSuite, !builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "ab") == 0); + EXPECT_FALSE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "ab"); builder.AddMarkerIfOverflow(); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "..") == 0); + EXPECT_STREQ(builder.c_str(), ".."); } { @@ -198,11 +197,11 @@ void TestOverflowMarker(nlTestSuite * inSuite, void * inContext) builder.Add("abc123"); - NL_TEST_ASSERT(inSuite, !builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "abc") == 0); + EXPECT_FALSE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "abc"); builder.AddMarkerIfOverflow(); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "...") == 0); + EXPECT_STREQ(builder.c_str(), "..."); } { @@ -210,31 +209,12 @@ void TestOverflowMarker(nlTestSuite * inSuite, void * inContext) builder.Add("abc123"); - NL_TEST_ASSERT(inSuite, !builder.Fit()); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "abc1") == 0); + EXPECT_FALSE(builder.Fit()); + EXPECT_STREQ(builder.c_str(), "abc1"); builder.AddMarkerIfOverflow(); - NL_TEST_ASSERT(inSuite, strcmp(builder.c_str(), "a...") == 0); + EXPECT_STREQ(builder.c_str(), "a..."); } } -const nlTest sTests[] = { - NL_TEST_DEF("TestStringBuilder", TestStringBuilder), // - NL_TEST_DEF("TestIntegerAppend", TestIntegerAppend), // - NL_TEST_DEF("TestOverflow", TestOverflow), // - NL_TEST_DEF("TestFormat", TestFormat), // - NL_TEST_DEF("TestFormatOverflow", TestFormatOverflow), // - NL_TEST_DEF("TestOverflowMarker", TestOverflowMarker), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestStringBuilder() -{ - nlTestSuite theSuite = { "StringBuilder", sTests, nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestStringBuilder) diff --git a/src/lib/support/tests/TestStringSplitter.cpp b/src/lib/support/tests/TestStringSplitter.cpp index 50b0ec094f0a0f..c8dd1e9f802c47 100644 --- a/src/lib/support/tests/TestStringSplitter.cpp +++ b/src/lib/support/tests/TestStringSplitter.cpp @@ -15,15 +15,13 @@ * limitations under the License. */ #include <lib/support/StringSplitter.h> -#include <lib/support/UnitTestRegistration.h> - -#include <nlunit-test.h> +#include <gtest/gtest.h> namespace { using namespace chip; -void TestStrdupSplitter(nlTestSuite * inSuite, void * inContext) +TEST(TestStringSplitter, TestStrdupSplitter) { CharSpan out; @@ -32,122 +30,107 @@ void TestStrdupSplitter(nlTestSuite * inSuite, void * inContext) StringSplitter splitter("", ','); // next stays at nullptr - NL_TEST_ASSERT(inSuite, !splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data() == nullptr); - NL_TEST_ASSERT(inSuite, !splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data() == nullptr); - NL_TEST_ASSERT(inSuite, !splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data() == nullptr); + EXPECT_FALSE(splitter.Next(out)); + EXPECT_EQ(out.data(), nullptr); + EXPECT_FALSE(splitter.Next(out)); + EXPECT_EQ(out.data(), nullptr); + EXPECT_FALSE(splitter.Next(out)); + EXPECT_EQ(out.data(), nullptr); } // single item { StringSplitter splitter("single", ','); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal("single"_span)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal("single"_span)); // next stays at nullptr also after valid data - NL_TEST_ASSERT(inSuite, !splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data() == nullptr); - NL_TEST_ASSERT(inSuite, !splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data() == nullptr); + EXPECT_FALSE(splitter.Next(out)); + EXPECT_EQ(out.data(), nullptr); + EXPECT_FALSE(splitter.Next(out)); + EXPECT_EQ(out.data(), nullptr); } // multi-item { StringSplitter splitter("one,two,three", ','); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal("one"_span)); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal("two"_span)); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal("three"_span)); - NL_TEST_ASSERT(inSuite, !splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data() == nullptr); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal("one"_span)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal("two"_span)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal("three"_span)); + EXPECT_FALSE(splitter.Next(out)); + EXPECT_EQ(out.data(), nullptr); } // mixed { StringSplitter splitter("a**bc*d,e*f", '*'); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal("a"_span)); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal(""_span)); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal("bc"_span)); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal("d,e"_span)); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal("f"_span)); - NL_TEST_ASSERT(inSuite, !splitter.Next(out)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal("a"_span)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal(""_span)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal("bc"_span)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal("d,e"_span)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal("f"_span)); + EXPECT_FALSE(splitter.Next(out)); } // some edge cases { StringSplitter splitter(",", ','); // Note that even though "" is nullptr right away, "," becomes two empty strings - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal(""_span)); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal(""_span)); - NL_TEST_ASSERT(inSuite, !splitter.Next(out)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal(""_span)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal(""_span)); + EXPECT_FALSE(splitter.Next(out)); } { StringSplitter splitter("log,", ','); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal("log"_span)); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal(""_span)); - NL_TEST_ASSERT(inSuite, !splitter.Next(out)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal("log"_span)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal(""_span)); + EXPECT_FALSE(splitter.Next(out)); } { StringSplitter splitter(",log", ','); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal(""_span)); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal("log"_span)); - NL_TEST_ASSERT(inSuite, !splitter.Next(out)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal(""_span)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal("log"_span)); + EXPECT_FALSE(splitter.Next(out)); } { StringSplitter splitter(",,,", ','); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal(""_span)); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal(""_span)); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal(""_span)); - NL_TEST_ASSERT(inSuite, splitter.Next(out)); - NL_TEST_ASSERT(inSuite, out.data_equal(""_span)); - NL_TEST_ASSERT(inSuite, !splitter.Next(out)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal(""_span)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal(""_span)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal(""_span)); + EXPECT_TRUE(splitter.Next(out)); + EXPECT_TRUE(out.data_equal(""_span)); + EXPECT_FALSE(splitter.Next(out)); } } -void TestNullResilience(nlTestSuite * inSuite, void * inContext) +TEST(TestStringSplitter, TestNullResilience) { { StringSplitter splitter(nullptr, ','); CharSpan span; - NL_TEST_ASSERT(inSuite, !splitter.Next(span)); - NL_TEST_ASSERT(inSuite, span.data() == nullptr); + EXPECT_FALSE(splitter.Next(span)); + EXPECT_EQ(span.data(), nullptr); } } -const nlTest sTests[] = { - NL_TEST_DEF("TestSplitter", TestStrdupSplitter), // - NL_TEST_DEF("TestNullResilience", TestNullResilience), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestStringSplitter() -{ - nlTestSuite theSuite = { "StringSplitter", sTests, nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestStringSplitter) diff --git a/src/lib/support/tests/TestTimeUtils.cpp b/src/lib/support/tests/TestTimeUtils.cpp index cc0f8bbe02827e..7d0a69709b8bc4 100644 --- a/src/lib/support/tests/TestTimeUtils.cpp +++ b/src/lib/support/tests/TestTimeUtils.cpp @@ -29,10 +29,9 @@ #include <stdlib.h> #include <time.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> #include <lib/support/TimeUtils.h> -#include <lib/support/UnitTestRegistration.h> #include <lib/support/logging/CHIPLogging.h> using namespace chip; @@ -44,7 +43,7 @@ using namespace chip; { \ ChipLogError(NotSpecified, "%s", (message)); \ } \ - NL_TEST_ASSERT(inSuite, (cond)); \ + EXPECT_TRUE((cond)); \ \ if (!(cond)) \ return; \ @@ -800,7 +799,7 @@ OrdinalDateTestValue LeapYearOrdinalDates[] = }; // clang-format on -void TestOrdinalDateConversion(nlTestSuite * inSuite, void * inContext) +TEST(TestTimeUtils, TestOrdinalDateConversion) { for (uint16_t year = 0; year <= 10000; year++) { @@ -823,7 +822,7 @@ void TestOrdinalDateConversion(nlTestSuite * inSuite, void * inContext) } } -void TestDaysSinceEpochConversion(nlTestSuite * inSuite, void * inContext) +TEST(TestTimeUtils, TestDaysSinceEpochConversion) { uint32_t daysSinceEpoch = 0; @@ -870,7 +869,7 @@ void TestDaysSinceEpochConversion(nlTestSuite * inSuite, void * inContext) } } -void TestSecondsSinceEpochConversion(nlTestSuite * inSuite, void * inContext) +TEST(TestTimeUtils, TestSecondsSinceEpochConversion) { uint32_t daysSinceEpoch = 0; uint32_t timeOfDay = 0; // in seconds @@ -949,7 +948,7 @@ void TestSecondsSinceEpochConversion(nlTestSuite * inSuite, void * inContext) } } -void TestChipEpochTimeConversion(nlTestSuite * inSuite, void * inContext) +TEST(TestTimeUtils, TestChipEpochTimeConversion) { uint32_t daysSinceEpoch = 0; uint32_t timeOfDay = 0; // in seconds @@ -1022,54 +1021,22 @@ void TestChipEpochTimeConversion(nlTestSuite * inSuite, void * inContext) } } -void TestChipEpochTimeEdgeConditions(nlTestSuite * inSuite, void * inContext) +TEST(TestTimeUtils, TestChipEpochTimeEdgeConditions) { uint32_t chip_epoch_time_sec = 0; - NL_TEST_ASSERT(inSuite, UnixEpochToChipEpochTime(INT32_MAX, chip_epoch_time_sec)); - NL_TEST_ASSERT(inSuite, chip_epoch_time_sec < INT32_MAX); + EXPECT_TRUE(UnixEpochToChipEpochTime(UINT32_MAX, chip_epoch_time_sec)); + EXPECT_LT(chip_epoch_time_sec, UINT32_MAX); // TODO(#30990): Bring back tests when implementation fixed. #if 0 constexpr uint32_t kUnix2000Jan1 = 946702800; // Start of CHIP epoch. - chip_epoch_time_sec = INT32_MAX; - NL_TEST_ASSERT(inSuite, UnixEpochToChipEpochTime(kUnix2000Jan1, chip_epoch_time_sec) == true); - NL_TEST_ASSERT(inSuite, chip_epoch_time_sec == 0); + chip_epoch_time_sec = UINT32_MAX; + EXPECT_EQ(UnixEpochToChipEpochTime(kUnix2000Jan1, chip_epoch_time_sec), true); + EXPECT_EQ(chip_epoch_time_sec, 0u); chip_epoch_time_sec = 0; - NL_TEST_ASSERT(inSuite, UnixEpochToChipEpochTime(kUnix2000Jan1 - 1, chip_epoch_time_sec) == false); + EXPECT_EQ(UnixEpochToChipEpochTime(kUnix2000Jan1 - 1, chip_epoch_time_sec), false); #endif } - -// clang-format off -static const nlTest g_all_tests[] = -{ - NL_TEST_DEF("Test Ordinal Date conversion", TestOrdinalDateConversion), - NL_TEST_DEF("Test DaysSinceEpoch conversion", TestDaysSinceEpochConversion), - NL_TEST_DEF("Test SecondsSinceEpoch conversion", TestSecondsSinceEpochConversion), - NL_TEST_DEF("Test ChipEpochTime conversion", TestChipEpochTimeConversion), - NL_TEST_DEF("Test edge conditions of time conversions", TestChipEpochTimeEdgeConditions), - - NL_TEST_SENTINEL() -}; -// clang-format on - -int TestTimeUtils() -{ - // clang-format off - nlTestSuite theSuite = - { - "Test common time utilities", - &g_all_tests[0], - nullptr, - nullptr - }; - // clang-format on - - nlTestRunner(&theSuite, nullptr); - - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestTimeUtils); diff --git a/src/lib/support/tests/TestVariant.cpp b/src/lib/support/tests/TestVariant.cpp index 10cb9d48a9070a..cd51d252dd3a0c 100644 --- a/src/lib/support/tests/TestVariant.cpp +++ b/src/lib/support/tests/TestVariant.cpp @@ -18,10 +18,9 @@ #include <functional> -#include <lib/support/UnitTestRegistration.h> -#include <lib/support/Variant.h> +#include <gtest/gtest.h> -#include <nlunit-test.h> +#include <lib/support/Variant.h> namespace { @@ -73,159 +72,159 @@ int Count::destroyed = 0; using namespace chip; -void TestVariantSimple(nlTestSuite * inSuite, void * inContext) +TEST(TestVariant, TestVariantSimple) { Variant<Simple, Pod> v; - NL_TEST_ASSERT(inSuite, !v.Valid()); + EXPECT_FALSE(v.Valid()); v.Set<Pod>(5, 10); - NL_TEST_ASSERT(inSuite, v.Valid()); - NL_TEST_ASSERT(inSuite, v.Is<Pod>()); - NL_TEST_ASSERT(inSuite, v.Get<Pod>().m1 == 5); - NL_TEST_ASSERT(inSuite, v.Get<Pod>().m2 == 10); + EXPECT_TRUE(v.Valid()); + EXPECT_TRUE(v.Is<Pod>()); + EXPECT_EQ(v.Get<Pod>().m1, 5); + EXPECT_EQ(v.Get<Pod>().m2, 10); } -void TestVariantMovable(nlTestSuite * inSuite, void * inContext) +TEST(TestVariant, TestVariantMovable) { Variant<Simple, Movable> v; v.Set<Simple>(); v.Set<Movable>(Movable{ 5, 10 }); - NL_TEST_ASSERT(inSuite, v.Get<Movable>().m1 == 5); - NL_TEST_ASSERT(inSuite, v.Get<Movable>().m2 == 10); + EXPECT_EQ(v.Get<Movable>().m1, 5); + EXPECT_EQ(v.Get<Movable>().m2, 10); auto & m = v.Get<Movable>(); - NL_TEST_ASSERT(inSuite, m.m1 == 5); - NL_TEST_ASSERT(inSuite, m.m2 == 10); + EXPECT_EQ(m.m1, 5); + EXPECT_EQ(m.m2, 10); v.Set<Simple>(); } -void TestVariantCtorDtor(nlTestSuite * inSuite, void * inContext) +TEST(TestVariant, TestVariantCtorDtor) { { Variant<Simple, Count> v; - NL_TEST_ASSERT(inSuite, Count::created == 0); + EXPECT_EQ(Count::created, 0); v.Set<Simple>(); - NL_TEST_ASSERT(inSuite, Count::created == 0); + EXPECT_EQ(Count::created, 0); v.Get<Simple>(); - NL_TEST_ASSERT(inSuite, Count::created == 0); + EXPECT_EQ(Count::created, 0); } { Variant<Simple, Count> v; - NL_TEST_ASSERT(inSuite, Count::created == 0); + EXPECT_EQ(Count::created, 0); v.Set<Simple>(); - NL_TEST_ASSERT(inSuite, Count::created == 0); + EXPECT_EQ(Count::created, 0); v.Set<Count>(); - NL_TEST_ASSERT(inSuite, Count::created == 1); - NL_TEST_ASSERT(inSuite, Count::destroyed == 0); + EXPECT_EQ(Count::created, 1); + EXPECT_EQ(Count::destroyed, 0); v.Get<Count>(); - NL_TEST_ASSERT(inSuite, Count::created == 1); - NL_TEST_ASSERT(inSuite, Count::destroyed == 0); + EXPECT_EQ(Count::created, 1); + EXPECT_EQ(Count::destroyed, 0); v.Set<Simple>(); - NL_TEST_ASSERT(inSuite, Count::created == 1); - NL_TEST_ASSERT(inSuite, Count::destroyed == 1); + EXPECT_EQ(Count::created, 1); + EXPECT_EQ(Count::destroyed, 1); v.Set<Count>(); - NL_TEST_ASSERT(inSuite, Count::created == 2); - NL_TEST_ASSERT(inSuite, Count::destroyed == 1); + EXPECT_EQ(Count::created, 2); + EXPECT_EQ(Count::destroyed, 1); } - NL_TEST_ASSERT(inSuite, Count::destroyed == 2); + EXPECT_EQ(Count::destroyed, 2); { Variant<Simple, Count> v1; v1.Set<Count>(); Variant<Simple, Count> v2(v1); } - NL_TEST_ASSERT(inSuite, Count::created == 4); - NL_TEST_ASSERT(inSuite, Count::destroyed == 4); + EXPECT_EQ(Count::created, 4); + EXPECT_EQ(Count::destroyed, 4); { Variant<Simple, Count> v1; v1.Set<Count>(); Variant<Simple, Count> v2(std::move(v1)); } - NL_TEST_ASSERT(inSuite, Count::created == 6); - NL_TEST_ASSERT(inSuite, Count::destroyed == 6); + EXPECT_EQ(Count::created, 6); + EXPECT_EQ(Count::destroyed, 6); { Variant<Simple, Count> v1, v2; v1.Set<Count>(); v2 = v1; } - NL_TEST_ASSERT(inSuite, Count::created == 8); - NL_TEST_ASSERT(inSuite, Count::destroyed == 8); + EXPECT_EQ(Count::created, 8); + EXPECT_EQ(Count::destroyed, 8); { Variant<Simple, Count> v1, v2; v1.Set<Count>(); v2 = std::move(v1); } - NL_TEST_ASSERT(inSuite, Count::created == 10); - NL_TEST_ASSERT(inSuite, Count::destroyed == 10); + EXPECT_EQ(Count::created, 10); + EXPECT_EQ(Count::destroyed, 10); } -void TestVariantCopy(nlTestSuite * inSuite, void * inContext) +TEST(TestVariant, TestVariantCopy) { Variant<Simple, Pod> v1; v1.Set<Pod>(5, 10); Variant<Simple, Pod> v2 = v1; - NL_TEST_ASSERT(inSuite, v1.Valid()); - NL_TEST_ASSERT(inSuite, v1.Get<Pod>().m1 == 5); - NL_TEST_ASSERT(inSuite, v1.Get<Pod>().m2 == 10); - NL_TEST_ASSERT(inSuite, v2.Valid()); - NL_TEST_ASSERT(inSuite, v2.Get<Pod>().m1 == 5); - NL_TEST_ASSERT(inSuite, v2.Get<Pod>().m2 == 10); + EXPECT_TRUE(v1.Valid()); + EXPECT_EQ(v1.Get<Pod>().m1, 5); + EXPECT_EQ(v1.Get<Pod>().m2, 10); + EXPECT_TRUE(v2.Valid()); + EXPECT_EQ(v2.Get<Pod>().m1, 5); + EXPECT_EQ(v2.Get<Pod>().m2, 10); } -void TestVariantMove(nlTestSuite * inSuite, void * inContext) +TEST(TestVariant, TestVariantMove) { Variant<Simple, Movable> v1; v1.Set<Movable>(5, 10); Variant<Simple, Movable> v2 = std::move(v1); - NL_TEST_ASSERT(inSuite, !v1.Valid()); // NOLINT(bugprone-use-after-move) - NL_TEST_ASSERT(inSuite, v2.Valid()); - NL_TEST_ASSERT(inSuite, v2.Get<Movable>().m1 == 5); - NL_TEST_ASSERT(inSuite, v2.Get<Movable>().m2 == 10); + EXPECT_FALSE(v1.Valid()); // NOLINT(bugprone-use-after-move) + EXPECT_TRUE(v2.Valid()); + EXPECT_EQ(v2.Get<Movable>().m1, 5); + EXPECT_EQ(v2.Get<Movable>().m2, 10); } -void TestVariantCopyAssign(nlTestSuite * inSuite, void * inContext) +TEST(TestVariant, TestVariantCopyAssign) { Variant<Simple, Pod> v1; Variant<Simple, Pod> v2; v1.Set<Pod>(5, 10); v2 = v1; - NL_TEST_ASSERT(inSuite, v1.Valid()); - NL_TEST_ASSERT(inSuite, v1.Get<Pod>().m1 == 5); - NL_TEST_ASSERT(inSuite, v1.Get<Pod>().m2 == 10); - NL_TEST_ASSERT(inSuite, v2.Valid()); - NL_TEST_ASSERT(inSuite, v2.Get<Pod>().m1 == 5); - NL_TEST_ASSERT(inSuite, v2.Get<Pod>().m2 == 10); + EXPECT_TRUE(v1.Valid()); + EXPECT_EQ(v1.Get<Pod>().m1, 5); + EXPECT_EQ(v1.Get<Pod>().m2, 10); + EXPECT_TRUE(v2.Valid()); + EXPECT_EQ(v2.Get<Pod>().m1, 5); + EXPECT_EQ(v2.Get<Pod>().m2, 10); } -void TestVariantMoveAssign(nlTestSuite * inSuite, void * inContext) +TEST(TestVariant, TestVariantMoveAssign) { Variant<Simple, Pod> v1; Variant<Simple, Pod> v2; v1.Set<Pod>(5, 10); v2 = std::move(v1); - NL_TEST_ASSERT(inSuite, !v1.Valid()); // NOLINT(bugprone-use-after-move) - NL_TEST_ASSERT(inSuite, v2.Valid()); - NL_TEST_ASSERT(inSuite, v2.Get<Pod>().m1 == 5); - NL_TEST_ASSERT(inSuite, v2.Get<Pod>().m2 == 10); + EXPECT_FALSE(v1.Valid()); // NOLINT(bugprone-use-after-move) + EXPECT_TRUE(v2.Valid()); + EXPECT_EQ(v2.Get<Pod>().m1, 5); + EXPECT_EQ(v2.Get<Pod>().m2, 10); } -void TestVariantInPlace(nlTestSuite * inSuite, void * inContext) +TEST(TestVariant, TestVariantInPlace) { int i = 0; Variant<std::reference_wrapper<int>> v1 = Variant<std::reference_wrapper<int>>(InPlaceTemplate<std::reference_wrapper<int>>, i); - NL_TEST_ASSERT(inSuite, v1.Valid()); - NL_TEST_ASSERT(inSuite, v1.Is<std::reference_wrapper<int>>()); - NL_TEST_ASSERT(inSuite, &v1.Get<std::reference_wrapper<int>>().get() == &i); + EXPECT_TRUE(v1.Valid()); + EXPECT_TRUE(v1.Is<std::reference_wrapper<int>>()); + EXPECT_EQ(&v1.Get<std::reference_wrapper<int>>().get(), &i); Variant<std::reference_wrapper<int>> v2 = Variant<std::reference_wrapper<int>>::Create<std::reference_wrapper<int>>(i); - NL_TEST_ASSERT(inSuite, v2.Valid()); - NL_TEST_ASSERT(inSuite, v2.Is<std::reference_wrapper<int>>()); - NL_TEST_ASSERT(inSuite, &v2.Get<std::reference_wrapper<int>>().get() == &i); + EXPECT_TRUE(v2.Valid()); + EXPECT_TRUE(v2.Is<std::reference_wrapper<int>>()); + EXPECT_EQ(&v2.Get<std::reference_wrapper<int>>().get(), &i); } -void TestVariantCompare(nlTestSuite * inSuite, void * inContext) +TEST(TestVariant, TestVariantCompare) { Variant<Simple, Pod> v0; Variant<Simple, Pod> v1; @@ -238,66 +237,35 @@ void TestVariantCompare(nlTestSuite * inSuite, void * inContext) v3.Set<Pod>(5, 10); v4.Set<Pod>(5, 11); - NL_TEST_ASSERT(inSuite, (v0 == v0)); - NL_TEST_ASSERT(inSuite, !(v0 == v1)); - NL_TEST_ASSERT(inSuite, !(v0 == v2)); - NL_TEST_ASSERT(inSuite, !(v0 == v3)); - NL_TEST_ASSERT(inSuite, !(v0 == v4)); - - NL_TEST_ASSERT(inSuite, !(v1 == v0)); - NL_TEST_ASSERT(inSuite, (v1 == v1)); - NL_TEST_ASSERT(inSuite, !(v1 == v2)); - NL_TEST_ASSERT(inSuite, !(v1 == v3)); - NL_TEST_ASSERT(inSuite, !(v1 == v4)); - - NL_TEST_ASSERT(inSuite, !(v2 == v0)); - NL_TEST_ASSERT(inSuite, !(v2 == v1)); - NL_TEST_ASSERT(inSuite, (v2 == v2)); - NL_TEST_ASSERT(inSuite, (v2 == v3)); - NL_TEST_ASSERT(inSuite, !(v2 == v4)); - - NL_TEST_ASSERT(inSuite, !(v3 == v0)); - NL_TEST_ASSERT(inSuite, !(v3 == v1)); - NL_TEST_ASSERT(inSuite, (v3 == v2)); - NL_TEST_ASSERT(inSuite, (v3 == v3)); - NL_TEST_ASSERT(inSuite, !(v3 == v4)); - - NL_TEST_ASSERT(inSuite, !(v4 == v0)); - NL_TEST_ASSERT(inSuite, !(v4 == v1)); - NL_TEST_ASSERT(inSuite, !(v4 == v2)); - NL_TEST_ASSERT(inSuite, !(v4 == v3)); - NL_TEST_ASSERT(inSuite, (v4 == v4)); -} - -int Setup(void * inContext) -{ - return SUCCESS; -} - -int Teardown(void * inContext) -{ - return SUCCESS; + EXPECT_TRUE(v0 == v0); + EXPECT_FALSE(v0 == v1); + EXPECT_FALSE(v0 == v2); + EXPECT_FALSE(v0 == v3); + EXPECT_FALSE(v0 == v4); + + EXPECT_FALSE(v1 == v0); + EXPECT_TRUE(v1 == v1); + EXPECT_FALSE(v1 == v2); + EXPECT_FALSE(v1 == v3); + EXPECT_FALSE(v1 == v4); + + EXPECT_FALSE(v2 == v0); + EXPECT_FALSE(v2 == v1); + EXPECT_TRUE(v2 == v2); + EXPECT_TRUE(v2 == v3); + EXPECT_FALSE(v2 == v4); + + EXPECT_FALSE(v3 == v0); + EXPECT_FALSE(v3 == v1); + EXPECT_TRUE(v3 == v2); + EXPECT_TRUE(v3 == v3); + EXPECT_FALSE(v3 == v4); + + EXPECT_FALSE(v4 == v0); + EXPECT_FALSE(v4 == v1); + EXPECT_FALSE(v4 == v2); + EXPECT_FALSE(v4 == v3); + EXPECT_TRUE(v4 == v4); } } // namespace - -#define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn) -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { NL_TEST_DEF_FN(TestVariantSimple), NL_TEST_DEF_FN(TestVariantMovable), - NL_TEST_DEF_FN(TestVariantCtorDtor), NL_TEST_DEF_FN(TestVariantCopy), - NL_TEST_DEF_FN(TestVariantMove), NL_TEST_DEF_FN(TestVariantCopyAssign), - NL_TEST_DEF_FN(TestVariantMoveAssign), NL_TEST_DEF_FN(TestVariantInPlace), - NL_TEST_DEF_FN(TestVariantCompare), NL_TEST_SENTINEL() }; - -int TestVariant() -{ - nlTestSuite theSuite = { "CHIP Variant tests", &sTests[0], Setup, Teardown }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestVariant); From 5ce992d1f314cd5a4a0fc6a2050d842413a76a58 Mon Sep 17 00:00:00 2001 From: Andrei Litvin <andy314@gmail.com> Date: Fri, 26 Apr 2024 14:28:09 -0400 Subject: [PATCH 061/124] Include what you use for some chef files (#33197) * Some include-what-you-use for stl things in chef * Restyle --------- Co-authored-by: Andrei Litvin <andreilitvin@google.com> --- examples/chef/common/clusters/door-lock/chef-lock-manager.cpp | 4 +++- examples/chef/common/clusters/door-lock/chef-lock-manager.h | 2 ++ .../common/clusters/target-navigator/TargetNavigatorManager.h | 1 + examples/chef/esp32/main/QRCodeScreen.cpp | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/chef/common/clusters/door-lock/chef-lock-manager.cpp b/examples/chef/common/clusters/door-lock/chef-lock-manager.cpp index b6c3f7a4a35090..24505972fb8e41 100644 --- a/examples/chef/common/clusters/door-lock/chef-lock-manager.cpp +++ b/examples/chef/common/clusters/door-lock/chef-lock-manager.cpp @@ -15,12 +15,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include <iostream> #include <lib/support/logging/CHIPLogging.h> #ifdef MATTER_DM_PLUGIN_DOOR_LOCK_SERVER #include "chef-lock-manager.h" +#include <algorithm> +#include <iostream> + using chip::to_underlying; LockManager LockManager::instance; diff --git a/examples/chef/common/clusters/door-lock/chef-lock-manager.h b/examples/chef/common/clusters/door-lock/chef-lock-manager.h index f941620880678e..b8fb409fc09e3d 100644 --- a/examples/chef/common/clusters/door-lock/chef-lock-manager.h +++ b/examples/chef/common/clusters/door-lock/chef-lock-manager.h @@ -20,7 +20,9 @@ #include "chef-lock-endpoint.h" #include <app/clusters/door-lock-server/door-lock-server.h> + #include <cstdint> +#include <vector> class LockManager { diff --git a/examples/chef/common/clusters/target-navigator/TargetNavigatorManager.h b/examples/chef/common/clusters/target-navigator/TargetNavigatorManager.h index e9528081661e8d..56382feda5388e 100644 --- a/examples/chef/common/clusters/target-navigator/TargetNavigatorManager.h +++ b/examples/chef/common/clusters/target-navigator/TargetNavigatorManager.h @@ -19,6 +19,7 @@ #include <app/clusters/target-navigator-server/target-navigator-server.h> +#include <list> #include <string> class TargetNavigatorManager : public chip::app::Clusters::TargetNavigator::Delegate diff --git a/examples/chef/esp32/main/QRCodeScreen.cpp b/examples/chef/esp32/main/QRCodeScreen.cpp index ac39b9498e9f21..0b43664468a717 100644 --- a/examples/chef/esp32/main/QRCodeScreen.cpp +++ b/examples/chef/esp32/main/QRCodeScreen.cpp @@ -43,6 +43,7 @@ #include <setup_payload/QRCodeSetupPayloadGenerator.h> #include <string> +#include <vector> // TODO need sensible library tag when put in library extern const char TAG[]; From 61f305650a65186712c31eb43cccdf81ea79a17f Mon Sep 17 00:00:00 2001 From: Kamil Kasperczyk <66371704+kkasperczyk-no@users.noreply.github.com> Date: Fri, 26 Apr 2024 21:18:19 +0200 Subject: [PATCH 062/124] [thread] Enhance/Optimize attach to thread network (#33191) Enhance attaching to Thread network by verifying if the current dataset is the same as provided. In the current solution implementation will not reset the Thread interface while the dataset are equal to the active dataset. --- .../GenericThreadStackManagerImpl_OpenThread.hpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp index f4548e67829582..f62b82b4f2d112 100644 --- a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp +++ b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp @@ -372,6 +372,14 @@ template <class ImplClass> CHIP_ERROR GenericThreadStackManagerImpl_OpenThread<ImplClass>::_AttachToThreadNetwork( const Thread::OperationalDataset & dataset, NetworkCommissioning::Internal::WirelessDriver::ConnectCallback * callback) { + Thread::OperationalDataset current_dataset; + // Validate the dataset change with the current state + ThreadStackMgrImpl().GetThreadProvision(current_dataset); + if (dataset.AsByteSpan().data_equal(current_dataset.AsByteSpan()) && callback == nullptr) + { + return CHIP_NO_ERROR; + } + // Reset the previously set callback since it will never be called in case incorrect dataset was supplied. mpConnectCallback = nullptr; ReturnErrorOnFailure(Impl()->SetThreadEnabled(false)); From a45386bad240995f4e5d338dd1e95bf898039e23 Mon Sep 17 00:00:00 2001 From: joonhaengHeo <85541460+joonhaengHeo@users.noreply.github.com> Date: Sat, 27 Apr 2024 04:23:53 +0900 Subject: [PATCH 063/124] Fix Android ChipCluster subscribe issue (#33192) --- .../generators/java/ChipClusters_java.jinja | 8 +- .../several_clusters/java/ChipClusters.java | 12 +- .../chip/devicecontroller/ChipClusters.java | 1851 ++++++++++++++++- 3 files changed, 1865 insertions(+), 6 deletions(-) diff --git a/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja b/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja index fb49e5737271b9..b391d09389ac2b 100644 --- a/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja +++ b/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja @@ -217,7 +217,7 @@ public class ChipClusters { long attributeId, int minInterval, int maxInterval) { - ReportCallbackJni jniCallback = new ReportCallbackJni(callback, callback, null); + ReportCallbackJni jniCallback = new ReportCallbackJni(callback, callback, callback); ChipAttributePath path = ChipAttributePath.newInstance(endpointId, clusterId, attributeId); ChipInteractionClient.subscribe(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, minInterval, maxInterval, false, true, timeoutMillis.orElse(0L).intValue(), null); } @@ -250,7 +250,7 @@ public class ChipClusters { } } - abstract static class ReportCallbackImpl implements ReportCallback, SubscriptionEstablishedCallback { + abstract static class ReportCallbackImpl implements ReportCallback, SubscriptionEstablishedCallback, ResubscriptionAttemptCallback { private BaseAttributeCallback callback; private ChipAttributePath path; @@ -308,6 +308,9 @@ public class ChipClusters { callback.onSubscriptionEstablished(subscriptionId); } + @Override + public void onResubscriptionAttempt(long terminationCause, long nextResubscribeIntervalMsec) {} + public abstract void onSuccess(byte[] tlv); } @@ -551,6 +554,7 @@ public class ChipClusters { public void onSuccess(byte[] tlv) { {%- set encodable = attribute.definition | asEncodable(typeLookup) %} {{encode_value_without_optional(cluster, encodable, 0)}} value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, {{attribute.definition.name | constcase}}_ATTRIBUTE_ID, minInterval, maxInterval); } diff --git a/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java b/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java index 836940ab4e089f..b574271a684521 100644 --- a/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java +++ b/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java @@ -140,7 +140,7 @@ protected void subscribeAttribute( long attributeId, int minInterval, int maxInterval) { - ReportCallbackJni jniCallback = new ReportCallbackJni(callback, callback, null); + ReportCallbackJni jniCallback = new ReportCallbackJni(callback, callback, callback); ChipAttributePath path = ChipAttributePath.newInstance(endpointId, clusterId, attributeId); ChipInteractionClient.subscribe(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, minInterval, maxInterval, false, true, timeoutMillis.orElse(0L).intValue(), null); } @@ -173,7 +173,7 @@ protected void finalize() throws Throwable { } } - abstract static class ReportCallbackImpl implements ReportCallback, SubscriptionEstablishedCallback { + abstract static class ReportCallbackImpl implements ReportCallback, SubscriptionEstablishedCallback, ResubscriptionAttemptCallback { private BaseAttributeCallback callback; private ChipAttributePath path; @@ -231,6 +231,9 @@ public void onSubscriptionEstablished(long subscriptionId) { callback.onSubscriptionEstablished(subscriptionId); } + @Override + public void onResubscriptionAttempt(long terminationCause, long nextResubscribeIntervalMsec) {} + public abstract void onSuccess(byte[] tlv); } @@ -334,6 +337,7 @@ public void subscribeSomeIntegerAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SOME_INTEGER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -385,6 +389,7 @@ public void subscribeFabricsAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.SecondClusterFabricDescriptorStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FABRICS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -410,6 +415,7 @@ public void subscribeSomeBytesAttribute( @Override public void onSuccess(byte[] tlv) { byte[] value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SOME_BYTES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -461,6 +467,7 @@ public void subscribeSomeEnumAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SOME_ENUM_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -495,6 +502,7 @@ public void subscribeOptionsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPTIONS_ATTRIBUTE_ID, minInterval, maxInterval); } diff --git a/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java b/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java index 66ae0a97ce86a6..0844ffee7a1918 100644 --- a/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java +++ b/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java @@ -140,7 +140,7 @@ protected void subscribeAttribute( long attributeId, int minInterval, int maxInterval) { - ReportCallbackJni jniCallback = new ReportCallbackJni(callback, callback, null); + ReportCallbackJni jniCallback = new ReportCallbackJni(callback, callback, callback); ChipAttributePath path = ChipAttributePath.newInstance(endpointId, clusterId, attributeId); ChipInteractionClient.subscribe(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, minInterval, maxInterval, false, true, timeoutMillis.orElse(0L).intValue(), null); } @@ -173,7 +173,7 @@ protected void finalize() throws Throwable { } } - abstract static class ReportCallbackImpl implements ReportCallback, SubscriptionEstablishedCallback { + abstract static class ReportCallbackImpl implements ReportCallback, SubscriptionEstablishedCallback, ResubscriptionAttemptCallback { private BaseAttributeCallback callback; private ChipAttributePath path; @@ -231,6 +231,9 @@ public void onSubscriptionEstablished(long subscriptionId) { callback.onSubscriptionEstablished(subscriptionId); } + @Override + public void onResubscriptionAttempt(long terminationCause, long nextResubscribeIntervalMsec) {} + public abstract void onSuccess(byte[] tlv); } @@ -401,6 +404,7 @@ public void subscribeIdentifyTimeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, IDENTIFY_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -426,6 +430,7 @@ public void subscribeIdentifyTypeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, IDENTIFY_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -451,6 +456,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -476,6 +482,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -501,6 +508,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -526,6 +534,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -551,6 +560,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -576,6 +586,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -854,6 +865,7 @@ public void subscribeNameSupportAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NAME_SUPPORT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -879,6 +891,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -904,6 +917,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -929,6 +943,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -954,6 +969,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -979,6 +995,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1004,6 +1021,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1191,6 +1209,7 @@ public void subscribeOnOffAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ON_OFF_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1216,6 +1235,7 @@ public void subscribeGlobalSceneControlAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GLOBAL_SCENE_CONTROL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1250,6 +1270,7 @@ public void subscribeOnTimeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ON_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1284,6 +1305,7 @@ public void subscribeOffWaitTimeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OFF_WAIT_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1318,6 +1340,7 @@ public void subscribeStartUpOnOffAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, START_UP_ON_OFF_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1343,6 +1366,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1368,6 +1392,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1393,6 +1418,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1418,6 +1444,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1443,6 +1470,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1468,6 +1496,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1532,6 +1561,7 @@ public void subscribeSwitchTypeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SWITCH_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1566,6 +1596,7 @@ public void subscribeSwitchActionsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SWITCH_ACTIONS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1591,6 +1622,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1616,6 +1648,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1641,6 +1674,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1666,6 +1700,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1691,6 +1726,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -1716,6 +1752,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2084,6 +2121,7 @@ public void subscribeCurrentLevelAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2109,6 +2147,7 @@ public void subscribeRemainingTimeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REMAINING_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2134,6 +2173,7 @@ public void subscribeMinLevelAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2159,6 +2199,7 @@ public void subscribeMaxLevelAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2184,6 +2225,7 @@ public void subscribeCurrentFrequencyAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_FREQUENCY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2209,6 +2251,7 @@ public void subscribeMinFrequencyAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_FREQUENCY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2234,6 +2277,7 @@ public void subscribeMaxFrequencyAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_FREQUENCY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2268,6 +2312,7 @@ public void subscribeOptionsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPTIONS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2302,6 +2347,7 @@ public void subscribeOnOffTransitionTimeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ON_OFF_TRANSITION_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2336,6 +2382,7 @@ public void subscribeOnLevelAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ON_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2370,6 +2417,7 @@ public void subscribeOnTransitionTimeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ON_TRANSITION_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2404,6 +2452,7 @@ public void subscribeOffTransitionTimeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OFF_TRANSITION_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2438,6 +2487,7 @@ public void subscribeDefaultMoveRateAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DEFAULT_MOVE_RATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2472,6 +2522,7 @@ public void subscribeStartUpCurrentLevelAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, START_UP_CURRENT_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2497,6 +2548,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2522,6 +2574,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2547,6 +2600,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2572,6 +2626,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2597,6 +2652,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2622,6 +2678,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2702,6 +2759,7 @@ public void subscribeActiveTextAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_TEXT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2736,6 +2794,7 @@ public void subscribeDescriptionAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DESCRIPTION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2770,6 +2829,7 @@ public void subscribeInactiveTextAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INACTIVE_TEXT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2804,6 +2864,7 @@ public void subscribeOutOfServiceAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OUT_OF_SERVICE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2829,6 +2890,7 @@ public void subscribePolarityAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, POLARITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2863,6 +2925,7 @@ public void subscribePresentValueAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRESENT_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2897,6 +2960,7 @@ public void subscribeReliabilityAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RELIABILITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2922,6 +2986,7 @@ public void subscribeStatusFlagsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, STATUS_FLAGS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2947,6 +3012,7 @@ public void subscribeApplicationTypeAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, APPLICATION_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2972,6 +3038,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -2997,6 +3064,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3022,6 +3090,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3047,6 +3116,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3072,6 +3142,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3097,6 +3168,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3159,6 +3231,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3184,6 +3257,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3209,6 +3283,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3234,6 +3309,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3259,6 +3335,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3284,6 +3361,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3371,6 +3449,7 @@ public void subscribeDeviceTypeListAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.DescriptorClusterDeviceTypeStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DEVICE_TYPE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3396,6 +3475,7 @@ public void subscribeServerListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SERVER_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3421,6 +3501,7 @@ public void subscribeClientListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLIENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3446,6 +3527,7 @@ public void subscribePartsListAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PARTS_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3471,6 +3553,7 @@ public void subscribeTagListAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.DescriptorClusterSemanticTagStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TAG_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3496,6 +3579,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3521,6 +3605,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3546,6 +3631,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3571,6 +3657,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3596,6 +3683,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3621,6 +3709,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3702,6 +3791,7 @@ public void subscribeBindingAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.BindingClusterTargetStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BINDING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3727,6 +3817,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3752,6 +3843,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3777,6 +3869,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3802,6 +3895,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3827,6 +3921,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3852,6 +3947,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3941,6 +4037,7 @@ public void subscribeAclAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.AccessControlClusterAccessControlEntryStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -3980,6 +4077,7 @@ public void subscribeExtensionAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.AccessControlClusterAccessControlExtensionStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EXTENSION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4005,6 +4103,7 @@ public void subscribeSubjectsPerAccessControlEntryAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUBJECTS_PER_ACCESS_CONTROL_ENTRY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4030,6 +4129,7 @@ public void subscribeTargetsPerAccessControlEntryAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TARGETS_PER_ACCESS_CONTROL_ENTRY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4055,6 +4155,7 @@ public void subscribeAccessControlEntriesPerFabricAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCESS_CONTROL_ENTRIES_PER_FABRIC_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4080,6 +4181,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4105,6 +4207,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4130,6 +4233,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4155,6 +4259,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4180,6 +4285,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4205,6 +4311,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4586,6 +4693,7 @@ public void subscribeActionListAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ActionsClusterActionStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTION_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4611,6 +4719,7 @@ public void subscribeEndpointListsAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ActionsClusterEndpointListStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ENDPOINT_LISTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4636,6 +4745,7 @@ public void subscribeSetupURLAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SETUP_U_R_L_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4661,6 +4771,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4686,6 +4797,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4711,6 +4823,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4736,6 +4849,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4761,6 +4875,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4786,6 +4901,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4895,6 +5011,7 @@ public void subscribeDataModelRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DATA_MODEL_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4920,6 +5037,7 @@ public void subscribeVendorNameAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, VENDOR_NAME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4945,6 +5063,7 @@ public void subscribeVendorIDAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, VENDOR_I_D_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4970,6 +5089,7 @@ public void subscribeProductNameAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRODUCT_NAME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -4995,6 +5115,7 @@ public void subscribeProductIDAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRODUCT_I_D_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5029,6 +5150,7 @@ public void subscribeNodeLabelAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NODE_LABEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5063,6 +5185,7 @@ public void subscribeLocationAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LOCATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5088,6 +5211,7 @@ public void subscribeHardwareVersionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, HARDWARE_VERSION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5113,6 +5237,7 @@ public void subscribeHardwareVersionStringAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, HARDWARE_VERSION_STRING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5138,6 +5263,7 @@ public void subscribeSoftwareVersionAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SOFTWARE_VERSION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5163,6 +5289,7 @@ public void subscribeSoftwareVersionStringAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SOFTWARE_VERSION_STRING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5188,6 +5315,7 @@ public void subscribeManufacturingDateAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MANUFACTURING_DATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5213,6 +5341,7 @@ public void subscribePartNumberAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PART_NUMBER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5238,6 +5367,7 @@ public void subscribeProductURLAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRODUCT_U_R_L_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5263,6 +5393,7 @@ public void subscribeProductLabelAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRODUCT_LABEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5288,6 +5419,7 @@ public void subscribeSerialNumberAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SERIAL_NUMBER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5322,6 +5454,7 @@ public void subscribeLocalConfigDisabledAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LOCAL_CONFIG_DISABLED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5347,6 +5480,7 @@ public void subscribeReachableAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REACHABLE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5372,6 +5506,7 @@ public void subscribeUniqueIDAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNIQUE_I_D_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5397,6 +5532,7 @@ public void subscribeCapabilityMinimaAttribute( @Override public void onSuccess(byte[] tlv) { ChipStructs.BasicInformationClusterCapabilityMinimaStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CAPABILITY_MINIMA_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5422,6 +5558,7 @@ public void subscribeProductAppearanceAttribute( @Override public void onSuccess(byte[] tlv) { ChipStructs.BasicInformationClusterProductAppearanceStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRODUCT_APPEARANCE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5447,6 +5584,7 @@ public void subscribeSpecificationVersionAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SPECIFICATION_VERSION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5472,6 +5610,7 @@ public void subscribeMaxPathsPerInvokeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_PATHS_PER_INVOKE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5497,6 +5636,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5522,6 +5662,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5547,6 +5688,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5572,6 +5714,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5597,6 +5740,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5622,6 +5766,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5864,6 +6009,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5889,6 +6035,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5914,6 +6061,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5939,6 +6087,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5964,6 +6113,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -5989,6 +6139,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6113,6 +6264,7 @@ public void subscribeDefaultOTAProvidersAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.OtaSoftwareUpdateRequestorClusterProviderLocation> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DEFAULT_O_T_A_PROVIDERS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6138,6 +6290,7 @@ public void subscribeUpdatePossibleAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UPDATE_POSSIBLE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6163,6 +6316,7 @@ public void subscribeUpdateStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UPDATE_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6188,6 +6342,7 @@ public void subscribeUpdateStateProgressAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UPDATE_STATE_PROGRESS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6213,6 +6368,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6238,6 +6394,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6263,6 +6420,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6288,6 +6446,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6313,6 +6472,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6338,6 +6498,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6415,6 +6576,7 @@ public void subscribeActiveLocaleAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_LOCALE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6440,6 +6602,7 @@ public void subscribeSupportedLocalesAttribute( @Override public void onSuccess(byte[] tlv) { List<String> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_LOCALES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6465,6 +6628,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6490,6 +6654,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6515,6 +6680,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6540,6 +6706,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6565,6 +6732,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6590,6 +6758,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6668,6 +6837,7 @@ public void subscribeHourFormatAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, HOUR_FORMAT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6702,6 +6872,7 @@ public void subscribeActiveCalendarTypeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_CALENDAR_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6727,6 +6898,7 @@ public void subscribeSupportedCalendarTypesAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_CALENDAR_TYPES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6752,6 +6924,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6777,6 +6950,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6802,6 +6976,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6827,6 +7002,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6852,6 +7028,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6877,6 +7054,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6949,6 +7127,7 @@ public void subscribeTemperatureUnitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TEMPERATURE_UNIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6974,6 +7153,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -6999,6 +7179,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7024,6 +7205,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7049,6 +7231,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7074,6 +7257,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7099,6 +7283,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7166,6 +7351,7 @@ public void subscribeSourcesAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SOURCES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7191,6 +7377,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7216,6 +7403,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7241,6 +7429,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7266,6 +7455,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7291,6 +7481,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7316,6 +7507,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7458,6 +7650,7 @@ public void subscribeStatusAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, STATUS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7483,6 +7676,7 @@ public void subscribeOrderAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ORDER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7508,6 +7702,7 @@ public void subscribeDescriptionAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DESCRIPTION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7533,6 +7728,7 @@ public void subscribeWiredAssessedInputVoltageAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WIRED_ASSESSED_INPUT_VOLTAGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7558,6 +7754,7 @@ public void subscribeWiredAssessedInputFrequencyAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WIRED_ASSESSED_INPUT_FREQUENCY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7583,6 +7780,7 @@ public void subscribeWiredCurrentTypeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WIRED_CURRENT_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7608,6 +7806,7 @@ public void subscribeWiredAssessedCurrentAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WIRED_ASSESSED_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7633,6 +7832,7 @@ public void subscribeWiredNominalVoltageAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WIRED_NOMINAL_VOLTAGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7658,6 +7858,7 @@ public void subscribeWiredMaximumCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WIRED_MAXIMUM_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7683,6 +7884,7 @@ public void subscribeWiredPresentAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WIRED_PRESENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7708,6 +7910,7 @@ public void subscribeActiveWiredFaultsAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_WIRED_FAULTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7733,6 +7936,7 @@ public void subscribeBatVoltageAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_VOLTAGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7758,6 +7962,7 @@ public void subscribeBatPercentRemainingAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_PERCENT_REMAINING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7783,6 +7988,7 @@ public void subscribeBatTimeRemainingAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_TIME_REMAINING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7808,6 +8014,7 @@ public void subscribeBatChargeLevelAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_CHARGE_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7833,6 +8040,7 @@ public void subscribeBatReplacementNeededAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_REPLACEMENT_NEEDED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7858,6 +8066,7 @@ public void subscribeBatReplaceabilityAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_REPLACEABILITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7883,6 +8092,7 @@ public void subscribeBatPresentAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_PRESENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7908,6 +8118,7 @@ public void subscribeActiveBatFaultsAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_BAT_FAULTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7933,6 +8144,7 @@ public void subscribeBatReplacementDescriptionAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_REPLACEMENT_DESCRIPTION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7958,6 +8170,7 @@ public void subscribeBatCommonDesignationAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_COMMON_DESIGNATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -7983,6 +8196,7 @@ public void subscribeBatANSIDesignationAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_A_N_S_I_DESIGNATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8008,6 +8222,7 @@ public void subscribeBatIECDesignationAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_I_E_C_DESIGNATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8033,6 +8248,7 @@ public void subscribeBatApprovedChemistryAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_APPROVED_CHEMISTRY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8058,6 +8274,7 @@ public void subscribeBatCapacityAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_CAPACITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8083,6 +8300,7 @@ public void subscribeBatQuantityAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_QUANTITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8108,6 +8326,7 @@ public void subscribeBatChargeStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_CHARGE_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8133,6 +8352,7 @@ public void subscribeBatTimeToFullChargeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_TIME_TO_FULL_CHARGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8158,6 +8378,7 @@ public void subscribeBatFunctionalWhileChargingAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_FUNCTIONAL_WHILE_CHARGING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8183,6 +8404,7 @@ public void subscribeBatChargingCurrentAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BAT_CHARGING_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8208,6 +8430,7 @@ public void subscribeActiveBatChargeFaultsAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_BAT_CHARGE_FAULTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8233,6 +8456,7 @@ public void subscribeEndpointListAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ENDPOINT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8258,6 +8482,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8283,6 +8508,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8308,6 +8534,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8333,6 +8560,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8358,6 +8586,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8383,6 +8612,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8594,6 +8824,7 @@ public void subscribeBreadcrumbAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BREADCRUMB_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8619,6 +8850,7 @@ public void subscribeBasicCommissioningInfoAttribute( @Override public void onSuccess(byte[] tlv) { ChipStructs.GeneralCommissioningClusterBasicCommissioningInfo value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BASIC_COMMISSIONING_INFO_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8644,6 +8876,7 @@ public void subscribeRegulatoryConfigAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REGULATORY_CONFIG_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8669,6 +8902,7 @@ public void subscribeLocationCapabilityAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LOCATION_CAPABILITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8694,6 +8928,7 @@ public void subscribeSupportsConcurrentConnectionAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTS_CONCURRENT_CONNECTION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8719,6 +8954,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8744,6 +8980,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8769,6 +9006,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8794,6 +9032,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8819,6 +9058,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -8844,6 +9084,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9365,6 +9606,7 @@ public void subscribeMaxNetworksAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_NETWORKS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9390,6 +9632,7 @@ public void subscribeNetworksAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.NetworkCommissioningClusterNetworkInfoStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NETWORKS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9415,6 +9658,7 @@ public void subscribeScanMaxTimeSecondsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SCAN_MAX_TIME_SECONDS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9440,6 +9684,7 @@ public void subscribeConnectMaxTimeSecondsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CONNECT_MAX_TIME_SECONDS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9474,6 +9719,7 @@ public void subscribeInterfaceEnabledAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INTERFACE_ENABLED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9499,6 +9745,7 @@ public void subscribeLastNetworkingStatusAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LAST_NETWORKING_STATUS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9524,6 +9771,7 @@ public void subscribeLastNetworkIDAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable byte[] value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LAST_NETWORK_I_D_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9549,6 +9797,7 @@ public void subscribeLastConnectErrorValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LAST_CONNECT_ERROR_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9574,6 +9823,7 @@ public void subscribeSupportedWiFiBandsAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_WI_FI_BANDS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9599,6 +9849,7 @@ public void subscribeSupportedThreadFeaturesAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_THREAD_FEATURES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9624,6 +9875,7 @@ public void subscribeThreadVersionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, THREAD_VERSION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9649,6 +9901,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9674,6 +9927,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9699,6 +9953,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9724,6 +9979,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9749,6 +10005,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9774,6 +10031,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9899,6 +10157,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9924,6 +10183,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9949,6 +10209,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9974,6 +10235,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -9999,6 +10261,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10024,6 +10287,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10214,6 +10478,7 @@ public void subscribeNetworkInterfacesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.GeneralDiagnosticsClusterNetworkInterface> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NETWORK_INTERFACES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10239,6 +10504,7 @@ public void subscribeRebootCountAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REBOOT_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10264,6 +10530,7 @@ public void subscribeUpTimeAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UP_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10289,6 +10556,7 @@ public void subscribeTotalOperationalHoursAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TOTAL_OPERATIONAL_HOURS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10314,6 +10582,7 @@ public void subscribeBootReasonAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BOOT_REASON_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10339,6 +10608,7 @@ public void subscribeActiveHardwareFaultsAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_HARDWARE_FAULTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10364,6 +10634,7 @@ public void subscribeActiveRadioFaultsAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_RADIO_FAULTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10389,6 +10660,7 @@ public void subscribeActiveNetworkFaultsAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_NETWORK_FAULTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10414,6 +10686,7 @@ public void subscribeTestEventTriggersEnabledAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TEST_EVENT_TRIGGERS_ENABLED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10439,6 +10712,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10464,6 +10738,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10489,6 +10764,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10514,6 +10790,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10539,6 +10816,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10564,6 +10842,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10650,6 +10929,7 @@ public void subscribeThreadMetricsAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.SoftwareDiagnosticsClusterThreadMetricsStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, THREAD_METRICS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10675,6 +10955,7 @@ public void subscribeCurrentHeapFreeAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_HEAP_FREE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10700,6 +10981,7 @@ public void subscribeCurrentHeapUsedAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_HEAP_USED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10725,6 +11007,7 @@ public void subscribeCurrentHeapHighWatermarkAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_HEAP_HIGH_WATERMARK_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10750,6 +11033,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10775,6 +11059,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10800,6 +11085,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10825,6 +11111,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10850,6 +11137,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -10875,6 +11163,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11096,6 +11385,7 @@ public void subscribeChannelAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CHANNEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11121,6 +11411,7 @@ public void subscribeRoutingRoleAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ROUTING_ROLE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11146,6 +11437,7 @@ public void subscribeNetworkNameAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NETWORK_NAME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11171,6 +11463,7 @@ public void subscribePanIdAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PAN_ID_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11196,6 +11489,7 @@ public void subscribeExtendedPanIdAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EXTENDED_PAN_ID_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11221,6 +11515,7 @@ public void subscribeMeshLocalPrefixAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable byte[] value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MESH_LOCAL_PREFIX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11246,6 +11541,7 @@ public void subscribeOverrunCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OVERRUN_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11271,6 +11567,7 @@ public void subscribeNeighborTableAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ThreadNetworkDiagnosticsClusterNeighborTableStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NEIGHBOR_TABLE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11296,6 +11593,7 @@ public void subscribeRouteTableAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ThreadNetworkDiagnosticsClusterRouteTableStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ROUTE_TABLE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11321,6 +11619,7 @@ public void subscribePartitionIdAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PARTITION_ID_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11346,6 +11645,7 @@ public void subscribeWeightingAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WEIGHTING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11371,6 +11671,7 @@ public void subscribeDataVersionAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DATA_VERSION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11396,6 +11697,7 @@ public void subscribeStableDataVersionAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, STABLE_DATA_VERSION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11421,6 +11723,7 @@ public void subscribeLeaderRouterIdAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LEADER_ROUTER_ID_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11446,6 +11749,7 @@ public void subscribeDetachedRoleCountAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DETACHED_ROLE_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11471,6 +11775,7 @@ public void subscribeChildRoleCountAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CHILD_ROLE_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11496,6 +11801,7 @@ public void subscribeRouterRoleCountAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ROUTER_ROLE_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11521,6 +11827,7 @@ public void subscribeLeaderRoleCountAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LEADER_ROLE_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11546,6 +11853,7 @@ public void subscribeAttachAttemptCountAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTACH_ATTEMPT_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11571,6 +11879,7 @@ public void subscribePartitionIdChangeCountAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PARTITION_ID_CHANGE_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11596,6 +11905,7 @@ public void subscribeBetterPartitionAttachAttemptCountAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BETTER_PARTITION_ATTACH_ATTEMPT_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11621,6 +11931,7 @@ public void subscribeParentChangeCountAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PARENT_CHANGE_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11646,6 +11957,7 @@ public void subscribeTxTotalCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_TOTAL_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11671,6 +11983,7 @@ public void subscribeTxUnicastCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_UNICAST_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11696,6 +12009,7 @@ public void subscribeTxBroadcastCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_BROADCAST_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11721,6 +12035,7 @@ public void subscribeTxAckRequestedCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_ACK_REQUESTED_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11746,6 +12061,7 @@ public void subscribeTxAckedCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_ACKED_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11771,6 +12087,7 @@ public void subscribeTxNoAckRequestedCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_NO_ACK_REQUESTED_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11796,6 +12113,7 @@ public void subscribeTxDataCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_DATA_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11821,6 +12139,7 @@ public void subscribeTxDataPollCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_DATA_POLL_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11846,6 +12165,7 @@ public void subscribeTxBeaconCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_BEACON_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11871,6 +12191,7 @@ public void subscribeTxBeaconRequestCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_BEACON_REQUEST_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11896,6 +12217,7 @@ public void subscribeTxOtherCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_OTHER_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11921,6 +12243,7 @@ public void subscribeTxRetryCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_RETRY_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11946,6 +12269,7 @@ public void subscribeTxDirectMaxRetryExpiryCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_DIRECT_MAX_RETRY_EXPIRY_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11971,6 +12295,7 @@ public void subscribeTxIndirectMaxRetryExpiryCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_INDIRECT_MAX_RETRY_EXPIRY_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -11996,6 +12321,7 @@ public void subscribeTxErrCcaCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_ERR_CCA_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12021,6 +12347,7 @@ public void subscribeTxErrAbortCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_ERR_ABORT_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12046,6 +12373,7 @@ public void subscribeTxErrBusyChannelCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_ERR_BUSY_CHANNEL_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12071,6 +12399,7 @@ public void subscribeRxTotalCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_TOTAL_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12096,6 +12425,7 @@ public void subscribeRxUnicastCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_UNICAST_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12121,6 +12451,7 @@ public void subscribeRxBroadcastCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_BROADCAST_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12146,6 +12477,7 @@ public void subscribeRxDataCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_DATA_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12171,6 +12503,7 @@ public void subscribeRxDataPollCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_DATA_POLL_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12196,6 +12529,7 @@ public void subscribeRxBeaconCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_BEACON_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12221,6 +12555,7 @@ public void subscribeRxBeaconRequestCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_BEACON_REQUEST_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12246,6 +12581,7 @@ public void subscribeRxOtherCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_OTHER_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12271,6 +12607,7 @@ public void subscribeRxAddressFilteredCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_ADDRESS_FILTERED_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12296,6 +12633,7 @@ public void subscribeRxDestAddrFilteredCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_DEST_ADDR_FILTERED_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12321,6 +12659,7 @@ public void subscribeRxDuplicatedCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_DUPLICATED_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12346,6 +12685,7 @@ public void subscribeRxErrNoFrameCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_ERR_NO_FRAME_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12371,6 +12711,7 @@ public void subscribeRxErrUnknownNeighborCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_ERR_UNKNOWN_NEIGHBOR_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12396,6 +12737,7 @@ public void subscribeRxErrInvalidSrcAddrCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_ERR_INVALID_SRC_ADDR_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12421,6 +12763,7 @@ public void subscribeRxErrSecCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_ERR_SEC_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12446,6 +12789,7 @@ public void subscribeRxErrFcsCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_ERR_FCS_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12471,6 +12815,7 @@ public void subscribeRxErrOtherCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RX_ERR_OTHER_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12496,6 +12841,7 @@ public void subscribeActiveTimestampAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_TIMESTAMP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12521,6 +12867,7 @@ public void subscribePendingTimestampAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PENDING_TIMESTAMP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12546,6 +12893,7 @@ public void subscribeDelayAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DELAY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12571,6 +12919,7 @@ public void subscribeSecurityPolicyAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.ThreadNetworkDiagnosticsClusterSecurityPolicy value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SECURITY_POLICY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12596,6 +12945,7 @@ public void subscribeChannelPage0MaskAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable byte[] value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CHANNEL_PAGE0_MASK_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12621,6 +12971,7 @@ public void subscribeOperationalDatasetComponentsAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.ThreadNetworkDiagnosticsClusterOperationalDatasetComponents value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPERATIONAL_DATASET_COMPONENTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12646,6 +12997,7 @@ public void subscribeActiveNetworkFaultsListAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_NETWORK_FAULTS_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12671,6 +13023,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12696,6 +13049,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12721,6 +13075,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12746,6 +13101,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12771,6 +13127,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12796,6 +13153,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12939,6 +13297,7 @@ public void subscribeBssidAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable byte[] value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BSSID_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12964,6 +13323,7 @@ public void subscribeSecurityTypeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SECURITY_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -12989,6 +13349,7 @@ public void subscribeWiFiVersionAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WI_FI_VERSION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13014,6 +13375,7 @@ public void subscribeChannelNumberAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CHANNEL_NUMBER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13039,6 +13401,7 @@ public void subscribeRssiAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RSSI_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13064,6 +13427,7 @@ public void subscribeBeaconLostCountAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BEACON_LOST_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13089,6 +13453,7 @@ public void subscribeBeaconRxCountAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BEACON_RX_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13114,6 +13479,7 @@ public void subscribePacketMulticastRxCountAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PACKET_MULTICAST_RX_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13139,6 +13505,7 @@ public void subscribePacketMulticastTxCountAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PACKET_MULTICAST_TX_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13164,6 +13531,7 @@ public void subscribePacketUnicastRxCountAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PACKET_UNICAST_RX_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13189,6 +13557,7 @@ public void subscribePacketUnicastTxCountAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PACKET_UNICAST_TX_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13214,6 +13583,7 @@ public void subscribeCurrentMaxRateAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_MAX_RATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13239,6 +13609,7 @@ public void subscribeOverrunCountAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OVERRUN_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13264,6 +13635,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13289,6 +13661,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13314,6 +13687,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13339,6 +13713,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13364,6 +13739,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13389,6 +13765,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13488,6 +13865,7 @@ public void subscribePHYRateAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, P_H_Y_RATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13513,6 +13891,7 @@ public void subscribeFullDuplexAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FULL_DUPLEX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13538,6 +13917,7 @@ public void subscribePacketRxCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PACKET_RX_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13563,6 +13943,7 @@ public void subscribePacketTxCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PACKET_TX_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13588,6 +13969,7 @@ public void subscribeTxErrCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TX_ERR_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13613,6 +13995,7 @@ public void subscribeCollisionCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLLISION_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13638,6 +14021,7 @@ public void subscribeOverrunCountAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OVERRUN_COUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13663,6 +14047,7 @@ public void subscribeCarrierDetectAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CARRIER_DETECT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13688,6 +14073,7 @@ public void subscribeTimeSinceResetAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TIME_SINCE_RESET_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13713,6 +14099,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13738,6 +14125,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13763,6 +14151,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13788,6 +14177,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13813,6 +14203,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -13838,6 +14229,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14059,6 +14451,7 @@ public void subscribeUTCTimeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, U_T_C_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14084,6 +14477,7 @@ public void subscribeGranularityAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GRANULARITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14109,6 +14503,7 @@ public void subscribeTimeSourceAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TIME_SOURCE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14134,6 +14529,7 @@ public void subscribeTrustedTimeSourceAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.TimeSynchronizationClusterTrustedTimeSourceStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TRUSTED_TIME_SOURCE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14159,6 +14555,7 @@ public void subscribeDefaultNTPAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DEFAULT_N_T_P_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14184,6 +14581,7 @@ public void subscribeTimeZoneAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.TimeSynchronizationClusterTimeZoneStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TIME_ZONE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14209,6 +14607,7 @@ public void subscribeDSTOffsetAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.TimeSynchronizationClusterDSTOffsetStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, D_S_T_OFFSET_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14234,6 +14633,7 @@ public void subscribeLocalTimeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LOCAL_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14259,6 +14659,7 @@ public void subscribeTimeZoneDatabaseAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TIME_ZONE_DATABASE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14284,6 +14685,7 @@ public void subscribeNTPServerAvailableAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, N_T_P_SERVER_AVAILABLE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14309,6 +14711,7 @@ public void subscribeTimeZoneListMaxSizeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TIME_ZONE_LIST_MAX_SIZE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14334,6 +14737,7 @@ public void subscribeDSTOffsetListMaxSizeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, D_S_T_OFFSET_LIST_MAX_SIZE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14359,6 +14763,7 @@ public void subscribeSupportsDNSResolveAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTS_D_N_S_RESOLVE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14384,6 +14789,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14409,6 +14815,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14434,6 +14841,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14459,6 +14867,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14484,6 +14893,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14509,6 +14919,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14591,6 +15002,7 @@ public void subscribeVendorNameAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, VENDOR_NAME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14616,6 +15028,7 @@ public void subscribeVendorIDAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, VENDOR_I_D_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14641,6 +15054,7 @@ public void subscribeProductNameAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRODUCT_NAME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14675,6 +15089,7 @@ public void subscribeNodeLabelAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NODE_LABEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14700,6 +15115,7 @@ public void subscribeHardwareVersionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, HARDWARE_VERSION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14725,6 +15141,7 @@ public void subscribeHardwareVersionStringAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, HARDWARE_VERSION_STRING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14750,6 +15167,7 @@ public void subscribeSoftwareVersionAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SOFTWARE_VERSION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14775,6 +15193,7 @@ public void subscribeSoftwareVersionStringAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SOFTWARE_VERSION_STRING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14800,6 +15219,7 @@ public void subscribeManufacturingDateAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MANUFACTURING_DATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14825,6 +15245,7 @@ public void subscribePartNumberAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PART_NUMBER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14850,6 +15271,7 @@ public void subscribeProductURLAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRODUCT_U_R_L_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14875,6 +15297,7 @@ public void subscribeProductLabelAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRODUCT_LABEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14900,6 +15323,7 @@ public void subscribeSerialNumberAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SERIAL_NUMBER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14925,6 +15349,7 @@ public void subscribeReachableAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REACHABLE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14950,6 +15375,7 @@ public void subscribeUniqueIDAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNIQUE_I_D_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -14975,6 +15401,7 @@ public void subscribeProductAppearanceAttribute( @Override public void onSuccess(byte[] tlv) { ChipStructs.BridgedDeviceBasicInformationClusterProductAppearanceStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRODUCT_APPEARANCE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15000,6 +15427,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15025,6 +15453,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15050,6 +15479,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15075,6 +15505,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15100,6 +15531,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15125,6 +15557,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15190,6 +15623,7 @@ public void subscribeNumberOfPositionsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_POSITIONS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15215,6 +15649,7 @@ public void subscribeCurrentPositionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_POSITION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15240,6 +15675,7 @@ public void subscribeMultiPressMaxAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MULTI_PRESS_MAX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15265,6 +15701,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15290,6 +15727,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15315,6 +15753,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15340,6 +15779,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15365,6 +15805,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15390,6 +15831,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15526,6 +15968,7 @@ public void subscribeWindowStatusAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WINDOW_STATUS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15551,6 +15994,7 @@ public void subscribeAdminFabricIndexAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ADMIN_FABRIC_INDEX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15576,6 +16020,7 @@ public void subscribeAdminVendorIdAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ADMIN_VENDOR_ID_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15601,6 +16046,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15626,6 +16072,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15651,6 +16098,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15676,6 +16124,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15701,6 +16150,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -15726,6 +16176,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16151,6 +16602,7 @@ public void subscribeNOCsAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.OperationalCredentialsClusterNOCStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, N_O_CS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16181,6 +16633,7 @@ public void subscribeFabricsAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.OperationalCredentialsClusterFabricDescriptorStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FABRICS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16206,6 +16659,7 @@ public void subscribeSupportedFabricsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_FABRICS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16231,6 +16685,7 @@ public void subscribeCommissionedFabricsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COMMISSIONED_FABRICS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16256,6 +16711,7 @@ public void subscribeTrustedRootCertificatesAttribute( @Override public void onSuccess(byte[] tlv) { List<byte[]> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TRUSTED_ROOT_CERTIFICATES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16281,6 +16737,7 @@ public void subscribeCurrentFabricIndexAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_FABRIC_INDEX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16306,6 +16763,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16331,6 +16789,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16356,6 +16815,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16381,6 +16841,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16406,6 +16867,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16431,6 +16893,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16623,6 +17086,7 @@ public void subscribeGroupKeyMapAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.GroupKeyManagementClusterGroupKeyMapStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GROUP_KEY_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16653,6 +17117,7 @@ public void subscribeGroupTableAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.GroupKeyManagementClusterGroupInfoMapStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GROUP_TABLE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16678,6 +17143,7 @@ public void subscribeMaxGroupsPerFabricAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_GROUPS_PER_FABRIC_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16703,6 +17169,7 @@ public void subscribeMaxGroupKeysPerFabricAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_GROUP_KEYS_PER_FABRIC_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16728,6 +17195,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16753,6 +17221,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16778,6 +17247,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16803,6 +17273,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16828,6 +17299,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16853,6 +17325,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16920,6 +17393,7 @@ public void subscribeLabelListAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.FixedLabelClusterLabelStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LABEL_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16945,6 +17419,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16970,6 +17445,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -16995,6 +17471,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17020,6 +17497,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17045,6 +17523,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17070,6 +17549,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17146,6 +17626,7 @@ public void subscribeLabelListAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.UserLabelClusterLabelStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LABEL_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17171,6 +17652,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17196,6 +17678,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17221,6 +17704,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17246,6 +17730,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17271,6 +17756,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17296,6 +17782,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17358,6 +17845,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17383,6 +17871,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17408,6 +17897,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17433,6 +17923,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17458,6 +17949,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17483,6 +17975,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17545,6 +18038,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17570,6 +18064,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17595,6 +18090,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17620,6 +18116,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17645,6 +18142,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17670,6 +18168,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17732,6 +18231,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17757,6 +18257,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17782,6 +18283,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17807,6 +18309,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17832,6 +18335,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17857,6 +18361,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17920,6 +18425,7 @@ public void subscribeStateValueAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, STATE_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17945,6 +18451,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17970,6 +18477,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -17995,6 +18503,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18020,6 +18529,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18045,6 +18555,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18070,6 +18581,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18249,6 +18761,7 @@ public void subscribeIdleModeDurationAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, IDLE_MODE_DURATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18274,6 +18787,7 @@ public void subscribeActiveModeDurationAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_MODE_DURATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18299,6 +18813,7 @@ public void subscribeActiveModeThresholdAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_MODE_THRESHOLD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18329,6 +18844,7 @@ public void subscribeRegisteredClientsAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.IcdManagementClusterMonitoringRegistrationStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REGISTERED_CLIENTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18354,6 +18870,7 @@ public void subscribeICDCounterAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, I_C_D_COUNTER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18379,6 +18896,7 @@ public void subscribeClientsSupportedPerFabricAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLIENTS_SUPPORTED_PER_FABRIC_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18404,6 +18922,7 @@ public void subscribeUserActiveModeTriggerHintAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, USER_ACTIVE_MODE_TRIGGER_HINT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18429,6 +18948,7 @@ public void subscribeUserActiveModeTriggerInstructionAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, USER_ACTIVE_MODE_TRIGGER_INSTRUCTION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18454,6 +18974,7 @@ public void subscribeOperatingModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPERATING_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18479,6 +19000,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18504,6 +19026,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18529,6 +19052,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18554,6 +19078,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18579,6 +19104,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18604,6 +19130,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18745,6 +19272,7 @@ public void subscribeSetTimeAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SET_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18770,6 +19298,7 @@ public void subscribeTimeRemainingAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TIME_REMAINING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18795,6 +19324,7 @@ public void subscribeTimerStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TIMER_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18820,6 +19350,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18845,6 +19376,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18870,6 +19402,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18895,6 +19428,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18920,6 +19454,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -18945,6 +19480,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19141,6 +19677,7 @@ public void subscribePhaseListAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable List<String> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PHASE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19166,6 +19703,7 @@ public void subscribeCurrentPhaseAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_PHASE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19191,6 +19729,7 @@ public void subscribeCountdownTimeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COUNTDOWN_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19216,6 +19755,7 @@ public void subscribeOperationalStateListAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.OvenCavityOperationalStateClusterOperationalStateStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPERATIONAL_STATE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19241,6 +19781,7 @@ public void subscribeOperationalStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPERATIONAL_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19266,6 +19807,7 @@ public void subscribeOperationalErrorAttribute( @Override public void onSuccess(byte[] tlv) { ChipStructs.OvenCavityOperationalStateClusterErrorStateStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPERATIONAL_ERROR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19291,6 +19833,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19316,6 +19859,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19341,6 +19885,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19366,6 +19911,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19391,6 +19937,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19416,6 +19963,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19535,6 +20083,7 @@ public void subscribeSupportedModesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.OvenModeClusterModeOptionStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_MODES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19560,6 +20109,7 @@ public void subscribeCurrentModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19594,6 +20144,7 @@ public void subscribeStartUpModeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, START_UP_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19628,6 +20179,7 @@ public void subscribeOnModeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ON_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19653,6 +20205,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19678,6 +20231,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19703,6 +20257,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19728,6 +20283,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19753,6 +20309,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19778,6 +20335,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19850,6 +20408,7 @@ public void subscribeSupportedDrynessLevelsAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_DRYNESS_LEVELS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19884,6 +20443,7 @@ public void subscribeSelectedDrynessLevelAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SELECTED_DRYNESS_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19909,6 +20469,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19934,6 +20495,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19959,6 +20521,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -19984,6 +20547,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20009,6 +20573,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20034,6 +20599,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20138,6 +20704,7 @@ public void subscribeDescriptionAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DESCRIPTION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20163,6 +20730,7 @@ public void subscribeStandardNamespaceAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, STANDARD_NAMESPACE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20188,6 +20756,7 @@ public void subscribeSupportedModesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ModeSelectClusterModeOptionStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_MODES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20213,6 +20782,7 @@ public void subscribeCurrentModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20247,6 +20817,7 @@ public void subscribeStartUpModeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, START_UP_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20281,6 +20852,7 @@ public void subscribeOnModeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ON_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20306,6 +20878,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20331,6 +20904,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20356,6 +20930,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20381,6 +20956,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20406,6 +20982,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20431,6 +21008,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20550,6 +21128,7 @@ public void subscribeSupportedModesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.LaundryWasherModeClusterModeOptionStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_MODES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20575,6 +21154,7 @@ public void subscribeCurrentModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20609,6 +21189,7 @@ public void subscribeStartUpModeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, START_UP_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20643,6 +21224,7 @@ public void subscribeOnModeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ON_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20668,6 +21250,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20693,6 +21276,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20718,6 +21302,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20743,6 +21328,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20768,6 +21354,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20793,6 +21380,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20912,6 +21500,7 @@ public void subscribeSupportedModesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.RefrigeratorAndTemperatureControlledCabinetModeClusterModeOptionStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_MODES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20937,6 +21526,7 @@ public void subscribeCurrentModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -20971,6 +21561,7 @@ public void subscribeStartUpModeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, START_UP_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21005,6 +21596,7 @@ public void subscribeOnModeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ON_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21030,6 +21622,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21055,6 +21648,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21080,6 +21674,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21105,6 +21700,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21130,6 +21726,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21155,6 +21752,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21233,6 +21831,7 @@ public void subscribeSpinSpeedsAttribute( @Override public void onSuccess(byte[] tlv) { List<String> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SPIN_SPEEDS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21267,6 +21866,7 @@ public void subscribeSpinSpeedCurrentAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SPIN_SPEED_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21301,6 +21901,7 @@ public void subscribeNumberOfRinsesAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_RINSES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21326,6 +21927,7 @@ public void subscribeSupportedRinsesAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_RINSES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21351,6 +21953,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21376,6 +21979,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21401,6 +22005,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21426,6 +22031,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21451,6 +22057,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21476,6 +22083,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21585,6 +22193,7 @@ public void subscribeSupportedModesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.RvcRunModeClusterModeOptionStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_MODES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21610,6 +22219,7 @@ public void subscribeCurrentModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21635,6 +22245,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21660,6 +22271,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21685,6 +22297,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21710,6 +22323,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21735,6 +22349,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21760,6 +22375,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21869,6 +22485,7 @@ public void subscribeSupportedModesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.RvcCleanModeClusterModeOptionStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_MODES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21894,6 +22511,7 @@ public void subscribeCurrentModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21919,6 +22537,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21944,6 +22563,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21969,6 +22589,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -21994,6 +22615,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22019,6 +22641,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22044,6 +22667,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22140,6 +22764,7 @@ public void subscribeTemperatureSetpointAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TEMPERATURE_SETPOINT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22165,6 +22790,7 @@ public void subscribeMinTemperatureAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_TEMPERATURE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22190,6 +22816,7 @@ public void subscribeMaxTemperatureAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_TEMPERATURE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22215,6 +22842,7 @@ public void subscribeStepAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, STEP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22240,6 +22868,7 @@ public void subscribeSelectedTemperatureLevelAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SELECTED_TEMPERATURE_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22265,6 +22894,7 @@ public void subscribeSupportedTemperatureLevelsAttribute( @Override public void onSuccess(byte[] tlv) { List<String> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_TEMPERATURE_LEVELS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22290,6 +22920,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22315,6 +22946,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22340,6 +22972,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22365,6 +22998,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22390,6 +23024,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22415,6 +23050,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22480,6 +23116,7 @@ public void subscribeMaskAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MASK_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22505,6 +23142,7 @@ public void subscribeStateAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22530,6 +23168,7 @@ public void subscribeSupportedAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22555,6 +23194,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22580,6 +23220,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22605,6 +23246,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22630,6 +23272,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22655,6 +23298,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22680,6 +23324,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22799,6 +23444,7 @@ public void subscribeSupportedModesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.DishwasherModeClusterModeOptionStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_MODES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22824,6 +23470,7 @@ public void subscribeCurrentModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22858,6 +23505,7 @@ public void subscribeStartUpModeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, START_UP_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22892,6 +23540,7 @@ public void subscribeOnModeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ON_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22917,6 +23566,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22942,6 +23592,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22967,6 +23618,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -22992,6 +23644,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23017,6 +23670,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23042,6 +23696,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23105,6 +23760,7 @@ public void subscribeAirQualityAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AIR_QUALITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23130,6 +23786,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23155,6 +23812,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23180,6 +23838,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23205,6 +23864,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23230,6 +23890,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23255,6 +23916,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23346,6 +24008,7 @@ public void subscribeExpressedStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EXPRESSED_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23371,6 +24034,7 @@ public void subscribeSmokeStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SMOKE_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23396,6 +24060,7 @@ public void subscribeCOStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, C_O_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23421,6 +24086,7 @@ public void subscribeBatteryAlertAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BATTERY_ALERT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23446,6 +24112,7 @@ public void subscribeDeviceMutedAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DEVICE_MUTED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23471,6 +24138,7 @@ public void subscribeTestInProgressAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TEST_IN_PROGRESS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23496,6 +24164,7 @@ public void subscribeHardwareFaultAlertAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, HARDWARE_FAULT_ALERT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23521,6 +24190,7 @@ public void subscribeEndOfServiceAlertAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, END_OF_SERVICE_ALERT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23546,6 +24216,7 @@ public void subscribeInterconnectSmokeAlarmAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INTERCONNECT_SMOKE_ALARM_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23571,6 +24242,7 @@ public void subscribeInterconnectCOAlarmAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INTERCONNECT_C_O_ALARM_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23596,6 +24268,7 @@ public void subscribeContaminationStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CONTAMINATION_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23630,6 +24303,7 @@ public void subscribeSmokeSensitivityLevelAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SMOKE_SENSITIVITY_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23655,6 +24329,7 @@ public void subscribeExpiryDateAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EXPIRY_DATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23680,6 +24355,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23705,6 +24381,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23730,6 +24407,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23755,6 +24433,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23780,6 +24459,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23805,6 +24485,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23911,6 +24592,7 @@ public void subscribeMaskAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MASK_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23936,6 +24618,7 @@ public void subscribeLatchAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LATCH_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23961,6 +24644,7 @@ public void subscribeStateAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -23986,6 +24670,7 @@ public void subscribeSupportedAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24011,6 +24696,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24036,6 +24722,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24061,6 +24748,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24086,6 +24774,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24111,6 +24800,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24136,6 +24826,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24204,6 +24895,7 @@ public void subscribeSupportedModesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.MicrowaveOvenModeClusterModeOptionStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_MODES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24229,6 +24921,7 @@ public void subscribeCurrentModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24254,6 +24947,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24279,6 +24973,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24304,6 +24999,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24329,6 +25025,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24354,6 +25051,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24379,6 +25077,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24510,6 +25209,7 @@ public void subscribeCookTimeAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COOK_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24535,6 +25235,7 @@ public void subscribeMaxCookTimeAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_COOK_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24560,6 +25261,7 @@ public void subscribePowerSettingAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, POWER_SETTING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24585,6 +25287,7 @@ public void subscribeMinPowerAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24610,6 +25313,7 @@ public void subscribeMaxPowerAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24635,6 +25339,7 @@ public void subscribePowerStepAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, POWER_STEP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24660,6 +25365,7 @@ public void subscribeSupportedWattsAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_WATTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24685,6 +25391,7 @@ public void subscribeSelectedWattIndexAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SELECTED_WATT_INDEX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24710,6 +25417,7 @@ public void subscribeWattRatingAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WATT_RATING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24735,6 +25443,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24760,6 +25469,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24785,6 +25495,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24810,6 +25521,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24835,6 +25547,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -24860,6 +25573,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25056,6 +25770,7 @@ public void subscribePhaseListAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable List<String> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PHASE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25081,6 +25796,7 @@ public void subscribeCurrentPhaseAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_PHASE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25106,6 +25822,7 @@ public void subscribeCountdownTimeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COUNTDOWN_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25131,6 +25848,7 @@ public void subscribeOperationalStateListAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.OperationalStateClusterOperationalStateStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPERATIONAL_STATE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25156,6 +25874,7 @@ public void subscribeOperationalStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPERATIONAL_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25181,6 +25900,7 @@ public void subscribeOperationalErrorAttribute( @Override public void onSuccess(byte[] tlv) { ChipStructs.OperationalStateClusterErrorStateStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPERATIONAL_ERROR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25206,6 +25926,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25231,6 +25952,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25256,6 +25978,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25281,6 +26004,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25306,6 +26030,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25331,6 +26056,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25501,6 +26227,7 @@ public void subscribePhaseListAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable List<String> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PHASE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25526,6 +26253,7 @@ public void subscribeCurrentPhaseAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_PHASE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25551,6 +26279,7 @@ public void subscribeCountdownTimeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COUNTDOWN_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25576,6 +26305,7 @@ public void subscribeOperationalStateListAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.RvcOperationalStateClusterOperationalStateStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPERATIONAL_STATE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25601,6 +26331,7 @@ public void subscribeOperationalStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPERATIONAL_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25626,6 +26357,7 @@ public void subscribeOperationalErrorAttribute( @Override public void onSuccess(byte[] tlv) { ChipStructs.RvcOperationalStateClusterErrorStateStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPERATIONAL_ERROR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25651,6 +26383,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25676,6 +26409,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25701,6 +26435,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25726,6 +26461,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25751,6 +26487,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -25776,6 +26513,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26278,6 +27016,7 @@ public void subscribeLastConfiguredByAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LAST_CONFIGURED_BY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26303,6 +27042,7 @@ public void subscribeSceneTableSizeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SCENE_TABLE_SIZE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26333,6 +27073,7 @@ public void subscribeFabricSceneInfoAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ScenesManagementClusterSceneInfoStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FABRIC_SCENE_INFO_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26358,6 +27099,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26383,6 +27125,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26408,6 +27151,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26433,6 +27177,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26458,6 +27203,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26483,6 +27229,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26575,6 +27322,7 @@ public void subscribeConditionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CONDITION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26600,6 +27348,7 @@ public void subscribeDegradationDirectionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DEGRADATION_DIRECTION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26625,6 +27374,7 @@ public void subscribeChangeIndicationAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CHANGE_INDICATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26650,6 +27400,7 @@ public void subscribeInPlaceIndicatorAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, IN_PLACE_INDICATOR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26684,6 +27435,7 @@ public void subscribeLastChangedTimeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LAST_CHANGED_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26709,6 +27461,7 @@ public void subscribeReplacementProductListAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.HepaFilterMonitoringClusterReplacementProductStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REPLACEMENT_PRODUCT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26734,6 +27487,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26759,6 +27513,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26784,6 +27539,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26809,6 +27565,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26834,6 +27591,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26859,6 +27617,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26951,6 +27710,7 @@ public void subscribeConditionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CONDITION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -26976,6 +27736,7 @@ public void subscribeDegradationDirectionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DEGRADATION_DIRECTION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27001,6 +27762,7 @@ public void subscribeChangeIndicationAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CHANGE_INDICATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27026,6 +27788,7 @@ public void subscribeInPlaceIndicatorAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, IN_PLACE_INDICATOR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27060,6 +27823,7 @@ public void subscribeLastChangedTimeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LAST_CHANGED_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27085,6 +27849,7 @@ public void subscribeReplacementProductListAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ActivatedCarbonFilterMonitoringClusterReplacementProductStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REPLACEMENT_PRODUCT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27110,6 +27875,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27135,6 +27901,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27160,6 +27927,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27185,6 +27953,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27210,6 +27979,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27235,6 +28005,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27354,6 +28125,7 @@ public void subscribeCurrentSensitivityLevelAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_SENSITIVITY_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27379,6 +28151,7 @@ public void subscribeSupportedSensitivityLevelsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_SENSITIVITY_LEVELS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27404,6 +28177,7 @@ public void subscribeDefaultSensitivityLevelAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DEFAULT_SENSITIVITY_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27429,6 +28203,7 @@ public void subscribeAlarmsActiveAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ALARMS_ACTIVE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27454,6 +28229,7 @@ public void subscribeAlarmsSuppressedAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ALARMS_SUPPRESSED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27479,6 +28255,7 @@ public void subscribeAlarmsEnabledAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ALARMS_ENABLED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27504,6 +28281,7 @@ public void subscribeAlarmsSupportedAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ALARMS_SUPPORTED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27529,6 +28307,7 @@ public void subscribeSensorFaultAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SENSOR_FAULT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27554,6 +28333,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27579,6 +28359,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27604,6 +28385,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27629,6 +28411,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27654,6 +28437,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27679,6 +28463,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27824,6 +28609,7 @@ public void subscribeOpenDurationAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPEN_DURATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27858,6 +28644,7 @@ public void subscribeDefaultOpenDurationAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DEFAULT_OPEN_DURATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27883,6 +28670,7 @@ public void subscribeAutoCloseTimeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AUTO_CLOSE_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27908,6 +28696,7 @@ public void subscribeRemainingDurationAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REMAINING_DURATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27933,6 +28722,7 @@ public void subscribeCurrentStateAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27958,6 +28748,7 @@ public void subscribeTargetStateAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TARGET_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -27983,6 +28774,7 @@ public void subscribeCurrentLevelAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28008,6 +28800,7 @@ public void subscribeTargetLevelAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TARGET_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28042,6 +28835,7 @@ public void subscribeDefaultOpenLevelAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DEFAULT_OPEN_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28067,6 +28861,7 @@ public void subscribeValveFaultAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, VALVE_FAULT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28092,6 +28887,7 @@ public void subscribeLevelStepAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LEVEL_STEP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28117,6 +28913,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28142,6 +28939,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28167,6 +28965,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28192,6 +28991,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28217,6 +29017,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28242,6 +29043,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28391,6 +29193,7 @@ public void subscribePowerModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, POWER_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28416,6 +29219,7 @@ public void subscribeNumberOfMeasurementTypesAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_MEASUREMENT_TYPES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28441,6 +29245,7 @@ public void subscribeAccuracyAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ElectricalPowerMeasurementClusterMeasurementAccuracyStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCURACY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28466,6 +29271,7 @@ public void subscribeRangesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ElectricalPowerMeasurementClusterMeasurementRangeStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RANGES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28491,6 +29297,7 @@ public void subscribeVoltageAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, VOLTAGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28516,6 +29323,7 @@ public void subscribeActiveCurrentAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28541,6 +29349,7 @@ public void subscribeReactiveCurrentAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REACTIVE_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28566,6 +29375,7 @@ public void subscribeApparentCurrentAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, APPARENT_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28591,6 +29401,7 @@ public void subscribeActivePowerAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28616,6 +29427,7 @@ public void subscribeReactivePowerAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REACTIVE_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28641,6 +29453,7 @@ public void subscribeApparentPowerAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, APPARENT_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28666,6 +29479,7 @@ public void subscribeRMSVoltageAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, R_M_S_VOLTAGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28691,6 +29505,7 @@ public void subscribeRMSCurrentAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, R_M_S_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28716,6 +29531,7 @@ public void subscribeRMSPowerAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, R_M_S_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28741,6 +29557,7 @@ public void subscribeFrequencyAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FREQUENCY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28766,6 +29583,7 @@ public void subscribeHarmonicCurrentsAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable List<ChipStructs.ElectricalPowerMeasurementClusterHarmonicMeasurementStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, HARMONIC_CURRENTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28791,6 +29609,7 @@ public void subscribeHarmonicPhasesAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable List<ChipStructs.ElectricalPowerMeasurementClusterHarmonicMeasurementStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, HARMONIC_PHASES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28816,6 +29635,7 @@ public void subscribePowerFactorAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, POWER_FACTOR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28841,6 +29661,7 @@ public void subscribeNeutralCurrentAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NEUTRAL_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28866,6 +29687,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28891,6 +29713,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28916,6 +29739,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28941,6 +29765,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28966,6 +29791,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -28991,6 +29817,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29083,6 +29910,7 @@ public void subscribeAccuracyAttribute( @Override public void onSuccess(byte[] tlv) { ChipStructs.ElectricalEnergyMeasurementClusterMeasurementAccuracyStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCURACY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29108,6 +29936,7 @@ public void subscribeCumulativeEnergyImportedAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.ElectricalEnergyMeasurementClusterEnergyMeasurementStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CUMULATIVE_ENERGY_IMPORTED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29133,6 +29962,7 @@ public void subscribeCumulativeEnergyExportedAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.ElectricalEnergyMeasurementClusterEnergyMeasurementStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CUMULATIVE_ENERGY_EXPORTED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29158,6 +29988,7 @@ public void subscribePeriodicEnergyImportedAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.ElectricalEnergyMeasurementClusterEnergyMeasurementStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PERIODIC_ENERGY_IMPORTED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29183,6 +30014,7 @@ public void subscribePeriodicEnergyExportedAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.ElectricalEnergyMeasurementClusterEnergyMeasurementStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PERIODIC_ENERGY_EXPORTED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29208,6 +30040,7 @@ public void subscribeCumulativeEnergyResetAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.ElectricalEnergyMeasurementClusterCumulativeEnergyResetStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CUMULATIVE_ENERGY_RESET_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29233,6 +30066,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29258,6 +30092,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29283,6 +30118,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29308,6 +30144,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29333,6 +30170,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29358,6 +30196,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29540,6 +30379,7 @@ public void subscribeLoadControlProgramsAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.DemandResponseLoadControlClusterLoadControlProgramStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LOAD_CONTROL_PROGRAMS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29565,6 +30405,7 @@ public void subscribeNumberOfLoadControlProgramsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_LOAD_CONTROL_PROGRAMS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29590,6 +30431,7 @@ public void subscribeEventsAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.DemandResponseLoadControlClusterLoadControlEventStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29615,6 +30457,7 @@ public void subscribeActiveEventsAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.DemandResponseLoadControlClusterLoadControlEventStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_EVENTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29640,6 +30483,7 @@ public void subscribeNumberOfEventsPerProgramAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_EVENTS_PER_PROGRAM_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29665,6 +30509,7 @@ public void subscribeNumberOfTransitionsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_TRANSITIONS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29699,6 +30544,7 @@ public void subscribeDefaultRandomStartAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DEFAULT_RANDOM_START_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29733,6 +30579,7 @@ public void subscribeDefaultRandomDurationAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DEFAULT_RANDOM_DURATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29758,6 +30605,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29783,6 +30631,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29808,6 +30657,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29833,6 +30683,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29858,6 +30709,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -29883,6 +30735,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30019,6 +30872,7 @@ public void subscribeMessagesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.MessagesClusterMessageStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MESSAGES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30044,6 +30898,7 @@ public void subscribeActiveMessageIDsAttribute( @Override public void onSuccess(byte[] tlv) { List<byte[]> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_MESSAGE_I_DS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30069,6 +30924,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30094,6 +30950,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30119,6 +30976,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30144,6 +31002,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30169,6 +31028,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30194,6 +31054,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30448,6 +31309,7 @@ public void subscribeESATypeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, E_S_A_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30473,6 +31335,7 @@ public void subscribeESACanGenerateAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, E_S_A_CAN_GENERATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30498,6 +31361,7 @@ public void subscribeESAStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, E_S_A_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30523,6 +31387,7 @@ public void subscribeAbsMinPowerAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ABS_MIN_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30548,6 +31413,7 @@ public void subscribeAbsMaxPowerAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ABS_MAX_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30573,6 +31439,7 @@ public void subscribePowerAdjustmentCapabilityAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable List<ChipStructs.DeviceEnergyManagementClusterPowerAdjustStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, POWER_ADJUSTMENT_CAPABILITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30598,6 +31465,7 @@ public void subscribeForecastAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.DeviceEnergyManagementClusterForecastStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FORECAST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30623,6 +31491,7 @@ public void subscribeOptOutStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPT_OUT_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30648,6 +31517,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30673,6 +31543,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30698,6 +31569,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30723,6 +31595,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30748,6 +31621,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -30773,6 +31647,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31047,6 +31922,7 @@ public void subscribeStateAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31072,6 +31948,7 @@ public void subscribeSupplyStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPLY_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31097,6 +31974,7 @@ public void subscribeFaultStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FAULT_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31122,6 +32000,7 @@ public void subscribeChargingEnabledUntilAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CHARGING_ENABLED_UNTIL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31147,6 +32026,7 @@ public void subscribeDischargingEnabledUntilAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DISCHARGING_ENABLED_UNTIL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31172,6 +32052,7 @@ public void subscribeCircuitCapacityAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CIRCUIT_CAPACITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31197,6 +32078,7 @@ public void subscribeMinimumChargeCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MINIMUM_CHARGE_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31222,6 +32104,7 @@ public void subscribeMaximumChargeCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAXIMUM_CHARGE_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31247,6 +32130,7 @@ public void subscribeMaximumDischargeCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAXIMUM_DISCHARGE_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31281,6 +32165,7 @@ public void subscribeUserMaximumChargeCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, USER_MAXIMUM_CHARGE_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31315,6 +32200,7 @@ public void subscribeRandomizationDelayWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RANDOMIZATION_DELAY_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31340,6 +32226,7 @@ public void subscribeNextChargeStartTimeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NEXT_CHARGE_START_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31365,6 +32252,7 @@ public void subscribeNextChargeTargetTimeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NEXT_CHARGE_TARGET_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31390,6 +32278,7 @@ public void subscribeNextChargeRequiredEnergyAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NEXT_CHARGE_REQUIRED_ENERGY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31415,6 +32304,7 @@ public void subscribeNextChargeTargetSoCAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NEXT_CHARGE_TARGET_SO_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31449,6 +32339,7 @@ public void subscribeApproximateEVEfficiencyAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, APPROXIMATE_E_V_EFFICIENCY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31474,6 +32365,7 @@ public void subscribeStateOfChargeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, STATE_OF_CHARGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31499,6 +32391,7 @@ public void subscribeBatteryCapacityAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BATTERY_CAPACITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31524,6 +32417,7 @@ public void subscribeVehicleIDAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, VEHICLE_I_D_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31549,6 +32443,7 @@ public void subscribeSessionIDAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SESSION_I_D_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31574,6 +32469,7 @@ public void subscribeSessionDurationAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SESSION_DURATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31599,6 +32495,7 @@ public void subscribeSessionEnergyChargedAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SESSION_ENERGY_CHARGED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31624,6 +32521,7 @@ public void subscribeSessionEnergyDischargedAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SESSION_ENERGY_DISCHARGED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31649,6 +32547,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31674,6 +32573,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31699,6 +32599,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31724,6 +32625,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31749,6 +32651,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31774,6 +32677,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31853,6 +32757,7 @@ public void subscribeEnergyBalancesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.EnergyPreferenceClusterBalanceStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ENERGY_BALANCES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31887,6 +32792,7 @@ public void subscribeCurrentEnergyBalanceAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_ENERGY_BALANCE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31912,6 +32818,7 @@ public void subscribeEnergyPrioritiesAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ENERGY_PRIORITIES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31937,6 +32844,7 @@ public void subscribeLowPowerModeSensitivitiesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.EnergyPreferenceClusterBalanceStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LOW_POWER_MODE_SENSITIVITIES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31971,6 +32879,7 @@ public void subscribeCurrentLowPowerModeSensitivityAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_LOW_POWER_MODE_SENSITIVITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -31996,6 +32905,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32021,6 +32931,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32046,6 +32957,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32071,6 +32983,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32096,6 +33009,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32121,6 +33035,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32193,6 +33108,7 @@ public void subscribeAvailableEndpointsAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVAILABLE_ENDPOINTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32218,6 +33134,7 @@ public void subscribeActiveEndpointsAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_ENDPOINTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32243,6 +33160,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32268,6 +33186,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32293,6 +33212,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32318,6 +33238,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32343,6 +33264,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32368,6 +33290,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32487,6 +33410,7 @@ public void subscribeSupportedModesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.EnergyEvseModeClusterModeOptionStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_MODES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32512,6 +33436,7 @@ public void subscribeCurrentModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32546,6 +33471,7 @@ public void subscribeStartUpModeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, START_UP_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32580,6 +33506,7 @@ public void subscribeOnModeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ON_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32605,6 +33532,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32630,6 +33558,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32655,6 +33584,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32680,6 +33610,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32705,6 +33636,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32730,6 +33662,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32849,6 +33782,7 @@ public void subscribeSupportedModesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.DeviceEnergyManagementModeClusterModeOptionStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_MODES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32874,6 +33808,7 @@ public void subscribeCurrentModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32908,6 +33843,7 @@ public void subscribeStartUpModeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, START_UP_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32942,6 +33878,7 @@ public void subscribeOnModeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ON_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32967,6 +33904,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -32992,6 +33930,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -33017,6 +33956,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -33042,6 +33982,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -33067,6 +34008,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -33092,6 +34034,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34031,6 +34974,7 @@ public void subscribeLockStateAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LOCK_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34056,6 +35000,7 @@ public void subscribeLockTypeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LOCK_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34081,6 +35026,7 @@ public void subscribeActuatorEnabledAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTUATOR_ENABLED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34106,6 +35052,7 @@ public void subscribeDoorStateAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DOOR_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34140,6 +35087,7 @@ public void subscribeDoorOpenEventsAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DOOR_OPEN_EVENTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34174,6 +35122,7 @@ public void subscribeDoorClosedEventsAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DOOR_CLOSED_EVENTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34208,6 +35157,7 @@ public void subscribeOpenPeriodAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPEN_PERIOD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34233,6 +35183,7 @@ public void subscribeNumberOfTotalUsersSupportedAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_TOTAL_USERS_SUPPORTED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34258,6 +35209,7 @@ public void subscribeNumberOfPINUsersSupportedAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_P_I_N_USERS_SUPPORTED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34283,6 +35235,7 @@ public void subscribeNumberOfRFIDUsersSupportedAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_R_F_I_D_USERS_SUPPORTED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34308,6 +35261,7 @@ public void subscribeNumberOfWeekDaySchedulesSupportedPerUserAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_WEEK_DAY_SCHEDULES_SUPPORTED_PER_USER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34333,6 +35287,7 @@ public void subscribeNumberOfYearDaySchedulesSupportedPerUserAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_YEAR_DAY_SCHEDULES_SUPPORTED_PER_USER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34358,6 +35313,7 @@ public void subscribeNumberOfHolidaySchedulesSupportedAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_HOLIDAY_SCHEDULES_SUPPORTED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34383,6 +35339,7 @@ public void subscribeMaxPINCodeLengthAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_P_I_N_CODE_LENGTH_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34408,6 +35365,7 @@ public void subscribeMinPINCodeLengthAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_P_I_N_CODE_LENGTH_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34433,6 +35391,7 @@ public void subscribeMaxRFIDCodeLengthAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_R_F_I_D_CODE_LENGTH_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34458,6 +35417,7 @@ public void subscribeMinRFIDCodeLengthAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_R_F_I_D_CODE_LENGTH_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34483,6 +35443,7 @@ public void subscribeCredentialRulesSupportAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CREDENTIAL_RULES_SUPPORT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34508,6 +35469,7 @@ public void subscribeNumberOfCredentialsSupportedPerUserAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_CREDENTIALS_SUPPORTED_PER_USER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34542,6 +35504,7 @@ public void subscribeLanguageAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LANGUAGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34576,6 +35539,7 @@ public void subscribeLEDSettingsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, L_E_D_SETTINGS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34610,6 +35574,7 @@ public void subscribeAutoRelockTimeAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AUTO_RELOCK_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34644,6 +35609,7 @@ public void subscribeSoundVolumeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SOUND_VOLUME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34678,6 +35644,7 @@ public void subscribeOperatingModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPERATING_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34703,6 +35670,7 @@ public void subscribeSupportedOperatingModesAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_OPERATING_MODES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34728,6 +35696,7 @@ public void subscribeDefaultConfigurationRegisterAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DEFAULT_CONFIGURATION_REGISTER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34762,6 +35731,7 @@ public void subscribeEnableLocalProgrammingAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ENABLE_LOCAL_PROGRAMMING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34796,6 +35766,7 @@ public void subscribeEnableOneTouchLockingAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ENABLE_ONE_TOUCH_LOCKING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34830,6 +35801,7 @@ public void subscribeEnableInsideStatusLEDAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ENABLE_INSIDE_STATUS_L_E_D_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34864,6 +35836,7 @@ public void subscribeEnablePrivacyModeButtonAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ENABLE_PRIVACY_MODE_BUTTON_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34898,6 +35871,7 @@ public void subscribeLocalProgrammingFeaturesAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LOCAL_PROGRAMMING_FEATURES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34932,6 +35906,7 @@ public void subscribeWrongCodeEntryLimitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WRONG_CODE_ENTRY_LIMIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -34966,6 +35941,7 @@ public void subscribeUserCodeTemporaryDisableTimeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, USER_CODE_TEMPORARY_DISABLE_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35000,6 +35976,7 @@ public void subscribeSendPINOverTheAirAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SEND_P_I_N_OVER_THE_AIR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35034,6 +36011,7 @@ public void subscribeRequirePINforRemoteOperationAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REQUIRE_P_I_NFOR_REMOTE_OPERATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35068,6 +36046,7 @@ public void subscribeExpiringUserTimeoutAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EXPIRING_USER_TIMEOUT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35093,6 +36072,7 @@ public void subscribeAliroReaderVerificationKeyAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable byte[] value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ALIRO_READER_VERIFICATION_KEY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35118,6 +36098,7 @@ public void subscribeAliroReaderGroupIdentifierAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable byte[] value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ALIRO_READER_GROUP_IDENTIFIER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35143,6 +36124,7 @@ public void subscribeAliroReaderGroupSubIdentifierAttribute( @Override public void onSuccess(byte[] tlv) { byte[] value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ALIRO_READER_GROUP_SUB_IDENTIFIER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35168,6 +36150,7 @@ public void subscribeAliroExpeditedTransactionSupportedProtocolVersionsAttribute @Override public void onSuccess(byte[] tlv) { List<byte[]> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ALIRO_EXPEDITED_TRANSACTION_SUPPORTED_PROTOCOL_VERSIONS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35193,6 +36176,7 @@ public void subscribeAliroGroupResolvingKeyAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable byte[] value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ALIRO_GROUP_RESOLVING_KEY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35218,6 +36202,7 @@ public void subscribeAliroSupportedBLEUWBProtocolVersionsAttribute( @Override public void onSuccess(byte[] tlv) { List<byte[]> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ALIRO_SUPPORTED_B_L_E_U_W_B_PROTOCOL_VERSIONS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35243,6 +36228,7 @@ public void subscribeAliroBLEAdvertisingVersionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ALIRO_B_L_E_ADVERTISING_VERSION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35268,6 +36254,7 @@ public void subscribeNumberOfAliroCredentialIssuerKeysSupportedAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_ALIRO_CREDENTIAL_ISSUER_KEYS_SUPPORTED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35293,6 +36280,7 @@ public void subscribeNumberOfAliroEndpointKeysSupportedAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_ALIRO_ENDPOINT_KEYS_SUPPORTED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35318,6 +36306,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35343,6 +36332,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35368,6 +36358,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35393,6 +36384,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35418,6 +36410,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35443,6 +36436,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35687,6 +36681,7 @@ public void subscribeTypeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35712,6 +36707,7 @@ public void subscribePhysicalClosedLimitLiftAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PHYSICAL_CLOSED_LIMIT_LIFT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35737,6 +36733,7 @@ public void subscribePhysicalClosedLimitTiltAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PHYSICAL_CLOSED_LIMIT_TILT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35762,6 +36759,7 @@ public void subscribeCurrentPositionLiftAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_POSITION_LIFT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35787,6 +36785,7 @@ public void subscribeCurrentPositionTiltAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_POSITION_TILT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35812,6 +36811,7 @@ public void subscribeNumberOfActuationsLiftAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_ACTUATIONS_LIFT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35837,6 +36837,7 @@ public void subscribeNumberOfActuationsTiltAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_ACTUATIONS_TILT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35862,6 +36863,7 @@ public void subscribeConfigStatusAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CONFIG_STATUS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35887,6 +36889,7 @@ public void subscribeCurrentPositionLiftPercentageAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_POSITION_LIFT_PERCENTAGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35912,6 +36915,7 @@ public void subscribeCurrentPositionTiltPercentageAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_POSITION_TILT_PERCENTAGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35937,6 +36941,7 @@ public void subscribeOperationalStatusAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPERATIONAL_STATUS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35962,6 +36967,7 @@ public void subscribeTargetPositionLiftPercent100thsAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TARGET_POSITION_LIFT_PERCENT100THS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -35987,6 +36993,7 @@ public void subscribeTargetPositionTiltPercent100thsAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TARGET_POSITION_TILT_PERCENT100THS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36012,6 +37019,7 @@ public void subscribeEndProductTypeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, END_PRODUCT_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36037,6 +37045,7 @@ public void subscribeCurrentPositionLiftPercent100thsAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_POSITION_LIFT_PERCENT100THS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36062,6 +37071,7 @@ public void subscribeCurrentPositionTiltPercent100thsAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_POSITION_TILT_PERCENT100THS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36087,6 +37097,7 @@ public void subscribeInstalledOpenLimitLiftAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INSTALLED_OPEN_LIMIT_LIFT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36112,6 +37123,7 @@ public void subscribeInstalledClosedLimitLiftAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INSTALLED_CLOSED_LIMIT_LIFT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36137,6 +37149,7 @@ public void subscribeInstalledOpenLimitTiltAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INSTALLED_OPEN_LIMIT_TILT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36162,6 +37175,7 @@ public void subscribeInstalledClosedLimitTiltAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INSTALLED_CLOSED_LIMIT_TILT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36196,6 +37210,7 @@ public void subscribeModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36221,6 +37236,7 @@ public void subscribeSafetyStatusAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SAFETY_STATUS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36246,6 +37262,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36271,6 +37288,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36296,6 +37314,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36321,6 +37340,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36346,6 +37366,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36371,6 +37392,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36479,6 +37501,7 @@ public void subscribeBarrierMovingStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BARRIER_MOVING_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36504,6 +37527,7 @@ public void subscribeBarrierSafetyStatusAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BARRIER_SAFETY_STATUS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36529,6 +37553,7 @@ public void subscribeBarrierCapabilitiesAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BARRIER_CAPABILITIES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36563,6 +37588,7 @@ public void subscribeBarrierOpenEventsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BARRIER_OPEN_EVENTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36597,6 +37623,7 @@ public void subscribeBarrierCloseEventsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BARRIER_CLOSE_EVENTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36631,6 +37658,7 @@ public void subscribeBarrierCommandOpenEventsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BARRIER_COMMAND_OPEN_EVENTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36665,6 +37693,7 @@ public void subscribeBarrierCommandCloseEventsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BARRIER_COMMAND_CLOSE_EVENTS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36699,6 +37728,7 @@ public void subscribeBarrierOpenPeriodAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BARRIER_OPEN_PERIOD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36733,6 +37763,7 @@ public void subscribeBarrierClosePeriodAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BARRIER_CLOSE_PERIOD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36758,6 +37789,7 @@ public void subscribeBarrierPositionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BARRIER_POSITION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36783,6 +37815,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36808,6 +37841,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36833,6 +37867,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36858,6 +37893,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36883,6 +37919,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -36908,6 +37945,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37065,6 +38103,7 @@ public void subscribeMaxPressureAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_PRESSURE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37090,6 +38129,7 @@ public void subscribeMaxSpeedAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_SPEED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37115,6 +38155,7 @@ public void subscribeMaxFlowAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_FLOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37140,6 +38181,7 @@ public void subscribeMinConstPressureAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_CONST_PRESSURE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37165,6 +38207,7 @@ public void subscribeMaxConstPressureAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_CONST_PRESSURE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37190,6 +38233,7 @@ public void subscribeMinCompPressureAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_COMP_PRESSURE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37215,6 +38259,7 @@ public void subscribeMaxCompPressureAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_COMP_PRESSURE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37240,6 +38285,7 @@ public void subscribeMinConstSpeedAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_CONST_SPEED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37265,6 +38311,7 @@ public void subscribeMaxConstSpeedAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_CONST_SPEED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37290,6 +38337,7 @@ public void subscribeMinConstFlowAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_CONST_FLOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37315,6 +38363,7 @@ public void subscribeMaxConstFlowAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_CONST_FLOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37340,6 +38389,7 @@ public void subscribeMinConstTempAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_CONST_TEMP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37365,6 +38415,7 @@ public void subscribeMaxConstTempAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_CONST_TEMP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37390,6 +38441,7 @@ public void subscribePumpStatusAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PUMP_STATUS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37415,6 +38467,7 @@ public void subscribeEffectiveOperationModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EFFECTIVE_OPERATION_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37440,6 +38493,7 @@ public void subscribeEffectiveControlModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EFFECTIVE_CONTROL_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37465,6 +38519,7 @@ public void subscribeCapacityAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CAPACITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37490,6 +38545,7 @@ public void subscribeSpeedAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SPEED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37524,6 +38580,7 @@ public void subscribeLifetimeRunningHoursAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LIFETIME_RUNNING_HOURS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37549,6 +38606,7 @@ public void subscribePowerAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37583,6 +38641,7 @@ public void subscribeLifetimeEnergyConsumedAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LIFETIME_ENERGY_CONSUMED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37617,6 +38676,7 @@ public void subscribeOperationModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPERATION_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37651,6 +38711,7 @@ public void subscribeControlModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CONTROL_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37676,6 +38737,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37701,6 +38763,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37726,6 +38789,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37751,6 +38815,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37776,6 +38841,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -37801,6 +38867,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38269,6 +39336,7 @@ public void subscribeLocalTemperatureAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LOCAL_TEMPERATURE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38294,6 +39362,7 @@ public void subscribeOutdoorTemperatureAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OUTDOOR_TEMPERATURE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38319,6 +39388,7 @@ public void subscribeOccupancyAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OCCUPANCY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38344,6 +39414,7 @@ public void subscribeAbsMinHeatSetpointLimitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ABS_MIN_HEAT_SETPOINT_LIMIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38369,6 +39440,7 @@ public void subscribeAbsMaxHeatSetpointLimitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ABS_MAX_HEAT_SETPOINT_LIMIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38394,6 +39466,7 @@ public void subscribeAbsMinCoolSetpointLimitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ABS_MIN_COOL_SETPOINT_LIMIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38419,6 +39492,7 @@ public void subscribeAbsMaxCoolSetpointLimitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ABS_MAX_COOL_SETPOINT_LIMIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38444,6 +39518,7 @@ public void subscribePICoolingDemandAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, P_I_COOLING_DEMAND_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38469,6 +39544,7 @@ public void subscribePIHeatingDemandAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, P_I_HEATING_DEMAND_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38503,6 +39579,7 @@ public void subscribeHVACSystemTypeConfigurationAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, H_V_A_C_SYSTEM_TYPE_CONFIGURATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38537,6 +39614,7 @@ public void subscribeLocalTemperatureCalibrationAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LOCAL_TEMPERATURE_CALIBRATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38571,6 +39649,7 @@ public void subscribeOccupiedCoolingSetpointAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OCCUPIED_COOLING_SETPOINT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38605,6 +39684,7 @@ public void subscribeOccupiedHeatingSetpointAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OCCUPIED_HEATING_SETPOINT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38639,6 +39719,7 @@ public void subscribeUnoccupiedCoolingSetpointAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNOCCUPIED_COOLING_SETPOINT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38673,6 +39754,7 @@ public void subscribeUnoccupiedHeatingSetpointAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNOCCUPIED_HEATING_SETPOINT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38707,6 +39789,7 @@ public void subscribeMinHeatSetpointLimitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_HEAT_SETPOINT_LIMIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38741,6 +39824,7 @@ public void subscribeMaxHeatSetpointLimitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_HEAT_SETPOINT_LIMIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38775,6 +39859,7 @@ public void subscribeMinCoolSetpointLimitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_COOL_SETPOINT_LIMIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38809,6 +39894,7 @@ public void subscribeMaxCoolSetpointLimitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_COOL_SETPOINT_LIMIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38843,6 +39929,7 @@ public void subscribeMinSetpointDeadBandAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_SETPOINT_DEAD_BAND_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38877,6 +39964,7 @@ public void subscribeRemoteSensingAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REMOTE_SENSING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38911,6 +39999,7 @@ public void subscribeControlSequenceOfOperationAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CONTROL_SEQUENCE_OF_OPERATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38945,6 +40034,7 @@ public void subscribeSystemModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SYSTEM_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38970,6 +40060,7 @@ public void subscribeThermostatRunningModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, THERMOSTAT_RUNNING_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -38995,6 +40086,7 @@ public void subscribeStartOfWeekAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, START_OF_WEEK_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39020,6 +40112,7 @@ public void subscribeNumberOfWeeklyTransitionsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_WEEKLY_TRANSITIONS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39045,6 +40138,7 @@ public void subscribeNumberOfDailyTransitionsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_DAILY_TRANSITIONS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39079,6 +40173,7 @@ public void subscribeTemperatureSetpointHoldAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TEMPERATURE_SETPOINT_HOLD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39113,6 +40208,7 @@ public void subscribeTemperatureSetpointHoldDurationAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TEMPERATURE_SETPOINT_HOLD_DURATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39147,6 +40243,7 @@ public void subscribeThermostatProgrammingOperationModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, THERMOSTAT_PROGRAMMING_OPERATION_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39172,6 +40269,7 @@ public void subscribeThermostatRunningStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, THERMOSTAT_RUNNING_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39197,6 +40295,7 @@ public void subscribeSetpointChangeSourceAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SETPOINT_CHANGE_SOURCE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39222,6 +40321,7 @@ public void subscribeSetpointChangeAmountAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SETPOINT_CHANGE_AMOUNT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39247,6 +40347,7 @@ public void subscribeSetpointChangeSourceTimestampAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SETPOINT_CHANGE_SOURCE_TIMESTAMP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39281,6 +40382,7 @@ public void subscribeOccupiedSetbackAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OCCUPIED_SETBACK_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39306,6 +40408,7 @@ public void subscribeOccupiedSetbackMinAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OCCUPIED_SETBACK_MIN_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39331,6 +40434,7 @@ public void subscribeOccupiedSetbackMaxAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OCCUPIED_SETBACK_MAX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39365,6 +40469,7 @@ public void subscribeUnoccupiedSetbackAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNOCCUPIED_SETBACK_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39390,6 +40495,7 @@ public void subscribeUnoccupiedSetbackMinAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNOCCUPIED_SETBACK_MIN_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39415,6 +40521,7 @@ public void subscribeUnoccupiedSetbackMaxAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNOCCUPIED_SETBACK_MAX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39449,6 +40556,7 @@ public void subscribeEmergencyHeatDeltaAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EMERGENCY_HEAT_DELTA_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39483,6 +40591,7 @@ public void subscribeACTypeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, A_C_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39517,6 +40626,7 @@ public void subscribeACCapacityAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, A_C_CAPACITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39551,6 +40661,7 @@ public void subscribeACRefrigerantTypeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, A_C_REFRIGERANT_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39585,6 +40696,7 @@ public void subscribeACCompressorTypeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, A_C_COMPRESSOR_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39619,6 +40731,7 @@ public void subscribeACErrorCodeAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, A_C_ERROR_CODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39653,6 +40766,7 @@ public void subscribeACLouverPositionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, A_C_LOUVER_POSITION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39678,6 +40792,7 @@ public void subscribeACCoilTemperatureAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, A_C_COIL_TEMPERATURE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39712,6 +40827,7 @@ public void subscribeACCapacityformatAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, A_C_CAPACITYFORMAT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39737,6 +40853,7 @@ public void subscribePresetTypesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ThermostatClusterPresetTypeStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRESET_TYPES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39762,6 +40879,7 @@ public void subscribeScheduleTypesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ThermostatClusterScheduleTypeStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SCHEDULE_TYPES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39787,6 +40905,7 @@ public void subscribeNumberOfPresetsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_PRESETS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39812,6 +40931,7 @@ public void subscribeNumberOfSchedulesAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_SCHEDULES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39837,6 +40957,7 @@ public void subscribeNumberOfScheduleTransitionsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_SCHEDULE_TRANSITIONS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39862,6 +40983,7 @@ public void subscribeNumberOfScheduleTransitionPerDayAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_SCHEDULE_TRANSITION_PER_DAY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39887,6 +41009,7 @@ public void subscribeActivePresetHandleAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable byte[] value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_PRESET_HANDLE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39912,6 +41035,7 @@ public void subscribeActiveScheduleHandleAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable byte[] value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_SCHEDULE_HANDLE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39946,6 +41070,7 @@ public void subscribePresetsAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ThermostatClusterPresetStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRESETS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -39980,6 +41105,7 @@ public void subscribeSchedulesAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ThermostatClusterScheduleStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SCHEDULES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40005,6 +41131,7 @@ public void subscribePresetsSchedulesEditableAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRESETS_SCHEDULES_EDITABLE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40030,6 +41157,7 @@ public void subscribeTemperatureSetpointHoldPolicyAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TEMPERATURE_SETPOINT_HOLD_POLICY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40055,6 +41183,7 @@ public void subscribeSetpointHoldExpiryTimestampAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SETPOINT_HOLD_EXPIRY_TIMESTAMP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40080,6 +41209,7 @@ public void subscribeQueuedPresetAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.ThermostatClusterQueuedPresetStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, QUEUED_PRESET_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40105,6 +41235,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40130,6 +41261,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40155,6 +41287,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40180,6 +41313,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40205,6 +41339,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40230,6 +41365,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40349,6 +41485,7 @@ public void subscribeFanModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FAN_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40374,6 +41511,7 @@ public void subscribeFanModeSequenceAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FAN_MODE_SEQUENCE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40408,6 +41546,7 @@ public void subscribePercentSettingAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PERCENT_SETTING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40433,6 +41572,7 @@ public void subscribePercentCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PERCENT_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40458,6 +41598,7 @@ public void subscribeSpeedMaxAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SPEED_MAX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40492,6 +41633,7 @@ public void subscribeSpeedSettingAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SPEED_SETTING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40517,6 +41659,7 @@ public void subscribeSpeedCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SPEED_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40542,6 +41685,7 @@ public void subscribeRockSupportAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ROCK_SUPPORT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40576,6 +41720,7 @@ public void subscribeRockSettingAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ROCK_SETTING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40601,6 +41746,7 @@ public void subscribeWindSupportAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WIND_SUPPORT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40635,6 +41781,7 @@ public void subscribeWindSettingAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WIND_SETTING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40669,6 +41816,7 @@ public void subscribeAirflowDirectionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AIRFLOW_DIRECTION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40694,6 +41842,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40719,6 +41868,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40744,6 +41894,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40769,6 +41920,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40794,6 +41946,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40819,6 +41972,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40893,6 +42047,7 @@ public void subscribeTemperatureDisplayModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TEMPERATURE_DISPLAY_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40927,6 +42082,7 @@ public void subscribeKeypadLockoutAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, KEYPAD_LOCKOUT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40961,6 +42117,7 @@ public void subscribeScheduleProgrammingVisibilityAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SCHEDULE_PROGRAMMING_VISIBILITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -40986,6 +42143,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -41011,6 +42169,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -41036,6 +42195,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -41061,6 +42221,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -41086,6 +42247,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -41111,6 +42273,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -41937,6 +43100,7 @@ public void subscribeCurrentHueAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_HUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -41962,6 +43126,7 @@ public void subscribeCurrentSaturationAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_SATURATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -41987,6 +43152,7 @@ public void subscribeRemainingTimeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REMAINING_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42012,6 +43178,7 @@ public void subscribeCurrentXAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_X_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42037,6 +43204,7 @@ public void subscribeCurrentYAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_Y_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42062,6 +43230,7 @@ public void subscribeDriftCompensationAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DRIFT_COMPENSATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42087,6 +43256,7 @@ public void subscribeCompensationTextAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COMPENSATION_TEXT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42112,6 +43282,7 @@ public void subscribeColorTemperatureMiredsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_TEMPERATURE_MIREDS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42137,6 +43308,7 @@ public void subscribeColorModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42171,6 +43343,7 @@ public void subscribeOptionsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OPTIONS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42196,6 +43369,7 @@ public void subscribeNumberOfPrimariesAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NUMBER_OF_PRIMARIES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42221,6 +43395,7 @@ public void subscribePrimary1XAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY1_X_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42246,6 +43421,7 @@ public void subscribePrimary1YAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY1_Y_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42271,6 +43447,7 @@ public void subscribePrimary1IntensityAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY1_INTENSITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42296,6 +43473,7 @@ public void subscribePrimary2XAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY2_X_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42321,6 +43499,7 @@ public void subscribePrimary2YAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY2_Y_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42346,6 +43525,7 @@ public void subscribePrimary2IntensityAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY2_INTENSITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42371,6 +43551,7 @@ public void subscribePrimary3XAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY3_X_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42396,6 +43577,7 @@ public void subscribePrimary3YAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY3_Y_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42421,6 +43603,7 @@ public void subscribePrimary3IntensityAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY3_INTENSITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42446,6 +43629,7 @@ public void subscribePrimary4XAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY4_X_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42471,6 +43655,7 @@ public void subscribePrimary4YAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY4_Y_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42496,6 +43681,7 @@ public void subscribePrimary4IntensityAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY4_INTENSITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42521,6 +43707,7 @@ public void subscribePrimary5XAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY5_X_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42546,6 +43733,7 @@ public void subscribePrimary5YAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY5_Y_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42571,6 +43759,7 @@ public void subscribePrimary5IntensityAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY5_INTENSITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42596,6 +43785,7 @@ public void subscribePrimary6XAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY6_X_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42621,6 +43811,7 @@ public void subscribePrimary6YAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY6_Y_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42646,6 +43837,7 @@ public void subscribePrimary6IntensityAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRIMARY6_INTENSITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42680,6 +43872,7 @@ public void subscribeWhitePointXAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WHITE_POINT_X_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42714,6 +43907,7 @@ public void subscribeWhitePointYAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WHITE_POINT_Y_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42748,6 +43942,7 @@ public void subscribeColorPointRXAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_POINT_R_X_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42782,6 +43977,7 @@ public void subscribeColorPointRYAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_POINT_R_Y_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42816,6 +44012,7 @@ public void subscribeColorPointRIntensityAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_POINT_R_INTENSITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42850,6 +44047,7 @@ public void subscribeColorPointGXAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_POINT_G_X_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42884,6 +44082,7 @@ public void subscribeColorPointGYAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_POINT_G_Y_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42918,6 +44117,7 @@ public void subscribeColorPointGIntensityAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_POINT_G_INTENSITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42952,6 +44152,7 @@ public void subscribeColorPointBXAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_POINT_B_X_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -42986,6 +44187,7 @@ public void subscribeColorPointBYAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_POINT_B_Y_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43020,6 +44222,7 @@ public void subscribeColorPointBIntensityAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_POINT_B_INTENSITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43045,6 +44248,7 @@ public void subscribeEnhancedCurrentHueAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ENHANCED_CURRENT_HUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43070,6 +44274,7 @@ public void subscribeEnhancedColorModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ENHANCED_COLOR_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43095,6 +44300,7 @@ public void subscribeColorLoopActiveAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_LOOP_ACTIVE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43120,6 +44326,7 @@ public void subscribeColorLoopDirectionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_LOOP_DIRECTION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43145,6 +44352,7 @@ public void subscribeColorLoopTimeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_LOOP_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43170,6 +44378,7 @@ public void subscribeColorLoopStartEnhancedHueAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_LOOP_START_ENHANCED_HUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43195,6 +44404,7 @@ public void subscribeColorLoopStoredEnhancedHueAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_LOOP_STORED_ENHANCED_HUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43220,6 +44430,7 @@ public void subscribeColorCapabilitiesAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_CAPABILITIES_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43245,6 +44456,7 @@ public void subscribeColorTempPhysicalMinMiredsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_TEMP_PHYSICAL_MIN_MIREDS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43270,6 +44482,7 @@ public void subscribeColorTempPhysicalMaxMiredsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COLOR_TEMP_PHYSICAL_MAX_MIREDS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43295,6 +44508,7 @@ public void subscribeCoupleColorTempToLevelMinMiredsAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, COUPLE_COLOR_TEMP_TO_LEVEL_MIN_MIREDS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43329,6 +44543,7 @@ public void subscribeStartUpColorTemperatureMiredsAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, START_UP_COLOR_TEMPERATURE_MIREDS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43354,6 +44569,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43379,6 +44595,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43404,6 +44621,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43429,6 +44647,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43454,6 +44673,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43479,6 +44699,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43575,6 +44796,7 @@ public void subscribePhysicalMinLevelAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PHYSICAL_MIN_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43600,6 +44822,7 @@ public void subscribePhysicalMaxLevelAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PHYSICAL_MAX_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43625,6 +44848,7 @@ public void subscribeBallastStatusAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BALLAST_STATUS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43659,6 +44883,7 @@ public void subscribeMinLevelAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43693,6 +44918,7 @@ public void subscribeMaxLevelAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_LEVEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43727,6 +44953,7 @@ public void subscribeIntrinsicBallastFactorAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INTRINSIC_BALLAST_FACTOR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43761,6 +44988,7 @@ public void subscribeBallastFactorAdjustmentAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BALLAST_FACTOR_ADJUSTMENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43786,6 +45014,7 @@ public void subscribeLampQuantityAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LAMP_QUANTITY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43820,6 +45049,7 @@ public void subscribeLampTypeAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LAMP_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43854,6 +45084,7 @@ public void subscribeLampManufacturerAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LAMP_MANUFACTURER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43888,6 +45119,7 @@ public void subscribeLampRatedHoursAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LAMP_RATED_HOURS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43922,6 +45154,7 @@ public void subscribeLampBurnHoursAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LAMP_BURN_HOURS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43956,6 +45189,7 @@ public void subscribeLampAlarmModeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LAMP_ALARM_MODE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -43990,6 +45224,7 @@ public void subscribeLampBurnHoursTripPointAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LAMP_BURN_HOURS_TRIP_POINT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44015,6 +45250,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44040,6 +45276,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44065,6 +45302,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44090,6 +45328,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44115,6 +45354,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44140,6 +45380,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44223,6 +45464,7 @@ public void subscribeMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44248,6 +45490,7 @@ public void subscribeMinMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44273,6 +45516,7 @@ public void subscribeMaxMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44298,6 +45542,7 @@ public void subscribeToleranceAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TOLERANCE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44323,6 +45568,7 @@ public void subscribeLightSensorTypeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LIGHT_SENSOR_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44348,6 +45594,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44373,6 +45620,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44398,6 +45646,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44423,6 +45672,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44448,6 +45698,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44473,6 +45724,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44551,6 +45803,7 @@ public void subscribeMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44576,6 +45829,7 @@ public void subscribeMinMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44601,6 +45855,7 @@ public void subscribeMaxMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44626,6 +45881,7 @@ public void subscribeToleranceAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TOLERANCE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44651,6 +45907,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44676,6 +45933,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44701,6 +45959,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44726,6 +45985,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44751,6 +46011,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44776,6 +46037,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44871,6 +46133,7 @@ public void subscribeMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44896,6 +46159,7 @@ public void subscribeMinMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44921,6 +46185,7 @@ public void subscribeMaxMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44946,6 +46211,7 @@ public void subscribeToleranceAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TOLERANCE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44971,6 +46237,7 @@ public void subscribeScaledValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SCALED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -44996,6 +46263,7 @@ public void subscribeMinScaledValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_SCALED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45021,6 +46289,7 @@ public void subscribeMaxScaledValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_SCALED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45046,6 +46315,7 @@ public void subscribeScaledToleranceAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SCALED_TOLERANCE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45071,6 +46341,7 @@ public void subscribeScaleAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SCALE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45096,6 +46367,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45121,6 +46393,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45146,6 +46419,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45171,6 +46445,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45196,6 +46471,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45221,6 +46497,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45299,6 +46576,7 @@ public void subscribeMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45324,6 +46602,7 @@ public void subscribeMinMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45349,6 +46628,7 @@ public void subscribeMaxMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45374,6 +46654,7 @@ public void subscribeToleranceAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TOLERANCE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45399,6 +46680,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45424,6 +46706,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45449,6 +46732,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45474,6 +46758,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45499,6 +46784,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45524,6 +46810,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45602,6 +46889,7 @@ public void subscribeMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45627,6 +46915,7 @@ public void subscribeMinMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45652,6 +46941,7 @@ public void subscribeMaxMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45677,6 +46967,7 @@ public void subscribeToleranceAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TOLERANCE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45702,6 +46993,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45727,6 +47019,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45752,6 +47045,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45777,6 +47071,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45802,6 +47097,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45827,6 +47123,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45901,6 +47198,7 @@ public void subscribeOccupancyAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OCCUPANCY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45926,6 +47224,7 @@ public void subscribeOccupancySensorTypeAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OCCUPANCY_SENSOR_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45951,6 +47250,7 @@ public void subscribeOccupancySensorTypeBitmapAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OCCUPANCY_SENSOR_TYPE_BITMAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -45985,6 +47285,7 @@ public void subscribePIROccupiedToUnoccupiedDelayAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, P_I_R_OCCUPIED_TO_UNOCCUPIED_DELAY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46019,6 +47320,7 @@ public void subscribePIRUnoccupiedToOccupiedDelayAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, P_I_R_UNOCCUPIED_TO_OCCUPIED_DELAY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46053,6 +47355,7 @@ public void subscribePIRUnoccupiedToOccupiedThresholdAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, P_I_R_UNOCCUPIED_TO_OCCUPIED_THRESHOLD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46087,6 +47390,7 @@ public void subscribeUltrasonicOccupiedToUnoccupiedDelayAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ULTRASONIC_OCCUPIED_TO_UNOCCUPIED_DELAY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46121,6 +47425,7 @@ public void subscribeUltrasonicUnoccupiedToOccupiedDelayAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ULTRASONIC_UNOCCUPIED_TO_OCCUPIED_DELAY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46155,6 +47460,7 @@ public void subscribeUltrasonicUnoccupiedToOccupiedThresholdAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ULTRASONIC_UNOCCUPIED_TO_OCCUPIED_THRESHOLD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46189,6 +47495,7 @@ public void subscribePhysicalContactOccupiedToUnoccupiedDelayAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PHYSICAL_CONTACT_OCCUPIED_TO_UNOCCUPIED_DELAY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46223,6 +47530,7 @@ public void subscribePhysicalContactUnoccupiedToOccupiedDelayAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PHYSICAL_CONTACT_UNOCCUPIED_TO_OCCUPIED_DELAY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46257,6 +47565,7 @@ public void subscribePhysicalContactUnoccupiedToOccupiedThresholdAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PHYSICAL_CONTACT_UNOCCUPIED_TO_OCCUPIED_THRESHOLD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46282,6 +47591,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46307,6 +47617,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46332,6 +47643,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46357,6 +47669,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46382,6 +47695,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46407,6 +47721,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46500,6 +47815,7 @@ public void subscribeMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46525,6 +47841,7 @@ public void subscribeMinMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46550,6 +47867,7 @@ public void subscribeMaxMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46575,6 +47893,7 @@ public void subscribePeakMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46600,6 +47919,7 @@ public void subscribePeakMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46625,6 +47945,7 @@ public void subscribeAverageMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46650,6 +47971,7 @@ public void subscribeAverageMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46675,6 +47997,7 @@ public void subscribeUncertaintyAttribute( @Override public void onSuccess(byte[] tlv) { Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNCERTAINTY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46700,6 +48023,7 @@ public void subscribeMeasurementUnitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_UNIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46725,6 +48049,7 @@ public void subscribeMeasurementMediumAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_MEDIUM_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46750,6 +48075,7 @@ public void subscribeLevelValueAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LEVEL_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46775,6 +48101,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46800,6 +48127,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46825,6 +48153,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46850,6 +48179,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46875,6 +48205,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46900,6 +48231,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -46993,6 +48325,7 @@ public void subscribeMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47018,6 +48351,7 @@ public void subscribeMinMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47043,6 +48377,7 @@ public void subscribeMaxMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47068,6 +48403,7 @@ public void subscribePeakMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47093,6 +48429,7 @@ public void subscribePeakMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47118,6 +48455,7 @@ public void subscribeAverageMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47143,6 +48481,7 @@ public void subscribeAverageMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47168,6 +48507,7 @@ public void subscribeUncertaintyAttribute( @Override public void onSuccess(byte[] tlv) { Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNCERTAINTY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47193,6 +48533,7 @@ public void subscribeMeasurementUnitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_UNIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47218,6 +48559,7 @@ public void subscribeMeasurementMediumAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_MEDIUM_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47243,6 +48585,7 @@ public void subscribeLevelValueAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LEVEL_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47268,6 +48611,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47293,6 +48637,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47318,6 +48663,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47343,6 +48689,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47368,6 +48715,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47393,6 +48741,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47486,6 +48835,7 @@ public void subscribeMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47511,6 +48861,7 @@ public void subscribeMinMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47536,6 +48887,7 @@ public void subscribeMaxMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47561,6 +48913,7 @@ public void subscribePeakMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47586,6 +48939,7 @@ public void subscribePeakMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47611,6 +48965,7 @@ public void subscribeAverageMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47636,6 +48991,7 @@ public void subscribeAverageMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47661,6 +49017,7 @@ public void subscribeUncertaintyAttribute( @Override public void onSuccess(byte[] tlv) { Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNCERTAINTY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47686,6 +49043,7 @@ public void subscribeMeasurementUnitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_UNIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47711,6 +49069,7 @@ public void subscribeMeasurementMediumAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_MEDIUM_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47736,6 +49095,7 @@ public void subscribeLevelValueAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LEVEL_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47761,6 +49121,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47786,6 +49147,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47811,6 +49173,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47836,6 +49199,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47861,6 +49225,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47886,6 +49251,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -47979,6 +49345,7 @@ public void subscribeMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48004,6 +49371,7 @@ public void subscribeMinMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48029,6 +49397,7 @@ public void subscribeMaxMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48054,6 +49423,7 @@ public void subscribePeakMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48079,6 +49449,7 @@ public void subscribePeakMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48104,6 +49475,7 @@ public void subscribeAverageMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48129,6 +49501,7 @@ public void subscribeAverageMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48154,6 +49527,7 @@ public void subscribeUncertaintyAttribute( @Override public void onSuccess(byte[] tlv) { Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNCERTAINTY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48179,6 +49553,7 @@ public void subscribeMeasurementUnitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_UNIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48204,6 +49579,7 @@ public void subscribeMeasurementMediumAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_MEDIUM_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48229,6 +49605,7 @@ public void subscribeLevelValueAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LEVEL_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48254,6 +49631,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48279,6 +49657,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48304,6 +49683,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48329,6 +49709,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48354,6 +49735,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48379,6 +49761,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48472,6 +49855,7 @@ public void subscribeMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48497,6 +49881,7 @@ public void subscribeMinMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48522,6 +49907,7 @@ public void subscribeMaxMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48547,6 +49933,7 @@ public void subscribePeakMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48572,6 +49959,7 @@ public void subscribePeakMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48597,6 +49985,7 @@ public void subscribeAverageMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48622,6 +50011,7 @@ public void subscribeAverageMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48647,6 +50037,7 @@ public void subscribeUncertaintyAttribute( @Override public void onSuccess(byte[] tlv) { Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNCERTAINTY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48672,6 +50063,7 @@ public void subscribeMeasurementUnitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_UNIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48697,6 +50089,7 @@ public void subscribeMeasurementMediumAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_MEDIUM_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48722,6 +50115,7 @@ public void subscribeLevelValueAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LEVEL_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48747,6 +50141,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48772,6 +50167,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48797,6 +50193,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48822,6 +50219,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48847,6 +50245,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48872,6 +50271,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48965,6 +50365,7 @@ public void subscribeMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -48990,6 +50391,7 @@ public void subscribeMinMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49015,6 +50417,7 @@ public void subscribeMaxMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49040,6 +50443,7 @@ public void subscribePeakMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49065,6 +50469,7 @@ public void subscribePeakMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49090,6 +50495,7 @@ public void subscribeAverageMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49115,6 +50521,7 @@ public void subscribeAverageMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49140,6 +50547,7 @@ public void subscribeUncertaintyAttribute( @Override public void onSuccess(byte[] tlv) { Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNCERTAINTY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49165,6 +50573,7 @@ public void subscribeMeasurementUnitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_UNIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49190,6 +50599,7 @@ public void subscribeMeasurementMediumAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_MEDIUM_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49215,6 +50625,7 @@ public void subscribeLevelValueAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LEVEL_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49240,6 +50651,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49265,6 +50677,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49290,6 +50703,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49315,6 +50729,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49340,6 +50755,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49365,6 +50781,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49458,6 +50875,7 @@ public void subscribeMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49483,6 +50901,7 @@ public void subscribeMinMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49508,6 +50927,7 @@ public void subscribeMaxMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49533,6 +50953,7 @@ public void subscribePeakMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49558,6 +50979,7 @@ public void subscribePeakMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49583,6 +51005,7 @@ public void subscribeAverageMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49608,6 +51031,7 @@ public void subscribeAverageMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49633,6 +51057,7 @@ public void subscribeUncertaintyAttribute( @Override public void onSuccess(byte[] tlv) { Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNCERTAINTY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49658,6 +51083,7 @@ public void subscribeMeasurementUnitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_UNIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49683,6 +51109,7 @@ public void subscribeMeasurementMediumAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_MEDIUM_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49708,6 +51135,7 @@ public void subscribeLevelValueAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LEVEL_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49733,6 +51161,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49758,6 +51187,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49783,6 +51213,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49808,6 +51239,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49833,6 +51265,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49858,6 +51291,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49951,6 +51385,7 @@ public void subscribeMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -49976,6 +51411,7 @@ public void subscribeMinMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50001,6 +51437,7 @@ public void subscribeMaxMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50026,6 +51463,7 @@ public void subscribePeakMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50051,6 +51489,7 @@ public void subscribePeakMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50076,6 +51515,7 @@ public void subscribeAverageMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50101,6 +51541,7 @@ public void subscribeAverageMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50126,6 +51567,7 @@ public void subscribeUncertaintyAttribute( @Override public void onSuccess(byte[] tlv) { Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNCERTAINTY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50151,6 +51593,7 @@ public void subscribeMeasurementUnitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_UNIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50176,6 +51619,7 @@ public void subscribeMeasurementMediumAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_MEDIUM_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50201,6 +51645,7 @@ public void subscribeLevelValueAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LEVEL_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50226,6 +51671,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50251,6 +51697,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50276,6 +51723,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50301,6 +51749,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50326,6 +51775,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50351,6 +51801,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50444,6 +51895,7 @@ public void subscribeMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50469,6 +51921,7 @@ public void subscribeMinMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50494,6 +51947,7 @@ public void subscribeMaxMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50519,6 +51973,7 @@ public void subscribePeakMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50544,6 +51999,7 @@ public void subscribePeakMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50569,6 +52025,7 @@ public void subscribeAverageMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50594,6 +52051,7 @@ public void subscribeAverageMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50619,6 +52077,7 @@ public void subscribeUncertaintyAttribute( @Override public void onSuccess(byte[] tlv) { Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNCERTAINTY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50644,6 +52103,7 @@ public void subscribeMeasurementUnitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_UNIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50669,6 +52129,7 @@ public void subscribeMeasurementMediumAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_MEDIUM_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50694,6 +52155,7 @@ public void subscribeLevelValueAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LEVEL_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50719,6 +52181,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50744,6 +52207,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50769,6 +52233,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50794,6 +52259,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50819,6 +52285,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50844,6 +52311,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50937,6 +52405,7 @@ public void subscribeMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50962,6 +52431,7 @@ public void subscribeMinMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MIN_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -50987,6 +52457,7 @@ public void subscribeMaxMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MAX_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51012,6 +52483,7 @@ public void subscribePeakMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51037,6 +52509,7 @@ public void subscribePeakMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PEAK_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51062,6 +52535,7 @@ public void subscribeAverageMeasuredValueAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51087,6 +52561,7 @@ public void subscribeAverageMeasuredValueWindowAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_MEASURED_VALUE_WINDOW_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51112,6 +52587,7 @@ public void subscribeUncertaintyAttribute( @Override public void onSuccess(byte[] tlv) { Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNCERTAINTY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51137,6 +52613,7 @@ public void subscribeMeasurementUnitAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_UNIT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51162,6 +52639,7 @@ public void subscribeMeasurementMediumAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_MEDIUM_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51187,6 +52665,7 @@ public void subscribeLevelValueAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LEVEL_VALUE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51212,6 +52691,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51237,6 +52717,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51262,6 +52743,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51287,6 +52769,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51312,6 +52795,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51337,6 +52821,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51401,6 +52886,7 @@ public void subscribeMACAddressAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, M_A_C_ADDRESS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51426,6 +52912,7 @@ public void subscribeLinkLocalAddressAttribute( @Override public void onSuccess(byte[] tlv) { byte[] value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LINK_LOCAL_ADDRESS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51451,6 +52938,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51476,6 +52964,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51501,6 +52990,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51526,6 +53016,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51551,6 +53042,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51576,6 +53068,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51867,6 +53360,7 @@ public void subscribeChannelListAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ChannelClusterChannelInfoStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CHANNEL_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51892,6 +53386,7 @@ public void subscribeLineupAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.ChannelClusterLineupInfoStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LINEUP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51917,6 +53412,7 @@ public void subscribeCurrentChannelAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.ChannelClusterChannelInfoStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_CHANNEL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51942,6 +53438,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51967,6 +53464,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -51992,6 +53490,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -52017,6 +53516,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -52042,6 +53542,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -52067,6 +53568,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -52180,6 +53682,7 @@ public void subscribeTargetListAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.TargetNavigatorClusterTargetInfoStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TARGET_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -52205,6 +53708,7 @@ public void subscribeCurrentTargetAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_TARGET_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -52230,6 +53734,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -52255,6 +53760,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -52280,6 +53786,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -52305,6 +53812,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -52330,6 +53838,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -52355,6 +53864,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -52911,6 +54421,7 @@ public void subscribeCurrentStateAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_STATE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -52936,6 +54447,7 @@ public void subscribeStartTimeAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, START_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -52961,6 +54473,7 @@ public void subscribeDurationAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DURATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -52986,6 +54499,7 @@ public void subscribeSampledPositionAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.MediaPlaybackClusterPlaybackPositionStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SAMPLED_POSITION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53011,6 +54525,7 @@ public void subscribePlaybackSpeedAttribute( @Override public void onSuccess(byte[] tlv) { Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PLAYBACK_SPEED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53036,6 +54551,7 @@ public void subscribeSeekRangeEndAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SEEK_RANGE_END_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53061,6 +54577,7 @@ public void subscribeSeekRangeStartAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SEEK_RANGE_START_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53086,6 +54603,7 @@ public void subscribeActiveAudioTrackAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.MediaPlaybackClusterTrackStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_AUDIO_TRACK_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53111,6 +54629,7 @@ public void subscribeAvailableAudioTracksAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable List<ChipStructs.MediaPlaybackClusterTrackStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVAILABLE_AUDIO_TRACKS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53136,6 +54655,7 @@ public void subscribeActiveTextTrackAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.MediaPlaybackClusterTrackStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_TEXT_TRACK_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53161,6 +54681,7 @@ public void subscribeAvailableTextTracksAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable List<ChipStructs.MediaPlaybackClusterTrackStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVAILABLE_TEXT_TRACKS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53186,6 +54707,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53211,6 +54733,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53236,6 +54759,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53261,6 +54785,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53286,6 +54811,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53311,6 +54837,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53455,6 +54982,7 @@ public void subscribeInputListAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.MediaInputClusterInputInfoStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INPUT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53480,6 +55008,7 @@ public void subscribeCurrentInputAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_INPUT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53505,6 +55034,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53530,6 +55060,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53555,6 +55086,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53580,6 +55112,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53605,6 +55138,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53630,6 +55164,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53708,6 +55243,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53733,6 +55269,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53758,6 +55295,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53783,6 +55321,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53808,6 +55347,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53833,6 +55373,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53929,6 +55470,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53954,6 +55496,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -53979,6 +55522,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54004,6 +55548,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54029,6 +55574,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54054,6 +55600,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54224,6 +55771,7 @@ public void subscribeAcceptHeaderAttribute( @Override public void onSuccess(byte[] tlv) { List<String> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPT_HEADER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54249,6 +55797,7 @@ public void subscribeSupportedStreamingProtocolsAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SUPPORTED_STREAMING_PROTOCOLS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54274,6 +55823,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54299,6 +55849,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54324,6 +55875,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54349,6 +55901,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54374,6 +55927,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54399,6 +55953,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54511,6 +56066,7 @@ public void subscribeOutputListAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.AudioOutputClusterOutputInfoStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OUTPUT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54536,6 +56092,7 @@ public void subscribeCurrentOutputAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_OUTPUT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54561,6 +56118,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54586,6 +56144,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54611,6 +56170,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54636,6 +56196,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54661,6 +56222,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54686,6 +56248,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54877,6 +56440,7 @@ public void subscribeCatalogListAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CATALOG_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54902,6 +56466,7 @@ public void subscribeCurrentAppAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.ApplicationLauncherClusterApplicationEPStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_APP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54927,6 +56492,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54952,6 +56518,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -54977,6 +56544,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55002,6 +56570,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55027,6 +56596,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55052,6 +56622,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55130,6 +56701,7 @@ public void subscribeVendorNameAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, VENDOR_NAME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55155,6 +56727,7 @@ public void subscribeVendorIDAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, VENDOR_I_D_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55180,6 +56753,7 @@ public void subscribeApplicationNameAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, APPLICATION_NAME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55205,6 +56779,7 @@ public void subscribeProductIDAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PRODUCT_I_D_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55230,6 +56805,7 @@ public void subscribeApplicationAttribute( @Override public void onSuccess(byte[] tlv) { ChipStructs.ApplicationBasicClusterApplicationStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, APPLICATION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55255,6 +56831,7 @@ public void subscribeStatusAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, STATUS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55280,6 +56857,7 @@ public void subscribeApplicationVersionAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, APPLICATION_VERSION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55305,6 +56883,7 @@ public void subscribeAllowedVendorListAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ALLOWED_VENDOR_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55330,6 +56909,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55355,6 +56935,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55380,6 +56961,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55405,6 +56987,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55430,6 +57013,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55455,6 +57039,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55590,6 +57175,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55615,6 +57201,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55640,6 +57227,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55665,6 +57253,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55690,6 +57279,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55715,6 +57305,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -55995,6 +57586,7 @@ public void subscribeEnabledAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ENABLED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56020,6 +57612,7 @@ public void subscribeOnDemandRatingsAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ContentControlClusterRatingNameStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ON_DEMAND_RATINGS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56045,6 +57638,7 @@ public void subscribeOnDemandRatingThresholdAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ON_DEMAND_RATING_THRESHOLD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56070,6 +57664,7 @@ public void subscribeScheduledContentRatingsAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.ContentControlClusterRatingNameStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SCHEDULED_CONTENT_RATINGS_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56095,6 +57690,7 @@ public void subscribeScheduledContentRatingThresholdAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SCHEDULED_CONTENT_RATING_THRESHOLD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56120,6 +57716,7 @@ public void subscribeScreenDailyTimeAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, SCREEN_DAILY_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56145,6 +57742,7 @@ public void subscribeRemainingScreenTimeAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REMAINING_SCREEN_TIME_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56170,6 +57768,7 @@ public void subscribeBlockUnratedAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BLOCK_UNRATED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56195,6 +57794,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56220,6 +57820,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56245,6 +57846,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56270,6 +57872,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56295,6 +57898,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56320,6 +57924,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56434,6 +58039,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56459,6 +58065,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56484,6 +58091,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56509,6 +58117,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56534,6 +58143,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56559,6 +58169,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56793,6 +58404,7 @@ public void subscribeMeasurementTypeAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASUREMENT_TYPE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56818,6 +58430,7 @@ public void subscribeDcVoltageAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DC_VOLTAGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56843,6 +58456,7 @@ public void subscribeDcVoltageMinAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DC_VOLTAGE_MIN_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56868,6 +58482,7 @@ public void subscribeDcVoltageMaxAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DC_VOLTAGE_MAX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56893,6 +58508,7 @@ public void subscribeDcCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DC_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56918,6 +58534,7 @@ public void subscribeDcCurrentMinAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DC_CURRENT_MIN_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56943,6 +58560,7 @@ public void subscribeDcCurrentMaxAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DC_CURRENT_MAX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56968,6 +58586,7 @@ public void subscribeDcPowerAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DC_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -56993,6 +58612,7 @@ public void subscribeDcPowerMinAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DC_POWER_MIN_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57018,6 +58638,7 @@ public void subscribeDcPowerMaxAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DC_POWER_MAX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57043,6 +58664,7 @@ public void subscribeDcVoltageMultiplierAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DC_VOLTAGE_MULTIPLIER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57068,6 +58690,7 @@ public void subscribeDcVoltageDivisorAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DC_VOLTAGE_DIVISOR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57093,6 +58716,7 @@ public void subscribeDcCurrentMultiplierAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DC_CURRENT_MULTIPLIER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57118,6 +58742,7 @@ public void subscribeDcCurrentDivisorAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DC_CURRENT_DIVISOR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57143,6 +58768,7 @@ public void subscribeDcPowerMultiplierAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DC_POWER_MULTIPLIER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57168,6 +58794,7 @@ public void subscribeDcPowerDivisorAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, DC_POWER_DIVISOR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57193,6 +58820,7 @@ public void subscribeAcFrequencyAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_FREQUENCY_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57218,6 +58846,7 @@ public void subscribeAcFrequencyMinAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_FREQUENCY_MIN_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57243,6 +58872,7 @@ public void subscribeAcFrequencyMaxAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_FREQUENCY_MAX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57268,6 +58898,7 @@ public void subscribeNeutralCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NEUTRAL_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57293,6 +58924,7 @@ public void subscribeTotalActivePowerAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TOTAL_ACTIVE_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57318,6 +58950,7 @@ public void subscribeTotalReactivePowerAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TOTAL_REACTIVE_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57343,6 +58976,7 @@ public void subscribeTotalApparentPowerAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TOTAL_APPARENT_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57368,6 +59002,7 @@ public void subscribeMeasured1stHarmonicCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED1ST_HARMONIC_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57393,6 +59028,7 @@ public void subscribeMeasured3rdHarmonicCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED3RD_HARMONIC_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57418,6 +59054,7 @@ public void subscribeMeasured5thHarmonicCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED5TH_HARMONIC_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57443,6 +59080,7 @@ public void subscribeMeasured7thHarmonicCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED7TH_HARMONIC_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57468,6 +59106,7 @@ public void subscribeMeasured9thHarmonicCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED9TH_HARMONIC_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57493,6 +59132,7 @@ public void subscribeMeasured11thHarmonicCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED11TH_HARMONIC_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57518,6 +59158,7 @@ public void subscribeMeasuredPhase1stHarmonicCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_PHASE1ST_HARMONIC_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57543,6 +59184,7 @@ public void subscribeMeasuredPhase3rdHarmonicCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_PHASE3RD_HARMONIC_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57568,6 +59210,7 @@ public void subscribeMeasuredPhase5thHarmonicCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_PHASE5TH_HARMONIC_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57593,6 +59236,7 @@ public void subscribeMeasuredPhase7thHarmonicCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_PHASE7TH_HARMONIC_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57618,6 +59262,7 @@ public void subscribeMeasuredPhase9thHarmonicCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_PHASE9TH_HARMONIC_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57643,6 +59288,7 @@ public void subscribeMeasuredPhase11thHarmonicCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEASURED_PHASE11TH_HARMONIC_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57668,6 +59314,7 @@ public void subscribeAcFrequencyMultiplierAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_FREQUENCY_MULTIPLIER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57693,6 +59340,7 @@ public void subscribeAcFrequencyDivisorAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_FREQUENCY_DIVISOR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57718,6 +59366,7 @@ public void subscribePowerMultiplierAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, POWER_MULTIPLIER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57743,6 +59392,7 @@ public void subscribePowerDivisorAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, POWER_DIVISOR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57768,6 +59418,7 @@ public void subscribeHarmonicCurrentMultiplierAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, HARMONIC_CURRENT_MULTIPLIER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57793,6 +59444,7 @@ public void subscribePhaseHarmonicCurrentMultiplierAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, PHASE_HARMONIC_CURRENT_MULTIPLIER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57818,6 +59470,7 @@ public void subscribeInstantaneousVoltageAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INSTANTANEOUS_VOLTAGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57843,6 +59496,7 @@ public void subscribeInstantaneousLineCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INSTANTANEOUS_LINE_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57868,6 +59522,7 @@ public void subscribeInstantaneousActiveCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INSTANTANEOUS_ACTIVE_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57893,6 +59548,7 @@ public void subscribeInstantaneousReactiveCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INSTANTANEOUS_REACTIVE_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57918,6 +59574,7 @@ public void subscribeInstantaneousPowerAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INSTANTANEOUS_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57943,6 +59600,7 @@ public void subscribeRmsVoltageAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57968,6 +59626,7 @@ public void subscribeRmsVoltageMinAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_MIN_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -57993,6 +59652,7 @@ public void subscribeRmsVoltageMaxAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_MAX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58018,6 +59678,7 @@ public void subscribeRmsCurrentAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_CURRENT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58043,6 +59704,7 @@ public void subscribeRmsCurrentMinAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_CURRENT_MIN_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58068,6 +59730,7 @@ public void subscribeRmsCurrentMaxAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_CURRENT_MAX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58093,6 +59756,7 @@ public void subscribeActivePowerAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58118,6 +59782,7 @@ public void subscribeActivePowerMinAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_POWER_MIN_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58143,6 +59808,7 @@ public void subscribeActivePowerMaxAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_POWER_MAX_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58168,6 +59834,7 @@ public void subscribeReactivePowerAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REACTIVE_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58193,6 +59860,7 @@ public void subscribeApparentPowerAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, APPARENT_POWER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58218,6 +59886,7 @@ public void subscribePowerFactorAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, POWER_FACTOR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58252,6 +59921,7 @@ public void subscribeAverageRmsVoltageMeasurementPeriodAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_RMS_VOLTAGE_MEASUREMENT_PERIOD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58286,6 +59956,7 @@ public void subscribeAverageRmsUnderVoltageCounterAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_RMS_UNDER_VOLTAGE_COUNTER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58320,6 +59991,7 @@ public void subscribeRmsExtremeOverVoltagePeriodAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_EXTREME_OVER_VOLTAGE_PERIOD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58354,6 +60026,7 @@ public void subscribeRmsExtremeUnderVoltagePeriodAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_EXTREME_UNDER_VOLTAGE_PERIOD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58388,6 +60061,7 @@ public void subscribeRmsVoltageSagPeriodAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_SAG_PERIOD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58422,6 +60096,7 @@ public void subscribeRmsVoltageSwellPeriodAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_SWELL_PERIOD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58447,6 +60122,7 @@ public void subscribeAcVoltageMultiplierAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_VOLTAGE_MULTIPLIER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58472,6 +60148,7 @@ public void subscribeAcVoltageDivisorAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_VOLTAGE_DIVISOR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58497,6 +60174,7 @@ public void subscribeAcCurrentMultiplierAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_CURRENT_MULTIPLIER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58522,6 +60200,7 @@ public void subscribeAcCurrentDivisorAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_CURRENT_DIVISOR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58547,6 +60226,7 @@ public void subscribeAcPowerMultiplierAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_POWER_MULTIPLIER_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58572,6 +60252,7 @@ public void subscribeAcPowerDivisorAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_POWER_DIVISOR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58606,6 +60287,7 @@ public void subscribeOverloadAlarmsMaskAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OVERLOAD_ALARMS_MASK_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58631,6 +60313,7 @@ public void subscribeVoltageOverloadAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, VOLTAGE_OVERLOAD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58656,6 +60339,7 @@ public void subscribeCurrentOverloadAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CURRENT_OVERLOAD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58690,6 +60374,7 @@ public void subscribeAcOverloadAlarmsMaskAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_OVERLOAD_ALARMS_MASK_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58715,6 +60400,7 @@ public void subscribeAcVoltageOverloadAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_VOLTAGE_OVERLOAD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58740,6 +60426,7 @@ public void subscribeAcCurrentOverloadAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_CURRENT_OVERLOAD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58765,6 +60452,7 @@ public void subscribeAcActivePowerOverloadAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_ACTIVE_POWER_OVERLOAD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58790,6 +60478,7 @@ public void subscribeAcReactivePowerOverloadAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AC_REACTIVE_POWER_OVERLOAD_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58815,6 +60504,7 @@ public void subscribeAverageRmsOverVoltageAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_RMS_OVER_VOLTAGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58840,6 +60530,7 @@ public void subscribeAverageRmsUnderVoltageAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_RMS_UNDER_VOLTAGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58865,6 +60556,7 @@ public void subscribeRmsExtremeOverVoltageAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_EXTREME_OVER_VOLTAGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58890,6 +60582,7 @@ public void subscribeRmsExtremeUnderVoltageAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_EXTREME_UNDER_VOLTAGE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58915,6 +60608,7 @@ public void subscribeRmsVoltageSagAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_SAG_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58940,6 +60634,7 @@ public void subscribeRmsVoltageSwellAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_SWELL_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58965,6 +60660,7 @@ public void subscribeLineCurrentPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LINE_CURRENT_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -58990,6 +60686,7 @@ public void subscribeActiveCurrentPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_CURRENT_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59015,6 +60712,7 @@ public void subscribeReactiveCurrentPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REACTIVE_CURRENT_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59040,6 +60738,7 @@ public void subscribeRmsVoltagePhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59065,6 +60764,7 @@ public void subscribeRmsVoltageMinPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_MIN_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59090,6 +60790,7 @@ public void subscribeRmsVoltageMaxPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_MAX_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59115,6 +60816,7 @@ public void subscribeRmsCurrentPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_CURRENT_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59140,6 +60842,7 @@ public void subscribeRmsCurrentMinPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_CURRENT_MIN_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59165,6 +60868,7 @@ public void subscribeRmsCurrentMaxPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_CURRENT_MAX_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59190,6 +60894,7 @@ public void subscribeActivePowerPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_POWER_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59215,6 +60920,7 @@ public void subscribeActivePowerMinPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_POWER_MIN_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59240,6 +60946,7 @@ public void subscribeActivePowerMaxPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_POWER_MAX_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59265,6 +60972,7 @@ public void subscribeReactivePowerPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REACTIVE_POWER_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59290,6 +60998,7 @@ public void subscribeApparentPowerPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, APPARENT_POWER_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59315,6 +61024,7 @@ public void subscribePowerFactorPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, POWER_FACTOR_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59340,6 +61050,7 @@ public void subscribeAverageRmsVoltageMeasurementPeriodPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_RMS_VOLTAGE_MEASUREMENT_PERIOD_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59365,6 +61076,7 @@ public void subscribeAverageRmsOverVoltageCounterPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_RMS_OVER_VOLTAGE_COUNTER_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59390,6 +61102,7 @@ public void subscribeAverageRmsUnderVoltageCounterPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_RMS_UNDER_VOLTAGE_COUNTER_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59415,6 +61128,7 @@ public void subscribeRmsExtremeOverVoltagePeriodPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_EXTREME_OVER_VOLTAGE_PERIOD_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59440,6 +61154,7 @@ public void subscribeRmsExtremeUnderVoltagePeriodPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_EXTREME_UNDER_VOLTAGE_PERIOD_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59465,6 +61180,7 @@ public void subscribeRmsVoltageSagPeriodPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_SAG_PERIOD_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59490,6 +61206,7 @@ public void subscribeRmsVoltageSwellPeriodPhaseBAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_SWELL_PERIOD_PHASE_B_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59515,6 +61232,7 @@ public void subscribeLineCurrentPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LINE_CURRENT_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59540,6 +61258,7 @@ public void subscribeActiveCurrentPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_CURRENT_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59565,6 +61284,7 @@ public void subscribeReactiveCurrentPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REACTIVE_CURRENT_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59590,6 +61310,7 @@ public void subscribeRmsVoltagePhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59615,6 +61336,7 @@ public void subscribeRmsVoltageMinPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_MIN_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59640,6 +61362,7 @@ public void subscribeRmsVoltageMaxPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_MAX_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59665,6 +61388,7 @@ public void subscribeRmsCurrentPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_CURRENT_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59690,6 +61414,7 @@ public void subscribeRmsCurrentMinPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_CURRENT_MIN_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59715,6 +61440,7 @@ public void subscribeRmsCurrentMaxPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_CURRENT_MAX_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59740,6 +61466,7 @@ public void subscribeActivePowerPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_POWER_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59765,6 +61492,7 @@ public void subscribeActivePowerMinPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_POWER_MIN_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59790,6 +61518,7 @@ public void subscribeActivePowerMaxPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACTIVE_POWER_MAX_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59815,6 +61544,7 @@ public void subscribeReactivePowerPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, REACTIVE_POWER_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59840,6 +61570,7 @@ public void subscribeApparentPowerPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, APPARENT_POWER_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59865,6 +61596,7 @@ public void subscribePowerFactorPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, POWER_FACTOR_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59890,6 +61622,7 @@ public void subscribeAverageRmsVoltageMeasurementPeriodPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_RMS_VOLTAGE_MEASUREMENT_PERIOD_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59915,6 +61648,7 @@ public void subscribeAverageRmsOverVoltageCounterPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_RMS_OVER_VOLTAGE_COUNTER_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59940,6 +61674,7 @@ public void subscribeAverageRmsUnderVoltageCounterPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, AVERAGE_RMS_UNDER_VOLTAGE_COUNTER_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59965,6 +61700,7 @@ public void subscribeRmsExtremeOverVoltagePeriodPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_EXTREME_OVER_VOLTAGE_PERIOD_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -59990,6 +61726,7 @@ public void subscribeRmsExtremeUnderVoltagePeriodPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_EXTREME_UNDER_VOLTAGE_PERIOD_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -60015,6 +61752,7 @@ public void subscribeRmsVoltageSagPeriodPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_SAG_PERIOD_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -60040,6 +61778,7 @@ public void subscribeRmsVoltageSwellPeriodPhaseCAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RMS_VOLTAGE_SWELL_PERIOD_PHASE_C_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -60065,6 +61804,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -60090,6 +61830,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -60115,6 +61856,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -60140,6 +61882,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -60165,6 +61908,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -60190,6 +61934,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -61592,6 +63337,7 @@ public void subscribeBooleanAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BOOLEAN_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -61626,6 +63372,7 @@ public void subscribeBitmap8Attribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BITMAP8_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -61660,6 +63407,7 @@ public void subscribeBitmap16Attribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BITMAP16_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -61694,6 +63442,7 @@ public void subscribeBitmap32Attribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BITMAP32_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -61728,6 +63477,7 @@ public void subscribeBitmap64Attribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, BITMAP64_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -61762,6 +63512,7 @@ public void subscribeInt8uAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT8U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -61796,6 +63547,7 @@ public void subscribeInt16uAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT16U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -61830,6 +63582,7 @@ public void subscribeInt24uAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT24U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -61864,6 +63617,7 @@ public void subscribeInt32uAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT32U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -61898,6 +63652,7 @@ public void subscribeInt40uAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT40U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -61932,6 +63687,7 @@ public void subscribeInt48uAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT48U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -61966,6 +63722,7 @@ public void subscribeInt56uAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT56U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62000,6 +63757,7 @@ public void subscribeInt64uAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT64U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62034,6 +63792,7 @@ public void subscribeInt8sAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT8S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62068,6 +63827,7 @@ public void subscribeInt16sAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT16S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62102,6 +63862,7 @@ public void subscribeInt24sAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT24S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62136,6 +63897,7 @@ public void subscribeInt32sAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT32S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62170,6 +63932,7 @@ public void subscribeInt40sAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT40S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62204,6 +63967,7 @@ public void subscribeInt48sAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT48S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62238,6 +64002,7 @@ public void subscribeInt56sAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT56S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62272,6 +64037,7 @@ public void subscribeInt64sAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, INT64S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62306,6 +64072,7 @@ public void subscribeEnum8Attribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ENUM8_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62340,6 +64107,7 @@ public void subscribeEnum16Attribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ENUM16_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62374,6 +64142,7 @@ public void subscribeFloatSingleAttribute( @Override public void onSuccess(byte[] tlv) { Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FLOAT_SINGLE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62408,6 +64177,7 @@ public void subscribeFloatDoubleAttribute( @Override public void onSuccess(byte[] tlv) { Double value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FLOAT_DOUBLE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62442,6 +64212,7 @@ public void subscribeOctetStringAttribute( @Override public void onSuccess(byte[] tlv) { byte[] value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, OCTET_STRING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62476,6 +64247,7 @@ public void subscribeListInt8uAttribute( @Override public void onSuccess(byte[] tlv) { List<Integer> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LIST_INT8U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62510,6 +64282,7 @@ public void subscribeListOctetStringAttribute( @Override public void onSuccess(byte[] tlv) { List<byte[]> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LIST_OCTET_STRING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62544,6 +64317,7 @@ public void subscribeListStructOctetStringAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.UnitTestingClusterTestListStructOctet> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LIST_STRUCT_OCTET_STRING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62578,6 +64352,7 @@ public void subscribeLongOctetStringAttribute( @Override public void onSuccess(byte[] tlv) { byte[] value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LONG_OCTET_STRING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62612,6 +64387,7 @@ public void subscribeCharStringAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CHAR_STRING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62646,6 +64422,7 @@ public void subscribeLongCharStringAttribute( @Override public void onSuccess(byte[] tlv) { String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LONG_CHAR_STRING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62680,6 +64457,7 @@ public void subscribeEpochUsAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EPOCH_US_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62714,6 +64492,7 @@ public void subscribeEpochSAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EPOCH_S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62748,6 +64527,7 @@ public void subscribeVendorIdAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, VENDOR_ID_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62782,6 +64562,7 @@ public void subscribeListNullablesAndOptionalsStructAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.UnitTestingClusterNullablesAndOptionalsStruct> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LIST_NULLABLES_AND_OPTIONALS_STRUCT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62816,6 +64597,7 @@ public void subscribeEnumAttrAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ENUM_ATTR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62850,6 +64632,7 @@ public void subscribeStructAttrAttribute( @Override public void onSuccess(byte[] tlv) { ChipStructs.UnitTestingClusterSimpleStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, STRUCT_ATTR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62884,6 +64667,7 @@ public void subscribeRangeRestrictedInt8uAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RANGE_RESTRICTED_INT8U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62918,6 +64702,7 @@ public void subscribeRangeRestrictedInt8sAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RANGE_RESTRICTED_INT8S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62952,6 +64737,7 @@ public void subscribeRangeRestrictedInt16uAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RANGE_RESTRICTED_INT16U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -62986,6 +64772,7 @@ public void subscribeRangeRestrictedInt16sAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, RANGE_RESTRICTED_INT16S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63020,6 +64807,7 @@ public void subscribeListLongOctetStringAttribute( @Override public void onSuccess(byte[] tlv) { List<byte[]> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LIST_LONG_OCTET_STRING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63059,6 +64847,7 @@ public void subscribeListFabricScopedAttribute( @Override public void onSuccess(byte[] tlv) { List<ChipStructs.UnitTestingClusterTestFabricScoped> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, LIST_FABRIC_SCOPED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63089,6 +64878,7 @@ public void subscribeTimedWriteBooleanAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, TIMED_WRITE_BOOLEAN_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63123,6 +64913,7 @@ public void subscribeGeneralErrorBooleanAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERAL_ERROR_BOOLEAN_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63157,6 +64948,7 @@ public void subscribeClusterErrorBooleanAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_ERROR_BOOLEAN_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63191,6 +64983,7 @@ public void subscribeUnsupportedAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, UNSUPPORTED_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63225,6 +65018,7 @@ public void subscribeNullableBooleanAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_BOOLEAN_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63259,6 +65053,7 @@ public void subscribeNullableBitmap8Attribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_BITMAP8_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63293,6 +65088,7 @@ public void subscribeNullableBitmap16Attribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_BITMAP16_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63327,6 +65123,7 @@ public void subscribeNullableBitmap32Attribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_BITMAP32_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63361,6 +65158,7 @@ public void subscribeNullableBitmap64Attribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_BITMAP64_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63395,6 +65193,7 @@ public void subscribeNullableInt8uAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT8U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63429,6 +65228,7 @@ public void subscribeNullableInt16uAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT16U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63463,6 +65263,7 @@ public void subscribeNullableInt24uAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT24U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63497,6 +65298,7 @@ public void subscribeNullableInt32uAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT32U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63531,6 +65333,7 @@ public void subscribeNullableInt40uAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT40U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63565,6 +65368,7 @@ public void subscribeNullableInt48uAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT48U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63599,6 +65403,7 @@ public void subscribeNullableInt56uAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT56U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63633,6 +65438,7 @@ public void subscribeNullableInt64uAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT64U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63667,6 +65473,7 @@ public void subscribeNullableInt8sAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT8S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63701,6 +65508,7 @@ public void subscribeNullableInt16sAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT16S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63735,6 +65543,7 @@ public void subscribeNullableInt24sAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT24S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63769,6 +65578,7 @@ public void subscribeNullableInt32sAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT32S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63803,6 +65613,7 @@ public void subscribeNullableInt40sAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT40S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63837,6 +65648,7 @@ public void subscribeNullableInt48sAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT48S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63871,6 +65683,7 @@ public void subscribeNullableInt56sAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT56S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63905,6 +65718,7 @@ public void subscribeNullableInt64sAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_INT64S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63939,6 +65753,7 @@ public void subscribeNullableEnum8Attribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_ENUM8_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -63973,6 +65788,7 @@ public void subscribeNullableEnum16Attribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_ENUM16_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64007,6 +65823,7 @@ public void subscribeNullableFloatSingleAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Float value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_FLOAT_SINGLE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64041,6 +65858,7 @@ public void subscribeNullableFloatDoubleAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Double value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_FLOAT_DOUBLE_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64075,6 +65893,7 @@ public void subscribeNullableOctetStringAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable byte[] value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_OCTET_STRING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64109,6 +65928,7 @@ public void subscribeNullableCharStringAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable String value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_CHAR_STRING_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64143,6 +65963,7 @@ public void subscribeNullableEnumAttrAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_ENUM_ATTR_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64177,6 +65998,7 @@ public void subscribeNullableStructAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable ChipStructs.UnitTestingClusterSimpleStruct value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_STRUCT_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64211,6 +66033,7 @@ public void subscribeNullableRangeRestrictedInt8uAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_RANGE_RESTRICTED_INT8U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64245,6 +66068,7 @@ public void subscribeNullableRangeRestrictedInt8sAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_RANGE_RESTRICTED_INT8S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64279,6 +66103,7 @@ public void subscribeNullableRangeRestrictedInt16uAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_RANGE_RESTRICTED_INT16U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64313,6 +66138,7 @@ public void subscribeNullableRangeRestrictedInt16sAttribute( @Override public void onSuccess(byte[] tlv) { @Nullable Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, NULLABLE_RANGE_RESTRICTED_INT16S_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64347,6 +66173,7 @@ public void subscribeWriteOnlyInt8uAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, WRITE_ONLY_INT8U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64381,6 +66208,7 @@ public void subscribeMeiInt8uAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, MEI_INT8U_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64406,6 +66234,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64431,6 +66260,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64456,6 +66286,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64481,6 +66312,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64506,6 +66338,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64531,6 +66364,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64657,6 +66491,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64682,6 +66517,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64707,6 +66543,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64732,6 +66569,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64757,6 +66595,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64782,6 +66621,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64908,6 +66748,7 @@ public void subscribeFlipFlopAttribute( @Override public void onSuccess(byte[] tlv) { Boolean value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FLIP_FLOP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64933,6 +66774,7 @@ public void subscribeGeneratedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, GENERATED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64958,6 +66800,7 @@ public void subscribeAcceptedCommandListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ACCEPTED_COMMAND_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -64983,6 +66826,7 @@ public void subscribeEventListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, EVENT_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -65008,6 +66852,7 @@ public void subscribeAttributeListAttribute( @Override public void onSuccess(byte[] tlv) { List<Long> value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, ATTRIBUTE_LIST_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -65033,6 +66878,7 @@ public void subscribeFeatureMapAttribute( @Override public void onSuccess(byte[] tlv) { Long value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, FEATURE_MAP_ATTRIBUTE_ID, minInterval, maxInterval); } @@ -65058,6 +66904,7 @@ public void subscribeClusterRevisionAttribute( @Override public void onSuccess(byte[] tlv) { Integer value = ChipTLVValueDecoder.decodeAttributeValue(path, tlv); + callback.onSuccess(value); } }, CLUSTER_REVISION_ATTRIBUTE_ID, minInterval, maxInterval); } From a4b59cb7944ba9be7e95423923aa89dbaada588c Mon Sep 17 00:00:00 2001 From: Pradip De <pradipd@google.com> Date: Fri, 26 Apr 2024 21:01:45 +0000 Subject: [PATCH 064/124] Bring PR #31776(Adjust storage for large payloads) from tcp branch to master (#33001) * Adjust storage and processing in SystemPacketBuffer (#31776) and associated code for large payloads. Extend uint16_t type variables to size_t for the APIs and all applicable places. * Address review comments --- src/app/BufferedReadCallback.cpp | 2 +- src/app/server/EchoHandler.cpp | 3 +- src/ble/BtpEngine.cpp | 17 +-- src/ble/tests/TestBtpEngine.cpp | 24 ++-- src/inet/TCPEndPoint.cpp | 8 +- src/inet/TCPEndPoint.h | 8 +- src/inet/TCPEndPointImplLwIP.cpp | 13 +- src/inet/TCPEndPointImplLwIP.h | 2 +- src/inet/TCPEndPointImplOpenThread.cpp | 2 +- src/inet/TCPEndPointImplOpenThread.h | 2 +- src/inet/TCPEndPointImplSockets.cpp | 9 +- src/inet/TCPEndPointImplSockets.h | 4 +- src/inet/UDPEndPointImplLwIP.cpp | 2 +- src/inet/UDPEndPointImplOpenThread.cpp | 4 +- src/inet/UDPEndPointImplSockets.cpp | 9 +- src/inet/tests/TestInetLayer.cpp | 2 +- src/inet/tests/TestInetLayerCommon.cpp | 48 ++++---- src/lib/core/tests/TestTLV.cpp | 8 +- src/messaging/tests/echo/echo_requester.cpp | 5 +- src/messaging/tests/echo/echo_responder.cpp | 2 +- src/platform/ESP32/nimble/BLEManagerImpl.cpp | 7 +- src/platform/Zephyr/BLEManagerImpl.cpp | 8 +- src/platform/android/BLEManagerImpl.cpp | 4 +- .../bouffalolab/common/BLEManagerImpl.cpp | 10 +- src/platform/mbed/BLEManagerImpl.cpp | 6 +- src/protocols/secure_channel/CASESession.cpp | 4 +- .../UserDirectedCommissioningClient.cpp | 2 +- .../UserDirectedCommissioningServer.cpp | 2 +- src/system/SystemPacketBuffer.cpp | 113 +++++++++++++----- src/system/SystemPacketBuffer.h | 42 +++---- src/system/TLVPacketBufferBackingStore.cpp | 16 ++- src/system/tests/TestSystemPacketBuffer.cpp | 99 ++++++++------- .../tests/TestTLVPacketBufferBackingStore.cpp | 6 +- src/transport/SecureMessageCodec.cpp | 14 +-- src/transport/SessionManager.cpp | 2 +- src/transport/raw/MessageHeader.cpp | 14 +-- src/transport/raw/MessageHeader.h | 20 ++-- 37 files changed, 316 insertions(+), 227 deletions(-) diff --git a/src/app/BufferedReadCallback.cpp b/src/app/BufferedReadCallback.cpp index da38d0b38418bb..3752a3e65aef08 100644 --- a/src/app/BufferedReadCallback.cpp +++ b/src/app/BufferedReadCallback.cpp @@ -65,7 +65,7 @@ CHIP_ERROR BufferedReadCallback::GenerateListTLV(TLV::ScopedBufferTLVReader & aR // // To avoid that, a single contiguous buffer is the best likely approach for now. // - uint32_t totalBufSize = 0; + size_t totalBufSize = 0; for (const auto & packetBuffer : mBufferedList) { totalBufSize += packetBuffer->TotalLength(); diff --git a/src/app/server/EchoHandler.cpp b/src/app/server/EchoHandler.cpp index 2f9323426943b6..975b1c60a94d36 100644 --- a/src/app/server/EchoHandler.cpp +++ b/src/app/server/EchoHandler.cpp @@ -40,7 +40,8 @@ chip::Protocols::Echo::EchoServer gEchoServer; */ void HandleEchoRequestReceived(chip::Messaging::ExchangeContext * ec, chip::System::PacketBufferHandle && payload) { - ChipLogProgress(AppServer, "Echo Request, len=%u ... sending response.\n", payload->DataLength()); + ChipLogProgress(AppServer, "Echo Request, len=%" PRIu32 "... sending response.\n", + static_cast<uint32_t>(payload->DataLength())); } } // namespace diff --git a/src/ble/BtpEngine.cpp b/src/ble/BtpEngine.cpp index 3a11c61ea75de9..59cc73222e5722 100644 --- a/src/ble/BtpEngine.cpp +++ b/src/ble/BtpEngine.cpp @@ -34,6 +34,7 @@ #include <lib/support/BitFlags.h> #include <lib/support/BufferReader.h> #include <lib/support/CodeUtils.h> +#include <lib/support/SafeInt.h> #include <lib/support/logging/CHIPLogging.h> #include <system/SystemPacketBuffer.h> @@ -282,7 +283,7 @@ CHIP_ERROR BtpEngine::HandleCharacteristicReceived(System::PacketBufferHandle && // mRxFragmentSize may be smaller than the characteristic size. Make sure // we're not truncating to a data length smaller than what we have already consumed. VerifyOrExit(reader.OctetsRead() <= mRxFragmentSize, err = BLE_ERROR_REASSEMBLER_INCORRECT_STATE); - data->SetDataLength(chip::min(data->DataLength(), mRxFragmentSize)); + data->SetDataLength(chip::min(data->DataLength(), static_cast<size_t>(mRxFragmentSize))); // Now mark the bytes we consumed as consumed. data->ConsumeHead(static_cast<uint16_t>(reader.OctetsRead())); @@ -346,11 +347,12 @@ CHIP_ERROR BtpEngine::HandleCharacteristicReceived(System::PacketBufferHandle && if (rx_flags.Has(HeaderFlags::kEndMessage)) { // Trim remainder, if any, of the received packet buffer based on sender-specified length of reassembled message. - int padding = mRxBuf->DataLength() - mRxLength; + VerifyOrExit(CanCastTo<uint16_t>(mRxBuf->DataLength()), err = CHIP_ERROR_MESSAGE_TOO_LONG); + int padding = static_cast<uint16_t>(mRxBuf->DataLength()) - mRxLength; if (padding > 0) { - mRxBuf->SetDataLength(mRxLength); + mRxBuf->SetDataLength(static_cast<size_t>(mRxLength)); } // Ensure all received fragments add up to sender-specified total message size. @@ -375,7 +377,7 @@ CHIP_ERROR BtpEngine::HandleCharacteristicReceived(System::PacketBufferHandle && } if (!mRxBuf.IsNull()) { - ChipLogError(Ble, "With rx buf data length = %u", mRxBuf->DataLength()); + ChipLogError(Ble, "With rx buf data length = %u", static_cast<unsigned>(mRxBuf->DataLength())); } LogState(); @@ -426,9 +428,10 @@ bool BtpEngine::HandleCharacteristicSend(System::PacketBufferHandle data, bool s return false; } - mTxBuf = std::move(data); - mTxState = kState_InProgress; - mTxLength = mTxBuf->DataLength(); + mTxBuf = std::move(data); + mTxState = kState_InProgress; + VerifyOrReturnError(CanCastTo<uint16_t>(mTxBuf->DataLength()), false); + mTxLength = static_cast<uint16_t>(mTxBuf->DataLength()); ChipLogDebugBtpEngine(Ble, ">>> CHIPoBle preparing to send whole message:"); PrintBufDebug(mTxBuf); diff --git a/src/ble/tests/TestBtpEngine.cpp b/src/ble/tests/TestBtpEngine.cpp index b799ff40e48f75..2b8fb1ff84b562 100644 --- a/src/ble/tests/TestBtpEngine.cpp +++ b/src/ble/tests/TestBtpEngine.cpp @@ -67,7 +67,7 @@ TEST_F(TestBtpEngine, HandleCharacteristicReceivedOnePacket) }; auto packet0 = System::PacketBufferHandle::NewWithData(packetData0, sizeof(packetData0)); - EXPECT_EQ(packet0->DataLength(), 5); + EXPECT_EQ(packet0->DataLength(), static_cast<size_t>(5)); SequenceNumber_t receivedAck; bool didReceiveAck; @@ -81,7 +81,7 @@ TEST_F(TestBtpEngine, HandleCharacteristicReceivedTwoPacket) constexpr uint8_t packetData1[] = { to_underlying(BtpEngine::HeaderFlags::kEndMessage), 0x02, 0xff }; auto packet0 = System::PacketBufferHandle::NewWithData(packetData0, sizeof(packetData0)); - EXPECT_EQ(packet0->DataLength(), 5); + EXPECT_EQ(packet0->DataLength(), static_cast<size_t>(5)); SequenceNumber_t receivedAck; bool didReceiveAck; @@ -89,7 +89,7 @@ TEST_F(TestBtpEngine, HandleCharacteristicReceivedTwoPacket) EXPECT_EQ(mBtpEngine.RxState(), BtpEngine::kState_InProgress); auto packet1 = System::PacketBufferHandle::NewWithData(packetData1, sizeof(packetData1)); - EXPECT_EQ(packet1->DataLength(), 3); + EXPECT_EQ(packet1->DataLength(), static_cast<size_t>(3)); EXPECT_EQ(mBtpEngine.HandleCharacteristicReceived(std::move(packet1), receivedAck, didReceiveAck), CHIP_NO_ERROR); EXPECT_EQ(mBtpEngine.RxState(), BtpEngine::kState_Complete); @@ -102,7 +102,7 @@ TEST_F(TestBtpEngine, HandleCharacteristicReceivedThreePacket) constexpr uint8_t packetData2[] = { to_underlying(BtpEngine::HeaderFlags::kEndMessage), 0x03, 0xff }; auto packet0 = System::PacketBufferHandle::NewWithData(packetData0, sizeof(packetData0)); - EXPECT_EQ(packet0->DataLength(), 5); + EXPECT_EQ(packet0->DataLength(), static_cast<size_t>(5)); SequenceNumber_t receivedAck; bool didReceiveAck; @@ -110,13 +110,13 @@ TEST_F(TestBtpEngine, HandleCharacteristicReceivedThreePacket) EXPECT_EQ(mBtpEngine.RxState(), BtpEngine::kState_InProgress); auto packet1 = System::PacketBufferHandle::NewWithData(packetData1, sizeof(packetData1)); - EXPECT_EQ(packet1->DataLength(), 3); + EXPECT_EQ(packet1->DataLength(), static_cast<size_t>(3)); EXPECT_EQ(mBtpEngine.HandleCharacteristicReceived(std::move(packet1), receivedAck, didReceiveAck), CHIP_NO_ERROR); EXPECT_EQ(mBtpEngine.RxState(), BtpEngine::kState_InProgress); auto packet2 = System::PacketBufferHandle::NewWithData(packetData2, sizeof(packetData2)); - EXPECT_EQ(packet2->DataLength(), 3); + EXPECT_EQ(packet2->DataLength(), static_cast<size_t>(3)); EXPECT_EQ(mBtpEngine.HandleCharacteristicReceived(std::move(packet2), receivedAck, didReceiveAck), CHIP_NO_ERROR); EXPECT_EQ(mBtpEngine.RxState(), BtpEngine::kState_Complete); @@ -133,7 +133,7 @@ TEST_F(TestBtpEngine, HandleCharacteristicSendOnePacket) EXPECT_TRUE(mBtpEngine.HandleCharacteristicSend(packet0.Retain(), false)); EXPECT_EQ(mBtpEngine.TxState(), BtpEngine::kState_Complete); - EXPECT_EQ(packet0->DataLength(), 5); + EXPECT_EQ(packet0->DataLength(), static_cast<size_t>(5)); } TEST_F(TestBtpEngine, HandleCharacteristicSendTwoPacket) @@ -147,11 +147,11 @@ TEST_F(TestBtpEngine, HandleCharacteristicSendTwoPacket) EXPECT_TRUE(mBtpEngine.HandleCharacteristicSend(packet0.Retain(), false)); EXPECT_EQ(mBtpEngine.TxState(), BtpEngine::kState_InProgress); - EXPECT_EQ(packet0->DataLength(), 20); + EXPECT_EQ(packet0->DataLength(), static_cast<size_t>(20)); EXPECT_TRUE(mBtpEngine.HandleCharacteristicSend(nullptr, false)); EXPECT_EQ(mBtpEngine.TxState(), BtpEngine::kState_Complete); - EXPECT_EQ(packet0->DataLength(), 16); + EXPECT_EQ(packet0->DataLength(), static_cast<size_t>(16)); } // Send 40-byte payload. @@ -169,15 +169,15 @@ TEST_F(TestBtpEngine, HandleCharacteristicSendThreePacket) EXPECT_TRUE(mBtpEngine.HandleCharacteristicSend(packet0.Retain(), false)); EXPECT_EQ(mBtpEngine.TxState(), BtpEngine::kState_InProgress); - EXPECT_EQ(packet0->DataLength(), 20); + EXPECT_EQ(packet0->DataLength(), static_cast<size_t>(20)); EXPECT_TRUE(mBtpEngine.HandleCharacteristicSend(nullptr, false)); EXPECT_EQ(mBtpEngine.TxState(), BtpEngine::kState_InProgress); - EXPECT_EQ(packet0->DataLength(), 20); + EXPECT_EQ(packet0->DataLength(), static_cast<size_t>(20)); EXPECT_TRUE(mBtpEngine.HandleCharacteristicSend(nullptr, false)); EXPECT_EQ(mBtpEngine.TxState(), BtpEngine::kState_Complete); - EXPECT_EQ(packet0->DataLength(), 8); + EXPECT_EQ(packet0->DataLength(), static_cast<size_t>(8)); } } // namespace diff --git a/src/inet/TCPEndPoint.cpp b/src/inet/TCPEndPoint.cpp index 15b14151a235ce..7fed0b0c26a1ec 100644 --- a/src/inet/TCPEndPoint.cpp +++ b/src/inet/TCPEndPoint.cpp @@ -126,7 +126,7 @@ CHIP_ERROR TCPEndPoint::SetReceivedDataForTesting(System::PacketBufferHandle && return CHIP_NO_ERROR; } -uint32_t TCPEndPoint::PendingSendLength() +size_t TCPEndPoint::PendingSendLength() { if (!mSendQueue.IsNull()) { @@ -135,7 +135,7 @@ uint32_t TCPEndPoint::PendingSendLength() return 0; } -uint32_t TCPEndPoint::PendingReceiveLength() +size_t TCPEndPoint::PendingReceiveLength() { if (!mRcvQueue.IsNull()) { @@ -333,8 +333,8 @@ void TCPEndPoint::DriveReceiving() { // Acknowledgement is done after handling the buffers to allow the // application processing to throttle flow. - uint16_t ackLength = mRcvQueue->TotalLength(); - CHIP_ERROR err = OnDataReceived(this, std::move(mRcvQueue)); + size_t ackLength = mRcvQueue->TotalLength(); + CHIP_ERROR err = OnDataReceived(this, std::move(mRcvQueue)); if (err != CHIP_NO_ERROR) { DoClose(err, false); diff --git a/src/inet/TCPEndPoint.h b/src/inet/TCPEndPoint.h index 0e4c17b12d5876..0c00e327cc3d71 100644 --- a/src/inet/TCPEndPoint.h +++ b/src/inet/TCPEndPoint.h @@ -274,7 +274,7 @@ class DLL_EXPORT TCPEndPoint : public EndPointBasis<TCPEndPoint> * received. The operational semantics are undefined if \c len is larger * than the total outstanding unacknowledged received data. */ - virtual CHIP_ERROR AckReceive(uint16_t len) = 0; + virtual CHIP_ERROR AckReceive(size_t len) = 0; /** * @brief Set the receive queue, for testing. @@ -295,7 +295,7 @@ class DLL_EXPORT TCPEndPoint : public EndPointBasis<TCPEndPoint> * * @return Number of untransmitted bytes in the transmit queue. */ - uint32_t PendingSendLength(); + size_t PendingSendLength(); /** * @brief Extract the length of the unacknowledged receive data. @@ -303,7 +303,7 @@ class DLL_EXPORT TCPEndPoint : public EndPointBasis<TCPEndPoint> * @return Number of bytes in the receive queue that have not yet been * acknowledged with <tt>AckReceive(uint16_t len)</tt>. */ - uint32_t PendingReceiveLength(); + size_t PendingReceiveLength(); /** * @brief Initiate TCP half close, in other words, finished with sending. @@ -447,7 +447,7 @@ class DLL_EXPORT TCPEndPoint : public EndPointBasis<TCPEndPoint> * is the length of the message text added to the TCP transmit window, * which are eligible for sending by the underlying network stack. */ - typedef void (*OnDataSentFunct)(TCPEndPoint * endPoint, uint16_t len); + typedef void (*OnDataSentFunct)(TCPEndPoint * endPoint, size_t len); /** * The endpoint's message text transmission event handling function diff --git a/src/inet/TCPEndPointImplLwIP.cpp b/src/inet/TCPEndPointImplLwIP.cpp index 02e5ac97b46d16..763f2eb9613078 100644 --- a/src/inet/TCPEndPointImplLwIP.cpp +++ b/src/inet/TCPEndPointImplLwIP.cpp @@ -350,8 +350,8 @@ CHIP_ERROR TCPEndPointImplLwIP::DriveSendingImpl() do { VerifyOrDie(!startOfUnsent.buffer.IsNull()); - - uint16_t bufDataLen = startOfUnsent.buffer->DataLength(); + VerifyOrDie(CanCastTo<uint16_t>(startOfUnsent.buffer->DataLength())); + uint16_t bufDataLen = static_cast<uint16_t>(startOfUnsent.buffer->DataLength()); // Get a pointer to the start of unsent data within the first buffer on the unsent queue. const uint8_t * sendData = startOfUnsent.buffer->Start() + startOfUnsent.offset; @@ -503,16 +503,18 @@ void TCPEndPointImplLwIP::DoCloseImpl(CHIP_ERROR err, State oldState) } } -CHIP_ERROR TCPEndPointImplLwIP::AckReceive(uint16_t len) +CHIP_ERROR TCPEndPointImplLwIP::AckReceive(size_t len) { VerifyOrReturnError(IsConnected(), CHIP_ERROR_INCORRECT_STATE); CHIP_ERROR res = CHIP_NO_ERROR; + VerifyOrReturnError(CanCastTo<uint16_t>(len), CHIP_ERROR_INVALID_ARGUMENT); + // Lock LwIP stack LOCK_TCPIP_CORE(); if (mTCP != nullptr) - tcp_recved(mTCP, len); + tcp_recved(mTCP, static_cast<uint16_t>(len)); else res = CHIP_ERROR_CONNECTION_ABORTED; @@ -570,7 +572,8 @@ TCPEndPointImplLwIP::BufferOffset TCPEndPointImplLwIP::FindStartOfUnsent() while (leftToSkip > 0) { VerifyOrDie(!startOfUnsent.buffer.IsNull()); - uint16_t bufDataLen = startOfUnsent.buffer->DataLength(); + VerifyOrDie(CanCastTo<uint16_t>(startOfUnsent.buffer->DataLength())); + uint16_t bufDataLen = static_cast<uint16_t>(startOfUnsent.buffer->DataLength()); if (leftToSkip >= bufDataLen) { // We have more to skip than current packet buffer size. diff --git a/src/inet/TCPEndPointImplLwIP.h b/src/inet/TCPEndPointImplLwIP.h index b680f86b3b64e5..86a151f591d303 100644 --- a/src/inet/TCPEndPointImplLwIP.h +++ b/src/inet/TCPEndPointImplLwIP.h @@ -51,7 +51,7 @@ class TCPEndPointImplLwIP : public TCPEndPoint, public EndPointStateLwIP CHIP_ERROR EnableNoDelay() override; CHIP_ERROR EnableKeepAlive(uint16_t interval, uint16_t timeoutCount) override; CHIP_ERROR DisableKeepAlive() override; - CHIP_ERROR AckReceive(uint16_t len) override; + CHIP_ERROR AckReceive(size_t len) override; #if INET_CONFIG_OVERRIDE_SYSTEM_TCP_USER_TIMEOUT void TCPUserTimeoutHandler() override; #endif // INET_CONFIG_OVERRIDE_SYSTEM_TCP_USER_TIMEOUT diff --git a/src/inet/TCPEndPointImplOpenThread.cpp b/src/inet/TCPEndPointImplOpenThread.cpp index 36522ca3c47459..97943787dcf1e7 100644 --- a/src/inet/TCPEndPointImplOpenThread.cpp +++ b/src/inet/TCPEndPointImplOpenThread.cpp @@ -54,7 +54,7 @@ CHIP_ERROR TCPEndPointImplOT::DisableKeepAlive() { return CHIP_ERROR_NOT_IMPLEMENTED; } -CHIP_ERROR TCPEndPointImplOT::AckReceive(uint16_t len) +CHIP_ERROR TCPEndPointImplOT::AckReceive(size_t len) { return CHIP_ERROR_NOT_IMPLEMENTED; } diff --git a/src/inet/TCPEndPointImplOpenThread.h b/src/inet/TCPEndPointImplOpenThread.h index c62c63cdc85f55..007d3cfb118bee 100644 --- a/src/inet/TCPEndPointImplOpenThread.h +++ b/src/inet/TCPEndPointImplOpenThread.h @@ -46,7 +46,7 @@ class TCPEndPointImplOT : public TCPEndPoint, public EndPointStateOpenThread CHIP_ERROR EnableNoDelay() override; CHIP_ERROR EnableKeepAlive(uint16_t interval, uint16_t timeoutCount) override; CHIP_ERROR DisableKeepAlive() override; - CHIP_ERROR AckReceive(uint16_t len) override; + CHIP_ERROR AckReceive(size_t len) override; #if INET_CONFIG_OVERRIDE_SYSTEM_TCP_USER_TIMEOUT void TCPUserTimeoutHandler() override; #endif // INET_CONFIG_OVERRIDE_SYSTEM_TCP_USER_TIMEOUT diff --git a/src/inet/TCPEndPointImplSockets.cpp b/src/inet/TCPEndPointImplSockets.cpp index fc8c6e2da2a77e..d21c11b6a42865 100644 --- a/src/inet/TCPEndPointImplSockets.cpp +++ b/src/inet/TCPEndPointImplSockets.cpp @@ -441,7 +441,7 @@ CHIP_ERROR TCPEndPointImplSockets::DisableKeepAlive() return CHIP_NO_ERROR; } -CHIP_ERROR TCPEndPointImplSockets::AckReceive(uint16_t len) +CHIP_ERROR TCPEndPointImplSockets::AckReceive(size_t len) { VerifyOrReturnError(IsConnected(), CHIP_ERROR_INCORRECT_STATE); @@ -483,7 +483,7 @@ CHIP_ERROR TCPEndPointImplSockets::DriveSendingImpl() while (!mSendQueue.IsNull()) { - uint16_t bufLen = mSendQueue->DataLength(); + size_t bufLen = mSendQueue->DataLength(); ssize_t lenSentRaw = send(mSocket, mSendQueue->Start(), bufLen, sendFlags); @@ -496,14 +496,13 @@ CHIP_ERROR TCPEndPointImplSockets::DriveSendingImpl() break; } - if (lenSentRaw < 0 || lenSentRaw > bufLen) + if (lenSentRaw < 0 || bufLen < static_cast<size_t>(lenSentRaw)) { err = CHIP_ERROR_INCORRECT_STATE; break; } - // Cast is safe because bufLen is uint16_t. - uint16_t lenSent = static_cast<uint16_t>(lenSentRaw); + size_t lenSent = static_cast<size_t>(lenSentRaw); // Mark the connection as being active. MarkActive(); diff --git a/src/inet/TCPEndPointImplSockets.h b/src/inet/TCPEndPointImplSockets.h index 40e81eeb6a0d06..1d9b86b1c9bb66 100644 --- a/src/inet/TCPEndPointImplSockets.h +++ b/src/inet/TCPEndPointImplSockets.h @@ -46,7 +46,7 @@ class TCPEndPointImplSockets : public TCPEndPoint, public EndPointStateSockets CHIP_ERROR EnableNoDelay() override; CHIP_ERROR EnableKeepAlive(uint16_t interval, uint16_t timeoutCount) override; CHIP_ERROR DisableKeepAlive() override; - CHIP_ERROR AckReceive(uint16_t len) override; + CHIP_ERROR AckReceive(size_t len) override; #if INET_CONFIG_OVERRIDE_SYSTEM_TCP_USER_TIMEOUT void TCPUserTimeoutHandler() override; #endif // INET_CONFIG_OVERRIDE_SYSTEM_TCP_USER_TIMEOUT @@ -72,7 +72,7 @@ class TCPEndPointImplSockets : public TCPEndPoint, public EndPointStateSockets #if INET_CONFIG_OVERRIDE_SYSTEM_TCP_USER_TIMEOUT /// This counts the number of bytes written on the TCP socket since thelast probe into the TCP outqueue was made. - uint32_t mBytesWrittenSinceLastProbe; + size_t mBytesWrittenSinceLastProbe; /// This is the measured size(in bytes) of the kernel TCP send queue at the end of the last user timeout window. uint32_t mLastTCPKernelSendQueueLen; diff --git a/src/inet/UDPEndPointImplLwIP.cpp b/src/inet/UDPEndPointImplLwIP.cpp index 7627ff667db57d..9d0d3bb396f482 100755 --- a/src/inet/UDPEndPointImplLwIP.cpp +++ b/src/inet/UDPEndPointImplLwIP.cpp @@ -352,7 +352,7 @@ void UDPEndPointImplLwIP::LwIPReceiveUDPMessage(void * arg, struct udp_pcb * pcb if (buf->HasChainedBuffer()) { // Have to allocate a new big-enough buffer and copy. - uint16_t messageSize = buf->TotalLength(); + size_t messageSize = buf->TotalLength(); System::PacketBufferHandle copy = System::PacketBufferHandle::New(messageSize, 0); if (copy.IsNull() || buf->Read(copy->Start(), messageSize) != CHIP_NO_ERROR) { diff --git a/src/inet/UDPEndPointImplOpenThread.cpp b/src/inet/UDPEndPointImplOpenThread.cpp index 073f633bd8a38c..7c6ecb80cacbe1 100644 --- a/src/inet/UDPEndPointImplOpenThread.cpp +++ b/src/inet/UDPEndPointImplOpenThread.cpp @@ -225,7 +225,7 @@ CHIP_ERROR UDPEndPointImplOT::SendMsgImpl(const IPPacketInfo * aPktInfo, System: otMessageInfo messageInfo; // For now the entire message must fit within a single buffer. - VerifyOrReturnError(!msg->HasChainedBuffer(), CHIP_ERROR_MESSAGE_TOO_LONG); + VerifyOrReturnError(!msg->HasChainedBuffer() && msg->DataLength() <= UINT16_MAX, CHIP_ERROR_MESSAGE_TOO_LONG); memset(&messageInfo, 0, sizeof(messageInfo)); @@ -237,7 +237,7 @@ CHIP_ERROR UDPEndPointImplOT::SendMsgImpl(const IPPacketInfo * aPktInfo, System: message = otUdpNewMessage(mOTInstance, NULL); VerifyOrExit(message != NULL, error = OT_ERROR_NO_BUFS); - error = otMessageAppend(message, msg->Start(), msg->DataLength()); + error = otMessageAppend(message, msg->Start(), static_cast<uint16_t>(msg->DataLength())); if (error == OT_ERROR_NONE) { diff --git a/src/inet/UDPEndPointImplSockets.cpp b/src/inet/UDPEndPointImplSockets.cpp index 23190c15846e88..f1831c475f2cc5 100644 --- a/src/inet/UDPEndPointImplSockets.cpp +++ b/src/inet/UDPEndPointImplSockets.cpp @@ -415,7 +415,10 @@ CHIP_ERROR UDPEndPointImplSockets::SendMsgImpl(const IPPacketInfo * aPktInfo, Sy { return CHIP_ERROR_POSIX(errno); } - if (lenSent != msg->DataLength()) + + size_t len = static_cast<size_t>(lenSent); + + if (len != msg->DataLength()) { return CHIP_ERROR_OUTBOUND_MESSAGE_TOO_BIG; } @@ -607,11 +610,11 @@ void UDPEndPointImplSockets::HandlePendingIO(System::SocketEvents events) ssize_t rcvLen = recvmsg(mSocket, &msgHeader, MSG_DONTWAIT); - if (rcvLen < 0) + if (rcvLen == -1) { lStatus = CHIP_ERROR_POSIX(errno); } - else if (rcvLen > lBuffer->AvailableDataLength()) + else if (lBuffer->AvailableDataLength() < static_cast<size_t>(rcvLen)) { lStatus = CHIP_ERROR_INBOUND_MESSAGE_TOO_BIG; } diff --git a/src/inet/tests/TestInetLayer.cpp b/src/inet/tests/TestInetLayer.cpp index a43b3c7a08affc..0001e527af0464 100644 --- a/src/inet/tests/TestInetLayer.cpp +++ b/src/inet/tests/TestInetLayer.cpp @@ -565,7 +565,7 @@ static void HandleTCPConnectionClosed(TCPEndPoint * aEndPoint, CHIP_ERROR aError } } -static void HandleTCPDataSent(TCPEndPoint * aEndPoint, uint16_t len) {} +static void HandleTCPDataSent(TCPEndPoint * aEndPoint, size_t len) {} static CHIP_ERROR HandleTCPDataReceived(TCPEndPoint * aEndPoint, PacketBufferHandle && aBuffer) { diff --git a/src/inet/tests/TestInetLayerCommon.cpp b/src/inet/tests/TestInetLayerCommon.cpp index 7a60a2778239ba..b1f0172bea0642 100644 --- a/src/inet/tests/TestInetLayerCommon.cpp +++ b/src/inet/tests/TestInetLayerCommon.cpp @@ -35,6 +35,7 @@ #include <inet/IPPacketInfo.h> #include <lib/support/CodeUtils.h> +#include <lib/support/SafeInt.h> #include "TestInetCommon.h" @@ -123,9 +124,9 @@ bool WasSuccessful(const TestStatus & aTestStatus) return (lStatus); } -static void FillDataBufferPattern(uint8_t * aBuffer, uint16_t aLength, uint16_t aPatternStartOffset, uint8_t aFirstValue) +static void FillDataBufferPattern(uint8_t * aBuffer, size_t aLength, size_t aPatternStartOffset, uint8_t aFirstValue) { - for (uint16_t i = aPatternStartOffset; i < aLength; i++) + for (size_t i = aPatternStartOffset; i < aLength; i++) { const uint8_t lValue = static_cast<uint8_t>(aFirstValue & 0xFF); @@ -135,9 +136,9 @@ static void FillDataBufferPattern(uint8_t * aBuffer, uint16_t aLength, uint16_t } } -static bool CheckDataBufferPattern(const uint8_t * aBuffer, uint16_t aLength, uint16_t aPatternStartOffset, uint8_t aFirstValue) +static bool CheckDataBufferPattern(const uint8_t * aBuffer, size_t aLength, size_t aPatternStartOffset, size_t aFirstValue) { - for (uint16_t i = aPatternStartOffset; i < aLength; i++) + for (size_t i = aPatternStartOffset; i < aLength; i++) { const uint8_t lValue = aBuffer[i]; @@ -145,8 +146,8 @@ static bool CheckDataBufferPattern(const uint8_t * aBuffer, uint16_t aLength, ui { printf("Bad data value at offset %u (0x%04x): " "expected 0x%02x, found 0x%02x\n", - i, i, aFirstValue, lValue); - DumpMemory(aBuffer + aPatternStartOffset, aLength - aPatternStartOffset, "0x", 16); + static_cast<unsigned>(i), static_cast<unsigned>(i), static_cast<unsigned>(aFirstValue), lValue); + DumpMemory(aBuffer + aPatternStartOffset, static_cast<uint32_t>(aLength - aPatternStartOffset), "0x", 16); return false; } @@ -156,7 +157,7 @@ static bool CheckDataBufferPattern(const uint8_t * aBuffer, uint16_t aLength, ui return true; } -static PacketBufferHandle MakeDataBuffer(uint16_t aDesiredLength, uint16_t aPatternStartOffset, uint8_t aFirstValue) +static PacketBufferHandle MakeDataBuffer(size_t aDesiredLength, size_t aPatternStartOffset, uint8_t aFirstValue) { VerifyOrReturnError(aPatternStartOffset <= aDesiredLength, PacketBufferHandle()); @@ -172,14 +173,14 @@ static PacketBufferHandle MakeDataBuffer(uint16_t aDesiredLength, uint16_t aPatt return lBuffer; } -static PacketBufferHandle MakeDataBuffer(uint16_t aDesiredLength, uint16_t aPatternStartOffset) +static PacketBufferHandle MakeDataBuffer(size_t aDesiredLength, size_t aPatternStartOffset) { constexpr uint8_t lFirstValue = 0; return MakeDataBuffer(aDesiredLength, aPatternStartOffset, lFirstValue); } template <typename tType> -static PacketBufferHandle MakeICMPDataBuffer(uint16_t aDesiredUserLength, uint16_t aHeaderLength, uint16_t aPatternStartOffset, +static PacketBufferHandle MakeICMPDataBuffer(size_t aDesiredUserLength, uint16_t aHeaderLength, size_t aPatternStartOffset, uint8_t aType) { static uint16_t lSequenceNumber = 0; @@ -188,7 +189,7 @@ static PacketBufferHandle MakeICMPDataBuffer(uint16_t aDesiredUserLength, uint16 // To ensure there is enough room for the user data and the ICMP // header, include both the user data size and the ICMP header length. - lBuffer = MakeDataBuffer(static_cast<uint16_t>(aDesiredUserLength + aHeaderLength), aPatternStartOffset); + lBuffer = MakeDataBuffer(aDesiredUserLength + aHeaderLength, aPatternStartOffset); if (!lBuffer.IsNull()) { @@ -204,7 +205,7 @@ static PacketBufferHandle MakeICMPDataBuffer(uint16_t aDesiredUserLength, uint16 return (lBuffer); } -PacketBufferHandle MakeICMPv4DataBuffer(uint16_t aDesiredUserLength) +PacketBufferHandle MakeICMPv4DataBuffer(size_t aDesiredUserLength) { constexpr uint16_t lICMPHeaderLength = sizeof(ICMPv4EchoHeader); constexpr uint16_t lPatternStartOffset = lICMPHeaderLength; @@ -213,7 +214,7 @@ PacketBufferHandle MakeICMPv4DataBuffer(uint16_t aDesiredUserLength) return MakeICMPDataBuffer<ICMPv4EchoHeader>(aDesiredUserLength, lICMPHeaderLength, lPatternStartOffset, lType); } -PacketBufferHandle MakeICMPv6DataBuffer(uint16_t aDesiredUserLength) +PacketBufferHandle MakeICMPv6DataBuffer(size_t aDesiredUserLength) { constexpr uint16_t lICMPHeaderLength = sizeof(ICMPv6EchoHeader); constexpr uint16_t lPatternStartOffset = lICMPHeaderLength; @@ -222,44 +223,45 @@ PacketBufferHandle MakeICMPv6DataBuffer(uint16_t aDesiredUserLength) return MakeICMPDataBuffer<ICMPv6EchoHeader>(aDesiredUserLength, lICMPHeaderLength, lPatternStartOffset, lType); } -PacketBufferHandle MakeDataBuffer(uint16_t aDesiredLength, uint8_t aFirstValue) +PacketBufferHandle MakeDataBuffer(size_t aDesiredLength, uint8_t aFirstValue) { - constexpr uint16_t lPatternStartOffset = 0; + constexpr size_t lPatternStartOffset = 0; return MakeDataBuffer(aDesiredLength, lPatternStartOffset, aFirstValue); } -PacketBufferHandle MakeDataBuffer(uint16_t aDesiredLength) +PacketBufferHandle MakeDataBuffer(size_t aDesiredLength) { - constexpr uint16_t lPatternStartOffset = 0; + constexpr size_t lPatternStartOffset = 0; return MakeDataBuffer(aDesiredLength, lPatternStartOffset); } static bool HandleDataReceived(const PacketBufferHandle & aBuffer, TransferStats & aStats, bool aStatsByPacket, bool aCheckBuffer, - uint16_t aPatternStartOffset, uint8_t aFirstValue) + size_t aPatternStartOffset, size_t aFirstValue) { - uint16_t lTotalDataLength = 0; + size_t lTotalDataLength = 0; // Walk through each buffer in the packet chain, checking the // buffer for the expected pattern, if requested. for (PacketBufferHandle lBuffer = aBuffer.Retain(); !lBuffer.IsNull(); lBuffer.Advance()) { - const uint16_t lDataLength = lBuffer->DataLength(); - const uint8_t * const p = lBuffer->Start(); + const size_t lDataLength = lBuffer->DataLength(); + const uint8_t * const p = lBuffer->Start(); if (aCheckBuffer && !CheckDataBufferPattern(p, lDataLength, aPatternStartOffset, aFirstValue)) { return false; } - lTotalDataLength = static_cast<uint16_t>(lTotalDataLength + lDataLength); - aFirstValue = static_cast<uint8_t>(aFirstValue + lDataLength); + lTotalDataLength = lTotalDataLength + lDataLength; + aFirstValue = aFirstValue + lDataLength; } // If we are accumulating stats by packet rather than by size, // then increment by one (1) rather than the total buffer length. - aStats.mReceive.mActual += ((aStatsByPacket) ? 1 : lTotalDataLength); + VerifyOrReturnError(CanCastTo<uint32_t>(lTotalDataLength), false); + aStats.mReceive.mActual += ((aStatsByPacket) ? 1 : static_cast<uint32_t>(lTotalDataLength)); return true; } diff --git a/src/lib/core/tests/TestTLV.cpp b/src/lib/core/tests/TestTLV.cpp index 19b4c77ac35280..d7861291a56c73 100644 --- a/src/lib/core/tests/TestTLV.cpp +++ b/src/lib/core/tests/TestTLV.cpp @@ -269,12 +269,12 @@ void TestDupBytes(TLVReader & reader, Tag tag, const uint8_t * expectedVal, uint chip::Platform::MemoryFree(val); } -void TestBufferContents(const System::PacketBufferHandle & buffer, const uint8_t * expectedVal, uint32_t expectedLen) +void TestBufferContents(const System::PacketBufferHandle & buffer, const uint8_t * expectedVal, size_t expectedLen) { System::PacketBufferHandle buf = buffer.Retain(); while (!buf.IsNull()) { - uint16_t len = buf->DataLength(); + size_t len = buf->DataLength(); EXPECT_LE(len, expectedLen); EXPECT_EQ(memcmp(buf->Start(), expectedVal, len), 0); @@ -2978,8 +2978,8 @@ TEST_F(TestTLV, CheckBufferOverflow) System::PacketBufferTLVReader reader; System::PacketBufferHandle buf = System::PacketBufferHandle::New(sizeof(Encoding1), 0); - uint16_t maxDataLen = buf->MaxDataLength(); - uint16_t reserve = static_cast<uint16_t>((sizeof(Encoding1) < maxDataLen) ? (maxDataLen - sizeof(Encoding1)) + 2 : 0); + uint32_t maxDataLen = static_cast<uint32_t>(buf->MaxDataLength()); + uint32_t reserve = static_cast<uint32_t>((sizeof(Encoding1) < maxDataLen) ? (maxDataLen - sizeof(Encoding1)) + 2 : 0); // Repeatedly write and read a TLV encoding to a chain of PacketBuffers. Use progressively larger // and larger amounts of space in the first buffer to force the encoding to overlap the diff --git a/src/messaging/tests/echo/echo_requester.cpp b/src/messaging/tests/echo/echo_requester.cpp index bc5d96d694bb33..1bff8e70f55d8d 100644 --- a/src/messaging/tests/echo/echo_requester.cpp +++ b/src/messaging/tests/echo/echo_requester.cpp @@ -183,8 +183,9 @@ void HandleEchoResponseReceived(chip::Messaging::ExchangeContext * ec, chip::Sys gEchoRespCount++; - printf("Echo Response: %" PRIu64 "/%" PRIu64 "(%.2f%%) len=%u time=%.3fs\n", gEchoRespCount, gEchoCount, - static_cast<double>(gEchoRespCount) * 100 / static_cast<double>(gEchoCount), payload->DataLength(), + printf("Echo Response: %" PRIu64 "/%" PRIu64 "(%.2f%%) len=%" PRIu32 "time=%.3fs\n", gEchoRespCount, gEchoCount, + static_cast<double>(gEchoRespCount) * 100 / static_cast<double>(gEchoCount), + static_cast<uint32_t>(payload->DataLength()), static_cast<double>(chip::System::Clock::Milliseconds32(transitTime).count()) / 1000); } diff --git a/src/messaging/tests/echo/echo_responder.cpp b/src/messaging/tests/echo/echo_responder.cpp index 3cf56553294ccb..140aab00b0ff23 100644 --- a/src/messaging/tests/echo/echo_responder.cpp +++ b/src/messaging/tests/echo/echo_responder.cpp @@ -49,7 +49,7 @@ chip::SessionHolder gSession; // Callback handler when a CHIP EchoRequest is received. void HandleEchoRequestReceived(chip::Messaging::ExchangeContext * ec, chip::System::PacketBufferHandle && payload) { - printf("Echo Request, len=%u ... sending response.\n", payload->DataLength()); + printf("Echo Request, len=%" PRIu32 "... sending response.\n", static_cast<uint32_t>(payload->DataLength())); } } // namespace diff --git a/src/platform/ESP32/nimble/BLEManagerImpl.cpp b/src/platform/ESP32/nimble/BLEManagerImpl.cpp index a69bc169fe26ed..9a8ae506e7ee05 100644 --- a/src/platform/ESP32/nimble/BLEManagerImpl.cpp +++ b/src/platform/ESP32/nimble/BLEManagerImpl.cpp @@ -34,6 +34,7 @@ #include <ble/Ble.h> #endif #include <lib/support/CodeUtils.h> +#include <lib/support/SafeInt.h> #include <lib/support/logging/CHIPLogging.h> #include <platform/CommissionableDataProvider.h> #include <platform/DeviceInstanceInfoProvider.h> @@ -601,7 +602,11 @@ bool BLEManagerImpl::SendIndication(BLE_CONNECTION_OBJECT conId, const ChipBleUU ESP_LOGD(TAG, "Sending indication for CHIPoBLE TX characteristic (con %u, len %u)", conId, data->DataLength()); - om = ble_hs_mbuf_from_flat(data->Start(), data->DataLength()); + // For BLE, the buffer is capped at UINT16_MAX. Nevertheless, have a verify + // check before the cast to uint16_t. + VerifyOrExit(CanCastTo<uint16_t>(data->DataLength()), err = CHIP_ERROR_MESSAGE_TOO_LONG); + + om = ble_hs_mbuf_from_flat(data->Start(), static_cast<uint16_t>(data->DataLength())); if (om == NULL) { ChipLogError(DeviceLayer, "ble_hs_mbuf_from_flat failed:"); diff --git a/src/platform/Zephyr/BLEManagerImpl.cpp b/src/platform/Zephyr/BLEManagerImpl.cpp index 4eba52756d1368..59898c65932a2b 100644 --- a/src/platform/Zephyr/BLEManagerImpl.cpp +++ b/src/platform/Zephyr/BLEManagerImpl.cpp @@ -30,6 +30,7 @@ #include <ble/Ble.h> #include <lib/support/CHIPMemString.h> #include <lib/support/CodeUtils.h> +#include <lib/support/SafeInt.h> #include <lib/support/logging/CHIPLogging.h> #include <platform/DeviceInstanceInfoProvider.h> #include <platform/internal/BLEManager.h> @@ -707,7 +708,8 @@ bool BLEManagerImpl::SendIndication(BLE_CONNECTION_OBJECT conId, const ChipBleUU params->attr = &sChipoBleAttributes[kCHIPoBLE_CCC_AttributeIndex]; params->func = HandleTXIndicated; params->data = pBuf->Start(); - params->len = pBuf->DataLength(); + VerifyOrExit(CanCastTo<uint16_t>(pBuf->DataLength()), err = CHIP_ERROR_MESSAGE_TOO_LONG); + params->len = static_cast<uint16_t>(pBuf->DataLength()); status = bt_gatt_indicate(conId, params); VerifyOrExit(status == 0, err = MapErrorZephyr(status)); @@ -885,8 +887,10 @@ ssize_t BLEManagerImpl::HandleC3Read(struct bt_conn * conId, const struct bt_gat return 0; } + // For BLE, the max payload size is limited to UINT16_MAX since the length + // field is 2 bytes long. So, the cast to uint16_t should be fine. return bt_gatt_attr_read(conId, attr, buf, len, offset, sInstance.c3CharDataBufferHandle->Start(), - sInstance.c3CharDataBufferHandle->DataLength()); + static_cast<uint16_t>(sInstance.c3CharDataBufferHandle->DataLength())); } #endif diff --git a/src/platform/android/BLEManagerImpl.cpp b/src/platform/android/BLEManagerImpl.cpp index d729ba5134573c..0bd7f1e34054d5 100644 --- a/src/platform/android/BLEManagerImpl.cpp +++ b/src/platform/android/BLEManagerImpl.cpp @@ -384,7 +384,9 @@ bool BLEManagerImpl::SendWriteRequest(BLE_CONNECTION_OBJECT conId, const Ble::Ch err = JniReferences::GetInstance().N2J_ByteArray(env, static_cast<const uint8_t *>(charId->bytes), 16, charIdObj); SuccessOrExit(err); - err = JniReferences::GetInstance().N2J_ByteArray(env, pBuf->Start(), pBuf->DataLength(), characteristicDataObj); + VerifyOrExit(CanCastTo<uint16_t>(pBuf->DataLength()), err = CHIP_ERROR_MESSAGE_TOO_LONG); + err = JniReferences::GetInstance().N2J_ByteArray(env, pBuf->Start(), static_cast<uint16_t>(pBuf->DataLength()), + characteristicDataObj); SuccessOrExit(err); env->ExceptionClear(); diff --git a/src/platform/bouffalolab/common/BLEManagerImpl.cpp b/src/platform/bouffalolab/common/BLEManagerImpl.cpp index b2f2c82f60716e..0b1679ef2aeb09 100644 --- a/src/platform/bouffalolab/common/BLEManagerImpl.cpp +++ b/src/platform/bouffalolab/common/BLEManagerImpl.cpp @@ -23,6 +23,7 @@ #include <ble/Ble.h> #include <lib/support/CHIPMemString.h> +#include <lib/support/SafeInt.h> #include <platform/DeviceInstanceInfoProvider.h> #include <platform/internal/BLEManager.h> #if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING @@ -669,7 +670,10 @@ bool BLEManagerImpl::SendIndication(BLE_CONNECTION_OBJECT conId, const ChipBleUU params->attr = &sChipoBleAttributes[kCHIPoBLE_CCC_AttributeIndex]; params->func = HandleTXIndicated; params->data = pBuf->Start(); - params->len = pBuf->DataLength(); + // For BLE, the buffer is capped at UINT16_MAX. Nevertheless, have a verify + // check before the cast to uint16_t. + VerifyOrExit(CanCastTo<uint16_t>(pBuf->DataLength()), err = CHIP_ERROR_MESSAGE_TOO_LONG); + params->len = static_cast<uint16_t>(pBuf->DataLength()); status = bt_gatt_indicate(conId, params); VerifyOrExit(status == 0, err = MapErrorZephyr(status)); @@ -848,8 +852,10 @@ ssize_t BLEManagerImpl::HandleC3Read(struct bt_conn * conId, const struct bt_gat return 0; } + // For BLE, the max payload size is limited to UINT16_MAX since the length + // field is 2 bytes long. So, the cast to uint16_t should be fine. return bt_gatt_attr_read(conId, attr, buf, len, offset, sInstance.c3CharDataBufferHandle->Start(), - sInstance.c3CharDataBufferHandle->DataLength()); + static_cast<uint16_t>(sInstance.c3CharDataBufferHandle->DataLength())); } #endif diff --git a/src/platform/mbed/BLEManagerImpl.cpp b/src/platform/mbed/BLEManagerImpl.cpp index 75c749f3f145f5..5048a92b1c48f3 100644 --- a/src/platform/mbed/BLEManagerImpl.cpp +++ b/src/platform/mbed/BLEManagerImpl.cpp @@ -32,6 +32,7 @@ #include <ble/Ble.h> #include <lib/support/CodeUtils.h> +#include <lib/support/SafeInt.h> #include <lib/support/logging/CHIPLogging.h> #include <platform/CommissionableDataProvider.h> #include <platform/internal/BLEManager.h> @@ -984,6 +985,9 @@ bool BLEManagerImpl::SendIndication(BLE_CONNECTION_OBJECT conId, const ChipBleUU ble::GattServer & gatt_server = ble::BLE::Instance().gattServer(); ble::attribute_handle_t att_handle; + // For BLE, the buffer is capped at UINT16_MAX. + VerifyOrExit(CanCastTo<uint16_t>(pBuf->DataLength()), err = CHIP_ERROR_MESSAGE_TOO_LONG); + // No need to do anything fancy here. Only 3 handles are used in this impl. if (UUIDsMatch(charId, &ChipUUID_CHIPoBLEChar_TX)) { @@ -1007,7 +1011,7 @@ bool BLEManagerImpl::SendIndication(BLE_CONNECTION_OBJECT conId, const ChipBleUU "(connHandle=%d, attHandle=%d, data_len=%u)", conId, att_handle, pBuf->DataLength()); - mbed_err = gatt_server.write(att_handle, pBuf->Start(), pBuf->DataLength(), false); + mbed_err = gatt_server.write(att_handle, pBuf->Start(), static_cast<uint16_t>(pBuf->DataLength()), false); VerifyOrExit(mbed_err == BLE_ERROR_NONE, err = CHIP_ERROR(chip::ChipError::Range::kOS, mbed_err)); exit: diff --git a/src/protocols/secure_channel/CASESession.cpp b/src/protocols/secure_channel/CASESession.cpp index aa6084d3680127..745bd3898fa865 100644 --- a/src/protocols/secure_channel/CASESession.cpp +++ b/src/protocols/secure_channel/CASESession.cpp @@ -1582,8 +1582,8 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg) TLV::TLVReader decryptedDataTlvReader; TLV::TLVType containerType = TLV::kTLVType_Structure; - const uint8_t * buf = msg->Start(); - const uint16_t bufLen = msg->DataLength(); + const uint8_t * buf = msg->Start(); + const size_t bufLen = msg->DataLength(); constexpr size_t kCaseOverheadForFutureTbeData = 128; diff --git a/src/protocols/user_directed_commissioning/UserDirectedCommissioningClient.cpp b/src/protocols/user_directed_commissioning/UserDirectedCommissioningClient.cpp index 3bb69c099612e3..9fc43634d7ec7d 100644 --- a/src/protocols/user_directed_commissioning/UserDirectedCommissioningClient.cpp +++ b/src/protocols/user_directed_commissioning/UserDirectedCommissioningClient.cpp @@ -255,7 +255,7 @@ void UserDirectedCommissioningClient::OnMessageReceived(const Transport::PeerAdd PayloadHeader payloadHeader; ReturnOnFailure(payloadHeader.DecodeAndConsume(msg)); - ChipLogProgress(AppServer, "CommissionerDeclaration DataLength()=%d", msg->DataLength()); + ChipLogProgress(AppServer, "CommissionerDeclaration DataLength()=%" PRIu32, static_cast<uint32_t>(msg->DataLength())); uint8_t udcPayload[IdentificationDeclaration::kUdcTLVDataMaxBytes]; size_t udcPayloadLength = std::min<size_t>(msg->DataLength(), sizeof(udcPayload)); diff --git a/src/protocols/user_directed_commissioning/UserDirectedCommissioningServer.cpp b/src/protocols/user_directed_commissioning/UserDirectedCommissioningServer.cpp index cb953c8a60e5ca..2efd8d0a33de28 100644 --- a/src/protocols/user_directed_commissioning/UserDirectedCommissioningServer.cpp +++ b/src/protocols/user_directed_commissioning/UserDirectedCommissioningServer.cpp @@ -52,7 +52,7 @@ void UserDirectedCommissioningServer::OnMessageReceived(const Transport::PeerAdd PayloadHeader payloadHeader; ReturnOnFailure(payloadHeader.DecodeAndConsume(msg)); - ChipLogProgress(AppServer, "IdentityDeclaration DataLength()=%d", msg->DataLength()); + ChipLogProgress(AppServer, "IdentityDeclaration DataLength()=%" PRIu32, static_cast<uint32_t>(msg->DataLength())); uint8_t udcPayload[IdentificationDeclaration::kUdcTLVDataMaxBytes]; size_t udcPayloadLength = std::min<size_t>(msg->DataLength(), sizeof(udcPayload)); diff --git a/src/system/SystemPacketBuffer.cpp b/src/system/SystemPacketBuffer.cpp index 0226ab783f2415..59e1e822901db0 100644 --- a/src/system/SystemPacketBuffer.cpp +++ b/src/system/SystemPacketBuffer.cpp @@ -117,7 +117,8 @@ void PacketBuffer::InternalCheck(const PacketBuffer * buffer) VerifyOrDieWithMsg(::chip::Platform::MemoryDebugCheckPointer(buffer, buffer->alloc_size + kStructureSize), chipSystemLayer, "invalid packet buffer pointer"); VerifyOrDieWithMsg(buffer->alloc_size >= buffer->ReservedSize() + buffer->len, chipSystemLayer, - "packet buffer overflow %u < %u+%u", buffer->alloc_size, buffer->ReservedSize(), buffer->len); + "packet buffer overflow %" PRIu32 " < %" PRIu32 " +%" PRIu32, static_cast<uint32_t>(buffer->alloc_size), + static_cast<uint32_t>(buffer->ReservedSize()), static_cast<uint32_t>(buffer->len)); } } #endif // CHIP_SYSTEM_PACKETBUFFER_HAS_CHECK @@ -136,7 +137,7 @@ void PacketBufferHandle::InternalRightSize() // Reallocate only if enough space will be saved. const uint8_t * const start = mBuffer->ReserveStart(); const uint8_t * const payload = mBuffer->Start(); - const uint16_t usedSize = static_cast<uint16_t>(payload - start + mBuffer->len); + const size_t usedSize = static_cast<size_t>(payload - start + static_cast<ptrdiff_t>(mBuffer->len)); if (usedSize + kRightSizingThreshold > mBuffer->alloc_size) { return; @@ -156,7 +157,7 @@ void PacketBufferHandle::InternalRightSize() newBuffer->tot_len = mBuffer->tot_len; newBuffer->len = mBuffer->len; newBuffer->ref = 1; - newBuffer->alloc_size = static_cast<uint16_t>(usedSize); + newBuffer->alloc_size = usedSize; memcpy(newStart, start, usedSize); PacketBuffer::Free(mBuffer); @@ -203,26 +204,42 @@ void PacketBuffer::SetStart(uint8_t * aNewStart) aNewStart = kEnd; ptrdiff_t lDelta = aNewStart - static_cast<uint8_t *>(this->payload); - if (lDelta > this->len) - lDelta = this->len; + if (lDelta > 0 && this->len < static_cast<size_t>(lDelta)) + lDelta = static_cast<ptrdiff_t>(this->len); - this->len = static_cast<uint16_t>(static_cast<ptrdiff_t>(this->len) - lDelta); +#if CHIP_SYSTEM_CONFIG_USE_LWIP + VerifyOrDieWithMsg((static_cast<ptrdiff_t>(this->len) - lDelta) <= UINT16_MAX, chipSystemLayer, + "LwIP buffer length cannot exceed UINT16_MAX"); + this->len = static_cast<uint16_t>(static_cast<ptrdiff_t>(this->len) - lDelta); + VerifyOrDieWithMsg((static_cast<ptrdiff_t>(this->tot_len) - lDelta) <= UINT16_MAX, chipSystemLayer, + "LwIP buffer length cannot exceed UINT16_MAX"); this->tot_len = static_cast<uint16_t>(static_cast<ptrdiff_t>(this->tot_len) - lDelta); +#else + this->len = static_cast<size_t>(static_cast<ptrdiff_t>(this->len) - lDelta); + this->tot_len = static_cast<size_t>(static_cast<ptrdiff_t>(this->tot_len) - lDelta); +#endif // CHIP_SYSTEM_CONFIG_USE_LWIP this->payload = aNewStart; } -void PacketBuffer::SetDataLength(uint16_t aNewLen, PacketBuffer * aChainHead) +void PacketBuffer::SetDataLength(size_t aNewLen, PacketBuffer * aChainHead) { - const uint16_t kMaxDataLen = this->MaxDataLength(); + const size_t kMaxDataLen = this->MaxDataLength(); if (aNewLen > kMaxDataLen) aNewLen = kMaxDataLen; - ptrdiff_t lDelta = static_cast<ptrdiff_t>(aNewLen) - static_cast<ptrdiff_t>(this->len); + ssize_t lDelta = static_cast<ssize_t>(aNewLen) - static_cast<ssize_t>(this->len); +#if CHIP_SYSTEM_CONFIG_USE_LWIP + VerifyOrDieWithMsg(aNewLen <= UINT16_MAX, chipSystemLayer, "LwIP buffer length cannot exceed UINT16_MAX"); + this->len = static_cast<uint16_t>(aNewLen); + VerifyOrDieWithMsg((static_cast<ssize_t>(this->tot_len) + lDelta) <= UINT16_MAX, chipSystemLayer, + "LwIP buffer length cannot exceed UINT16_MAX"); + this->tot_len = static_cast<uint16_t>(static_cast<ssize_t>(this->tot_len) + lDelta); +#else this->len = aNewLen; - this->tot_len = static_cast<uint16_t>(this->tot_len + lDelta); - + this->tot_len = static_cast<size_t>(static_cast<ssize_t>(this->tot_len) + lDelta); +#endif // CHIP_SYSTEM_CONFIG_USE_LWIP // SetDataLength is often called after a client finished writing to the buffer, // so it's a good time to check for possible corruption. Check(this); @@ -230,12 +247,18 @@ void PacketBuffer::SetDataLength(uint16_t aNewLen, PacketBuffer * aChainHead) while (aChainHead != nullptr && aChainHead != this) { Check(aChainHead); - aChainHead->tot_len = static_cast<uint16_t>(aChainHead->tot_len + lDelta); - aChainHead = aChainHead->ChainedBuffer(); +#if CHIP_SYSTEM_CONFIG_USE_LWIP + VerifyOrDieWithMsg((static_cast<ssize_t>(aChainHead->tot_len) + lDelta) <= UINT16_MAX, chipSystemLayer, + "LwIP buffer length cannot exceed UINT16_MAX"); + aChainHead->tot_len = static_cast<uint16_t>(static_cast<ssize_t>(aChainHead->tot_len) + lDelta); +#else + aChainHead->tot_len = static_cast<size_t>(static_cast<ssize_t>(aChainHead->tot_len) + lDelta); +#endif + aChainHead = aChainHead->ChainedBuffer(); } } -uint16_t PacketBuffer::MaxDataLength() const +size_t PacketBuffer::MaxDataLength() const { #if CHIP_SYSTEM_CONFIG_USE_LWIP if (!(PBUF_STRUCT_DATA_CONTIGUOUS(this))) @@ -243,12 +266,12 @@ uint16_t PacketBuffer::MaxDataLength() const return DataLength(); } #endif - return static_cast<uint16_t>(AllocSize() - ReservedSize()); + return static_cast<size_t>(AllocSize() - ReservedSize()); } -uint16_t PacketBuffer::AvailableDataLength() const +size_t PacketBuffer::AvailableDataLength() const { - return static_cast<uint16_t>(this->MaxDataLength() - this->DataLength()); + return (this->MaxDataLength() - this->DataLength()); } uint16_t PacketBuffer::ReservedSize() const @@ -292,8 +315,8 @@ void PacketBuffer::AddToEnd(PacketBufferHandle && aPacketHandle) while (true) { - uint16_t old_total_length = lCursor->tot_len; - lCursor->tot_len = static_cast<uint16_t>(lCursor->tot_len + aPacket->tot_len); + size_t old_total_length = lCursor->tot_len; + lCursor->tot_len = lCursor->tot_len + aPacket->tot_len; VerifyOrDieWithMsg(lCursor->tot_len >= old_total_length, chipSystemLayer, "buffer chain too large"); if (!lCursor->HasChainedBuffer()) { @@ -316,37 +339,50 @@ void PacketBuffer::CompactHead() this->payload = kStart; } - uint16_t lAvailLength = this->AvailableDataLength(); + size_t lAvailLength = this->AvailableDataLength(); while (lAvailLength > 0 && HasChainedBuffer()) { PacketBuffer & lNextPacket = *ChainedBuffer(); VerifyOrDieWithMsg(lNextPacket.ref == 1, chipSystemLayer, "next buffer %p is not exclusive to this chain", &lNextPacket); - uint16_t lMoveLength = lNextPacket.len; + size_t lMoveLength = lNextPacket.len; if (lMoveLength > lAvailLength) lMoveLength = lAvailLength; memcpy(static_cast<uint8_t *>(this->payload) + this->len, lNextPacket.payload, lMoveLength); lNextPacket.payload = static_cast<uint8_t *>(lNextPacket.payload) + lMoveLength; + lAvailLength = lAvailLength - lMoveLength; +#if CHIP_SYSTEM_CONFIG_USE_LWIP + VerifyOrDieWithMsg(CanCastTo<uint16_t>(this->len + lMoveLength), chipSystemLayer, + "LwIP buffer length cannot exceed UINT16_MAX"); this->len = static_cast<uint16_t>(this->len + lMoveLength); - lAvailLength = static_cast<uint16_t>(lAvailLength - lMoveLength); lNextPacket.len = static_cast<uint16_t>(lNextPacket.len - lMoveLength); lNextPacket.tot_len = static_cast<uint16_t>(lNextPacket.tot_len - lMoveLength); +#else + this->len = this->len + lMoveLength; + lNextPacket.len = lNextPacket.len - lMoveLength; + lNextPacket.tot_len = lNextPacket.tot_len - lMoveLength; +#endif if (lNextPacket.len == 0) this->next = this->FreeHead(&lNextPacket); } } -void PacketBuffer::ConsumeHead(uint16_t aConsumeLength) +void PacketBuffer::ConsumeHead(size_t aConsumeLength) { if (aConsumeLength > this->len) aConsumeLength = this->len; this->payload = static_cast<uint8_t *>(this->payload) + aConsumeLength; +#if CHIP_SYSTEM_CONFIG_USE_LWIP this->len = static_cast<uint16_t>(this->len - aConsumeLength); this->tot_len = static_cast<uint16_t>(this->tot_len - aConsumeLength); +#else + this->len = this->len - aConsumeLength; + this->tot_len = this->tot_len - aConsumeLength; +#endif } /** @@ -360,18 +396,18 @@ void PacketBuffer::ConsumeHead(uint16_t aConsumeLength) * * @return the first buffer from the current chain that contains any remaining data. If no data remains, nullptr is returned. */ -PacketBuffer * PacketBuffer::Consume(uint16_t aConsumeLength) +PacketBuffer * PacketBuffer::Consume(size_t aConsumeLength) { PacketBuffer * lPacket = this; while (lPacket != nullptr && aConsumeLength > 0) { - const uint16_t kLength = lPacket->DataLength(); + const size_t kLength = lPacket->DataLength(); if (aConsumeLength >= kLength) { lPacket = PacketBuffer::FreeHead(lPacket); - aConsumeLength = static_cast<uint16_t>(aConsumeLength - kLength); + aConsumeLength = aConsumeLength - kLength; } else { @@ -478,7 +514,13 @@ PacketBufferHandle PacketBufferHandle::New(size_t aAvailableSize, uint16_t aRese static_assert(PacketBuffer::kStructureSize == sizeof(PacketBuffer), "PacketBuffer size mismatch"); static_assert(PacketBuffer::kStructureSize < UINT16_MAX, "Check for overflow more carefully"); static_assert(SIZE_MAX >= INT_MAX, "Our additions might not fit in size_t"); - static_assert(PacketBuffer::kMaxSizeWithoutReserve <= UINT16_MAX, "PacketBuffer may have size not fitting uint16_t"); + static_assert(PacketBuffer::kMaxSizeWithoutReserve <= UINT32_MAX, "PacketBuffer may have size not fitting uint32_t"); +#if CHIP_SYSTEM_CONFIG_USE_LWIP + // LwIP based APIs have a maximum buffer size of UINT16_MAX. Ensure that + // limit is met during allocation. + VerifyOrDieWithMsg(aAvailableSize + aReservedSize < UINT16_MAX, chipSystemLayer, + "LwIP based systems can handle only up to UINT16_MAX!"); +#endif // CHIP_SYSTEM_CONFIG_USE_LWIP // When `aAvailableSize` fits in uint16_t (as tested below) and size_t is at least 32 bits (as asserted above), // these additions will not overflow. @@ -488,7 +530,8 @@ PacketBufferHandle PacketBufferHandle::New(size_t aAvailableSize, uint16_t aRese CHIP_SYSTEM_FAULT_INJECT(FaultInjection::kFault_PacketBufferNew, return PacketBufferHandle()); - if (aAvailableSize > UINT16_MAX || lAllocSize > PacketBuffer::kMaxSizeWithoutReserve || lBlockSize > UINT16_MAX) + // TODO: Change the max to a lower value + if (aAvailableSize > UINT32_MAX || lAllocSize > PacketBuffer::kMaxSizeWithoutReserve || lBlockSize > UINT32_MAX) { ChipLogError(chipSystemLayer, "PacketBuffer: allocation too large."); return PacketBufferHandle(); @@ -541,13 +584,13 @@ PacketBufferHandle PacketBufferHandle::New(size_t aAvailableSize, uint16_t aRese lPacket->next = nullptr; lPacket->ref = 1; #if CHIP_SYSTEM_PACKETBUFFER_FROM_CHIP_HEAP - lPacket->alloc_size = static_cast<uint16_t>(lAllocSize); + lPacket->alloc_size = lAllocSize; #endif return PacketBufferHandle(lPacket); } -PacketBufferHandle PacketBufferHandle::NewWithData(const void * aData, size_t aDataSize, uint16_t aAdditionalSize, +PacketBufferHandle PacketBufferHandle::NewWithData(const void * aData, size_t aDataSize, size_t aAdditionalSize, uint16_t aReservedSize) { if (aDataSize > UINT16_MAX) @@ -561,7 +604,11 @@ PacketBufferHandle PacketBufferHandle::NewWithData(const void * aData, size_t aD if (buffer.mBuffer != nullptr) { memcpy(buffer.mBuffer->payload, aData, aDataSize); +#if CHIP_SYSTEM_CONFIG_USE_LWIP buffer.mBuffer->len = buffer.mBuffer->tot_len = static_cast<uint16_t>(aDataSize); +#else + buffer.mBuffer->len = buffer.mBuffer->tot_len = aDataSize; +#endif } return buffer; } @@ -677,7 +724,7 @@ PacketBufferHandle PacketBufferHandle::CloneData() const for (PacketBuffer * original = mBuffer; original != nullptr; original = original->ChainedBuffer()) { - uint16_t originalDataSize = original->MaxDataLength(); + size_t originalDataSize = original->MaxDataLength(); uint16_t originalReservedSize = original->ReservedSize(); if (originalDataSize + originalReservedSize > PacketBuffer::kMaxSizeWithoutReserve) @@ -691,7 +738,7 @@ PacketBufferHandle PacketBufferHandle::CloneData() const } // Otherwise, reduce the requested data size. This subtraction can not underflow because the above test // guarantees originalReservedSize <= PacketBuffer::kMaxSizeWithoutReserve. - originalDataSize = static_cast<uint16_t>(PacketBuffer::kMaxSizeWithoutReserve - originalReservedSize); + originalDataSize = PacketBuffer::kMaxSizeWithoutReserve - originalReservedSize; } PacketBufferHandle clone = PacketBufferHandle::New(originalDataSize, originalReservedSize); @@ -725,7 +772,7 @@ System::PacketBufferHandle PacketBufferWriterUtil::Finalize(BufferWriter & aBuff { // Since mPacket was successfully allocated to hold the maximum length, // we know that the actual length fits in a uint16_t. - aPacket->SetDataLength(static_cast<uint16_t>(aBufferWriter.Needed())); + aPacket->SetDataLength(aBufferWriter.Needed()); } else { diff --git a/src/system/SystemPacketBuffer.h b/src/system/SystemPacketBuffer.h index 928743762e3de7..41eaef6d9e305c 100644 --- a/src/system/SystemPacketBuffer.h +++ b/src/system/SystemPacketBuffer.h @@ -54,11 +54,11 @@ struct pbuf { struct pbuf * next; void * payload; - uint16_t tot_len; - uint16_t len; + size_t tot_len; + size_t len; uint16_t ref; #if CHIP_SYSTEM_PACKETBUFFER_FROM_CHIP_HEAP - uint16_t alloc_size; + size_t alloc_size; #endif }; #endif // !CHIP_SYSTEM_CONFIG_USE_LWIP @@ -112,9 +112,9 @@ class DLL_EXPORT PacketBuffer : private pbuf private: // The effective size of the packet buffer structure. #if CHIP_SYSTEM_CONFIG_USE_LWIP - static constexpr uint16_t kStructureSize = LWIP_MEM_ALIGN_SIZE(sizeof(struct ::pbuf)); + static constexpr size_t kStructureSize = LWIP_MEM_ALIGN_SIZE(sizeof(struct ::pbuf)); #else // CHIP_SYSTEM_CONFIG_USE_LWIP - static constexpr uint16_t kStructureSize = CHIP_SYSTEM_ALIGN_SIZE(sizeof(::chip::System::pbuf), 4u); + static constexpr size_t kStructureSize = CHIP_SYSTEM_ALIGN_SIZE(sizeof(::chip::System::pbuf), 4u); #endif // CHIP_SYSTEM_CONFIG_USE_LWIP public: @@ -122,9 +122,9 @@ class DLL_EXPORT PacketBuffer : private pbuf * The maximum size buffer an application can allocate with no protocol header reserve. */ #if CHIP_SYSTEM_CONFIG_USE_LWIP - static constexpr uint16_t kMaxSizeWithoutReserve = LWIP_MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE); + static constexpr size_t kMaxSizeWithoutReserve = LWIP_MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE); #else - static constexpr uint16_t kMaxSizeWithoutReserve = CHIP_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX; + static constexpr size_t kMaxSizeWithoutReserve = CHIP_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX; #endif /** @@ -136,7 +136,7 @@ class DLL_EXPORT PacketBuffer : private pbuf /** * The maximum size buffer an application can allocate with the default protocol header reserve. */ - static constexpr uint16_t kMaxSize = kMaxSizeWithoutReserve - kDefaultHeaderReserve; + static constexpr size_t kMaxSize = kMaxSizeWithoutReserve - kDefaultHeaderReserve; /** * Return the size of the allocation including the reserved and payload data spaces but not including space @@ -146,7 +146,7 @@ class DLL_EXPORT PacketBuffer : private pbuf * * @return size of the allocation */ - uint16_t AllocSize() const + size_t AllocSize() const { #if CHIP_SYSTEM_PACKETBUFFER_FROM_LWIP_STANDARD_POOL || CHIP_SYSTEM_PACKETBUFFER_FROM_CHIP_POOL return kMaxSizeWithoutReserve; @@ -189,7 +189,7 @@ class DLL_EXPORT PacketBuffer : private pbuf * * @return length, in bytes (current payload length). */ - uint16_t DataLength() const { return this->len; } + size_t DataLength() const { return this->len; } /** * Set the length, in bytes, of data in a packet buffer, adjusting total length accordingly. @@ -204,29 +204,29 @@ class DLL_EXPORT PacketBuffer : private pbuf * @param[in,out] aChainHead - the head of the buffer chain the current buffer belongs to. May be \c nullptr if the current * buffer is the head of the buffer chain. */ - void SetDataLength(uint16_t aNewLen, const PacketBufferHandle & aChainHead); - void SetDataLength(uint16_t aNewLen) { SetDataLength(aNewLen, nullptr); } + void SetDataLength(size_t aNewLen, const PacketBufferHandle & aChainHead); + void SetDataLength(size_t aNewLen) { SetDataLength(aNewLen, nullptr); } /** * Get the total length of packet data in the buffer chain. * * @return total length, in octets. */ - uint16_t TotalLength() const { return this->tot_len; } + size_t TotalLength() const { return this->tot_len; } /** * Get the maximum amount, in bytes, of data that will fit in the buffer given the current start position and buffer size. * * @return number of bytes that fits in the buffer given the current start position. */ - uint16_t MaxDataLength() const; + size_t MaxDataLength() const; /** * Get the number of bytes of data that can be added to the current buffer given the current start position and data length. * * @return the length, in bytes, of data that will fit in the current buffer given the current start position and data length. */ - uint16_t AvailableDataLength() const; + size_t AvailableDataLength() const; /** * Get the number of bytes within the current buffer between the start of the buffer and the current data start position. @@ -272,7 +272,7 @@ class DLL_EXPORT PacketBuffer : private pbuf * * @param[in] aConsumeLength - number of bytes to consume from the current buffer. */ - void ConsumeHead(uint16_t aConsumeLength); + void ConsumeHead(size_t aConsumeLength); /** * Ensure the buffer has at least the specified amount of reserved space. @@ -377,9 +377,9 @@ class DLL_EXPORT PacketBuffer : private pbuf static PacketBuffer * FreeHead(PacketBuffer * aPacket); PacketBuffer * ChainedBuffer() const { return static_cast<PacketBuffer *>(this->next); } - PacketBuffer * Consume(uint16_t aConsumeLength); + PacketBuffer * Consume(size_t aConsumeLength); void Clear(); - void SetDataLength(uint16_t aNewLen, PacketBuffer * aChainHead); + void SetDataLength(size_t aNewLen, PacketBuffer * aChainHead); /** * Get a pointer to the start of the reserved space (which comes before the @@ -540,7 +540,7 @@ class DLL_EXPORT PacketBufferHandle * * @param[in] aConsumeLength - number of bytes to consume from the current chain. */ - void Consume(uint16_t aConsumeLength) { mBuffer = mBuffer->Consume(aConsumeLength); } + void Consume(size_t aConsumeLength) { mBuffer = mBuffer->Consume(aConsumeLength); } /** * Copy the given buffer to a right-sized buffer if applicable. @@ -628,7 +628,7 @@ class DLL_EXPORT PacketBufferHandle * * @return On success, a PacketBufferHandle to the allocated buffer. On fail, \c nullptr. */ - static PacketBufferHandle NewWithData(const void * aData, size_t aDataSize, uint16_t aAdditionalSize = 0, + static PacketBufferHandle NewWithData(const void * aData, size_t aDataSize, size_t aAdditionalSize = 0, uint16_t aReservedSize = PacketBuffer::kDefaultHeaderReserve); /** @@ -698,7 +698,7 @@ class DLL_EXPORT PacketBufferHandle friend class TestSystemPacketBuffer; }; -inline void PacketBuffer::SetDataLength(uint16_t aNewLen, const PacketBufferHandle & aChainHead) +inline void PacketBuffer::SetDataLength(size_t aNewLen, const PacketBufferHandle & aChainHead) { SetDataLength(aNewLen, aChainHead.mBuffer); } diff --git a/src/system/TLVPacketBufferBackingStore.cpp b/src/system/TLVPacketBufferBackingStore.cpp index 5059f837ff69a3..bc49d878e78c9a 100644 --- a/src/system/TLVPacketBufferBackingStore.cpp +++ b/src/system/TLVPacketBufferBackingStore.cpp @@ -31,7 +31,8 @@ namespace System { CHIP_ERROR TLVPacketBufferBackingStore::OnInit(chip::TLV::TLVReader & reader, const uint8_t *& bufStart, uint32_t & bufLen) { bufStart = mHeadBuffer->Start(); - bufLen = mHeadBuffer->DataLength(); + VerifyOrReturnError(CanCastTo<uint32_t>(mHeadBuffer->DataLength()), CHIP_ERROR_INVALID_ARGUMENT); + bufLen = static_cast<uint32_t>(mHeadBuffer->DataLength()); return CHIP_NO_ERROR; } @@ -54,7 +55,8 @@ CHIP_ERROR TLVPacketBufferBackingStore::GetNextBuffer(chip::TLV::TLVReader & rea else { bufStart = mCurrentBuffer->Start(); - bufLen = mCurrentBuffer->DataLength(); + VerifyOrReturnError(CanCastTo<uint32_t>(mCurrentBuffer->DataLength()), CHIP_ERROR_INVALID_ARGUMENT); + bufLen = static_cast<uint32_t>(mCurrentBuffer->DataLength()); } return CHIP_NO_ERROR; @@ -63,7 +65,8 @@ CHIP_ERROR TLVPacketBufferBackingStore::GetNextBuffer(chip::TLV::TLVReader & rea CHIP_ERROR TLVPacketBufferBackingStore::OnInit(chip::TLV::TLVWriter & writer, uint8_t *& bufStart, uint32_t & bufLen) { bufStart = mHeadBuffer->Start() + mHeadBuffer->DataLength(); - bufLen = mHeadBuffer->AvailableDataLength(); + VerifyOrReturnError(CanCastTo<uint32_t>(mHeadBuffer->AvailableDataLength()), CHIP_ERROR_INVALID_ARGUMENT); + bufLen = static_cast<uint32_t>(mHeadBuffer->AvailableDataLength()); return CHIP_NO_ERROR; } @@ -72,11 +75,11 @@ CHIP_ERROR TLVPacketBufferBackingStore::FinalizeBuffer(chip::TLV::TLVWriter & wr uint8_t * endPtr = bufStart + dataLen; intptr_t length = endPtr - mCurrentBuffer->Start(); - if (!CanCastTo<uint16_t>(length)) + if (!CanCastTo<uint32_t>(length)) { return CHIP_ERROR_INVALID_ARGUMENT; } - mCurrentBuffer->SetDataLength(static_cast<uint16_t>(length), mHeadBuffer); + mCurrentBuffer->SetDataLength(static_cast<uint32_t>(length), mHeadBuffer); return CHIP_NO_ERROR; } @@ -107,7 +110,8 @@ CHIP_ERROR TLVPacketBufferBackingStore::GetNewBuffer(chip::TLV::TLVWriter & writ else { bufStart = mCurrentBuffer->Start(); - bufLen = mCurrentBuffer->MaxDataLength(); + VerifyOrReturnError(CanCastTo<uint32_t>(mCurrentBuffer->MaxDataLength()), CHIP_ERROR_INVALID_ARGUMENT); + bufLen = static_cast<uint32_t>(mCurrentBuffer->MaxDataLength()); } return CHIP_NO_ERROR; diff --git a/src/system/tests/TestSystemPacketBuffer.cpp b/src/system/tests/TestSystemPacketBuffer.cpp index 5ee708fcd476ed..c71ad542d6225a 100644 --- a/src/system/tests/TestSystemPacketBuffer.cpp +++ b/src/system/tests/TestSystemPacketBuffer.cpp @@ -34,6 +34,7 @@ #include <lib/support/CHIPMem.h> #include <lib/support/CodeUtils.h> +#include <lib/support/SafeInt.h> #include <platform/CHIPDeviceLayer.h> #include <system/SystemPacketBuffer.h> @@ -64,9 +65,9 @@ using ::chip::System::pbuf; #define OF_LWIP_PBUF(x) (reinterpret_cast<PacketBuffer *>(reinterpret_cast<void *>(x))) namespace { -void ScrambleData(uint8_t * start, uint16_t length) +void ScrambleData(uint8_t * start, size_t length) { - for (uint16_t i = 0; i < length; ++i) + for (size_t i = 0; i < length; ++i) ++start[i]; } } // namespace @@ -117,7 +118,7 @@ class TestSystemPacketBuffer : public ::testing::Test static void PrintHandle(const char * tag, const PacketBuffer * buffer) { - printf("%s %p ref=%u len=%-4u next=%p\n", StringOrNullMarker(tag), buffer, buffer ? buffer->ref : 0, + printf("%s %p ref=%u len=%-4zu next=%p\n", StringOrNullMarker(tag), buffer, buffer ? buffer->ref : 0, buffer ? buffer->len : 0, buffer ? buffer->next : nullptr); } static void PrintHandle(const char * tag, const PacketBufferHandle & handle) { PrintHandle(tag, handle.mBuffer); } @@ -129,7 +130,7 @@ class TestSystemPacketBuffer : public ::testing::Test handle(nullptr) {} - uint16_t init_len; + size_t init_len; uint16_t reserved_size; uint8_t * start_buffer; uint8_t * end_buffer; @@ -140,7 +141,7 @@ class TestSystemPacketBuffer : public ::testing::Test static void PrintHandle(const char * tag, const BufferConfiguration & config) { PrintHandle(tag, config.handle); } static void PrintConfig(const char * tag, const BufferConfiguration & config) { - printf("%s pay=%-4zu len=%-4u res=%-4u:", StringOrNullMarker(tag), config.payload_ptr - config.start_buffer, + printf("%s pay=%-4zu len=%-4zu res=%-4u:", StringOrNullMarker(tag), config.payload_ptr - config.start_buffer, config.init_len, config.reserved_size); PrintHandle("", config.handle); } @@ -209,21 +210,17 @@ void TestSystemPacketBuffer::PrepareTestBuffer(BufferConfiguration * config, int if (config->handle.IsNull()) { config->handle = PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSizeWithoutReserve, 0); - if (config->handle.IsNull()) - { - printf("NewPacketBuffer: Failed to allocate packet buffer (%u retained): %s\n", - static_cast<unsigned int>(handles.size()), strerror(errno)); - exit(EXIT_FAILURE); - } + VerifyOrDieWithMsg(!config->handle.IsNull(), chipSystemLayer, + "NewPacketBuffer: Failed to allocate packet buffer (%u retained): %s", + static_cast<unsigned int>(handles.size()), strerror(errno)); if (flags & kRecordHandle) { handles.push_back(config->handle.Retain()); } } - else if ((flags & kAllowHandleReuse) == 0) + else { - printf("Dirty test configuration\n"); - exit(EXIT_FAILURE); + VerifyOrDieWithMsg((flags & kAllowHandleReuse) != 0, chipSystemLayer, "Dirty test configuration"); } const size_t lInitialSize = kStructureSize + config->reserved_size; @@ -251,8 +248,15 @@ void TestSystemPacketBuffer::PrepareTestBuffer(BufferConfiguration * config, int config->handle->next = nullptr; } config->handle->payload = config->payload_ptr; +#if CHIP_SYSTEM_CONFIG_USE_LWIP + VerifyOrDieWithMsg(chip::CanCastTo<uint16_t>(config->init_len), chipSystemLayer, "Max Length exceeded for LwIP based systems"); + + config->handle->len = static_cast<uint16_t>(config->init_len); + config->handle->tot_len = static_cast<uint16_t>(config->init_len); +#else config->handle->len = config->init_len; config->handle->tot_len = config->init_len; +#endif } bool TestSystemPacketBuffer::ResetConfigurations() @@ -321,8 +325,8 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckNew) const pbuf * const pb = TO_LWIP_PBUF(buffer.Get()); // NOLINTEND(bugprone-casting-through-void) - EXPECT_EQ(pb->len, 0); - EXPECT_EQ(pb->tot_len, 0); + EXPECT_EQ(pb->len, static_cast<size_t>(0)); + EXPECT_EQ(pb->tot_len, static_cast<size_t>(0)); EXPECT_EQ(pb->next, nullptr); EXPECT_EQ(pb->ref, 1); } @@ -409,16 +413,17 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckSetStart) EXPECT_EQ(config.handle->payload, verify_start); - if ((verify_start - config.payload_ptr) > config.init_len) + if (verify_start - config.payload_ptr > static_cast<ptrdiff_t>(config.init_len)) { // Set start to the beginning of payload, right after handle's header. - EXPECT_EQ(config.handle->len, 0); + EXPECT_EQ(config.handle->len, static_cast<size_t>(0)); } else { // Set start to somewhere between the end of the handle's // header and the end of payload. - EXPECT_EQ(config.handle->len, (config.init_len - (verify_start - config.payload_ptr))); + EXPECT_EQ(config.handle->len, + static_cast<size_t>((static_cast<int32_t>(config.init_len) - (verify_start - config.payload_ptr)))); } } } @@ -467,8 +472,8 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckSetDataLength) if (length > (config_2.end_buffer - config_2.payload_ptr)) { - EXPECT_EQ(config_2.handle->len, (config_2.end_buffer - config_2.payload_ptr)); - EXPECT_EQ(config_2.handle->tot_len, (config_2.end_buffer - config_2.payload_ptr)); + EXPECT_EQ(config_2.handle->len, static_cast<size_t>(config_2.end_buffer - config_2.payload_ptr)); + EXPECT_EQ(config_2.handle->tot_len, static_cast<size_t>(config_2.end_buffer - config_2.payload_ptr)); EXPECT_EQ(config_2.handle.GetNext(), nullptr); } else @@ -485,13 +490,14 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckSetDataLength) if (length > (config_2.end_buffer - config_2.payload_ptr)) { - EXPECT_EQ(config_2.handle->len, (config_2.end_buffer - config_2.payload_ptr)); - EXPECT_EQ(config_2.handle->tot_len, (config_2.end_buffer - config_2.payload_ptr)); + EXPECT_EQ(config_2.handle->len, static_cast<size_t>(config_2.end_buffer - config_2.payload_ptr)); + EXPECT_EQ(config_2.handle->tot_len, static_cast<size_t>(config_2.end_buffer - config_2.payload_ptr)); EXPECT_EQ(config_2.handle.GetNext(), nullptr); EXPECT_EQ(config_1.handle->tot_len, - (config_1.init_len + static_cast<int32_t>(config_2.end_buffer - config_2.payload_ptr) - - static_cast<int32_t>(config_2.init_len))); + static_cast<size_t>(static_cast<int32_t>(config_1.init_len) + + static_cast<int32_t>(config_2.end_buffer - config_2.payload_ptr) - + static_cast<int32_t>(config_2.init_len))); } else { @@ -500,7 +506,8 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckSetDataLength) EXPECT_EQ(config_2.handle.GetNext(), nullptr); EXPECT_EQ(config_1.handle->tot_len, - (config_1.init_len + static_cast<int32_t>(length) - static_cast<int32_t>(config_2.init_len))); + static_cast<size_t>(static_cast<int32_t>(config_1.init_len) + static_cast<int32_t>(length) - + static_cast<int32_t>(config_2.init_len))); } } } @@ -528,7 +535,7 @@ TEST_F(TestSystemPacketBuffer, CheckMaxDataLength) for (auto & config : configurations) { PrepareTestBuffer(&config, kRecordHandle); - EXPECT_EQ(config.handle->MaxDataLength(), (config.end_buffer - config.payload_ptr)); + EXPECT_EQ(config.handle->MaxDataLength(), static_cast<size_t>(config.end_buffer - config.payload_ptr)); } } @@ -540,7 +547,9 @@ TEST_F(TestSystemPacketBuffer, CheckAvailableDataLength) for (auto & config : configurations) { PrepareTestBuffer(&config, kRecordHandle); - EXPECT_EQ(config.handle->AvailableDataLength(), ((config.end_buffer - config.payload_ptr) - config.init_len)); + EXPECT_EQ(config.handle->AvailableDataLength(), + static_cast<size_t>(static_cast<int32_t>(config.end_buffer - config.payload_ptr) - + static_cast<int32_t>(config.init_len))); } } @@ -729,7 +738,7 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckCompactHead) { PrepareTestBuffer(&config, kRecordHandle | kAllowHandleReuse); config.handle->SetDataLength(length, config.handle); - const uint16_t data_length = config.handle->DataLength(); + const uint32_t data_length = static_cast<uint32_t>(config.handle->DataLength()); config.handle->CompactHead(); @@ -769,14 +778,14 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckCompactHead) EXPECT_TRUE(config_2.handle.IsNull()); config_1.handle->SetDataLength(length_1, config_1.handle); - const uint16_t data_length_1 = config_1.handle->DataLength(); + const uint32_t data_length_1 = static_cast<uint32_t>(config_1.handle->DataLength()); // This chain will cause buffer_2 to be freed. config_1.handle->next = buffer_2; // Add various lengths to the second buffer buffer_2->SetDataLength(length_2, config_1.handle); - const uint16_t data_length_2 = buffer_2->DataLength(); + const uint32_t data_length_2 = static_cast<uint32_t>(buffer_2->DataLength()); config_1.handle->CompactHead(); @@ -841,8 +850,8 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckConsumeHead) if (length > config.init_len) { EXPECT_EQ(config.handle->payload, (config.payload_ptr + config.init_len)); - EXPECT_EQ(config.handle->len, 0); - EXPECT_EQ(config.handle->tot_len, 0); + EXPECT_EQ(config.handle->len, static_cast<size_t>(0)); + EXPECT_EQ(config.handle->tot_len, static_cast<size_t>(0)); } else { @@ -897,8 +906,8 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckConsume) config_1.handle->SetDataLength(len_1, config_1.handle); config_2.handle->SetDataLength(len_2, config_1.handle); - const uint16_t buf_1_len = config_1.handle->len; - const uint16_t buf_2_len = config_2.handle->len; + const uint32_t buf_1_len = static_cast<uint32_t>(config_1.handle->len); + const uint32_t buf_2_len = static_cast<uint32_t>(config_2.handle->len); PacketBufferHandle original_handle_1 = config_1.handle.Retain(); EXPECT_EQ(config_1.handle->ref, 2); // config_1.handle and original_handle_1 @@ -963,7 +972,7 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckEnsureReservedSize) for (auto length : kLengths) { PrepareTestBuffer(&config, kRecordHandle | kAllowHandleReuse); - const uint16_t kAllocSize = config.handle->AllocSize(); + const uint32_t kAllocSize = static_cast<uint32_t>(config.handle->AllocSize()); uint16_t reserved_size = config.reserved_size; if (kStructureSize + config.reserved_size > kAllocSize) @@ -1005,7 +1014,7 @@ TEST_F(TestSystemPacketBuffer, CheckAlignPayload) for (auto length : kLengths) { PrepareTestBuffer(&config, kRecordHandle | kAllowHandleReuse); - const uint16_t kAllocSize = config.handle->AllocSize(); + const uint32_t kAllocSize = static_cast<uint32_t>(config.handle->AllocSize()); if (length == 0) { @@ -1013,16 +1022,16 @@ TEST_F(TestSystemPacketBuffer, CheckAlignPayload) continue; } - uint16_t reserved_size = config.reserved_size; + uint32_t reserved_size = config.reserved_size; if (config.reserved_size > kAllocSize) { reserved_size = kAllocSize; } - const uint16_t payload_offset = static_cast<uint16_t>(reinterpret_cast<uintptr_t>(config.handle->Start()) % length); - uint16_t payload_shift = 0; + const uint32_t payload_offset = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(config.handle->Start()) % length); + uint32_t payload_shift = 0; if (payload_offset > 0) - payload_shift = static_cast<uint16_t>(length - payload_offset); + payload_shift = static_cast<uint32_t>(length - payload_offset); if (payload_shift <= kAllocSize - reserved_size) { @@ -1136,10 +1145,10 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckRead) PrepareTestBuffer(&config_1, kAllowHandleReuse); PrepareTestBuffer(&config_2, kAllowHandleReuse); - const uint16_t length_1 = config_1.handle->MaxDataLength(); - const uint16_t length_2 = config_2.handle->MaxDataLength(); + const size_t length_1 = config_1.handle->MaxDataLength(); + const size_t length_2 = config_2.handle->MaxDataLength(); const size_t length_sum = length_1 + length_2; - const uint16_t length_total = static_cast<uint16_t>(length_sum); + const uint32_t length_total = static_cast<uint32_t>(length_sum); EXPECT_EQ(length_total, length_sum); memcpy(config_1.handle->Start(), payloads, length_1); @@ -1167,7 +1176,7 @@ TEST_F_FROM_FIXTURE(TestSystemPacketBuffer, CheckRead) EXPECT_EQ(err, CHIP_ERROR_BUFFER_TOO_SMALL); // Check that running off the end of a corrupt buffer chain is detected. - if (length_total < UINT16_MAX) + if (length_total < UINT32_MAX) { // First case: TotalLength() is wrong. config_1.handle->tot_len = static_cast<uint16_t>(config_1.handle->tot_len + 1); diff --git a/src/system/tests/TestTLVPacketBufferBackingStore.cpp b/src/system/tests/TestTLVPacketBufferBackingStore.cpp index 6dc76fed46745e..8ebf23242efb95 100644 --- a/src/system/tests/TestTLVPacketBufferBackingStore.cpp +++ b/src/system/tests/TestTLVPacketBufferBackingStore.cpp @@ -81,8 +81,8 @@ TEST_F(TestTLVPacketBufferBackingStore, BasicEncodeDecode) // Array start/end is 2 bytes. Each entry is also 2 bytes: control + // value. So 8 bytes total. EXPECT_FALSE(buffer->HasChainedBuffer()); - EXPECT_EQ(buffer->TotalLength(), 8); - EXPECT_EQ(buffer->DataLength(), 8); + EXPECT_EQ(buffer->TotalLength(), static_cast<size_t>(8)); + EXPECT_EQ(buffer->DataLength(), static_cast<size_t>(8)); PacketBufferTLVReader reader; reader.Init(std::move(buffer)); @@ -163,7 +163,7 @@ TEST_F(TestTLVPacketBufferBackingStore, MultiBufferEncode) constexpr size_t totalSize = 2009; EXPECT_TRUE(buffer->HasChainedBuffer()); EXPECT_EQ(buffer->TotalLength(), totalSize); - EXPECT_EQ(buffer->DataLength(), 2); + EXPECT_EQ(buffer->DataLength(), static_cast<size_t>(2)); auto nextBuffer = buffer->Next(); EXPECT_TRUE(nextBuffer->HasChainedBuffer()); EXPECT_EQ(nextBuffer->TotalLength(), totalSize - 2); diff --git a/src/transport/SecureMessageCodec.cpp b/src/transport/SecureMessageCodec.cpp index 9c08d535ff57a3..3b70026c5681d6 100644 --- a/src/transport/SecureMessageCodec.cpp +++ b/src/transport/SecureMessageCodec.cpp @@ -43,13 +43,10 @@ CHIP_ERROR Encrypt(const CryptoContext & context, CryptoContext::ConstNonceView VerifyOrReturnError(!msgBuf->HasChainedBuffer(), CHIP_ERROR_INVALID_MESSAGE_LENGTH); VerifyOrReturnError(msgBuf->TotalLength() <= kMaxAppMessageLen, CHIP_ERROR_MESSAGE_TOO_LONG); - static_assert(std::is_same<decltype(msgBuf->TotalLength()), uint16_t>::value, - "Addition to generate payloadLength might overflow"); - ReturnErrorOnFailure(payloadHeader.EncodeBeforeData(msgBuf)); - uint8_t * data = msgBuf->Start(); - uint16_t totalLen = msgBuf->TotalLength(); + uint8_t * data = msgBuf->Start(); + size_t totalLen = msgBuf->TotalLength(); MessageAuthenticationCode mac; ReturnErrorOnFailure(context.Encrypt(data, totalLen, data, nonce, packetHeader, mac)); @@ -57,8 +54,7 @@ CHIP_ERROR Encrypt(const CryptoContext & context, CryptoContext::ConstNonceView uint16_t taglen = 0; ReturnErrorOnFailure(mac.Encode(packetHeader, &data[totalLen], msgBuf->AvailableDataLength(), &taglen)); - VerifyOrReturnError(CanCastTo<uint16_t>(totalLen + taglen), CHIP_ERROR_INTERNAL); - msgBuf->SetDataLength(static_cast<uint16_t>(totalLen + taglen)); + msgBuf->SetDataLength(totalLen + taglen); return CHIP_NO_ERROR; } @@ -69,7 +65,7 @@ CHIP_ERROR Decrypt(const CryptoContext & context, CryptoContext::ConstNonceView ReturnErrorCodeIf(msg.IsNull(), CHIP_ERROR_INVALID_ARGUMENT); uint8_t * data = msg->Start(); - uint16_t len = msg->DataLength(); + size_t len = msg->DataLength(); PacketBufferHandle origMsg; #if CHIP_SYSTEM_CONFIG_USE_LWIP @@ -89,7 +85,7 @@ CHIP_ERROR Decrypt(const CryptoContext & context, CryptoContext::ConstNonceView ReturnErrorOnFailure(mac.Decode(packetHeader, &data[len - footerLen], footerLen, &taglen)); VerifyOrReturnError(taglen == footerLen, CHIP_ERROR_INTERNAL); - len = static_cast<uint16_t>(len - taglen); + len = len - taglen; msg->SetDataLength(len); uint8_t * plainText = msg->Start(); diff --git a/src/transport/SessionManager.cpp b/src/transport/SessionManager.cpp index 7f7691ef00dbb7..5adfde18b47ff4 100644 --- a/src/transport/SessionManager.cpp +++ b/src/transport/SessionManager.cpp @@ -929,7 +929,7 @@ void SessionManager::SecureGroupMessageDispatch(const PacketHeader & partialPack // Extract MIC from the end of the message. uint8_t * data = msg->Start(); - uint16_t len = msg->DataLength(); + size_t len = msg->DataLength(); uint16_t footerLen = partialPacketHeader.MICTagLength(); VerifyOrReturn(footerLen <= len); diff --git a/src/transport/raw/MessageHeader.cpp b/src/transport/raw/MessageHeader.cpp index 2947756b644d1a..d9376328ee65fd 100644 --- a/src/transport/raw/MessageHeader.cpp +++ b/src/transport/raw/MessageHeader.cpp @@ -156,12 +156,12 @@ CHIP_ERROR PacketHeader::DecodeFixedCommon(Encoding::LittleEndian::Reader & read CHIP_ERROR PacketHeader::DecodeFixed(const System::PacketBufferHandle & buf) { const uint8_t * const data = buf->Start(); - uint16_t size = buf->DataLength(); + size_t size = buf->DataLength(); LittleEndian::Reader reader(data, size); return DecodeFixedCommon(reader); } -CHIP_ERROR PacketHeader::Decode(const uint8_t * const data, uint16_t size, uint16_t * decode_len) +CHIP_ERROR PacketHeader::Decode(const uint8_t * const data, size_t size, uint16_t * decode_len) { CHIP_ERROR err = CHIP_NO_ERROR; LittleEndian::Reader reader(data, size); @@ -247,7 +247,7 @@ CHIP_ERROR PacketHeader::DecodeAndConsume(const System::PacketBufferHandle & buf return CHIP_NO_ERROR; } -CHIP_ERROR PayloadHeader::Decode(const uint8_t * const data, uint16_t size, uint16_t * decode_len) +CHIP_ERROR PayloadHeader::Decode(const uint8_t * const data, size_t size, uint16_t * decode_len) { CHIP_ERROR err = CHIP_NO_ERROR; LittleEndian::Reader reader(data, size); @@ -312,7 +312,7 @@ CHIP_ERROR PayloadHeader::DecodeAndConsume(const System::PacketBufferHandle & bu return CHIP_NO_ERROR; } -CHIP_ERROR PacketHeader::Encode(uint8_t * data, uint16_t size, uint16_t * encode_size) const +CHIP_ERROR PacketHeader::Encode(uint8_t * data, size_t size, uint16_t * encode_size) const { VerifyOrReturnError(size >= EncodeSizeBytes(), CHIP_ERROR_INVALID_ARGUMENT); VerifyOrReturnError(!(mDestinationNodeId.HasValue() && mDestinationGroupId.HasValue()), CHIP_ERROR_INTERNAL); @@ -364,7 +364,7 @@ CHIP_ERROR PacketHeader::EncodeBeforeData(const System::PacketBufferHandle & buf return CHIP_NO_ERROR; } -CHIP_ERROR PayloadHeader::Encode(uint8_t * data, uint16_t size, uint16_t * encode_size) const +CHIP_ERROR PayloadHeader::Encode(uint8_t * data, size_t size, uint16_t * encode_size) const { VerifyOrReturnError(size >= EncodeSizeBytes(), CHIP_ERROR_INVALID_ARGUMENT); @@ -404,7 +404,7 @@ CHIP_ERROR PayloadHeader::EncodeBeforeData(const System::PacketBufferHandle & bu return CHIP_NO_ERROR; } -CHIP_ERROR MessageAuthenticationCode::Decode(const PacketHeader & packetHeader, const uint8_t * const data, uint16_t size, +CHIP_ERROR MessageAuthenticationCode::Decode(const PacketHeader & packetHeader, const uint8_t * const data, size_t size, uint16_t * decode_len) { const uint16_t taglen = packetHeader.MICTagLength(); @@ -419,7 +419,7 @@ CHIP_ERROR MessageAuthenticationCode::Decode(const PacketHeader & packetHeader, return CHIP_NO_ERROR; } -CHIP_ERROR MessageAuthenticationCode::Encode(const PacketHeader & packetHeader, uint8_t * data, uint16_t size, +CHIP_ERROR MessageAuthenticationCode::Encode(const PacketHeader & packetHeader, uint8_t * data, size_t size, uint16_t * encode_size) const { uint8_t * p = data; diff --git a/src/transport/raw/MessageHeader.h b/src/transport/raw/MessageHeader.h index 7c637fa782d957..ef4f86d3993793 100644 --- a/src/transport/raw/MessageHeader.h +++ b/src/transport/raw/MessageHeader.h @@ -418,13 +418,13 @@ class PacketHeader * CHIP_ERROR_INVALID_ARGUMENT on insufficient buffer size * CHIP_ERROR_VERSION_MISMATCH if header version is not supported. */ - CHIP_ERROR Decode(const uint8_t * data, uint16_t size, uint16_t * decode_size); + CHIP_ERROR Decode(const uint8_t * data, size_t size, uint16_t * decode_size); /** * A version of Decode that uses the type system to determine available * space. */ - template <uint16_t N> + template <size_t N> inline CHIP_ERROR Decode(const uint8_t (&data)[N], uint16_t * decode_size) { return Decode(data, N, decode_size); @@ -448,13 +448,13 @@ class PacketHeader * Possible failures: * CHIP_ERROR_INVALID_ARGUMENT on insufficient buffer size */ - CHIP_ERROR Encode(uint8_t * data, uint16_t size, uint16_t * encode_size) const; + CHIP_ERROR Encode(uint8_t * data, size_t size, uint16_t * encode_size) const; /** * A version of Encode that uses the type system to determine available * space. */ - template <int N> + template <size_t N> inline CHIP_ERROR Encode(uint8_t (&data)[N], uint16_t * encode_size) const { return Encode(data, N, encode_size); @@ -662,13 +662,13 @@ class PayloadHeader * CHIP_ERROR_INVALID_ARGUMENT on insufficient buffer size * CHIP_ERROR_VERSION_MISMATCH if header version is not supported. */ - CHIP_ERROR Decode(const uint8_t * data, uint16_t size, uint16_t * decode_size); + CHIP_ERROR Decode(const uint8_t * data, size_t size, uint16_t * decode_size); /** * A version of Decode that uses the type system to determine available * space. */ - template <uint16_t N> + template <size_t N> inline CHIP_ERROR Decode(const uint8_t (&data)[N], uint16_t * decode_size) { return Decode(data, N, decode_size); @@ -692,13 +692,13 @@ class PayloadHeader * Possible failures: * CHIP_ERROR_INVALID_ARGUMENT on insufficient buffer size */ - CHIP_ERROR Encode(uint8_t * data, uint16_t size, uint16_t * encode_size) const; + CHIP_ERROR Encode(uint8_t * data, size_t size, uint16_t * encode_size) const; /** * A version of Encode that uses the type system to determine available * space. */ - template <uint16_t N> + template <size_t N> inline CHIP_ERROR Encode(uint8_t (&data)[N], uint16_t * decode_size) const { return Encode(data, N, decode_size); @@ -779,7 +779,7 @@ class MessageAuthenticationCode * CHIP_ERROR_INVALID_ARGUMENT on insufficient buffer size * CHIP_ERROR_VERSION_MISMATCH if header version is not supported. */ - CHIP_ERROR Decode(const PacketHeader & packetHeader, const uint8_t * data, uint16_t size, uint16_t * decode_size); + CHIP_ERROR Decode(const PacketHeader & packetHeader, const uint8_t * data, size_t size, uint16_t * decode_size); /** * Encodes the Messae Authentication Tag into the given buffer. @@ -794,7 +794,7 @@ class MessageAuthenticationCode * Possible failures: * CHIP_ERROR_INVALID_ARGUMENT on insufficient buffer size */ - CHIP_ERROR Encode(const PacketHeader & packetHeader, uint8_t * data, uint16_t size, uint16_t * encode_size) const; + CHIP_ERROR Encode(const PacketHeader & packetHeader, uint8_t * data, size_t size, uint16_t * encode_size) const; private: /// Message authentication tag generated at encryption of the message. From dd5f6b7b0e4514293754d303b564f78b496b4863 Mon Sep 17 00:00:00 2001 From: mkardous-silabs <84793247+mkardous-silabs@users.noreply.github.com> Date: Fri, 26 Apr 2024 17:47:27 -0400 Subject: [PATCH 065/124] [ICD] Add counter invalidation events to the ICD Test Event trigger handler (#33174) * Add counter invalidation events to the ICD Test Event trigger handler * add issue number * address review comments * add missing dependency * Update counter interfaces * Update CheckInCounter to fit counter changes * Fix openiot ci * Add missing type * Fix templates for uint8 type * Apply suggestions from code review Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Fix TestICDManager with counter API * Cover rollover case for AdvanceBy and add unit test to validate behavior * Update comment * restyle * fix macro in template headeR * Update src/lib/support/PersistedCounter.h Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * restyle --------- Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> --- src/BUILD.gn | 1 + src/app/icd/server/ICDManager.cpp | 14 +- src/app/tests/TestICDManager.cpp | 52 +++- src/lib/support/CHIPCounter.h | 37 ++- src/lib/support/PersistedCounter.h | 74 ++++- src/lib/support/tests/BUILD.gn | 4 +- src/lib/support/tests/TestCHIPCounter.cpp | 95 +++--- .../support/tests/TestPersistedCounter.cpp | 286 +++++++++++------- src/protocols/secure_channel/BUILD.gn | 11 +- .../secure_channel/CheckInCounter.cpp | 47 +++ src/protocols/secure_channel/CheckInCounter.h | 19 ++ src/protocols/secure_channel/tests/BUILD.gn | 18 +- .../tests/TestCheckInCounter.cpp | 129 ++++++++ src/python_testing/TC_ICDManagementCluster.py | 55 +++- .../openiotsdk/unit-tests/test_components.txt | 1 + .../unit-tests/test_components_nl.txt | 2 +- 16 files changed, 633 insertions(+), 212 deletions(-) create mode 100644 src/protocols/secure_channel/CheckInCounter.cpp create mode 100644 src/protocols/secure_channel/tests/TestCheckInCounter.cpp diff --git a/src/BUILD.gn b/src/BUILD.gn index dd69734ffc68e6..6bf4a2ed6d7071 100644 --- a/src/BUILD.gn +++ b/src/BUILD.gn @@ -99,6 +99,7 @@ if (chip_build_tests) { "${chip_root}/src/lib/support/tests", "${chip_root}/src/lib/support/tests:tests_nltest", "${chip_root}/src/protocols/secure_channel/tests", + "${chip_root}/src/protocols/secure_channel/tests:tests_nltest", "${chip_root}/src/system/tests", "${chip_root}/src/transport/tests", ] diff --git a/src/app/icd/server/ICDManager.cpp b/src/app/icd/server/ICDManager.cpp index 8691a4d1360c64..d2755f7a187f06 100644 --- a/src/app/icd/server/ICDManager.cpp +++ b/src/app/icd/server/ICDManager.cpp @@ -30,8 +30,10 @@ namespace { enum class ICDTestEventTriggerEvent : uint64_t { - kAddActiveModeReq = 0x0046'0000'00000001, - kRemoveActiveModeReq = 0x0046'0000'00000002, + kAddActiveModeReq = 0x0046'0000'00000001, + kRemoveActiveModeReq = 0x0046'0000'00000002, + kInvalidateHalfCounterValues = 0x0046'0000'00000003, + kInvalidateAllCounterValues = 0x0046'0000'00000004, }; } // namespace @@ -666,6 +668,14 @@ CHIP_ERROR ICDManager::HandleEventTrigger(uint64_t eventTrigger) case ICDTestEventTriggerEvent::kRemoveActiveModeReq: SetKeepActiveModeRequirements(KeepActiveFlag::kTestEventTriggerActiveMode, false); break; +#if CHIP_CONFIG_ENABLE_ICD_CIP + case ICDTestEventTriggerEvent::kInvalidateHalfCounterValues: + err = ICDConfigurationData::GetInstance().GetICDCounter().InvalidateHalfCheckInCouterValues(); + break; + case ICDTestEventTriggerEvent::kInvalidateAllCounterValues: + err = ICDConfigurationData::GetInstance().GetICDCounter().InvalidateAllCheckInCounterValues(); + break; +#endif // CHIP_CONFIG_ENABLE_ICD_CIP default: err = CHIP_ERROR_INVALID_ARGUMENT; break; diff --git a/src/app/tests/TestICDManager.cpp b/src/app/tests/TestICDManager.cpp index 6e814ebb01f579..ea49e0ac557fc8 100644 --- a/src/app/tests/TestICDManager.cpp +++ b/src/app/tests/TestICDManager.cpp @@ -70,8 +70,10 @@ constexpr uint8_t kKeyBuffer2b[] = { // Taken from the ICDManager Implementation enum class ICDTestEventTriggerEvent : uint64_t { - kAddActiveModeReq = 0x0046'0000'00000001, - kRemoveActiveModeReq = 0x0046'0000'00000002, + kAddActiveModeReq = 0x0046'0000'00000001, + kRemoveActiveModeReq = 0x0046'0000'00000002, + kInvalidateHalfCounterValues = 0x0046'0000'00000003, + kInvalidateAllCounterValues = 0x0046'0000'00000004, }; class TestICDStateObserver : public app::ICDStateObserver @@ -742,6 +744,48 @@ class TestICDManager NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); } + static void TestHandleTestEventTriggerInvalidateHalfCounterValues(nlTestSuite * aSuite, void * aContext) + { + TestContext * ctx = static_cast<TestContext *>(aContext); + + constexpr uint32_t startValue = 1; + constexpr uint32_t expectedValue = 2147483648; + + // Set starting value + uint32_t currentValue = ICDConfigurationData::GetInstance().GetICDCounter().GetValue(); + uint32_t delta = startValue - currentValue; + + NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDCounter().AdvanceBy(delta) == CHIP_NO_ERROR); + NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDCounter().GetValue() == startValue); + + // Trigger ICD kInvalidateHalfCounterValues event + ctx->mICDManager.HandleEventTrigger(static_cast<uint64_t>(ICDTestEventTriggerEvent::kInvalidateHalfCounterValues)); + + // Validate counter has the expected value + NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDCounter().GetValue() == expectedValue); + } + + static void TestHandleTestEventTriggerInvalidateAllCounterValues(nlTestSuite * aSuite, void * aContext) + { + TestContext * ctx = static_cast<TestContext *>(aContext); + + constexpr uint32_t startValue = 105; + constexpr uint32_t expectedValue = 104; + + // Set starting value + uint32_t currentValue = ICDConfigurationData::GetInstance().GetICDCounter().GetValue(); + uint32_t delta = startValue - currentValue; + + NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDCounter().AdvanceBy(delta) == CHIP_NO_ERROR); + NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDCounter().GetValue() == startValue); + + // Trigger ICD kInvalidateAllCounterValues event + ctx->mICDManager.HandleEventTrigger(static_cast<uint64_t>(ICDTestEventTriggerEvent::kInvalidateAllCounterValues)); + + // Validate counter has the expected value + NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDCounter().GetValue() == expectedValue); + } + /** * @brief Test verifies when OnEnterIdleMode is called during normal operations. * Without the ActiveMode timer being extended @@ -1083,6 +1127,10 @@ static const nlTest sTests[] = { NL_TEST_DEF("TestICDStayActive", TestICDManager::TestICDMStayActive), 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("TestICDStateObserverOnEnterIdleModeActiveModeDuration", TestICDManager::TestICDStateObserverOnEnterIdleModeActiveModeDuration), NL_TEST_DEF("TestICDStateObserverOnEnterIdleModeActiveModeThreshold", diff --git a/src/lib/support/CHIPCounter.h b/src/lib/support/CHIPCounter.h index 89a7bb751ad645..7e34425c1ab46c 100644 --- a/src/lib/support/CHIPCounter.h +++ b/src/lib/support/CHIPCounter.h @@ -45,16 +45,23 @@ class Counter virtual ~Counter() {} /** - * @brief - * Advance the value of the counter. + * @brief Advance the value of the counter. * * @return A CHIP error code if anything failed, CHIP_NO_ERROR otherwise. */ virtual CHIP_ERROR Advance() = 0; /** - * @brief - * Get the current value of the counter. + * @brief Advances the current counter value by N + * + * @param value value of N + * + * @return A CHIP error code if anything failed, CHIP_NO_ERROR otherwise. + */ + virtual CHIP_ERROR AdvanceBy(T value) = 0; + + /** + * @brief Get the current value of the counter. * * @return The current value of the counter. */ @@ -76,8 +83,7 @@ class MonotonicallyIncreasingCounter : public Counter<T> ~MonotonicallyIncreasingCounter() override{}; /** - * @brief - * Initialize a MonotonicallyIncreasingCounter object. + * @brief Initialize a MonotonicallyIncreasingCounter object. * * @param[in] aStartValue The starting value of the counter. * @@ -93,8 +99,7 @@ class MonotonicallyIncreasingCounter : public Counter<T> } /** - * @brief - * Advance the value of the counter. + * @brief Advance the value of the counter. * * @return A CHIP error code if something fails, CHIP_NO_ERROR otherwise */ @@ -108,8 +113,20 @@ class MonotonicallyIncreasingCounter : public Counter<T> } /** - * @brief - * Get the current value of the counter. + * @brief Advances the current counter value by N + * + * @param value value of N + * + * @return A CHIP error code if something fails, CHIP_NO_ERROR otherwise + */ + CHIP_ERROR AdvanceBy(T value) override + { + mCounterValue = static_cast<T>(mCounterValue + value); + return CHIP_NO_ERROR; + } + + /** + * @brief Get the current value of the counter. * * @return The current value of the counter. */ diff --git a/src/lib/support/PersistedCounter.h b/src/lib/support/PersistedCounter.h index 02096a486edcd3..24640d24057f20 100644 --- a/src/lib/support/PersistedCounter.h +++ b/src/lib/support/PersistedCounter.h @@ -32,6 +32,7 @@ #include <lib/support/CHIPCounter.h> #include <lib/support/CodeUtils.h> #include <lib/support/DefaultStorageKeyAllocator.h> +#include <limits> namespace chip { @@ -104,16 +105,50 @@ class PersistedCounter : public MonotonicallyIncreasingCounter<T> } #endif - ReturnErrorOnFailure(PersistNextEpochStart(startValue + aEpoch)); + ReturnErrorOnFailure(PersistNextEpochStart(static_cast<T>(startValue + aEpoch))); // This will set the starting value, after which we're ready. return MonotonicallyIncreasingCounter<T>::Init(startValue); } /** - * @brief - * Increment the counter and write to persisted storage if we've completed - * the current epoch. + * @brief Increment the counter by N and write to persisted storage if we've completed the current epoch. + * + * @param value value of N + * + * @return Any error returned by a write to persisted storage. + */ + CHIP_ERROR AdvanceBy(T value) override + { + VerifyOrReturnError(mStorage != nullptr, CHIP_ERROR_INCORRECT_STATE); + VerifyOrReturnError(mKey.IsInitialized(), CHIP_ERROR_INCORRECT_STATE); + + // If value is 0, we do not need to do anything + VerifyOrReturnError(value > 0, CHIP_NO_ERROR); + + // We should update the persisted epoch value if : + // 1- Sum of the current counter and value is greater or equal to the mNextEpoch. + // This is the standard operating case. + // 2- Increasing the current counter by value would cause a roll over. This would cause the current value to be < to the + // mNextEpoch so we force an update. + bool shouldDoEpochUpdate = ((MonotonicallyIncreasingCounter<T>::GetValue() + value) >= mNextEpoch) || + (MonotonicallyIncreasingCounter<T>::GetValue() > std::numeric_limits<T>::max() - value); + + ReturnErrorOnFailure(MonotonicallyIncreasingCounter<T>::AdvanceBy(value)); + + if (shouldDoEpochUpdate) + { + // Since AdvanceBy allows the counter to be increased by an arbitrary value, it is possible that the new counter value + // is greater than mNextEpoch + mEpoch. As such, we want the next Epoch value to be calculated from the new current + // value. + PersistAndVerifyNextEpochStart(MonotonicallyIncreasingCounter<T>::GetValue()); + } + + return CHIP_NO_ERROR; + } + + /** + * @brief Increment the counter and write to persisted storage if we've completed the current epoch. * * @return Any error returned by a write to persisted storage. */ @@ -126,18 +161,32 @@ class PersistedCounter : public MonotonicallyIncreasingCounter<T> if (MonotonicallyIncreasingCounter<T>::GetValue() >= mNextEpoch) { - // Value advanced past the previously persisted "start point". - // Ensure that a new starting point is persisted. - ReturnErrorOnFailure(PersistNextEpochStart(mNextEpoch + mEpoch)); - - // Advancing the epoch should have ensured that the current value - // is valid - VerifyOrReturnError(MonotonicallyIncreasingCounter<T>::GetValue() < mNextEpoch, CHIP_ERROR_INTERNAL); + ReturnErrorOnFailure(PersistAndVerifyNextEpochStart(mNextEpoch)); } + return CHIP_NO_ERROR; } private: + CHIP_ERROR PersistAndVerifyNextEpochStart(T refEpoch) + { + // Value advanced past the previously persisted "start point". + // Ensure that a new starting point is persisted. + ReturnErrorOnFailure(PersistNextEpochStart(static_cast<T>(refEpoch + mEpoch))); + + // Advancing the epoch should have ensured that the current value is valid + VerifyOrReturnError(static_cast<T>(MonotonicallyIncreasingCounter<T>::GetValue() + mEpoch) == mNextEpoch, + CHIP_ERROR_INTERNAL); + + // Previous check did not take into consideration that the counter value can be equal to the max counter value or + // rollover. + // TODO(#33175): PersistedCounter allows rollover so this check is incorrect. We need a Counter class that adequatly + // manages rollover behavior for counters that cannot rollover. + // VerifyOrReturnError(MonotonicallyIncreasingCounter<T>::GetValue() < mNextEpoch, CHIP_ERROR_INTERNAL); + + return CHIP_NO_ERROR; + } + /** * @brief * Write out the counter value to persistent storage. @@ -146,7 +195,8 @@ class PersistedCounter : public MonotonicallyIncreasingCounter<T> * * @return Any error returned by a write to persistent storage. */ - CHIP_ERROR PersistNextEpochStart(T aStartValue) + CHIP_ERROR + PersistNextEpochStart(T aStartValue) { mNextEpoch = aStartValue; #if CHIP_CONFIG_PERSISTED_COUNTER_DEBUG_LOGGING diff --git a/src/lib/support/tests/BUILD.gn b/src/lib/support/tests/BUILD.gn index 7a19ea2415e895..6a7c7905d27c02 100644 --- a/src/lib/support/tests/BUILD.gn +++ b/src/lib/support/tests/BUILD.gn @@ -28,11 +28,13 @@ chip_test_suite("tests") { "TestBufferWriter.cpp", "TestBytesCircularBuffer.cpp", "TestBytesToHex.cpp", + "TestCHIPCounter.cpp", "TestDefer.cpp", "TestErrorStr.cpp", "TestFixedBufferAllocator.cpp", "TestFold.cpp", "TestIniEscaping.cpp", + "TestPersistedCounter.cpp", "TestPrivateHeap.cpp", "TestSafeInt.cpp", "TestSafeString.cpp", @@ -74,13 +76,11 @@ chip_test_suite_using_nltest("tests_nltest") { output_name = "libSupportTestsNL" test_sources = [ - "TestCHIPCounter.cpp", "TestCHIPMem.cpp", "TestCHIPMemString.cpp", "TestIntrusiveList.cpp", "TestJsonToTlv.cpp", "TestJsonToTlvToJson.cpp", - "TestPersistedCounter.cpp", "TestPool.cpp", "TestStateMachine.cpp", "TestThreadOperationalDataset.cpp", diff --git a/src/lib/support/tests/TestCHIPCounter.cpp b/src/lib/support/tests/TestCHIPCounter.cpp index ee049fa04060e0..d1212b97c5a3b7 100644 --- a/src/lib/support/tests/TestCHIPCounter.cpp +++ b/src/lib/support/tests/TestCHIPCounter.cpp @@ -16,82 +16,63 @@ * limitations under the License. */ -#include <nlunit-test.h> - +#include <gtest/gtest.h> #include <lib/support/CHIPCounter.h> -#include <lib/support/UnitTestRegistration.h> +#include <stdint.h> + +using namespace chip; -static void CheckStartWithZero(nlTestSuite * inSuite, void * inContext) +TEST(TestCHIPCounter, TestStartWithZero) { - chip::MonotonicallyIncreasingCounter<uint64_t> counter; - NL_TEST_ASSERT(inSuite, counter.GetValue() == 0); + MonotonicallyIncreasingCounter<uint64_t> counter; + EXPECT_EQ(counter.GetValue(), 0ULL); } -static void CheckInitialize(nlTestSuite * inSuite, void * inContext) +TEST(TestCHIPCounter, TestInitialize) { - chip::MonotonicallyIncreasingCounter<uint64_t> counter; + MonotonicallyIncreasingCounter<uint64_t> counter; - NL_TEST_ASSERT(inSuite, counter.Init(4321) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, counter.GetValue() == 4321); + EXPECT_EQ(counter.Init(4321), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), 4321ULL); } -static void CheckAdvance(nlTestSuite * inSuite, void * inContext) +TEST(TestCHIPCounter, TestAdvance) { - chip::MonotonicallyIncreasingCounter<uint64_t> counter; + MonotonicallyIncreasingCounter<uint64_t> counter; - NL_TEST_ASSERT(inSuite, counter.Init(22) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, counter.GetValue() == 22); - NL_TEST_ASSERT(inSuite, counter.Advance() == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, counter.GetValue() == 23); - NL_TEST_ASSERT(inSuite, counter.Advance() == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, counter.GetValue() == 24); + EXPECT_EQ(counter.Init(22), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), 22ULL); + EXPECT_EQ(counter.Advance(), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), 23ULL); + EXPECT_EQ(counter.Advance(), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), 24ULL); } -/** - * Test Suite. It lists all the test functions. - */ - -// clang-format off -static const nlTest sTests[] = +TEST(TestCHIPCounter, TestAdvanceWithRollover) { - NL_TEST_DEF("Start with zero", CheckStartWithZero), - NL_TEST_DEF("Can initialize", CheckInitialize), - NL_TEST_DEF("Can Advance", CheckAdvance), - NL_TEST_SENTINEL() -}; -// clang-format on + MonotonicallyIncreasingCounter<uint64_t> counter; + EXPECT_EQ(counter.Init(UINT64_MAX), CHIP_NO_ERROR); -/** - * Set up the test suite. - */ -static int TestSetup(void * inContext) -{ - return (SUCCESS); + EXPECT_EQ(counter.Advance(), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), 0ULL); } -/** - * Tear down the test suite. - */ -static int TestTeardown(void * inContext) +TEST(TestCHIPCounter, AdvanceBy) { - return (SUCCESS); -} + MonotonicallyIncreasingCounter<uint64_t> counter; + constexpr uint64_t step = 9876; + uint64_t expectedValue = step; -int TestCHIPCounter() -{ - // clang-format off - nlTestSuite theSuite = { - "chip-counter", - &sTests[0], - TestSetup, - TestTeardown - }; - // clang-format on + EXPECT_EQ(counter.Init(0), CHIP_NO_ERROR); + EXPECT_EQ(counter.AdvanceBy(step), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), expectedValue); - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); + expectedValue += step; + EXPECT_EQ(counter.AdvanceBy(step), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), expectedValue); - return nlTestRunnerStats(&theSuite); + // Force rollover + expectedValue += UINT64_MAX; + EXPECT_EQ(counter.AdvanceBy(UINT64_MAX), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), expectedValue); } - -CHIP_REGISTER_TEST_SUITE(TestCHIPCounter) diff --git a/src/lib/support/tests/TestPersistedCounter.cpp b/src/lib/support/tests/TestPersistedCounter.cpp index e4cf11de9fbc9b..3d9b13583e49a0 100644 --- a/src/lib/support/tests/TestPersistedCounter.cpp +++ b/src/lib/support/tests/TestPersistedCounter.cpp @@ -23,169 +23,223 @@ * */ -#include <map> -#include <string> - -#include <stdint.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <nlunit-test.h> - -#include <CHIPVersion.h> -#include <lib/support/Base64.h> -#include <lib/support/CHIPArgParser.hpp> -#include <lib/support/CHIPMem.h> -#include <lib/support/CodeUtils.h> +#include <gtest/gtest.h> +#include <lib/core/CHIPEncoding.h> #include <lib/support/DefaultStorageKeyAllocator.h> #include <lib/support/PersistedCounter.h> #include <lib/support/TestPersistentStorageDelegate.h> -#include <lib/support/UnitTestContext.h> -#include <lib/support/UnitTestRegistration.h> -#include <platform/ConfigurationManager.h> #include <platform/PersistedStorage.h> -namespace { +using namespace chip; -chip::TestPersistentStorageDelegate * sPersistentStore = nullptr; - -} // namespace +namespace { -struct TestPersistedCounterContext +TEST(TestPersistedCounter, TestOutOfBox) { - TestPersistedCounterContext(); - bool mVerbose; -}; + TestPersistentStorageDelegate storage; + PersistedCounter<uint64_t> counter; -TestPersistedCounterContext::TestPersistedCounterContext() : mVerbose(false) {} + // When initializing the first time out of the box, we should have a count of 0 and a value of 0x10000 for the next starting + // value in persistent storage. + EXPECT_EQ(counter.Init(&storage, DefaultStorageKeyAllocator::IMEventNumber(), 0x10000), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), 0ULL); +} -static void InitializePersistedStorage(TestPersistedCounterContext * context) +TEST(TestPersistedCounter, TestReboot) { - if (sPersistentStore != nullptr) - { - delete sPersistentStore; - } + chip::TestPersistentStorageDelegate storage; + chip::PersistedCounter<uint64_t> counter, counter2; - sPersistentStore = new chip::TestPersistentStorageDelegate; -} + // When initializing the first time out of the box, we should have a count of 0. + EXPECT_EQ(counter.Init(&storage, chip::DefaultStorageKeyAllocator::IMEventNumber(), 0x10000), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), 0ULL); -static int TestSetup(void * inContext) -{ - return SUCCESS; + // Now we "reboot", and we should get a count of 0x10000. + EXPECT_EQ(counter2.Init(&storage, chip::DefaultStorageKeyAllocator::IMEventNumber(), 0x10000), CHIP_NO_ERROR); + EXPECT_EQ(counter2.GetValue(), 0x10000ULL); } -static int TestTeardown(void * inContext) +TEST(TestPersistedCounter, TestkWriteNextCounterStart) { - if (sPersistentStore != nullptr) - { - delete sPersistentStore; - sPersistentStore = nullptr; - } - return SUCCESS; -} + chip::TestPersistentStorageDelegate storage; + chip::PersistedCounter<uint64_t> counter; -static void CheckOOB(nlTestSuite * inSuite, void * inContext) -{ - TestPersistedCounterContext * context = static_cast<TestPersistedCounterContext *>(inContext); + uint64_t storedValue = 0; + uint16_t size = sizeof(storedValue); - InitializePersistedStorage(context); + // When initializing the first time out of the box, we should have a count of 0. + EXPECT_EQ(counter.Init(&storage, chip::DefaultStorageKeyAllocator::IMEventNumber(), 0x10000), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), 0ULL); - // When initializing the first time out of the box, we should have - // a count of 0 and a value of 0x10000 for the next starting value - // in persistent storage. + // Check new Epoch value was persisted + EXPECT_EQ(storage.SyncGetKeyValue(chip::DefaultStorageKeyAllocator::IMEventNumber().KeyName(), &storedValue, size), + CHIP_NO_ERROR); + EXPECT_EQ(sizeof(storedValue), size); + storedValue = Encoding::LittleEndian::HostSwap<uint64_t>(storedValue); + EXPECT_EQ(0x10000ULL, storedValue); - chip::PersistedCounter<uint64_t> counter; + // Verify that we write out the next starting counter value after + // we've exhausted the counter's range. + for (int32_t i = 0; i < 0x10000; i++) + { + EXPECT_EQ(counter.Advance(), CHIP_NO_ERROR); + } + EXPECT_EQ(counter.GetValue(), 0x10000ULL); - CHIP_ERROR err = counter.Init(sPersistentStore, chip::DefaultStorageKeyAllocator::IMEventNumber(), 0x10000); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + // Check new Epoch value was persisted + EXPECT_EQ(storage.SyncGetKeyValue(chip::DefaultStorageKeyAllocator::IMEventNumber().KeyName(), &storedValue, size), + CHIP_NO_ERROR); + EXPECT_EQ(sizeof(storedValue), size); + storedValue = Encoding::LittleEndian::HostSwap<uint64_t>(storedValue); + EXPECT_EQ(0x20000ULL, storedValue); - auto value = counter.GetValue(); - NL_TEST_ASSERT(inSuite, value == 0); + for (int32_t i = 0; i < 0x10000; i++) + { + EXPECT_EQ(counter.Advance(), CHIP_NO_ERROR); + } + EXPECT_EQ(counter.GetValue(), 0x20000ULL); + + // Check new Epoch value was persisted + EXPECT_EQ(storage.SyncGetKeyValue(chip::DefaultStorageKeyAllocator::IMEventNumber().KeyName(), &storedValue, size), + CHIP_NO_ERROR); + EXPECT_EQ(sizeof(storedValue), size); + storedValue = Encoding::LittleEndian::HostSwap<uint64_t>(storedValue); + EXPECT_EQ(0x30000ULL, storedValue); } -static void CheckReboot(nlTestSuite * inSuite, void * inContext) +TEST(TestPersistedCounter, TestAdvanceMaxCounterValue) { - TestPersistedCounterContext * context = static_cast<TestPersistedCounterContext *>(inContext); - - InitializePersistedStorage(context); - - chip::PersistedCounter<uint64_t> counter, counter2; + chip::TestPersistentStorageDelegate storage; + chip::PersistedCounter<uint8_t> counter; - // When initializing the first time out of the box, we should have - // a count of 0. + uint8_t storedValue = 0; + uint16_t size = sizeof(storedValue); - CHIP_ERROR err = counter.Init(sPersistentStore, chip::DefaultStorageKeyAllocator::IMEventNumber(), 0x10000); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + // When initializing the first time out of the box, we should have a count of 0. + EXPECT_EQ(counter.Init(&storage, chip::DefaultStorageKeyAllocator::IMEventNumber(), 1U), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), 0); - auto value = counter.GetValue(); - NL_TEST_ASSERT(inSuite, value == 0); + for (uint16_t i = 0; i < UINT8_MAX; i++) + { + // Make sure we can increment to max value without error + EXPECT_EQ(counter.Advance(), CHIP_NO_ERROR); + } + EXPECT_EQ(counter.GetValue(), 255); - // Now we "reboot", and we should get a count of 0x10000. + // Check new Epoch value was persisted + EXPECT_EQ(storage.SyncGetKeyValue(chip::DefaultStorageKeyAllocator::IMEventNumber().KeyName(), &storedValue, size), + CHIP_NO_ERROR); + EXPECT_EQ(sizeof(storedValue), size); + storedValue = Encoding::LittleEndian::HostSwap<uint8_t>(storedValue); - err = counter2.Init(sPersistentStore, chip::DefaultStorageKeyAllocator::IMEventNumber(), 0x10000); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(storedValue, 0); - value = counter2.GetValue(); - NL_TEST_ASSERT(inSuite, value == 0x10000); + // Increment one more step to make sure counter continues to increment + EXPECT_EQ(counter.Advance(), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), 0); } -static void CheckWriteNextCounterStart(nlTestSuite * inSuite, void * inContext) +TEST(TestPersistedCounter, TestAdvanceBy) { - TestPersistedCounterContext * context = static_cast<TestPersistedCounterContext *>(inContext); + chip::TestPersistentStorageDelegate storage; + chip::PersistedCounter<uint64_t> counter; - InitializePersistedStorage(context); + // Test values + constexpr uint64_t startingEpochValue = 65535; + constexpr uint64_t newValue = 2 * startingEpochValue + 156; + constexpr uint64_t newEpochValue = newValue + startingEpochValue; + uint64_t storedValue = 0; + uint16_t size = sizeof(storedValue); - chip::PersistedCounter<uint64_t> counter; + // When initializing the first time out of the box, we should have a count of 0. + EXPECT_EQ(counter.Init(&storage, chip::DefaultStorageKeyAllocator::IMEventNumber(), startingEpochValue), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), 0ULL); - // When initializing the first time out of the box, we should have - // a count of 0. + // Set New value + EXPECT_EQ(counter.AdvanceBy(newValue), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), newValue); - CHIP_ERROR err = counter.Init(sPersistentStore, chip::DefaultStorageKeyAllocator::IMEventNumber(), 0x10000); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + // Check new Epoch value was persisted + EXPECT_EQ(storage.SyncGetKeyValue(chip::DefaultStorageKeyAllocator::IMEventNumber().KeyName(), &storedValue, size), + CHIP_NO_ERROR); + EXPECT_EQ(sizeof(storedValue), size); + storedValue = Encoding::LittleEndian::HostSwap<uint64_t>(storedValue); - auto value = counter.GetValue(); - NL_TEST_ASSERT(inSuite, value == 0); + EXPECT_EQ(newEpochValue, storedValue); +} - // Verify that we write out the next starting counter value after - // we've exhausted the counter's range. +TEST(TestPersistedCounter, TestAdvanceByMaxCounterValue) +{ + chip::TestPersistentStorageDelegate storage; + chip::PersistedCounter<uint64_t> counter; - for (int32_t i = 0; i < 0x10000; i++) - { - err = counter.Advance(); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - } + uint64_t storedValue = 0; + uint16_t size = sizeof(storedValue); - value = counter.GetValue(); - NL_TEST_ASSERT(inSuite, value == 0x10000); + EXPECT_EQ(counter.Init(&storage, chip::DefaultStorageKeyAllocator::IMEventNumber(), 1ULL), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), 0ULL); - for (int32_t i = 0; i < 0x10000; i++) - { - err = counter.Advance(); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - } + EXPECT_EQ(counter.AdvanceBy(UINT64_MAX), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), UINT64_MAX); - value = counter.GetValue(); - NL_TEST_ASSERT(inSuite, value == 0x20000); -} + // Check new Epoch value was persisted + EXPECT_EQ(storage.SyncGetKeyValue(chip::DefaultStorageKeyAllocator::IMEventNumber().KeyName(), &storedValue, size), + CHIP_NO_ERROR); + EXPECT_EQ(sizeof(storedValue), size); + storedValue = Encoding::LittleEndian::HostSwap<uint64_t>(storedValue); + EXPECT_EQ(0ULL, storedValue); -// Test Suite + // Increment one more step to make sure counter continues to increment + EXPECT_EQ(counter.AdvanceBy(1ULL), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), 0ULL); +} -/** - * Test Suite that lists all the test functions. - */ -static const nlTest sTests[] = { - NL_TEST_DEF("Out of box Test", CheckOOB), // - NL_TEST_DEF("Reboot Test", CheckReboot), // - NL_TEST_DEF("Write Next Counter Start Test", CheckWriteNextCounterStart), // - NL_TEST_SENTINEL() // -}; - -int TestPersistedCounter() +TEST(TestPersistedCounter, TestAdvanceByRollover) { - nlTestSuite theSuite = { "chip-persisted-storage", &sTests[0], TestSetup, TestTeardown }; + chip::TestPersistentStorageDelegate storage; + chip::PersistedCounter<uint64_t> counter; - return chip::ExecuteTestsWithContext<TestPersistedCounterContext>(&theSuite); + uint64_t epoch = UINT64_MAX / 4; + uint64_t currentEpoch = epoch; + uint64_t current = 0; + uint64_t storedValue = 0; + uint16_t size = sizeof(storedValue); + + EXPECT_EQ(counter.Init(&storage, chip::DefaultStorageKeyAllocator::IMEventNumber(), epoch), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), current); + + // Check new Epoch value was persisted + EXPECT_EQ(storage.SyncGetKeyValue(chip::DefaultStorageKeyAllocator::IMEventNumber().KeyName(), &storedValue, size), + CHIP_NO_ERROR); + EXPECT_EQ(sizeof(storedValue), size); + storedValue = Encoding::LittleEndian::HostSwap<uint64_t>(storedValue); + EXPECT_EQ(currentEpoch, storedValue); + + // Increase counter to update persisted value + current += (currentEpoch + 100); + EXPECT_EQ(counter.AdvanceBy(currentEpoch + 100), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), current); + + // Check new Epoch value was persisted + currentEpoch = (currentEpoch * 2 + 100); + EXPECT_EQ(storage.SyncGetKeyValue(chip::DefaultStorageKeyAllocator::IMEventNumber().KeyName(), &storedValue, size), + CHIP_NO_ERROR); + EXPECT_EQ(sizeof(storedValue), size); + storedValue = Encoding::LittleEndian::HostSwap<uint64_t>(storedValue); + EXPECT_EQ(currentEpoch, storedValue); + + // Force roll over + current += (3 * epoch); + EXPECT_EQ(counter.AdvanceBy((3 * epoch)), CHIP_NO_ERROR); + EXPECT_EQ(counter.GetValue(), current); + + // Check new Epoch value was persisted + currentEpoch = current + epoch; + EXPECT_EQ(storage.SyncGetKeyValue(chip::DefaultStorageKeyAllocator::IMEventNumber().KeyName(), &storedValue, size), + CHIP_NO_ERROR); + EXPECT_EQ(sizeof(storedValue), size); + storedValue = Encoding::LittleEndian::HostSwap<uint64_t>(storedValue); + EXPECT_EQ(currentEpoch, storedValue); } -CHIP_REGISTER_TEST_SUITE(TestPersistedCounter); +} // namespace diff --git a/src/protocols/secure_channel/BUILD.gn b/src/protocols/secure_channel/BUILD.gn index 1202c0bb88a9ae..1bc60518331dd2 100644 --- a/src/protocols/secure_channel/BUILD.gn +++ b/src/protocols/secure_channel/BUILD.gn @@ -1,12 +1,17 @@ import("//build_overrides/chip.gni") source_set("check-in-counter") { - sources = [ "CheckInCounter.h" ] + sources = [ + "CheckInCounter.cpp", + "CheckInCounter.h", + ] - deps = [ - "${chip_root}/src/crypto", + public_deps = [ + "${chip_root}/src/lib/core", "${chip_root}/src/lib/support", ] + + deps = [ "${chip_root}/src/crypto" ] } source_set("check-in-message") { diff --git a/src/protocols/secure_channel/CheckInCounter.cpp b/src/protocols/secure_channel/CheckInCounter.cpp new file mode 100644 index 00000000000000..5ef576cd6678e9 --- /dev/null +++ b/src/protocols/secure_channel/CheckInCounter.cpp @@ -0,0 +1,47 @@ +/* + * 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. + */ + +/** + * @brief The file implements the Matter Check-In counter + */ + +#include <protocols/secure_channel/CheckInCounter.h> +#include <stdint.h> + +namespace chip { +namespace Protocols { +namespace SecureChannel { + +CHIP_ERROR CheckInCounter::InvalidateHalfCheckInCouterValues() +{ + // Increases the current counter value by half of its maximum range and updates underlying counter storage. + // CheckInCounter is allowed to roll over. + ReturnErrorOnFailure(AdvanceBy((UINT32_MAX / 2))); + return CHIP_NO_ERROR; +} + +CHIP_ERROR CheckInCounter::InvalidateAllCheckInCounterValues() +{ + // Increase current counter value by its maximum value to mimic N -> UINT32_MAX -> N-1 to invalidate all Check-In counter + // values. CheckInCounter is allowed to roll over. + ReturnErrorOnFailure(AdvanceBy(UINT32_MAX)); + return CHIP_NO_ERROR; +} + +} // namespace SecureChannel +} // namespace Protocols +} // namespace chip diff --git a/src/protocols/secure_channel/CheckInCounter.h b/src/protocols/secure_channel/CheckInCounter.h index 257114b8a1e971..d22308ce9fb033 100644 --- a/src/protocols/secure_channel/CheckInCounter.h +++ b/src/protocols/secure_channel/CheckInCounter.h @@ -22,6 +22,7 @@ #pragma once #include <crypto/RandUtils.h> +#include <lib/core/CHIPError.h> #include <lib/support/PersistedCounter.h> namespace chip { @@ -45,6 +46,24 @@ class CheckInCounter : public PersistedCounter<uint32_t> */ inline uint32_t GetNextCheckInCounterValue() { return (mCounterValue + 1); }; + /** + * @brief Advances the current Check-In counter value to invalidate half of the values. + * Function adds UINT32_MAX / 2 to the current counter value. Next time a Check-In message is sent, 1 is added to the + * current value. + * + * @return CHIP_ERROR Any error returned by a write to persisted storage. + */ + CHIP_ERROR InvalidateHalfCheckInCouterValues(); + + /** + * @brief Invalidates all the Check-In counter values. After this function is called, the new Check-In counter value will be + * equal to current value minus 1 (with rollover) to mimic N -> UINT32_MAX -> N-1. Next time a Check-In message is sent, + * 1 is added to the current value which will be an invalid counter value. + * + * @return CHIP_ERROR Any error returned by a write to persisted storage. + */ + CHIP_ERROR InvalidateAllCheckInCounterValues(); + private: /** * @brief Get the Initial Counter Value for the Check-In counter diff --git a/src/protocols/secure_channel/tests/BUILD.gn b/src/protocols/secure_channel/tests/BUILD.gn index 9a0ec760950d3f..afebe3cee24aa6 100644 --- a/src/protocols/secure_channel/tests/BUILD.gn +++ b/src/protocols/secure_channel/tests/BUILD.gn @@ -4,8 +4,24 @@ import("//build_overrides/nlunit_test.gni") import("${chip_root}/build/chip/chip_test_suite.gni") import("${chip_root}/src/app/icd/icd.gni") -chip_test_suite_using_nltest("tests") { +chip_test_suite("tests") { output_name = "libSecureChannelTests" + test_sources = [ "TestCheckInCounter.cpp" ] + + cflags = [ "-Wconversion" ] + public_deps = [ + "${chip_root}/src/lib/core", + "${chip_root}/src/lib/support", + "${chip_root}/src/lib/support:test_utils", + "${chip_root}/src/lib/support:testing", + "${chip_root}/src/protocols/secure_channel:check-in-counter", + "${dir_pw_unit_test}", + ] +} + +chip_test_suite_using_nltest("tests_nltest") { + # Renamed ouput during the transition away from nltest + output_name = "libSecureChannelTestsNL" test_sources = [ "TestCASESession.cpp", diff --git a/src/protocols/secure_channel/tests/TestCheckInCounter.cpp b/src/protocols/secure_channel/tests/TestCheckInCounter.cpp new file mode 100644 index 00000000000000..8a64d1805d42ae --- /dev/null +++ b/src/protocols/secure_channel/tests/TestCheckInCounter.cpp @@ -0,0 +1,129 @@ +/* + * + * 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 InvalidateHalfCheckInCouterValues 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.InvalidateHalfCheckInCouterValues(), 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 diff --git a/src/python_testing/TC_ICDManagementCluster.py b/src/python_testing/TC_ICDManagementCluster.py index a5b769ba30272c..744b3bfa926690 100644 --- a/src/python_testing/TC_ICDManagementCluster.py +++ b/src/python_testing/TC_ICDManagementCluster.py @@ -14,6 +14,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +import ctypes +from enum import IntEnum + import chip.clusters as Clusters from matter_testing_support import MatterBaseTest, async_test_body, default_matter_test_main from mobly import asserts @@ -21,9 +24,16 @@ # Assumes `--enable-key 000102030405060708090a0b0c0d0e0f` on Linux app command line, or a DUT # that has that Enable Key kTestEventTriggerKey = bytes([b for b in range(16)]) +kRootEndpointId = 0 +kMaxUint32Value = 0xFFFFFFFF +kHalfMaxUint32Value = 0xFFFFFFFF >> 1 + -kAddActiveModeReq = 0x0046000000000001 -kRemoveActiveModeReq = 0x0046000000000002 +class ICDTestEventTriggerOperations(IntEnum): + kAddActiveModeReq = 0x0046000000000001 + kRemoveActiveModeReq = 0x0046000000000002 + kInvalidateHalfCounterValues = 0x0046000000000003 + kInvalidateAllCounterValues = 0x0046000000000004 class TestICDManagementCluster(MatterBaseTest): @@ -43,18 +53,51 @@ async def test_active_mode_test_event_trigger(self): asserts.assert_is_none( await dev_ctrl.SendCommand( self.dut_node_id, - endpoint=0, + endpoint=kRootEndpointId, + payload=Clusters.GeneralDiagnostics.Commands.TestEventTrigger(enableKey=kTestEventTriggerKey, + eventTrigger=ICDTestEventTriggerOperations.kAddActiveModeReq) + ) + ) + + startingICDCounter = await self.read_single_attribute_check_success(endpoint=kRootEndpointId, cluster=Clusters.Objects.IcdManagement, attribute=Clusters.IcdManagement.Attributes.ICDCounter) + + asserts.assert_is_none( + await dev_ctrl.SendCommand( + self.dut_node_id, + endpoint=kRootEndpointId, payload=Clusters.GeneralDiagnostics.Commands.TestEventTrigger(enableKey=kTestEventTriggerKey, - eventTrigger=kAddActiveModeReq) + eventTrigger=ICDTestEventTriggerOperations.kInvalidateHalfCounterValues) ) ) + currentICDCounter = await self.read_single_attribute_check_success(endpoint=kRootEndpointId, cluster=Clusters.Objects.IcdManagement, attribute=Clusters.IcdManagement.Attributes.ICDCounter) + + # Check new current counter value has the expected value + asserts.assert_equal((ctypes.c_uint32(startingICDCounter + kHalfMaxUint32Value).value), + currentICDCounter, "Incorrect ICDCounter value after kInvalidateHalfCounterValues opration") + + # Set starting counter to currentICDCounter for next test + startingICDCounter = currentICDCounter + + asserts.assert_is_none( + await dev_ctrl.SendCommand( + self.dut_node_id, + endpoint=kRootEndpointId, + payload=Clusters.GeneralDiagnostics.Commands.TestEventTrigger(enableKey=kTestEventTriggerKey, + eventTrigger=ICDTestEventTriggerOperations.kInvalidateAllCounterValues) + ) + ) + currentICDCounter = await self.read_single_attribute_check_success(endpoint=kRootEndpointId, cluster=Clusters.Objects.IcdManagement, attribute=Clusters.IcdManagement.Attributes.ICDCounter) + + # Check new current counter value has the expected value + asserts.assert_equal((ctypes.c_uint32(startingICDCounter + kMaxUint32Value).value), + currentICDCounter, "Incorrect ICDCounter value after kInvalidateHalfCounterValues opration") asserts.assert_is_none( await dev_ctrl.SendCommand( self.dut_node_id, - endpoint=0, + endpoint=kRootEndpointId, payload=Clusters.GeneralDiagnostics.Commands.TestEventTrigger(enableKey=kTestEventTriggerKey, - eventTrigger=kRemoveActiveModeReq) + eventTrigger=ICDTestEventTriggerOperations.kRemoveActiveModeReq) ) ) diff --git a/src/test_driver/openiotsdk/unit-tests/test_components.txt b/src/test_driver/openiotsdk/unit-tests/test_components.txt index bb108309ba1728..2694c2a5afd8fb 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components.txt @@ -15,3 +15,4 @@ TestShell SetupPayloadTests SupportTests UserDirectedCommissioningTests +SecureChannelTests 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 8631aacb9561a4..d30358d4353c85 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt @@ -3,6 +3,6 @@ DataModelTests InetLayerTests MessagingLayerTests RawTransportTests -SecureChannelTests +SecureChannelTestsNL SupportTestsNL TransportLayerTests From f9ac954217dd41375f0455d3034e1a323dfb9dfa Mon Sep 17 00:00:00 2001 From: yunhanw-google <yunhanw@google.com> Date: Fri, 26 Apr 2024 17:34:20 -0700 Subject: [PATCH 066/124] Add OnCreateRefreshKey (#33202) * Add OnCreateRefreshKey * Update src/app/icd/client/DefaultCheckInDelegate.h Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Update src/app/icd/client/DefaultCheckInDelegate.h Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Update src/app/icd/client/DefaultCheckInDelegate.h Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Update DefaultCheckInDelegate.cpp * Restyled by whitespace --------- Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> Co-authored-by: Restyled.io <commits@restyled.io> --- src/app/icd/client/DefaultCheckInDelegate.cpp | 9 ++++++--- src/app/icd/client/DefaultCheckInDelegate.h | 12 ++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/app/icd/client/DefaultCheckInDelegate.cpp b/src/app/icd/client/DefaultCheckInDelegate.cpp index e967138310c0f4..2d4624b7837470 100644 --- a/src/app/icd/client/DefaultCheckInDelegate.cpp +++ b/src/app/icd/client/DefaultCheckInDelegate.cpp @@ -16,7 +16,6 @@ */ #include <app/icd/client/DefaultCheckInDelegate.h> -#include <app/icd/client/RefreshKeySender.h> #include <crypto/CHIPCryptoPAL.h> #include <lib/support/CodeUtils.h> #include <lib/support/logging/CHIPLogging.h> @@ -40,12 +39,16 @@ void DefaultCheckInDelegate::OnCheckInComplete(const ICDClientInfo & clientInfo) clientInfo.start_icd_counter, clientInfo.offset, ChipLogValueScopedNodeId(clientInfo.peer_node)); } +CHIP_ERROR DefaultCheckInDelegate::GenerateRefreshKey(RefreshKeySender::RefreshKeyBuffer & newKey) +{ + return Crypto::DRBG_get_bytes(newKey.Bytes(), newKey.Capacity()); +} + RefreshKeySender * DefaultCheckInDelegate::OnKeyRefreshNeeded(ICDClientInfo & clientInfo, ICDClientStorage * clientStorage) { CHIP_ERROR err = CHIP_NO_ERROR; RefreshKeySender::RefreshKeyBuffer newKey; - - err = Crypto::DRBG_get_bytes(newKey.Bytes(), newKey.Capacity()); + err = GenerateRefreshKey(newKey); if (err != CHIP_NO_ERROR) { ChipLogError(ICD, "Generation of new key failed: %" CHIP_ERROR_FORMAT, err.Format()); diff --git a/src/app/icd/client/DefaultCheckInDelegate.h b/src/app/icd/client/DefaultCheckInDelegate.h index 355259f561ea40..52941817bd3f9f 100644 --- a/src/app/icd/client/DefaultCheckInDelegate.h +++ b/src/app/icd/client/DefaultCheckInDelegate.h @@ -20,6 +20,7 @@ #include <app/icd/client/CheckInDelegate.h> #include <app/icd/client/ICDClientStorage.h> +#include <app/icd/client/RefreshKeySender.h> namespace chip { namespace app { @@ -33,6 +34,17 @@ class DefaultCheckInDelegate : public CheckInDelegate virtual ~DefaultCheckInDelegate() {} CHIP_ERROR Init(ICDClientStorage * storage, InteractionModelEngine * engine); void OnCheckInComplete(const ICDClientInfo & clientInfo) override; + + /** + * @brief Callback used to let the application generate the new ICD symmetric key + * + * If this calback is not overridden, Crypto::DRBG_get_bytes will be used to generated the key. + * + * @param[inout] newKey sensitive data buffer with type Crypto::SensitiveDataBuffer<Crypto::kAES_CCM128_Key_Length> + * @param[out] CHIP_ERROR CHIP_ERROR_INVALID_ARGUMENT + * CHIP_ERROR_INTERNAL + */ + virtual CHIP_ERROR GenerateRefreshKey(RefreshKeySender::RefreshKeyBuffer & newKey); RefreshKeySender * OnKeyRefreshNeeded(ICDClientInfo & clientInfo, ICDClientStorage * clientStorage) override; void OnKeyRefreshDone(RefreshKeySender * refreshKeySender, CHIP_ERROR error) override; From 34cc8b84e140a3852088d8d54079860e95e6e4ca Mon Sep 17 00:00:00 2001 From: Karsten Sperling <113487422+ksperling-apple@users.noreply.github.com> Date: Mon, 29 Apr 2024 13:00:41 +1200 Subject: [PATCH 067/124] Darwin: Move preWarmCommissioningSession to MTRDeviceControllerFactory (#33184) * Darwin: Move preWarmCommissioningSession to MTRDeviceControllerFactory This makes it possible to start pre-warming before a MTRDeviceController has been created, since doing that requires the client to have obtained various configuration details. * Apply suggestions from code review Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Tweaks from review * restyle --------- Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> --- .../Framework/CHIP/MTRDeviceController.h | 12 +-- .../Framework/CHIP/MTRDeviceController.mm | 11 +-- .../CHIP/MTRDeviceControllerFactory.h | 12 +++ .../CHIP/MTRDeviceControllerFactory.mm | 40 +++++++++ src/platform/Darwin/BLEManagerImpl.cpp | 20 ++--- src/platform/Darwin/BLEManagerImpl.h | 6 +- src/platform/Darwin/BleConnectionDelegate.h | 10 ++- .../Darwin/BleConnectionDelegateImpl.mm | 88 ++++++++++++------- src/platform/Darwin/BleScannerDelegate.h | 17 +++- src/platform/Darwin/PlatformManagerImpl.cpp | 18 ++-- src/platform/Darwin/PlatformManagerImpl.h | 4 +- 11 files changed, 148 insertions(+), 90 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.h b/src/darwin/Framework/CHIP/MTRDeviceController.h index 2662d4b54e0f6d..112bd34c90c21a 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.h +++ b/src/darwin/Framework/CHIP/MTRDeviceController.h @@ -178,16 +178,8 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); -/** - * Optionally pre-warm the controller for setting up a commissioning session. - * This may be called before setupCommissioningSessionWithPayload if it's known - * that a commissioning attempt will soon take place but the commissioning - * payload is not known yet. - * - * For example this may do a BLE scan in advance so results are ready earlier - * once the discriminator is known. - */ -- (void)preWarmCommissioningSession MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); +- (void)preWarmCommissioningSession MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) + MTR_NEWLY_DEPRECATED("-[MTRDeviceControllerFactory preWarmCommissioningSession]"); /** * Set the Delegate for the device controller as well as the Queue on which the Delegate callbacks will be triggered diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.mm b/src/darwin/Framework/CHIP/MTRDeviceController.mm index ec327a053962e6..94d9882b4cd9d1 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController.mm @@ -86,7 +86,6 @@ static NSString * const kErrorPartialDacVerifierInit = @"Init failure while creating a partial DAC verifier"; static NSString * const kErrorPairDevice = @"Failure while pairing the device"; static NSString * const kErrorStopPairing = @"Failure while trying to stop the pairing process"; -static NSString * const kErrorPreWarmCommissioning = @"Failure while trying to pre-warm the commissioning process"; static NSString * const kErrorOpenPairingWindow = @"Open Pairing Window failed"; static NSString * const kErrorNotRunning = @"Controller is not running. Call startup first."; static NSString * const kErrorSetupCodeGen = @"Generating Manual Pairing Code failed"; @@ -896,15 +895,7 @@ - (BOOL)stopBrowseForCommissionables - (void)preWarmCommissioningSession { - auto block = ^{ - auto errorCode = chip::DeviceLayer::PlatformMgrImpl().PrepareCommissioning(); - MATTER_LOG_METRIC(kMetricPreWarmCommissioning, errorCode); - - // The checkForError is just so it logs - [MTRDeviceController checkForError:errorCode logMsg:kErrorPreWarmCommissioning error:nil]; - }; - - [self syncRunOnWorkQueue:block error:nil]; + [_factory preWarmCommissioningSession]; } - (MTRBaseDevice *)deviceBeingCommissionedWithNodeID:(NSNumber *)nodeID error:(NSError * __autoreleasing *)error diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.h b/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.h index 62080b305ee635..5965d8bcaaf59b 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.h +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.h @@ -177,6 +177,18 @@ MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) - (MTRDeviceController * _Nullable)createControllerOnNewFabric:(MTRDeviceControllerStartupParams *)startupParams error:(NSError * __autoreleasing *)error; +/** + * If possible, pre-warm the Matter stack for setting up a commissioning session. + * + * This may be called before -[MTRDeviceController setupCommissioningSessionWithPayload:] + * if it is known that a commissioning attempt will soon take place, but the commissioning + * payload is not known yet. + * + * The controller factory must be running for pre-warming to take place. Pre-warming can take place + * before any controllers are started. + */ +- (void)preWarmCommissioningSession MTR_NEWLY_AVAILABLE; + @end /** diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.mm b/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.mm index 25939d6ae5c64e..c7d69d2c8772db 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerFactory.mm @@ -34,6 +34,7 @@ #import "MTRFabricInfo_Internal.h" #import "MTRFramework.h" #import "MTRLogging_Internal.h" +#import "MTRMetricKeys.h" #import "MTRMetricsCollector.h" #import "MTROTAProviderDelegateBridge.h" #import "MTROperationalBrowser.h" @@ -66,6 +67,7 @@ using namespace chip; using namespace chip::Controller; +using namespace chip::Tracing::DarwinFramework; static bool sExitHandlerRegistered = false; static void ShutdownOnExit() @@ -82,6 +84,11 @@ @interface MTRDeviceControllerFactoryParams () @end +MTR_DIRECT_MEMBERS +@interface MTRDeviceControllerFactory () +- (void)preWarmCommissioningSessionDone; +@end + MTR_DIRECT_MEMBERS @implementation MTRDeviceControllerFactory { dispatch_queue_t _chipWorkQueue; @@ -163,6 +170,13 @@ @implementation MTRDeviceControllerFactory { // in an atomic way that endpoint IDs are unique. NSMutableArray<MTRServerEndpoint *> * _serverEndpoints; os_unfair_lock _serverEndpointsLock; // Protects access to _serverEndpoints. + + class final : public DeviceLayer::BleScannerDelegate { + void OnBleScanStopped() override + { + [MTRDeviceControllerFactory.sharedInstance preWarmCommissioningSessionDone]; + } + } _preWarmingDelegate; } + (void)initialize @@ -742,6 +756,32 @@ - (MTRDeviceController * _Nullable)createControllerOnNewFabric:(MTRDeviceControl error:error]; } +- (void)preWarmCommissioningSession +{ + dispatch_async(_chipWorkQueue, ^{ + CHIP_ERROR err = CHIP_ERROR_INCORRECT_STATE; + if (!self->_running) { + MTR_LOG_ERROR("Can't pre-warm, Matter controller factory is not running"); + } else { + MTR_LOG_DEFAULT("Pre-warming commissioning session"); + self->_controllerFactory->EnsureAndRetainSystemState(); + err = DeviceLayer::PlatformMgrImpl().StartBleScan(&self->_preWarmingDelegate, DeviceLayer::BleScanMode::kPreWarm); + if (err != CHIP_NO_ERROR) { + MTR_LOG_ERROR("Pre-warming failed: %" CHIP_ERROR_FORMAT, err.Format()); + self->_controllerFactory->ReleaseSystemState(); + } + } + MATTER_LOG_METRIC(kMetricPreWarmCommissioning, err); + }); +} + +- (void)preWarmCommissioningSessionDone +{ + assertChipStackLockedByCurrentThread(); + MTR_LOG_DEFAULT("Pre-warming done"); + self->_controllerFactory->ReleaseSystemState(); +} + // Finds a fabric that matches the given params, if one exists. // // Returns NO on failure, YES on success. If YES is returned, the diff --git a/src/platform/Darwin/BLEManagerImpl.cpp b/src/platform/Darwin/BLEManagerImpl.cpp index c0af6ccf17d93e..8ff634c52cb1ed 100644 --- a/src/platform/Darwin/BLEManagerImpl.cpp +++ b/src/platform/Darwin/BLEManagerImpl.cpp @@ -87,24 +87,18 @@ void BLEManagerImpl::_Shutdown() } } -CHIP_ERROR BLEManagerImpl::StartScan(BleScannerDelegate * delegate) +CHIP_ERROR BLEManagerImpl::StartScan(BleScannerDelegate * delegate, BleScanMode mode) { - if (mConnectionDelegate) - { - static_cast<BleConnectionDelegateImpl *>(mConnectionDelegate)->StartScan(delegate); - return CHIP_NO_ERROR; - } - return CHIP_ERROR_INCORRECT_STATE; + VerifyOrReturnError(mConnectionDelegate != nullptr, CHIP_ERROR_INCORRECT_STATE); + static_cast<BleConnectionDelegateImpl *>(mConnectionDelegate)->StartScan(delegate, mode); + return CHIP_NO_ERROR; } CHIP_ERROR BLEManagerImpl::StopScan() { - if (mConnectionDelegate) - { - static_cast<BleConnectionDelegateImpl *>(mConnectionDelegate)->StopScan(); - return CHIP_NO_ERROR; - } - return CHIP_ERROR_INCORRECT_STATE; + VerifyOrReturnError(mConnectionDelegate != nullptr, CHIP_ERROR_INCORRECT_STATE); + static_cast<BleConnectionDelegateImpl *>(mConnectionDelegate)->StopScan(); + return CHIP_NO_ERROR; } bool BLEManagerImpl::_IsAdvertisingEnabled() diff --git a/src/platform/Darwin/BLEManagerImpl.h b/src/platform/Darwin/BLEManagerImpl.h index 72856ff466c2ac..194dadb2e79529 100644 --- a/src/platform/Darwin/BLEManagerImpl.h +++ b/src/platform/Darwin/BLEManagerImpl.h @@ -25,14 +25,12 @@ #include <lib/core/Global.h> #include <lib/support/CodeUtils.h> +#include <platform/Darwin/BleScannerDelegate.h> #if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE namespace chip { namespace DeviceLayer { - -class BleScannerDelegate; - namespace Internal { using namespace chip::Ble; @@ -48,7 +46,7 @@ class BLEManagerImpl final : public BLEManager, private BleLayer public: CHIP_ERROR ConfigureBle(uint32_t aNodeId, bool aIsCentral) { return CHIP_NO_ERROR; } - CHIP_ERROR StartScan(BleScannerDelegate * delegate = nullptr); + CHIP_ERROR StartScan(BleScannerDelegate * delegate, BleScanMode mode = BleScanMode::kDefault); CHIP_ERROR StopScan(); private: diff --git a/src/platform/Darwin/BleConnectionDelegate.h b/src/platform/Darwin/BleConnectionDelegate.h index 1441f60610c822..585624ae407dfa 100644 --- a/src/platform/Darwin/BleConnectionDelegate.h +++ b/src/platform/Darwin/BleConnectionDelegate.h @@ -18,6 +18,7 @@ #pragma once #include <ble/Ble.h> +#include <platform/Darwin/BleScannerDelegate.h> namespace chip { namespace DeviceLayer { @@ -26,11 +27,12 @@ namespace Internal { class BleConnectionDelegateImpl : public Ble::BleConnectionDelegate { public: - void StartScan(BleScannerDelegate * delegate = nullptr); + void StartScan(BleScannerDelegate * delegate, BleScanMode mode = BleScanMode::kDefault); void StopScan(); - virtual void NewConnection(Ble::BleLayer * bleLayer, void * appState, const SetupDiscriminator & connDiscriminator); - virtual void NewConnection(Ble::BleLayer * bleLayer, void * appState, BLE_CONNECTION_OBJECT connObj); - virtual CHIP_ERROR CancelConnection(); + + void NewConnection(Ble::BleLayer * bleLayer, void * appState, const SetupDiscriminator & connDiscriminator) override; + void NewConnection(Ble::BleLayer * bleLayer, void * appState, BLE_CONNECTION_OBJECT connObj) override; + CHIP_ERROR CancelConnection() override; private: CHIP_ERROR DoCancel(); diff --git a/src/platform/Darwin/BleConnectionDelegateImpl.mm b/src/platform/Darwin/BleConnectionDelegateImpl.mm index b325d079ba61a5..5eb1c4a74aa082 100644 --- a/src/platform/Darwin/BleConnectionDelegateImpl.mm +++ b/src/platform/Darwin/BleConnectionDelegateImpl.mm @@ -38,18 +38,19 @@ #import "UUIDHelper.h" using namespace chip::Ble; +using namespace chip::DeviceLayer; using namespace chip::Tracing::DarwinPlatform; constexpr uint64_t kScanningWithDiscriminatorTimeoutInSeconds = 60; -constexpr uint64_t kScanningWithoutDelegateTimeoutInSeconds = 120; +constexpr uint64_t kPreWarmScanTimeoutInSeconds = 120; constexpr uint64_t kCachePeripheralTimeoutInSeconds = static_cast<uint64_t>(CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX / 1000.0 * 8.0 * 0.625); constexpr char kBleWorkQueueName[] = "org.csa-iot.matter.framework.ble.workqueue"; typedef NS_ENUM(uint8_t, BleConnectionMode) { kUndefined = 0, - kScanningWithoutDelegate, kScanning, + kScanningWithTimeout, kConnecting, }; @@ -72,16 +73,14 @@ @interface BleConnection : NSObject <CBCentralManagerDelegate, CBPeripheralDeleg @property (unsafe_unretained, nonatomic) chip::Ble::BleLayer * mBleLayer; - (id)initWithQueue:(dispatch_queue_t)queue; -- (id)initWithDelegate:(chip::DeviceLayer::BleScannerDelegate *)delegate queue:(dispatch_queue_t)queue; +- (id)initWithDelegate:(chip::DeviceLayer::BleScannerDelegate *)delegate prewarm:(bool)prewarm queue:(dispatch_queue_t)queue; - (id)initWithDiscriminator:(const chip::SetupDiscriminator &)deviceDiscriminator queue:(dispatch_queue_t)queue; - (void)setBleLayer:(chip::Ble::BleLayer *)bleLayer; - (void)start; - (void)stop; -- (void)updateWithDelegate:(chip::DeviceLayer::BleScannerDelegate *)delegate; +- (void)updateWithDelegate:(chip::DeviceLayer::BleScannerDelegate *)delegate prewarm:(bool)prewarm; - (void)updateWithDiscriminator:(const chip::SetupDiscriminator &)deviceDiscriminator; - (void)updateWithPeripheral:(CBPeripheral *)peripheral; -- (BOOL)isScanningWithoutDelegate; -- (BOOL)isScanning; - (BOOL)isConnecting; - (void)addPeripheralToCache:(CBPeripheral *)peripheral data:(NSData *)data; - (void)removePeripheralFromCache:(CBPeripheral *)peripheral; @@ -162,26 +161,40 @@ - (void)removePeripheralsFromCache; }); } - void BleConnectionDelegateImpl::StartScan(BleScannerDelegate * delegate) + void BleConnectionDelegateImpl::StartScan(BleScannerDelegate * delegate, BleScanMode mode) { assertChipStackLockedByCurrentThread(); - ChipLogProgress(Ble, "ConnectionDelegate StartScan%s", (delegate ? " with delegate" : "")); + bool prewarm = (mode == BleScanMode::kPreWarm); + ChipLogProgress(Ble, "ConnectionDelegate StartScan (%s)", (prewarm ? "pre-warm" : "default")); if (!bleWorkQueue) { bleWorkQueue = dispatch_queue_create(kBleWorkQueueName, DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL); } dispatch_async(bleWorkQueue, ^{ + // Pre-warming is best-effort, don't cancel an ongoing scan or connection attempt + if (prewarm && ble) { + // TODO: Once we get rid of the separate BLE queue we can just return CHIP_ERROR_BUSY. + // That will also allow these cases to be distinguished in our metric. + ChipLogProgress(Ble, "Not starting pre-warm scan, an operation is already in progress"); + if (delegate) { + dispatch_async(PlatformMgrImpl().GetWorkQueue(), ^{ + delegate->OnBleScanStopped(); + }); + } + return; + } + // If the previous connection delegate was not a try to connect to something, just reuse it instead of // creating a brand new connection but update the discriminator and the ble layer members. if (ble and ![ble isConnecting]) { - [ble updateWithDelegate:delegate]; + [ble updateWithDelegate:delegate prewarm:prewarm]; return; } [ble stop]; - ble = [[BleConnection alloc] initWithDelegate:delegate queue:bleWorkQueue]; + ble = [[BleConnection alloc] initWithDelegate:delegate prewarm:prewarm queue:bleWorkQueue]; // Do _not_ set onConnectionComplete and onConnectionError // here. The connection callbacks we have expect an appState // that we do not have here, and in any case connection @@ -245,14 +258,16 @@ - (id)initWithQueue:(dispatch_queue_t)queue return self; } -- (id)initWithDelegate:(chip::DeviceLayer::BleScannerDelegate *)delegate queue:(dispatch_queue_t)queue +- (id)initWithDelegate:(chip::DeviceLayer::BleScannerDelegate *)delegate prewarm:(bool)prewarm queue:(dispatch_queue_t)queue { self = [self initWithQueue:queue]; if (self) { _scannerDelegate = delegate; - _currentMode = (delegate == nullptr) ? kScanningWithoutDelegate : kScanning; - if (_currentMode == kScanningWithoutDelegate) { - [self setupTimer:kScanningWithoutDelegateTimeoutInSeconds]; + if (prewarm) { + _currentMode = kScanningWithTimeout; + [self setupTimer:kPreWarmScanTimeoutInSeconds]; + } else { + _currentMode = kScanning; } } @@ -271,16 +286,6 @@ - (id)initWithDiscriminator:(const chip::SetupDiscriminator &)deviceDiscriminato return self; } -- (BOOL)isScanningWithoutDelegate -{ - return _currentMode == kScanningWithoutDelegate; -} - -- (BOOL)isScanning -{ - return _currentMode == kScanning; -} - - (BOOL)isConnecting { return _currentMode == kConnecting; @@ -592,7 +597,7 @@ - (void)start - (void)stop { - _scannerDelegate = nil; + [self detachScannerDelegate]; _found = false; [self stopScanning]; [self removePeripheralsFromCache]; @@ -669,31 +674,46 @@ - (void)connect:(CBPeripheral *)peripheral [_centralManager connectPeripheral:peripheral options:nil]; } -- (void)updateWithDelegate:(chip::DeviceLayer::BleScannerDelegate *)delegate +- (void)detachScannerDelegate { - _scannerDelegate = delegate; - _currentMode = (delegate == nullptr) ? kScanningWithoutDelegate : kScanning; + auto * existingDelegate = _scannerDelegate; + if (existingDelegate) { + _scannerDelegate = nullptr; + dispatch_async(_chipWorkQueue, ^{ + existingDelegate->OnBleScanStopped(); + }); + } +} - if (_currentMode == kScanning) { - [self clearTimer]; +- (void)updateWithDelegate:(chip::DeviceLayer::BleScannerDelegate *)delegate prewarm:(bool)prewarm +{ + [self detachScannerDelegate]; + if (delegate) { for (CBPeripheral * cachedPeripheral in _cachedPeripherals) { NSData * serviceData = _cachedPeripherals[cachedPeripheral][@"data"]; dispatch_async(_chipWorkQueue, ^{ ChipBLEDeviceIdentificationInfo info; memcpy(&info, [serviceData bytes], sizeof(info)); - _scannerDelegate->OnBleScanAdd((__bridge void *) cachedPeripheral, info); + delegate->OnBleScanAdd((__bridge void *) cachedPeripheral, info); }); } + _scannerDelegate = delegate; + } + + if (prewarm) { + _currentMode = kScanningWithTimeout; + [self setupTimer:kPreWarmScanTimeoutInSeconds]; } else { - [self setupTimer:kScanningWithoutDelegateTimeoutInSeconds]; + _currentMode = kScanning; + [self clearTimer]; } } - (void)updateWithDiscriminator:(const chip::SetupDiscriminator &)deviceDiscriminator { + [self detachScannerDelegate]; _deviceDiscriminator = deviceDiscriminator; - _scannerDelegate = nil; _currentMode = kConnecting; CBPeripheral * peripheral = nil; @@ -722,7 +742,7 @@ - (void)updateWithDiscriminator:(const chip::SetupDiscriminator &)deviceDiscrimi - (void)updateWithPeripheral:(CBPeripheral *)peripheral { - _scannerDelegate = nil; + [self detachScannerDelegate]; _currentMode = kConnecting; MATTER_LOG_METRIC_BEGIN(kMetricBLEDiscoveredMatchingPeripheral); diff --git a/src/platform/Darwin/BleScannerDelegate.h b/src/platform/Darwin/BleScannerDelegate.h index 9c96445145d67f..177bf259fd3f61 100644 --- a/src/platform/Darwin/BleScannerDelegate.h +++ b/src/platform/Darwin/BleScannerDelegate.h @@ -24,16 +24,29 @@ namespace chip { namespace DeviceLayer { +enum class BleScanMode +{ + /// Scan continues until stopped. + /// Replaces existing BLE operation. + kDefault = 0, + /// Scan stops automatically after some time. + /// Does not replace an existing BLE operation. + kPreWarm, +}; + class DLL_EXPORT BleScannerDelegate { public: virtual ~BleScannerDelegate() {} // Called when a scan result is available. - virtual void OnBleScanAdd(BLE_CONNECTION_OBJECT connObj, const Ble::ChipBLEDeviceIdentificationInfo & info) = 0; + virtual void OnBleScanAdd(BLE_CONNECTION_OBJECT connObj, const Ble::ChipBLEDeviceIdentificationInfo & info) {} // Called when a scan result is not available anymore. - virtual void OnBleScanRemove(BLE_CONNECTION_OBJECT connObj) = 0; + virtual void OnBleScanRemove(BLE_CONNECTION_OBJECT connObj) {} + + // Called when the scan has been stopped + virtual void OnBleScanStopped() {} }; } // namespace DeviceLayer diff --git a/src/platform/Darwin/PlatformManagerImpl.cpp b/src/platform/Darwin/PlatformManagerImpl.cpp index b7dc8b681fa8e8..d1dc5308c869e9 100644 --- a/src/platform/Darwin/PlatformManagerImpl.cpp +++ b/src/platform/Darwin/PlatformManagerImpl.cpp @@ -156,28 +156,24 @@ bool PlatformManagerImpl::IsWorkQueueCurrentQueue() const return dispatch_get_specific(this) == this; } -CHIP_ERROR PlatformManagerImpl::StartBleScan(BleScannerDelegate * delegate) +CHIP_ERROR PlatformManagerImpl::StartBleScan(BleScannerDelegate * delegate, BleScanMode mode) { #if CONFIG_NETWORK_LAYER_BLE - ReturnErrorOnFailureWithMetric(kMetricBLEScan, Internal::BLEMgrImpl().StartScan(delegate)); -#endif // CONFIG_NETWORK_LAYER_BLE + ReturnErrorOnFailureWithMetric(kMetricBLEScan, Internal::BLEMgrImpl().StartScan(delegate, mode)); return CHIP_NO_ERROR; +#else + return CHIP_ERROR_NOT_IMPLEMENTED; +#endif // CONFIG_NETWORK_LAYER_BLE } CHIP_ERROR PlatformManagerImpl::StopBleScan() { #if CONFIG_NETWORK_LAYER_BLE ReturnErrorOnFailureWithMetric(kMetricBLEScan, Internal::BLEMgrImpl().StopScan()); -#endif // CONFIG_NETWORK_LAYER_BLE return CHIP_NO_ERROR; -} - -CHIP_ERROR PlatformManagerImpl::PrepareCommissioning() -{ -#if CONFIG_NETWORK_LAYER_BLE - ReturnErrorOnFailureWithMetric(kMetricBLEStartPreWarmScan, Internal::BLEMgrImpl().StartScan()); +#else + return CHIP_ERROR_NOT_IMPLEMENTED; #endif // CONFIG_NETWORK_LAYER_BLE - return CHIP_NO_ERROR; } } // namespace DeviceLayer diff --git a/src/platform/Darwin/PlatformManagerImpl.h b/src/platform/Darwin/PlatformManagerImpl.h index 12b515ae83d42f..ba37badf4628b5 100644 --- a/src/platform/Darwin/PlatformManagerImpl.h +++ b/src/platform/Darwin/PlatformManagerImpl.h @@ -24,6 +24,7 @@ #pragma once #include <lib/core/Global.h> +#include <platform/Darwin/BleScannerDelegate.h> #include <platform/internal/GenericPlatformManagerImpl.h> #include <atomic> @@ -49,9 +50,8 @@ class PlatformManagerImpl final : public PlatformManager, public Internal::Gener dispatch_queue_t GetWorkQueue() { return mWorkQueue; } bool IsWorkQueueCurrentQueue() const; - CHIP_ERROR StartBleScan(BleScannerDelegate * delegate = nullptr); + CHIP_ERROR StartBleScan(BleScannerDelegate * delegate, BleScanMode mode = BleScanMode::kDefault); CHIP_ERROR StopBleScan(); - CHIP_ERROR PrepareCommissioning(); System::Clock::Timestamp GetStartTime() { return mStartTime; } From 040e5bfd0f6096750633d5cdce204f96a58cdaec Mon Sep 17 00:00:00 2001 From: Shubham Patil <shubham.patil@espressif.com> Date: Mon, 29 Apr 2024 13:05:46 +0530 Subject: [PATCH 068/124] Platform Event when ble is deinitialized (#33186) * Platform Event when ble is deinitialized * [ESP32] remove error check on nimble_port_deinit() IDF prior to v5.0, nimble_port_deinit() have a return type as void. --- examples/platform/esp32/common/CommonDeviceCallbacks.cpp | 4 ++++ src/include/platform/CHIPDeviceEvent.h | 5 +++++ src/platform/ESP32/nimble/BLEManagerImpl.cpp | 9 ++++++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/examples/platform/esp32/common/CommonDeviceCallbacks.cpp b/examples/platform/esp32/common/CommonDeviceCallbacks.cpp index 763340cee45e45..7203a0cd6a92cf 100644 --- a/examples/platform/esp32/common/CommonDeviceCallbacks.cpp +++ b/examples/platform/esp32/common/CommonDeviceCallbacks.cpp @@ -41,6 +41,10 @@ void CommonDeviceCallbacks::DeviceEventCallback(const ChipDeviceEvent * event, i { switch (event->Type) { + case DeviceEventType::kBLEDeinitialized: + ESP_LOGI(TAG, "BLE is deinitialized"); + break; + case DeviceEventType::kInternetConnectivityChange: OnInternetConnectivityChange(event); break; diff --git a/src/include/platform/CHIPDeviceEvent.h b/src/include/platform/CHIPDeviceEvent.h index cbab1d9817aed2..67809adda04c73 100644 --- a/src/include/platform/CHIPDeviceEvent.h +++ b/src/include/platform/CHIPDeviceEvent.h @@ -245,6 +245,11 @@ enum PublicEventTypes * sending messages to other nodes. */ kServerReady, + + /** + * Signals that BLE is deinitialized. + */ + kBLEDeinitialized, }; /** diff --git a/src/platform/ESP32/nimble/BLEManagerImpl.cpp b/src/platform/ESP32/nimble/BLEManagerImpl.cpp index 9a8ae506e7ee05..b5d9e662b9706c 100644 --- a/src/platform/ESP32/nimble/BLEManagerImpl.cpp +++ b/src/platform/ESP32/nimble/BLEManagerImpl.cpp @@ -1021,17 +1021,20 @@ void BLEManagerImpl::ClaimBLEMemory(System::Layer *, void *) VerifyOrReturn(err == ESP_OK, ChipLogError(DeviceLayer, "BLE deinit failed")); ChipLogProgress(DeviceLayer, "BLE deinit successful and memory reclaimed"); - // TODO: post an event when ble is deinitialized and memory is added to heap + + ChipDeviceEvent event; + event.Type = DeviceEventType::kBLEDeinitialized; + VerifyOrDo(CHIP_NO_ERROR == PlatformMgr().PostEvent(&event), ChipLogError(DeviceLayer, "Failed to post BLE deinit event")); } } CHIP_ERROR BLEManagerImpl::DeinitBLE() { + esp_err_t err = ESP_OK; VerifyOrReturnError(ble_hs_is_enabled(), CHIP_ERROR_INCORRECT_STATE, ChipLogProgress(DeviceLayer, "BLE already deinited")); VerifyOrReturnError(0 == nimble_port_stop(), MapBLEError(ESP_FAIL), ChipLogError(DeviceLayer, "nimble_port_stop() failed")); - esp_err_t err = nimble_port_deinit(); - VerifyOrReturnError(err == ESP_OK, MapBLEError(err)); + nimble_port_deinit(); #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0) err = esp_nimble_hci_and_controller_deinit(); From ae5d772873be065982185066b0cd6d358ffbf0a5 Mon Sep 17 00:00:00 2001 From: mkardous-silabs <84793247+mkardous-silabs@users.noreply.github.com> Date: Mon, 29 Apr 2024 09:31:39 -0400 Subject: [PATCH 069/124] [Silabs] Update docker SDK versions for the Silabs Docker (#33217) * Update sdk versions to new versions * Rename directory from efr32 to silabs * Update docker version * Update comments * Revert rename --- integrations/docker/images/base/chip-build/version | 2 +- .../docker/images/stage-2/chip-build-efr32/Dockerfile | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/integrations/docker/images/base/chip-build/version b/integrations/docker/images/base/chip-build/version index d5830b41578b40..5b67d363eb896b 100644 --- a/integrations/docker/images/base/chip-build/version +++ b/integrations/docker/images/base/chip-build/version @@ -1 +1 @@ -48 : [QEMU] Add QEMU Dockerfile for ble-wifi testing on Linux +49 : [Silabs] Update SDKs to new versions diff --git a/integrations/docker/images/stage-2/chip-build-efr32/Dockerfile b/integrations/docker/images/stage-2/chip-build-efr32/Dockerfile index 8dd4ca6b1444fd..9ac161a4a51800 100644 --- a/integrations/docker/images/stage-2/chip-build-efr32/Dockerfile +++ b/integrations/docker/images/stage-2/chip-build-efr32/Dockerfile @@ -13,8 +13,8 @@ RUN set -x \ && : # last line -# Clone Gecko SDK 4.4.1 (911f6cd) -RUN wget https://github.com/SiliconLabs/gecko_sdk/releases/download/v4.4.1/gecko-sdk.zip -O /tmp/gecko_sdk.zip \ +# Clone Gecko SDK 4.4.2 (e359ba4) +RUN wget https://github.com/SiliconLabs/gecko_sdk/releases/download/v4.4.2/gecko-sdk.zip -O /tmp/gecko_sdk.zip \ && unzip /tmp/gecko_sdk.zip -d /tmp/gecko_sdk \ && rm -rf /tmp/gecko_sdk.zip \ # Deleting files that are not needed to save space @@ -30,8 +30,8 @@ RUN git clone --depth=1 --single-branch --branch=2.8.2 https://github.com/Silico rm -rf .git \ && : # last line -# Clone WiSeConnect SDK 3.1.3 (00dd57a) -RUN git clone --depth=1 --single-branch --branch=v3.1.3 https://github.com/SiliconLabs/wiseconnect.git /tmp/wifi_sdk && \ +# Clone WiSeConnect SDK 3.1.3-matter-hotfix.4 (aa514d4) +RUN git clone --depth=1 --single-branch --branch=v3.1.3-matter-hotfix.4 https://github.com/SiliconLabs/wiseconnect.git /tmp/wifi_sdk && \ cd /tmp/wifi_sdk && \ rm -rf .git \ && : # last line From 33bfb4e4cd683630b8bb543a8f620a9906268f0a Mon Sep 17 00:00:00 2001 From: Amine Alami <43780877+Alami-Amine@users.noreply.github.com> Date: Mon, 29 Apr 2024 17:05:36 +0200 Subject: [PATCH 070/124] Adding to .clang-format command to insert newline EOF (#33201) --- .clang-format | 1 + 1 file changed, 1 insertion(+) diff --git a/.clang-format b/.clang-format index a1c292ac4afefa..4fb95466896aeb 100644 --- a/.clang-format +++ b/.clang-format @@ -106,6 +106,7 @@ SpacesInSquareBrackets: false Standard: Cpp11 TabWidth: 8 UseTab: Never +InsertNewlineAtEOF: true --- Language: ObjC BasedOnStyle: WebKit From 7bd24099db916512b39ed1a60be1f25d4b283e45 Mon Sep 17 00:00:00 2001 From: Amine Alami <43780877+Alami-Amine@users.noreply.github.com> Date: Mon, 29 Apr 2024 17:11:20 +0200 Subject: [PATCH 071/124] pw_unit_test migration: lib support batch 4 (#33199) * pw_unit_test migration: lib support batch 4 * fix merge error BUILD.gn --- src/lib/support/tests/BUILD.gn | 16 +- src/lib/support/tests/TestCHIPCounter.cpp | 4 +- src/lib/support/tests/TestCHIPMem.cpp | 101 +- src/lib/support/tests/TestCHIPMemString.cpp | 92 +- src/lib/support/tests/TestIntrusiveList.cpp | 160 ++- src/lib/support/tests/TestJsonToTlv.cpp | 201 ++-- src/lib/support/tests/TestJsonToTlvToJson.cpp | 1035 +++++++---------- src/lib/support/tests/TestTlvJson.cpp | 53 +- src/lib/support/tests/TestTlvToJson.cpp | 62 +- src/lib/support/tests/TestZclString.cpp | 108 +- 10 files changed, 752 insertions(+), 1080 deletions(-) diff --git a/src/lib/support/tests/BUILD.gn b/src/lib/support/tests/BUILD.gn index 6a7c7905d27c02..485402003fd4dd 100644 --- a/src/lib/support/tests/BUILD.gn +++ b/src/lib/support/tests/BUILD.gn @@ -29,11 +29,16 @@ chip_test_suite("tests") { "TestBytesCircularBuffer.cpp", "TestBytesToHex.cpp", "TestCHIPCounter.cpp", + "TestCHIPMem.cpp", + "TestCHIPMemString.cpp", "TestDefer.cpp", "TestErrorStr.cpp", "TestFixedBufferAllocator.cpp", "TestFold.cpp", "TestIniEscaping.cpp", + "TestIntrusiveList.cpp", + "TestJsonToTlv.cpp", + "TestJsonToTlvToJson.cpp", "TestPersistedCounter.cpp", "TestPrivateHeap.cpp", "TestSafeInt.cpp", @@ -47,8 +52,11 @@ chip_test_suite("tests") { "TestStringSplitter.cpp", "TestTestPersistentStorageDelegate.cpp", "TestTimeUtils.cpp", + "TestTlvJson.cpp", + "TestTlvToJson.cpp", "TestUtf8.cpp", "TestVariant.cpp", + "TestZclString.cpp", ] sources = [] @@ -76,17 +84,9 @@ chip_test_suite_using_nltest("tests_nltest") { output_name = "libSupportTestsNL" test_sources = [ - "TestCHIPMem.cpp", - "TestCHIPMemString.cpp", - "TestIntrusiveList.cpp", - "TestJsonToTlv.cpp", - "TestJsonToTlvToJson.cpp", "TestPool.cpp", "TestStateMachine.cpp", "TestThreadOperationalDataset.cpp", - "TestTlvJson.cpp", - "TestTlvToJson.cpp", - "TestZclString.cpp", ] sources = [] diff --git a/src/lib/support/tests/TestCHIPCounter.cpp b/src/lib/support/tests/TestCHIPCounter.cpp index d1212b97c5a3b7..b2c5e21b5038c2 100644 --- a/src/lib/support/tests/TestCHIPCounter.cpp +++ b/src/lib/support/tests/TestCHIPCounter.cpp @@ -16,9 +16,11 @@ * limitations under the License. */ +#include <stdint.h> + #include <gtest/gtest.h> + #include <lib/support/CHIPCounter.h> -#include <stdint.h> using namespace chip; diff --git a/src/lib/support/tests/TestCHIPMem.cpp b/src/lib/support/tests/TestCHIPMem.cpp index 2520da47a8e6a3..c19d356abfeceb 100644 --- a/src/lib/support/tests/TestCHIPMem.cpp +++ b/src/lib/support/tests/TestCHIPMem.cpp @@ -29,11 +29,10 @@ #include <stdlib.h> #include <string.h> +#include <gtest/gtest.h> + #include <lib/support/CHIPMem.h> #include <lib/support/CodeUtils.h> -#include <lib/support/UnitTestContext.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> using namespace chip; using namespace chip::Logging; @@ -43,7 +42,14 @@ using namespace chip::Platform; // Unit tests // ================================= -static void TestMemAlloc_Malloc(nlTestSuite * inSuite, void * inContext) +class TestCHIPMem : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + +TEST_F(TestCHIPMem, TestMemAlloc_Malloc) { char * p1 = nullptr; char * p2 = nullptr; @@ -51,52 +57,52 @@ static void TestMemAlloc_Malloc(nlTestSuite * inSuite, void * inContext) // Verify long-term allocation p1 = static_cast<char *>(MemoryAlloc(64)); - NL_TEST_ASSERT(inSuite, p1 != nullptr); + EXPECT_NE(p1, nullptr); p2 = static_cast<char *>(MemoryAlloc(256)); - NL_TEST_ASSERT(inSuite, p2 != nullptr); + EXPECT_NE(p2, nullptr); chip::Platform::MemoryFree(p1); chip::Platform::MemoryFree(p2); // Verify short-term allocation p1 = static_cast<char *>(MemoryAlloc(256)); - NL_TEST_ASSERT(inSuite, p1 != nullptr); + EXPECT_NE(p1, nullptr); p2 = static_cast<char *>(MemoryAlloc(256)); - NL_TEST_ASSERT(inSuite, p2 != nullptr); + EXPECT_NE(p2, nullptr); p3 = static_cast<char *>(MemoryAlloc(256)); - NL_TEST_ASSERT(inSuite, p3 != nullptr); + EXPECT_NE(p3, nullptr); chip::Platform::MemoryFree(p1); chip::Platform::MemoryFree(p2); chip::Platform::MemoryFree(p3); } -static void TestMemAlloc_Calloc(nlTestSuite * inSuite, void * inContext) +TEST_F(TestCHIPMem, TestMemAlloc_Calloc) { - char * p = static_cast<char *>(MemoryCalloc(128, true)); - NL_TEST_EXIT_ON_FAILED_ASSERT(inSuite, p != nullptr); + char * p = static_cast<char *>(MemoryCalloc(128, sizeof(char))); + ASSERT_NE(p, nullptr); for (int i = 0; i < 128; i++) - NL_TEST_ASSERT(inSuite, p[i] == 0); + EXPECT_EQ(p[i], 0); chip::Platform::MemoryFree(p); } -static void TestMemAlloc_Realloc(nlTestSuite * inSuite, void * inContext) +TEST_F(TestCHIPMem, TestMemAlloc_Realloc) { char * pa = static_cast<char *>(MemoryAlloc(128)); - NL_TEST_ASSERT(inSuite, pa != nullptr); + EXPECT_NE(pa, nullptr); char * pb = static_cast<char *>(MemoryRealloc(pa, 256)); - NL_TEST_ASSERT(inSuite, pb != nullptr); + EXPECT_NE(pb, nullptr); chip::Platform::MemoryFree(pb); } -static void TestMemAlloc_UniquePtr(nlTestSuite * inSuite, void * inContext) +TEST_F(TestCHIPMem, TestMemAlloc_UniquePtr) { // UniquePtr is a wrapper of std::unique_ptr for platform allocators, we just check if we created a correct wrapper here. int constructorCalled = 0; @@ -114,15 +120,15 @@ static void TestMemAlloc_UniquePtr(nlTestSuite * inSuite, void * inContext) { auto ptr = MakeUnique<Cls>(&constructorCalled, &destructorCalled); - NL_TEST_ASSERT(inSuite, constructorCalled == 1); - NL_TEST_ASSERT(inSuite, destructorCalled == 0); + EXPECT_EQ(constructorCalled, 1); + EXPECT_EQ(destructorCalled, 0); IgnoreUnusedVariable(ptr); } - NL_TEST_ASSERT(inSuite, destructorCalled == 1); + EXPECT_TRUE(destructorCalled); } -static void TestMemAlloc_SharedPtr(nlTestSuite * inSuite, void * inContext) +TEST_F(TestCHIPMem, TestMemAlloc_SharedPtr) { // SharedPtr is a wrapper of std::shared_ptr for platform allocators. int instanceConstructorCalled = 0; @@ -145,62 +151,21 @@ static void TestMemAlloc_SharedPtr(nlTestSuite * inSuite, void * inContext) SharedPtr<Cls> otherReference; { auto ptr = MakeShared<Cls>(&instanceConstructorCalled, &instanceDestructorCalled); - NL_TEST_ASSERT(inSuite, instanceConstructorCalled == 1); + EXPECT_EQ(instanceConstructorCalled, 1); // Capture a shared reference so we aren't destructed when we leave this scope. otherReference = ptr; } // Verify that by sharing to otherReference, we weren't destructed. - NL_TEST_ASSERT(inSuite, instanceDestructorCalled == 0); + EXPECT_EQ(instanceDestructorCalled, 0); // Now drop our reference. otherReference = MakeShared<Cls>(&otherInstanceConstructorCalled, &otherInstanceDestructorCalled); // Verify that the new instance was constructed and the first instance was // destructed, and that we retain a reference to the new instance. - NL_TEST_ASSERT(inSuite, instanceConstructorCalled == 1); - NL_TEST_ASSERT(inSuite, instanceDestructorCalled == 1); - NL_TEST_ASSERT(inSuite, otherInstanceConstructorCalled == 1); - NL_TEST_ASSERT(inSuite, otherInstanceDestructorCalled == 0); -} - -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { NL_TEST_DEF("Test MemAlloc::Malloc", TestMemAlloc_Malloc), - NL_TEST_DEF("Test MemAlloc::Calloc", TestMemAlloc_Calloc), - NL_TEST_DEF("Test MemAlloc::Realloc", TestMemAlloc_Realloc), - NL_TEST_DEF("Test MemAlloc::UniquePtr", TestMemAlloc_UniquePtr), - NL_TEST_DEF("Test MemAlloc::SharedPtr", TestMemAlloc_SharedPtr), - NL_TEST_SENTINEL() }; - -/** - * Set up the test suite. - */ -int TestMemAlloc_Setup(void * inContext) -{ - CHIP_ERROR error = MemoryInit(); - if (error != CHIP_NO_ERROR) - return (FAILURE); - return (SUCCESS); + EXPECT_EQ(instanceConstructorCalled, 1); + EXPECT_EQ(instanceDestructorCalled, 1); + EXPECT_EQ(otherInstanceConstructorCalled, 1); + EXPECT_EQ(otherInstanceDestructorCalled, 0); } - -/** - * Tear down the test suite. - */ -int TestMemAlloc_Teardown(void * inContext) -{ - MemoryShutdown(); - return (SUCCESS); -} - -int TestMemAlloc() -{ - nlTestSuite theSuite = { "CHIP Memory Allocation tests", &sTests[0], TestMemAlloc_Setup, TestMemAlloc_Teardown }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestMemAlloc) diff --git a/src/lib/support/tests/TestCHIPMemString.cpp b/src/lib/support/tests/TestCHIPMemString.cpp index 90507fd69cf7d6..10101bd193c0f6 100644 --- a/src/lib/support/tests/TestCHIPMemString.cpp +++ b/src/lib/support/tests/TestCHIPMemString.cpp @@ -22,12 +22,12 @@ #include <stdlib.h> #include <string.h> +#include <gtest/gtest.h> + #include <lib/support/CHIPMemString.h> #include <lib/support/CodeUtils.h> #include <lib/support/ScopedBuffer.h> #include <lib/support/Span.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> using namespace chip; using namespace chip::Platform; @@ -36,6 +36,13 @@ using namespace chip::Platform; // Unit tests // ================================= +class TestCHIPMemString : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + namespace { template <size_t kTestBufLen> struct TestBuffers @@ -51,28 +58,28 @@ struct TestBuffers memset(wayTooSmallBuf, 1, sizeof(wayTooSmallBuf)); memset(tooBigBuf, 1, sizeof(tooBigBuf)); } - void CheckCorrectness(nlTestSuite * inSuite, const char * testStr) + void CheckCorrectness(const char * testStr) { // correctSizeBuf and tooBigBuf should have the complete string. - NL_TEST_ASSERT(inSuite, correctSizeBuf[kTestBufLen - 1] == '\0'); - NL_TEST_ASSERT(inSuite, tooBigBuf[kTestBufLen - 1] == '\0'); - NL_TEST_ASSERT(inSuite, strcmp(correctSizeBuf, testStr) == 0); - NL_TEST_ASSERT(inSuite, strcmp(tooBigBuf, testStr) == 0); - NL_TEST_ASSERT(inSuite, strlen(correctSizeBuf) == strlen(testStr)); - NL_TEST_ASSERT(inSuite, strlen(tooBigBuf) == strlen(testStr)); + EXPECT_EQ(correctSizeBuf[kTestBufLen - 1], '\0'); + EXPECT_EQ(tooBigBuf[kTestBufLen - 1], '\0'); + EXPECT_STREQ(correctSizeBuf, testStr); + EXPECT_STREQ(tooBigBuf, testStr); + EXPECT_EQ(strlen(correctSizeBuf), strlen(testStr)); + EXPECT_EQ(strlen(tooBigBuf), strlen(testStr)); // wayTooSmallBuf is tiny and thus will only have the null terminator - NL_TEST_ASSERT(inSuite, wayTooSmallBuf[0] == '\0'); + EXPECT_EQ(wayTooSmallBuf[0], '\0'); // tooSmallBuf should still have a null terminator on the end - NL_TEST_ASSERT(inSuite, tooSmallBuf[kTestBufLen - 2] == '\0'); - NL_TEST_ASSERT(inSuite, memcmp(tooSmallBuf, testStr, kTestBufLen - 2) == 0); + EXPECT_EQ(tooSmallBuf[kTestBufLen - 2], '\0'); + EXPECT_EQ(memcmp(tooSmallBuf, testStr, kTestBufLen - 2), 0); } }; } // namespace -static void TestCopyString(nlTestSuite * inSuite, void * inContext) +TEST_F(TestCHIPMemString, TestCopyString) { static constexpr char testWord[] = "testytest"; ByteSpan testWordSpan = ByteSpan(reinterpret_cast<const uint8_t *>(testWord), sizeof(testWord) - 1); @@ -85,7 +92,7 @@ static void TestCopyString(nlTestSuite * inSuite, void * inContext) CopyString(testBuffers.tooSmallBuf, sizeof(testBuffers.tooSmallBuf), testWord); CopyString(testBuffers.wayTooSmallBuf, sizeof(testBuffers.wayTooSmallBuf), testWord); CopyString(testBuffers.tooBigBuf, sizeof(testBuffers.tooBigBuf), testWord); - testBuffers.CheckCorrectness(inSuite, testWord); + testBuffers.CheckCorrectness(testWord); // CopyString with array size testBuffers.Reset(); @@ -93,7 +100,7 @@ static void TestCopyString(nlTestSuite * inSuite, void * inContext) CopyString(testBuffers.tooSmallBuf, testWord); CopyString(testBuffers.wayTooSmallBuf, testWord); CopyString(testBuffers.tooBigBuf, testWord); - testBuffers.CheckCorrectness(inSuite, testWord); + testBuffers.CheckCorrectness(testWord); // CopyString with explicit size from ByteSpan testBuffers.Reset(); @@ -101,7 +108,7 @@ static void TestCopyString(nlTestSuite * inSuite, void * inContext) CopyString(testBuffers.tooSmallBuf, sizeof(testBuffers.tooSmallBuf), testWordSpan); CopyString(testBuffers.wayTooSmallBuf, sizeof(testBuffers.wayTooSmallBuf), testWordSpan); CopyString(testBuffers.tooBigBuf, sizeof(testBuffers.tooBigBuf), testWordSpan); - testBuffers.CheckCorrectness(inSuite, testWord); + testBuffers.CheckCorrectness(testWord); // CopyString with array size from ByteSpan testBuffers.Reset(); @@ -109,7 +116,7 @@ static void TestCopyString(nlTestSuite * inSuite, void * inContext) CopyString(testBuffers.tooSmallBuf, testWordSpan); CopyString(testBuffers.wayTooSmallBuf, testWordSpan); CopyString(testBuffers.tooBigBuf, testWordSpan); - testBuffers.CheckCorrectness(inSuite, testWord); + testBuffers.CheckCorrectness(testWord); // CopyString with explicit size from CharSpan testBuffers.Reset(); @@ -117,7 +124,7 @@ static void TestCopyString(nlTestSuite * inSuite, void * inContext) CopyString(testBuffers.tooSmallBuf, sizeof(testBuffers.tooSmallBuf), testWordSpan2); CopyString(testBuffers.wayTooSmallBuf, sizeof(testBuffers.wayTooSmallBuf), testWordSpan2); CopyString(testBuffers.tooBigBuf, sizeof(testBuffers.tooBigBuf), testWordSpan2); - testBuffers.CheckCorrectness(inSuite, testWord); + testBuffers.CheckCorrectness(testWord); // CopyString with array size from CharSpan testBuffers.Reset(); @@ -125,59 +132,24 @@ static void TestCopyString(nlTestSuite * inSuite, void * inContext) CopyString(testBuffers.tooSmallBuf, testWordSpan2); CopyString(testBuffers.wayTooSmallBuf, testWordSpan2); CopyString(testBuffers.tooBigBuf, testWordSpan2); - testBuffers.CheckCorrectness(inSuite, testWord); + testBuffers.CheckCorrectness(testWord); } -static void TestMemoryAllocString(nlTestSuite * inSuite, void * inContext) +TEST_F(TestCHIPMemString, TestMemoryAllocString) { static constexpr char testStr[] = "testytestString"; char * allocatedStr = MemoryAllocString(testStr, sizeof(testStr)); - NL_TEST_ASSERT(inSuite, allocatedStr != nullptr); - if (allocatedStr == nullptr) - { - return; - } - NL_TEST_ASSERT(inSuite, strcmp(testStr, allocatedStr) == 0); + ASSERT_NE(allocatedStr, nullptr); + + EXPECT_STREQ(testStr, allocatedStr); MemoryFree(allocatedStr); } -static void TestScopedBuffer(nlTestSuite * inSuite, void * inContext) +TEST_F(TestCHIPMemString, TestScopedBuffer) { // Scoped buffer has its own tests that check the memory properly. Here we are just testing that the string is copied in // properly. static constexpr char testStr[] = "testytestString"; ScopedMemoryString scopedString = ScopedMemoryString(testStr, sizeof(testStr)); - NL_TEST_ASSERT(inSuite, strcmp(scopedString.Get(), testStr) == 0); -} - -static const nlTest sTests[] = { NL_TEST_DEF("Test CopyString", TestCopyString), - NL_TEST_DEF("Test MemoryAllocString", TestMemoryAllocString), - NL_TEST_DEF("Test ScopedBuffer", TestScopedBuffer), NL_TEST_SENTINEL() }; - -int TestMemString_Setup(void * inContext) -{ - CHIP_ERROR error = MemoryInit(); - if (error != CHIP_NO_ERROR) - return (FAILURE); - return (SUCCESS); -} - -/** - * Tear down the test suite. - */ -int TestMemString_Teardown(void * inContext) -{ - MemoryShutdown(); - return (SUCCESS); + EXPECT_STREQ(scopedString.Get(), testStr); } - -int TestMemString() -{ - nlTestSuite theSuite = { "CHIP Memory Allocation tests", &sTests[0], TestMemString_Setup, TestMemString_Teardown }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestMemString) diff --git a/src/lib/support/tests/TestIntrusiveList.cpp b/src/lib/support/tests/TestIntrusiveList.cpp index 0d1779b00ac987..50ace6a561e699 100644 --- a/src/lib/support/tests/TestIntrusiveList.cpp +++ b/src/lib/support/tests/TestIntrusiveList.cpp @@ -18,20 +18,30 @@ #include <ctime> #include <list> -#include <lib/support/IntrusiveList.h> -#include <lib/support/UnitTestRegistration.h> +#include <gtest/gtest.h> -#include <nlunit-test.h> +#include <lib/support/IntrusiveList.h> namespace { using namespace chip; +class TestIntrusiveList : public ::testing::Test +{ +public: + static void SetUpTestSuite() + { + unsigned seed = static_cast<unsigned>(std::time(nullptr)); + printf("Running " __FILE__ " using seed %d \n", seed); + std::srand(seed); + } +}; + class ListNode : public IntrusiveListNodeBase<> { }; -void TestIntrusiveListRandom(nlTestSuite * inSuite, void * inContext) +TEST_F(TestIntrusiveList, TestIntrusiveListRandom) { IntrusiveList<ListNode> l1; ListNode node[100]; @@ -86,9 +96,8 @@ void TestIntrusiveListRandom(nlTestSuite * inSuite, void * inContext) break; } - NL_TEST_ASSERT(inSuite, - std::equal(l1.begin(), l1.end(), l2.begin(), l2.end(), - [](const ListNode & p1, const ListNode * p2) { return &p1 == p2; })); + EXPECT_TRUE(std::equal(l1.begin(), l1.end(), l2.begin(), l2.end(), + [](const ListNode & p1, const ListNode * p2) { return &p1 == p2; })); } while (!l1.Empty()) @@ -97,85 +106,85 @@ void TestIntrusiveListRandom(nlTestSuite * inSuite, void * inContext) } } -void TestContains(nlTestSuite * inSuite, void * inContext) +TEST_F(TestIntrusiveList, TestContains) { ListNode a, b, c; IntrusiveList<ListNode> list; - NL_TEST_ASSERT(inSuite, !list.Contains(&a)); - NL_TEST_ASSERT(inSuite, !list.Contains(&b)); - NL_TEST_ASSERT(inSuite, !list.Contains(&c)); + EXPECT_FALSE(list.Contains(&a)); + EXPECT_FALSE(list.Contains(&b)); + EXPECT_FALSE(list.Contains(&c)); list.PushBack(&a); list.PushFront(&c); - NL_TEST_ASSERT(inSuite, list.Contains(&a)); - NL_TEST_ASSERT(inSuite, !list.Contains(&b)); - NL_TEST_ASSERT(inSuite, list.Contains(&c)); + EXPECT_TRUE(list.Contains(&a)); + EXPECT_FALSE(list.Contains(&b)); + EXPECT_TRUE(list.Contains(&c)); list.PushBack(&b); - NL_TEST_ASSERT(inSuite, list.Contains(&a)); - NL_TEST_ASSERT(inSuite, list.Contains(&b)); - NL_TEST_ASSERT(inSuite, list.Contains(&c)); + EXPECT_TRUE(list.Contains(&a)); + EXPECT_TRUE(list.Contains(&b)); + EXPECT_TRUE(list.Contains(&c)); list.Remove(&a); list.Remove(&c); - NL_TEST_ASSERT(inSuite, !list.Contains(&a)); - NL_TEST_ASSERT(inSuite, list.Contains(&b)); - NL_TEST_ASSERT(inSuite, !list.Contains(&c)); + EXPECT_FALSE(list.Contains(&a)); + EXPECT_TRUE(list.Contains(&b)); + EXPECT_FALSE(list.Contains(&c)); // all nodes have to be removed from the list on destruction. Lists do NOT do // this automatically list.Remove(&b); } -void TestClear(nlTestSuite * inSuite, void * inContext) +TEST_F(TestIntrusiveList, TestClear) { ListNode a, b, c; IntrusiveList<ListNode> list; - NL_TEST_ASSERT(inSuite, !list.Contains(&a)); - NL_TEST_ASSERT(inSuite, !list.Contains(&b)); - NL_TEST_ASSERT(inSuite, !list.Contains(&c)); + EXPECT_FALSE(list.Contains(&a)); + EXPECT_FALSE(list.Contains(&b)); + EXPECT_FALSE(list.Contains(&c)); list.PushBack(&a); list.PushFront(&c); - NL_TEST_ASSERT(inSuite, list.Contains(&a)); - NL_TEST_ASSERT(inSuite, !list.Contains(&b)); - NL_TEST_ASSERT(inSuite, list.Contains(&c)); + EXPECT_TRUE(list.Contains(&a)); + EXPECT_FALSE(list.Contains(&b)); + EXPECT_TRUE(list.Contains(&c)); list.PushBack(&b); - NL_TEST_ASSERT(inSuite, list.Contains(&a)); - NL_TEST_ASSERT(inSuite, list.Contains(&b)); - NL_TEST_ASSERT(inSuite, list.Contains(&c)); + EXPECT_TRUE(list.Contains(&a)); + EXPECT_TRUE(list.Contains(&b)); + EXPECT_TRUE(list.Contains(&c)); list.Clear(); - NL_TEST_ASSERT(inSuite, !list.Contains(&a)); - NL_TEST_ASSERT(inSuite, !list.Contains(&b)); - NL_TEST_ASSERT(inSuite, !list.Contains(&c)); + EXPECT_FALSE(list.Contains(&a)); + EXPECT_FALSE(list.Contains(&b)); + EXPECT_FALSE(list.Contains(&c)); } -void TestReplaceNode(nlTestSuite * inSuite, void * inContext) +TEST_F(TestIntrusiveList, TestReplaceNode) { ListNode a, b; IntrusiveList<ListNode> list; list.PushBack(&a); list.Replace(&a, &b); - NL_TEST_ASSERT(inSuite, !a.IsInList()); - NL_TEST_ASSERT(inSuite, b.IsInList()); - NL_TEST_ASSERT(inSuite, !list.Empty()); - NL_TEST_ASSERT(inSuite, !list.Contains(&a)); - NL_TEST_ASSERT(inSuite, list.Contains(&b)); + EXPECT_FALSE(a.IsInList()); + EXPECT_TRUE(b.IsInList()); + EXPECT_FALSE(list.Empty()); + EXPECT_FALSE(list.Contains(&a)); + EXPECT_TRUE(list.Contains(&b)); list.Remove(&b); } -void TestMoveList(nlTestSuite * inSuite, void * inContext) +TEST_F(TestIntrusiveList, TestMoveList) { ListNode a, b; @@ -183,8 +192,8 @@ void TestMoveList(nlTestSuite * inSuite, void * inContext) // Test case 1: Move construct an empty list IntrusiveList<ListNode> listA; IntrusiveList<ListNode> listB(std::move(listA)); - NL_TEST_ASSERT(inSuite, listA.Empty()); // NOLINT(bugprone-use-after-move) - NL_TEST_ASSERT(inSuite, listB.Empty()); + EXPECT_TRUE(listA.Empty()); // NOLINT(bugprone-use-after-move) + EXPECT_TRUE(listB.Empty()); } { @@ -193,8 +202,8 @@ void TestMoveList(nlTestSuite * inSuite, void * inContext) listA.PushBack(&a); IntrusiveList<ListNode> listB(std::move(listA)); - NL_TEST_ASSERT(inSuite, listA.Empty()); // NOLINT(bugprone-use-after-move) - NL_TEST_ASSERT(inSuite, listB.Contains(&a)); + EXPECT_TRUE(listA.Empty()); // NOLINT(bugprone-use-after-move) + EXPECT_TRUE(listB.Contains(&a)); listB.Remove(&a); } @@ -203,8 +212,8 @@ void TestMoveList(nlTestSuite * inSuite, void * inContext) IntrusiveList<ListNode> listA; IntrusiveList<ListNode> listB; listB = std::move(listA); - NL_TEST_ASSERT(inSuite, listA.Empty()); // NOLINT(bugprone-use-after-move) - NL_TEST_ASSERT(inSuite, listB.Empty()); + EXPECT_TRUE(listA.Empty()); // NOLINT(bugprone-use-after-move) + EXPECT_TRUE(listB.Empty()); } { @@ -214,8 +223,8 @@ void TestMoveList(nlTestSuite * inSuite, void * inContext) IntrusiveList<ListNode> listB; listB = std::move(listA); - NL_TEST_ASSERT(inSuite, listA.Empty()); // NOLINT(bugprone-use-after-move) - NL_TEST_ASSERT(inSuite, listB.Contains(&a)); + EXPECT_TRUE(listA.Empty()); // NOLINT(bugprone-use-after-move) + EXPECT_TRUE(listB.Contains(&a)); listB.Remove(&a); } } @@ -224,68 +233,29 @@ class ListNodeAutoUnlink : public IntrusiveListNodeBase<IntrusiveMode::AutoUnlin { }; -void TestAutoUnlink(nlTestSuite * inSuite, void * inContext) +TEST_F(TestIntrusiveList, TestAutoUnlink) { IntrusiveList<ListNodeAutoUnlink, IntrusiveMode::AutoUnlink> list; // Test case 1: Test node->Unlink() { ListNodeAutoUnlink a; - NL_TEST_ASSERT(inSuite, !list.Contains(&a)); + EXPECT_FALSE(list.Contains(&a)); list.PushBack(&a); - NL_TEST_ASSERT(inSuite, list.Contains(&a)); + EXPECT_TRUE(list.Contains(&a)); a.Unlink(); - NL_TEST_ASSERT(inSuite, !list.Contains(&a)); - NL_TEST_ASSERT(inSuite, list.Empty()); + EXPECT_FALSE(list.Contains(&a)); + EXPECT_TRUE(list.Empty()); } // Test case 2: The node is automatically removed when goes out of scope { ListNodeAutoUnlink a; - NL_TEST_ASSERT(inSuite, !list.Contains(&a)); + EXPECT_FALSE(list.Contains(&a)); list.PushBack(&a); - NL_TEST_ASSERT(inSuite, list.Contains(&a)); + EXPECT_TRUE(list.Contains(&a)); } - NL_TEST_ASSERT(inSuite, list.Empty()); -} - -int Setup(void * inContext) -{ - return SUCCESS; -} - -int Teardown(void * inContext) -{ - return SUCCESS; + EXPECT_TRUE(list.Empty()); } } // namespace - -#define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn) -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { - NL_TEST_DEF_FN(TestIntrusiveListRandom), // - NL_TEST_DEF_FN(TestContains), // - NL_TEST_DEF_FN(TestReplaceNode), // - NL_TEST_DEF_FN(TestMoveList), // - NL_TEST_DEF_FN(TestAutoUnlink), // - NL_TEST_DEF_FN(TestClear), // - NL_TEST_SENTINEL(), // -}; - -int TestIntrusiveList() -{ - nlTestSuite theSuite = { "CHIP IntrusiveList tests", &sTests[0], Setup, Teardown }; - - unsigned seed = static_cast<unsigned>(std::time(nullptr)); - printf("Running " __FILE__ " using seed %d", seed); - std::srand(seed); - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestIntrusiveList); diff --git a/src/lib/support/tests/TestJsonToTlv.cpp b/src/lib/support/tests/TestJsonToTlv.cpp index a53144712c2770..9bc8696fd88621 100644 --- a/src/lib/support/tests/TestJsonToTlv.cpp +++ b/src/lib/support/tests/TestJsonToTlv.cpp @@ -15,19 +15,18 @@ * limitations under the License. */ +#include <string> + +#include <gtest/gtest.h> + #include <app-common/zap-generated/cluster-objects.h> #include <app/data-model/Decode.h> #include <app/data-model/Encode.h> #include <lib/core/TLVDebug.h> #include <lib/core/TLVReader.h> -#include <lib/support/UnitTestRegistration.h> #include <lib/support/jsontlv/JsonToTlv.h> #include <lib/support/jsontlv/TextFormat.h> #include <lib/support/jsontlv/TlvToJson.h> -#include <nlunit-test.h> - -#include <string> - namespace { using namespace chip::Encoding; @@ -40,7 +39,13 @@ uint8_t gBuf1[1024]; uint8_t gBuf2[1024]; TLV::TLVWriter gWriter1; TLV::TLVWriter gWriter2; -nlTestSuite * gSuite; + +class TestJsonToTlv : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; void SetupWriters() { @@ -87,29 +92,27 @@ void ConvertJsonToTlvAndValidate(T val, const std::string & jsonString) SetupWriters(); err = gWriter1.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, container); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = DataModel::Encode(gWriter1, TLV::ContextTag(1), val); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = gWriter1.EndContainer(container); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = gWriter1.Finalize(); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = JsonToTlv(jsonString, gWriter2); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(gSuite, MatchWriter1and2()); + EXPECT_TRUE(MatchWriter1and2()); } -void TestConverter(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlv, TestConverter) { std::string jsonString; - gSuite = inSuite; - jsonString = "{\n" " \"1:UINT\" : 30\n" "}\n"; @@ -239,7 +242,7 @@ void TestConverter(nlTestSuite * inSuite, void * inContext) ConvertJsonToTlvAndValidate(structList, jsonString); } -void Test32BitConvert(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlv, Test32BitConvert) { // JSON TLV format explicitly wants to support 32-bit integer preservation. // @@ -258,69 +261,69 @@ void Test32BitConvert(nlTestSuite * inSuite, void * inContext) { SetupWriters(); JsonToTlv("{\"1:INT\": 321}", gWriter1); - NL_TEST_ASSERT(inSuite, gWriter1.Finalize() == CHIP_NO_ERROR); + EXPECT_EQ(gWriter1.Finalize(), CHIP_NO_ERROR); reader.Init(gBuf1, gWriter1.GetLengthWritten()); reader.ImplicitProfileId = kImplicitProfileId; - NL_TEST_ASSERT(inSuite, reader.Next(TLV::AnonymousTag()) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.GetType() == TLV::kTLVType_Structure); - NL_TEST_ASSERT(inSuite, reader.EnterContainer(tlvType) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.Next(TLV::ContextTag(1)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.GetType() == TLV::kTLVType_SignedInteger); - NL_TEST_ASSERT(inSuite, reader.Get(value) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, value == 321); - NL_TEST_ASSERT(inSuite, reader.Next() == CHIP_END_OF_TLV); - NL_TEST_ASSERT(inSuite, reader.ExitContainer(tlvType) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.Next() == CHIP_END_OF_TLV); + EXPECT_EQ(reader.Next(TLV::AnonymousTag()), CHIP_NO_ERROR); + EXPECT_EQ(reader.GetType(), TLV::kTLVType_Structure); + EXPECT_EQ(reader.EnterContainer(tlvType), CHIP_NO_ERROR); + EXPECT_EQ(reader.Next(TLV::ContextTag(1)), CHIP_NO_ERROR); + EXPECT_EQ(reader.GetType(), TLV::kTLVType_SignedInteger); + EXPECT_EQ(reader.Get(value), CHIP_NO_ERROR); + EXPECT_EQ(value, 321); + EXPECT_EQ(reader.Next(), CHIP_END_OF_TLV); + EXPECT_EQ(reader.ExitContainer(tlvType), CHIP_NO_ERROR); + EXPECT_EQ(reader.Next(), CHIP_END_OF_TLV); } // convert a single value that is larger than 8 bit { SetupWriters(); JsonToTlv("{\"1234:INT\": 321}", gWriter1); - NL_TEST_ASSERT(inSuite, gWriter1.Finalize() == CHIP_NO_ERROR); + EXPECT_EQ(gWriter1.Finalize(), CHIP_NO_ERROR); reader.Init(gBuf1, gWriter1.GetLengthWritten()); reader.ImplicitProfileId = kImplicitProfileId; - NL_TEST_ASSERT(inSuite, reader.Next(TLV::AnonymousTag()) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.GetType() == TLV::kTLVType_Structure); - NL_TEST_ASSERT(inSuite, reader.EnterContainer(tlvType) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.Next(TLV::ProfileTag(kImplicitProfileId, 1234)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.GetType() == TLV::kTLVType_SignedInteger); - NL_TEST_ASSERT(inSuite, reader.Get(value) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, value == 321); - NL_TEST_ASSERT(inSuite, reader.Next() == CHIP_END_OF_TLV); - NL_TEST_ASSERT(inSuite, reader.ExitContainer(tlvType) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.Next() == CHIP_END_OF_TLV); + EXPECT_EQ(reader.Next(TLV::AnonymousTag()), CHIP_NO_ERROR); + EXPECT_EQ(reader.GetType(), TLV::kTLVType_Structure); + EXPECT_EQ(reader.EnterContainer(tlvType), CHIP_NO_ERROR); + EXPECT_EQ(reader.Next(TLV::ProfileTag(kImplicitProfileId, 1234)), CHIP_NO_ERROR); + EXPECT_EQ(reader.GetType(), TLV::kTLVType_SignedInteger); + EXPECT_EQ(reader.Get(value), CHIP_NO_ERROR); + EXPECT_EQ(value, 321); + EXPECT_EQ(reader.Next(), CHIP_END_OF_TLV); + EXPECT_EQ(reader.ExitContainer(tlvType), CHIP_NO_ERROR); + EXPECT_EQ(reader.Next(), CHIP_END_OF_TLV); } // Convert to a full 32-bit value, unsigned { SetupWriters(); JsonToTlv("{\"4275878552:INT\": 321}", gWriter1); - NL_TEST_ASSERT(inSuite, gWriter1.Finalize() == CHIP_NO_ERROR); + EXPECT_EQ(gWriter1.Finalize(), CHIP_NO_ERROR); reader.Init(gBuf1, gWriter1.GetLengthWritten()); reader.ImplicitProfileId = kImplicitProfileId; - NL_TEST_ASSERT(inSuite, reader.Next(TLV::AnonymousTag()) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.GetType() == TLV::kTLVType_Structure); - NL_TEST_ASSERT(inSuite, reader.EnterContainer(tlvType) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.Next(TLV::ProfileTag((4275878552 >> 16) & 0xFFFF, 0, 4275878552 & 0xFFFF)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.GetType() == TLV::kTLVType_SignedInteger); - NL_TEST_ASSERT(inSuite, reader.Get(value) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, value == 321); - NL_TEST_ASSERT(inSuite, reader.Next() == CHIP_END_OF_TLV); - NL_TEST_ASSERT(inSuite, reader.ExitContainer(tlvType) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.Next() == CHIP_END_OF_TLV); + EXPECT_EQ(reader.Next(TLV::AnonymousTag()), CHIP_NO_ERROR); + EXPECT_EQ(reader.GetType(), TLV::kTLVType_Structure); + EXPECT_EQ(reader.EnterContainer(tlvType), CHIP_NO_ERROR); + EXPECT_EQ(reader.Next(TLV::ProfileTag((4275878552 >> 16) & 0xFFFF, 0, 4275878552 & 0xFFFF)), CHIP_NO_ERROR); + EXPECT_EQ(reader.GetType(), TLV::kTLVType_SignedInteger); + EXPECT_EQ(reader.Get(value), CHIP_NO_ERROR); + EXPECT_EQ(value, 321); + EXPECT_EQ(reader.Next(), CHIP_END_OF_TLV); + EXPECT_EQ(reader.ExitContainer(tlvType), CHIP_NO_ERROR); + EXPECT_EQ(reader.Next(), CHIP_END_OF_TLV); } // FIXME: implement } -void TestMEIConvert(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlv, TestMEIConvert) { TLV::TLVReader reader; TLV::TLVType tlvType; @@ -330,95 +333,63 @@ void TestMEIConvert(nlTestSuite * inSuite, void * inContext) { SetupWriters(); JsonToTlv("{\"65536:INT\": 321}", gWriter1); - NL_TEST_ASSERT(inSuite, gWriter1.Finalize() == CHIP_NO_ERROR); + EXPECT_EQ(gWriter1.Finalize(), CHIP_NO_ERROR); reader.Init(gBuf1, gWriter1.GetLengthWritten()); reader.ImplicitProfileId = kImplicitProfileId; - NL_TEST_ASSERT(inSuite, reader.Next(TLV::AnonymousTag()) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.GetType() == TLV::kTLVType_Structure); - NL_TEST_ASSERT(inSuite, reader.EnterContainer(tlvType) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.Next(TLV::ProfileTag(1, 0, 0)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.GetType() == TLV::kTLVType_SignedInteger); - NL_TEST_ASSERT(inSuite, reader.Get(value) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, value == 321); - NL_TEST_ASSERT(inSuite, reader.Next() == CHIP_END_OF_TLV); - NL_TEST_ASSERT(inSuite, reader.ExitContainer(tlvType) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.Next() == CHIP_END_OF_TLV); + EXPECT_EQ(reader.Next(TLV::AnonymousTag()), CHIP_NO_ERROR); + EXPECT_EQ(reader.GetType(), TLV::kTLVType_Structure); + EXPECT_EQ(reader.EnterContainer(tlvType), CHIP_NO_ERROR); + EXPECT_EQ(reader.Next(TLV::ProfileTag(1, 0, 0)), CHIP_NO_ERROR); + EXPECT_EQ(reader.GetType(), TLV::kTLVType_SignedInteger); + EXPECT_EQ(reader.Get(value), CHIP_NO_ERROR); + EXPECT_EQ(value, 321); + EXPECT_EQ(reader.Next(), CHIP_END_OF_TLV); + EXPECT_EQ(reader.ExitContainer(tlvType), CHIP_NO_ERROR); + EXPECT_EQ(reader.Next(), CHIP_END_OF_TLV); } // Vendor ID = 0xFFFF, Tag ID = 0 { SetupWriters(); JsonToTlv("{\"4294901760:INT\": 123}", gWriter1); - NL_TEST_ASSERT(inSuite, gWriter1.Finalize() == CHIP_NO_ERROR); + EXPECT_EQ(gWriter1.Finalize(), CHIP_NO_ERROR); reader.Init(gBuf1, gWriter1.GetLengthWritten()); reader.ImplicitProfileId = kImplicitProfileId; - NL_TEST_ASSERT(inSuite, reader.Next(TLV::AnonymousTag()) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.GetType() == TLV::kTLVType_Structure); - NL_TEST_ASSERT(inSuite, reader.EnterContainer(tlvType) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.Next(TLV::ProfileTag(0xFFFF, 0, 0)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.GetType() == TLV::kTLVType_SignedInteger); - NL_TEST_ASSERT(inSuite, reader.Get(value) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, value == 123); - NL_TEST_ASSERT(inSuite, reader.Next() == CHIP_END_OF_TLV); - NL_TEST_ASSERT(inSuite, reader.ExitContainer(tlvType) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.Next() == CHIP_END_OF_TLV); + EXPECT_EQ(reader.Next(TLV::AnonymousTag()), CHIP_NO_ERROR); + EXPECT_EQ(reader.GetType(), TLV::kTLVType_Structure); + EXPECT_EQ(reader.EnterContainer(tlvType), CHIP_NO_ERROR); + EXPECT_EQ(reader.Next(TLV::ProfileTag(0xFFFF, 0, 0)), CHIP_NO_ERROR); + EXPECT_EQ(reader.GetType(), TLV::kTLVType_SignedInteger); + EXPECT_EQ(reader.Get(value), CHIP_NO_ERROR); + EXPECT_EQ(value, 123); + EXPECT_EQ(reader.Next(), CHIP_END_OF_TLV); + EXPECT_EQ(reader.ExitContainer(tlvType), CHIP_NO_ERROR); + EXPECT_EQ(reader.Next(), CHIP_END_OF_TLV); } // Vendor ID = 0xFFFF, Tag ID = 0xFFFF { SetupWriters(); JsonToTlv("{\"4294967295:INT\": 123}", gWriter1); - NL_TEST_ASSERT(inSuite, gWriter1.Finalize() == CHIP_NO_ERROR); + EXPECT_EQ(gWriter1.Finalize(), CHIP_NO_ERROR); reader.Init(gBuf1, gWriter1.GetLengthWritten()); reader.ImplicitProfileId = kImplicitProfileId; - NL_TEST_ASSERT(inSuite, reader.Next(TLV::AnonymousTag()) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.GetType() == TLV::kTLVType_Structure); - NL_TEST_ASSERT(inSuite, reader.EnterContainer(tlvType) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.Next(TLV::ProfileTag(0xFFFF, 0, 0xFFFF)) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.GetType() == TLV::kTLVType_SignedInteger); - NL_TEST_ASSERT(inSuite, reader.Get(value) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, value == 123); - NL_TEST_ASSERT(inSuite, reader.Next() == CHIP_END_OF_TLV); - NL_TEST_ASSERT(inSuite, reader.ExitContainer(tlvType) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, reader.Next() == CHIP_END_OF_TLV); + EXPECT_EQ(reader.Next(TLV::AnonymousTag()), CHIP_NO_ERROR); + EXPECT_EQ(reader.GetType(), TLV::kTLVType_Structure); + EXPECT_EQ(reader.EnterContainer(tlvType), CHIP_NO_ERROR); + EXPECT_EQ(reader.Next(TLV::ProfileTag(0xFFFF, 0, 0xFFFF)), CHIP_NO_ERROR); + EXPECT_EQ(reader.GetType(), TLV::kTLVType_SignedInteger); + EXPECT_EQ(reader.Get(value), CHIP_NO_ERROR); + EXPECT_EQ(value, 123); + EXPECT_EQ(reader.Next(), CHIP_END_OF_TLV); + EXPECT_EQ(reader.ExitContainer(tlvType), CHIP_NO_ERROR); + EXPECT_EQ(reader.Next(), CHIP_END_OF_TLV); } } - -int Initialize(void * apSuite) -{ - VerifyOrReturnError(chip::Platform::MemoryInit() == CHIP_NO_ERROR, FAILURE); - return SUCCESS; -} - -int Finalize(void * aContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - -// clang-format off -const nlTest sTests[] = -{ - NL_TEST_DEF("TestConverter", TestConverter), - NL_TEST_DEF("Test32BitConvert", Test32BitConvert), - NL_TEST_DEF("TestMEIConvert", TestMEIConvert), - NL_TEST_SENTINEL() -}; -// clang-format on - } // namespace - -int TestJsonToTlv() -{ - nlTestSuite theSuite = { "JsonToTlv", sTests, Initialize, Finalize }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestJsonToTlv) diff --git a/src/lib/support/tests/TestJsonToTlvToJson.cpp b/src/lib/support/tests/TestJsonToTlvToJson.cpp index 2ac64670d3d596..665df4dcb30cab 100644 --- a/src/lib/support/tests/TestJsonToTlvToJson.cpp +++ b/src/lib/support/tests/TestJsonToTlvToJson.cpp @@ -16,17 +16,16 @@ */ #include <stdio.h> +#include <string> + +#include <gtest/gtest.h> #include <app-common/zap-generated/cluster-objects.h> #include <app/data-model/Decode.h> #include <app/data-model/Encode.h> -#include <lib/support/UnitTestRegistration.h> #include <lib/support/jsontlv/JsonToTlv.h> #include <lib/support/jsontlv/TextFormat.h> #include <lib/support/jsontlv/TlvToJson.h> -#include <nlunit-test.h> - -#include <string> namespace { @@ -36,7 +35,12 @@ using namespace chip::app; constexpr uint32_t kImplicitProfileId = 0x1122; -nlTestSuite * gSuite; +class TestJsonToTlvToJson : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; void PrintSpan(const char * prefix, const ByteSpan & span) { @@ -56,10 +60,10 @@ void CheckValidConversion(const std::string & jsonOriginal, const ByteSpan & tlv uint8_t buf[256]; MutableByteSpan tlvEncodingLocal(buf); err = JsonToTlv(jsonOriginal, tlvEncodingLocal); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); match = tlvEncodingLocal.data_equal(tlvEncoding); - NL_TEST_ASSERT(gSuite, match); + EXPECT_TRUE(match); if (!match) { printf("ERROR: TLV Encoding Doesn't Match!\n"); @@ -69,12 +73,12 @@ void CheckValidConversion(const std::string & jsonOriginal, const ByteSpan & tlv std::string generatedJsonString; err = TlvToJson(tlvEncoding, generatedJsonString); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); auto compactExpectedString = PrettyPrintJsonString(jsonExpected); auto compactGeneratedString = PrettyPrintJsonString(generatedJsonString); match = (compactGeneratedString == compactExpectedString); - NL_TEST_ASSERT(gSuite, match); + EXPECT_TRUE(match); if (!match) { printf("ERROR: Json String Doesn't Match!\n"); @@ -85,10 +89,10 @@ void CheckValidConversion(const std::string & jsonOriginal, const ByteSpan & tlv // Verify that Expected Json String Converts to the Same TLV Encoding tlvEncodingLocal = MutableByteSpan(buf); err = JsonToTlv(jsonOriginal, tlvEncodingLocal); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); match = tlvEncodingLocal.data_equal(tlvEncoding); - NL_TEST_ASSERT(gSuite, match); + EXPECT_TRUE(match); if (!match) { printf("ERROR: TLV Encoding Doesn't Match!\n"); @@ -98,19 +102,18 @@ void CheckValidConversion(const std::string & jsonOriginal, const ByteSpan & tlv } // Boolean true -void TestConverter_Boolean_True(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Boolean_True) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(1), true)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(1), true)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"1:BOOL\" : true\n" @@ -121,19 +124,18 @@ void TestConverter_Boolean_True(nlTestSuite * inSuite, void * inContext) } // Signed Integer 42, 1-octet -void TestConverter_SignedInt_1BytePositive(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_SignedInt_1BytePositive) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(2), static_cast<int8_t>(42))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(2), static_cast<int8_t>(42))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"2:INT\" : 42\n" @@ -144,19 +146,18 @@ void TestConverter_SignedInt_1BytePositive(nlTestSuite * inSuite, void * inConte } // Signed Integer -17, 1-octet -void TestConverter_SignedInt_1ByteNegative(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_SignedInt_1ByteNegative) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(3), static_cast<int8_t>(-17))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(3), static_cast<int8_t>(-17))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"3:INT\" : -17\n" @@ -167,19 +168,18 @@ void TestConverter_SignedInt_1ByteNegative(nlTestSuite * inSuite, void * inConte } // Unsigned Integer 42, 1-octet -void TestConverter_UnsignedInt_1Byte(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_UnsignedInt_1Byte) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(4), static_cast<uint8_t>(42))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(4), static_cast<uint8_t>(42))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"value:4:UINT\" : 42\n" @@ -194,19 +194,18 @@ void TestConverter_UnsignedInt_1Byte(nlTestSuite * inSuite, void * inContext) } // Signed Integer 4242, 2-octet -void TestConverter_SignedInt_2Bytes(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_SignedInt_2Bytes) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(7), static_cast<int16_t>(4242))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(7), static_cast<int16_t>(4242))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"7:INT\" : 4242\n" @@ -217,19 +216,18 @@ void TestConverter_SignedInt_2Bytes(nlTestSuite * inSuite, void * inContext) } // Signed Integer -170000, 4-octet -void TestConverter_SignedInt_4Bytes(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_SignedInt_4Bytes) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(80), static_cast<int32_t>(-170000))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(80), static_cast<int32_t>(-170000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"80:INT\" : -170000\n" @@ -240,19 +238,18 @@ void TestConverter_SignedInt_4Bytes(nlTestSuite * inSuite, void * inContext) } // Signed Long Integer (int64_t) 40000000000, 8-octet -void TestConverter_SignedInt_8Bytes(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_SignedInt_8Bytes) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(202), static_cast<int64_t>(40000000000))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(202), static_cast<int64_t>(40000000000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"202:INT\" : \"40000000000\"\n" @@ -263,19 +260,18 @@ void TestConverter_SignedInt_8Bytes(nlTestSuite * inSuite, void * inContext) } // Unsigned Long Integer (uint64_t) 40000000000, 8-octet -void TestConverter_UnsignedInt_8Bytes(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_UnsignedInt_8Bytes) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(222), static_cast<uint64_t>(40000000000))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(222), static_cast<uint64_t>(40000000000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"222:UINT\" : \"40000000000\"\n" @@ -286,19 +282,18 @@ void TestConverter_UnsignedInt_8Bytes(nlTestSuite * inSuite, void * inContext) } // UTF-8 String, 1-octet length, "Hello!" -void TestConverter_UTF8String_Hello(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_UTF8String_Hello) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutString(TLV::ContextTag(0), "Hello!")); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutString(TLV::ContextTag(0), "Hello!")); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"0:STRING\" : \"Hello!\"\n" @@ -309,9 +304,8 @@ void TestConverter_UTF8String_Hello(nlTestSuite * inSuite, void * inContext) } // Octet String, 1-octet length, octets { 00 01 02 03 04 } -void TestConverter_OctetString(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_OctetString) { - gSuite = inSuite; uint8_t v[] = { 0, 1, 2, 3, 4 }; uint8_t buf[256]; @@ -319,10 +313,10 @@ void TestConverter_OctetString(nlTestSuite * inSuite, void * inContext) TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutBytes(TLV::ContextTag(1), v, sizeof(v))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutBytes(TLV::ContextTag(1), v, sizeof(v))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"1:BYTES\" : \"AAECAwQ=\"\n" @@ -333,19 +327,18 @@ void TestConverter_OctetString(nlTestSuite * inSuite, void * inContext) } // Octet String, empty -void TestConverter_OctetString_Empty(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_OctetString_Empty) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutBytes(TLV::ContextTag(1), nullptr, 0)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutBytes(TLV::ContextTag(1), nullptr, 0)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"1:BYTES\" : \"\"\n" @@ -356,19 +349,18 @@ void TestConverter_OctetString_Empty(nlTestSuite * inSuite, void * inContext) } // Null -void TestConverter_Null(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Null) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutNull(TLV::ContextTag(1))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutNull(TLV::ContextTag(1))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"1:NULL\" : null\n" @@ -379,19 +371,18 @@ void TestConverter_Null(nlTestSuite * inSuite, void * inContext) } // Single precision floating point 0.0 -void TestConverter_Float_0(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Float_0) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(1), static_cast<float>(0.0))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(1), static_cast<float>(0.0))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"1:FLOAT\" : 0.0\n" @@ -402,19 +393,18 @@ void TestConverter_Float_0(nlTestSuite * inSuite, void * inContext) } // Single precision floating point (1.0 / 3.0) -void TestConverter_Float_1third(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Float_1third) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(100), static_cast<float>(1.0 / 3.0))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(100), static_cast<float>(1.0 / 3.0))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"100:FLOAT\" : 0.33333334\n" @@ -428,19 +418,18 @@ void TestConverter_Float_1third(nlTestSuite * inSuite, void * inContext) } // Single precision floating point 17.9 -void TestConverter_Float_17_9(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Float_17_9) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(101), static_cast<float>(17.9))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(101), static_cast<float>(17.9))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"101:FLOAT\" : 17.9\n" @@ -454,19 +443,18 @@ void TestConverter_Float_17_9(nlTestSuite * inSuite, void * inContext) } // Single precision floating point positive infinity -void TestConverter_Float_PositiveInfinity(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Float_PositiveInfinity) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(101), std::numeric_limits<float>::infinity())); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(101), std::numeric_limits<float>::infinity())); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"101:FLOAT\" : \"Infinity\"\n" @@ -477,19 +465,18 @@ void TestConverter_Float_PositiveInfinity(nlTestSuite * inSuite, void * inContex } // Single precision floating point negative infinity -void TestConverter_Float_NegativeInfinity(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Float_NegativeInfinity) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(101), -std::numeric_limits<float>::infinity())); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(101), -std::numeric_limits<float>::infinity())); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"101:FLOAT\" : \"-Infinity\"\n" @@ -500,19 +487,18 @@ void TestConverter_Float_NegativeInfinity(nlTestSuite * inSuite, void * inContex } // Double precision floating point 0.0 -void TestConverter_Double_0(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Double_0) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(1), static_cast<double>(0.0))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(1), static_cast<double>(0.0))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"1:DOUBLE\" : 0.0\n" @@ -523,19 +509,18 @@ void TestConverter_Double_0(nlTestSuite * inSuite, void * inContext) } // Double precision floating point (1.0 / 3.0) -void TestConverter_Double_1third(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Double_1third) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(100), static_cast<double>(1.0 / 3.0))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(100), static_cast<double>(1.0 / 3.0))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"100:DOUBLE\" : 0.33333333333333331\n" @@ -546,19 +531,18 @@ void TestConverter_Double_1third(nlTestSuite * inSuite, void * inContext) } // Double precision floating point 17.9 -void TestConverter_Double_17_9(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Double_17_9) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(101), static_cast<double>(17.9))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(101), static_cast<double>(17.9))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"101:DOUBLE\" : 17.899999999999999\n" @@ -569,19 +553,18 @@ void TestConverter_Double_17_9(nlTestSuite * inSuite, void * inContext) } // Double precision floating point positive infinity -void TestConverter_Double_PositiveInfinity(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Double_PositiveInfinity) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(101), std::numeric_limits<double>::infinity())); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(101), std::numeric_limits<double>::infinity())); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"101:DOUBLE\" : \"Infinity\"\n" @@ -592,19 +575,18 @@ void TestConverter_Double_PositiveInfinity(nlTestSuite * inSuite, void * inConte } // Double precision floating point negative infinity -void TestConverter_Double_NegativeInfinity(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Double_NegativeInfinity) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(101), -std::numeric_limits<double>::infinity())); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(101), -std::numeric_limits<double>::infinity())); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"101:DOUBLE\" : \"-Infinity\"\n" @@ -615,18 +597,17 @@ void TestConverter_Double_NegativeInfinity(nlTestSuite * inSuite, void * inConte } // Empty Top-Level Structure, {} -void TestConverter_Structure_TopLevelEmpty(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Structure_TopLevelEmpty) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{ }"; @@ -635,9 +616,8 @@ void TestConverter_Structure_TopLevelEmpty(nlTestSuite * inSuite, void * inConte } // Empty Nested Structure, { {} } -void TestConverter_Structure_NestedEmpty(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Structure_NestedEmpty) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -645,11 +625,11 @@ void TestConverter_Structure_NestedEmpty(nlTestSuite * inSuite, void * inContext TLV::TLVType containerType2; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(1), TLV::kTLVType_Structure, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(1), TLV::kTLVType_Structure, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"1:STRUCT\" : { }\n" @@ -660,9 +640,8 @@ void TestConverter_Structure_NestedEmpty(nlTestSuite * inSuite, void * inContext } // Empty Array, { [] } -void TestConverter_Array_Empty(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Array_Empty) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -670,11 +649,11 @@ void TestConverter_Array_Empty(nlTestSuite * inSuite, void * inContext) TLV::TLVType containerType2; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(1), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(1), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"1:ARRAY-?\" : []\n" @@ -684,9 +663,8 @@ void TestConverter_Array_Empty(nlTestSuite * inSuite, void * inContext) CheckValidConversion(jsonString, tlvSpan, jsonString); } -void TestConverter_Array_Empty_ImplicitProfileTag2(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Array_Empty_ImplicitProfileTag2) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -697,13 +675,12 @@ void TestConverter_Array_Empty_ImplicitProfileTag2(nlTestSuite * inSuite, void * writer.Init(buf); writer.ImplicitProfileId = kImplicitProfileId; - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, - CHIP_NO_ERROR == - writer.StartContainer(TLV::ProfileTag(kImplicitProfileId, 10000), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, + writer.StartContainer(TLV::ProfileTag(kImplicitProfileId, 10000), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"emptyarray:10000:ARRAY-?\" : []\n" @@ -716,9 +693,8 @@ void TestConverter_Array_Empty_ImplicitProfileTag2(nlTestSuite * inSuite, void * CheckValidConversion(jsonString, tlvSpan, jsonExpected); } -void TestConverter_Array_Empty_ImplicitProfileTag4(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Array_Empty_ImplicitProfileTag4) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -729,14 +705,13 @@ void TestConverter_Array_Empty_ImplicitProfileTag4(nlTestSuite * inSuite, void * writer.Init(buf); writer.ImplicitProfileId = kImplicitProfileId; - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, - CHIP_NO_ERROR == - writer.StartContainer(TLV::ProfileTag((1000000 >> 16) & 0xFFFF, 0, 1000000 & 0xFFFF), TLV::kTLVType_Array, - containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ( + CHIP_NO_ERROR, + writer.StartContainer(TLV::ProfileTag((1000000 >> 16) & 0xFFFF, 0, 1000000 & 0xFFFF), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"1000000:ARRAY-?\" : []\n" @@ -747,20 +722,19 @@ void TestConverter_Array_Empty_ImplicitProfileTag4(nlTestSuite * inSuite, void * } // Two Signed Integers with context specific tags: {0 = 42, 1 = -17} -void TestConverter_IntsWithContextTags(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_IntsWithContextTags) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; TLV::TLVType containerType; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(0), static_cast<int8_t>(42))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(1), static_cast<int8_t>(-17))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(0), static_cast<int8_t>(42))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(1), static_cast<int8_t>(-17))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"0:INT\" : 42,\n" @@ -772,9 +746,8 @@ void TestConverter_IntsWithContextTags(nlTestSuite * inSuite, void * inContext) } // Structure with Two Signed Integers with context specific tags: { {0 = 42, 1 = -17} } -void TestConverter_Struct_IntsWithContextTags(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Struct_IntsWithContextTags) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -782,13 +755,13 @@ void TestConverter_Struct_IntsWithContextTags(nlTestSuite * inSuite, void * inCo TLV::TLVType containerType2; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Structure, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(0), static_cast<int8_t>(42))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(1), static_cast<int8_t>(-17))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Structure, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(0), static_cast<int8_t>(42))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(1), static_cast<int8_t>(-17))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"0:STRUCT\" : {\n" @@ -802,9 +775,8 @@ void TestConverter_Struct_IntsWithContextTags(nlTestSuite * inSuite, void * inCo } // Array of Signed Integers: { [0, 1, 2, 3, 4] } -void TestConverter_Array_Ints(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Array_Ints) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -812,16 +784,16 @@ void TestConverter_Array_Ints(nlTestSuite * inSuite, void * inContext) TLV::TLVType containerType2; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(0))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(1))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(2))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(3))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(4))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(0))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(1))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(2))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(3))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(4))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"0:ARRAY-INT\" : [\n" @@ -838,9 +810,8 @@ void TestConverter_Array_Ints(nlTestSuite * inSuite, void * inContext) } // Array of Long Signed Integers: { [42, -17, -170000, 40000000000] } -void TestConverter_Array_Ints2(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Array_Ints2) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -848,15 +819,15 @@ void TestConverter_Array_Ints2(nlTestSuite * inSuite, void * inContext) TLV::TLVType containerType2; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(42))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(-17))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(-170000))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(40000000000))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(42))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(-17))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(-170000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(40000000000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"0:ARRAY-INT\" : [\n" @@ -872,9 +843,8 @@ void TestConverter_Array_Ints2(nlTestSuite * inSuite, void * inContext) } // Array of Signed Integers with MIN/MAX values for each type int8_t/int16_t/int32_t/int64_t -void TestConverter_Array_IntsMinMax(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Array_IntsMinMax) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -882,19 +852,19 @@ void TestConverter_Array_IntsMinMax(nlTestSuite * inSuite, void * inContext) TLV::TLVType containerType2; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT8_MIN))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT8_MAX))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT16_MIN))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT16_MAX))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT32_MIN))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT32_MAX))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT64_MIN))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT64_MAX))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT8_MIN))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT8_MAX))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT16_MIN))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT16_MAX))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT32_MIN))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT32_MAX))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT64_MIN))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(INT64_MAX))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"0:ARRAY-INT\" : [\n" @@ -926,9 +896,8 @@ void TestConverter_Array_IntsMinMax(nlTestSuite * inSuite, void * inContext) } // Array of Long Unsigned Integers: { [42, 170000, 40000000000] } -void TestConverter_Array_UInts(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Array_UInts) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -936,14 +905,14 @@ void TestConverter_Array_UInts(nlTestSuite * inSuite, void * inContext) TLV::TLVType containerType2; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<uint64_t>(42))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<uint64_t>(170000))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<uint64_t>(40000000000))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<uint64_t>(42))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<uint64_t>(170000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<uint64_t>(40000000000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"0:ARRAY-UINT\" : [\n" @@ -959,9 +928,8 @@ void TestConverter_Array_UInts(nlTestSuite * inSuite, void * inContext) // Array of Unsigned Integers, where each element represents MAX possible value for unsigned // integere types uint8_t, uint16_t, uint32_t, uint64_t: [0xFF, 0xFFFF, 0xFFFFFFFF, 0xFFFFFFFF_FFFFFFFF] -void TestConverter_Array_UIntsMax(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Array_UIntsMax) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -969,15 +937,15 @@ void TestConverter_Array_UIntsMax(nlTestSuite * inSuite, void * inContext) TLV::TLVType containerType2; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<uint8_t>(UINT8_MAX))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<uint16_t>(UINT16_MAX))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<uint32_t>(UINT32_MAX))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<uint64_t>(UINT64_MAX))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<uint8_t>(UINT8_MAX))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<uint16_t>(UINT16_MAX))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<uint32_t>(UINT32_MAX))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<uint64_t>(UINT64_MAX))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"0:ARRAY-UINT\" : [\n" @@ -1001,9 +969,8 @@ void TestConverter_Array_UIntsMax(nlTestSuite * inSuite, void * inContext) } // Array of Doubles: { [1.1, 134.2763, -12345.87] } -void TestConverter_Array_Doubles(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Array_Doubles) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -1011,14 +978,14 @@ void TestConverter_Array_Doubles(nlTestSuite * inSuite, void * inContext) TLV::TLVType containerType2; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<double>(1.1))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<double>(134.2763))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<double>(-12345.87))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<double>(1.1))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<double>(134.2763))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<double>(-12345.87))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"0:ARRAY-DOUBLE\" : [\n" @@ -1040,9 +1007,8 @@ void TestConverter_Array_Doubles(nlTestSuite * inSuite, void * inContext) } // Array of Floats: { [1.1, 134.2763, -12345.87] } -void TestConverter_Array_Floats(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Array_Floats) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -1052,16 +1018,14 @@ void TestConverter_Array_Floats(nlTestSuite * inSuite, void * inContext) writer.Init(buf); writer.ImplicitProfileId = kImplicitProfileId; - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, - CHIP_NO_ERROR == - writer.StartContainer(TLV::ProfileTag(kImplicitProfileId, 1000), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<float>(1.1))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<float>(134.2763))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<float>(-12345.87))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ProfileTag(kImplicitProfileId, 1000), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<float>(1.1))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<float>(134.2763))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<float>(-12345.87))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"1000:ARRAY-FLOAT\" : [\n" @@ -1083,9 +1047,8 @@ void TestConverter_Array_Floats(nlTestSuite * inSuite, void * inContext) } // Array of Strings: ["ABC", "Options", "more"] -void TestConverter_Array_Strings(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Array_Strings) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -1095,17 +1058,16 @@ void TestConverter_Array_Strings(nlTestSuite * inSuite, void * inContext) writer.Init(buf); writer.ImplicitProfileId = kImplicitProfileId; - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, - CHIP_NO_ERROR == - writer.StartContainer(TLV::ProfileTag((100000 >> 16) & 0xFFFF, 0, 100000 & 0xFFFF), TLV::kTLVType_Array, - containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutString(TLV::AnonymousTag(), "ABC")); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutString(TLV::AnonymousTag(), "Options")); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutString(TLV::AnonymousTag(), "more")); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ( + CHIP_NO_ERROR, + writer.StartContainer(TLV::ProfileTag((100000 >> 16) & 0xFFFF, 0, 100000 & 0xFFFF), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutString(TLV::AnonymousTag(), "ABC")); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutString(TLV::AnonymousTag(), "Options")); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutString(TLV::AnonymousTag(), "more")); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"100000:ARRAY-STRING\" : [\n" @@ -1120,9 +1082,8 @@ void TestConverter_Array_Strings(nlTestSuite * inSuite, void * inContext) } // Array of Booleans: [true, false, false] -void TestConverter_Array_Booleans(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Array_Booleans) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -1130,14 +1091,14 @@ void TestConverter_Array_Booleans(nlTestSuite * inSuite, void * inContext) TLV::TLVType containerType2; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(255), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), true)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), false)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), false)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(255), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), true)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), false)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), false)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"255:ARRAY-BOOL\" : [\n" @@ -1152,9 +1113,8 @@ void TestConverter_Array_Booleans(nlTestSuite * inSuite, void * inContext) } // Array of Nulls: [null, null] -void TestConverter_Array_Nulls(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Array_Nulls) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -1162,13 +1122,13 @@ void TestConverter_Array_Nulls(nlTestSuite * inSuite, void * inContext) TLV::TLVType containerType2; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(1), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutNull(TLV::AnonymousTag())); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutNull(TLV::AnonymousTag())); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(1), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutNull(TLV::AnonymousTag())); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutNull(TLV::AnonymousTag())); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"1:ARRAY-NULL\" : [\n" @@ -1182,9 +1142,8 @@ void TestConverter_Array_Nulls(nlTestSuite * inSuite, void * inContext) } // Context tag 255 (max), Unsigned Integer, 1-octet value: {255 = 42U} -void TestConverter_Struct_UInt(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Struct_UInt) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -1192,12 +1151,12 @@ void TestConverter_Struct_UInt(nlTestSuite * inSuite, void * inContext) TLV::TLVType containerType2; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Structure, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(255), static_cast<uint8_t>(42))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Structure, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(255), static_cast<uint8_t>(42))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"value:0:STRUCT\" : {\n" @@ -1216,9 +1175,8 @@ void TestConverter_Struct_UInt(nlTestSuite * inSuite, void * inContext) // Context and Common Profile tags, Unsigned Integer structure: {255 = 42, 256 = 17000, 65535 = // 1, 65536 = 345678, 4294967295 = 500000000000} -void TestConverter_Struct_MixedTags(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Struct_MixedTags) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -1228,16 +1186,16 @@ void TestConverter_Struct_MixedTags(nlTestSuite * inSuite, void * inContext) writer.Init(buf); writer.ImplicitProfileId = kImplicitProfileId; - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Structure, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(255), static_cast<uint64_t>(42))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ProfileTag(0x0001u, 0, 0), static_cast<uint64_t>(345678))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ProfileTag(kImplicitProfileId, 256), static_cast<uint64_t>(17000))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ProfileTag(0xFFFFu, 0, 0xFFFFu), static_cast<uint64_t>(500000000000))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ProfileTag(kImplicitProfileId, 65535), static_cast<uint64_t>(1))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Structure, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(255), static_cast<uint64_t>(42))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ProfileTag(0x0001u, 0, 0), static_cast<uint64_t>(345678))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ProfileTag(kImplicitProfileId, 256), static_cast<uint64_t>(17000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ProfileTag(0xFFFFu, 0, 0xFFFFu), static_cast<uint64_t>(500000000000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ProfileTag(kImplicitProfileId, 65535), static_cast<uint64_t>(1))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"0:STRUCT\" : {\n" @@ -1254,9 +1212,8 @@ void TestConverter_Struct_MixedTags(nlTestSuite * inSuite, void * inContext) } // Structure with mixed elements -void TestConverter_Struct_MixedElements(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Struct_MixedElements) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -1265,22 +1222,20 @@ void TestConverter_Struct_MixedElements(nlTestSuite * inSuite, void * inContext) char bytes[] = "Test ByteString Value"; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Structure, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(0), static_cast<int64_t>(20))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(1), true)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(2), static_cast<uint64_t>(0))); - NL_TEST_ASSERT( - gSuite, - CHIP_NO_ERROR == - writer.PutBytes(TLV::ContextTag(3), reinterpret_cast<uint8_t *>(bytes), static_cast<uint32_t>(strlen(bytes)))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutString(TLV::ContextTag(4), "hello")); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(5), static_cast<int64_t>(-500000))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(6), static_cast<double>(17.9))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(7), static_cast<float>(17.9))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Structure, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(0), static_cast<int64_t>(20))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(1), true)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(2), static_cast<uint64_t>(0))); + EXPECT_EQ(CHIP_NO_ERROR, + writer.PutBytes(TLV::ContextTag(3), reinterpret_cast<uint8_t *>(bytes), static_cast<uint32_t>(strlen(bytes)))); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutString(TLV::ContextTag(4), "hello")); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(5), static_cast<int64_t>(-500000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(6), static_cast<double>(17.9))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(7), static_cast<float>(17.9))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"c:0:STRUCT\" : {\n" @@ -1312,9 +1267,8 @@ void TestConverter_Struct_MixedElements(nlTestSuite * inSuite, void * inContext) } // Array of structures with mixed elements -void TestConverter_Array_Structures(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Array_Structures) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -1327,39 +1281,33 @@ void TestConverter_Array_Structures(nlTestSuite * inSuite, void * inContext) writer.Init(buf); writer.ImplicitProfileId = kImplicitProfileId; - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, - CHIP_NO_ERROR == - writer.StartContainer(TLV::ProfileTag(kImplicitProfileId, 1000), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType3)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(0), static_cast<int64_t>(20))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(1), true)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(2), static_cast<uint64_t>(0))); - NL_TEST_ASSERT( - gSuite, - CHIP_NO_ERROR == - writer.PutBytes(TLV::ContextTag(3), reinterpret_cast<uint8_t *>(bytes1), static_cast<uint32_t>(strlen(bytes1)))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutString(TLV::ContextTag(4), "hello1")); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(5), static_cast<int64_t>(-500000))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(6), static_cast<double>(17.9))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(7), static_cast<float>(17.9))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType3)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType3)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(0), static_cast<int64_t>(-10))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(1), false)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(2), static_cast<uint64_t>(128))); - NL_TEST_ASSERT( - gSuite, - CHIP_NO_ERROR == - writer.PutBytes(TLV::ContextTag(3), reinterpret_cast<uint8_t *>(bytes2), static_cast<uint32_t>(strlen(bytes2)))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutString(TLV::ContextTag(4), "hello2")); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(5), static_cast<int64_t>(40000000000))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(6), static_cast<double>(-1754.923))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(7), static_cast<float>(97.945))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType3)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ProfileTag(kImplicitProfileId, 1000), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType3)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(0), static_cast<int64_t>(20))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(1), true)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(2), static_cast<uint64_t>(0))); + EXPECT_EQ(CHIP_NO_ERROR, + writer.PutBytes(TLV::ContextTag(3), reinterpret_cast<uint8_t *>(bytes1), static_cast<uint32_t>(strlen(bytes1)))); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutString(TLV::ContextTag(4), "hello1")); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(5), static_cast<int64_t>(-500000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(6), static_cast<double>(17.9))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(7), static_cast<float>(17.9))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType3)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType3)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(0), static_cast<int64_t>(-10))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(1), false)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(2), static_cast<uint64_t>(128))); + EXPECT_EQ(CHIP_NO_ERROR, + writer.PutBytes(TLV::ContextTag(3), reinterpret_cast<uint8_t *>(bytes2), static_cast<uint32_t>(strlen(bytes2)))); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutString(TLV::ContextTag(4), "hello2")); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(5), static_cast<int64_t>(40000000000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(6), static_cast<double>(-1754.923))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(7), static_cast<float>(97.945))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType3)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"1000:ARRAY-STRUCT\": [\n" @@ -1415,9 +1363,8 @@ void TestConverter_Array_Structures(nlTestSuite * inSuite, void * inContext) } // Top level with mixed elements -void TestConverter_TopLevel_MixedElements(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_TopLevel_MixedElements) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -1427,39 +1374,37 @@ void TestConverter_TopLevel_MixedElements(nlTestSuite * inSuite, void * inContex char bytes[] = "Test array member 0"; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(0), static_cast<int64_t>(42))); - NL_TEST_ASSERT( - gSuite, - CHIP_NO_ERROR == - writer.PutBytes(TLV::ContextTag(1), reinterpret_cast<uint8_t *>(bytes), static_cast<uint32_t>(strlen(bytes)))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(2), static_cast<double>(156.398))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(3), static_cast<uint64_t>(73709551615))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(4), true)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutNull(TLV::ContextTag(5))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(6), TLV::kTLVType_Structure, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutString(TLV::ContextTag(1), "John")); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(2), static_cast<uint64_t>(34))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(3), true)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(4), TLV::kTLVType_Array, containerType3)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(5))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(9))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(10))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType3)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(5), TLV::kTLVType_Array, containerType3)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutString(TLV::AnonymousTag(), "Ammy")); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutString(TLV::AnonymousTag(), "David")); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutString(TLV::AnonymousTag(), "Larry")); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType3)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(6), TLV::kTLVType_Array, containerType3)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), true)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), false)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), true)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType3)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(7), static_cast<float>(0.0))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(0), static_cast<int64_t>(42))); + EXPECT_EQ(CHIP_NO_ERROR, + writer.PutBytes(TLV::ContextTag(1), reinterpret_cast<uint8_t *>(bytes), static_cast<uint32_t>(strlen(bytes)))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(2), static_cast<double>(156.398))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(3), static_cast<uint64_t>(73709551615))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(4), true)); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutNull(TLV::ContextTag(5))); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(6), TLV::kTLVType_Structure, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutString(TLV::ContextTag(1), "John")); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(2), static_cast<uint64_t>(34))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(3), true)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(4), TLV::kTLVType_Array, containerType3)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(5))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(9))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(10))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType3)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(5), TLV::kTLVType_Array, containerType3)); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutString(TLV::AnonymousTag(), "Ammy")); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutString(TLV::AnonymousTag(), "David")); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutString(TLV::AnonymousTag(), "Larry")); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType3)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(6), TLV::kTLVType_Array, containerType3)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), true)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), false)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), true)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType3)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(7), static_cast<float>(0.0))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"value:0:INT\": 42,\n" @@ -1525,9 +1470,8 @@ void TestConverter_TopLevel_MixedElements(nlTestSuite * inSuite, void * inContex } // Complex Structure from README -void TestConverter_Structure_FromReadme(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Structure_FromReadme) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -1540,53 +1484,51 @@ void TestConverter_Structure_FromReadme(nlTestSuite * inSuite, void * inContext) char bytes4[] = "Test Bytes"; writer.Init(buf); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType3)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(0), static_cast<int8_t>(8))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(1), true)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType3)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(1), TLV::kTLVType_Structure, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(0), static_cast<int8_t>(12))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(1), false)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutString(TLV::ContextTag(2), "example")); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(2), static_cast<int64_t>(40000000000))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(3), true)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(4), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(5), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<double>(1.1))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<double>(134.2763))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<double>(-12345.87))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), std::numeric_limits<double>::infinity())); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<double>(62534))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<double>(-62534))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(6), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutBytes(TLV::AnonymousTag(), bytes1, static_cast<uint32_t>(sizeof(bytes1)))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutBytes(TLV::AnonymousTag(), bytes2, static_cast<uint32_t>(sizeof(bytes2)))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutBytes(TLV::AnonymousTag(), bytes3, static_cast<uint32_t>(sizeof(bytes3)))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT( - gSuite, - CHIP_NO_ERROR == - writer.PutBytes(TLV::ContextTag(7), reinterpret_cast<uint8_t *>(bytes4), static_cast<uint32_t>(strlen(bytes4)))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(8), static_cast<double>(17.9))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(9), static_cast<float>(17.9))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(10), -std::numeric_limits<float>::infinity())); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(11), TLV::kTLVType_Structure, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.PutString(TLV::ContextTag(1), "John")); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(2), static_cast<uint32_t>(34))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(3), true)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(4), TLV::kTLVType_Array, containerType3)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(5))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(9))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(10))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType3)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType3)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(0), static_cast<int8_t>(8))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(1), true)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType3)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(1), TLV::kTLVType_Structure, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(0), static_cast<int8_t>(12))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(1), false)); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutString(TLV::ContextTag(2), "example")); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(2), static_cast<int64_t>(40000000000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(3), true)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(4), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(5), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<double>(1.1))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<double>(134.2763))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<double>(-12345.87))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), std::numeric_limits<double>::infinity())); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<double>(62534))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<double>(-62534))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(6), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutBytes(TLV::AnonymousTag(), bytes1, static_cast<uint32_t>(sizeof(bytes1)))); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutBytes(TLV::AnonymousTag(), bytes2, static_cast<uint32_t>(sizeof(bytes2)))); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutBytes(TLV::AnonymousTag(), bytes3, static_cast<uint32_t>(sizeof(bytes3)))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, + writer.PutBytes(TLV::ContextTag(7), reinterpret_cast<uint8_t *>(bytes4), static_cast<uint32_t>(strlen(bytes4)))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(8), static_cast<double>(17.9))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(9), static_cast<float>(17.9))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(10), -std::numeric_limits<float>::infinity())); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(11), TLV::kTLVType_Structure, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.PutString(TLV::ContextTag(1), "John")); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(2), static_cast<uint32_t>(34))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(3), true)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(4), TLV::kTLVType_Array, containerType3)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(5))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(9))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int8_t>(10))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType3)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); std::string jsonString = "{\n" " \"0:ARRAY-STRUCT\" : [\n" @@ -1679,7 +1621,7 @@ void TestConverter_Structure_FromReadme(nlTestSuite * inSuite, void * inContext) CheckValidConversion(jsonString, tlvSpan, jsonExpected); } -void TestConverter_TlvToJson_ErrorCases(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_TlvToJson_ErrorCases) { CHIP_ERROR err; TLV::TLVWriter writer; @@ -1695,48 +1637,48 @@ void TestConverter_TlvToJson_ErrorCases(nlTestSuite * inSuite, void * inContext) uint8_t buf1[32]; writer.Init(buf1); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::CommonTag(1), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(1), true)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::CommonTag(1), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(1), true)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); ByteSpan topLevelStructWithTag(buf1, writer.GetLengthWritten()); uint8_t buf2[32]; writer.Init(buf2); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Array, containerType)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), true)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Array, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), true)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); ByteSpan topLevelIsArray(buf2, writer.GetLengthWritten()); uint8_t buf3[32]; writer.Init(buf3); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(1), TLV::kTLVType_List, containerType2)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.Put(TLV::ContextTag(1), true)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(1), TLV::kTLVType_List, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ContextTag(1), true)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); ByteSpan usingList(buf3, writer.GetLengthWritten()); uint8_t buf8[32]; writer.Init(buf8); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(1), TLV::kTLVType_Array, containerType2)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<uint64_t>(42))); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(-170000))); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.Put(TLV::AnonymousTag(), static_cast<uint64_t>(42456))); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(1), TLV::kTLVType_Array, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<uint64_t>(42))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<int64_t>(-170000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::AnonymousTag(), static_cast<uint64_t>(42456))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); ByteSpan arrayWithMixedElements(buf8, writer.GetLengthWritten()); uint8_t buf9[32]; writer.Init(buf9); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.Put(TLV::ProfileTag(0xFEED, 234), static_cast<uint64_t>(42))); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(inSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ProfileTag(0xFEED, 234), static_cast<uint64_t>(42))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); ByteSpan useFullyQualifiedTag(buf9, writer.GetLengthWritten()); // clang-format off @@ -1755,11 +1697,11 @@ void TestConverter_TlvToJson_ErrorCases(nlTestSuite * inSuite, void * inContext) { std::string jsonString; err = TlvToJson(testCase.nEncodedTlv, jsonString); - NL_TEST_ASSERT(inSuite, err == testCase.mExpectedResult); + EXPECT_EQ(err, testCase.mExpectedResult); } } -void TestConverter_JsonToTlv_ErrorCases(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_JsonToTlv_ErrorCases) { CHIP_ERROR err; @@ -1873,7 +1815,7 @@ void TestConverter_JsonToTlv_ErrorCases(nlTestSuite * inSuite, void * inContext) uint8_t buf[256]; MutableByteSpan tlvSpan(buf); err = JsonToTlv(testCase.mJsonString, tlvSpan); - NL_TEST_ASSERT(inSuite, err == testCase.mExpectedResult); + EXPECT_EQ(err, testCase.mExpectedResult); #if CHIP_CONFIG_ERROR_FORMAT_AS_STRING if (err != testCase.mExpectedResult) { @@ -1888,9 +1830,8 @@ void TestConverter_JsonToTlv_ErrorCases(nlTestSuite * inSuite, void * inContext) } // Full Qualified Profile tags, Unsigned Integer structure: {65536 = 42, 4294901760 = 17000, 4294967295 = 500000000000} -void TestConverter_Struct_MEITags(nlTestSuite * inSuite, void * inContext) +TEST_F(TestJsonToTlvToJson, TestConverter_Struct_MEITags) { - gSuite = inSuite; uint8_t buf[256]; TLV::TLVWriter writer; @@ -1900,14 +1841,14 @@ void TestConverter_Struct_MEITags(nlTestSuite * inSuite, void * inContext) writer.Init(buf); writer.ImplicitProfileId = kImplicitProfileId; - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Structure, containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ProfileTag(0xFFFFu, 0, 0), static_cast<uint64_t>(17000))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ProfileTag(0x0001u, 0, 0), static_cast<uint64_t>(42))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Put(TLV::ProfileTag(0xFFFFu, 0, 0xFFFFu), static_cast<uint64_t>(500000000000))); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType2)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.EndContainer(containerType)); - NL_TEST_ASSERT(gSuite, CHIP_NO_ERROR == writer.Finalize()); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.StartContainer(TLV::ContextTag(0), TLV::kTLVType_Structure, containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ProfileTag(0xFFFFu, 0, 0), static_cast<uint64_t>(17000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ProfileTag(0x0001u, 0, 0), static_cast<uint64_t>(42))); + EXPECT_EQ(CHIP_NO_ERROR, writer.Put(TLV::ProfileTag(0xFFFFu, 0, 0xFFFFu), static_cast<uint64_t>(500000000000))); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType2)); + EXPECT_EQ(CHIP_NO_ERROR, writer.EndContainer(containerType)); + EXPECT_EQ(CHIP_NO_ERROR, writer.Finalize()); std::string jsonString = "{\n" " \"0:STRUCT\" : {\n" @@ -1920,84 +1861,4 @@ void TestConverter_Struct_MEITags(nlTestSuite * inSuite, void * inContext) ByteSpan tlvSpan(buf, writer.GetLengthWritten()); CheckValidConversion(jsonString, tlvSpan, jsonString); } - -int Initialize(void * apSuite) -{ - VerifyOrReturnError(chip::Platform::MemoryInit() == CHIP_NO_ERROR, FAILURE); - return SUCCESS; -} - -int Finalize(void * aContext) -{ - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - -const nlTest sTests[] = { - NL_TEST_DEF("Test Json Tlv Converter - Boolean True", TestConverter_Boolean_True), - NL_TEST_DEF("Test Json Tlv Converter - Signed Integer 1-Byte Positive", TestConverter_SignedInt_1BytePositive), - NL_TEST_DEF("Test Json Tlv Converter - Signed Integer 1-Byte Negative", TestConverter_SignedInt_1ByteNegative), - NL_TEST_DEF("Test Json Tlv Converter - Unsigned Integer 1-Byte", TestConverter_UnsignedInt_1Byte), - NL_TEST_DEF("Test Json Tlv Converter - Signed Integer 2-Bytes", TestConverter_SignedInt_2Bytes), - NL_TEST_DEF("Test Json Tlv Converter - Signed Integer 4-Bytes", TestConverter_SignedInt_4Bytes), - NL_TEST_DEF("Test Json Tlv Converter - Signed Integer 8-Bytes", TestConverter_SignedInt_8Bytes), - NL_TEST_DEF("Test Json Tlv Converter - Unsigned Integer 8-Bytes", TestConverter_UnsignedInt_8Bytes), - NL_TEST_DEF("Test Json Tlv Converter - UTF-8 String Hello!", TestConverter_UTF8String_Hello), - NL_TEST_DEF("Test Json Tlv Converter - Octet String", TestConverter_OctetString), - NL_TEST_DEF("Test Json Tlv Converter - Empty Octet String", TestConverter_OctetString_Empty), - NL_TEST_DEF("Test Json Tlv Converter - Null", TestConverter_Null), - NL_TEST_DEF("Test Json Tlv Converter - Floating Point Single Precision 0.0", TestConverter_Float_0), - NL_TEST_DEF("Test Json Tlv Converter - Floating Point Single Precision 1/3", TestConverter_Float_1third), - NL_TEST_DEF("Test Json Tlv Converter - Floating Point Single Precision 17.9", TestConverter_Float_17_9), - NL_TEST_DEF("Test Json Tlv Converter - Floating Point Single Precision Positive Infinity", - TestConverter_Float_PositiveInfinity), - NL_TEST_DEF("Test Json Tlv Converter - Floating Point Single Precision Negative Infinity", - TestConverter_Float_NegativeInfinity), - NL_TEST_DEF("Test Json Tlv Converter - Floating Point Double Precision 0.0", TestConverter_Double_0), - NL_TEST_DEF("Test Json Tlv Converter - Floating Point Double Precision 1/3", TestConverter_Double_1third), - NL_TEST_DEF("Test Json Tlv Converter - Floating Point Double Precision 17.9", TestConverter_Double_17_9), - NL_TEST_DEF("Test Json Tlv Converter - Floating Point Double Precision Positive Infinity", - TestConverter_Double_PositiveInfinity), - NL_TEST_DEF("Test Json Tlv Converter - Floating Point Double Precision Negative Infinity", - TestConverter_Double_NegativeInfinity), - NL_TEST_DEF("Test Json Tlv Converter - Structure Top-Level Empty", TestConverter_Structure_TopLevelEmpty), - NL_TEST_DEF("Test Json Tlv Converter - Structure Nested Empty", TestConverter_Structure_NestedEmpty), - NL_TEST_DEF("Test Json Tlv Converter - Array Empty", TestConverter_Array_Empty), - NL_TEST_DEF("Test Json Tlv Converter - Array Empty with Implicit Profile Tag (length 2)", - TestConverter_Array_Empty_ImplicitProfileTag2), - NL_TEST_DEF("Test Json Tlv Converter - Array Empty with Implicit Profile Tag (length 4)", - TestConverter_Array_Empty_ImplicitProfileTag4), - NL_TEST_DEF("Test Json Tlv Converter - Two Signed Integers", TestConverter_IntsWithContextTags), - NL_TEST_DEF("Test Json Tlv Converter - Structure With Two Signed Integers", TestConverter_Struct_IntsWithContextTags), - NL_TEST_DEF("Test Json Tlv Converter - Array Of Signed Integers", TestConverter_Array_Ints), - NL_TEST_DEF("Test Json Tlv Converter - Array Of Long Signed Integers", TestConverter_Array_Ints2), - NL_TEST_DEF("Test Json Tlv Converter - Array Of Min/Max Signed Integers", TestConverter_Array_IntsMinMax), - NL_TEST_DEF("Test Json Tlv Converter - Array Of Long Unsigned Integers", TestConverter_Array_UInts), - NL_TEST_DEF("Test Json Tlv Converter - Array of Unsigned Integers with Max values", TestConverter_Array_UIntsMax), - NL_TEST_DEF("Test Json Tlv Converter - Array Of Doubles", TestConverter_Array_Doubles), - NL_TEST_DEF("Test Json Tlv Converter - Array Of Floats", TestConverter_Array_Floats), - NL_TEST_DEF("Test Json Tlv Converter - Array Of Strings", TestConverter_Array_Strings), - NL_TEST_DEF("Test Json Tlv Converter - Array Of Booleans", TestConverter_Array_Booleans), - NL_TEST_DEF("Test Json Tlv Converter - Array Of Nulls", TestConverter_Array_Nulls), - NL_TEST_DEF("Test Json Tlv Converter - Structure with Unsigned Integer", TestConverter_Struct_UInt), - NL_TEST_DEF("Test Json Tlv Converter - Structure Elements with Mixed Tags", TestConverter_Struct_MixedTags), - NL_TEST_DEF("Test Json Tlv Converter - Structure with Mixed Elements", TestConverter_Struct_MixedElements), - NL_TEST_DEF("Test Json Tlv Converter - Array of Structures with Mixed Elements", TestConverter_Array_Structures), - NL_TEST_DEF("Test Json Tlv Converter - Top-Level Structure with Mixed Elements", TestConverter_TopLevel_MixedElements), - NL_TEST_DEF("Test Json Tlv Converter - Complex Structure from the README File", TestConverter_Structure_FromReadme), - NL_TEST_DEF("Test Json Tlv Converter - Tlv to Json Error Cases", TestConverter_TlvToJson_ErrorCases), - NL_TEST_DEF("Test Json Tlv Converter - Json To Tlv Error Cases", TestConverter_JsonToTlv_ErrorCases), - NL_TEST_DEF("Test Json Tlv Converter - Structure with MEI Elements", TestConverter_Struct_MEITags), - NL_TEST_SENTINEL() -}; - } // namespace - -int TestJsonToTlvToJson() -{ - nlTestSuite theSuite = { "JsonToTlvToJson", sTests, Initialize, Finalize }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestJsonToTlvToJson) diff --git a/src/lib/support/tests/TestTlvJson.cpp b/src/lib/support/tests/TestTlvJson.cpp index 9d9a91e243a3c1..83b538dad4a755 100644 --- a/src/lib/support/tests/TestTlvJson.cpp +++ b/src/lib/support/tests/TestTlvJson.cpp @@ -15,12 +15,12 @@ * limitations under the License. */ +#include <gtest/gtest.h> + #include <app-common/zap-generated/cluster-objects.h> #include <app/data-model/Decode.h> #include <app/data-model/Encode.h> -#include <lib/support/UnitTestRegistration.h> #include <lib/support/jsontlv/TlvJson.h> -#include <nlunit-test.h> #include <system/SystemPacketBuffer.h> #include <system/TLVPacketBufferBackingStore.h> @@ -33,7 +33,17 @@ using namespace chip::app; System::TLVPacketBufferBackingStore gStore; TLV::TLVWriter gWriter; TLV::TLVReader gReader; -nlTestSuite * gSuite; + +class TestTlvJson : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() + { + (void) gStore.Release(); + chip::Platform::MemoryShutdown(); + } +}; void SetupBuf() { @@ -88,25 +98,24 @@ void EncodeAndValidate(T val, const char * expectedJsonString) SetupBuf(); err = DataModel::Encode(gWriter, TLV::AnonymousTag(), val); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = gWriter.Finalize(); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = SetupReader(); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); Json::Value d; err = TlvToJson(gReader, d); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); bool matches = Matches(expectedJsonString, d); - NL_TEST_ASSERT(gSuite, matches); + EXPECT_TRUE(matches); } -void TestConverter(nlTestSuite * inSuite, void * inContext) +TEST_F(TestTlvJson, TestConverter) { - gSuite = inSuite; EncodeAndValidate(static_cast<uint32_t>(30), "{\n" @@ -231,28 +240,4 @@ void TestConverter(nlTestSuite * inSuite, void * inContext) "}\n"); } -int Initialize(void * apSuite) -{ - VerifyOrReturnError(chip::Platform::MemoryInit() == CHIP_NO_ERROR, FAILURE); - return SUCCESS; -} - -int Finalize(void * aContext) -{ - (void) gStore.Release(); - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - -const nlTest sTests[] = { NL_TEST_DEF("TestConverter", TestConverter), NL_TEST_SENTINEL() }; - } // namespace - -int TestTlvJson() -{ - nlTestSuite theSuite = { "TlvJson", sTests, Initialize, Finalize }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestTlvJson) diff --git a/src/lib/support/tests/TestTlvToJson.cpp b/src/lib/support/tests/TestTlvToJson.cpp index 1467744ba0478e..b313b843616671 100644 --- a/src/lib/support/tests/TestTlvToJson.cpp +++ b/src/lib/support/tests/TestTlvToJson.cpp @@ -15,18 +15,18 @@ * limitations under the License. */ +#include <string> + +#include <gtest/gtest.h> + #include <app-common/zap-generated/cluster-objects.h> #include <app/data-model/Decode.h> #include <app/data-model/Encode.h> -#include <lib/support/UnitTestRegistration.h> #include <lib/support/jsontlv/TextFormat.h> #include <lib/support/jsontlv/TlvToJson.h> -#include <nlunit-test.h> #include <system/SystemPacketBuffer.h> #include <system/TLVPacketBufferBackingStore.h> -#include <string> - namespace { using namespace chip::Encoding; @@ -36,7 +36,17 @@ using namespace chip::app; System::TLVPacketBufferBackingStore gStore; TLV::TLVWriter gWriter; TLV::TLVReader gReader; -nlTestSuite * gSuite; + +class TestTlvToJson : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() + { + (void) gStore.Release(); + chip::Platform::MemoryShutdown(); + } +}; void SetupBuf() { @@ -84,34 +94,32 @@ void EncodeAndValidate(T val, const std::string & expectedJsonString) SetupBuf(); err = gWriter.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, container); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = DataModel::Encode(gWriter, TLV::ContextTag(1), val); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = gWriter.EndContainer(container); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = gWriter.Finalize(); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); err = SetupReader(); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); std::string jsonString; err = TlvToJson(gReader, jsonString); - NL_TEST_ASSERT(gSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); bool matches = Matches(expectedJsonString, jsonString); - NL_TEST_ASSERT(gSuite, matches); + EXPECT_TRUE(matches); } -void TestConverter(nlTestSuite * inSuite, void * inContext) +TEST_F(TestTlvToJson, TestConverter) { std::string jsonString; - gSuite = inSuite; - jsonString = "{\n" " \"1:UINT\" : 30\n" "}\n"; @@ -236,28 +244,4 @@ void TestConverter(nlTestSuite * inSuite, void * inContext) EncodeAndValidate(structList, jsonString); } -int Initialize(void * apSuite) -{ - VerifyOrReturnError(chip::Platform::MemoryInit() == CHIP_NO_ERROR, FAILURE); - return SUCCESS; -} - -int Finalize(void * aContext) -{ - (void) gStore.Release(); - chip::Platform::MemoryShutdown(); - return SUCCESS; -} - -const nlTest sTests[] = { NL_TEST_DEF("TestConverter", TestConverter), NL_TEST_SENTINEL() }; - } // namespace - -int TestTlvToJson() -{ - nlTestSuite theSuite = { "TlvToJson", sTests, Initialize, Finalize }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestTlvToJson) diff --git a/src/lib/support/tests/TestZclString.cpp b/src/lib/support/tests/TestZclString.cpp index 3110c66ce4894e..13174248af62d7 100644 --- a/src/lib/support/tests/TestZclString.cpp +++ b/src/lib/support/tests/TestZclString.cpp @@ -26,18 +26,24 @@ #include <stdlib.h> #include <string.h> +#include <gtest/gtest.h> + #include <lib/support/CHIPMem.h> #include <lib/support/CodeUtils.h> #include <lib/support/ScopedBuffer.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> - #include <lib/support/ZclString.h> using namespace chip; using namespace chip::Logging; using namespace chip::Platform; +class TestZclString : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + bool allCharactersSame(uint8_t zclString[]) { int n = zclString[0]; @@ -48,132 +54,88 @@ bool allCharactersSame(uint8_t zclString[]) return true; } -static void TestZclStringWhenBufferIsZero(nlTestSuite * inSuite, void * inContext) +TEST_F(TestZclString, TestZclStringWhenBufferIsZero) { uint8_t bufferMemory[1]; MutableByteSpan zclString(bufferMemory); chip::Platform::ScopedMemoryBuffer<char> cString1; - NL_TEST_ASSERT(inSuite, cString1.Calloc(1024)); + EXPECT_TRUE(cString1.Calloc(1024)); memset(cString1.Get(), 'A', 1); CHIP_ERROR err = MakeZclCharString(zclString, cString1.Get()); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INBOUND_MESSAGE_TOO_BIG); - NL_TEST_ASSERT(inSuite, zclString.data()[0] == 0); + EXPECT_EQ(err, CHIP_ERROR_INBOUND_MESSAGE_TOO_BIG); + EXPECT_EQ(zclString.data()[0], 0); } -static void TestZclStringLessThanMaximumSize_Length_64(nlTestSuite * inSuite, void * inContext) +TEST_F(TestZclString, TestZclStringLessThanMaximumSize_Length_64) { uint8_t bufferMemory[256]; MutableByteSpan zclString(bufferMemory); chip::Platform::ScopedMemoryBuffer<char> cString64; - NL_TEST_ASSERT(inSuite, cString64.Calloc(1024)); + EXPECT_TRUE(cString64.Calloc(1024)); memset(cString64.Get(), 'A', 64); CHIP_ERROR err = MakeZclCharString(zclString, cString64.Get()); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, zclString.data()[0] == 64); - NL_TEST_ASSERT(inSuite, allCharactersSame(zclString.data()) == true); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(zclString.data()[0], 64); + EXPECT_TRUE(allCharactersSame(zclString.data())); } -static void TestZclStringEqualsMaximumSize(nlTestSuite * inSuite, void * inContext) +TEST_F(TestZclString, TestZclStringEqualsMaximumSize) { uint8_t bufferMemory[256]; MutableByteSpan zclString(bufferMemory); chip::Platform::ScopedMemoryBuffer<char> cString254; - NL_TEST_ASSERT(inSuite, cString254.Calloc(1024)); + EXPECT_TRUE(cString254.Calloc(1024)); memset(cString254.Get(), 'A', 254); CHIP_ERROR err = MakeZclCharString(zclString, cString254.Get()); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, zclString.data()[0] == 254); - NL_TEST_ASSERT(inSuite, allCharactersSame(zclString.data()) == true); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(zclString.data()[0], 254); + EXPECT_TRUE(allCharactersSame(zclString.data())); } -static void TestSizeZclStringBiggerThanMaximumSize_Length_255(nlTestSuite * inSuite, void * inContext) +TEST_F(TestZclString, TestSizeZclStringBiggerThanMaximumSize_Length_255) { uint8_t bufferMemory[256]; MutableByteSpan zclString(bufferMemory); chip::Platform::ScopedMemoryBuffer<char> cString255; - NL_TEST_ASSERT(inSuite, cString255.Calloc(1024)); + EXPECT_TRUE(cString255.Calloc(1024)); memset(cString255.Get(), 'A', 255); CHIP_ERROR err = MakeZclCharString(zclString, cString255.Get()); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INBOUND_MESSAGE_TOO_BIG); - NL_TEST_ASSERT(inSuite, zclString.data()[0] == 0); + EXPECT_EQ(err, CHIP_ERROR_INBOUND_MESSAGE_TOO_BIG); + EXPECT_EQ(zclString.data()[0], 0); } -static void TestSizeZclStringBiggerThanMaximumSize_Length_256(nlTestSuite * inSuite, void * inContext) +TEST_F(TestZclString, TestSizeZclStringBiggerThanMaximumSize_Length_256) { uint8_t bufferMemory[256]; MutableByteSpan zclString(bufferMemory); chip::Platform::ScopedMemoryBuffer<char> cString256; - NL_TEST_ASSERT(inSuite, cString256.Calloc(1024)); + EXPECT_TRUE(cString256.Calloc(1024)); memset(cString256.Get(), 'A', 256); CHIP_ERROR err = MakeZclCharString(zclString, cString256.Get()); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INBOUND_MESSAGE_TOO_BIG); - NL_TEST_ASSERT(inSuite, zclString.data()[0] == 0); + EXPECT_EQ(err, CHIP_ERROR_INBOUND_MESSAGE_TOO_BIG); + EXPECT_EQ(zclString.data()[0], 0); } -static void TestZclStringBiggerThanMaximumSize_Length_257(nlTestSuite * inSuite, void * inContext) +TEST_F(TestZclString, TestZclStringBiggerThanMaximumSize_Length_257) { uint8_t bufferMemory[257]; MutableByteSpan zclString(bufferMemory); chip::Platform::ScopedMemoryBuffer<char> cString257; - NL_TEST_ASSERT(inSuite, cString257.Calloc(1024)); + EXPECT_TRUE(cString257.Calloc(1024)); memset(cString257.Get(), 'A', 257); CHIP_ERROR err = MakeZclCharString(zclString, cString257.Get()); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_INBOUND_MESSAGE_TOO_BIG); - NL_TEST_ASSERT(inSuite, zclString.data()[0] == 0); -} - -#define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn) - -/** - * Set up the test suite. - */ -int TestZclString_Setup(void * inContext) -{ - CHIP_ERROR error = MemoryInit(); - if (error != CHIP_NO_ERROR) - return (FAILURE); - return (SUCCESS); -} - -/** - * Tear down the test suite. - */ -int TestZclString_Teardown(void * inContext) -{ - MemoryShutdown(); - return (SUCCESS); + EXPECT_EQ(err, CHIP_ERROR_INBOUND_MESSAGE_TOO_BIG); + EXPECT_EQ(zclString.data()[0], 0); } - -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { NL_TEST_DEF_FN(TestZclStringWhenBufferIsZero), - NL_TEST_DEF_FN(TestZclStringLessThanMaximumSize_Length_64), - NL_TEST_DEF_FN(TestZclStringEqualsMaximumSize), - NL_TEST_DEF_FN(TestSizeZclStringBiggerThanMaximumSize_Length_255), - NL_TEST_DEF_FN(TestSizeZclStringBiggerThanMaximumSize_Length_256), - NL_TEST_DEF_FN(TestZclStringBiggerThanMaximumSize_Length_257), - NL_TEST_SENTINEL() }; - -int TestZclString() -{ - nlTestSuite theSuite = { "CHIP Memory Allocation tests", &sTests[0], TestZclString_Setup, TestZclString_Teardown }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestZclString) From 6cdb5da19a5c39867ca08e5742d518d927985e5d Mon Sep 17 00:00:00 2001 From: joonhaengHeo <85541460+joonhaengHeo@users.noreply.github.com> Date: Tue, 30 Apr 2024 01:33:51 +0900 Subject: [PATCH 072/124] [Android] Implement LIT ICD for subscription (#33152) * Implement android LIT ICD subscribe * Refactoring ChipICDClient * Fix fabric Index, remoteID issue * Restyled by whitespace * Restyled by google-java-format * Restyled by clang-format * Restyled by gn * remove Unused API * Add Kotlin ICD Client Info * Fix build error --------- Co-authored-by: Restyled.io <commits@restyled.io> --- .../generators/java/ChipClusters_java.jinja | 4 +- .../several_clusters/java/ChipClusters.java | 4 +- .../java/AndroidDeviceControllerWrapper.cpp | 17 ++-- .../java/AndroidDeviceControllerWrapper.h | 3 - src/controller/java/AndroidICDClient.cpp | 99 +++++++++++++++++++ src/controller/java/AndroidICDClient.h | 32 ++++++ .../java/AndroidInteractionClient.cpp | 29 +++++- .../java/AndroidInteractionClient.h | 5 +- src/controller/java/BUILD.gn | 10 +- .../java/CHIPDeviceController-JNI.cpp | 67 ------------- src/controller/java/CHIPICDClient-JNI.cpp | 29 ++++++ .../java/CHIPInteractionClient-JNI.cpp | 16 ++- src/controller/java/MatterICDClient-JNI.cpp | 29 ++++++ .../java/MatterInteractionClient-JNI.cpp | 16 ++- .../chip/devicecontroller/ChipClusters.java | 4 +- .../ChipDeviceController.java | 73 ++++++++++++-- .../chip/devicecontroller/ChipICDClient.java | 34 +++++++ .../ChipInteractionClient.java | 7 +- .../src/matter/controller/ICDClientInfo.kt | 31 ++++++ .../matter/controller/MatterControllerImpl.kt | 72 +++----------- .../matter/controller/MatterICDClientImpl.kt | 28 ++++++ 21 files changed, 449 insertions(+), 160 deletions(-) create mode 100644 src/controller/java/AndroidICDClient.cpp create mode 100644 src/controller/java/AndroidICDClient.h create mode 100644 src/controller/java/CHIPICDClient-JNI.cpp create mode 100644 src/controller/java/MatterICDClient-JNI.cpp create mode 100644 src/controller/java/src/chip/devicecontroller/ChipICDClient.java create mode 100644 src/controller/java/src/matter/controller/ICDClientInfo.kt create mode 100644 src/controller/java/src/matter/controller/MatterICDClientImpl.kt diff --git a/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja b/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja index b391d09389ac2b..954bd7de57dcbf 100644 --- a/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja +++ b/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja @@ -219,7 +219,9 @@ public class ChipClusters { int maxInterval) { ReportCallbackJni jniCallback = new ReportCallbackJni(callback, callback, callback); ChipAttributePath path = ChipAttributePath.newInstance(endpointId, clusterId, attributeId); - ChipInteractionClient.subscribe(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, minInterval, maxInterval, false, true, timeoutMillis.orElse(0L).intValue(), null); + int fabricIndex = ChipInteractionClient.getFabricIndex(devicePtr); + long deviceId = ChipInteractionClient.getRemoteDeviceId(devicePtr); + ChipInteractionClient.subscribe(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, minInterval, maxInterval, false, true, timeoutMillis.orElse(0L).intValue(), null, ChipICDClient.isPeerICDClient(fabricIndex, deviceId)); } protected void invoke( diff --git a/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java b/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java index b574271a684521..037870ee206c5a 100644 --- a/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java +++ b/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java @@ -142,7 +142,9 @@ protected void subscribeAttribute( int maxInterval) { ReportCallbackJni jniCallback = new ReportCallbackJni(callback, callback, callback); ChipAttributePath path = ChipAttributePath.newInstance(endpointId, clusterId, attributeId); - ChipInteractionClient.subscribe(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, minInterval, maxInterval, false, true, timeoutMillis.orElse(0L).intValue(), null); + int fabricIndex = ChipInteractionClient.getFabricIndex(devicePtr); + long deviceId = ChipInteractionClient.getRemoteDeviceId(devicePtr); + ChipInteractionClient.subscribe(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, minInterval, maxInterval, false, true, timeoutMillis.orElse(0L).intValue(), null, ChipICDClient.isPeerICDClient(fabricIndex, deviceId)); } protected void invoke( diff --git a/src/controller/java/AndroidDeviceControllerWrapper.cpp b/src/controller/java/AndroidDeviceControllerWrapper.cpp index c5b3863524e153..1576e5883ca256 100644 --- a/src/controller/java/AndroidDeviceControllerWrapper.cpp +++ b/src/controller/java/AndroidDeviceControllerWrapper.cpp @@ -30,6 +30,7 @@ #include <lib/support/JniTypeWrappers.h> #include <controller/CHIPDeviceControllerFactory.h> +#include <controller/java/AndroidICDClient.h> #include <credentials/attestation_verifier/DefaultDeviceAttestationVerifier.h> #include <credentials/attestation_verifier/DeviceAttestationVerifier.h> #include <lib/core/TLV.h> @@ -185,7 +186,7 @@ AndroidDeviceControllerWrapper * AndroidDeviceControllerWrapper::AllocateNew( chip::Credentials::SetDeviceAttestationVerifier(GetDefaultDACVerifier(testingRootStore)); } - *errInfoOnFailure = wrapper->mICDClientStorage.Init(wrapperStorage, &wrapper->mSessionKeystore); + *errInfoOnFailure = getICDClientStorage()->Init(wrapperStorage, &wrapper->mSessionKeystore); if (*errInfoOnFailure != CHIP_NO_ERROR) { ChipLogError(Controller, "ICD Client Storage failure"); @@ -401,12 +402,12 @@ AndroidDeviceControllerWrapper * AndroidDeviceControllerWrapper::AllocateNew( *errInfoOnFailure = chip::Credentials::SetSingleIpkEpochKey( &wrapper->mGroupDataProvider, wrapper->Controller()->GetFabricIndex(), ipkSpan, compressedFabricIdSpan); - wrapper->getICDClientStorage()->UpdateFabricList(wrapper->Controller()->GetFabricIndex()); + getICDClientStorage()->UpdateFabricList(wrapper->Controller()->GetFabricIndex()); auto engine = chip::app::InteractionModelEngine::GetInstance(); - *errInfoOnFailure = wrapper->mCheckInDelegate.Init(&wrapper->mICDClientStorage, engine); + *errInfoOnFailure = wrapper->mCheckInDelegate.Init(getICDClientStorage(), engine); *errInfoOnFailure = wrapper->mCheckInHandler.Init(DeviceControllerFactory::GetInstance().GetSystemState()->ExchangeMgr(), - &wrapper->mICDClientStorage, &wrapper->mCheckInDelegate, engine); + getICDClientStorage(), &wrapper->mCheckInDelegate, engine); memset(ipkBuffer.data(), 0, ipkBuffer.size()); @@ -725,7 +726,7 @@ void AndroidDeviceControllerWrapper::OnCommissioningComplete(NodeId deviceId, CH if (error != CHIP_NO_ERROR && mDeviceIsICD) { - CHIP_ERROR deleteEntryError = mICDClientStorage.DeleteEntry(ScopedNodeId(deviceId, Controller()->GetFabricIndex())); + CHIP_ERROR deleteEntryError = getICDClientStorage()->DeleteEntry(ScopedNodeId(deviceId, Controller()->GetFabricIndex())); if (deleteEntryError != CHIP_NO_ERROR) { ChipLogError(chipTool, "Failed to delete ICD entry: %" CHIP_ERROR_FORMAT, deleteEntryError.Format()); @@ -1003,10 +1004,10 @@ void AndroidDeviceControllerWrapper::OnICDRegistrationComplete(chip::NodeId icdN ByteSpan symmetricKey = mAutoCommissioner.GetCommissioningParameters().GetICDSymmetricKey().Value(); - err = mICDClientStorage.SetKey(clientInfo, symmetricKey); + err = getICDClientStorage()->SetKey(clientInfo, symmetricKey); if (err == CHIP_NO_ERROR) { - err = mICDClientStorage.StoreEntry(clientInfo); + err = getICDClientStorage()->StoreEntry(clientInfo); } if (err == CHIP_NO_ERROR) @@ -1015,7 +1016,7 @@ void AndroidDeviceControllerWrapper::OnICDRegistrationComplete(chip::NodeId icdN } else { - mICDClientStorage.RemoveKey(clientInfo); + getICDClientStorage()->RemoveKey(clientInfo); ChipLogError(Controller, "Failed to persist symmetric key for " ChipLogFormatX64 ": %s", ChipLogValueX64(icdNodeId), err.AsString()); } diff --git a/src/controller/java/AndroidDeviceControllerWrapper.h b/src/controller/java/AndroidDeviceControllerWrapper.h index 3acf16963525f5..51beae2d0eba48 100644 --- a/src/controller/java/AndroidDeviceControllerWrapper.h +++ b/src/controller/java/AndroidDeviceControllerWrapper.h @@ -212,8 +212,6 @@ class AndroidDeviceControllerWrapper : public chip::Controller::DevicePairingDel CHIP_ERROR FinishOTAProvider(); - chip::app::DefaultICDClientStorage * getICDClientStorage() { return &mICDClientStorage; } - CHIP_ERROR SetICDCheckInDelegate(jobject checkInDelegate); private: @@ -228,7 +226,6 @@ class AndroidDeviceControllerWrapper : public chip::Controller::DevicePairingDel // TODO: This may need to be injected as a SessionKeystore* chip::Crypto::RawKeySessionKeystore mSessionKeystore; - chip::app::DefaultICDClientStorage mICDClientStorage; chip::app::AndroidCheckInDelegate mCheckInDelegate; chip::app::CheckInHandler mCheckInHandler; diff --git a/src/controller/java/AndroidICDClient.cpp b/src/controller/java/AndroidICDClient.cpp new file mode 100644 index 00000000000000..83cb5222576049 --- /dev/null +++ b/src/controller/java/AndroidICDClient.cpp @@ -0,0 +1,99 @@ +/* + * 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. + * + */ + +/** + * @file + * Implementation of ICD Client API for Android Platform + * + */ + +#include "AndroidICDClient.h" + +#include <app/icd/client/ICDClientInfo.h> + +chip::app::DefaultICDClientStorage sICDClientStorage; + +jobject getICDClientInfo(JNIEnv * env, const char * icdClientInfoSign, jint jFabricIndex) +{ + CHIP_ERROR err = CHIP_NO_ERROR; + + jobject jInfo = nullptr; + chip::app::ICDClientInfo info; + chip::FabricIndex fabricIndex = static_cast<chip::FabricIndex>(jFabricIndex); + + ChipLogProgress(Controller, "getICDClientInfo(%u) called", fabricIndex); + + err = chip::JniReferences::GetInstance().CreateArrayList(jInfo); + VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, + ChipLogError(Controller, "CreateArrayList failed!: %" CHIP_ERROR_FORMAT, err.Format())); + + auto iter = getICDClientStorage()->IterateICDClientInfo(); + VerifyOrReturnValue(iter != nullptr, nullptr, ChipLogError(Controller, "IterateICDClientInfo failed!")); + chip::app::DefaultICDClientStorage::ICDClientInfoIteratorWrapper clientInfoIteratorWrapper(iter); + + jmethodID constructor; + jclass infoClass; + chip::JniLocalReferenceScope scope(env); + + err = chip::JniReferences::GetInstance().GetLocalClassRef(env, icdClientInfoSign, infoClass); + VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, + ChipLogError(Controller, "Find ICDClientInfo class: %" CHIP_ERROR_FORMAT, err.Format())); + + env->ExceptionClear(); + constructor = env->GetMethodID(infoClass, "<init>", "(JJJJ[B[B)V"); + VerifyOrReturnValue(constructor != nullptr, nullptr, ChipLogError(Controller, "Find GetMethodID error!")); + + while (iter->Next(info)) + { + jbyteArray jIcdAesKey = nullptr; + jbyteArray jIcdHmacKey = nullptr; + jobject jICDClientInfo = nullptr; + + if (info.peer_node.GetFabricIndex() != fabricIndex) + { + continue; + } + + err = chip::JniReferences::GetInstance().N2J_ByteArray(env, + info.aes_key_handle.As<chip::Crypto::Symmetric128BitsKeyByteArray>(), + chip::Crypto::CHIP_CRYPTO_SYMMETRIC_KEY_LENGTH_BYTES, jIcdAesKey); + VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, + ChipLogError(Controller, "ICD AES KEY N2J_ByteArray error!: %" CHIP_ERROR_FORMAT, err.Format())); + + err = chip::JniReferences::GetInstance().N2J_ByteArray( + env, info.hmac_key_handle.As<chip::Crypto::Symmetric128BitsKeyByteArray>(), + chip::Crypto::CHIP_CRYPTO_SYMMETRIC_KEY_LENGTH_BYTES, jIcdHmacKey); + VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, + ChipLogError(Controller, "ICD HMAC KEY N2J_ByteArray error!: %" CHIP_ERROR_FORMAT, err.Format())); + + jICDClientInfo = (jobject) env->NewObject(infoClass, constructor, static_cast<jlong>(info.peer_node.GetNodeId()), + static_cast<jlong>(info.start_icd_counter), static_cast<jlong>(info.offset), + static_cast<jlong>(info.monitored_subject), jIcdAesKey, jIcdHmacKey); + + err = chip::JniReferences::GetInstance().AddToList(jInfo, jICDClientInfo); + VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, + ChipLogError(Controller, "AddToList error!: %" CHIP_ERROR_FORMAT, err.Format())); + } + + return jInfo; +} + +chip::app::DefaultICDClientStorage * getICDClientStorage() +{ + return &sICDClientStorage; +} diff --git a/src/controller/java/AndroidICDClient.h b/src/controller/java/AndroidICDClient.h new file mode 100644 index 00000000000000..e5b929e2a9c5f6 --- /dev/null +++ b/src/controller/java/AndroidICDClient.h @@ -0,0 +1,32 @@ +/* + * 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. + * + */ + +/** + * @file + * Implementation of ICD Client API for Android Platform + * + */ + +#pragma once + +#include <app/icd/client/DefaultICDClientStorage.h> +#include <lib/support/JniReferences.h> + +jobject getICDClientInfo(JNIEnv * env, const char * icdClientInfoSign, jint jFabricIndex); + +chip::app::DefaultICDClientStorage * getICDClientStorage(); diff --git a/src/controller/java/AndroidInteractionClient.cpp b/src/controller/java/AndroidInteractionClient.cpp index 6ab01bc01034fc..84506fddcf23d5 100644 --- a/src/controller/java/AndroidInteractionClient.cpp +++ b/src/controller/java/AndroidInteractionClient.cpp @@ -46,7 +46,7 @@ static CHIP_ERROR ParseDataVersionFilterList(jobject dataVersionFilterList, CHIP_ERROR subscribe(JNIEnv * env, jlong handle, jlong callbackHandle, jlong devicePtr, jobject attributePathList, jobject eventPathList, jobject dataVersionFilterList, jint minInterval, jint maxInterval, - jboolean keepSubscriptions, jboolean isFabricFiltered, jint imTimeoutMs, jobject eventMin) + jboolean keepSubscriptions, jboolean isFabricFiltered, jint imTimeoutMs, jobject eventMin, jboolean isPeerLIT) { chip::DeviceLayer::StackLock lock; CHIP_ERROR err = CHIP_NO_ERROR; @@ -128,6 +128,9 @@ CHIP_ERROR subscribe(JNIEnv * env, jlong handle, jlong callbackHandle, jlong dev params.mEventNumber.SetValue(static_cast<chip::EventNumber>(JniReferences::GetInstance().LongToPrimitive(eventMin))); } + params.mIsPeerLIT = (isPeerLIT == JNI_TRUE); + ChipLogProgress(Controller, "Peer ICD type is set to %s", params.mIsPeerLIT ? "LIT-ICD" : "non LIT-ICD"); + if (eventPathList != nullptr) { jint jNumEventPaths = 0; @@ -804,6 +807,30 @@ CHIP_ERROR invoke(JNIEnv * env, jlong handle, jlong callbackHandle, jlong device return err; } +jlong getRemoteDeviceId(jlong devicePtr) +{ + OperationalDeviceProxy * chipDevice = reinterpret_cast<OperationalDeviceProxy *>(devicePtr); + if (chipDevice == nullptr) + { + ChipLogProgress(Controller, "Could not cast device pointer to Device object"); + return static_cast<jlong>(chip::kUndefinedNodeId); + } + + return static_cast<jlong>(chipDevice->GetDeviceId()); +} + +jint getFabricIndex(jlong devicePtr) +{ + OperationalDeviceProxy * chipDevice = reinterpret_cast<OperationalDeviceProxy *>(devicePtr); + if (chipDevice == nullptr) + { + ChipLogProgress(Controller, "Could not cast device pointer to Device object"); + return static_cast<jint>(chip::kUndefinedFabricIndex); + } + + return static_cast<jint>(chipDevice->GetPeerScopedNodeId().GetFabricIndex()); +} + /** * Takes objects in attributePathList, converts them to app:AttributePathParams, and appends them to outAttributePathParamsList. */ diff --git a/src/controller/java/AndroidInteractionClient.h b/src/controller/java/AndroidInteractionClient.h index 32ee629856df1c..646ac141a42488 100644 --- a/src/controller/java/AndroidInteractionClient.h +++ b/src/controller/java/AndroidInteractionClient.h @@ -22,7 +22,7 @@ CHIP_ERROR subscribe(JNIEnv * env, jlong handle, jlong callbackHandle, jlong devicePtr, jobject attributePathList, jobject eventPathList, jobject dataVersionFilterList, jint minInterval, jint maxInterval, - jboolean keepSubscriptions, jboolean isFabricFiltered, jint imTimeoutMs, jobject eventMin); + jboolean keepSubscriptions, jboolean isFabricFiltered, jint imTimeoutMs, jobject eventMin, jboolean isPeerLIT); CHIP_ERROR read(JNIEnv * env, jlong handle, jlong callbackHandle, jlong devicePtr, jobject attributePathList, jobject eventPathList, jobject dataVersionFilterList, jboolean isFabricFiltered, jint imTimeoutMs, jobject eventMin); CHIP_ERROR write(JNIEnv * env, jlong handle, jlong callbackHandle, jlong devicePtr, jobject attributeList, @@ -32,3 +32,6 @@ CHIP_ERROR invoke(JNIEnv * env, jlong handle, jlong callbackHandle, jlong device CHIP_ERROR extendableInvoke(JNIEnv * env, jlong handle, jlong callbackHandle, jlong devicePtr, jobject invokeElementList, jint timedRequestTimeoutMs, jint imTimeoutMs); CHIP_ERROR shutdownSubscriptions(JNIEnv * env, jlong handle, jobject fabricIndex, jobject peerNodeId, jobject subscriptionId); + +jlong getRemoteDeviceId(jlong devicePtr); +jint getFabricIndex(jlong devicePtr); diff --git a/src/controller/java/BUILD.gn b/src/controller/java/BUILD.gn index 129ebe6e816339..e22c50cd023788 100644 --- a/src/controller/java/BUILD.gn +++ b/src/controller/java/BUILD.gn @@ -51,11 +51,14 @@ source_set("android_chip_im_jni") { "AndroidConnectionFailureExceptions.h", "AndroidControllerExceptions.cpp", "AndroidControllerExceptions.h", + "AndroidICDClient.cpp", + "AndroidICDClient.h", "AndroidInteractionClient.cpp", "AndroidInteractionClient.h", "BaseCHIPCluster-JNI.cpp", "CHIPAttributeTLVValueDecoder.h", "CHIPEventTLVValueDecoder.h", + "CHIPICDClient-JNI.cpp", "CHIPInteractionClient-JNI.cpp", "CHIPInteractionClient-JNI.h", ] @@ -70,6 +73,7 @@ source_set("android_chip_im_jni") { } deps = [ + "${chip_root}/src/app/icd/client:manager", "${chip_root}/src/lib", "${chip_root}/src/lib/support/jsontlv", "${chip_root}/src/platform", @@ -136,6 +140,7 @@ shared_library("jni") { "DeviceAttestationDelegateBridge.h", "GroupDeviceProxy.h", "MatterCallbacks-JNI.cpp", + "MatterICDClient-JNI.cpp", "MatterInteractionClient-JNI.cpp", ] @@ -431,12 +436,14 @@ kotlin_library("kotlin_matter_controller") { sources = [ "src/matter/controller/CompletionListenerAdapter.kt", "src/matter/controller/ControllerParams.kt", + "src/matter/controller/ICDClientInfo.kt", "src/matter/controller/InteractionClient.kt", "src/matter/controller/InvokeCallback.kt", "src/matter/controller/InvokeCallbackJni.kt", "src/matter/controller/MatterController.kt", "src/matter/controller/MatterControllerException.kt", "src/matter/controller/MatterControllerImpl.kt", + "src/matter/controller/MatterICDClientImpl.kt", "src/matter/controller/Messages.kt", "src/matter/controller/OperationalKeyConfig.kt", "src/matter/controller/ReportCallback.kt", @@ -499,10 +506,12 @@ android_library("android_chip_im") { sources = [ "src/chip/devicecontroller/ChipClusterException.java", "src/chip/devicecontroller/ChipDeviceControllerException.java", + "src/chip/devicecontroller/ChipICDClient.java", "src/chip/devicecontroller/ChipInteractionClient.java", "src/chip/devicecontroller/ExtendableInvokeCallback.java", "src/chip/devicecontroller/ExtendableInvokeCallbackJni.java", "src/chip/devicecontroller/GetConnectedDeviceCallbackJni.java", + "src/chip/devicecontroller/ICDClientInfo.java", "src/chip/devicecontroller/InvokeCallback.java", "src/chip/devicecontroller/InvokeCallbackJni.java", "src/chip/devicecontroller/ReportCallback.java", @@ -600,7 +609,6 @@ android_library("java") { "src/chip/devicecontroller/GroupKeySecurityPolicy.java", "src/chip/devicecontroller/ICDCheckInDelegate.java", "src/chip/devicecontroller/ICDCheckInDelegateWrapper.java", - "src/chip/devicecontroller/ICDClientInfo.java", "src/chip/devicecontroller/ICDDeviceInfo.java", "src/chip/devicecontroller/ICDRegistrationInfo.java", "src/chip/devicecontroller/KeypairDelegate.java", diff --git a/src/controller/java/CHIPDeviceController-JNI.cpp b/src/controller/java/CHIPDeviceController-JNI.cpp index dd034caf2007ba..9b3d10a2bf1d31 100644 --- a/src/controller/java/CHIPDeviceController-JNI.cpp +++ b/src/controller/java/CHIPDeviceController-JNI.cpp @@ -2154,73 +2154,6 @@ JNI_METHOD(jbyteArray, validateAndExtractCSR)(JNIEnv * env, jclass clazz, jbyteA return javaCsr; } -JNI_METHOD(jobject, getICDClientInfo)(JNIEnv * env, jobject self, jlong handle, jint jFabricIndex) -{ - chip::DeviceLayer::StackLock lock; - - CHIP_ERROR err = CHIP_NO_ERROR; - - jobject jInfo = nullptr; - chip::app::ICDClientInfo info; - chip::FabricIndex fabricIndex = static_cast<chip::FabricIndex>(jFabricIndex); - - ChipLogProgress(Controller, "getICDClientInfo(%u) called", fabricIndex); - AndroidDeviceControllerWrapper * wrapper = AndroidDeviceControllerWrapper::FromJNIHandle(handle); - VerifyOrReturnValue(wrapper != nullptr, nullptr, ChipLogError(Controller, "wrapper is null")); - - err = JniReferences::GetInstance().CreateArrayList(jInfo); - VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, - ChipLogError(Controller, "CreateArrayList failed!: %" CHIP_ERROR_FORMAT, err.Format())); - - auto iter = wrapper->getICDClientStorage()->IterateICDClientInfo(); - VerifyOrReturnValue(iter != nullptr, nullptr, ChipLogError(Controller, "IterateICDClientInfo failed!")); - app::DefaultICDClientStorage::ICDClientInfoIteratorWrapper clientInfoIteratorWrapper(iter); - - jmethodID constructor; - jclass infoClass; - JniLocalReferenceScope scope(env); - - err = JniReferences::GetInstance().GetLocalClassRef(env, "chip/devicecontroller/ICDClientInfo", infoClass); - VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, - ChipLogError(Controller, "Find ICDClientInfo class: %" CHIP_ERROR_FORMAT, err.Format())); - - env->ExceptionClear(); - constructor = env->GetMethodID(infoClass, "<init>", "(JJJJ[B[B)V"); - VerifyOrReturnValue(constructor != nullptr, nullptr, ChipLogError(Controller, "Find GetMethodID error!")); - - while (iter->Next(info)) - { - jbyteArray jIcdAesKey = nullptr; - jbyteArray jIcdHmacKey = nullptr; - jobject jICDClientInfo = nullptr; - - if (info.peer_node.GetFabricIndex() != fabricIndex) - { - continue; - } - - err = chip::JniReferences::GetInstance().N2J_ByteArray(env, info.aes_key_handle.As<Crypto::Symmetric128BitsKeyByteArray>(), - CHIP_CRYPTO_SYMMETRIC_KEY_LENGTH_BYTES, jIcdAesKey); - VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, - ChipLogError(Controller, "ICD AES KEY N2J_ByteArray error!: %" CHIP_ERROR_FORMAT, err.Format())); - - err = chip::JniReferences::GetInstance().N2J_ByteArray(env, info.hmac_key_handle.As<Crypto::Symmetric128BitsKeyByteArray>(), - CHIP_CRYPTO_SYMMETRIC_KEY_LENGTH_BYTES, jIcdHmacKey); - VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, - ChipLogError(Controller, "ICD HMAC KEY N2J_ByteArray error!: %" CHIP_ERROR_FORMAT, err.Format())); - - jICDClientInfo = (jobject) env->NewObject(infoClass, constructor, static_cast<jlong>(info.peer_node.GetNodeId()), - static_cast<jlong>(info.start_icd_counter), static_cast<jlong>(info.offset), - static_cast<jlong>(info.monitored_subject), jIcdAesKey, jIcdHmacKey); - - err = JniReferences::GetInstance().AddToList(jInfo, jICDClientInfo); - VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, - ChipLogError(Controller, "AddToList error!: %" CHIP_ERROR_FORMAT, err.Format())); - } - - return jInfo; -} - void * IOThreadMain(void * arg) { JNIEnv * env; diff --git a/src/controller/java/CHIPICDClient-JNI.cpp b/src/controller/java/CHIPICDClient-JNI.cpp new file mode 100644 index 00000000000000..b1fb2574c84465 --- /dev/null +++ b/src/controller/java/CHIPICDClient-JNI.cpp @@ -0,0 +1,29 @@ +/* + * 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 "AndroidICDClient.h" + +#include <platform/PlatformManager.h> + +#define JNI_METHOD(RETURN, METHOD_NAME) extern "C" JNIEXPORT RETURN JNICALL Java_chip_devicecontroller_ChipICDClient_##METHOD_NAME + +JNI_METHOD(jobject, getICDClientInfo)(JNIEnv * env, jobject self, jint jFabricIndex) +{ + chip::DeviceLayer::StackLock lock; + + return getICDClientInfo(env, "chip/devicecontroller/ICDClientInfo", jFabricIndex); +} diff --git a/src/controller/java/CHIPInteractionClient-JNI.cpp b/src/controller/java/CHIPInteractionClient-JNI.cpp index 62abf35ddca956..f6d8e0a0093d8f 100644 --- a/src/controller/java/CHIPInteractionClient-JNI.cpp +++ b/src/controller/java/CHIPInteractionClient-JNI.cpp @@ -73,10 +73,10 @@ void AndroidChipInteractionJNI_OnUnload(JavaVM * jvm, void * reserved) JNI_METHOD(void, subscribe) (JNIEnv * env, jobject self, jlong handle, jlong callbackHandle, jlong devicePtr, jobject attributePathList, jobject eventPathList, jobject dataVersionFilterList, jint minInterval, jint maxInterval, jboolean keepSubscriptions, jboolean isFabricFiltered, - jint imTimeoutMs, jobject eventMin) + jint imTimeoutMs, jobject eventMin, jboolean isPeerLIT) { CHIP_ERROR err = subscribe(env, handle, callbackHandle, devicePtr, attributePathList, eventPathList, dataVersionFilterList, - minInterval, maxInterval, keepSubscriptions, isFabricFiltered, imTimeoutMs, eventMin); + minInterval, maxInterval, keepSubscriptions, isFabricFiltered, imTimeoutMs, eventMin, isPeerLIT); if (err != CHIP_NO_ERROR) { ChipLogError(Controller, "JNI IM Subscribe Error: %" CHIP_ERROR_FORMAT, err.Format()); @@ -138,3 +138,15 @@ JNI_METHOD(void, shutdownSubscriptions) ChipLogError(Controller, "Failed to shutdown subscriptions with Error: %" CHIP_ERROR_FORMAT, err.Format()); } } + +JNI_METHOD(jlong, getRemoteDeviceId) +(JNIEnv * env, jobject self, jlong devicePtr) +{ + return getRemoteDeviceId(devicePtr); +} + +JNI_METHOD(jint, getFabricIndex) +(JNIEnv * env, jobject self, jlong devicePtr) +{ + return getFabricIndex(devicePtr); +} diff --git a/src/controller/java/MatterICDClient-JNI.cpp b/src/controller/java/MatterICDClient-JNI.cpp new file mode 100644 index 00000000000000..45ed4d96c241cb --- /dev/null +++ b/src/controller/java/MatterICDClient-JNI.cpp @@ -0,0 +1,29 @@ +/* + * 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 "AndroidICDClient.h" + +#include <platform/PlatformManager.h> + +#define JNI_METHOD(RETURN, METHOD_NAME) extern "C" JNIEXPORT RETURN JNICALL Java_matter_controller_MatterICDClientImpl_##METHOD_NAME + +JNI_METHOD(jobject, getICDClientInfo)(JNIEnv * env, jobject self, jint jFabricIndex) +{ + chip::DeviceLayer::StackLock lock; + + return getICDClientInfo(env, "matter/controller/ICDClientInfo", jFabricIndex); +} diff --git a/src/controller/java/MatterInteractionClient-JNI.cpp b/src/controller/java/MatterInteractionClient-JNI.cpp index 152e52aedd65d7..5b526a39de68b7 100644 --- a/src/controller/java/MatterInteractionClient-JNI.cpp +++ b/src/controller/java/MatterInteractionClient-JNI.cpp @@ -22,10 +22,10 @@ JNI_METHOD(void, subscribe) (JNIEnv * env, jobject self, jlong handle, jlong callbackHandle, jlong devicePtr, jobject attributePathList, jobject eventPathList, - jint minInterval, jint maxInterval, jboolean keepSubscriptions, jboolean isFabricFiltered, jint imTimeoutMs) + jint minInterval, jint maxInterval, jboolean keepSubscriptions, jboolean isFabricFiltered, jint imTimeoutMs, jboolean isPeerLIT) { CHIP_ERROR err = subscribe(env, handle, callbackHandle, devicePtr, attributePathList, eventPathList, nullptr, minInterval, - maxInterval, keepSubscriptions, isFabricFiltered, imTimeoutMs, nullptr); + maxInterval, keepSubscriptions, isFabricFiltered, imTimeoutMs, nullptr, isPeerLIT); if (err != CHIP_NO_ERROR) { ChipLogError(Controller, "JNI IM Subscribe Error: %" CHIP_ERROR_FORMAT, err.Format()); @@ -77,3 +77,15 @@ JNI_METHOD(void, extendableInvoke) ChipLogError(Controller, "JNI IM Batch Invoke Error: %" CHIP_ERROR_FORMAT, err.Format()); } } + +JNI_METHOD(jlong, getRemoteDeviceId) +(JNIEnv * env, jobject self, jlong devicePtr) +{ + return getRemoteDeviceId(devicePtr); +} + +JNI_METHOD(jint, getFabricIndex) +(JNIEnv * env, jobject self, jlong devicePtr) +{ + return getFabricIndex(devicePtr); +} diff --git a/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java b/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java index 0844ffee7a1918..2e64d37cd62b11 100644 --- a/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java +++ b/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java @@ -142,7 +142,9 @@ protected void subscribeAttribute( int maxInterval) { ReportCallbackJni jniCallback = new ReportCallbackJni(callback, callback, callback); ChipAttributePath path = ChipAttributePath.newInstance(endpointId, clusterId, attributeId); - ChipInteractionClient.subscribe(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, minInterval, maxInterval, false, true, timeoutMillis.orElse(0L).intValue(), null); + int fabricIndex = ChipInteractionClient.getFabricIndex(devicePtr); + long deviceId = ChipInteractionClient.getRemoteDeviceId(devicePtr); + ChipInteractionClient.subscribe(0, jniCallback.getCallbackHandle(), devicePtr, Arrays.asList(path), null, null, minInterval, maxInterval, false, true, timeoutMillis.orElse(0L).intValue(), null, ChipICDClient.isPeerICDClient(fabricIndex, deviceId)); } protected void invoke( diff --git a/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java b/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java index 482bc2e917a425..653cebf89d1030 100644 --- a/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java +++ b/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java @@ -743,7 +743,7 @@ public int getFabricIndex() { } public List<ICDClientInfo> getICDClientInfo() { - return getICDClientInfo(deviceControllerPtr, getFabricIndex(deviceControllerPtr)); + return getICDClientInfo(getFabricIndex(deviceControllerPtr)); } /** @@ -752,7 +752,7 @@ public List<ICDClientInfo> getICDClientInfo() { * @param fabricIndex the fabric index to check */ public List<ICDClientInfo> getICDClientInfo(int fabricIndex) { - return getICDClientInfo(deviceControllerPtr, fabricIndex); + return ChipICDClient.getICDClientInfo(fabricIndex); } /* Shuts down all active subscriptions. */ @@ -838,7 +838,10 @@ public void subscribeToAttributePath( false, false, imTimeoutMs, - null); + null, + ChipICDClient.isPeerICDClient( + ChipInteractionClient.getFabricIndex(devicePtr), + ChipInteractionClient.getRemoteDeviceId(devicePtr))); } /** @@ -876,7 +879,10 @@ public void subscribeToEventPath( false, false, imTimeoutMs, - null); + null, + ChipICDClient.isPeerICDClient( + ChipInteractionClient.getFabricIndex(devicePtr), + ChipInteractionClient.getRemoteDeviceId(devicePtr))); } public void subscribeToEventPath( @@ -902,7 +908,10 @@ public void subscribeToEventPath( false, false, imTimeoutMs, - eventMin); + eventMin, + ChipICDClient.isPeerICDClient( + ChipInteractionClient.getFabricIndex(devicePtr), + ChipInteractionClient.getRemoteDeviceId(devicePtr))); } /** @@ -936,7 +945,10 @@ public void subscribeToPath( keepSubscriptions, isFabricFiltered, imTimeoutMs, - null); + null, + ChipICDClient.isPeerICDClient( + ChipInteractionClient.getFabricIndex(devicePtr), + ChipInteractionClient.getRemoteDeviceId(devicePtr))); } /** @@ -988,7 +1000,10 @@ public void subscribeToPath( keepSubscriptions, isFabricFiltered, imTimeoutMs, - null); + null, + ChipICDClient.isPeerICDClient( + ChipInteractionClient.getFabricIndex(devicePtr), + ChipInteractionClient.getRemoteDeviceId(devicePtr))); } public void subscribeToPath( @@ -1019,7 +1034,47 @@ public void subscribeToPath( keepSubscriptions, isFabricFiltered, imTimeoutMs, - eventMin); + eventMin, + ChipICDClient.isPeerICDClient( + ChipInteractionClient.getFabricIndex(devicePtr), + ChipInteractionClient.getRemoteDeviceId(devicePtr))); + } + + public void subscribeToPath( + SubscriptionEstablishedCallback subscriptionEstablishedCallback, + ResubscriptionAttemptCallback resubscriptionAttemptCallback, + ReportCallback reportCallback, + long devicePtr, + List<ChipAttributePath> attributePaths, + List<ChipEventPath> eventPaths, + int minInterval, + int maxInterval, + boolean keepSubscriptions, + boolean isFabricFiltered, + int imTimeoutMs, + @Nullable Long eventMin, + @Nullable Boolean isPeerLIT) { + ReportCallbackJni jniCallback = + new ReportCallbackJni( + subscriptionEstablishedCallback, reportCallback, resubscriptionAttemptCallback); + ChipInteractionClient.subscribe( + deviceControllerPtr, + jniCallback.getCallbackHandle(), + devicePtr, + attributePaths, + eventPaths, + null, + minInterval, + maxInterval, + keepSubscriptions, + isFabricFiltered, + imTimeoutMs, + eventMin, + isPeerLIT != null + ? isPeerLIT + : ChipICDClient.isPeerICDClient( + ChipInteractionClient.getFabricIndex(devicePtr), + ChipInteractionClient.getRemoteDeviceId(devicePtr))); } /** @@ -1526,8 +1581,6 @@ private native void updateCommissioningNetworkCredentials( private native void updateCommissioningICDRegistrationInfo( long deviceControllerPtr, ICDRegistrationInfo icdRegistrationInfo); - private native List<ICDClientInfo> getICDClientInfo(long deviceControllerPtr, long fabricIndex); - private native long onNOCChainGeneration(long deviceControllerPtr, ControllerParams params); private native int getFabricIndex(long deviceControllerPtr); diff --git a/src/controller/java/src/chip/devicecontroller/ChipICDClient.java b/src/controller/java/src/chip/devicecontroller/ChipICDClient.java new file mode 100644 index 00000000000000..4d95a095f010f7 --- /dev/null +++ b/src/controller/java/src/chip/devicecontroller/ChipICDClient.java @@ -0,0 +1,34 @@ +/* + * 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. + * + */ + +package chip.devicecontroller; + +import java.util.List; + +public class ChipICDClient { + public static boolean isPeerICDClient(int fabricIndex, long deviceId) { + List<ICDClientInfo> clientInfo = getICDClientInfo(fabricIndex); + if (clientInfo == null) { + return false; + } + + return clientInfo.stream().anyMatch(info -> info.getPeerNodeId() == deviceId); + } + + public static native List<ICDClientInfo> getICDClientInfo(int fabricIndex); +} diff --git a/src/controller/java/src/chip/devicecontroller/ChipInteractionClient.java b/src/controller/java/src/chip/devicecontroller/ChipInteractionClient.java index d06f1170efebcd..a20d1ceef33691 100644 --- a/src/controller/java/src/chip/devicecontroller/ChipInteractionClient.java +++ b/src/controller/java/src/chip/devicecontroller/ChipInteractionClient.java @@ -37,7 +37,8 @@ static native void subscribe( boolean keepSubscriptions, boolean isFabricFiltered, int imTimeoutMs, - @Nullable Long eventMin); + @Nullable Long eventMin, + boolean isPeerICD); static native void read( long deviceControllerPtr, @@ -79,4 +80,8 @@ static native void shutdownSubscriptions( @Nullable Integer fabricIndex, @Nullable Long peerNodeId, @Nullable Long subscriptionId); + + static native long getRemoteDeviceId(long devicePtr); + + static native int getFabricIndex(long devicePtr); } diff --git a/src/controller/java/src/matter/controller/ICDClientInfo.kt b/src/controller/java/src/matter/controller/ICDClientInfo.kt new file mode 100644 index 00000000000000..3f0f30255a7dbc --- /dev/null +++ b/src/controller/java/src/matter/controller/ICDClientInfo.kt @@ -0,0 +1,31 @@ +/* + * 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. + * + */ + +package matter.controller + +/** Class for holding ICD Client information. */ +data class ICDClientInfo( + val peerNodeId: Long, + val startCounter: Long, + val offset: Long, + val monitoredSubject: Long, + val icdAesKey: ByteArray, + val icdHmacKey: ByteArray +) { + override fun toString(): String = "$peerNodeId/$startCounter/$offset/$monitoredSubject" +} diff --git a/src/controller/java/src/matter/controller/MatterControllerImpl.kt b/src/controller/java/src/matter/controller/MatterControllerImpl.kt index dde29eeb7c5354..1004b64815ddec 100644 --- a/src/controller/java/src/matter/controller/MatterControllerImpl.kt +++ b/src/controller/java/src/matter/controller/MatterControllerImpl.kt @@ -204,6 +204,9 @@ class MatterControllerImpl(params: ControllerParams) : MatterController { reportHandler, resubscriptionAttemptHandler ) + + val fabricIndex = getFabricIndex(devicePtr) + val deviceId = getRemoteDeviceId(devicePtr) subscribe( deviceControllerPtr, reportCallbackJni.getJniHandle(), @@ -214,7 +217,8 @@ class MatterControllerImpl(params: ControllerParams) : MatterController { request.maxInterval.seconds.toInt(), request.keepSubscriptions, request.fabricFiltered, - CHIP_IM_TIMEOUT_MS + CHIP_IM_TIMEOUT_MS, + MatterICDClientImpl.isPeerICDClient(fabricIndex, deviceId) ) awaitClose { logger.log(Level.FINE, "Closing flow") } @@ -232,7 +236,8 @@ class MatterControllerImpl(params: ControllerParams) : MatterController { maxInterval: Int, keepSubscriptions: Boolean, isFabricFiltered: Boolean, - imTimeoutMs: Int + imTimeoutMs: Int, + isPeerLIT: Boolean ) override suspend fun read(request: ReadRequest): ReadResponse { @@ -450,6 +455,10 @@ class MatterControllerImpl(params: ControllerParams) : MatterController { imTimeoutMs: Int ) + external fun getRemoteDeviceId(devicePtr: Long): Long + + external fun getFabricIndex(devicePtr: Long): Int + override fun close() { logger.log(Level.INFO, "MatterController is closed") deviceController.shutdownCommissioning() @@ -477,65 +486,6 @@ class MatterControllerImpl(params: ControllerParams) : MatterController { } } - // private fun ChipAttributePath.wrap(): AttributePath { - // return AttributePath( - // endpointId.getId().toUShort(), - // clusterId.getId().toUInt(), - // attributeId.getId().toUInt() - // ) - // } - - // private fun ChipEventPath.wrap(): EventPath { - // return EventPath( - // endpointId.getId().toUShort(), - // clusterId.getId().toUInt(), - // eventId.getId().toUInt() - // ) - // } - - // private fun chip.devicecontroller.model.NodeState.wrap(): NodeState { - // return NodeState( - // endpoints = endpointStates.mapValues { (id, value) -> value.wrap(id) }.toMutableMap(), - // ) - // } - - // private fun chip.devicecontroller.model.EndpointState.wrap(id: Int): EndpointState { - // return EndpointState( - // id, - // clusterStates.mapValues { (id, value) -> value.wrap(id) }.toMutableMap() - // ) - // } - - // private fun chip.devicecontroller.model.ClusterState.wrap(id: Long): ClusterState { - // return ClusterState( - // id, - // attributeStates.mapValues { (id, value) -> value.wrap(id) }.toMutableMap(), - // eventStates - // .mapValues { (id, value) -> - // value.map { eventState -> eventState.wrap(id) }.toMutableList() - // } - // .toMutableMap() - // ) - // } - - // private fun chip.devicecontroller.model.AttributeState.wrap(id: Long): AttributeState { - // return AttributeState(id, tlv, json.toString(), AttributePath(0U, 0U, id.toUInt()), value) - // } - - // private fun chip.devicecontroller.model.EventState.wrap(id: Long): EventState { - // return EventState( - // id, - // eventNumber, - // priorityLevel, - // timestampType, - // timestampValue, - // tlv, - // EventPath(0U, 0U, id.toUInt()), - // json.toString(), - // value - // ) - // } - init { val config: OperationalKeyConfig? = params.operationalKeyConfig val paramsBuilder = diff --git a/src/controller/java/src/matter/controller/MatterICDClientImpl.kt b/src/controller/java/src/matter/controller/MatterICDClientImpl.kt new file mode 100644 index 00000000000000..ae91e341904f08 --- /dev/null +++ b/src/controller/java/src/matter/controller/MatterICDClientImpl.kt @@ -0,0 +1,28 @@ +/* + * 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. + * + */ + +package matter.controller + +object MatterICDClientImpl { + fun isPeerICDClient(fabricIndex: Int, deviceId: Long): Boolean { + val clientInfo = getICDClientInfo(fabricIndex) ?: return false + return clientInfo.firstOrNull { it.peerNodeId == deviceId } != null + } + + external fun getICDClientInfo(fabricIndex: Int): List<ICDClientInfo>? +} From 9eb2e29f8b2b95dafbbfd06de733c44e136e8195 Mon Sep 17 00:00:00 2001 From: Stefan Agner <stefan@agner.ch> Date: Mon, 29 Apr 2024 19:26:11 +0200 Subject: [PATCH 073/124] Allow to build chip-cert with boringssl (#33226) Currently when trying to build chip-cert with boringssl gn doesn't generate a ninja target. This is since `chip_can_build_cert_tool` gets set to false. Allow to build with boringssl just like with openssl. --- build/chip/tools.gni | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/chip/tools.gni b/build/chip/tools.gni index efb25d3fa4a43a..46c321d965d1f6 100644 --- a/build/chip/tools.gni +++ b/build/chip/tools.gni @@ -19,7 +19,7 @@ declare_args() { chip_build_tools = current_os != "freertos" && current_os != "android" && chip_device_platform != "fake" chip_can_build_cert_tool = - chip_crypto == "openssl" || + chip_crypto == "openssl" || chip_crypto == "boringssl" || (chip_crypto == "" && (current_os != "android" && current_os != "freertos" && current_os != "zephyr" && current_os != "mbed" && From dfe64ee9859001fbdebb9b788a6e24c0764df888 Mon Sep 17 00:00:00 2001 From: Andrei Litvin <andy314@gmail.com> Date: Mon, 29 Apr 2024 13:32:37 -0400 Subject: [PATCH 074/124] Use std::optional for chip::Nullable (#33080) * make nullable depend on std::optional instead of chip::optional * Fix equality operator * Fix inequality operator as well * Fix test: previous code was enforcing chip::optional behavior on in-place construction * Restyle * Fix some compile errors ... std::optional now detects unused variables * Restyle * Remove unused variable * Restyle * Review updates * Review fix * Typo fixes * Ugly forward of Value and ValueOr .... however at least hopefully it is complete * Do not expose value/value_or at this time and keep Value/ValueOr as the public API for nullable * Fix copy and paste typo * Make more changes to make things compile and work like the old nullable * Use value again instead of operator** ... I was looking at the wrong compiler errors * Undo unrelated change * Make clang-tidy be abel to compile ... apparently it really does not like using has_value in equality operators * Restyle * Another update to make clang-tidy happy for the other equality operator * Update src/app/data-model/Nullable.h Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Undo odd whitespace change --------- Co-authored-by: Andrei Litvin <andreilitvin@google.com> Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> --- ...valve-configuration-and-control-server.cpp | 10 ++-- src/app/data-model/Nullable.h | 47 ++++++++++++------- src/app/tests/TestNullable.cpp | 24 ++++++---- 3 files changed, 49 insertions(+), 32 deletions(-) diff --git a/src/app/clusters/valve-configuration-and-control-server/valve-configuration-and-control-server.cpp b/src/app/clusters/valve-configuration-and-control-server/valve-configuration-and-control-server.cpp index 82dd45464cfde4..02486beea315a4 100644 --- a/src/app/clusters/valve-configuration-and-control-server/valve-configuration-and-control-server.cpp +++ b/src/app/clusters/valve-configuration-and-control-server/valve-configuration-and-control-server.cpp @@ -277,8 +277,7 @@ Delegate * GetDefaultDelegate(EndpointId endpoint) CHIP_ERROR CloseValve(EndpointId ep) { - Delegate * delegate = GetDelegate(ep); - DataModel::Nullable<uint32_t> rDuration; + Delegate * delegate = GetDelegate(ep); CHIP_ERROR attribute_error = CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute); VerifyOrReturnError(Status::Success == TargetState::Set(ep, ValveConfigurationAndControl::ValveStateEnum::kClosed), @@ -309,10 +308,8 @@ CHIP_ERROR CloseValve(EndpointId ep) CHIP_ERROR SetValveLevel(EndpointId ep, DataModel::Nullable<Percent> level, DataModel::Nullable<uint32_t> openDuration) { - Delegate * delegate = GetDelegate(ep); - Optional<Status> status = Optional<Status>::Missing(); - DataModel::Nullable<Percent> openLevel; - DataModel::Nullable<uint64_t> autoCloseTime; + Delegate * delegate = GetDelegate(ep); + Optional<Status> status = Optional<Status>::Missing(); CHIP_ERROR attribute_error = CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute); if (HasFeature(ep, ValveConfigurationAndControl::Feature::kTimeSync)) @@ -328,6 +325,7 @@ CHIP_ERROR SetValveLevel(EndpointId ep, DataModel::Nullable<Percent> level, Data VerifyOrReturnError(UnixEpochToChipEpochMicros(utcTime.count(), chipEpochTime), CHIP_ERROR_INVALID_TIME); uint64_t time = openDuration.Value() * chip::kMicrosecondsPerSecond; + DataModel::Nullable<uint64_t> autoCloseTime; autoCloseTime.SetNonNull(chipEpochTime + time); VerifyOrReturnError(Status::Success == AutoCloseTime::Set(ep, autoCloseTime), attribute_error); } diff --git a/src/app/data-model/Nullable.h b/src/app/data-model/Nullable.h index cea3dea5b5361b..f56e67ced19113 100644 --- a/src/app/data-model/Nullable.h +++ b/src/app/data-model/Nullable.h @@ -19,9 +19,9 @@ #pragma once #include <app/util/attribute-storage-null-handling.h> -#include <lib/core/Optional.h> - +#include <optional> #include <type_traits> +#include <utility> namespace chip { namespace app { @@ -37,31 +37,40 @@ inline constexpr auto NullNullable = NullOptional; * things. */ template <typename T> -struct Nullable : protected Optional<T> +struct Nullable : protected std::optional<T> { + // // The following 'using' statement is needed to make visible // all constructors of the base class within this derived class. // - using Optional<T>::Optional; + using std::optional<T>::optional; + using std::optional<T>::operator*; + using std::optional<T>::operator->; - // Pull in APIs that make sense on Nullable with the same names as on - // Optional. - using Optional<T>::Value; - using Optional<T>::ValueOr; + Nullable(NullOptionalType) : std::optional<T>(std::nullopt) {} // Some consumers need an easy way to determine our underlying type. using UnderlyingType = T; - constexpr void SetNull() { Optional<T>::ClearValue(); } - constexpr bool IsNull() const { return !Optional<T>::HasValue(); } + constexpr void SetNull() { std::optional<T>::reset(); } + constexpr bool IsNull() const { return !std::optional<T>::has_value(); } template <class... Args> constexpr T & SetNonNull(Args &&... args) { - return Optional<T>::Emplace(std::forward<Args>(args)...); + return std::optional<T>::emplace(std::forward<Args>(args)...); + } + + template <typename... Args> + constexpr auto ValueOr(Args &&... args) const + { + return std::optional<T>::value_or(std::forward<Args>(args)...); } + inline constexpr const T & Value() const { return std::optional<T>::value(); } + inline T & Value() { return std::optional<T>::value(); } + // For integer types, being nullable involves a range restriction. template < typename U = std::decay_t<T>, @@ -96,22 +105,26 @@ struct Nullable : protected Optional<T> // The only fabric-scoped objects in the spec are commands, events and structs inside lists, and none of those can be nullable. static constexpr bool kIsFabricScoped = false; - bool operator==(const Nullable & other) const { return Optional<T>::operator==(other); } - bool operator!=(const Nullable & other) const { return Optional<T>::operator!=(other); } - bool operator==(const T & other) const { return Optional<T>::operator==(other); } - bool operator!=(const T & other) const { return Optional<T>::operator!=(other); } + inline bool operator==(const T & other) const { return static_cast<const std::optional<T> &>(*this) == other; } + inline bool operator!=(const T & other) const { return !(*this == other); } + + inline bool operator==(const Nullable<T> & other) const + { + return static_cast<const std::optional<T> &>(*this) == static_cast<const std::optional<T> &>(other); + } + inline bool operator!=(const Nullable<T> & other) const { return !(*this == other); } }; template <class T> constexpr Nullable<std::decay_t<T>> MakeNullable(T && value) { - return Nullable<std::decay_t<T>>(InPlace, std::forward<T>(value)); + return Nullable<std::decay_t<T>>(std::in_place, std::forward<T>(value)); } template <class T, class... Args> constexpr Nullable<T> MakeNullable(Args &&... args) { - return Nullable<T>(InPlace, std::forward<Args>(args)...); + return Nullable<T>(std::in_place, std::forward<Args>(args)...); } } // namespace DataModel diff --git a/src/app/tests/TestNullable.cpp b/src/app/tests/TestNullable.cpp index c1290c1a0cef66..660037339d44e1 100644 --- a/src/app/tests/TestNullable.cpp +++ b/src/app/tests/TestNullable.cpp @@ -45,6 +45,7 @@ struct CtorDtorCounter CtorDtorCounter & operator=(CtorDtorCounter &&) = default; bool operator==(const CtorDtorCounter & o) const { return m == o.m; } + bool operator!=(const CtorDtorCounter & o) const { return m != o.m; } int m; @@ -68,6 +69,9 @@ struct MovableCtorDtorCounter : public CtorDtorCounter MovableCtorDtorCounter(MovableCtorDtorCounter && o) = default; MovableCtorDtorCounter & operator=(MovableCtorDtorCounter &&) = default; + + using CtorDtorCounter::operator==; + using CtorDtorCounter::operator!=; }; int CtorDtorCounter::created = 0; @@ -165,24 +169,26 @@ static void TestMove(nlTestSuite * inSuite, void * inContext) CtorDtorCounter::ResetCounter(); { - auto testSrc = MakeNullable<MovableCtorDtorCounter>(400); - Nullable<MovableCtorDtorCounter> testDst(std::move(testSrc)); - NL_TEST_ASSERT(inSuite, CtorDtorCounter::created == 2 && CtorDtorCounter::destroyed == 1); + auto testSrc = MakeNullable<MovableCtorDtorCounter>(400); // construct + Nullable<MovableCtorDtorCounter> testDst(std::move(testSrc)); // move construct + NL_TEST_ASSERT(inSuite, CtorDtorCounter::created == 2 && CtorDtorCounter::destroyed == 0); NL_TEST_ASSERT(inSuite, !testDst.IsNull() && testDst.Value().m == 400); + // destroy both testsSrc and testDst } NL_TEST_ASSERT(inSuite, CtorDtorCounter::created == 2 && CtorDtorCounter::destroyed == 2); + CtorDtorCounter::ResetCounter(); { - Nullable<MovableCtorDtorCounter> testDst; - NL_TEST_ASSERT(inSuite, CtorDtorCounter::created == 2 && CtorDtorCounter::destroyed == 2); + Nullable<MovableCtorDtorCounter> testDst; // no object construction + NL_TEST_ASSERT(inSuite, CtorDtorCounter::created == 0 && CtorDtorCounter::destroyed == 0); NL_TEST_ASSERT(inSuite, !!testDst.IsNull()); - auto testSrc = MakeNullable<MovableCtorDtorCounter>(401); - testDst = std::move(testSrc); - NL_TEST_ASSERT(inSuite, CtorDtorCounter::created == 4 && CtorDtorCounter::destroyed == 3); + auto testSrc = MakeNullable<MovableCtorDtorCounter>(401); // construct object + testDst = std::move(testSrc); // construct a copy + NL_TEST_ASSERT(inSuite, CtorDtorCounter::created == 2 && CtorDtorCounter::destroyed == 0); NL_TEST_ASSERT(inSuite, !testDst.IsNull() && testDst.Value().m == 401); } - NL_TEST_ASSERT(inSuite, CtorDtorCounter::created == 4 && CtorDtorCounter::destroyed == 4); + NL_TEST_ASSERT(inSuite, CtorDtorCounter::created == 2 && CtorDtorCounter::destroyed == 2); } static void TestUpdate(nlTestSuite * inSuite, void * inContext) From 9db03ee95f5ae0384e5c7bafc2eda76d510dead3 Mon Sep 17 00:00:00 2001 From: mkardous-silabs <84793247+mkardous-silabs@users.noreply.github.com> Date: Mon, 29 Apr 2024 15:07:30 -0400 Subject: [PATCH 075/124] [ICD] Fix comment mistakes from post-merge reviews (#33225) * Fix comment mistakes * Update src/app/icd/server/ICDManager.h Co-authored-by: Tennessee Carmel-Veilleux <tennessee.carmelveilleux@gmail.com> * Update src/app/icd/server/ICDManager.h Co-authored-by: Tennessee Carmel-Veilleux <tennessee.carmelveilleux@gmail.com> --------- Co-authored-by: Tennessee Carmel-Veilleux <tennessee.carmelveilleux@gmail.com> --- src/app/icd/server/ICDManager.cpp | 2 +- src/app/icd/server/ICDManager.h | 10 +++++----- src/protocols/secure_channel/CheckInCounter.cpp | 2 +- src/protocols/secure_channel/CheckInCounter.h | 2 +- .../secure_channel/tests/TestCheckInCounter.cpp | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/app/icd/server/ICDManager.cpp b/src/app/icd/server/ICDManager.cpp index d2755f7a187f06..2b4ccb2be8af4e 100644 --- a/src/app/icd/server/ICDManager.cpp +++ b/src/app/icd/server/ICDManager.cpp @@ -670,7 +670,7 @@ CHIP_ERROR ICDManager::HandleEventTrigger(uint64_t eventTrigger) break; #if CHIP_CONFIG_ENABLE_ICD_CIP case ICDTestEventTriggerEvent::kInvalidateHalfCounterValues: - err = ICDConfigurationData::GetInstance().GetICDCounter().InvalidateHalfCheckInCouterValues(); + err = ICDConfigurationData::GetInstance().GetICDCounter().InvalidateHalfCheckInCounterValues(); break; case ICDTestEventTriggerEvent::kInvalidateAllCounterValues: err = ICDConfigurationData::GetInstance().GetICDCounter().InvalidateAllCheckInCounterValues(); diff --git a/src/app/icd/server/ICDManager.h b/src/app/icd/server/ICDManager.h index bf6e439c62ef52..ec7d06b2a78ef5 100644 --- a/src/app/icd/server/ICDManager.h +++ b/src/app/icd/server/ICDManager.h @@ -74,7 +74,7 @@ class ICDManager : public ICDListener, public TestEventTriggerHandler }; /** - * @brief This enum class represents to all ICDStateObserver callbacks available from the + * @brief This enum class represents all ICDStateObserver callbacks available from the * mStateObserverPool for the ICDManager. * * EnterActiveMode, TransitionToIdle and EnterIdleMode will always be called as a trio in the same order. @@ -85,12 +85,12 @@ class ICDManager : public ICDListener, public TestEventTriggerHandler * When this event is called, the ICD is still in ActiveMode. * If the ActiveMode timer is increased due to the TransitionToIdle event, the event will not be called a second time in * a given cycle. - * OnEnterIdleMode will always the third when the ICD has transitioned to IdleMode. + * OnEnterIdleMode will always the third event and indicates that the ICD has transitioned to IdleMode. * * The ICDModeChange event can occur independently from the EnterActiveMode, TransitionToIdle and EnterIdleMode. - * It will typpically hapen at the ICDManager init when a client is already registered with the ICD before the - * OnEnterIdleMode event or when a client send a register command after the OnEnterActiveMode event. Nothing prevents the - * ICDModeChange event to happen multiple times per cycle or while the ICD is in IdleMode. + * It will typically happen at the ICDManager init when a client is already registered with the ICD before the + * OnEnterIdleMode event or when a client sends a register command after the OnEnterActiveMode event. Nothing prevents + * the ICDModeChange event from happening multiple times per cycle or while the ICD is in IdleMode. * * See src/app/icd/server/ICDStateObserver.h for more information on the APIs each event triggers */ diff --git a/src/protocols/secure_channel/CheckInCounter.cpp b/src/protocols/secure_channel/CheckInCounter.cpp index 5ef576cd6678e9..d59f7bad1ac803 100644 --- a/src/protocols/secure_channel/CheckInCounter.cpp +++ b/src/protocols/secure_channel/CheckInCounter.cpp @@ -26,7 +26,7 @@ namespace chip { namespace Protocols { namespace SecureChannel { -CHIP_ERROR CheckInCounter::InvalidateHalfCheckInCouterValues() +CHIP_ERROR CheckInCounter::InvalidateHalfCheckInCounterValues() { // Increases the current counter value by half of its maximum range and updates underlying counter storage. // CheckInCounter is allowed to roll over. diff --git a/src/protocols/secure_channel/CheckInCounter.h b/src/protocols/secure_channel/CheckInCounter.h index d22308ce9fb033..de0e30486a8142 100644 --- a/src/protocols/secure_channel/CheckInCounter.h +++ b/src/protocols/secure_channel/CheckInCounter.h @@ -53,7 +53,7 @@ class CheckInCounter : public PersistedCounter<uint32_t> * * @return CHIP_ERROR Any error returned by a write to persisted storage. */ - CHIP_ERROR InvalidateHalfCheckInCouterValues(); + CHIP_ERROR InvalidateHalfCheckInCounterValues(); /** * @brief Invalidates all the Check-In counter values. After this function is called, the new Check-In counter value will be diff --git a/src/protocols/secure_channel/tests/TestCheckInCounter.cpp b/src/protocols/secure_channel/tests/TestCheckInCounter.cpp index 8a64d1805d42ae..e4a71777d17b97 100644 --- a/src/protocols/secure_channel/tests/TestCheckInCounter.cpp +++ b/src/protocols/secure_channel/tests/TestCheckInCounter.cpp @@ -37,7 +37,7 @@ enum class CheckInCounterOperations : uint8_t * @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 InvalidateHalfCheckInCouterValues call + * @param expectedValue Expected value after the InvalidateHalfCheckInCounterValues call */ void VerifyCheckInCounterValues(uint32_t startValue, uint32_t expectedValue, CheckInCounterOperations operation) { @@ -60,7 +60,7 @@ void VerifyCheckInCounterValues(uint32_t startValue, uint32_t expectedValue, Che switch (operation) { case CheckInCounterOperations::kInvalidateHalf: { - EXPECT_EQ(counter.InvalidateHalfCheckInCouterValues(), CHIP_NO_ERROR); + EXPECT_EQ(counter.InvalidateHalfCheckInCounterValues(), CHIP_NO_ERROR); break; } case CheckInCounterOperations::kInvalidateAll: { From d7a488fcb665e782d6a5fb65eb37d3e404d0481b Mon Sep 17 00:00:00 2001 From: mkardous-silabs <84793247+mkardous-silabs@users.noreply.github.com> Date: Mon, 29 Apr 2024 20:26:57 -0400 Subject: [PATCH 076/124] [Silabs] Update Silabs SDK versions (#33229) * Update SDK to latest versions * Update docker version * Update slcp with new gsdk version * Update gitmodules * Update matter support submodule * Refactor Sleepy APIs for 917 * restyle * update cloud build --------- Co-authored-by: Rohan Sahay <Rohan.Sahay@silabs.com> --- .github/workflows/examples-efr32.yaml | 2 +- .github/workflows/release_artifacts.yaml | 11 +-- .gitmodules | 5 +- examples/platform/silabs/FreeRTOSConfig.h | 17 +++- examples/platform/silabs/MatterConfig.cpp | 66 ++++++++++++-- .../silabs/SiWx917/SiWx917/sl_wifi_if.cpp | 86 ++++++++++++------- .../silabs/ldscripts/SiWx917-common.ld | 10 ++- examples/platform/silabs/matter-platform.slcp | 2 +- integrations/cloudbuild/smoke-test.yaml | 2 +- src/platform/silabs/SiWx917/BUILD.gn | 5 +- .../silabs/SiWx917/wifi/wfx_notify.cpp | 26 +----- .../platformAbstraction/WiseMcuSpam.cpp | 24 ++++-- third_party/silabs/SiWx917_sdk.gni | 23 +++-- third_party/silabs/gecko_sdk | 2 +- third_party/silabs/matter_support | 2 +- third_party/silabs/wifi_sdk | 2 +- 16 files changed, 190 insertions(+), 95 deletions(-) diff --git a/.github/workflows/examples-efr32.yaml b/.github/workflows/examples-efr32.yaml index 019807f32164c0..b160b8ed5e2df8 100644 --- a/.github/workflows/examples-efr32.yaml +++ b/.github/workflows/examples-efr32.yaml @@ -40,7 +40,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-efr32:47 + image: ghcr.io/project-chip/chip-build-efr32:49 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/release_artifacts.yaml b/.github/workflows/release_artifacts.yaml index 1622808396cee8..435ab054dc3ad5 100644 --- a/.github/workflows/release_artifacts.yaml +++ b/.github/workflows/release_artifacts.yaml @@ -23,7 +23,7 @@ on: env: CHIP_NO_LOG_TIMESTAMPS: true - + jobs: esp32: name: ESP32 @@ -38,7 +38,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 with: - ref: "${{ github.event.inputs.releaseTag }}" + ref: "${{ github.event.inputs.releaseTag }}" - name: Bootstrap uses: ./.github/actions/bootstrap @@ -64,17 +64,18 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-efr32:47 + image: ghcr.io/project-chip/chip-build-efr32:49 steps: - name: Checkout uses: actions/checkout@v4 with: - ref: "${{ github.event.inputs.releaseTag }}" + ref: "${{ github.event.inputs.releaseTag }}" - name: Bootstrap uses: ./.github/actions/bootstrap - name: Build example EFR32 Lock App - run: scripts/examples/gn_silabs_example.sh examples/lock-app/efr32/ + run: + scripts/examples/gn_silabs_example.sh examples/lock-app/efr32/ out/lock_app_debug $SILABS_BOARD - name: Upload artifact diff --git a/.gitmodules b/.gitmodules index be8c70fb160cba..c372f58f4402b6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -244,7 +244,7 @@ [submodule "third_party/silabs/gecko_sdk"] path = third_party/silabs/gecko_sdk url = https://github.com/SiliconLabs/gecko_sdk.git - branch = v4.4.1 + branch = v4.4.2 platforms = silabs [submodule "third_party/silabs/wiseconnect-wifi-bt-sdk"] path = third_party/silabs/wiseconnect-wifi-bt-sdk @@ -254,7 +254,7 @@ [submodule "third_party/silabs/wifi_sdk"] path = third_party/silabs/wifi_sdk url = https://github.com/SiliconLabs/wiseconnect.git - branch = v3.1.3 + branch = v3.1.3-matter-hotfix.4 platforms = silabs [submodule "editline"] path = third_party/editline/repo @@ -334,4 +334,3 @@ url = https://github.com/Infineon/optiga-trust-m.git branch = matter_support platforms = infineon - diff --git a/examples/platform/silabs/FreeRTOSConfig.h b/examples/platform/silabs/FreeRTOSConfig.h index fd6658c7af35e2..ec926f4bbbeb94 100644 --- a/examples/platform/silabs/FreeRTOSConfig.h +++ b/examples/platform/silabs/FreeRTOSConfig.h @@ -141,11 +141,21 @@ extern uint32_t SystemCoreClock; /* Energy saving modes. */ #if defined(SL_CATALOG_POWER_MANAGER_PRESENT) #define configUSE_TICKLESS_IDLE 1 +#elif SL_ICD_ENABLED && SI917_M4_SLEEP_ENABLED +#define configUSE_TICKLESS_IDLE 1 +#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 70 +#define configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING(x) vTaskPreSuppressTicksAndSleepProcessing(&x) +#define configPRE_SLEEP_PROCESSING(x) sl_wfx_host_si91x_sleep(&x) +#define configPOST_SLEEP_PROCESSING(x) sl_si91x_post_sleep_update_ticks(&x) #else #define configUSE_TICKLESS_IDLE 0 #endif // SL_CATALOG_POWER_MANAGER_PRESENT +#if defined(SLI_SI91X_MCU_INTERFACE) +#define configTICK_RATE_HZ (1000) +#else #define configTICK_RATE_HZ (1024) +#endif // SLI_SI91X_MCU_INTERFACE /* Definition used by Keil to replace default system clock source. */ #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 1 @@ -201,8 +211,11 @@ See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ #define configUSE_PORT_OPTIMISED_TASK_SELECTION (0) #define configUSE_TICKLESS_IDLE_SIMPLE_DEBUG (1) /* See into vPortSuppressTicksAndSleep source code for explanation */ #define configMAX_PRIORITIES (56) -#define configMINIMAL_STACK_SIZE (320) /* Number of words to use for Idle and Timer stacks */ - +#if SLI_SI91X_MCU_INTERFACE && SL_ICD_ENABLED +#define configMINIMAL_STACK_SIZE (1024) /* Number of words to use for Idle and Timer stacks */ +#else // For EFR32 +#define configMINIMAL_STACK_SIZE (320) /* Number of words to use for Idle and Timer stacks */ +#endif // SLI_SI91X_MCU_INTERFACE && SL_ICD_ENABLED #ifdef HEAP_MONITORING #define configMAX_TASK_NAME_LEN (24) #else diff --git a/examples/platform/silabs/MatterConfig.cpp b/examples/platform/silabs/MatterConfig.cpp index d85f10d0612ea1..9cc030557ab0f3 100644 --- a/examples/platform/silabs/MatterConfig.cpp +++ b/examples/platform/silabs/MatterConfig.cpp @@ -43,7 +43,10 @@ #ifdef SLI_SI91X_MCU_INTERFACE #include "wfx_rsi.h" -#endif /* SLI_SI91X_MCU_INTERFACE */ +#if CHIP_CONFIG_ENABLE_ICD_SERVER && SI917_M4_SLEEP_ENABLED +#include "rsi_m4.h" +#endif // CHIP_CONFIG_ENABLE_ICD_SERVER && SI917_M4_SLEEP_ENABLED +#endif // SLI_SI91X_MCU_INTERFACE #include <crypto/CHIPCryptoPAL.h> // If building with the EFR32-provided crypto backend, we can use the @@ -342,7 +345,6 @@ CHIP_ERROR SilabsMatterConfig::InitWiFi(void) sl_status_t status; if ((status = wfx_wifi_rsi_init()) != SL_STATUS_OK) { - SILABS_LOG("wfx_wifi_rsi_init failed with status: %x", status); ReturnErrorOnFailure((CHIP_ERROR) status); } #endif // SLI_SI91X_MCU_INTERFACE @@ -354,9 +356,63 @@ CHIP_ERROR SilabsMatterConfig::InitWiFi(void) // ================================================================================ // FreeRTOS Callbacks // ================================================================================ -extern "C" void vApplicationIdleHook(void) +#if CHIP_CONFIG_ENABLE_ICD_SERVER && SI917_M4_SLEEP_ENABLED +static bool is_sleep_ready = false; +void vTaskPreSuppressTicksAndSleepProcessing(uint16_t * xExpectedIdleTime) { -#if SLI_SI91X_MCU_INTERFACE && CHIP_CONFIG_ENABLE_ICD_SERVER - sl_wfx_host_si91x_sleep_wakeup(); + // pointer check + if (xExpectedIdleTime == NULL) + { + return; + } + + if (!is_sleep_ready) + { + *xExpectedIdleTime = 0; + } + else + { + // a preliminary check of the expected idle time is performed without making M4 inactive + if (*xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP) + { + // Indicate M4 is Inactive + P2P_STATUS_REG &= ~M4_is_active; + // Waiting for one more clock cycle to make sure M4 H/W Register is updated + P2P_STATUS_REG; + + // TODO: This delay is added to sync between M4 and TA. It should be removed once the logic is moved to wifi SDK + for (uint8_t delay = 0; delay < 10; delay++) + { + __ASM("NOP"); + } + // Checking if TA has already triggered a packet to M4 + // RX_BUFFER_VALID will be cleared by TA if any packet is triggered + if ((P2P_STATUS_REG & TA_wakeup_M4) || (P2P_STATUS_REG & M4_wakeup_TA) || (!(M4SS_P2P_INTR_SET_REG & RX_BUFFER_VALID))) + { + P2P_STATUS_REG |= M4_is_active; + *xExpectedIdleTime = 0; + } + else + { + M4SS_P2P_INTR_CLR_REG = RX_BUFFER_VALID; + M4SS_P2P_INTR_CLR_REG; + + TASS_P2P_INTR_MASK_SET = (TX_PKT_TRANSFER_DONE_INTERRUPT | RX_PKT_TRANSFER_DONE_INTERRUPT | + TA_WRITING_ON_COMM_FLASH | NWP_DEINIT_IN_COMM_FLASH +#ifdef SL_SI91X_SIDE_BAND_CRYPTO + | SIDE_BAND_CRYPTO_DONE #endif + ); + } + } + } +} +#endif // CHIP_CONFIG_ENABLE_ICD_SERVER && SI917_M4_SLEEP_ENABLED +extern "C" void vApplicationIdleHook(void) +{ +#if CHIP_CONFIG_ENABLE_ICD_SERVER && SI917_M4_SLEEP_ENABLED + invoke_btn_press_event(); + // is_sleep_ready is required since wfx_is_sleep_ready() is not FreeRTOS scheduler agnostic + is_sleep_ready = wfx_is_sleep_ready(); +#endif // CHIP_CONFIG_ENABLE_ICD_SERVER && SI917_M4_SLEEP_ENABLED } diff --git a/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp b/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp index a8dc13c1eacec9..1759d2df9e6e53 100644 --- a/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp +++ b/examples/platform/silabs/SiWx917/SiWx917/sl_wifi_if.cpp @@ -78,6 +78,11 @@ extern "C" { WfxRsi_t wfx_rsi; +// TODO: remove this. Added only to monitor how many watch dog reset have happened during testing. +#ifdef SLI_SI91X_MCU_INTERFACE +volatile uint32_t watchdog_reset = 0; +#endif // SLI_SI91X_MCU_INTERFACE + /* Declare a variable to hold the data associated with the created event group. */ StaticEventGroup_t rsiDriverEventGroup; @@ -274,42 +279,52 @@ sl_status_t join_callback_handler(sl_wifi_event_t event, char * result, uint32_t #if SL_ICD_ENABLED -#if SLI_SI91X_MCU_INTERFACE -/****************************************************************** - * @fn sl_wfx_host_si91x_sleep_wakeup() - * @brief - * M4 going to sleep - * - * @param[in] None - * @return - * None - *********************************************************************/ -void sl_wfx_host_si91x_sleep_wakeup() +#if SI917_M4_SLEEP_ENABLED +// Required to invoke button press event during sleep as falling edge is not detected +void invoke_btn_press_event() { - if (wfx_rsi.dev_state & WFX_RSI_ST_SLEEP_READY) + // TODO: should be removed once we are getting the press interrupt for button 0 with sleep + if (!RSI_NPSSGPIO_GetPin(SL_BUTTON_BTN0_PIN) && !btn0_pressed) { - // TODO: should be removed once we are getting the press interrupt for button 0 with sleep - if (!RSI_NPSSGPIO_GetPin(SL_BUTTON_BTN0_PIN) && !btn0_pressed) - { - sl_button_on_change(SL_BUTTON_BTN0_NUMBER, BUTTON_PRESSED); - btn0_pressed = true; - } - if (RSI_NPSSGPIO_GetPin(SL_BUTTON_BTN0_PIN)) - { -#ifdef DISPLAY_ENABLED - // if LCD is enabled, power down the lcd before setting the M4 to sleep - sl_si91x_hardware_setup(); -#endif - btn0_pressed = false; - /* Configure RAM Usage and Retention Size */ - sl_si91x_m4_sleep_wakeup(); -#if SILABS_LOG_ENABLED - silabsInitLog(); -#endif - } + sl_button_on_change(SL_BUTTON_BTN0_NUMBER, BUTTON_PRESSED); + btn0_pressed = true; + } + if (RSI_NPSSGPIO_GetPin(SL_BUTTON_BTN0_PIN)) + { + btn0_pressed = false; } } -#endif // SLI_SI91X_MCU_INTERFACE + +/** + * @brief Checks if the Wi-Fi module is ready for sleep. + * + * This function checks if the Wi-Fi module is ready to enter sleep mode. + * + * @return true if the Wi-Fi module is ready for sleep, false otherwise. + */ +bool wfx_is_sleep_ready() +{ + // BRD4002A board BTN_PRESS is 0 when pressed, release is 1 + // sli_si91x_is_sleep_ready requires OS Scheduler to be active + return ((RSI_NPSSGPIO_GetPin(SL_BUTTON_BTN0_PIN) != 0) && (wfx_rsi.dev_state & WFX_RSI_ST_SLEEP_READY) && + sli_si91x_is_sleep_ready()); +} + +/** + * @brief Sleeps for a specified duration and then wakes up. + * + * This function puts the SI91x host into sleep mode for the specified duration + * in milliseconds and then wakes it up. + * + * @param sleep_time_ms The duration in milliseconds to sleep. + */ +void sl_wfx_host_si91x_sleep(uint16_t * sleep_time_ms) +{ + SL_ASSERT(sleep_time_ms != NULL); + sl_si91x_m4_sleep_wakeup(sleep_time_ms); +} + +#endif // SI917_M4_SLEEP_ENABLED /****************************************************************** * @fn wfx_rsi_power_save() @@ -363,6 +378,13 @@ int32_t wfx_wifi_rsi_init(void) SILABS_LOG("wfx_wifi_rsi_init started"); sl_status_t status; status = sl_wifi_init(&config, NULL, sl_wifi_default_event_handler); +#ifdef SLI_SI91X_MCU_INTERFACE + // TODO: remove this. Added only to monitor how many watch dog reset have happened during testing. + if ((MCU_FSM->MCU_FSM_WAKEUP_STATUS_REG) & BIT(5)) + { + watchdog_reset++; + } +#endif // SLI_SI91X_MCU_INTERFACE if (status != SL_STATUS_OK) { return status; diff --git a/examples/platform/silabs/ldscripts/SiWx917-common.ld b/examples/platform/silabs/ldscripts/SiWx917-common.ld index b0168a06ecf235..f23fecf8950d4c 100644 --- a/examples/platform/silabs/ldscripts/SiWx917-common.ld +++ b/examples/platform/silabs/ldscripts/SiWx917-common.ld @@ -40,7 +40,7 @@ SECTIONS { KEEP(*(.isr_vector)) KEEP(*(.reset_handler)) - *(EXCLUDE_FILE(*sl_si91x_bus.c.o *sl_si91x_driver.c.o *sli_si91x_multithreaded.c.o *rsi_hal_mcu_m4_ram.c.o *rsi_deepsleep_soc.c.o *croutine.c.o *event_groups.c.o *list.c.o *queue.c.o *stream_buffer.c.o *tasks.c.o *timers.c.o *cmsis_os2.c.o *freertos_umm_malloc_host.c.o *malloc_buffers.c.o *sl_rsi_utility.c.o *port.c.o *heap_*.c.o) .text*) + *(EXCLUDE_FILE(*sl_si91x_bus.c.o *sl_si91x_driver.c.o *sli_si91x_multithreaded.c.o *rsi_hal_mcu_m4_ram.c.o *rsi_hal_mcu_m4_rom.c.o *rsi_deepsleep_soc.c.o *croutine.c.o *event_groups.c.o *list.c.o *queue.c.o *stream_buffer.c.o *tasks.c.o *timers.c.o *cmsis_os2.c.o *freertos_umm_malloc_host.c.o *malloc_buffers.c.o *sl_rsi_utility.c.o *port.c.o *heap_*.c.o *os_systick.c.o *sl_wifi_if.c.o *sl_si91x_m4_ps.c.o *sl_platform_wireless.c.o) .text*) /* .ctors */ *crtbegin.o(.ctors) @@ -131,7 +131,8 @@ SECTIONS *sl_si91x_driver.c.o(.text*) *sli_si91x_multithreaded.c.o(.text*) *rsi_hal_mcu_m4_ram.c.o(.text*) - *rsi_deepsleep_soc.c.o(.text*) + *rsi_hal_mcu_m4_rom.c.o(.text*) + *rsi_deepsleep_soc.c.o(.text*) *croutine.c.o(.text*) *event_groups.c.o(.text*) *list.c.o(.text*) @@ -145,6 +146,10 @@ SECTIONS *sl_rsi_utility.c.o(.text*) *port.c.o(.text*) *heap_*.c.o(.text*) + *os_systick.c.o(.text*) + *sl_wifi_if.c.o(.text*) + *sl_si91x_m4_ps.c.o(.text*) + *sl_platform_wireless.c.o(.text*) . = ALIGN(4); /* preinit data */ @@ -252,4 +257,3 @@ SECTIONS app_flash_end = 0x8202000 + 0x1fe000; ASSERT( (linker_nvm_begin + SIZEOF(.nvm)) <= app_flash_end, "NVM3 is excessing the flash size !") } - diff --git a/examples/platform/silabs/matter-platform.slcp b/examples/platform/silabs/matter-platform.slcp index 3e1c52a6ec66f5..4f5d1ef2c05064 100644 --- a/examples/platform/silabs/matter-platform.slcp +++ b/examples/platform/silabs/matter-platform.slcp @@ -27,7 +27,7 @@ include: file_list: - {path: app.h} - {path: reset_util.h} -sdk: {id: gecko_sdk, version: 4.3.1} +sdk: {id: gecko_sdk, version: 4.4.2} toolchain_settings: [] component: diff --git a/integrations/cloudbuild/smoke-test.yaml b/integrations/cloudbuild/smoke-test.yaml index 5003d089257366..de4d5d9b36e3fe 100644 --- a/integrations/cloudbuild/smoke-test.yaml +++ b/integrations/cloudbuild/smoke-test.yaml @@ -66,7 +66,7 @@ steps: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:47" + - name: "ghcr.io/project-chip/chip-build-vscode:49" id: EFR32 env: - PW_ENVIRONMENT_ROOT=/pwenv diff --git a/src/platform/silabs/SiWx917/BUILD.gn b/src/platform/silabs/SiWx917/BUILD.gn index c0efdd6eab6a97..2eee75de7ba3bd 100644 --- a/src/platform/silabs/SiWx917/BUILD.gn +++ b/src/platform/silabs/SiWx917/BUILD.gn @@ -73,7 +73,10 @@ static_library("SiWx917") { ] } - public_deps = [ "${chip_root}/src/platform:platform_base" ] + public_deps = [ + "${chip_root}/src/app/icd/server:icd-server-config", + "${chip_root}/src/platform:platform_base", + ] deps = [ "${chip_root}/src/platform/logging:headers" ] # Add platform crypto implementation diff --git a/src/platform/silabs/SiWx917/wifi/wfx_notify.cpp b/src/platform/silabs/SiWx917/wifi/wfx_notify.cpp index ac5e8c304f5dcf..60ee45dee13e99 100644 --- a/src/platform/silabs/SiWx917/wifi/wfx_notify.cpp +++ b/src/platform/silabs/SiWx917/wifi/wfx_notify.cpp @@ -35,9 +35,7 @@ #ifdef __cplusplus extern "C" { #endif -#include "sl_si91x_m4_ps.h" -extern "C" uint8_t m4_alarm_initialization_done; -extern "C" void set_alarm_interrupt_timer(uint16_t interval); + #ifdef __cplusplus } #endif @@ -203,12 +201,6 @@ void wfx_ip_changed_notify(int got_ip) ********************************************************************************************/ void wfx_retry_interval_handler(bool is_wifi_disconnection_event, uint16_t retryJoin) { -#if SL_ICD_ENABLED - if (m4_alarm_initialization_done == false) - { - initialize_m4_alarm(); - } -#endif // SL_ICD_ENABLED if (!is_wifi_disconnection_event) { /* After the reboot or a commissioning time device failed to connect with AP. @@ -221,18 +213,10 @@ void wfx_retry_interval_handler(bool is_wifi_disconnection_event, uint16_t retry // TODO: cleanup the retry logic MATTER-1921 if (!chip::Server::GetInstance().GetCommissioningWindowManager().IsCommissioningWindowOpen()) { - set_alarm_interrupt_timer(WLAN_RETRY_TIMER_MS / 1000); wfx_rsi_power_save(RSI_SLEEP_MODE_8, STANDBY_POWER_SAVE_WITH_RAM_RETENTION); - // TODO: remove this once TICKLESS_IDLE is applied. MATTER-3134 - sl_wfx_host_si91x_sleep_wakeup(); } - else - { - vTaskDelay(pdMS_TO_TICKS(WLAN_RETRY_TIMER_MS)); - } -#else - vTaskDelay(pdMS_TO_TICKS(WLAN_RETRY_TIMER_MS)); #endif // SL_ICD_ENABLED + vTaskDelay(pdMS_TO_TICKS(WLAN_RETRY_TIMER_MS)); } else { @@ -252,13 +236,9 @@ void wfx_retry_interval_handler(bool is_wifi_disconnection_event, uint16_t retry } SILABS_LOG("wfx_retry_interval_handler : Next attempt after %d Seconds", CONVERT_MS_TO_SEC(retryInterval)); #if SL_ICD_ENABLED - set_alarm_interrupt_timer(retryInterval / 1000); wfx_rsi_power_save(RSI_SLEEP_MODE_8, STANDBY_POWER_SAVE_WITH_RAM_RETENTION); - // TODO: remove this once TICKLESS_IDLE is applied. MATTER-3134 - sl_wfx_host_si91x_sleep_wakeup(); -#else - vTaskDelay(pdMS_TO_TICKS(retryInterval)); #endif // SL_ICD_ENABLED + vTaskDelay(pdMS_TO_TICKS(retryInterval)); retryInterval += retryInterval; } } diff --git a/src/platform/silabs/platformAbstraction/WiseMcuSpam.cpp b/src/platform/silabs/platformAbstraction/WiseMcuSpam.cpp index ba957671e6c166..1d4456a53868d3 100644 --- a/src/platform/silabs/platformAbstraction/WiseMcuSpam.cpp +++ b/src/platform/silabs/platformAbstraction/WiseMcuSpam.cpp @@ -20,9 +20,11 @@ #include <FreeRTOS.h> #include <task.h> +#include <app/icd/server/ICDServerConfig.h> + #if SILABS_LOG_ENABLED #include "silabs_utils.h" -#endif +#endif // SILABS_LOG_ENABLED // TODO add includes ? extern "C" { @@ -33,13 +35,12 @@ extern "C" { #include "sl_si91x_button_pin_config.h" #include "sl_si91x_led.h" #include "sl_si91x_led_config.h" + +#if CHIP_CONFIG_ENABLE_ICD_SERVER == 0 void soc_pll_config(void); +#endif // CHIP_CONFIG_ENABLE_ICD_SERVER } -#if SILABS_LOG_ENABLED -#include "silabs_utils.h" -#endif - #ifdef SL_CATALOG_SYSTEMVIEW_TRACE_PRESENT #include "SEGGER_SYSVIEW.h" #endif @@ -47,11 +48,12 @@ void soc_pll_config(void); namespace chip { namespace DeviceLayer { namespace Silabs { -#if SL_ICD_ENABLED namespace { +uint8_t sButtonStates[SL_SI91x_BUTTON_COUNT] = { 0 }; +#if CHIP_CONFIG_ENABLE_ICD_SERVER bool btn0_pressed = false; -} #endif /* SL_ICD_ENABLED */ +} // namespace SilabsPlatform SilabsPlatform::sSilabsPlatformAbstractionManager; SilabsPlatform::SilabsButtonCb SilabsPlatform::mButtonCallback = nullptr; @@ -63,10 +65,10 @@ CHIP_ERROR SilabsPlatform::Init(void) // TODO: Setting the highest priority for SVCall_IRQn to avoid the HardFault issue NVIC_SetPriority(SVCall_IRQn, CORE_INTERRUPT_HIGHEST_PRIORITY); -#ifndef SL_ICD_ENABLED +#if CHIP_CONFIG_ENABLE_ICD_SERVER == 0 // Configuration the clock rate soc_pll_config(); -#endif +#endif // CHIP_CONFIG_ENABLE_ICD_SERVER #if SILABS_LOG_ENABLED silabsInitLog(); @@ -143,6 +145,10 @@ void sl_button_on_change(uint8_t btn, uint8_t btnAction) return; } + if (btn < SL_SI91x_BUTTON_COUNT) + { + sButtonStates[btn] = btnAction; + } Silabs::GetPlatform().mButtonCallback(btn, btnAction); } } diff --git a/third_party/silabs/SiWx917_sdk.gni b/third_party/silabs/SiWx917_sdk.gni index 00e077d41da221..48abc728a4bf50 100644 --- a/third_party/silabs/SiWx917_sdk.gni +++ b/third_party/silabs/SiWx917_sdk.gni @@ -26,10 +26,13 @@ examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917" declare_args() { # Enable the Alarm Based Wakeup for 917 SoC when sleep is enabled - si91x_alarm_based_wakeup = false + si91x_alarm_based_periodic_wakeup = false # Periodic time at which the 917 SoC should wakeup si91x_alarm_periodic_time = 30 + + # enable 917 SoC M4 sleep wakeup + si917_m4_sleep_enabled = false } # Defines an siwx917 SDK build target. @@ -206,7 +209,7 @@ template("siwx917_sdk") { "SPI_MULTI_SLAVE=1", "SYSCALLS_WRITE=1", "__STATIC_INLINE=static inline", - "SL_SI91X_SI917_RAM_MEM_CONFIG=2", + "SL_SI91X_SI917_RAM_MEM_CONFIG=3", "SL_SI91x_DUAL_INTERRUPTS_ERRATA=1", "EXT_IRQ_COUNT=75", "FLASH_PAGE_SIZE=1", @@ -221,6 +224,7 @@ template("siwx917_sdk") { "SLI_SI91X_MCU_ENABLE_IPMU_APIS=1", "RADIO_CONFIG_DMP_SUPPORT=1", "configUSE_POSIX_ERRNO=1", + "NVM3_LOCK_OVERRIDE=1", ] if (silabs_log_enabled && chip_logging) { @@ -271,6 +275,8 @@ template("siwx917_sdk") { "SI91X_SYSRTC_COUNT=1", "SYSCALLS_WRITE", "SPI_MULTI_SLAVE", + "SL_ULP_TIMER", + "SL_SLEEP_TIMER", ] } @@ -288,12 +294,17 @@ template("siwx917_sdk") { "SL_ICD_SUPPORTED_CLIENTS_PER_FABRIC=${sl_icd_supported_clients_per_fabric}", "SL_SI91X_MCU_WIRELESS_BASED_WAKEUP=1", "SL_SI91X_MCU_BUTTON_BASED_WAKEUP=1", + "SL_SI91X_MCU_ALARM_BASED_WAKEUP=1", ] - if (si91x_alarm_based_wakeup) { + if (si91x_alarm_based_periodic_wakeup) { + defines += [ "ALARM_PERIODIC_TIME=${si91x_alarm_periodic_time}" ] + } + + if (si917_m4_sleep_enabled) { defines += [ - "SL_SI91X_MCU_ALARM_BASED_WAKEUP=1", - "ALARM_PERIODIC_TIME=${si91x_alarm_periodic_time}", + "SI917_M4_SLEEP_ENABLED=1", + "XTAL_OFF", ] } } @@ -532,7 +543,7 @@ template("siwx917_sdk") { if (chip_enable_icd_server) { sources += [ - "${sdk_support_root}/matter/si91x/siwx917/BRD4338A/support/src/sl_si91x_m4_ps.c", + "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/sl_si91x_m4_ps.c", "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/systemlevel/src/rsi_rtc.c", "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/systemlevel/src/rsi_time_period.c", ] diff --git a/third_party/silabs/gecko_sdk b/third_party/silabs/gecko_sdk index 911f6cdefccbae..e359ba40a2ba5b 160000 --- a/third_party/silabs/gecko_sdk +++ b/third_party/silabs/gecko_sdk @@ -1 +1 @@ -Subproject commit 911f6cdefccbae03bc66e8c790ceb7e67ca07417 +Subproject commit e359ba40a2ba5b127964a6e7afe9e70ff5f9a1cf diff --git a/third_party/silabs/matter_support b/third_party/silabs/matter_support index 0dbd0dd89fa90d..56d4d4ec0dea03 160000 --- a/third_party/silabs/matter_support +++ b/third_party/silabs/matter_support @@ -1 +1 @@ -Subproject commit 0dbd0dd89fa90dc6e0d1d2636563ea980c010c19 +Subproject commit 56d4d4ec0dea032302f52632c15d4d7813f8e9f5 diff --git a/third_party/silabs/wifi_sdk b/third_party/silabs/wifi_sdk index 00dd57a85e0982..aa514d4fac4b56 160000 --- a/third_party/silabs/wifi_sdk +++ b/third_party/silabs/wifi_sdk @@ -1 +1 @@ -Subproject commit 00dd57a85e0982f85a41d029e15050479f69256b +Subproject commit aa514d4fac4b568d03e1f6d3d19c7811034d5077 From ee53359d97a9eb6a83738425617ed3df239c2909 Mon Sep 17 00:00:00 2001 From: cdj <45139296+DejinChen@users.noreply.github.com> Date: Tue, 30 Apr 2024 08:33:10 +0800 Subject: [PATCH 077/124] Add custom MRP configs for the esp platform (#33215) --- config/esp32/components/chip/Kconfig | 58 +++++++++++++++++++++++++ src/platform/ESP32/CHIPPlatformConfig.h | 34 +++++++++++++++ 2 files changed, 92 insertions(+) diff --git a/config/esp32/components/chip/Kconfig b/config/esp32/components/chip/Kconfig index 47ceceffe2f94d..5998b220ba2fe5 100644 --- a/config/esp32/components/chip/Kconfig +++ b/config/esp32/components/chip/Kconfig @@ -1229,4 +1229,62 @@ menu "CHIP Device Layer" endmenu + menu "Message Reliable Protocol Options" + config MRP_LOCAL_ACTIVE_RETRY_INTERVAL_FOR_THREAD + int "MRP local active retry interval for Thread network in milliseconds" + depends on OPENTHREAD_ENABLED + range 0 3600000 + default 800 + help + Base retry interval of the present Thread node when it is in the active state. + + config MRP_LOCAL_ACTIVE_RETRY_INTERVAL_FOR_WIFI_ETHERNET + int "MRP local active retry interval for WIFI or ETHERNET network in milliseconds" + depends on !OPENTHREAD_ENABLED + range 0 3600000 + default 300 + help + Base retry interval of the present node (WIFI or ETHERNET) when it is in the active state. + + config MRP_LOCAL_IDLE_RETRY_INTERVAL_FOR_THREAD + int "MRP local idle retry interval for Thread network in milliseconds" + depends on OPENTHREAD_ENABLED + range 0 3600000 + default 800 + help + Base retry interval of the present Thread node when it is in the idle state. + + config MRP_LOCAL_IDLE_RETRY_INTERVAL_FOR_WIFI_ETHERNET + int "MRP local idle retry interval for WIFI or ETHERNET network in milliseconds" + depends on !OPENTHREAD_ENABLED + range 0 3600000 + default 500 + help + Base retry interval of the present node (WIFI or ETHERNET) when it is in the idle state. + + config MRP_RETRY_INTERVAL_SENDER_BOOST_FOR_THREAD + int "MRP retransmission delta timeout for Thread network in milliseconds" + depends on OPENTHREAD_ENABLED + range 0 3600000 + default 500 + help + A constant value added to the calculated retransmission timeout. + + config MRP_RETRY_INTERVAL_SENDER_BOOST_FOR_WIFI_ETHERNET + int "MRP retransmission delta timeout for WIFI or ETHERNET network in milliseconds" + depends on !OPENTHREAD_ENABLED + range 0 3600000 + default 0 + help + A constant value added to the calculated retransmission timeout. + + config MRP_MAX_RETRANS + int "MRP retransmission maximum count" + range 1 10 + default 4 + help + The maximum number of retransmissions before giving up. + + endmenu + endmenu diff --git a/src/platform/ESP32/CHIPPlatformConfig.h b/src/platform/ESP32/CHIPPlatformConfig.h index d9012d41da58a8..bed7cb02357b3e 100644 --- a/src/platform/ESP32/CHIPPlatformConfig.h +++ b/src/platform/ESP32/CHIPPlatformConfig.h @@ -107,3 +107,37 @@ // Enable CONFIG_BUILD_FOR_HOST_UNIT_TEST when building CHIP test binaries #define CONFIG_BUILD_FOR_HOST_UNIT_TEST 1 #endif + +#ifndef CHIP_CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL +#if CHIP_ENABLE_OPENTHREAD +#define CHIP_CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL \ + chip::System::Clock::Milliseconds32(CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL_FOR_THREAD) +#else +#define CHIP_CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL \ + chip::System::Clock::Milliseconds32(CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL_FOR_WIFI_ETHERNET) +#endif // CHIP_ENABLE_OPENTHREAD +#endif // CHIP_CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL + +#ifndef CHIP_CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL +#if CHIP_ENABLE_OPENTHREAD +#define CHIP_CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL \ + chip::System::Clock::Milliseconds32(CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL_FOR_THREAD) +#else +#define CHIP_CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL \ + chip::System::Clock::Milliseconds32(CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL_FOR_WIFI_ETHERNET) +#endif // CHIP_ENABLE_OPENTHREAD +#endif // CHIP_CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL + +#ifndef CHIP_CONFIG_MRP_RETRY_INTERVAL_SENDER_BOOST +#if CHIP_ENABLE_OPENTHREAD +#define CHIP_CONFIG_MRP_RETRY_INTERVAL_SENDER_BOOST \ + chip::System::Clock::Milliseconds32(CONFIG_MRP_RETRY_INTERVAL_SENDER_BOOST_FOR_THREAD) +#else +#define CHIP_CONFIG_MRP_RETRY_INTERVAL_SENDER_BOOST \ + chip::System::Clock::Milliseconds32(CONFIG_MRP_RETRY_INTERVAL_SENDER_BOOST_FOR_WIFI_ETHERNET) +#endif // CHIP_ENABLE_OPENTHREAD +#endif // CHIP_CONFIG_MRP_RETRY_INTERVAL_SENDER_BOOST + +#ifndef CHIP_CONFIG_RMP_DEFAULT_MAX_RETRANS +#define CHIP_CONFIG_RMP_DEFAULT_MAX_RETRANS CONFIG_MRP_MAX_RETRANS +#endif // CHIP_CONFIG_RMP_DEFAULT_MAX_RETRANS From 85d4114162e5d293c71d6840c8115d7d61d8a111 Mon Sep 17 00:00:00 2001 From: Karsten Sperling <113487422+ksperling-apple@users.noreply.github.com> Date: Tue, 30 Apr 2024 12:47:13 +1200 Subject: [PATCH 078/124] Darwin: Add more tests and tidy up MTRSetupPayload (#33234) * Darwin Tests: Make MTRSetupPayload initialization test reliable Also rename the tests to more conventional names. * Add regression test for #31129 * Add regression test for #23357 * Add test for NSSecureCoding support * Darwin: Tidy up MTRSetupPayload headers / includes * Darwin: return nil on error in MTRSetupPayload getAllOptionalVendorData --- src/darwin/Framework/CHIP/MTRSetupPayload.mm | 17 ++-- .../Framework/CHIP/MTRSetupPayload_Internal.h | 27 ++++-- ...m => MTRSetupPayloadInitializationTests.m} | 23 ++--- ...adParserTests.m => MTRSetupPayloadTests.m} | 90 ++++++++++++++++--- .../Matter.xcodeproj/project.pbxproj | 16 ++-- 5 files changed, 129 insertions(+), 44 deletions(-) rename src/darwin/Framework/CHIPTests/{MTRSetupPayloadSerializerTests.m => MTRSetupPayloadInitializationTests.m} (72%) rename src/darwin/Framework/CHIPTests/{MTRSetupPayloadParserTests.m => MTRSetupPayloadTests.m} (72%) diff --git a/src/darwin/Framework/CHIP/MTRSetupPayload.mm b/src/darwin/Framework/CHIP/MTRSetupPayload.mm index 309494e3a01922..11afc2a15c1cde 100644 --- a/src/darwin/Framework/CHIP/MTRSetupPayload.mm +++ b/src/darwin/Framework/CHIP/MTRSetupPayload.mm @@ -1,6 +1,6 @@ /** * - * Copyright (c) 2020 Project CHIP Authors + * Copyright (c) 2020-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. @@ -15,20 +15,21 @@ * limitations under the License. */ -#import "MTRError.h" +#import "MTRSetupPayload_Internal.h" + #import "MTRError_Internal.h" #import "MTRFramework.h" #import "MTROnboardingPayloadParser.h" -#import "MTRSetupPayload_Internal.h" -#import "setup_payload/ManualSetupPayloadGenerator.h" -#import "setup_payload/QRCodeSetupPayloadGenerator.h" -#import <setup_payload/SetupPayload.h> +#include <setup_payload/ManualSetupPayloadGenerator.h> +#include <setup_payload/QRCodeSetupPayloadGenerator.h> +#include <setup_payload/SetupPayload.h> #include <string> @implementation MTROptionalQRCodeInfo @end +MTR_DIRECT_MEMBERS @implementation MTRSetupPayload { chip::SetupPayload _chipSetupPayload; } @@ -182,7 +183,7 @@ - (void)getSerialNumber:(chip::SetupPayload)setupPayload if (error) { *error = [NSError errorWithDomain:MTRErrorDomain code:MTRErrorCodeInvalidArgument userInfo:nil]; } - return @[]; + return nil; } [allOptionalData addObject:info]; } @@ -418,6 +419,7 @@ + (MTRDiscoveryCapabilities)_unboxDiscoveryCapabilities:(nullable NSNumber *)box @end +MTR_DIRECT_MEMBERS @implementation MTROptionalQRCodeInfo (Deprecated) - (NSNumber *)infoType @@ -432,6 +434,7 @@ - (void)setInfoType:(NSNumber *)infoType @end +MTR_DIRECT_MEMBERS @implementation MTRSetupPayload (Deprecated) - (nullable NSNumber *)rendezvousInformation diff --git a/src/darwin/Framework/CHIP/MTRSetupPayload_Internal.h b/src/darwin/Framework/CHIP/MTRSetupPayload_Internal.h index 6cac43e7d5ea4b..a119a4b6e2059f 100644 --- a/src/darwin/Framework/CHIP/MTRSetupPayload_Internal.h +++ b/src/darwin/Framework/CHIP/MTRSetupPayload_Internal.h @@ -1,19 +1,30 @@ -// -// MTRSetupPayload_Internal.h -// MTR -// -// Copyright © 2021 CHIP. All rights reserved. -// - -#import <Foundation/Foundation.h> +/** + * + * Copyright (c) 2021-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 "MTRSetupPayload.h" +#import "MTRDefines_Internal.h" + #ifdef __cplusplus #import <lib/core/Optional.h> #import <setup_payload/SetupPayload.h> #endif +MTR_DIRECT_MEMBERS @interface MTRSetupPayload () #ifdef __cplusplus diff --git a/src/darwin/Framework/CHIPTests/MTRSetupPayloadSerializerTests.m b/src/darwin/Framework/CHIPTests/MTRSetupPayloadInitializationTests.m similarity index 72% rename from src/darwin/Framework/CHIPTests/MTRSetupPayloadSerializerTests.m rename to src/darwin/Framework/CHIPTests/MTRSetupPayloadInitializationTests.m index 61a819f33b961f..ce1f49929f0483 100644 --- a/src/darwin/Framework/CHIPTests/MTRSetupPayloadSerializerTests.m +++ b/src/darwin/Framework/CHIPTests/MTRSetupPayloadInitializationTests.m @@ -13,20 +13,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -// module headers -#import "MTRSetupPayload.h" -// additional includes -#import "MTRError.h" - -// system dependencies +#import <Matter/Matter.h> #import <XCTest/XCTest.h> -@interface MTRSetupPayloadSerializerTests : XCTestCase +@interface MTRSetupPayloadInitializationTests : XCTestCase @end -@implementation MTRSetupPayloadSerializerTests +@implementation MTRSetupPayloadInitializationTests + +- (BOOL)shouldRelaunchBeforeRunningTest +{ + // By having xctest restart the process before each test case we + // ensure that the relevant MTRSetupPayload code paths correctly + // call chip::Platform::MemoryInit(). + // Tests that are not specifically designed to test this should + // be added to MTRSetupPayloadTests to avoid this extra overhead. + return YES; +} - (void)testSetupPayloadBasicQRCodeSerialize { @@ -49,6 +54,4 @@ - (void)testSetupPayloadBasicQRCodeSerialize XCTAssertEqualObjects(qrCode, @"MT:-24J06.H14BK9C7R900"); } -// Make sure to not add any tests that involve parsing setup payloads to this -// file. Those should go in MTRSetupPayloadParserTests.m. @end diff --git a/src/darwin/Framework/CHIPTests/MTRSetupPayloadParserTests.m b/src/darwin/Framework/CHIPTests/MTRSetupPayloadTests.m similarity index 72% rename from src/darwin/Framework/CHIPTests/MTRSetupPayloadParserTests.m rename to src/darwin/Framework/CHIPTests/MTRSetupPayloadTests.m index 8da233967cab33..7060c3ba11599c 100644 --- a/src/darwin/Framework/CHIPTests/MTRSetupPayloadParserTests.m +++ b/src/darwin/Framework/CHIPTests/MTRSetupPayloadTests.m @@ -1,6 +1,3 @@ -// -// MTRSetupPayloadParserTests.m -// MTRQRCodeReaderTests /** * * Copyright (c) 2020 Project CHIP Authors @@ -17,20 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -// module headers -#import "MTRSetupPayload.h" -// additional includes -#import "MTRError.h" - -// system dependencies +#import <Matter/Matter.h> #import <XCTest/XCTest.h> -@interface MTRSetupPayloadParserTests : XCTestCase +@interface MTRSetupPayloadTests : XCTestCase @end -@implementation MTRSetupPayloadParserTests +@implementation MTRSetupPayloadTests - (void)testOnboardingPayloadParser_Manual_NoError { @@ -275,4 +267,80 @@ - (void)testSerialNumberRoundTrip XCTAssertEqualObjects(newPayload.serialNumber, serialNumber); } +- (void)test31129 // https://github.com/project-chip/connectedhomeip/issues/31129 +{ + MTRSetupPayload * payload = [[MTRSetupPayload alloc] initWithSetupPasscode:@99999998 discriminator:@3840]; + XCTAssertNotNil(payload); + // The payload should be representable in at least one of manual or QR format. + XCTAssert(payload.manualEntryCode != nil || [payload qrCodeString:NULL] != nil); +} + +- (void)test23357 // https://github.com/project-chip/connectedhomeip/pull/23357 +{ + // Should return nil for invalid payloads (e.g. invalid passcode "@11111111") + XCTAssertNil([MTRSetupPayload setupPayloadWithOnboardingPayload:@"MT:-24J042C00KMSP0Z800" error:NULL]); + XCTAssertNil([MTRSetupPayload setupPayloadWithOnboardingPayload:@"35191106788" error:NULL]); +} + +- (void)testSecureCodingRoundtrip +{ + NSError * error; + NSMutableArray<MTRSetupPayload *> * payloads = [[NSMutableArray alloc] init]; + for (NSString * string in @[ + @"34970112332", + @"641286075300001000016", + @"MT:M5L90MP500K64J00000", + @"MT:M5L90MP500K64J0A33P0SET70.QT52B.E23-WZE0WISA0DK5N1K8SQ1RYCU1O0" + ]) { + MTRSetupPayload * payload = [MTRSetupPayload setupPayloadWithOnboardingPayload:string error:&error]; + XCTAssertNotNil(payload, @"Error: %@", error); + [payloads addObject:payload]; + } + + // Also test some other payloads that don't have a valid QR / MPC representation + [payloads addObject:[[MTRSetupPayload alloc] init]]; + [payloads addObject:[[MTRSetupPayload alloc] initWithSetupPasscode:@22222222 discriminator:@42]]; + + for (MTRSetupPayload * payload in payloads) { + NSData * data = [NSKeyedArchiver archivedDataWithRootObject:payload requiringSecureCoding:YES error:&error]; + XCTAssertNotNil(data, @"Error: %@", error); + MTRSetupPayload * decoded = [NSKeyedUnarchiver unarchivedObjectOfClass:MTRSetupPayload.class fromData:data error:&error]; + XCTAssertNotNil(decoded, @"Error: %@", error); + + XCTAssertEqualObjects(decoded.version, payload.version); + XCTAssertEqualObjects(decoded.vendorID, payload.vendorID); + XCTAssertEqualObjects(decoded.productID, payload.productID); + XCTAssertEqual(decoded.commissioningFlow, payload.commissioningFlow); + XCTAssertEqual(decoded.discoveryCapabilities, payload.discoveryCapabilities); + XCTAssertEqual(decoded.hasShortDiscriminator, payload.hasShortDiscriminator); + XCTAssertEqualObjects(decoded.discriminator, payload.discriminator); + XCTAssertEqualObjects(decoded.setupPasscode, payload.setupPasscode); + XCTAssertEqualObjects(decoded.serialNumber, payload.serialNumber); + + NSArray<MTROptionalQRCodeInfo *> * payloadVDs = [payload getAllOptionalVendorData:&error]; + XCTAssertNotNil(payloadVDs, @"Error: %@", error); + NSArray<MTROptionalQRCodeInfo *> * decodedVDs = [decoded getAllOptionalVendorData:&error]; + XCTAssertNotNil(decodedVDs, @"Error: %@", error); + +#if 0 // TODO: Encode / decode optional vendor data + // MTROptionalQRCodeInfo does not implement isEqual (yet) + XCTAssertEqual(decodedVDs.count, payloadVDs.count); + for (int i = 0; i < decodedVDs.count; i++){ + MTROptionalQRCodeInfo * decodedVD = decodedVDs[i]; + MTROptionalQRCodeInfo * payloadVD = payloadVDs[i]; + XCTAssertEqual(decodedVD.type, payloadVD.type); + XCTAssertEqualObjects(decodedVD.tag, payloadVD.tag); + XCTAssertEqualObjects(decodedVD.integerValue, payloadVD.integerValue); + XCTAssertEqualObjects(decodedVD.stringValue, payloadVD.stringValue); + } +#endif + + // Note that we can't necessarily expect the manualEntryCode and qrCode strings + // we generate here to match the original string, but we should get the same + // output from the decoded and original objects. + XCTAssertEqualObjects([decoded qrCodeString:NULL], [payload qrCodeString:NULL]); + XCTAssertEqualObjects(decoded.manualEntryCode, payload.manualEntryCode); + } +} + @end diff --git a/src/darwin/Framework/Matter.xcodeproj/project.pbxproj b/src/darwin/Framework/Matter.xcodeproj/project.pbxproj index 78ff18793ebd5c..03b0b105f30feb 100644 --- a/src/darwin/Framework/Matter.xcodeproj/project.pbxproj +++ b/src/darwin/Framework/Matter.xcodeproj/project.pbxproj @@ -108,6 +108,7 @@ 3CF134AF289D90FF0017A19E /* MTROperationalCertificateIssuer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CF134AE289D90FF0017A19E /* MTROperationalCertificateIssuer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3D0C484B29DA4FA0006D811F /* MTRErrorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D0C484A29DA4FA0006D811F /* MTRErrorTests.m */; }; 3D3928D72BBCEA3D00CDEBB2 /* MTRAvailabilityTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D3928D62BBCEA3D00CDEBB2 /* MTRAvailabilityTests.m */; settings = {COMPILER_FLAGS = "-UMTR_NO_AVAILABILITY -Wno-unguarded-availability-new"; }; }; + 3D4733AF2BDF1B80003DC19B /* MTRSetupPayloadTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D4733AE2BDF1B80003DC19B /* MTRSetupPayloadTests.m */; }; 3D69868529383096007314E7 /* com.csa.matter.plist in Copy Logging Preferences */ = {isa = PBXBuildFile; fileRef = 3D69868029382EF4007314E7 /* com.csa.matter.plist */; }; 3D843711294977000070D20A /* NSStringSpanConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D84370E294977000070D20A /* NSStringSpanConversion.h */; }; 3D843712294977000070D20A /* MTRCallbackBridgeBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D84370F294977000070D20A /* MTRCallbackBridgeBase.h */; }; @@ -193,7 +194,7 @@ 517BF3F3282B62CB00A8B7DB /* MTRCertificateTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 517BF3F2282B62CB00A8B7DB /* MTRCertificateTests.m */; }; 518D3F832AA132DC008E0007 /* MTRTestPerControllerStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 518D3F812AA132DC008E0007 /* MTRTestPerControllerStorage.m */; }; 518D3F852AA14006008E0007 /* MTRControllerAdvertisingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 518D3F842AA14006008E0007 /* MTRControllerAdvertisingTests.m */; }; - 519498322A25581C00B3BABE /* MTRSetupPayloadSerializerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 519498312A25581C00B3BABE /* MTRSetupPayloadSerializerTests.m */; }; + 519498322A25581C00B3BABE /* MTRSetupPayloadInitializationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 519498312A25581C00B3BABE /* MTRSetupPayloadInitializationTests.m */; }; 51A2F1322A00402A00F03298 /* MTRDataValueParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 51A2F1312A00402A00F03298 /* MTRDataValueParserTests.m */; }; 51B22C1E2740CB0A008D5055 /* MTRStructsObjc.h in Headers */ = {isa = PBXBuildFile; fileRef = 51B22C1D2740CB0A008D5055 /* MTRStructsObjc.h */; settings = {ATTRIBUTES = (Public, ); }; }; 51B22C222740CB1D008D5055 /* MTRCommandPayloadsObjc.h in Headers */ = {isa = PBXBuildFile; fileRef = 51B22C212740CB1D008D5055 /* MTRCommandPayloadsObjc.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -309,7 +310,6 @@ B2E0D7B7245B0B5C003C5B48 /* MTRQRCodeSetupPayloadParser.mm in Sources */ = {isa = PBXBuildFile; fileRef = B2E0D7AE245B0B5C003C5B48 /* MTRQRCodeSetupPayloadParser.mm */; }; B2E0D7B8245B0B5C003C5B48 /* MTRSetupPayload.h in Headers */ = {isa = PBXBuildFile; fileRef = B2E0D7AF245B0B5C003C5B48 /* MTRSetupPayload.h */; settings = {ATTRIBUTES = (Public, ); }; }; B2E0D7B9245B0B5C003C5B48 /* MTRSetupPayload.mm in Sources */ = {isa = PBXBuildFile; fileRef = B2E0D7B0245B0B5C003C5B48 /* MTRSetupPayload.mm */; }; - B2F53AF2245B0DCF0010745E /* MTRSetupPayloadParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = B2F53AF1245B0DCF0010745E /* MTRSetupPayloadParserTests.m */; }; B45373AA2A9FE73400807602 /* WebSocketServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B45373A92A9FE73400807602 /* WebSocketServer.cpp */; }; B45373BD2A9FEA9100807602 /* service.c in Sources */ = {isa = PBXBuildFile; fileRef = B45373B22A9FEA9000807602 /* service.c */; settings = {COMPILER_FLAGS = "-Wno-error -Wno-unreachable-code -Wno-conversion -Wno-format-nonliteral"; }; }; B45373BE2A9FEA9100807602 /* network.c in Sources */ = {isa = PBXBuildFile; fileRef = B45373B32A9FEA9000807602 /* network.c */; settings = {COMPILER_FLAGS = "-Wno-error -Wno-unreachable-code -Wno-conversion -Wno-format-nonliteral"; }; }; @@ -498,6 +498,7 @@ 3CF134AE289D90FF0017A19E /* MTROperationalCertificateIssuer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTROperationalCertificateIssuer.h; sourceTree = "<group>"; }; 3D0C484A29DA4FA0006D811F /* MTRErrorTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTRErrorTests.m; sourceTree = "<group>"; }; 3D3928D62BBCEA3D00CDEBB2 /* MTRAvailabilityTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MTRAvailabilityTests.m; sourceTree = "<group>"; }; + 3D4733AE2BDF1B80003DC19B /* MTRSetupPayloadTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRSetupPayloadTests.m; sourceTree = "<group>"; }; 3D69868029382EF4007314E7 /* com.csa.matter.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = com.csa.matter.plist; sourceTree = "<group>"; }; 3D84370E294977000070D20A /* NSStringSpanConversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSStringSpanConversion.h; sourceTree = "<group>"; }; 3D84370F294977000070D20A /* MTRCallbackBridgeBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRCallbackBridgeBase.h; sourceTree = "<group>"; }; @@ -601,7 +602,7 @@ 518D3F812AA132DC008E0007 /* MTRTestPerControllerStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRTestPerControllerStorage.m; sourceTree = "<group>"; }; 518D3F822AA132DC008E0007 /* MTRTestPerControllerStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRTestPerControllerStorage.h; sourceTree = "<group>"; }; 518D3F842AA14006008E0007 /* MTRControllerAdvertisingTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRControllerAdvertisingTests.m; sourceTree = "<group>"; }; - 519498312A25581C00B3BABE /* MTRSetupPayloadSerializerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRSetupPayloadSerializerTests.m; sourceTree = "<group>"; }; + 519498312A25581C00B3BABE /* MTRSetupPayloadInitializationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRSetupPayloadInitializationTests.m; sourceTree = "<group>"; }; 51A2F1312A00402A00F03298 /* MTRDataValueParserTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRDataValueParserTests.m; sourceTree = "<group>"; }; 51B22C1D2740CB0A008D5055 /* MTRStructsObjc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRStructsObjc.h; sourceTree = "<group>"; }; 51B22C212740CB1D008D5055 /* MTRCommandPayloadsObjc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRCommandPayloadsObjc.h; sourceTree = "<group>"; }; @@ -725,7 +726,6 @@ B2E0D7AE245B0B5C003C5B48 /* MTRQRCodeSetupPayloadParser.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRQRCodeSetupPayloadParser.mm; sourceTree = "<group>"; }; B2E0D7AF245B0B5C003C5B48 /* MTRSetupPayload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRSetupPayload.h; sourceTree = "<group>"; }; B2E0D7B0245B0B5C003C5B48 /* MTRSetupPayload.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRSetupPayload.mm; sourceTree = "<group>"; }; - B2F53AF1245B0DCF0010745E /* MTRSetupPayloadParserTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRSetupPayloadParserTests.m; sourceTree = "<group>"; }; B45373A92A9FE73400807602 /* WebSocketServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebSocketServer.cpp; sourceTree = "<group>"; }; B45373B22A9FEA9000807602 /* service.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = service.c; path = "repo/lib/core-net/service.c"; sourceTree = "<group>"; }; B45373B32A9FEA9000807602 /* network.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = network.c; path = "repo/lib/core-net/network.c"; sourceTree = "<group>"; }; @@ -1390,8 +1390,8 @@ 51742B4D29CB6B88009974FE /* MTRPairingTests.m */, 51E95DF72A78110900A434F0 /* MTRPerControllerStorageTests.m */, 51D0B1292B61766F006E3511 /* MTRServerEndpointTests.m */, - B2F53AF1245B0DCF0010745E /* MTRSetupPayloadParserTests.m */, - 519498312A25581C00B3BABE /* MTRSetupPayloadSerializerTests.m */, + 3D4733AE2BDF1B80003DC19B /* MTRSetupPayloadTests.m */, + 519498312A25581C00B3BABE /* MTRSetupPayloadInitializationTests.m */, 51E0FC0F2ACBBF230001E197 /* MTRSwiftDeviceTests.swift */, 5143851D2A65885500EDC8E6 /* MTRSwiftPairingTests.swift */, 997DED1926955D0200975E97 /* MTRThreadOperationalDatasetTests.mm */, @@ -2000,13 +2000,13 @@ 5AE6D4E427A99041001F2493 /* MTRDeviceTests.m in Sources */, 510CECA8297F72970064E0B3 /* MTROperationalCertificateIssuerTests.m in Sources */, 5A7947DE27BEC3F500434CF2 /* MTRXPCListenerSampleTests.m in Sources */, - B2F53AF2245B0DCF0010745E /* MTRSetupPayloadParserTests.m in Sources */, 3DFCB3292966684500332B35 /* MTRCertificateInfoTests.m in Sources */, 517BF3F3282B62CB00A8B7DB /* MTRCertificateTests.m in Sources */, 5142E39829D377F000A206F0 /* MTROTAProviderTests.m in Sources */, 51E0FC102ACBBF230001E197 /* MTRSwiftDeviceTests.swift in Sources */, + 3D4733AF2BDF1B80003DC19B /* MTRSetupPayloadTests.m in Sources */, 51E24E73274E0DAC007CCF6E /* MTRErrorTestUtils.mm in Sources */, - 519498322A25581C00B3BABE /* MTRSetupPayloadSerializerTests.m in Sources */, + 519498322A25581C00B3BABE /* MTRSetupPayloadInitializationTests.m in Sources */, 51A2F1322A00402A00F03298 /* MTRDataValueParserTests.m in Sources */, 51E95DF82A78110900A434F0 /* MTRPerControllerStorageTests.m in Sources */, 51D9CB0B2BA37DCE0049D6DB /* MTRDSTOffsetTests.m in Sources */, From 3c9f101f793a4ff81b6f32424686a33fe08977af Mon Sep 17 00:00:00 2001 From: Pradip De <pradipd@google.com> Date: Tue, 30 Apr 2024 01:51:50 +0000 Subject: [PATCH 079/124] Disable TCP on the MCU based platforms by default. (#33232) Some of the MCU based platforms had TCP enabled on them without having to use it. Disabling the flag before landing the TCP PR #30339 to avoid increase in code size. We can assess the need to enable TCP on these platforms later. --- config/ameba/args.gni | 2 +- config/beken/args.gni | 2 +- config/esp32/args.gni | 2 +- config/genio/args.gni | 2 +- config/mbed/chip-gn/args.gni | 2 +- examples/lighting-app/beken/args.gni | 2 +- src/platform/ASR/args.gni | 2 +- src/platform/Ameba/args.gni | 2 +- src/platform/Beken/args.gni | 2 +- src/platform/bouffalolab/BL602/args.gni | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/config/ameba/args.gni b/config/ameba/args.gni index a60eee6db2887c..3be47a85291024 100755 --- a/config/ameba/args.gni +++ b/config/ameba/args.gni @@ -28,7 +28,7 @@ lwip_platform = "external" chip_build_tests = false -chip_inet_config_enable_tcp_endpoint = true +chip_inet_config_enable_tcp_endpoint = false chip_inet_config_enable_udp_endpoint = true chip_config_network_layer_ble = true diff --git a/config/beken/args.gni b/config/beken/args.gni index d9bbba606df7ba..018c3e99ad22bc 100755 --- a/config/beken/args.gni +++ b/config/beken/args.gni @@ -26,7 +26,7 @@ lwip_platform = "external" chip_build_tests = false -chip_inet_config_enable_tcp_endpoint = true +chip_inet_config_enable_tcp_endpoint = false chip_inet_config_enable_udp_endpoint = true chip_config_network_layer_ble = true diff --git a/config/esp32/args.gni b/config/esp32/args.gni index c8de67ddc87506..f818a37f258e49 100644 --- a/config/esp32/args.gni +++ b/config/esp32/args.gni @@ -26,7 +26,7 @@ lwip_platform = "external" #Enabling this causes some error #chip_inet_config_enable_tun_endpoint = false -chip_inet_config_enable_tcp_endpoint = true +chip_inet_config_enable_tcp_endpoint = false chip_inet_config_enable_udp_endpoint = true custom_toolchain = "//third_party/connectedhomeip/config/esp32/toolchain:esp32" diff --git a/config/genio/args.gni b/config/genio/args.gni index 50d0a514c10616..c2012d61d0905a 100644 --- a/config/genio/args.gni +++ b/config/genio/args.gni @@ -24,7 +24,7 @@ lwip_platform = "external" chip_build_tests = true -chip_inet_config_enable_tcp_endpoint = true +chip_inet_config_enable_tcp_endpoint = false chip_inet_config_enable_udp_endpoint = true custom_toolchain = "//third_party/connectedhomeip/config/genio/toolchain:genio" diff --git a/config/mbed/chip-gn/args.gni b/config/mbed/chip-gn/args.gni index 83753bc7ca8012..804e9efaea74f6 100644 --- a/config/mbed/chip-gn/args.gni +++ b/config/mbed/chip-gn/args.gni @@ -21,7 +21,7 @@ chip_system_project_config_include = "" chip_device_project_config_include = "" chip_inet_config_enable_udp_endpoint = true -chip_inet_config_enable_tcp_endpoint = true +chip_inet_config_enable_tcp_endpoint = false custom_toolchain = "${chip_root}/config/mbed/chip-gn/toolchain:mbed" mbedtls_target = "${chip_root}/config/mbed/chip-gn/mbedtls:mbedtls" diff --git a/examples/lighting-app/beken/args.gni b/examples/lighting-app/beken/args.gni index 79a52c9890eaca..a999e3ed08f897 100755 --- a/examples/lighting-app/beken/args.gni +++ b/examples/lighting-app/beken/args.gni @@ -29,7 +29,7 @@ lwip_platform = "external" chip_build_tests = false -chip_inet_config_enable_tcp_endpoint = true +chip_inet_config_enable_tcp_endpoint = false chip_inet_config_enable_udp_endpoint = true chip_config_network_layer_ble = true diff --git a/src/platform/ASR/args.gni b/src/platform/ASR/args.gni index 4301315205975a..246fed39f99bb4 100755 --- a/src/platform/ASR/args.gni +++ b/src/platform/ASR/args.gni @@ -25,5 +25,5 @@ lwip_platform = "asr" chip_build_tests = false chip_inet_config_enable_ipv4 = true -chip_inet_config_enable_tcp_endpoint = true +chip_inet_config_enable_tcp_endpoint = false chip_inet_config_enable_udp_endpoint = true diff --git a/src/platform/Ameba/args.gni b/src/platform/Ameba/args.gni index dd6b1bcdb9ca8f..bcda3812b8d781 100755 --- a/src/platform/Ameba/args.gni +++ b/src/platform/Ameba/args.gni @@ -21,5 +21,5 @@ mbedtls_target = "//mbedtls:mbedtls" chip_build_tests = false chip_inet_config_enable_tun_endpoint = false -chip_inet_config_enable_tcp_endpoint = true +chip_inet_config_enable_tcp_endpoint = false chip_inet_config_enable_udp_endpoint = true diff --git a/src/platform/Beken/args.gni b/src/platform/Beken/args.gni index fbc11f681de7aa..6556eaf714d692 100755 --- a/src/platform/Beken/args.gni +++ b/src/platform/Beken/args.gni @@ -21,5 +21,5 @@ mbedtls_target = "//mbedtls:mbedtls" chip_build_tests = false chip_inet_config_enable_tun_endpoint = false -chip_inet_config_enable_tcp_endpoint = true +chip_inet_config_enable_tcp_endpoint = false chip_inet_config_enable_udp_endpoint = true diff --git a/src/platform/bouffalolab/BL602/args.gni b/src/platform/bouffalolab/BL602/args.gni index fbabcea74083b7..7ceb33e9ed68ca 100644 --- a/src/platform/bouffalolab/BL602/args.gni +++ b/src/platform/bouffalolab/BL602/args.gni @@ -29,5 +29,5 @@ lwip_platform = "bl602" chip_build_tests = false chip_inet_config_enable_dns_resolver = false chip_inet_config_enable_tun_endpoint = false -chip_inet_config_enable_tcp_endpoint = true +chip_inet_config_enable_tcp_endpoint = false chip_inet_config_enable_udp_endpoint = true From aec50d4084c97c193074b5a62cc3d3db37f94c15 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky <bzbarsky@apple.com> Date: Mon, 29 Apr 2024 22:00:37 -0400 Subject: [PATCH 080/124] Stop talking about "pairing" in logs. (#33233) "Pairing" means "PASE establishment" sometimes, "commissioning" sometimes. We should not use the term, and just be clearer about which process we mean so people reading logs don't get confused. --- src/controller/SetUpCodePairer.cpp | 2 +- .../Framework/CHIP/MTRDeviceControllerDelegateBridge.mm | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/controller/SetUpCodePairer.cpp b/src/controller/SetUpCodePairer.cpp index cf7ba2abd43d89..4eb107a3711c10 100644 --- a/src/controller/SetUpCodePairer.cpp +++ b/src/controller/SetUpCodePairer.cpp @@ -533,7 +533,7 @@ void SetUpCodePairer::OnPairingComplete(CHIP_ERROR error) if (CHIP_NO_ERROR == error) { - ChipLogProgress(Controller, "Pairing with commissionee successful, stopping discovery"); + ChipLogProgress(Controller, "PASE session established with commissionee. Stopping discovery."); ResetDiscoveryState(); mRemoteId = kUndefinedNodeId; if (pairingDelegate != nullptr) diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerDelegateBridge.mm b/src/darwin/Framework/CHIP/MTRDeviceControllerDelegateBridge.mm index b90921e1924275..4c50f7fd2a7fa4 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerDelegateBridge.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerDelegateBridge.mm @@ -93,7 +93,11 @@ void MTRDeviceControllerDelegateBridge::OnPairingComplete(CHIP_ERROR error) { - MTR_LOG_DEFAULT("DeviceControllerDelegate Pairing complete. Status %s", chip::ErrorStr(error)); + if (error == CHIP_NO_ERROR) { + MTR_LOG_DEFAULT("MTRDeviceControllerDelegate PASE session establishment succeeded."); + } else { + MTR_LOG_ERROR("MTRDeviceControllerDelegate PASE session establishment failed: %" CHIP_ERROR_FORMAT, error.Format()); + } MATTER_LOG_METRIC_END(kMetricSetupPASESession, error); id<MTRDeviceControllerDelegate> strongDelegate = mDelegate; From ffaeaa1827813a1284ff20f9b34898314303df30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damian=20Kr=C3=B3lik?= <66667989+Damian-Nordic@users.noreply.github.com> Date: Tue, 30 Apr 2024 08:59:22 +0200 Subject: [PATCH 081/124] [mrp] Make GetBackoff() use Timeout instead of Timestamp type (#33093) * [mrp] Make GetBackoff() use Timeout instead of Timestamp type All users of ReliableMessageMgr::GetBackoff() seem to assume it takes and returns 32-bit Timeout while it actually takes and returns 64-bit Timestamp. Hence all the users do implicit casts. Replace Timestamp with Timeout in the function's signature and only use 64-bit type for internal calculations to prevent overflowing the underlying integer type. * Restyled by clang-format * Code review --------- Co-authored-by: Restyled.io <commits@restyled.io> --- src/messaging/ReliableMessageMgr.cpp | 26 +-- src/messaging/ReliableMessageMgr.h | 4 +- .../ReliableMessageProtocolConfig.cpp | 5 +- src/messaging/ReliableMessageProtocolConfig.h | 5 +- .../tests/TestReliableMessageProtocol.cpp | 177 +++++++++--------- 5 files changed, 111 insertions(+), 106 deletions(-) diff --git a/src/messaging/ReliableMessageMgr.cpp b/src/messaging/ReliableMessageMgr.cpp index 53e292c9b32b00..3827fd096d5072 100644 --- a/src/messaging/ReliableMessageMgr.cpp +++ b/src/messaging/ReliableMessageMgr.cpp @@ -213,8 +213,8 @@ CHIP_ERROR ReliableMessageMgr::AddToRetransTable(ReliableMessageContext * rc, Re return CHIP_NO_ERROR; } -System::Clock::Timestamp ReliableMessageMgr::GetBackoff(System::Clock::Timestamp baseInterval, uint8_t sendCount, - bool computeMaxPossible) +System::Clock::Timeout ReliableMessageMgr::GetBackoff(System::Clock::Timeout baseInterval, uint8_t sendCount, + bool computeMaxPossible) { // See section "4.11.8. Parameters and Constants" for the parameters below: // MRP_BACKOFF_JITTER = 0.25 @@ -227,14 +227,16 @@ System::Clock::Timestamp ReliableMessageMgr::GetBackoff(System::Clock::Timestamp constexpr uint32_t MRP_BACKOFF_BASE_DENOMINATOR = 10; constexpr int MRP_BACKOFF_THRESHOLD = 1; - // Implement `i = MRP_BACKOFF_MARGIN * i` from section "4.11.2.1. Retransmissions", where: - // i == baseInterval - baseInterval = baseInterval * MRP_BACKOFF_MARGIN_NUMERATOR / MRP_BACKOFF_MARGIN_DENOMINATOR; + // Implement `i = MRP_BACKOFF_MARGIN * i` from section "4.12.2.1. Retransmissions", where: + // i == interval + System::Clock::Milliseconds64 interval = baseInterval; + interval *= MRP_BACKOFF_MARGIN_NUMERATOR; + interval /= MRP_BACKOFF_MARGIN_DENOMINATOR; // Implement: // mrpBackoffTime = i * MRP_BACKOFF_BASE^(max(0,n-MRP_BACKOFF_THRESHOLD)) * (1.0 + random(0,1) * MRP_BACKOFF_JITTER) - // from section "4.11.2.1. Retransmissions", where: - // i == baseInterval + // from section "4.12.2.1. Retransmissions", where: + // i == interval // n == sendCount // 1. Calculate exponent `max(0,n−MRP_BACKOFF_THRESHOLD)` @@ -254,7 +256,7 @@ System::Clock::Timestamp ReliableMessageMgr::GetBackoff(System::Clock::Timestamp backoffDenom *= MRP_BACKOFF_BASE_DENOMINATOR; } - System::Clock::Timestamp mrpBackoffTime = baseInterval * backoffNum / backoffDenom; + System::Clock::Milliseconds64 mrpBackoffTime = interval * backoffNum / backoffDenom; // 3. Calculate `mrpBackoffTime *= (1.0 + random(0,1) * MRP_BACKOFF_JITTER)` uint32_t jitter = MRP_BACKOFF_JITTER_BASE + (computeMaxPossible ? UINT8_MAX : Crypto::GetRandU8()); @@ -273,7 +275,7 @@ System::Clock::Timestamp ReliableMessageMgr::GetBackoff(System::Clock::Timestamp mrpBackoffTime += CHIP_CONFIG_MRP_RETRY_INTERVAL_SENDER_BOOST; #endif // CHIP_DEVICE_CONFIG_ENABLE_DYNAMIC_MRP_CONFIG - return mrpBackoffTime; + return std::chrono::duration_cast<System::Clock::Timeout>(mrpBackoffTime); } void ReliableMessageMgr::StartRetransmision(RetransTableEntry * entry) @@ -463,7 +465,7 @@ CHIP_ERROR ReliableMessageMgr::MapSendError(CHIP_ERROR error, uint16_t exchangeI void ReliableMessageMgr::CalculateNextRetransTime(RetransTableEntry & entry) { - System::Clock::Timestamp baseTimeout = System::Clock::Milliseconds64(0); + System::Clock::Timeout baseTimeout = System::Clock::Timeout(0); // Check if we have received at least one application-level message if (entry.ec->HasReceivedAtLeastOneMessage()) @@ -478,8 +480,8 @@ void ReliableMessageMgr::CalculateNextRetransTime(RetransTableEntry & entry) baseTimeout = entry.ec->GetSessionHandle()->GetMRPBaseTimeout(); } - System::Clock::Timestamp backoff = ReliableMessageMgr::GetBackoff(baseTimeout, entry.sendCount); - entry.nextRetransTime = System::SystemClock().GetMonotonicTimestamp() + backoff; + System::Clock::Timeout backoff = ReliableMessageMgr::GetBackoff(baseTimeout, entry.sendCount); + entry.nextRetransTime = System::SystemClock().GetMonotonicTimestamp() + backoff; } #if CHIP_CONFIG_TEST diff --git a/src/messaging/ReliableMessageMgr.h b/src/messaging/ReliableMessageMgr.h index ae953cbddd5ad5..953de1db0aea40 100644 --- a/src/messaging/ReliableMessageMgr.h +++ b/src/messaging/ReliableMessageMgr.h @@ -112,8 +112,8 @@ class ReliableMessageMgr * * @retval The backoff time value, including jitter. */ - static System::Clock::Timestamp GetBackoff(System::Clock::Timestamp baseInterval, uint8_t sendCount, - bool computeMaxPossible = false); + static System::Clock::Timeout GetBackoff(System::Clock::Timeout baseInterval, uint8_t sendCount, + bool computeMaxPossible = false); /** * Start retranmisttion of cached encryped packet for current entry. diff --git a/src/messaging/ReliableMessageProtocolConfig.cpp b/src/messaging/ReliableMessageProtocolConfig.cpp index e635e91940e0ef..352e89cf4576c1 100644 --- a/src/messaging/ReliableMessageProtocolConfig.cpp +++ b/src/messaging/ReliableMessageProtocolConfig.cpp @@ -125,9 +125,8 @@ Optional<ReliableMessageProtocolConfig> GetLocalMRPConfig() : Optional<ReliableMessageProtocolConfig>::Value(config); } -System::Clock::Timestamp GetRetransmissionTimeout(System::Clock::Timestamp activeInterval, System::Clock::Timestamp idleInterval, - System::Clock::Timestamp lastActivityTime, - System::Clock::Timestamp activityThreshold) +System::Clock::Timeout GetRetransmissionTimeout(System::Clock::Timeout activeInterval, System::Clock::Timeout idleInterval, + System::Clock::Timeout lastActivityTime, System::Clock::Timeout activityThreshold) { auto timeSinceLastActivity = (System::SystemClock().GetMonotonicTimestamp() - lastActivityTime); diff --git a/src/messaging/ReliableMessageProtocolConfig.h b/src/messaging/ReliableMessageProtocolConfig.h index 2ab1c139657fc6..e3255a780b7b70 100644 --- a/src/messaging/ReliableMessageProtocolConfig.h +++ b/src/messaging/ReliableMessageProtocolConfig.h @@ -257,9 +257,8 @@ Optional<ReliableMessageProtocolConfig> GetLocalMRPConfig(); * * @return The maximum transmission time */ -System::Clock::Timestamp GetRetransmissionTimeout(System::Clock::Timestamp activeInterval, System::Clock::Timestamp idleInterval, - System::Clock::Timestamp lastActivityTime, - System::Clock::Timestamp activityThreshold); +System::Clock::Timeout GetRetransmissionTimeout(System::Clock::Timeout activeInterval, System::Clock::Timeout idleInterval, + System::Clock::Timeout lastActivityTime, System::Clock::Timeout activityThreshold); #if CONFIG_BUILD_FOR_HOST_UNIT_TEST diff --git a/src/messaging/tests/TestReliableMessageProtocol.cpp b/src/messaging/tests/TestReliableMessageProtocol.cpp index 7233e45fd846b5..4636193bb06378 100644 --- a/src/messaging/tests/TestReliableMessageProtocol.cpp +++ b/src/messaging/tests/TestReliableMessageProtocol.cpp @@ -232,92 +232,97 @@ struct BackoffComplianceTestVector System::Clock::Timeout backoffMax; }; -struct BackoffComplianceTestVector theBackoffComplianceTestVector[] = { - { - .sendCount = 0, - .backoffBase = System::Clock::Timeout(300), - .backoffMin = System::Clock::Timeout(330), - .backoffMax = System::Clock::Timeout(413), - }, - { - .sendCount = 1, - .backoffBase = System::Clock::Timeout(300), - .backoffMin = System::Clock::Timeout(330), - .backoffMax = System::Clock::Timeout(413), - }, - { - .sendCount = 2, - .backoffBase = System::Clock::Timeout(300), - .backoffMin = System::Clock::Timeout(528), - .backoffMax = System::Clock::Timeout(660), - }, - { - .sendCount = 3, - .backoffBase = System::Clock::Timeout(300), - .backoffMin = System::Clock::Timeout(844), - .backoffMax = System::Clock::Timeout(1057), - }, - { - .sendCount = 4, - .backoffBase = System::Clock::Timeout(300), - .backoffMin = System::Clock::Timeout(1351), - .backoffMax = System::Clock::Timeout(1690), - }, - { - .sendCount = 5, - .backoffBase = System::Clock::Timeout(300), - .backoffMin = System::Clock::Timeout(2162), - .backoffMax = System::Clock::Timeout(2704), - }, - { - .sendCount = 6, - .backoffBase = System::Clock::Timeout(300), - .backoffMin = System::Clock::Timeout(2162), - .backoffMax = System::Clock::Timeout(2704), - }, - { - .sendCount = 0, - .backoffBase = System::Clock::Timeout(4000), - .backoffMin = System::Clock::Timeout(4400), - .backoffMax = System::Clock::Timeout(5500), - }, - { - .sendCount = 1, - .backoffBase = System::Clock::Timeout(4000), - .backoffMin = System::Clock::Timeout(4400), - .backoffMax = System::Clock::Timeout(5500), - }, - { - .sendCount = 2, - .backoffBase = System::Clock::Timeout(4000), - .backoffMin = System::Clock::Timeout(7040), - .backoffMax = System::Clock::Timeout(8800), - }, - { - .sendCount = 3, - .backoffBase = System::Clock::Timeout(4000), - .backoffMin = System::Clock::Timeout(11264), - .backoffMax = System::Clock::Timeout(14081), - }, - { - .sendCount = 4, - .backoffBase = System::Clock::Timeout(4000), - .backoffMin = System::Clock::Timeout(18022), - .backoffMax = System::Clock::Timeout(22529), - }, - { - .sendCount = 5, - .backoffBase = System::Clock::Timeout(4000), - .backoffMin = System::Clock::Timeout(28835), - .backoffMax = System::Clock::Timeout(36045), - }, - { - .sendCount = 6, - .backoffBase = System::Clock::Timeout(4000), - .backoffMin = System::Clock::Timeout(28835), - .backoffMax = System::Clock::Timeout(36045), - }, -}; +struct BackoffComplianceTestVector theBackoffComplianceTestVector[] = { { + .sendCount = 0, + .backoffBase = System::Clock::Timeout(300), + .backoffMin = System::Clock::Timeout(330), + .backoffMax = System::Clock::Timeout(413), + }, + { + .sendCount = 1, + .backoffBase = System::Clock::Timeout(300), + .backoffMin = System::Clock::Timeout(330), + .backoffMax = System::Clock::Timeout(413), + }, + { + .sendCount = 2, + .backoffBase = System::Clock::Timeout(300), + .backoffMin = System::Clock::Timeout(528), + .backoffMax = System::Clock::Timeout(661), + }, + { + .sendCount = 3, + .backoffBase = System::Clock::Timeout(300), + .backoffMin = System::Clock::Timeout(844), + .backoffMax = System::Clock::Timeout(1057), + }, + { + .sendCount = 4, + .backoffBase = System::Clock::Timeout(300), + .backoffMin = System::Clock::Timeout(1351), + .backoffMax = System::Clock::Timeout(1691), + }, + { + .sendCount = 5, + .backoffBase = System::Clock::Timeout(300), + .backoffMin = System::Clock::Timeout(2162), + .backoffMax = System::Clock::Timeout(2705), + }, + { + .sendCount = 6, + .backoffBase = System::Clock::Timeout(300), + .backoffMin = System::Clock::Timeout(2162), + .backoffMax = System::Clock::Timeout(2705), + }, + { + .sendCount = 0, + .backoffBase = System::Clock::Timeout(4000), + .backoffMin = System::Clock::Timeout(4400), + .backoffMax = System::Clock::Timeout(5503), + }, + { + .sendCount = 1, + .backoffBase = System::Clock::Timeout(4000), + .backoffMin = System::Clock::Timeout(4400), + .backoffMax = System::Clock::Timeout(5503), + }, + { + .sendCount = 2, + .backoffBase = System::Clock::Timeout(4000), + .backoffMin = System::Clock::Timeout(7040), + .backoffMax = System::Clock::Timeout(8805), + }, + { + .sendCount = 3, + .backoffBase = System::Clock::Timeout(4000), + .backoffMin = System::Clock::Timeout(11264), + .backoffMax = System::Clock::Timeout(14088), + }, + { + .sendCount = 4, + .backoffBase = System::Clock::Timeout(4000), + .backoffMin = System::Clock::Timeout(18022), + .backoffMax = System::Clock::Timeout(22541), + }, + { + .sendCount = 5, + .backoffBase = System::Clock::Timeout(4000), + .backoffMin = System::Clock::Timeout(28835), + .backoffMax = System::Clock::Timeout(36065), + }, + { + .sendCount = 6, + .backoffBase = System::Clock::Timeout(4000), + .backoffMin = System::Clock::Timeout(28835), + .backoffMax = System::Clock::Timeout(36065), + }, + { + // test theoretical worst-case 1-hour interval + .sendCount = 4, + .backoffBase = System::Clock::Timeout(3'600'000), + .backoffMin = System::Clock::Timeout(16'220'160), + .backoffMax = System::Clock::Timeout(20'286'001), + } }; } // namespace From 416f6a315f286a242e78048039b6525cafaabd74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arkadiusz=20Ba=C5=82ys?= <arkadiusz.balys@nordicsemi.no> Date: Tue, 30 Apr 2024 15:06:04 +0200 Subject: [PATCH 082/124] [OpenThread] Disable IPv6 interface during erasing persistent info. (#33170) Apart from disabling Thread, and erasing Persistent Info, we should disable the IPv6 interface as well and block receiving further packets. Otherwise, if we don't reboot the device after erasing Thread persistent data, we can get a packet and as a result, it causes an assert during processing AES_ECB (because crypto keys have been removed). --- .../OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp index f62b82b4f2d112..1c14aeb91dd21d 100644 --- a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp +++ b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp @@ -1219,6 +1219,7 @@ void GenericThreadStackManagerImpl_OpenThread<ImplClass>::_ErasePersistentInfo(v ChipLogProgress(DeviceLayer, "Erasing Thread persistent info..."); Impl()->LockThreadStack(); otThreadSetEnabled(mOTInst, false); + otIp6SetEnabled(mOTInst, false); otInstanceErasePersistentInfo(mOTInst); Impl()->UnlockThreadStack(); } From 80c19cd805cd8aa5c6e5b2ebccd164fa245a084b Mon Sep 17 00:00:00 2001 From: ying-css <71699179+ying-css@users.noreply.github.com> Date: Tue, 30 Apr 2024 23:05:05 +0800 Subject: [PATCH 083/124] Updated guide for Infineon Trust M provisioning (#33132) * 1)Updated guide for Infineon Trust M provisioning * Update docs/guides/infineon_trustm_provisioning.md Co-authored-by: Andrei Litvin <andy314@gmail.com> * Restyled by prettier-markdown --------- Co-authored-by: Andrei Litvin <andy314@gmail.com> Co-authored-by: Restyled.io <commits@restyled.io> --- .github/.wordlist.txt | 1 + docs/guides/infineon_trustm_provisioning.md | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/.github/.wordlist.txt b/.github/.wordlist.txt index f62685f566c407..33889f519989be 100644 --- a/.github/.wordlist.txt +++ b/.github/.wordlist.txt @@ -905,6 +905,7 @@ MoveWithOnOff MPSL MRP MTD +MTR MTU Multiband Multicast diff --git a/docs/guides/infineon_trustm_provisioning.md b/docs/guides/infineon_trustm_provisioning.md index 1493d75e4a2165..a514c04adcfee8 100644 --- a/docs/guides/infineon_trustm_provisioning.md +++ b/docs/guides/infineon_trustm_provisioning.md @@ -30,7 +30,9 @@ can be used to perform provisioning by following the steps mentioned below. ``` $ cd linux-optiga-trust-m/ - $ ./trustm_installation_aarch64_script.sh + $ git checkout provider_dev + $ git submodule update -f + $ ./provider_installation_script.sh ``` - Run the script to generate Matter test DAC for lock-app using the public key @@ -39,13 +41,13 @@ can be used to perform provisioning by following the steps mentioned below. ``` $ cd scripts/matter_provisioning/ -$ ./matter_dac_provisioning.sh +$ ./matter_test_provisioning.sh ``` _Note:_ -_By running this example matter_dac_provisioning.sh, the steps shown below are -executed:_ +_By running this example `matter_test_provisioning.sh`, the steps shown below +are executed:_ _Step1: Extract the public key from the Infineon pre-provisioned Certificate(0xE0E0) using openssl command._ @@ -55,7 +57,11 @@ _Step2: Generate DAC test certificate using the extracted public key, Signed by Please note that production devices cannot re-use these test keys/certificates. _Step3: Write DAC test certificate into OPTIGA™ Trust M certificate slot -0xE0E0_ +0xE0E0._ -\_Step4: Write Matter test PAI into OPTIGA™ Trust M certificate slot -0xE0E8 and test CD into OPTIGA™ Trust M Arbitrary OID 0xF1E0. +_Step4: Write Matter test PAI into OPTIGA™ Trust M certificate slot 0xE0E8 +and test CD into OPTIGA™ Trust M Arbitrary OID 0xF1E0._ + +For certificate claim and OPTIGA™ Trust M MTR provisioning, please refer +to our +[README for Late-stage Provisioning](https://github.com/Infineon/linux-optiga-trust-m/blob/provider_dev/scripts/matter_provisioning/README.md#certificate-claiming) From 7489e022c0c37d0c88bef732352565bf22266f44 Mon Sep 17 00:00:00 2001 From: feasel <120589145+feasel0@users.noreply.github.com> Date: Tue, 30 Apr 2024 11:08:42 -0400 Subject: [PATCH 084/124] Updated unit tests in src/transport/raw/tests/ to use PW instead of NL. (#33099) * Updated unit tests in src/transport/tests/ to use PW instead of NL. * Updated unit tests in src/protocols/bdx/tests/ to use PW instead of NL * Updated unit tests in src/transport/raw/tests/ to use PW instead of NL. * Undid the accidental reformatting of the comments at the top. * Update src/transport/raw/tests/TestTCP.cpp Co-authored-by: Arkadiusz Bokowy <arkadiusz.bokowy@gmail.com> * Update src/transport/raw/tests/TestUDP.cpp Co-authored-by: Arkadiusz Bokowy <arkadiusz.bokowy@gmail.com> * Changed some EXPECT_ to ASSERT_. Changed C-casts to unsigned literals. Chagned strcmp to EXPECT_STREQ. * Resolved merge conflicts in test_components[_nl].txt * Added a destructor to TestUDP to delete the TestContext. * Added destructor to TestTCP to delete the TestContext. * Added destructor to TestTCP to delete TestContext. * Fixed issue with SystemLayerTests being listed multiple times. * Changed MemoryInit line to ASSERT instead of EXPECT. Added corresponding MemoryShutdown. * Inherited TCP test from IOContext so we don't have to create a new context. * Moved ChckSimpleInitTest and CheckMessageTest into the test context class. --------- Co-authored-by: Arkadiusz Bokowy <arkadiusz.bokowy@gmail.com> --- .../openiotsdk/unit-tests/test_components.txt | 1 + .../unit-tests/test_components_nl.txt | 1 - src/transport/raw/tests/BUILD.gn | 7 +- src/transport/raw/tests/TestMessageHeader.cpp | 300 ++++++++--------- src/transport/raw/tests/TestPeerAddress.cpp | 60 +--- src/transport/raw/tests/TestTCP.cpp | 307 +++++++----------- src/transport/raw/tests/TestUDP.cpp | 140 +++----- 7 files changed, 316 insertions(+), 500 deletions(-) diff --git a/src/test_driver/openiotsdk/unit-tests/test_components.txt b/src/test_driver/openiotsdk/unit-tests/test_components.txt index 2694c2a5afd8fb..e6e64c61106c9a 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components.txt @@ -10,6 +10,7 @@ CoreTests MdnsTests CredentialsTest PlatformTests +RawTransportTests RetransmitTests TestShell SetupPayloadTests 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 d30358d4353c85..93c9c1389e0a5b 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt @@ -2,7 +2,6 @@ AppTests DataModelTests InetLayerTests MessagingLayerTests -RawTransportTests SecureChannelTestsNL SupportTestsNL TransportLayerTests diff --git a/src/transport/raw/tests/BUILD.gn b/src/transport/raw/tests/BUILD.gn index 8adcb9beb7eeee..c655586c5a0e35 100644 --- a/src/transport/raw/tests/BUILD.gn +++ b/src/transport/raw/tests/BUILD.gn @@ -14,10 +14,9 @@ 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") - static_library("helpers") { output_name = "libNetworkTestHelpers" output_dir = "${root_out_dir}/lib" @@ -35,7 +34,7 @@ static_library("helpers") { ] } -chip_test_suite_using_nltest("tests") { +chip_test_suite("tests") { output_name = "libRawTransportTests" test_sources = [ @@ -51,10 +50,8 @@ chip_test_suite_using_nltest("tests") { "${chip_root}/src/lib/core", "${chip_root}/src/lib/support", "${chip_root}/src/lib/support:test_utils", - "${chip_root}/src/lib/support:testing_nlunit", "${chip_root}/src/transport", "${chip_root}/src/transport/raw", - "${nlunit_test_root}:nlunit-test", ] cflags = [ "-Wconversion" ] diff --git a/src/transport/raw/tests/TestMessageHeader.cpp b/src/transport/raw/tests/TestMessageHeader.cpp index 93b1ef65ad6389..436bb887f4616e 100644 --- a/src/transport/raw/tests/TestMessageHeader.cpp +++ b/src/transport/raw/tests/TestMessageHeader.cpp @@ -26,41 +26,40 @@ #include <lib/core/ErrorStr.h> #include <lib/support/CHIPMem.h> #include <lib/support/CodeUtils.h> -#include <lib/support/UnitTestRegistration.h> #include <protocols/Protocols.h> #include <transport/raw/MessageHeader.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> namespace { using namespace chip; -void TestPacketHeaderInitialState(nlTestSuite * inSuite, void * inContext) +TEST(TestMessageHeader, TestPacketHeaderInitialState) { PacketHeader header; - NL_TEST_ASSERT(inSuite, !header.IsSecureSessionControlMsg()); - NL_TEST_ASSERT(inSuite, header.GetMessageCounter() == 0); - NL_TEST_ASSERT(inSuite, header.GetSessionId() == 0); - NL_TEST_ASSERT(inSuite, header.GetSessionType() == Header::SessionType::kUnicastSession); - NL_TEST_ASSERT(inSuite, header.IsSessionTypeValid()); - NL_TEST_ASSERT(inSuite, !header.IsEncrypted()); - NL_TEST_ASSERT(inSuite, !header.GetDestinationNodeId().HasValue()); - NL_TEST_ASSERT(inSuite, !header.GetDestinationGroupId().HasValue()); - NL_TEST_ASSERT(inSuite, !header.GetSourceNodeId().HasValue()); + EXPECT_FALSE(header.IsSecureSessionControlMsg()); + EXPECT_EQ(header.GetMessageCounter(), 0u); + EXPECT_EQ(header.GetSessionId(), 0); + EXPECT_EQ(header.GetSessionType(), Header::SessionType::kUnicastSession); + EXPECT_TRUE(header.IsSessionTypeValid()); + EXPECT_FALSE(header.IsEncrypted()); + EXPECT_FALSE(header.GetDestinationNodeId().HasValue()); + EXPECT_FALSE(header.GetDestinationGroupId().HasValue()); + EXPECT_FALSE(header.GetSourceNodeId().HasValue()); } -void TestPayloadHeaderInitialState(nlTestSuite * inSuite, void * inContext) +TEST(TestMessageHeader, TestPayloadHeaderInitialState) { PayloadHeader header; - NL_TEST_ASSERT(inSuite, header.GetMessageType() == 0); - NL_TEST_ASSERT(inSuite, header.GetExchangeID() == 0); - NL_TEST_ASSERT(inSuite, header.HasProtocol(Protocols::NotSpecified)); + EXPECT_EQ(header.GetMessageType(), 0); + EXPECT_EQ(header.GetExchangeID(), 0); + EXPECT_TRUE(header.HasProtocol(Protocols::NotSpecified)); } -void TestPacketHeaderEncodeDecode(nlTestSuite * inSuite, void * inContext) +TEST(TestMessageHeader, TestPacketHeaderEncodeDecode) { PacketHeader header; uint8_t buffer[64]; @@ -68,117 +67,117 @@ void TestPacketHeaderEncodeDecode(nlTestSuite * inSuite, void * inContext) uint16_t decodeLen; header.SetMessageCounter(123); - NL_TEST_ASSERT(inSuite, header.Encode(buffer, &encodeLen) == CHIP_NO_ERROR); + EXPECT_EQ(header.Encode(buffer, &encodeLen), CHIP_NO_ERROR); // change it to verify decoding header.SetMessageCounter(222).SetSourceNodeId(1).SetDestinationNodeId(2); - NL_TEST_ASSERT(inSuite, header.Decode(buffer, &decodeLen) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, encodeLen == decodeLen); - NL_TEST_ASSERT(inSuite, header.GetMessageCounter() == 123); - NL_TEST_ASSERT(inSuite, !header.GetDestinationNodeId().HasValue()); + EXPECT_EQ(header.Decode(buffer, &decodeLen), CHIP_NO_ERROR); + EXPECT_EQ(encodeLen, decodeLen); + EXPECT_EQ(header.GetMessageCounter(), 123u); + EXPECT_FALSE(header.GetDestinationNodeId().HasValue()); header.SetSourceNodeId(55); - NL_TEST_ASSERT(inSuite, header.Encode(buffer, &encodeLen) == CHIP_NO_ERROR); + EXPECT_EQ(header.Encode(buffer, &encodeLen), CHIP_NO_ERROR); // change it to verify decoding header.SetMessageCounter(222).SetSourceNodeId(1).SetDestinationNodeId(2); - NL_TEST_ASSERT(inSuite, header.Decode(buffer, &decodeLen) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, encodeLen == decodeLen); - NL_TEST_ASSERT(inSuite, header.GetMessageCounter() == 123); - NL_TEST_ASSERT(inSuite, !header.GetDestinationNodeId().HasValue()); - NL_TEST_ASSERT(inSuite, header.GetSourceNodeId() == Optional<uint64_t>::Value(55ull)); + EXPECT_EQ(header.Decode(buffer, &decodeLen), CHIP_NO_ERROR); + EXPECT_EQ(encodeLen, decodeLen); + EXPECT_EQ(header.GetMessageCounter(), 123u); + EXPECT_FALSE(header.GetDestinationNodeId().HasValue()); + EXPECT_EQ(header.GetSourceNodeId(), Optional<uint64_t>::Value(55ull)); header.ClearSourceNodeId().SetDestinationNodeId(11); - NL_TEST_ASSERT(inSuite, header.Encode(buffer, &encodeLen) == CHIP_NO_ERROR); + EXPECT_EQ(header.Encode(buffer, &encodeLen), CHIP_NO_ERROR); // change it to verify decoding header.SetMessageCounter(222).SetSourceNodeId(1).SetDestinationNodeId(2); - NL_TEST_ASSERT(inSuite, header.Decode(buffer, &decodeLen) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, encodeLen == decodeLen); - NL_TEST_ASSERT(inSuite, header.GetMessageCounter() == 123); - NL_TEST_ASSERT(inSuite, header.GetDestinationNodeId() == Optional<uint64_t>::Value(11ull)); - NL_TEST_ASSERT(inSuite, !header.GetSourceNodeId().HasValue()); + EXPECT_EQ(header.Decode(buffer, &decodeLen), CHIP_NO_ERROR); + EXPECT_EQ(encodeLen, decodeLen); + EXPECT_EQ(header.GetMessageCounter(), 123u); + EXPECT_EQ(header.GetDestinationNodeId(), Optional<uint64_t>::Value(11ull)); + EXPECT_FALSE(header.GetSourceNodeId().HasValue()); header.SetMessageCounter(234).SetSourceNodeId(77).SetDestinationNodeId(88); - NL_TEST_ASSERT(inSuite, header.Encode(buffer, &encodeLen) == CHIP_NO_ERROR); + EXPECT_EQ(header.Encode(buffer, &encodeLen), CHIP_NO_ERROR); // change it to verify decoding header.SetMessageCounter(222).SetSourceNodeId(1).SetDestinationNodeId(2); - NL_TEST_ASSERT(inSuite, header.Decode(buffer, &decodeLen) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, encodeLen == decodeLen); - NL_TEST_ASSERT(inSuite, header.GetMessageCounter() == 234); - NL_TEST_ASSERT(inSuite, header.GetDestinationNodeId() == Optional<uint64_t>::Value(88ull)); - NL_TEST_ASSERT(inSuite, header.GetSourceNodeId() == Optional<uint64_t>::Value(77ull)); + EXPECT_EQ(header.Decode(buffer, &decodeLen), CHIP_NO_ERROR); + EXPECT_EQ(encodeLen, decodeLen); + EXPECT_EQ(header.GetMessageCounter(), 234u); + EXPECT_EQ(header.GetDestinationNodeId(), Optional<uint64_t>::Value(88ull)); + EXPECT_EQ(header.GetSourceNodeId(), Optional<uint64_t>::Value(77ull)); header.SetMessageCounter(234).SetSourceNodeId(77).SetDestinationNodeId(88).SetSecureSessionControlMsg(true); - NL_TEST_ASSERT(inSuite, header.Encode(buffer, &encodeLen) == CHIP_NO_ERROR); + EXPECT_EQ(header.Encode(buffer, &encodeLen), CHIP_NO_ERROR); // change it to verify decoding header.SetMessageCounter(222).SetSourceNodeId(1).SetDestinationNodeId(2); - NL_TEST_ASSERT(inSuite, header.Decode(buffer, &decodeLen) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, header.GetMessageCounter() == 234); - NL_TEST_ASSERT(inSuite, header.GetDestinationNodeId() == Optional<uint64_t>::Value(88ull)); - NL_TEST_ASSERT(inSuite, header.GetSourceNodeId() == Optional<uint64_t>::Value(77ull)); - NL_TEST_ASSERT(inSuite, header.IsSecureSessionControlMsg()); + EXPECT_EQ(header.Decode(buffer, &decodeLen), CHIP_NO_ERROR); + EXPECT_EQ(header.GetMessageCounter(), 234u); + EXPECT_EQ(header.GetDestinationNodeId(), Optional<uint64_t>::Value(88ull)); + EXPECT_EQ(header.GetSourceNodeId(), Optional<uint64_t>::Value(77ull)); + EXPECT_TRUE(header.IsSecureSessionControlMsg()); header.SetMessageCounter(234).SetSourceNodeId(77).SetDestinationNodeId(88).SetSessionId(2); - NL_TEST_ASSERT(inSuite, header.Encode(buffer, &encodeLen) == CHIP_NO_ERROR); + EXPECT_EQ(header.Encode(buffer, &encodeLen), CHIP_NO_ERROR); // change it to verify decoding header.SetMessageCounter(222).SetSourceNodeId(1).SetDestinationNodeId(2); - NL_TEST_ASSERT(inSuite, header.Decode(buffer, &decodeLen) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, header.GetMessageCounter() == 234); - NL_TEST_ASSERT(inSuite, header.GetDestinationNodeId() == Optional<uint64_t>::Value(88ull)); - NL_TEST_ASSERT(inSuite, header.GetSourceNodeId() == Optional<uint64_t>::Value(77ull)); - NL_TEST_ASSERT(inSuite, header.IsEncrypted()); - NL_TEST_ASSERT(inSuite, header.GetSessionId() == 2); + EXPECT_EQ(header.Decode(buffer, &decodeLen), CHIP_NO_ERROR); + EXPECT_EQ(header.GetMessageCounter(), 234u); + EXPECT_EQ(header.GetDestinationNodeId(), Optional<uint64_t>::Value(88ull)); + EXPECT_EQ(header.GetSourceNodeId(), Optional<uint64_t>::Value(77ull)); + EXPECT_TRUE(header.IsEncrypted()); + EXPECT_EQ(header.GetSessionId(), 2); header.SetMessageCounter(234).SetSourceNodeId(77).SetDestinationNodeId(88); - NL_TEST_ASSERT(inSuite, header.Encode(buffer, &encodeLen) == CHIP_NO_ERROR); + EXPECT_EQ(header.Encode(buffer, &encodeLen), CHIP_NO_ERROR); // change it to verify decoding header.SetMessageCounter(222).SetSourceNodeId(1).SetDestinationNodeId(2); - NL_TEST_ASSERT(inSuite, header.Decode(buffer, &decodeLen) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, header.GetMessageCounter() == 234); - NL_TEST_ASSERT(inSuite, header.GetDestinationNodeId() == Optional<uint64_t>::Value(88ull)); - NL_TEST_ASSERT(inSuite, header.GetSourceNodeId() == Optional<uint64_t>::Value(77ull)); + EXPECT_EQ(header.Decode(buffer, &decodeLen), CHIP_NO_ERROR); + EXPECT_EQ(header.GetMessageCounter(), 234u); + EXPECT_EQ(header.GetDestinationNodeId(), Optional<uint64_t>::Value(88ull)); + EXPECT_EQ(header.GetSourceNodeId(), Optional<uint64_t>::Value(77ull)); // Verify Group Id helpers header.SetMessageCounter(234).SetSourceNodeId(77).SetDestinationGroupId(45); - NL_TEST_ASSERT(inSuite, header.Encode(buffer, &encodeLen) == CHIP_ERROR_INTERNAL); + EXPECT_EQ(header.Encode(buffer, &encodeLen), CHIP_ERROR_INTERNAL); header.ClearDestinationNodeId(); header.SetSessionType(Header::SessionType::kGroupSession); header.SetFlags(Header::SecFlagValues::kPrivacyFlag); header.SetSecureSessionControlMsg(false); - NL_TEST_ASSERT(inSuite, header.Encode(buffer, &encodeLen) == CHIP_NO_ERROR); + EXPECT_EQ(header.Encode(buffer, &encodeLen), CHIP_NO_ERROR); // change it to verify decoding header.SetMessageCounter(222).SetSourceNodeId(1).SetDestinationGroupId(2); - NL_TEST_ASSERT(inSuite, header.Decode(buffer, &decodeLen) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, header.GetMessageCounter() == 234); - NL_TEST_ASSERT(inSuite, header.GetDestinationGroupId() == Optional<uint16_t>::Value((uint16_t) 45)); - NL_TEST_ASSERT(inSuite, header.GetSourceNodeId() == Optional<uint64_t>::Value(77ull)); - NL_TEST_ASSERT(inSuite, !header.IsSecureSessionControlMsg()); - NL_TEST_ASSERT(inSuite, header.IsValidGroupMsg()); + EXPECT_EQ(header.Decode(buffer, &decodeLen), CHIP_NO_ERROR); + EXPECT_EQ(header.GetMessageCounter(), 234u); + EXPECT_EQ(header.GetDestinationGroupId(), Optional<uint16_t>::Value((uint16_t) 45)); + EXPECT_EQ(header.GetSourceNodeId(), Optional<uint64_t>::Value(77ull)); + EXPECT_FALSE(header.IsSecureSessionControlMsg()); + EXPECT_TRUE(header.IsValidGroupMsg()); // Verify MCSP state header.ClearDestinationGroupId().SetDestinationNodeId(42).SetFlags(Header::SecFlagValues::kPrivacyFlag); header.SetSecureSessionControlMsg(true); - NL_TEST_ASSERT(inSuite, header.Encode(buffer, &encodeLen) == CHIP_NO_ERROR); + EXPECT_EQ(header.Encode(buffer, &encodeLen), CHIP_NO_ERROR); // change it to verify decoding header.SetMessageCounter(222).SetSourceNodeId(1).SetDestinationGroupId(2); - NL_TEST_ASSERT(inSuite, header.Decode(buffer, &decodeLen) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, header.GetDestinationNodeId() == Optional<uint64_t>::Value(42ull)); - NL_TEST_ASSERT(inSuite, !header.HasDestinationGroupId()); - NL_TEST_ASSERT(inSuite, header.HasPrivacyFlag()); - NL_TEST_ASSERT(inSuite, header.IsValidMCSPMsg()); + EXPECT_EQ(header.Decode(buffer, &decodeLen), CHIP_NO_ERROR); + EXPECT_EQ(header.GetDestinationNodeId(), Optional<uint64_t>::Value(42ull)); + EXPECT_FALSE(header.HasDestinationGroupId()); + EXPECT_TRUE(header.HasPrivacyFlag()); + EXPECT_TRUE(header.IsValidMCSPMsg()); } -void TestPayloadHeaderEncodeDecode(nlTestSuite * inSuite, void * inContext) +TEST(TestMessageHeader, TestPayloadHeaderEncodeDecode) { PayloadHeader header; uint8_t buffer[64]; @@ -186,39 +185,39 @@ void TestPayloadHeaderEncodeDecode(nlTestSuite * inSuite, void * inContext) uint16_t decodeLen; header.SetMessageType(Protocols::Id(VendorId::Common, 0), 112).SetExchangeID(2233); - NL_TEST_ASSERT(inSuite, header.GetProtocolID() == Protocols::Id(VendorId::Common, 0)); + EXPECT_EQ(header.GetProtocolID(), Protocols::Id(VendorId::Common, 0)); header.SetMessageType(Protocols::Id(VendorId::Common, 1221), 112).SetExchangeID(2233).SetInitiator(true); - NL_TEST_ASSERT(inSuite, header.Encode(buffer, &encodeLen) == CHIP_NO_ERROR); + EXPECT_EQ(header.Encode(buffer, &encodeLen), CHIP_NO_ERROR); header.SetMessageType(Protocols::Id(VendorId::Common, 4567), 221).SetExchangeID(3322); - NL_TEST_ASSERT(inSuite, header.Decode(buffer, &decodeLen) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, encodeLen == decodeLen); - NL_TEST_ASSERT(inSuite, header.GetMessageType() == 112); - NL_TEST_ASSERT(inSuite, header.GetExchangeID() == 2233); - NL_TEST_ASSERT(inSuite, header.GetProtocolID() == Protocols::Id(VendorId::Common, 1221)); - NL_TEST_ASSERT(inSuite, header.IsInitiator()); + EXPECT_EQ(header.Decode(buffer, &decodeLen), CHIP_NO_ERROR); + EXPECT_EQ(encodeLen, decodeLen); + EXPECT_EQ(header.GetMessageType(), 112); + EXPECT_EQ(header.GetExchangeID(), 2233); + EXPECT_EQ(header.GetProtocolID(), Protocols::Id(VendorId::Common, 1221)); + EXPECT_TRUE(header.IsInitiator()); header.SetMessageType(Protocols::Id(VendorId::Common, 1221), 112).SetExchangeID(2233); - NL_TEST_ASSERT(inSuite, header.Encode(buffer, &encodeLen) == CHIP_NO_ERROR); + EXPECT_EQ(header.Encode(buffer, &encodeLen), CHIP_NO_ERROR); header.SetMessageType(Protocols::Id(VendorId::NotSpecified, 0), 111).SetExchangeID(222); - NL_TEST_ASSERT(inSuite, header.Decode(buffer, &decodeLen) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, encodeLen == decodeLen); - NL_TEST_ASSERT(inSuite, header.GetExchangeID() == 2233); - NL_TEST_ASSERT(inSuite, header.GetProtocolID() == Protocols::Id(VendorId::Common, 1221)); + EXPECT_EQ(header.Decode(buffer, &decodeLen), CHIP_NO_ERROR); + EXPECT_EQ(encodeLen, decodeLen); + EXPECT_EQ(header.GetExchangeID(), 2233); + EXPECT_EQ(header.GetProtocolID(), Protocols::Id(VendorId::Common, 1221)); header.SetMessageType(Protocols::Id(VendorId::NotSpecified, 4567), 221).SetExchangeID(3322); - NL_TEST_ASSERT(inSuite, header.Decode(buffer, &decodeLen) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, encodeLen == decodeLen); - NL_TEST_ASSERT(inSuite, header.GetExchangeID() == 2233); - NL_TEST_ASSERT(inSuite, header.GetProtocolID() == Protocols::Id(VendorId::Common, 1221)); + EXPECT_EQ(header.Decode(buffer, &decodeLen), CHIP_NO_ERROR); + EXPECT_EQ(encodeLen, decodeLen); + EXPECT_EQ(header.GetExchangeID(), 2233); + EXPECT_EQ(header.GetProtocolID(), Protocols::Id(VendorId::Common, 1221)); } -void TestPacketHeaderEncodeDecodeBounds(nlTestSuite * inSuite, void * inContext) +TEST(TestMessageHeader, TestPacketHeaderEncodeDecodeBounds) { PacketHeader header; uint8_t buffer[64] = {}; @@ -226,54 +225,54 @@ void TestPacketHeaderEncodeDecodeBounds(nlTestSuite * inSuite, void * inContext) for (uint16_t shortLen = 0; shortLen < 8; shortLen++) { - NL_TEST_ASSERT(inSuite, header.Encode(buffer, shortLen, &unusedLen) != CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, header.Decode(buffer, shortLen, &unusedLen) != CHIP_NO_ERROR); + EXPECT_NE(header.Encode(buffer, shortLen, &unusedLen), CHIP_NO_ERROR); + EXPECT_NE(header.Decode(buffer, shortLen, &unusedLen), CHIP_NO_ERROR); } // Now check that with 8 bytes we can successfully encode a // default-constructed PacketHeader. static const size_t minLen = 8; uint16_t encoded_len; - NL_TEST_ASSERT(inSuite, header.Encode(buffer, minLen, &encoded_len) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, encoded_len == minLen); + EXPECT_EQ(header.Encode(buffer, minLen, &encoded_len), CHIP_NO_ERROR); + EXPECT_EQ(encoded_len, minLen); // Verify that decoding at any smaller length fails. for (uint16_t shortLen = 0; shortLen < encoded_len; shortLen++) { - NL_TEST_ASSERT(inSuite, header.Decode(buffer, shortLen, &unusedLen) != CHIP_NO_ERROR); + EXPECT_NE(header.Decode(buffer, shortLen, &unusedLen), CHIP_NO_ERROR); } uint16_t decoded_len; - NL_TEST_ASSERT(inSuite, header.Decode(buffer, encoded_len, &decoded_len) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, decoded_len == encoded_len); + EXPECT_EQ(header.Decode(buffer, encoded_len, &decoded_len), CHIP_NO_ERROR); + EXPECT_EQ(decoded_len, encoded_len); // Now test encoding/decoding with a source node id present. header.SetSourceNodeId(1); for (uint16_t shortLen = minLen; shortLen < minLen + 8; shortLen++) { - NL_TEST_ASSERT(inSuite, header.Encode(buffer, shortLen, &unusedLen) != CHIP_NO_ERROR); + EXPECT_NE(header.Encode(buffer, shortLen, &unusedLen), CHIP_NO_ERROR); } - NL_TEST_ASSERT(inSuite, header.Encode(buffer, minLen + 8, &encoded_len) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, encoded_len == minLen + 8); + EXPECT_EQ(header.Encode(buffer, minLen + 8, &encoded_len), CHIP_NO_ERROR); + EXPECT_EQ(encoded_len, minLen + 8); for (uint16_t shortLen = 0; shortLen < encoded_len; shortLen++) { - NL_TEST_ASSERT(inSuite, header.Decode(buffer, shortLen, &unusedLen) != CHIP_NO_ERROR); + EXPECT_NE(header.Decode(buffer, shortLen, &unusedLen), CHIP_NO_ERROR); } - NL_TEST_ASSERT(inSuite, header.Decode(buffer, encoded_len, &decoded_len) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, decoded_len == encoded_len); + EXPECT_EQ(header.Decode(buffer, encoded_len, &decoded_len), CHIP_NO_ERROR); + EXPECT_EQ(decoded_len, encoded_len); // Now test encoding/decoding with a source and destination node id present. header.SetDestinationNodeId(1); for (uint16_t shortLen = minLen; shortLen < minLen + 16; shortLen++) { - NL_TEST_ASSERT(inSuite, header.Encode(buffer, shortLen, &unusedLen) != CHIP_NO_ERROR); + EXPECT_NE(header.Encode(buffer, shortLen, &unusedLen), CHIP_NO_ERROR); } - NL_TEST_ASSERT(inSuite, header.Encode(buffer, minLen + 16, &encoded_len) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, encoded_len == minLen + 16); + EXPECT_EQ(header.Encode(buffer, minLen + 16, &encoded_len), CHIP_NO_ERROR); + EXPECT_EQ(encoded_len, minLen + 16); for (uint16_t shortLen = 0; shortLen < encoded_len; shortLen++) { - NL_TEST_ASSERT(inSuite, header.Decode(buffer, shortLen, &unusedLen) != CHIP_NO_ERROR); + EXPECT_NE(header.Decode(buffer, shortLen, &unusedLen), CHIP_NO_ERROR); } - NL_TEST_ASSERT(inSuite, header.Decode(buffer, encoded_len, &decoded_len) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, decoded_len == encoded_len); + EXPECT_EQ(header.Decode(buffer, encoded_len, &decoded_len), CHIP_NO_ERROR); + EXPECT_EQ(decoded_len, encoded_len); // Now test encoding/decoding with a source node id and destination group id present. header.ClearDestinationNodeId(); @@ -281,19 +280,19 @@ void TestPacketHeaderEncodeDecodeBounds(nlTestSuite * inSuite, void * inContext) header.SetSessionType(Header::SessionType::kGroupSession); for (uint16_t shortLen = minLen; shortLen < minLen + 10; shortLen++) { - NL_TEST_ASSERT(inSuite, header.Encode(buffer, shortLen, &unusedLen) != CHIP_NO_ERROR); + EXPECT_NE(header.Encode(buffer, shortLen, &unusedLen), CHIP_NO_ERROR); } - NL_TEST_ASSERT(inSuite, header.Encode(buffer, minLen + 10, &encoded_len) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, encoded_len == minLen + 10); + EXPECT_EQ(header.Encode(buffer, minLen + 10, &encoded_len), CHIP_NO_ERROR); + EXPECT_EQ(encoded_len, minLen + 10); for (uint16_t shortLen = 0; shortLen < encoded_len; shortLen++) { - NL_TEST_ASSERT(inSuite, header.Decode(buffer, shortLen, &unusedLen) != CHIP_NO_ERROR); + EXPECT_NE(header.Decode(buffer, shortLen, &unusedLen), CHIP_NO_ERROR); } - NL_TEST_ASSERT(inSuite, header.Decode(buffer, encoded_len, &decoded_len) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, decoded_len == encoded_len); + EXPECT_EQ(header.Decode(buffer, encoded_len, &decoded_len), CHIP_NO_ERROR); + EXPECT_EQ(decoded_len, encoded_len); } -void TestPayloadHeaderEncodeDecodeBounds(nlTestSuite * inSuite, void * inContext) +TEST(TestMessageHeader, TestPayloadHeaderEncodeDecodeBounds) { PayloadHeader header; uint8_t buffer[64] = {}; @@ -301,8 +300,8 @@ void TestPayloadHeaderEncodeDecodeBounds(nlTestSuite * inSuite, void * inContext for (uint16_t shortLen = 0; shortLen < 6; shortLen++) { - NL_TEST_ASSERT(inSuite, header.Encode(buffer, shortLen, &unusedLen) != CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, header.Decode(buffer, shortLen, &unusedLen) != CHIP_NO_ERROR); + EXPECT_NE(header.Encode(buffer, shortLen, &unusedLen), CHIP_NO_ERROR); + EXPECT_NE(header.Decode(buffer, shortLen, &unusedLen), CHIP_NO_ERROR); } } @@ -375,7 +374,7 @@ struct SpecComplianceTestVector theSpecComplianceTestVector[] = { }, }; -void TestSpecComplianceEncode(nlTestSuite * inSuite, void * inContext) +TEST(TestMessageHeader, TestSpecComplianceEncode) { uint8_t buffer[MAX_FIXED_HEADER_SIZE]; uint16_t encodeSize; @@ -394,26 +393,26 @@ void TestSpecComplianceEncode(nlTestSuite * inSuite, void * inContext) packetHeader.SetDestinationGroupId(static_cast<GroupId>(testEntry.groupId)); } - NL_TEST_ASSERT(inSuite, packetHeader.Encode(buffer, sizeof(buffer), &encodeSize) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, encodeSize == testEntry.size); - NL_TEST_ASSERT(inSuite, memcmp(buffer, testEntry.encoded, encodeSize) == 0); + EXPECT_EQ(packetHeader.Encode(buffer, sizeof(buffer), &encodeSize), CHIP_NO_ERROR); + EXPECT_EQ(encodeSize, testEntry.size); + EXPECT_EQ(memcmp(buffer, testEntry.encoded, encodeSize), 0); } } -void TestSpecComplianceDecode(nlTestSuite * inSuite, void * inContext) +TEST(TestMessageHeader, TestSpecComplianceDecode) { PacketHeader packetHeader; uint16_t decodeSize; for (const auto & testEntry : theSpecComplianceTestVector) { - NL_TEST_ASSERT(inSuite, packetHeader.Decode(testEntry.encoded, testEntry.size, &decodeSize) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, decodeSize == testEntry.size); - NL_TEST_ASSERT(inSuite, packetHeader.GetMessageFlags() == testEntry.messageFlags); - NL_TEST_ASSERT(inSuite, packetHeader.GetSecurityFlags() == testEntry.securityFlags); - NL_TEST_ASSERT(inSuite, packetHeader.GetSessionId() == testEntry.sessionId); - NL_TEST_ASSERT(inSuite, packetHeader.GetMessageCounter() == testEntry.messageCounter); - NL_TEST_ASSERT(inSuite, packetHeader.IsEncrypted() == testEntry.isSecure); + EXPECT_EQ(packetHeader.Decode(testEntry.encoded, testEntry.size, &decodeSize), CHIP_NO_ERROR); + EXPECT_EQ(decodeSize, testEntry.size); + EXPECT_EQ(packetHeader.GetMessageFlags(), testEntry.messageFlags); + EXPECT_EQ(packetHeader.GetSecurityFlags(), testEntry.securityFlags); + EXPECT_EQ(packetHeader.GetSessionId(), testEntry.sessionId); + EXPECT_EQ(packetHeader.GetMessageCounter(), testEntry.messageCounter); + EXPECT_EQ(packetHeader.IsEncrypted(), testEntry.isSecure); } } @@ -512,49 +511,26 @@ struct TestVectorMsgExtensions theTestVectorMsgExtensions[] = { }, }; -void TestMsgExtensionsDecode(nlTestSuite * inSuite, void * inContext) +TEST(TestMessageHeader, TestMsgExtensionsDecode) { PacketHeader packetHeader; PayloadHeader payloadHeader; uint16_t decodeSize; - NL_TEST_ASSERT(inSuite, chip::Platform::MemoryInit() == CHIP_NO_ERROR); + ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); for (const auto & testEntry : theTestVectorMsgExtensions) { System::PacketBufferHandle msg = System::PacketBufferHandle::NewWithData(testEntry.msg, testEntry.msgLength); - NL_TEST_ASSERT(inSuite, packetHeader.Decode(msg->Start(), msg->DataLength(), &decodeSize) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, decodeSize == testEntry.payloadOffset); + EXPECT_EQ(packetHeader.Decode(msg->Start(), msg->DataLength(), &decodeSize), CHIP_NO_ERROR); + EXPECT_EQ(decodeSize, testEntry.payloadOffset); - NL_TEST_ASSERT(inSuite, payloadHeader.Decode(msg->Start() + decodeSize, msg->DataLength(), &decodeSize) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, decodeSize == testEntry.appPayloadOffset); + EXPECT_EQ(payloadHeader.Decode(msg->Start() + decodeSize, msg->DataLength(), &decodeSize), CHIP_NO_ERROR); + EXPECT_EQ(decodeSize, testEntry.appPayloadOffset); } -} - -} // namespace - -// clang-format off -static const nlTest sTests[] = -{ - NL_TEST_DEF("PacketInitialState", TestPacketHeaderInitialState), - NL_TEST_DEF("PayloadInitialState", TestPayloadHeaderInitialState), - NL_TEST_DEF("PacketEncodeDecode", TestPacketHeaderEncodeDecode), - NL_TEST_DEF("PayloadEncodeDecode", TestPayloadHeaderEncodeDecode), - NL_TEST_DEF("PacketEncodeDecodeBounds", TestPacketHeaderEncodeDecodeBounds), - NL_TEST_DEF("PayloadEncodeDecodeBounds", TestPayloadHeaderEncodeDecodeBounds), - NL_TEST_DEF("SpecComplianceEncode", TestSpecComplianceEncode), - NL_TEST_DEF("SpecComplianceDecode", TestSpecComplianceDecode), - NL_TEST_DEF("TestMsgExtensionsDecode", TestMsgExtensionsDecode), - NL_TEST_SENTINEL() -}; -// clang-format on -int TestMessageHeader() -{ - nlTestSuite theSuite = { "Transport-MessageHeader", &sTests[0], nullptr, nullptr }; - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); + chip::Platform::MemoryShutdown(); } -CHIP_REGISTER_TEST_SUITE(TestMessageHeader) +} // namespace diff --git a/src/transport/raw/tests/TestPeerAddress.cpp b/src/transport/raw/tests/TestPeerAddress.cpp index 6b7f9f886df085..8d82e28ad58eb5 100644 --- a/src/transport/raw/tests/TestPeerAddress.cpp +++ b/src/transport/raw/tests/TestPeerAddress.cpp @@ -24,10 +24,9 @@ #include <inet/IPAddress.h> #include <lib/core/DataModelTypes.h> #include <lib/core/PeerId.h> -#include <lib/support/UnitTestRegistration.h> #include <transport/raw/PeerAddress.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> namespace { @@ -39,27 +38,27 @@ using chip::Transport::PeerAddress; /** * Test correct identification of IPv6 multicast addresses. */ -void TestPeerAddressMulticast(nlTestSuite * inSuite, void * inContext) +TEST(TestPeerAddress, TestPeerAddressMulticast) { constexpr chip::FabricId fabric = 0xa1a2a4a8b1b2b4b8; constexpr chip::GroupId group = 0xe10f; PeerAddress addr = PeerAddress::Multicast(fabric, group); - NL_TEST_ASSERT(inSuite, chip::Transport::Type::kUdp == addr.GetTransportType()); - NL_TEST_ASSERT(inSuite, addr.IsMulticast()); + EXPECT_EQ(chip::Transport::Type::kUdp, addr.GetTransportType()); + EXPECT_TRUE(addr.IsMulticast()); const Inet::IPAddress & ip = addr.GetIPAddress(); - NL_TEST_ASSERT(inSuite, ip.IsIPv6Multicast()); - NL_TEST_ASSERT(inSuite, chip::Inet::IPAddressType::kIPv6 == ip.Type()); + EXPECT_TRUE(ip.IsIPv6Multicast()); + EXPECT_EQ(chip::Inet::IPAddressType::kIPv6, ip.Type()); constexpr uint8_t expected[NL_INET_IPV6_ADDR_LEN_IN_BYTES] = { 0xff, 0x35, 0x00, 0x40, 0xfd, 0xa1, 0xa2, 0xa4, 0xa8, 0xb1, 0xb2, 0xb4, 0xb8, 0x00, 0xe1, 0x0f }; uint8_t result[NL_INET_IPV6_ADDR_LEN_IN_BYTES]; uint8_t * p = result; ip.WriteAddress(p); - NL_TEST_ASSERT(inSuite, !memcmp(expected, result, NL_INET_IPV6_ADDR_LEN_IN_BYTES)); + EXPECT_EQ(0, memcmp(expected, result, NL_INET_IPV6_ADDR_LEN_IN_BYTES)); } -void TestToString(nlTestSuite * inSuite, void * inContext) +TEST(TestPeerAddress, TestToString) { char buff[PeerAddress::kMaxToStringSize]; IPAddress ip; @@ -67,19 +66,19 @@ void TestToString(nlTestSuite * inSuite, void * inContext) IPAddress::FromString("::1", ip); PeerAddress::UDP(ip, 1122).ToString(buff); - NL_TEST_ASSERT(inSuite, !strcmp(buff, "UDP:[::1]:1122")); + EXPECT_STREQ(buff, "UDP:[::1]:1122"); } { IPAddress::FromString("::1", ip); PeerAddress::TCP(ip, 1122).ToString(buff); - NL_TEST_ASSERT(inSuite, !strcmp(buff, "TCP:[::1]:1122")); + EXPECT_STREQ(buff, "TCP:[::1]:1122"); } { PeerAddress::BLE().ToString(buff); - NL_TEST_ASSERT(inSuite, !strcmp(buff, "BLE")); + EXPECT_STREQ(buff, "BLE"); } { @@ -89,7 +88,7 @@ void TestToString(nlTestSuite * inSuite, void * inContext) int res1 = strcmp(buff, "UDP:[1223::3456:789a]:8080"); int res2 = strcmp(buff, "UDP:[1223::3456:789A]:8080"); - NL_TEST_ASSERT(inSuite, (!res1 || !res2)); + EXPECT_TRUE(!res1 || !res2); } { @@ -97,41 +96,8 @@ void TestToString(nlTestSuite * inSuite, void * inContext) PeerAddress udp = PeerAddress(Transport::Type::kUdp); udp.SetPort(5840); udp.ToString(buff); - NL_TEST_ASSERT(inSuite, !strcmp(buff, "UDP:[::]:5840")); + EXPECT_STREQ(buff, "UDP:[::]:5840"); } } -/** - * Test Suite. It lists all the test functions. - */ - -// clang-format off -const nlTest sTests[] = -{ - NL_TEST_DEF("PeerAddress Multicast", TestPeerAddressMulticast), - NL_TEST_DEF("ToString", TestToString), - NL_TEST_SENTINEL() -}; -// clang-format on - } // namespace - -int TestPeerAddress() -{ - // clang-format off - nlTestSuite theSuite = - { - "PeerAddress", - &sTests[0], - nullptr, - nullptr - }; - // clang-format on - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - - return (nlTestRunnerStats(&theSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestPeerAddress) diff --git a/src/transport/raw/tests/TestTCP.cpp b/src/transport/raw/tests/TestTCP.cpp index 620e97ca4325b3..93414e01e3d653 100644 --- a/src/transport/raw/tests/TestTCP.cpp +++ b/src/transport/raw/tests/TestTCP.cpp @@ -27,14 +27,12 @@ #include <lib/core/CHIPEncoding.h> #include <lib/support/CHIPMem.h> #include <lib/support/CodeUtils.h> -#include <lib/support/UnitTestContext.h> -#include <lib/support/UnitTestRegistration.h> #include <lib/support/UnitTestUtils.h> #include <system/SystemLayer.h> #include <transport/TransportMgr.h> #include <transport/raw/TCP.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> #include <errno.h> #include <stdlib.h> @@ -44,19 +42,6 @@ using namespace chip; using namespace chip::Inet; -static int Initialize(void * aContext); -static int Finalize(void * aContext); - -namespace chip { -namespace Transport { -class TCPTest -{ -public: - static void CheckProcessReceivedBuffer(nlTestSuite * inSuite, void * inContext); -}; -} // namespace Transport -} // namespace chip - namespace { constexpr size_t kMaxTcpActiveConnectionCount = 4; @@ -78,9 +63,7 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate public: typedef int (*MessageReceivedCallback)(const uint8_t * message, size_t length, int count, void * data); - MockTransportMgrDelegate(nlTestSuite * inSuite, TestContext & inContext) : - mSuite(inSuite), mContext(inContext), mCallback(nullptr), mCallbackData(nullptr) - {} + MockTransportMgrDelegate(TestContext * inContext) : mContext(inContext), mCallback(nullptr), mCallbackData(nullptr) {} ~MockTransportMgrDelegate() override {} void SetCallback(MessageReceivedCallback callback = nullptr, void * callback_data = nullptr) @@ -92,13 +75,11 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate { PacketHeader packetHeader; - CHIP_ERROR error = packetHeader.DecodeAndConsume(msgBuf); - NL_TEST_ASSERT(mSuite, error == CHIP_NO_ERROR); + EXPECT_EQ(packetHeader.DecodeAndConsume(msgBuf), CHIP_NO_ERROR); if (mCallback) { - int err = mCallback(msgBuf->Start(), msgBuf->DataLength(), mReceiveHandlerCallCount, mCallbackData); - NL_TEST_ASSERT(mSuite, err == 0); + EXPECT_EQ(mCallback(msgBuf->Start(), msgBuf->DataLength(), mReceiveHandlerCallCount, mCallbackData), 0); } mReceiveHandlerCallCount++; @@ -106,7 +87,7 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate void InitializeMessageTest(TCPImpl & tcp, const IPAddress & addr) { - CHIP_ERROR err = tcp.Init(Transport::TcpListenParameters(mContext.GetTCPEndPointManager()).SetAddressType(addr.Type())); + CHIP_ERROR err = tcp.Init(Transport::TcpListenParameters(mContext->GetTCPEndPointManager()).SetAddressType(addr.Type())); // retry a few times in case the port is somehow in use. // this is a WORKAROUND for flaky testing if we run tests very fast after each other. @@ -125,10 +106,10 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate { ChipLogProgress(NotSpecified, "RETRYING tcp initialization"); chip::test_utils::SleepMillis(100); - err = tcp.Init(Transport::TcpListenParameters(mContext.GetTCPEndPointManager()).SetAddressType(addr.Type())); + err = tcp.Init(Transport::TcpListenParameters(mContext->GetTCPEndPointManager()).SetAddressType(addr.Type())); } - NL_TEST_ASSERT(mSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); mTransportMgrBase.SetSessionManager(this); mTransportMgrBase.Init(&tcp); @@ -139,7 +120,7 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate void SingleMessageTest(TCPImpl & tcp, const IPAddress & addr) { chip::System::PacketBufferHandle buffer = chip::System::PacketBufferHandle::NewWithData(PAYLOAD, sizeof(PAYLOAD)); - NL_TEST_ASSERT(mSuite, !buffer.IsNull()); + ASSERT_FALSE(buffer.IsNull()); PacketHeader header; header.SetSourceNodeId(kSourceNodeId).SetDestinationNodeId(kDestinationNodeId).SetMessageCounter(kMessageCounter); @@ -148,14 +129,14 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate const_cast<void *>(static_cast<const void *>(PAYLOAD))); CHIP_ERROR err = header.EncodeBeforeData(buffer); - NL_TEST_ASSERT(mSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Should be able to send a message to itself by just calling send. err = tcp.SendMessage(Transport::PeerAddress::TCP(addr), std::move(buffer)); - NL_TEST_ASSERT(mSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - mContext.DriveIOUntil(chip::System::Clock::Seconds16(5), [this]() { return mReceiveHandlerCallCount != 0; }); - NL_TEST_ASSERT(mSuite, mReceiveHandlerCallCount == 1); + mContext->DriveIOUntil(chip::System::Clock::Seconds16(5), [this]() { return mReceiveHandlerCallCount != 0; }); + EXPECT_EQ(mReceiveHandlerCallCount, 1); SetCallback(nullptr); } @@ -164,14 +145,13 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate { // Disconnect and wait for seeing peer close tcp.Disconnect(Transport::PeerAddress::TCP(addr)); - mContext.DriveIOUntil(chip::System::Clock::Seconds16(5), [&tcp]() { return !tcp.HasActiveConnections(); }); + mContext->DriveIOUntil(chip::System::Clock::Seconds16(5), [&tcp]() { return !tcp.HasActiveConnections(); }); } int mReceiveHandlerCallCount = 0; private: - nlTestSuite * mSuite; - TestContext & mContext; + TestContext * mContext; MessageReceivedCallback mCallback; void * mCallbackData; TransportMgrBase mTransportMgrBase; @@ -179,56 +159,56 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate /////////////////////////// Init test -void CheckSimpleInitTest(nlTestSuite * inSuite, void * inContext, Inet::IPAddressType type) +class TestTCP : public ::testing::Test, public chip::Test::IOContext { - TestContext & ctx = *reinterpret_cast<TestContext *>(inContext); - - TCPImpl tcp; +protected: + void SetUp() { ASSERT_EQ(Init(), CHIP_NO_ERROR); } + void TearDown() { Shutdown(); } - CHIP_ERROR err = tcp.Init(Transport::TcpListenParameters(ctx.GetTCPEndPointManager()).SetAddressType(type)); + void CheckSimpleInitTest(Inet::IPAddressType type) + { + TCPImpl tcp; - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); -} + CHIP_ERROR err = tcp.Init(Transport::TcpListenParameters(GetTCPEndPointManager()).SetAddressType(type)); -#if INET_CONFIG_ENABLE_IPV4 -void CheckSimpleInitTest4(nlTestSuite * inSuite, void * inContext) -{ - CheckSimpleInitTest(inSuite, inContext, IPAddressType::kIPv4); -} -#endif + EXPECT_EQ(err, CHIP_NO_ERROR); + } -void CheckSimpleInitTest6(nlTestSuite * inSuite, void * inContext) -{ - CheckSimpleInitTest(inSuite, inContext, IPAddressType::kIPv6); -} + void CheckMessageTest(const IPAddress & addr) + { + TCPImpl tcp; -/////////////////////////// Messaging test + MockTransportMgrDelegate gMockTransportMgrDelegate(this); + gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr); + gMockTransportMgrDelegate.SingleMessageTest(tcp, addr); + gMockTransportMgrDelegate.FinalizeMessageTest(tcp, addr); + } +}; -void CheckMessageTest(nlTestSuite * inSuite, void * inContext, const IPAddress & addr) +#if INET_CONFIG_ENABLE_IPV4 +TEST_F(TestTCP, CheckSimpleInitTest4) { - TestContext & ctx = *reinterpret_cast<TestContext *>(inContext); - TCPImpl tcp; - - MockTransportMgrDelegate gMockTransportMgrDelegate(inSuite, ctx); - gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr); - gMockTransportMgrDelegate.SingleMessageTest(tcp, addr); - gMockTransportMgrDelegate.FinalizeMessageTest(tcp, addr); + CheckSimpleInitTest(IPAddressType::kIPv4); } -#if INET_CONFIG_ENABLE_IPV4 -void CheckMessageTest4(nlTestSuite * inSuite, void * inContext) +TEST_F(TestTCP, CheckMessageTest4) { IPAddress addr; IPAddress::FromString("127.0.0.1", addr); - CheckMessageTest(inSuite, inContext, addr); + CheckMessageTest(addr); +} +#endif + +TEST_F(TestTCP, CheckSimpleInitTest6) +{ + CheckSimpleInitTest(IPAddressType::kIPv6); } -#endif // INET_CONFIG_ENABLE_IPV4 -void CheckMessageTest6(nlTestSuite * inSuite, void * inContext) +TEST_F(TestTCP, CheckMessageTest6) { IPAddress addr; IPAddress::FromString("::1", addr); - CheckMessageTest(inSuite, inContext, addr); + CheckMessageTest(addr); } // Generates a packet buffer or a chain of packet buffers for a single message. @@ -382,127 +362,84 @@ int TestDataCallbackCheck(const uint8_t * message, size_t length, int count, voi } // namespace -void chip::Transport::TCPTest::CheckProcessReceivedBuffer(nlTestSuite * inSuite, void * inContext) -{ - TestContext & ctx = *reinterpret_cast<TestContext *>(inContext); - TCPImpl tcp; - - IPAddress addr; - IPAddress::FromString("::1", addr); - - MockTransportMgrDelegate gMockTransportMgrDelegate(inSuite, ctx); - gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr); - - // Send a packet to get TCP going, so that we can find a TCPEndPoint to pass to ProcessReceivedBuffer. - // (The current TCPEndPoint implementation is not effectively mockable.) - gMockTransportMgrDelegate.SingleMessageTest(tcp, addr); - - Transport::PeerAddress lPeerAddress = Transport::PeerAddress::TCP(addr); - TCPBase::ActiveConnectionState * state = tcp.FindActiveConnection(lPeerAddress); - NL_TEST_ASSERT(inSuite, state != nullptr); - Inet::TCPEndPoint * lEndPoint = state->mEndPoint; - NL_TEST_ASSERT(inSuite, lEndPoint != nullptr); - - CHIP_ERROR err = CHIP_NO_ERROR; - TestData testData[2]; - gMockTransportMgrDelegate.SetCallback(TestDataCallbackCheck, testData); - - // Test a single packet buffer. - gMockTransportMgrDelegate.mReceiveHandlerCallCount = 0; - NL_TEST_ASSERT(inSuite, testData[0].Init((const uint16_t[]){ 111, 0 })); - err = tcp.ProcessReceivedBuffer(lEndPoint, lPeerAddress, std::move(testData[0].mHandle)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, gMockTransportMgrDelegate.mReceiveHandlerCallCount == 1); - - // Test a message in a chain of three packet buffers. The message length is split across buffers. - gMockTransportMgrDelegate.mReceiveHandlerCallCount = 0; - NL_TEST_ASSERT(inSuite, testData[0].Init((const uint16_t[]){ 1, 122, 123, 0 })); - err = tcp.ProcessReceivedBuffer(lEndPoint, lPeerAddress, std::move(testData[0].mHandle)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, gMockTransportMgrDelegate.mReceiveHandlerCallCount == 1); - - // Test two messages in a chain. - gMockTransportMgrDelegate.mReceiveHandlerCallCount = 0; - NL_TEST_ASSERT(inSuite, testData[0].Init((const uint16_t[]){ 131, 0 })); - NL_TEST_ASSERT(inSuite, testData[1].Init((const uint16_t[]){ 132, 0 })); - testData[0].mHandle->AddToEnd(std::move(testData[1].mHandle)); - err = tcp.ProcessReceivedBuffer(lEndPoint, lPeerAddress, std::move(testData[0].mHandle)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, gMockTransportMgrDelegate.mReceiveHandlerCallCount == 2); - - // Test a chain of two messages, each a chain. - gMockTransportMgrDelegate.mReceiveHandlerCallCount = 0; - NL_TEST_ASSERT(inSuite, testData[0].Init((const uint16_t[]){ 141, 142, 0 })); - NL_TEST_ASSERT(inSuite, testData[1].Init((const uint16_t[]){ 143, 144, 0 })); - testData[0].mHandle->AddToEnd(std::move(testData[1].mHandle)); - err = tcp.ProcessReceivedBuffer(lEndPoint, lPeerAddress, std::move(testData[0].mHandle)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, gMockTransportMgrDelegate.mReceiveHandlerCallCount == 2); - - // Test a message that is too large to coalesce into a single packet buffer. - gMockTransportMgrDelegate.mReceiveHandlerCallCount = 0; - gMockTransportMgrDelegate.SetCallback(TestDataCallbackCheck, &testData[1]); - NL_TEST_ASSERT(inSuite, testData[0].Init((const uint16_t[]){ 51, System::PacketBuffer::kMaxSizeWithoutReserve, 0 })); - // Sending only the first buffer of the long chain. This should be enough to trigger the error. - System::PacketBufferHandle head = testData[0].mHandle.PopHead(); - err = tcp.ProcessReceivedBuffer(lEndPoint, lPeerAddress, std::move(head)); - NL_TEST_ASSERT(inSuite, err == CHIP_ERROR_MESSAGE_TOO_LONG); - NL_TEST_ASSERT(inSuite, gMockTransportMgrDelegate.mReceiveHandlerCallCount == 0); - - gMockTransportMgrDelegate.FinalizeMessageTest(tcp, addr); -} - -// Test Suite -/** - * Test Suite that lists all the test functions. - */ -// clang-format off -static const nlTest sTests[] = -{ -#if INET_CONFIG_ENABLE_IPV4 - NL_TEST_DEF("Simple Init Test IPV4", CheckSimpleInitTest4), - NL_TEST_DEF("Message Self Test IPV4", CheckMessageTest4), -#endif - - NL_TEST_DEF("Simple Init Test IPV6", CheckSimpleInitTest6), - NL_TEST_DEF("Message Self Test IPV6", CheckMessageTest6), - NL_TEST_DEF("ProcessReceivedBuffer Test", chip::Transport::TCPTest::CheckProcessReceivedBuffer), - - NL_TEST_SENTINEL() -}; -// clang-format on - -// clang-format off -static nlTestSuite sSuite = +namespace chip { +namespace Transport { +class TCPTest { - "Test-CHIP-Tcp", - &sTests[0], - Initialize, - Finalize +public: + static void CheckProcessReceivedBuffer(TestContext * ctx) + { + TCPImpl tcp; + + IPAddress addr; + IPAddress::FromString("::1", addr); + + MockTransportMgrDelegate gMockTransportMgrDelegate(ctx); + gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr); + + // Send a packet to get TCP going, so that we can find a TCPEndPoint to pass to ProcessReceivedBuffer. + // (The current TCPEndPoint implementation is not effectively mockable.) + gMockTransportMgrDelegate.SingleMessageTest(tcp, addr); + + Transport::PeerAddress lPeerAddress = Transport::PeerAddress::TCP(addr); + TCPBase::ActiveConnectionState * state = tcp.FindActiveConnection(lPeerAddress); + ASSERT_NE(state, nullptr); + Inet::TCPEndPoint * lEndPoint = state->mEndPoint; + ASSERT_NE(lEndPoint, nullptr); + + CHIP_ERROR err = CHIP_NO_ERROR; + TestData testData[2]; + gMockTransportMgrDelegate.SetCallback(TestDataCallbackCheck, testData); + + // Test a single packet buffer. + gMockTransportMgrDelegate.mReceiveHandlerCallCount = 0; + EXPECT_TRUE(testData[0].Init((const uint16_t[]){ 111, 0 })); + err = tcp.ProcessReceivedBuffer(lEndPoint, lPeerAddress, std::move(testData[0].mHandle)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(gMockTransportMgrDelegate.mReceiveHandlerCallCount, 1); + + // Test a message in a chain of three packet buffers. The message length is split across buffers. + gMockTransportMgrDelegate.mReceiveHandlerCallCount = 0; + EXPECT_TRUE(testData[0].Init((const uint16_t[]){ 1, 122, 123, 0 })); + err = tcp.ProcessReceivedBuffer(lEndPoint, lPeerAddress, std::move(testData[0].mHandle)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(gMockTransportMgrDelegate.mReceiveHandlerCallCount, 1); + + // Test two messages in a chain. + gMockTransportMgrDelegate.mReceiveHandlerCallCount = 0; + EXPECT_TRUE(testData[0].Init((const uint16_t[]){ 131, 0 })); + EXPECT_TRUE(testData[1].Init((const uint16_t[]){ 132, 0 })); + testData[0].mHandle->AddToEnd(std::move(testData[1].mHandle)); + err = tcp.ProcessReceivedBuffer(lEndPoint, lPeerAddress, std::move(testData[0].mHandle)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(gMockTransportMgrDelegate.mReceiveHandlerCallCount, 2); + + // Test a chain of two messages, each a chain. + gMockTransportMgrDelegate.mReceiveHandlerCallCount = 0; + EXPECT_TRUE(testData[0].Init((const uint16_t[]){ 141, 142, 0 })); + EXPECT_TRUE(testData[1].Init((const uint16_t[]){ 143, 144, 0 })); + testData[0].mHandle->AddToEnd(std::move(testData[1].mHandle)); + err = tcp.ProcessReceivedBuffer(lEndPoint, lPeerAddress, std::move(testData[0].mHandle)); + EXPECT_EQ(err, CHIP_NO_ERROR); + EXPECT_EQ(gMockTransportMgrDelegate.mReceiveHandlerCallCount, 2); + + // Test a message that is too large to coalesce into a single packet buffer. + gMockTransportMgrDelegate.mReceiveHandlerCallCount = 0; + gMockTransportMgrDelegate.SetCallback(TestDataCallbackCheck, &testData[1]); + EXPECT_TRUE(testData[0].Init((const uint16_t[]){ 51, System::PacketBuffer::kMaxSizeWithoutReserve, 0 })); + // Sending only the first buffer of the long chain. This should be enough to trigger the error. + System::PacketBufferHandle head = testData[0].mHandle.PopHead(); + err = tcp.ProcessReceivedBuffer(lEndPoint, lPeerAddress, std::move(head)); + EXPECT_EQ(err, CHIP_ERROR_MESSAGE_TOO_LONG); + EXPECT_EQ(gMockTransportMgrDelegate.mReceiveHandlerCallCount, 0); + + gMockTransportMgrDelegate.FinalizeMessageTest(tcp, addr); + } }; -// clang-format on - -/** - * Initialize the test suite. - */ -static int Initialize(void * aContext) -{ - CHIP_ERROR err = reinterpret_cast<TestContext *>(aContext)->Init(); - return (err == CHIP_NO_ERROR) ? SUCCESS : FAILURE; -} - -/** - * Finalize the test suite. - */ -static int Finalize(void * aContext) -{ - reinterpret_cast<TestContext *>(aContext)->Shutdown(); - return SUCCESS; -} +} // namespace Transport +} // namespace chip -int TestTCP() +TEST_F(TestTCP, CheckProcessReceivedBuffer) { - return chip::ExecuteTestsWithContext<TestContext>(&sSuite); + chip::Transport::TCPTest::CheckProcessReceivedBuffer(this); } - -CHIP_REGISTER_TEST_SUITE(TestTCP); diff --git a/src/transport/raw/tests/TestUDP.cpp b/src/transport/raw/tests/TestUDP.cpp index b26d23277d5844..70077a6fa297e9 100644 --- a/src/transport/raw/tests/TestUDP.cpp +++ b/src/transport/raw/tests/TestUDP.cpp @@ -25,21 +25,16 @@ #include <lib/core/CHIPCore.h> #include <lib/support/CodeUtils.h> -#include <lib/support/UnitTestContext.h> -#include <lib/support/UnitTestRegistration.h> #include <transport/TransportMgr.h> #include <transport/raw/UDP.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> #include <errno.h> using namespace chip; using namespace chip::Inet; -static int Initialize(void * aContext); -static int Finalize(void * aContext); - namespace { constexpr NodeId kSourceNodeId = 123654; @@ -54,7 +49,7 @@ int ReceiveHandlerCallCount = 0; class MockTransportMgrDelegate : public TransportMgrDelegate { public: - MockTransportMgrDelegate(nlTestSuite * inSuite) : mSuite(inSuite) {} + MockTransportMgrDelegate() {} ~MockTransportMgrDelegate() override {} void OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msgBuf) override @@ -62,69 +57,57 @@ class MockTransportMgrDelegate : public TransportMgrDelegate PacketHeader packetHeader; CHIP_ERROR err = packetHeader.DecodeAndConsume(msgBuf); - NL_TEST_ASSERT(mSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - NL_TEST_ASSERT(mSuite, packetHeader.GetSourceNodeId() == Optional<NodeId>::Value(kSourceNodeId)); - NL_TEST_ASSERT(mSuite, packetHeader.GetDestinationNodeId() == Optional<NodeId>::Value(kDestinationNodeId)); - NL_TEST_ASSERT(mSuite, packetHeader.GetMessageCounter() == kMessageCounter); + EXPECT_EQ(packetHeader.GetSourceNodeId(), Optional<NodeId>::Value(kSourceNodeId)); + EXPECT_EQ(packetHeader.GetDestinationNodeId(), Optional<NodeId>::Value(kDestinationNodeId)); + EXPECT_EQ(packetHeader.GetMessageCounter(), kMessageCounter); size_t data_len = msgBuf->DataLength(); - int compare = memcmp(msgBuf->Start(), PAYLOAD, data_len); - NL_TEST_ASSERT(mSuite, compare == 0); + EXPECT_EQ(0, memcmp(msgBuf->Start(), PAYLOAD, data_len)); ReceiveHandlerCallCount++; } - -private: - nlTestSuite * mSuite; }; } // namespace /////////////////////////// Init test -void CheckSimpleInitTest(nlTestSuite * inSuite, void * inContext, Inet::IPAddressType type) +class TestUDP : public ::testing::Test { - TestContext & ctx = *reinterpret_cast<TestContext *>(inContext); +protected: + TestUDP() { inContext = new TestContext(); } + ~TestUDP() { delete inContext; } + void SetUp() { ASSERT_EQ(inContext->Init(), CHIP_NO_ERROR); } + void TearDown() { inContext->Shutdown(); } + TestContext * inContext; +}; +void CheckSimpleInitTest(TestContext * ctx, Inet::IPAddressType type) +{ Transport::UDP udp; - CHIP_ERROR err = udp.Init(Transport::UdpListenParameters(ctx.GetUDPEndPointManager()).SetAddressType(type).SetListenPort(0)); + CHIP_ERROR err = udp.Init(Transport::UdpListenParameters(ctx->GetUDPEndPointManager()).SetAddressType(type).SetListenPort(0)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); } -#if INET_CONFIG_ENABLE_IPV4 -void CheckSimpleInitTest4(nlTestSuite * inSuite, void * inContext) +void CheckMessageTest(TestContext * ctx, const IPAddress & addr) { - CheckSimpleInitTest(inSuite, inContext, IPAddressType::kIPv4); -} -#endif - -void CheckSimpleInitTest6(nlTestSuite * inSuite, void * inContext) -{ - CheckSimpleInitTest(inSuite, inContext, IPAddressType::kIPv6); -} - -/////////////////////////// Messaging test - -void CheckMessageTest(nlTestSuite * inSuite, void * inContext, const IPAddress & addr) -{ - TestContext & ctx = *reinterpret_cast<TestContext *>(inContext); - uint16_t payload_len = sizeof(PAYLOAD); chip::System::PacketBufferHandle buffer = chip::System::PacketBufferHandle::NewWithData(PAYLOAD, payload_len); - NL_TEST_ASSERT(inSuite, !buffer.IsNull()); + EXPECT_FALSE(buffer.IsNull()); CHIP_ERROR err = CHIP_NO_ERROR; Transport::UDP udp; - err = udp.Init(Transport::UdpListenParameters(ctx.GetUDPEndPointManager()).SetAddressType(addr.Type()).SetListenPort(0)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + err = udp.Init(Transport::UdpListenParameters(ctx->GetUDPEndPointManager()).SetAddressType(addr.Type()).SetListenPort(0)); + EXPECT_EQ(err, CHIP_NO_ERROR); - MockTransportMgrDelegate gMockTransportMgrDelegate(inSuite); + MockTransportMgrDelegate gMockTransportMgrDelegate; TransportMgrBase gTransportMgrBase; gTransportMgrBase.SetSessionManager(&gMockTransportMgrDelegate); gTransportMgrBase.Init(&udp); @@ -135,82 +118,39 @@ void CheckMessageTest(nlTestSuite * inSuite, void * inContext, const IPAddress & header.SetSourceNodeId(kSourceNodeId).SetDestinationNodeId(kDestinationNodeId).SetMessageCounter(kMessageCounter); err = header.EncodeBeforeData(buffer); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); // Should be able to send a message to itself by just calling send. err = udp.SendMessage(Transport::PeerAddress::UDP(addr, udp.GetBoundPort()), std::move(buffer)); - NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + EXPECT_EQ(err, CHIP_NO_ERROR); - ctx.DriveIOUntil(chip::System::Clock::Seconds16(1), []() { return ReceiveHandlerCallCount != 0; }); + ctx->DriveIOUntil(chip::System::Clock::Seconds16(1), []() { return ReceiveHandlerCallCount != 0; }); - NL_TEST_ASSERT(inSuite, ReceiveHandlerCallCount == 1); + EXPECT_EQ(ReceiveHandlerCallCount, 1); } -void CheckMessageTest4(nlTestSuite * inSuite, void * inContext) +#if INET_CONFIG_ENABLE_IPV4 +TEST_F(TestUDP, CheckSimpleInitTest4) { - IPAddress addr; - IPAddress::FromString("127.0.0.1", addr); - CheckMessageTest(inSuite, inContext, addr); + CheckSimpleInitTest(inContext, IPAddressType::kIPv4); } -void CheckMessageTest6(nlTestSuite * inSuite, void * inContext) +TEST_F(TestUDP, CheckMessageTest4) { IPAddress addr; - IPAddress::FromString("::1", addr); - CheckMessageTest(inSuite, inContext, addr); + IPAddress::FromString("127.0.0.1", addr); + CheckMessageTest(inContext, addr); } - -// Test Suite - -/** - * Test Suite that lists all the test functions. - */ -// clang-format off -static const nlTest sTests[] = -{ -#if INET_CONFIG_ENABLE_IPV4 - NL_TEST_DEF("Simple Init Test IPV4", CheckSimpleInitTest4), - NL_TEST_DEF("Message Self Test IPV4", CheckMessageTest4), #endif - NL_TEST_DEF("Simple Init Test IPV6", CheckSimpleInitTest6), - NL_TEST_DEF("Message Self Test IPV6", CheckMessageTest6), - - NL_TEST_SENTINEL() -}; -// clang-format on - -// clang-format off -static nlTestSuite sSuite = -{ - "Test-CHIP-Udp", - &sTests[0], - Initialize, - Finalize -}; -// clang-format on - -/** - * Initialize the test suite. - */ -static int Initialize(void * aContext) -{ - CHIP_ERROR err = reinterpret_cast<TestContext *>(aContext)->Init(); - return (err == CHIP_NO_ERROR) ? SUCCESS : FAILURE; -} - -/** - * Finalize the test suite. - */ -static int Finalize(void * aContext) +TEST_F(TestUDP, CheckSimpleInitTest6) { - reinterpret_cast<TestContext *>(aContext)->Shutdown(); - return SUCCESS; + CheckSimpleInitTest(inContext, IPAddressType::kIPv6); } -int TestUDP() +TEST_F(TestUDP, CheckMessageTest6) { - return chip::ExecuteTestsWithContext<TestContext>(&sSuite); + IPAddress addr; + IPAddress::FromString("::1", addr); + CheckMessageTest(inContext, addr); } - -CHIP_REGISTER_TEST_SUITE(TestUDP); From cb7fd5a975ebb26ec508abaf9bcc8706c80228da Mon Sep 17 00:00:00 2001 From: chirag-silabs <100861685+chirag-silabs@users.noreply.github.com> Date: Tue, 30 Apr 2024 21:55:00 +0530 Subject: [PATCH 085/124] [Silabs][SiWx917] Adding the LED define for the 917 soc (#33228) * adding the led define for the 917 soc * Restyled by gn --------- Co-authored-by: Restyled.io <commits@restyled.io> --- third_party/silabs/SiWx917_sdk.gni | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/third_party/silabs/SiWx917_sdk.gni b/third_party/silabs/SiWx917_sdk.gni index 48abc728a4bf50..0819d7287bc9bc 100644 --- a/third_party/silabs/SiWx917_sdk.gni +++ b/third_party/silabs/SiWx917_sdk.gni @@ -282,7 +282,12 @@ template("siwx917_sdk") { # Enabling led interface if (use_wstk_leds) { - defines += [ "ENABLE_WSTK_LEDS" ] + defines += [ + "ENABLE_WSTK_LEDS", + + # TODO: remove this when it is added to the board config from wifi sdk + "SL_CATALOG_SIMPLE_LED_LED1_PRESENT", + ] } if (chip_enable_icd_server) { From f6bbfee37421b2fea075e1db56ab82f9a0c6a78d Mon Sep 17 00:00:00 2001 From: C Freeman <cecille@google.com> Date: Tue, 30 Apr 2024 12:48:33 -0400 Subject: [PATCH 086/124] TC-DA-1.7: Use steps_function, add missing checks (#33117) * TC-DA-1.7: Use steps_function, add missing checks Also adding in a new flag that will let us use this test in post-cert (just introducing flag now, checks will be updated in an upcoming PR). * Restyled by autopep8 * Restyled by isort * Make error message more specific * whoops, missed some * Use the flag from setup --------- Co-authored-by: Restyled.io <commits@restyled.io> --- src/python_testing/TC_DA_1_7.py | 103 +++++++++++++++++++++++++------- 1 file changed, 81 insertions(+), 22 deletions(-) diff --git a/src/python_testing/TC_DA_1_7.py b/src/python_testing/TC_DA_1_7.py index 634dbb8885da2c..1d23883237eeeb 100644 --- a/src/python_testing/TC_DA_1_7.py +++ b/src/python_testing/TC_DA_1_7.py @@ -18,7 +18,7 @@ import logging from glob import glob from pathlib import Path -from typing import Optional +from typing import List, Optional import chip.clusters as Clusters from cryptography.exceptions import InvalidSignature @@ -26,7 +26,8 @@ from cryptography.hazmat.primitives.asymmetric import ec from cryptography.hazmat.primitives.serialization import Encoding, PublicFormat from cryptography.x509 import AuthorityKeyIdentifier, Certificate, SubjectKeyIdentifier, load_der_x509_certificate -from matter_testing_support import MatterBaseTest, async_test_body, bytes_from_hex, default_matter_test_main, hex_from_bytes +from matter_testing_support import (MatterBaseTest, TestStep, async_test_body, bytes_from_hex, default_matter_test_main, + hex_from_bytes) from mobly import asserts # Those are SDK samples that are known to be non-production. @@ -107,35 +108,84 @@ class TC_DA_1_7(MatterBaseTest): --script-args "--storage-path admin_storage.json --commissioning-method on-network \ --discriminator 12 34 --passcode 20202021 20202021 --bool-arg allow_sdk_dac:true" ''' + + def setup_class(self): + self.allow_sdk_dac = self.user_params.get("allow_sdk_dac", False) + self.post_cert_test = self.user_params.get("post_cert_test", False) + + def expected_number_of_DUTs(self) -> int: + return 1 if (self.allow_sdk_dac or self.post_cert_test) else 2 + + def steps_one_dut(self, DUT: int) -> List[TestStep]: + return [TestStep(f'{DUT}', f'Test DUT{DUT} DAC chain as follows:'), + TestStep(f'{DUT}.1', f'TH sends CertificateChainRequest Command to DUT{DUT} with the CertificateType set to PAICertificate', + 'Verify that the DUT returns a CertificateChainResponse. Save the returned Certificate as `pai_cert`.'), + TestStep(f'{DUT}.2', 'TH sends CertificateChainRequest Command to DUT1 with the CertificateType set to DACCertificate', + 'Verify that the DUT returns a CertificateChainResponse. Save the returned Certificate as `dac_cert`.'), + TestStep(f'{DUT}.3', 'TH extracts the Authority Key Identifier from the PAI certificate', + ('* Verify that the Authority Key Identifier is signed by a PAA in the DCL. (Ensure that it is not SDK’s test PAAs)\n' + '* Verify that PAI authority key ID must not be one of:\n' + ' - 78: 5C: E7: 05: B8: 6B: 8F: 4E: 6F: C7: 93: AA: 60: CB: 43: EA: 69: 68:82: D5\n' + ' - 6A: FD: 22: 77: 1F: 51: 1F: EC: BF: 16: 41: 97: 67: 10: DC: DC: 31: A1: 71: 7E\n' + '* Save the selected PAA certificate as `paa_cert`\n')), + TestStep(f'{DUT}.4', 'TH extracts ASN.1 DER bytes for the entire issuer field of `dac_cert` and subject field of `pai_cert`.', + 'Verify that the `dac_cert` `issuer field is byte-forbyte equivalent to the `pai_cert`subject field.'), + TestStep(f'{DUT}.5', 'TH extracts ASN.1 DER bytes for the entire issuer field of `pai_cert` and subject field of `paa_cert`.', + 'Verify that the `pai_cert` issuer field is byte-forbyte equivalent to the `paa_cert` subject field.'), + TestStep(f'{DUT}.6', f'TH extracts the public key from the DAC and saves as `pk_{DUT}`.') + ] + + def steps_TC_DA_1_7(self): + steps = [TestStep(0, "Commission DUT if not already done", is_commissioning=True)] + steps += self.steps_one_dut(1) + if self.expected_number_of_DUTs() == 2: + steps += self.steps_one_dut(2) + steps += [TestStep(3, "Verify that `pk_1` is not equal to `pk_2", + "Public keys do not match")] + return steps + @async_test_body async def test_TC_DA_1_7(self): - # For real tests, we require more than one DUT - # On the CI, this doesn't make sense to do since all the examples use the same DAC - # To specify more than 1 DUT, use a list of discriminators and passcodes - allow_sdk_dac = self.user_params.get("allow_sdk_dac", False) - if allow_sdk_dac: - asserts.assert_equal(len(self.matter_test_config.discriminators), 1, "Only one device can be tested with SDK DAC") - if not allow_sdk_dac: - asserts.assert_equal(len(self.matter_test_config.discriminators), 2, "This test requires 2 DUTs") + # post_cert_tests (or sdk) can use the qr or manual code + # We don't currently support this in cert because the base doesn't support multiple QR/manual + num = 0 + if self.matter_test_config.discriminators: + num += len(self.matter_test_config.discriminators) + if self.matter_test_config.qr_code_content: + num += 1 + if self.matter_test_config.manual_code: + num += 1 + + if num != self.expected_number_of_DUTs(): + if self.allow_sdk_dac: + msg = "The allow_sdk_dac flag is only for use in CI. When using this test in CI, please specify a single discriminator, manual-code or qr-code-content" + elif self.post_cert_test: + msg = "The post_cert_test flag is only for use post-certification. When using this flag, please specify a single discriminator, manual-code or qr-code-content" + else: + msg = "This test requires two devices for use at certification. Please specify two device discriminators ex. --discriminator 1234 5678" + asserts.fail(msg) + pk = [] + # Commissioning - already done. + self.step(0) + for i in range(len(self.matter_test_config.dut_node_ids)): - pk.append(await self.single_DUT(i, self.matter_test_config.dut_node_ids[i])) + pk.append(await self.single_DUT(i+1, self.matter_test_config.dut_node_ids[i])) + self.step(3) asserts.assert_equal(len(pk), len(set(pk)), "Found matching public keys in different DUTs") async def single_DUT(self, dut_index: int, dut_node_id: int) -> bytes: - # Option to allow SDK roots (skip step 4 check 2) - allow_sdk_dac = self.user_params.get("allow_sdk_dac", False) - logging.info("Pre-condition: load all PAAs SKIDs") conf = self.matter_test_config paa_by_skid = load_all_paa(conf.paa_trust_store_path) logging.info("Found %d PAAs" % len(paa_by_skid)) - logging.info("DUT {} Step 1: Commissioning, already done".format(dut_index)) + # Test plan step introducing test for each DUT + self.step(f'{dut_index}') dev_ctrl = self.default_controller - logging.info("DUT {} Step 2: Get PAI of DUT1 with certificate chain request".format(dut_index)) + self.step(f'{dut_index}.1') result = await dev_ctrl.SendCommand(dut_node_id, 0, Clusters.OperationalCredentials.Commands.CertificateChainRequest(2)) pai = result.certificate @@ -143,7 +193,7 @@ async def single_DUT(self, dut_index: int, dut_node_id: int) -> bytes: key = 'pai_{}'.format(dut_index) self.record_data({key: hex_from_bytes(pai)}) - logging.info("DUT {} Step 3: Get DAC of DUT1 with certificate chain request".format(dut_index)) + self.step(f'{dut_index}.2') result = await dev_ctrl.SendCommand(dut_node_id, 0, Clusters.OperationalCredentials.Commands.CertificateChainRequest(1)) dac = result.certificate @@ -151,7 +201,8 @@ async def single_DUT(self, dut_index: int, dut_node_id: int) -> bytes: key = 'dac_{}'.format(dut_index) self.record_data({key: hex_from_bytes(dac)}) - logging.info("DUT {} Step 4 check 1: Ensure PAI's AKID matches a PAA and signature is valid".format(dut_index)) + self.step(f'{dut_index}.3') + logging.info("DUT {} Step 3 check 1: Ensure PAI's AKID matches a PAA and signature is valid".format(dut_index)) pai_cert = load_der_x509_certificate(pai) pai_akid = extract_akid(pai_cert) if pai_akid not in paa_by_skid: @@ -168,15 +219,23 @@ async def single_DUT(self, dut_index: int, dut_node_id: int) -> bytes: asserts.fail("DUT %d: Failed to verify PAI signature against PAA public key: %s" % (dut_index, str(e))) logging.info("Validated PAI signature against PAA") - logging.info("DUT {} Step 4 check 2: Verify PAI AKID not in denylist of SDK PAIs".format(dut_index)) - if allow_sdk_dac: - logging.warn("===> TEST STEP SKIPPED: Allowing SDK DACs!") + logging.info("DUT {} Step 3 check 2: Verify PAI AKID not in denylist of SDK PAIs".format(dut_index)) + if self.allow_sdk_dac: + logging.warning("===> TEST STEP SKIPPED: Allowing SDK DACs!") else: for candidate in FORBIDDEN_AKID: asserts.assert_not_equal(hex_from_bytes(pai_akid), hex_from_bytes(candidate), "PAI AKID must not be in denylist") - logging.info("DUT {} Step 5: Extract subject public key of DAC and save".format(dut_index)) + self.step(f'{dut_index}.4') + # dac issuer == pai subject dac_cert = load_der_x509_certificate(dac) + asserts.assert_equal(dac_cert.issuer, pai_cert.subject, "DAC issuer does not match PAI subject") + + self.step(f'{dut_index}.5') + # pai issues == paa subject + asserts.assert_equal(pai_cert.issuer, paa_cert.subject, "PAI issuer does not match PAA subject") + + self.step(f'{dut_index}.6') pk = dac_cert.public_key().public_bytes(encoding=Encoding.X962, format=PublicFormat.UncompressedPoint) logging.info("Subject public key pk: %s" % hex_from_bytes(pk)) key = 'pk_{}'.format(dut_index) From 9ed9c724daef1ebd99548a2ea6e0da02a8ed177f Mon Sep 17 00:00:00 2001 From: Andrei Litvin <andy314@gmail.com> Date: Tue, 30 Apr 2024 12:53:56 -0400 Subject: [PATCH 087/124] [chore] Replace all usages of chip::Optional with std::optional in src/lib/dnssd (#33200) * std optional in recordwriter * Fix a call * Change some advertiser.h to std::optional * Fix usage in advertiser.cpp * Make more things compile * Restyle * make clang-tidy happy * Replace chip optional from active resolveattempts * Fix platform dns * More test fixes * Fix one more compile to not have optional at all in dnssd * Restyle * Add back removed header * Some compile fixes for IP address * more compile fixes - tested that qpg thermostat compiles for me now * Fix tizen build * Commissioner passcode fix * make clang-tidy happy * Use references for MRPConfig optionals, as the mrpconfig may be larger * Reduce scope of optional usage * Use references everywhere for Advertiser * One more use of a reference * One more const reference passing to try to reduce code size * Restyle * Attempt to make clang-tidy happy in unit tst * Disable the check via a nolint * Code review: use C++17 if initializers to scope out temporary optional values * Use a few more references * Apply code review comment * Undo return as reference changes in getters for optional --------- Co-authored-by: Andrei Litvin <andreilitvin@google.com> --- examples/minimal-mdns/advertiser.cpp | 29 +-- src/app/server/Dnssd.cpp | 28 +-- src/lib/dnssd/ActiveResolveAttempts.cpp | 18 +- src/lib/dnssd/ActiveResolveAttempts.h | 6 +- src/lib/dnssd/Advertiser.h | 74 ++++---- src/lib/dnssd/Advertiser_ImplMinimalMdns.cpp | 65 +++---- src/lib/dnssd/Discovery_ImplPlatform.cpp | 44 ++--- src/lib/dnssd/Resolver.h | 10 +- src/lib/dnssd/Resolver_ImplMinimalMdns.cpp | 14 +- .../dnssd/minimal_mdns/core/RecordWriter.cpp | 12 +- .../dnssd/minimal_mdns/core/RecordWriter.h | 9 +- .../minimal_mdns/tests/TestAdvertiser.cpp | 46 ++--- src/lib/dnssd/platform/Dnssd.h | 4 +- src/lib/dnssd/platform/tests/TestPlatform.cpp | 46 ++--- .../dnssd/tests/TestActiveResolveAttempts.cpp | 175 +++++++++--------- ...nericThreadStackManagerImpl_OpenThread.hpp | 8 +- src/platform/Tizen/DnssdImpl.cpp | 4 +- src/platform/nxp/common/DnssdImpl.cpp | 4 +- 18 files changed, 304 insertions(+), 292 deletions(-) diff --git a/examples/minimal-mdns/advertiser.cpp b/examples/minimal-mdns/advertiser.cpp index 9d2f90c7858e00..6e260257301324 100644 --- a/examples/minimal-mdns/advertiser.cpp +++ b/examples/minimal-mdns/advertiser.cpp @@ -16,6 +16,7 @@ */ #include <cstdio> #include <memory> +#include <optional> #include <arpa/inet.h> #include <strings.h> @@ -45,18 +46,18 @@ struct Options AdvertisingMode advertisingMode = AdvertisingMode::kCommissionableNode; // commissionable node / commissioner params - Optional<uint16_t> vendorId; - Optional<uint16_t> productId; - Optional<uint32_t> deviceType; - Optional<const char *> deviceName; + std::optional<uint16_t> vendorId; + std::optional<uint16_t> productId; + std::optional<uint32_t> deviceType; + std::optional<const char *> deviceName; // commissionable node params uint8_t shortDiscriminator = 52; uint16_t longDiscriminator = 840; Dnssd::CommissioningMode commissioningMode = Dnssd::CommissioningMode::kDisabled; - Optional<const char *> rotatingId; - Optional<const char *> pairingInstr; - Optional<uint16_t> pairingHint; + std::optional<const char *> rotatingId; + std::optional<const char *> pairingInstr; + std::optional<uint16_t> pairingHint; // operational params uint64_t fabricId = 12345; @@ -130,10 +131,10 @@ bool HandleOptions(const char * aProgram, OptionSet * aOptions, int aIdentifier, gOptions.longDiscriminator = static_cast<uint16_t>(atoi(aValue)); return true; case kOptionCommissioningVendorId: - gOptions.vendorId = Optional<uint16_t>::Value(static_cast<uint16_t>(atoi(aValue))); + gOptions.vendorId = std::make_optional<uint16_t>(static_cast<uint16_t>(atoi(aValue))); return true; case kOptionCommissioningProductId: - gOptions.productId = Optional<uint16_t>::Value(static_cast<uint16_t>(atoi(aValue))); + gOptions.productId = std::make_optional<uint16_t>(static_cast<uint16_t>(atoi(aValue))); return true; case kOptionCommissioningMode: cm = static_cast<uint8_t>(atoi(aValue)); @@ -147,19 +148,19 @@ bool HandleOptions(const char * aProgram, OptionSet * aOptions, int aIdentifier, } return true; case kOptionCommissioningDeviceType: - gOptions.deviceType = Optional<uint32_t>::Value(static_cast<uint32_t>(atoi(aValue))); + gOptions.deviceType = std::make_optional<uint32_t>(static_cast<uint32_t>(atoi(aValue))); return true; case kOptionCommissioningDeviceName: - gOptions.deviceName = Optional<const char *>::Value(static_cast<const char *>(aValue)); + gOptions.deviceName = std::make_optional<const char *>(static_cast<const char *>(aValue)); return true; case kOptionCommissioningRotatingId: - gOptions.rotatingId = Optional<const char *>::Value(static_cast<const char *>(aValue)); + gOptions.rotatingId = std::make_optional<const char *>(static_cast<const char *>(aValue)); return true; case kOptionCommissioningPairingInstr: - gOptions.pairingInstr = Optional<const char *>::Value(static_cast<const char *>(aValue)); + gOptions.pairingInstr = std::make_optional<const char *>(static_cast<const char *>(aValue)); return true; case kOptionCommissioningPairingHint: - gOptions.pairingHint = Optional<uint16_t>::Value(static_cast<uint16_t>(atoi(aValue))); + gOptions.pairingHint = std::make_optional<uint16_t>(static_cast<uint16_t>(atoi(aValue))); return true; case kOptionOperationalFabricId: if (sscanf(aValue, "%" SCNx64, &gOptions.fabricId) != 1) diff --git a/src/app/server/Dnssd.cpp b/src/app/server/Dnssd.cpp index 3df796434e2671..3cdcd35f9a7e98 100644 --- a/src/app/server/Dnssd.cpp +++ b/src/app/server/Dnssd.cpp @@ -206,7 +206,7 @@ CHIP_ERROR DnssdServer::AdvertiseOperational() .SetMac(mac) .SetPort(GetSecuredPort()) .SetInterfaceId(GetInterfaceId()) - .SetLocalMRPConfig(GetLocalMRPConfig()) + .SetLocalMRPConfig(GetLocalMRPConfig().std_optional()) .EnableIpV4(true); #if CHIP_CONFIG_ENABLE_ICD_SERVER @@ -251,7 +251,7 @@ CHIP_ERROR DnssdServer::Advertise(bool commissionableNode, chip::Dnssd::Commissi } else { - advertiseParameters.SetVendorId(chip::Optional<uint16_t>::Value(value)); + advertiseParameters.SetVendorId(std::make_optional<uint16_t>(value)); } if (DeviceLayer::GetDeviceInstanceInfoProvider()->GetProductId(value) != CHIP_NO_ERROR) @@ -260,23 +260,23 @@ CHIP_ERROR DnssdServer::Advertise(bool commissionableNode, chip::Dnssd::Commissi } else { - advertiseParameters.SetProductId(chip::Optional<uint16_t>::Value(value)); + advertiseParameters.SetProductId(std::make_optional<uint16_t>(value)); } if (DeviceLayer::ConfigurationMgr().IsCommissionableDeviceTypeEnabled() && DeviceLayer::ConfigurationMgr().GetDeviceTypeId(val32) == CHIP_NO_ERROR) { - advertiseParameters.SetDeviceType(chip::Optional<uint32_t>::Value(val32)); + advertiseParameters.SetDeviceType(std::make_optional<uint32_t>(val32)); } char deviceName[chip::Dnssd::kKeyDeviceNameMaxLength + 1]; if (DeviceLayer::ConfigurationMgr().IsCommissionableDeviceNameEnabled() && DeviceLayer::ConfigurationMgr().GetCommissionableDeviceName(deviceName, sizeof(deviceName)) == CHIP_NO_ERROR) { - advertiseParameters.SetDeviceName(chip::Optional<const char *>::Value(deviceName)); + advertiseParameters.SetDeviceName(std::make_optional<const char *>(deviceName)); } - advertiseParameters.SetLocalMRPConfig(GetLocalMRPConfig()); + advertiseParameters.SetLocalMRPConfig(GetLocalMRPConfig().std_optional()); #if CHIP_CONFIG_ENABLE_ICD_SERVER AddICDKeyToAdvertisement(advertiseParameters); @@ -303,7 +303,7 @@ CHIP_ERROR DnssdServer::Advertise(bool commissionableNode, chip::Dnssd::Commissi #if CHIP_ENABLE_ROTATING_DEVICE_ID && defined(CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID) char rotatingDeviceIdHexBuffer[RotatingDeviceId::kHexMaxLength]; ReturnErrorOnFailure(GenerateRotatingDeviceId(rotatingDeviceIdHexBuffer, ArraySize(rotatingDeviceIdHexBuffer))); - advertiseParameters.SetRotatingDeviceId(chip::Optional<const char *>::Value(rotatingDeviceIdHexBuffer)); + advertiseParameters.SetRotatingDeviceId(std::make_optional<const char *>(rotatingDeviceIdHexBuffer)); #endif if (!HaveOperationalCredentials()) @@ -314,7 +314,7 @@ CHIP_ERROR DnssdServer::Advertise(bool commissionableNode, chip::Dnssd::Commissi } else { - advertiseParameters.SetPairingHint(chip::Optional<uint16_t>::Value(value)); + advertiseParameters.SetPairingHint(std::make_optional<uint16_t>(value)); } if (DeviceLayer::ConfigurationMgr().GetInitialPairingInstruction(pairingInst, sizeof(pairingInst)) != CHIP_NO_ERROR) @@ -323,7 +323,7 @@ CHIP_ERROR DnssdServer::Advertise(bool commissionableNode, chip::Dnssd::Commissi } else { - advertiseParameters.SetPairingInstruction(chip::Optional<const char *>::Value(pairingInst)); + advertiseParameters.SetPairingInstruction(std::make_optional<const char *>(pairingInst)); } } else @@ -334,7 +334,7 @@ CHIP_ERROR DnssdServer::Advertise(bool commissionableNode, chip::Dnssd::Commissi } else { - advertiseParameters.SetPairingHint(chip::Optional<uint16_t>::Value(value)); + advertiseParameters.SetPairingHint(std::make_optional<uint16_t>(value)); } if (DeviceLayer::ConfigurationMgr().GetSecondaryPairingInstruction(pairingInst, sizeof(pairingInst)) != CHIP_NO_ERROR) @@ -343,24 +343,24 @@ CHIP_ERROR DnssdServer::Advertise(bool commissionableNode, chip::Dnssd::Commissi } else { - advertiseParameters.SetPairingInstruction(chip::Optional<const char *>::Value(pairingInst)); + advertiseParameters.SetPairingInstruction(std::make_optional<const char *>(pairingInst)); } } } #if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_PASSCODE else { - advertiseParameters.SetCommissionerPasscodeSupported(Optional<bool>(true)); + advertiseParameters.SetCommissionerPasscodeSupported(std::make_optional<bool>(true)); } #endif auto & mdnsAdvertiser = chip::Dnssd::ServiceAdvertiser::Instance(); ChipLogProgress(Discovery, "Advertise commission parameter vendorID=%u productID=%u discriminator=%04u/%02u cm=%u cp=%u", - advertiseParameters.GetVendorId().ValueOr(0), advertiseParameters.GetProductId().ValueOr(0), + advertiseParameters.GetVendorId().value_or(0), advertiseParameters.GetProductId().value_or(0), advertiseParameters.GetLongDiscriminator(), advertiseParameters.GetShortDiscriminator(), to_underlying(advertiseParameters.GetCommissioningMode()), - advertiseParameters.GetCommissionerPasscodeSupported().ValueOr(false) ? 1 : 0); + advertiseParameters.GetCommissionerPasscodeSupported().value_or(false) ? 1 : 0); return mdnsAdvertiser.Advertise(advertiseParameters); } diff --git a/src/lib/dnssd/ActiveResolveAttempts.cpp b/src/lib/dnssd/ActiveResolveAttempts.cpp index f49056896e0b2e..f8f351d85cf05e 100644 --- a/src/lib/dnssd/ActiveResolveAttempts.cpp +++ b/src/lib/dnssd/ActiveResolveAttempts.cpp @@ -218,9 +218,9 @@ void ActiveResolveAttempts::MarkPending(ScheduledAttempt && attempt) entryToUse->nextRetryDelay = System::Clock::Seconds16(1); } -Optional<System::Clock::Timeout> ActiveResolveAttempts::GetTimeUntilNextExpectedResponse() const +std::optional<System::Clock::Timeout> ActiveResolveAttempts::GetTimeUntilNextExpectedResponse() const { - Optional<System::Clock::Timeout> minDelay = Optional<System::Clock::Timeout>::Missing(); + std::optional<System::Clock::Timeout> minDelay = std::nullopt; chip::System::Clock::Timestamp now = mClock->GetMonotonicTimestamp(); @@ -234,20 +234,20 @@ Optional<System::Clock::Timeout> ActiveResolveAttempts::GetTimeUntilNextExpected if (now >= entry.queryDueTime) { // found an entry that needs processing right now - return Optional<System::Clock::Timeout>::Value(0); + return std::make_optional<System::Clock::Timeout>(0); } System::Clock::Timeout entryDelay = entry.queryDueTime - now; - if (!minDelay.HasValue() || (minDelay.Value() > entryDelay)) + if (!minDelay.has_value() || (*minDelay > entryDelay)) { - minDelay.SetValue(entryDelay); + minDelay.emplace(entryDelay); } } return minDelay; } -Optional<ActiveResolveAttempts::ScheduledAttempt> ActiveResolveAttempts::NextScheduled() +std::optional<ActiveResolveAttempts::ScheduledAttempt> ActiveResolveAttempts::NextScheduled() { chip::System::Clock::Timestamp now = mClock->GetMonotonicTimestamp(); @@ -273,13 +273,13 @@ Optional<ActiveResolveAttempts::ScheduledAttempt> ActiveResolveAttempts::NextSch entry.queryDueTime = now + entry.nextRetryDelay; entry.nextRetryDelay *= 2; - Optional<ScheduledAttempt> attempt = MakeOptional(entry.attempt); - entry.attempt.firstSend = false; + std::optional<ScheduledAttempt> attempt = std::make_optional(entry.attempt); + entry.attempt.firstSend = false; return attempt; } - return Optional<ScheduledAttempt>::Missing(); + return std::nullopt; } bool ActiveResolveAttempts::ShouldResolveIpAddress(PeerId peerId) const diff --git a/src/lib/dnssd/ActiveResolveAttempts.h b/src/lib/dnssd/ActiveResolveAttempts.h index 55790bd1e3821e..157790b531c3e7 100644 --- a/src/lib/dnssd/ActiveResolveAttempts.h +++ b/src/lib/dnssd/ActiveResolveAttempts.h @@ -19,8 +19,8 @@ #include <cstddef> #include <cstdint> +#include <optional> -#include <lib/core/Optional.h> #include <lib/core/PeerId.h> #include <lib/dnssd/Resolver.h> #include <lib/dnssd/minimal_mdns/core/HeapQName.h> @@ -273,7 +273,7 @@ class ActiveResolveAttempts // Get minimum time until the next pending reply is required. // // Returns missing if no actively tracked elements exist. - chip::Optional<chip::System::Clock::Timeout> GetTimeUntilNextExpectedResponse() const; + std::optional<chip::System::Clock::Timeout> GetTimeUntilNextExpectedResponse() const; // Get the peer Id that needs scheduling for a query // @@ -283,7 +283,7 @@ class ActiveResolveAttempts // now' // - there is NO sorting implied by this call. Returned value will be // any peer that needs a new request sent - chip::Optional<ScheduledAttempt> NextScheduled(); + std::optional<ScheduledAttempt> NextScheduled(); /// Check if any of the pending queries are for the given host name for /// IP resolution. diff --git a/src/lib/dnssd/Advertiser.h b/src/lib/dnssd/Advertiser.h index 64fa9ec3fd5d33..02888181f98181 100644 --- a/src/lib/dnssd/Advertiser.h +++ b/src/lib/dnssd/Advertiser.h @@ -19,9 +19,9 @@ #include <algorithm> #include <cstdint> +#include <optional> #include <lib/core/CHIPError.h> -#include <lib/core/Optional.h> #include <lib/core/PeerId.h> #include <lib/dnssd/TxtFields.h> #include <lib/support/CHIPMemString.h> @@ -95,20 +95,20 @@ class BaseAdvertisingParams const chip::ByteSpan GetMac() const { return chip::ByteSpan(mMacStorage, mMacLength); } // Common Flags - Derived & SetLocalMRPConfig(const Optional<ReliableMessageProtocolConfig> & config) + Derived & SetLocalMRPConfig(const std::optional<ReliableMessageProtocolConfig> & config) { mLocalMRPConfig = config; return *reinterpret_cast<Derived *>(this); } - const Optional<ReliableMessageProtocolConfig> & GetLocalMRPConfig() const { return mLocalMRPConfig; } + const std::optional<ReliableMessageProtocolConfig> & GetLocalMRPConfig() const { return mLocalMRPConfig; } // NOTE: The SetTcpSupported API is deprecated and not compliant with 1.3. T flag should not be set. - Derived & SetTcpSupported(Optional<bool> tcpSupported) + Derived & SetTcpSupported(std::optional<bool> tcpSupported) { mTcpSupported = tcpSupported; return *reinterpret_cast<Derived *>(this); } - Optional<bool> GetTcpSupported() const { return mTcpSupported; } + std::optional<bool> GetTcpSupported() const { return mTcpSupported; } Derived & SetICDModeToAdvertise(ICDModeAdvertise operatingMode) { @@ -123,8 +123,8 @@ class BaseAdvertisingParams bool mEnableIPv4 = true; uint8_t mMacStorage[kMaxMacSize] = {}; size_t mMacLength = 0; - Optional<ReliableMessageProtocolConfig> mLocalMRPConfig; - Optional<bool> mTcpSupported; + std::optional<ReliableMessageProtocolConfig> mLocalMRPConfig; + std::optional<bool> mTcpSupported; ICDModeAdvertise mICDModeAdvertise = ICDModeAdvertise::kNone; }; @@ -176,19 +176,19 @@ class CommissionAdvertisingParameters : public BaseAdvertisingParams<CommissionA } uint16_t GetLongDiscriminator() const { return mLongDiscriminator; } - CommissionAdvertisingParameters & SetVendorId(Optional<uint16_t> vendorId) + CommissionAdvertisingParameters & SetVendorId(std::optional<uint16_t> vendorId) { mVendorId = vendorId; return *this; } - Optional<uint16_t> GetVendorId() const { return mVendorId; } + std::optional<uint16_t> GetVendorId() const { return mVendorId; } - CommissionAdvertisingParameters & SetProductId(Optional<uint16_t> productId) + CommissionAdvertisingParameters & SetProductId(std::optional<uint16_t> productId) { mProductId = productId; return *this; } - Optional<uint16_t> GetProductId() const { return mProductId; } + std::optional<uint16_t> GetProductId() const { return mProductId; } CommissionAdvertisingParameters & SetCommissioningMode(CommissioningMode mode) { @@ -197,18 +197,18 @@ class CommissionAdvertisingParameters : public BaseAdvertisingParams<CommissionA } CommissioningMode GetCommissioningMode() const { return mCommissioningMode; } - CommissionAdvertisingParameters & SetDeviceType(Optional<uint32_t> deviceType) + CommissionAdvertisingParameters & SetDeviceType(std::optional<uint32_t> deviceType) { mDeviceType = deviceType; return *this; } - Optional<uint32_t> GetDeviceType() const { return mDeviceType; } + std::optional<uint32_t> GetDeviceType() const { return mDeviceType; } - CommissionAdvertisingParameters & SetDeviceName(Optional<const char *> deviceName) + CommissionAdvertisingParameters & SetDeviceName(std::optional<const char *> deviceName) { - if (deviceName.HasValue()) + if (deviceName.has_value()) { - Platform::CopyString(mDeviceName, sizeof(mDeviceName), deviceName.Value()); + Platform::CopyString(mDeviceName, sizeof(mDeviceName), *deviceName); mDeviceNameHasValue = true; } else @@ -217,16 +217,16 @@ class CommissionAdvertisingParameters : public BaseAdvertisingParams<CommissionA } return *this; } - Optional<const char *> GetDeviceName() const + std::optional<const char *> GetDeviceName() const { - return mDeviceNameHasValue ? Optional<const char *>::Value(mDeviceName) : Optional<const char *>::Missing(); + return mDeviceNameHasValue ? std::make_optional<const char *>(mDeviceName) : std::nullopt; } - CommissionAdvertisingParameters & SetRotatingDeviceId(Optional<const char *> rotatingId) + CommissionAdvertisingParameters & SetRotatingDeviceId(std::optional<const char *> rotatingId) { - if (rotatingId.HasValue()) + if (rotatingId.has_value()) { - Platform::CopyString(mRotatingId, sizeof(mRotatingId), rotatingId.Value()); + Platform::CopyString(mRotatingId, sizeof(mRotatingId), *rotatingId); mRotatingIdHasValue = true; } else @@ -235,16 +235,16 @@ class CommissionAdvertisingParameters : public BaseAdvertisingParams<CommissionA } return *this; } - Optional<const char *> GetRotatingDeviceId() const + std::optional<const char *> GetRotatingDeviceId() const { - return mRotatingIdHasValue ? Optional<const char *>::Value(mRotatingId) : Optional<const char *>::Missing(); + return mRotatingIdHasValue ? std::make_optional<const char *>(mRotatingId) : std::nullopt; } - CommissionAdvertisingParameters & SetPairingInstruction(Optional<const char *> pairingInstr) + CommissionAdvertisingParameters & SetPairingInstruction(std::optional<const char *> pairingInstr) { - if (pairingInstr.HasValue()) + if (pairingInstr.has_value()) { - Platform::CopyString(mPairingInstr, sizeof(mPairingInstr), pairingInstr.Value()); + Platform::CopyString(mPairingInstr, sizeof(mPairingInstr), *pairingInstr); mPairingInstrHasValue = true; } else @@ -253,17 +253,17 @@ class CommissionAdvertisingParameters : public BaseAdvertisingParams<CommissionA } return *this; } - Optional<const char *> GetPairingInstruction() const + std::optional<const char *> GetPairingInstruction() const { - return mPairingInstrHasValue ? Optional<const char *>::Value(mPairingInstr) : Optional<const char *>::Missing(); + return mPairingInstrHasValue ? std::make_optional<const char *>(mPairingInstr) : std::nullopt; } - CommissionAdvertisingParameters & SetPairingHint(Optional<uint16_t> pairingHint) + CommissionAdvertisingParameters & SetPairingHint(std::optional<uint16_t> pairingHint) { mPairingHint = pairingHint; return *this; } - Optional<uint16_t> GetPairingHint() const { return mPairingHint; } + std::optional<uint16_t> GetPairingHint() const { return mPairingHint; } CommissionAdvertisingParameters & SetCommissionAdvertiseMode(CommssionAdvertiseMode mode) { @@ -272,22 +272,22 @@ class CommissionAdvertisingParameters : public BaseAdvertisingParams<CommissionA } CommssionAdvertiseMode GetCommissionAdvertiseMode() const { return mMode; } - CommissionAdvertisingParameters & SetCommissionerPasscodeSupported(Optional<bool> commissionerPasscodeSupported) + CommissionAdvertisingParameters & SetCommissionerPasscodeSupported(std::optional<bool> commissionerPasscodeSupported) { mCommissionerPasscodeSupported = commissionerPasscodeSupported; return *this; } - Optional<bool> GetCommissionerPasscodeSupported() const { return mCommissionerPasscodeSupported; } + std::optional<bool> GetCommissionerPasscodeSupported() const { return mCommissionerPasscodeSupported; } private: uint8_t mShortDiscriminator = 0; uint16_t mLongDiscriminator = 0; // 12-bit according to spec CommssionAdvertiseMode mMode = CommssionAdvertiseMode::kCommissionableNode; CommissioningMode mCommissioningMode = CommissioningMode::kEnabledBasic; - chip::Optional<uint16_t> mVendorId; - chip::Optional<uint16_t> mProductId; - chip::Optional<uint32_t> mDeviceType; - chip::Optional<uint16_t> mPairingHint; + std::optional<uint16_t> mVendorId; + std::optional<uint16_t> mProductId; + std::optional<uint32_t> mDeviceType; + std::optional<uint16_t> mPairingHint; char mDeviceName[kKeyDeviceNameMaxLength + 1]; bool mDeviceNameHasValue = false; @@ -298,7 +298,7 @@ class CommissionAdvertisingParameters : public BaseAdvertisingParams<CommissionA char mPairingInstr[kKeyPairingInstructionMaxLength + 1]; bool mPairingInstrHasValue = false; - Optional<bool> mCommissionerPasscodeSupported; + std::optional<bool> mCommissionerPasscodeSupported; }; /** diff --git a/src/lib/dnssd/Advertiser_ImplMinimalMdns.cpp b/src/lib/dnssd/Advertiser_ImplMinimalMdns.cpp index e25487f781860f..5ca002673cd4c9 100644 --- a/src/lib/dnssd/Advertiser_ImplMinimalMdns.cpp +++ b/src/lib/dnssd/Advertiser_ImplMinimalMdns.cpp @@ -226,11 +226,10 @@ class AdvertiserMinMdns : public ServiceAdvertiser, CHIP_ERROR AddCommonTxtEntries(const BaseAdvertisingParams<Derived> & params, CommonTxtEntryStorage & storage, char ** txtFields, size_t & numTxtFields) { - auto optionalMrp = params.GetLocalMRPConfig(); - if (optionalMrp.HasValue()) + if (const auto & optionalMrp = params.GetLocalMRPConfig(); optionalMrp.has_value()) { - auto mrp = optionalMrp.Value(); + auto mrp = *optionalMrp; // An ICD operating as a LIT shall not advertise its slow polling interval. // Don't include the SII key in the advertisement when operating as so. @@ -278,14 +277,16 @@ class AdvertiserMinMdns : public ServiceAdvertiser, txtFields[numTxtFields++] = storage.sessionActiveThresholdBuf; } } - if (params.GetTcpSupported().HasValue()) + + if (const auto & tcpSupported = params.GetTcpSupported(); tcpSupported.has_value()) { - size_t writtenCharactersNumber = static_cast<size_t>( - snprintf(storage.tcpSupportedBuf, sizeof(storage.tcpSupportedBuf), "T=%d", params.GetTcpSupported().Value())); + size_t writtenCharactersNumber = + static_cast<size_t>(snprintf(storage.tcpSupportedBuf, sizeof(storage.tcpSupportedBuf), "T=%d", *tcpSupported)); VerifyOrReturnError((writtenCharactersNumber > 0) && (writtenCharactersNumber < sizeof(storage.tcpSupportedBuf)), CHIP_ERROR_INVALID_STRING_LENGTH); txtFields[numTxtFields++] = storage.tcpSupportedBuf; } + if (params.GetICDModeToAdvertise() != ICDModeAdvertise::kNone) { size_t writtenCharactersNumber = @@ -670,10 +671,9 @@ CHIP_ERROR AdvertiserMinMdns::Advertise(const CommissionAdvertisingParameters & } } - if (params.GetVendorId().HasValue()) + if (const auto & vendorId = params.GetVendorId(); vendorId.has_value()) { - MakeServiceSubtype(nameBuffer, sizeof(nameBuffer), - DiscoveryFilter(DiscoveryFilterType::kVendorId, params.GetVendorId().Value())); + MakeServiceSubtype(nameBuffer, sizeof(nameBuffer), DiscoveryFilter(DiscoveryFilterType::kVendorId, *vendorId)); FullQName vendorServiceName = allocator->AllocateQName(nameBuffer, kSubtypeServiceNamePart, serviceType, kCommissionProtocol, kLocalDomain); ReturnErrorCodeIf(vendorServiceName.nameCount == 0, CHIP_ERROR_NO_MEMORY); @@ -688,10 +688,9 @@ CHIP_ERROR AdvertiserMinMdns::Advertise(const CommissionAdvertisingParameters & } } - if (params.GetDeviceType().HasValue()) + if (const auto & deviceType = params.GetDeviceType(); deviceType.has_value()) { - MakeServiceSubtype(nameBuffer, sizeof(nameBuffer), - DiscoveryFilter(DiscoveryFilterType::kDeviceType, params.GetDeviceType().Value())); + MakeServiceSubtype(nameBuffer, sizeof(nameBuffer), DiscoveryFilter(DiscoveryFilterType::kDeviceType, *deviceType)); FullQName vendorServiceName = allocator->AllocateQName(nameBuffer, kSubtypeServiceNamePart, serviceType, kCommissionProtocol, kLocalDomain); ReturnErrorCodeIf(vendorServiceName.nameCount == 0, CHIP_ERROR_NO_MEMORY); @@ -812,28 +811,32 @@ FullQName AdvertiserMinMdns::GetCommissioningTxtEntries(const CommissionAdvertis : &mQueryResponderAllocatorCommissioner; char txtVidPid[chip::Dnssd::kKeyVendorProductMaxLength + 4]; - if (params.GetProductId().HasValue() && params.GetVendorId().HasValue()) - { - snprintf(txtVidPid, sizeof(txtVidPid), "VP=%d+%d", params.GetVendorId().Value(), params.GetProductId().Value()); - txtFields[numTxtFields++] = txtVidPid; - } - else if (params.GetVendorId().HasValue()) { - snprintf(txtVidPid, sizeof(txtVidPid), "VP=%d", params.GetVendorId().Value()); - txtFields[numTxtFields++] = txtVidPid; + const auto & productId = params.GetProductId(); + const auto & vendorId = params.GetVendorId(); + if (productId.has_value() && vendorId.has_value()) + { + snprintf(txtVidPid, sizeof(txtVidPid), "VP=%d+%d", *vendorId, *productId); + txtFields[numTxtFields++] = txtVidPid; + } + else if (vendorId.has_value()) + { + snprintf(txtVidPid, sizeof(txtVidPid), "VP=%d", *vendorId); + txtFields[numTxtFields++] = txtVidPid; + } } char txtDeviceType[chip::Dnssd::kKeyDeviceTypeMaxLength + 4]; - if (params.GetDeviceType().HasValue()) + if (const auto & deviceType = params.GetDeviceType(); deviceType.has_value()) { - snprintf(txtDeviceType, sizeof(txtDeviceType), "DT=%" PRIu32, params.GetDeviceType().Value()); + snprintf(txtDeviceType, sizeof(txtDeviceType), "DT=%" PRIu32, *deviceType); txtFields[numTxtFields++] = txtDeviceType; } char txtDeviceName[chip::Dnssd::kKeyDeviceNameMaxLength + 4]; - if (params.GetDeviceName().HasValue()) + if (const auto & deviceName = params.GetDeviceName(); deviceName.has_value()) { - snprintf(txtDeviceName, sizeof(txtDeviceName), "DN=%s", params.GetDeviceName().Value()); + snprintf(txtDeviceName, sizeof(txtDeviceName), "DN=%s", *deviceName); txtFields[numTxtFields++] = txtDeviceName; } CommonTxtEntryStorage commonStorage; @@ -858,27 +861,27 @@ FullQName AdvertiserMinMdns::GetCommissioningTxtEntries(const CommissionAdvertis snprintf(txtCommissioningMode, sizeof(txtCommissioningMode), "CM=%d", static_cast<int>(params.GetCommissioningMode())); txtFields[numTxtFields++] = txtCommissioningMode; - if (params.GetRotatingDeviceId().HasValue()) + if (const auto & rotatingDeviceId = params.GetRotatingDeviceId(); rotatingDeviceId.has_value()) { - snprintf(txtRotatingDeviceId, sizeof(txtRotatingDeviceId), "RI=%s", params.GetRotatingDeviceId().Value()); + snprintf(txtRotatingDeviceId, sizeof(txtRotatingDeviceId), "RI=%s", *rotatingDeviceId); txtFields[numTxtFields++] = txtRotatingDeviceId; } - if (params.GetPairingHint().HasValue()) + if (const auto & pairingHint = params.GetPairingHint(); pairingHint.has_value()) { - snprintf(txtPairingHint, sizeof(txtPairingHint), "PH=%d", params.GetPairingHint().Value()); + snprintf(txtPairingHint, sizeof(txtPairingHint), "PH=%d", *pairingHint); txtFields[numTxtFields++] = txtPairingHint; } - if (params.GetPairingInstruction().HasValue()) + if (const auto & pairingInstruction = params.GetPairingInstruction(); pairingInstruction.has_value()) { - snprintf(txtPairingInstr, sizeof(txtPairingInstr), "PI=%s", params.GetPairingInstruction().Value()); + snprintf(txtPairingInstr, sizeof(txtPairingInstr), "PI=%s", *pairingInstruction); txtFields[numTxtFields++] = txtPairingInstr; } } else { - if (params.GetCommissionerPasscodeSupported().ValueOr(false)) + if (params.GetCommissionerPasscodeSupported().value_or(false)) { snprintf(txtCommissionerPasscode, sizeof(txtCommissionerPasscode), "CP=%d", static_cast<int>(1)); txtFields[numTxtFields++] = txtCommissionerPasscode; diff --git a/src/lib/dnssd/Discovery_ImplPlatform.cpp b/src/lib/dnssd/Discovery_ImplPlatform.cpp index 2b6b6cd470c618..f4a524f2c81f31 100644 --- a/src/lib/dnssd/Discovery_ImplPlatform.cpp +++ b/src/lib/dnssd/Discovery_ImplPlatform.cpp @@ -15,6 +15,7 @@ * limitations under the License. */ +#include <cstdint> #include <lib/dnssd/Discovery_ImplPlatform.h> #include <inttypes.h> @@ -72,14 +73,16 @@ static void HandleNodeBrowse(void * context, DnssdService * services, size_t ser discoveryContext->Retain(); // For some platforms browsed services are already resolved, so verify if resolve is really needed or call resolve callback + auto & ipAddress = services[i].mAddress; + // Check if SRV, TXT and AAAA records were received in DNS responses - if (strlen(services[i].mHostName) == 0 || services[i].mTextEntrySize == 0 || !services[i].mAddress.HasValue()) + if (strlen(services[i].mHostName) == 0 || services[i].mTextEntrySize == 0 || !ipAddress.has_value()) { ChipDnssdResolve(&services[i], services[i].mInterface, HandleNodeResolve, context); } else { - Inet::IPAddress * address = &(services[i].mAddress.Value()); + Inet::IPAddress * address = &(*ipAddress); HandleNodeResolve(context, &services[i], Span<Inet::IPAddress>(address, 1), error); } } @@ -113,10 +116,10 @@ CHIP_ERROR AddPtrRecord(DiscoveryFilterType type, const char ** entries, size_t template <class T> CHIP_ERROR AddPtrRecord(DiscoveryFilterType type, const char ** entries, size_t & entriesCount, char * buffer, size_t bufferLen, - chip::Optional<T> value) + const std::optional<T> & value) { - VerifyOrReturnError(value.HasValue(), CHIP_NO_ERROR); - return AddPtrRecord(type, entries, entriesCount, buffer, bufferLen, value.Value()); + VerifyOrReturnError(value.has_value(), CHIP_NO_ERROR); + return AddPtrRecord(type, entries, entriesCount, buffer, bufferLen, *value); } CHIP_ERROR ENFORCE_FORMAT(4, 5) @@ -161,36 +164,36 @@ CHIP_ERROR CopyTextRecordValue(char * buffer, size_t bufferLen, CommissioningMod } template <class T> -CHIP_ERROR CopyTextRecordValue(char * buffer, size_t bufferLen, chip::Optional<T> value) +CHIP_ERROR CopyTextRecordValue(char * buffer, size_t bufferLen, std::optional<T> value) { - VerifyOrReturnError(value.HasValue(), CHIP_ERROR_UNINITIALIZED); - return CopyTextRecordValue(buffer, bufferLen, value.Value()); + VerifyOrReturnError(value.has_value(), CHIP_ERROR_UNINITIALIZED); + return CopyTextRecordValue(buffer, bufferLen, *value); } -CHIP_ERROR CopyTextRecordValue(char * buffer, size_t bufferLen, chip::Optional<uint16_t> value1, chip::Optional<uint16_t> value2) +CHIP_ERROR CopyTextRecordValue(char * buffer, size_t bufferLen, std::optional<uint16_t> value1, std::optional<uint16_t> value2) { - VerifyOrReturnError(value1.HasValue(), CHIP_ERROR_UNINITIALIZED); - return value2.HasValue() ? CopyTextRecordValue(buffer, bufferLen, value1.Value(), value2.Value()) - : CopyTextRecordValue(buffer, bufferLen, value1.Value()); + VerifyOrReturnError(value1.has_value(), CHIP_ERROR_UNINITIALIZED); + return value2.has_value() ? CopyTextRecordValue(buffer, bufferLen, *value1, *value2) + : CopyTextRecordValue(buffer, bufferLen, *value1); } -CHIP_ERROR CopyTextRecordValue(char * buffer, size_t bufferLen, const chip::Optional<ReliableMessageProtocolConfig> optional, +CHIP_ERROR CopyTextRecordValue(char * buffer, size_t bufferLen, const std::optional<ReliableMessageProtocolConfig> & optional, TxtFieldKey key) { VerifyOrReturnError((key == TxtFieldKey::kSessionIdleInterval || key == TxtFieldKey::kSessionActiveInterval || key == TxtFieldKey::kSessionActiveThreshold), CHIP_ERROR_INVALID_ARGUMENT); - VerifyOrReturnError(optional.HasValue(), CHIP_ERROR_UNINITIALIZED); + VerifyOrReturnError(optional.has_value(), CHIP_ERROR_UNINITIALIZED); CHIP_ERROR err; if (key == TxtFieldKey::kSessionActiveThreshold) { - err = CopyTextRecordValue(buffer, bufferLen, optional.Value().mActiveThresholdTime.count()); + err = CopyTextRecordValue(buffer, bufferLen, optional->mActiveThresholdTime.count()); } else { bool isIdle = (key == TxtFieldKey::kSessionIdleInterval); - auto retryInterval = isIdle ? optional.Value().mIdleRetransTimeout : optional.Value().mActiveRetransTimeout; + auto retryInterval = isIdle ? optional->mIdleRetransTimeout : optional->mActiveRetransTimeout; if (retryInterval > kMaxRetryInterval) { ChipLogProgress(Discovery, "MRP retry interval %s value exceeds allowed range of 1 hour, using maximum available", @@ -254,7 +257,7 @@ CHIP_ERROR CopyTxtRecord(TxtFieldKey key, char * buffer, size_t bufferLen, const return CopyTextRecordValue(buffer, bufferLen, params.GetCommissioningMode()); case TxtFieldKey::kCommissionerPasscode: return CopyTextRecordValue(buffer, bufferLen, - static_cast<uint16_t>(params.GetCommissionerPasscodeSupported().ValueOr(false) ? 1 : 0)); + static_cast<uint16_t>(params.GetCommissionerPasscodeSupported().value_or(false) ? 1 : 0)); default: return CopyTxtRecord(key, buffer, bufferLen, static_cast<BaseAdvertisingParams<CommissionAdvertisingParameters>>(params)); } @@ -760,16 +763,15 @@ CHIP_ERROR DiscoveryImplPlatform::StartDiscovery(DiscoveryType type, DiscoveryFi CHIP_ERROR DiscoveryImplPlatform::StopDiscovery(DiscoveryContext & context) { - if (!context.GetBrowseIdentifier().HasValue()) + const std::optional<intptr_t> browseIdentifier = context.GetBrowseIdentifier(); + if (!browseIdentifier.has_value()) { // No discovery going on. return CHIP_NO_ERROR; } - const auto browseIdentifier = context.GetBrowseIdentifier().Value(); context.ClearBrowseIdentifier(); - - return ChipDnssdStopBrowse(browseIdentifier); + return ChipDnssdStopBrowse(*browseIdentifier); } CHIP_ERROR DiscoveryImplPlatform::ReconfirmRecord(const char * hostname, Inet::IPAddress address, Inet::InterfaceId interfaceId) diff --git a/src/lib/dnssd/Resolver.h b/src/lib/dnssd/Resolver.h index bf684cef6a12a5..28406e1dc724f1 100644 --- a/src/lib/dnssd/Resolver.h +++ b/src/lib/dnssd/Resolver.h @@ -19,13 +19,13 @@ #include <cstdint> #include <limits> +#include <optional> #include <utility> #include <inet/IPAddress.h> #include <inet/InetInterface.h> #include <inet/UDPEndPoint.h> #include <lib/core/CHIPError.h> -#include <lib/core/Optional.h> #include <lib/core/PeerId.h> #include <lib/core/ReferenceCounted.h> #include <lib/dnssd/Constants.h> @@ -74,9 +74,9 @@ class OperationalResolveDelegate class DiscoveryContext : public ReferenceCounted<DiscoveryContext> { public: - void SetBrowseIdentifier(intptr_t identifier) { mBrowseIdentifier.Emplace(identifier); } - void ClearBrowseIdentifier() { mBrowseIdentifier.ClearValue(); } - const Optional<intptr_t> & GetBrowseIdentifier() const { return mBrowseIdentifier; } + void SetBrowseIdentifier(intptr_t identifier) { mBrowseIdentifier.emplace(identifier); } + void ClearBrowseIdentifier() { mBrowseIdentifier.reset(); } + const std::optional<intptr_t> & GetBrowseIdentifier() const { return mBrowseIdentifier; } void SetDiscoveryDelegate(DiscoverNodeDelegate * delegate) { mDelegate = delegate; } void OnNodeDiscovered(const DiscoveredNodeData & nodeData) @@ -93,7 +93,7 @@ class DiscoveryContext : public ReferenceCounted<DiscoveryContext> private: DiscoverNodeDelegate * mDelegate = nullptr; - Optional<intptr_t> mBrowseIdentifier; + std::optional<intptr_t> mBrowseIdentifier; }; /** diff --git a/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp b/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp index 403da6effcd36c..64b194339b8bd1 100644 --- a/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp +++ b/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp @@ -644,9 +644,9 @@ CHIP_ERROR MinMdnsResolver::SendAllPendingQueries() { while (true) { - Optional<ActiveResolveAttempts::ScheduledAttempt> resolve = mActiveResolves.NextScheduled(); + std::optional<ActiveResolveAttempts::ScheduledAttempt> resolve = mActiveResolves.NextScheduled(); - if (!resolve.HasValue()) + if (!resolve.has_value()) { break; } @@ -657,9 +657,9 @@ CHIP_ERROR MinMdnsResolver::SendAllPendingQueries() QueryBuilder builder(std::move(buffer)); builder.Header().SetMessageId(0); - ReturnErrorOnFailure(BuildQuery(builder, resolve.Value())); + ReturnErrorOnFailure(BuildQuery(builder, *resolve)); - if (resolve.Value().firstSend) + if (resolve->firstSend) { ReturnErrorOnFailure(GlobalMinimalMdnsServer::Server().BroadcastUnicastQuery(builder.ReleasePacket(), kMdnsPort)); } @@ -744,14 +744,14 @@ CHIP_ERROR MinMdnsResolver::ScheduleRetries() ReturnErrorCodeIf(mSystemLayer == nullptr, CHIP_ERROR_INCORRECT_STATE); mSystemLayer->CancelTimer(&RetryCallback, this); - Optional<System::Clock::Timeout> delay = mActiveResolves.GetTimeUntilNextExpectedResponse(); + std::optional<System::Clock::Timeout> delay = mActiveResolves.GetTimeUntilNextExpectedResponse(); - if (!delay.HasValue()) + if (!delay.has_value()) { return CHIP_NO_ERROR; } - return mSystemLayer->StartTimer(delay.Value(), &RetryCallback, this); + return mSystemLayer->StartTimer(*delay, &RetryCallback, this); } void MinMdnsResolver::RetryCallback(System::Layer *, void * self) diff --git a/src/lib/dnssd/minimal_mdns/core/RecordWriter.cpp b/src/lib/dnssd/minimal_mdns/core/RecordWriter.cpp index 41e9985687ad81..693fc9418e91a7 100644 --- a/src/lib/dnssd/minimal_mdns/core/RecordWriter.cpp +++ b/src/lib/dnssd/minimal_mdns/core/RecordWriter.cpp @@ -50,12 +50,12 @@ RecordWriter & RecordWriter::WriteQName(const FullQName & qname) remaining.nameCount = qname.nameCount - i; // Try to find a valid offset - chip::Optional<uint16_t> offset = FindPreviousName(remaining); + std::optional<uint16_t> offset = FindPreviousName(remaining); - if (offset.HasValue()) + if (offset.has_value()) { // Pointer to offset: set the highest 2 bits - mOutput->Put16(offset.Value() | 0xC000); + mOutput->Put16(*offset | 0xC000); if (mOutput->Fit() && !isFullyCompressed) { @@ -85,13 +85,13 @@ RecordWriter & RecordWriter::WriteQName(const SerializedQNameIterator & qname) SerializedQNameIterator copy = qname; while (true) { - chip::Optional<uint16_t> offset = FindPreviousName(copy); + std::optional<uint16_t> offset = FindPreviousName(copy); - if (offset.HasValue()) + if (offset.has_value()) { // Pointer to offset: set the highest 2 bits // We guarantee that offsets saved are <= kMaxReuseOffset - mOutput->Put16(offset.Value() | 0xC000); + mOutput->Put16(*offset | 0xC000); if (mOutput->Fit() && !isFullyCompressed) { diff --git a/src/lib/dnssd/minimal_mdns/core/RecordWriter.h b/src/lib/dnssd/minimal_mdns/core/RecordWriter.h index 35e563fe870ec2..0bb80fce7cffd7 100644 --- a/src/lib/dnssd/minimal_mdns/core/RecordWriter.h +++ b/src/lib/dnssd/minimal_mdns/core/RecordWriter.h @@ -17,10 +17,11 @@ #pragma once #include <lib/core/CHIPEncoding.h> -#include <lib/core/Optional.h> #include <lib/dnssd/minimal_mdns/core/QName.h> #include <lib/support/BufferWriter.h> +#include <optional> + namespace mdns { namespace Minimal { @@ -99,7 +100,7 @@ class RecordWriter /// Find the offset at which this qname was previously seen (if any) /// works with QName and SerializedQNameIterator template <class T> - chip::Optional<uint16_t> FindPreviousName(const T & name) const + std::optional<uint16_t> FindPreviousName(const T & name) const { for (size_t i = 0; i < kMaxCachedReferences; i++) { @@ -110,7 +111,7 @@ class RecordWriter { if (previous == name) { - return chip::MakeOptional(static_cast<uint16_t>(previous.OffsetInCurrentValidData())); + return std::make_optional(static_cast<uint16_t>(previous.OffsetInCurrentValidData())); } if (!previous.Next()) @@ -120,7 +121,7 @@ class RecordWriter } } - return chip::Optional<uint16_t>::Missing(); + return std::nullopt; } /// Gets the iterator corresponding to the previous name diff --git a/src/lib/dnssd/minimal_mdns/tests/TestAdvertiser.cpp b/src/lib/dnssd/minimal_mdns/tests/TestAdvertiser.cpp index b39fd5858858c1..c868939573f1c7 100644 --- a/src/lib/dnssd/minimal_mdns/tests/TestAdvertiser.cpp +++ b/src/lib/dnssd/minimal_mdns/tests/TestAdvertiser.cpp @@ -79,7 +79,7 @@ OperationalAdvertisingParameters operationalParams1 = .SetMac(ByteSpan(kMac)) .SetPort(CHIP_PORT) .EnableIpV4(true) - .SetLocalMRPConfig(chip::Optional<ReliableMessageProtocolConfig>::Value( + .SetLocalMRPConfig(std::make_optional<ReliableMessageProtocolConfig>( 32_ms32, 30_ms32)); // Match SII, SAI. SAT not provided so it uses default 4000ms OperationalAdvertisingParameters operationalParams2 = OperationalAdvertisingParameters().SetPeerId(kPeerId2).SetMac(ByteSpan(kMac)).SetPort(CHIP_PORT).EnableIpV4(true); @@ -151,14 +151,14 @@ CommissionAdvertisingParameters commissionableNodeParamsLargeBasic = .SetMac(ByteSpan(kMac, sizeof(kMac))) .SetLongDiscriminator(22) .SetShortDiscriminator(2) - .SetVendorId(chip::Optional<uint16_t>(555)) - .SetDeviceType(chip::Optional<uint32_t>(70000)) + .SetVendorId(std::make_optional<uint16_t>(555)) + .SetDeviceType(std::make_optional<uint32_t>(70000)) .SetCommissioningMode(CommissioningMode::kEnabledBasic) - .SetDeviceName(chip::Optional<const char *>("testy-test")) - .SetPairingHint(chip::Optional<uint16_t>(3)) - .SetPairingInstruction(chip::Optional<const char *>("Pair me")) - .SetProductId(chip::Optional<uint16_t>(897)) - .SetRotatingDeviceId(chip::Optional<const char *>("id_that_spins")); + .SetDeviceName(std::make_optional<const char *>("testy-test")) + .SetPairingHint(std::make_optional<uint16_t>(3)) + .SetPairingInstruction(std::make_optional<const char *>("Pair me")) + .SetProductId(std::make_optional<uint16_t>(897)) + .SetRotatingDeviceId(std::make_optional<const char *>("id_that_spins")); QNamePart txtCommissionableNodeParamsLargeBasicParts[] = { "D=22", "VP=555+897", "CM=1", "DT=70000", "DN=testy-test", "RI=id_that_spins", "PI=Pair me", "PH=3" }; FullQName txtCommissionableNodeParamsLargeBasicName = FullQName(txtCommissionableNodeParamsLargeBasicParts); @@ -171,17 +171,17 @@ CommissionAdvertisingParameters commissionableNodeParamsLargeEnhanced = .SetMac(ByteSpan(kMac, sizeof(kMac))) .SetLongDiscriminator(22) .SetShortDiscriminator(2) - .SetVendorId(chip::Optional<uint16_t>(555)) - .SetDeviceType(chip::Optional<uint32_t>(70000)) + .SetVendorId(std::make_optional<uint16_t>(555)) + .SetDeviceType(std::make_optional<uint32_t>(70000)) .SetCommissioningMode(CommissioningMode::kEnabledEnhanced) - .SetDeviceName(chip::Optional<const char *>("testy-test")) - .SetPairingHint(chip::Optional<uint16_t>(3)) - .SetPairingInstruction(chip::Optional<const char *>("Pair me")) - .SetProductId(chip::Optional<uint16_t>(897)) - .SetRotatingDeviceId(chip::Optional<const char *>("id_that_spins")) + .SetDeviceName(std::make_optional<const char *>("testy-test")) + .SetPairingHint(std::make_optional<uint16_t>(3)) + .SetPairingInstruction(std::make_optional<const char *>("Pair me")) + .SetProductId(std::make_optional<uint16_t>(897)) + .SetRotatingDeviceId(std::make_optional<const char *>("id_that_spins")) .SetICDModeToAdvertise(ICDModeAdvertise::kSIT) // 3600005 is more than the max so should be adjusted down - .SetLocalMRPConfig(Optional<ReliableMessageProtocolConfig>::Value(3600000_ms32, 3600005_ms32, 65535_ms16)); + .SetLocalMRPConfig(std::make_optional<ReliableMessageProtocolConfig>(3600000_ms32, 3600005_ms32, 65535_ms16)); QNamePart txtCommissionableNodeParamsLargeEnhancedParts[] = { "D=22", "VP=555+897", "CM=2", "DT=70000", "DN=testy-test", "RI=id_that_spins", "PI=Pair me", "PH=3", "SAI=3600000", "SII=3600000", "SAT=65535", "ICD=0" }; @@ -196,15 +196,15 @@ CommissionAdvertisingParameters commissionableNodeParamsEnhancedAsICDLIT = .SetMac(ByteSpan(kMac, sizeof(kMac))) .SetLongDiscriminator(22) .SetShortDiscriminator(2) - .SetVendorId(chip::Optional<uint16_t>(555)) - .SetDeviceType(chip::Optional<uint32_t>(70000)) + .SetVendorId(std::make_optional<uint16_t>(555)) + .SetDeviceType(std::make_optional<uint32_t>(70000)) .SetCommissioningMode(CommissioningMode::kEnabledEnhanced) - .SetDeviceName(chip::Optional<const char *>("testy-test")) - .SetPairingHint(chip::Optional<uint16_t>(3)) - .SetPairingInstruction(chip::Optional<const char *>("Pair me")) - .SetProductId(chip::Optional<uint16_t>(897)) + .SetDeviceName(std::make_optional<const char *>("testy-test")) + .SetPairingHint(std::make_optional<uint16_t>(3)) + .SetPairingInstruction(std::make_optional<const char *>("Pair me")) + .SetProductId(std::make_optional<uint16_t>(897)) .SetICDModeToAdvertise(ICDModeAdvertise::kLIT) - .SetLocalMRPConfig(Optional<ReliableMessageProtocolConfig>::Value(3600000_ms32, 3600000_ms32, 65535_ms16)); + .SetLocalMRPConfig(std::make_optional<ReliableMessageProtocolConfig>(3600000_ms32, 3600000_ms32, 65535_ms16)); // With ICD Operation as LIT, SII key will not be added to the advertisement QNamePart txtCommissionableNodeParamsEnhancedAsICDLITParts[] = { "D=22", "VP=555+897", "CM=2", "DT=70000", "DN=testy-test", "PI=Pair me", "PH=3", "SAI=3600000", diff --git a/src/lib/dnssd/platform/Dnssd.h b/src/lib/dnssd/platform/Dnssd.h index fcbeabe1ce8d51..02fb851a12d861 100644 --- a/src/lib/dnssd/platform/Dnssd.h +++ b/src/lib/dnssd/platform/Dnssd.h @@ -26,12 +26,12 @@ #pragma once #include <algorithm> +#include <optional> #include <stdint.h> #include <inet/IPAddress.h> #include <inet/InetInterface.h> #include <lib/core/CHIPError.h> -#include <lib/core/Optional.h> #include <lib/dnssd/Constants.h> #include <lib/dnssd/ServiceNaming.h> #include <system/TimeSource.h> @@ -77,7 +77,7 @@ struct DnssdService size_t mTextEntrySize; const char ** mSubTypes; size_t mSubTypeSize; - Optional<chip::Inet::IPAddress> mAddress; + std::optional<chip::Inet::IPAddress> mAddress; // Time to live in seconds. Per rfc6762 section 10, because we have a hostname, our default TTL is 120 seconds uint32_t mTtlSeconds = 120; diff --git a/src/lib/dnssd/platform/tests/TestPlatform.cpp b/src/lib/dnssd/platform/tests/TestPlatform.cpp index ebdb46643847c6..324863a948902d 100644 --- a/src/lib/dnssd/platform/tests/TestPlatform.cpp +++ b/src/lib/dnssd/platform/tests/TestPlatform.cpp @@ -46,14 +46,14 @@ test::ExpectedCall operationalCall1 = test::ExpectedCall() .SetInstanceName("BEEFBEEFF00DF00D-1111222233334444") .SetHostName(host) .AddSubtype("_IBEEFBEEFF00DF00D"); -OperationalAdvertisingParameters operationalParams2 = - OperationalAdvertisingParameters() - .SetPeerId(kPeerId2) - .SetMac(ByteSpan(kMac)) - .SetPort(CHIP_PORT) - .EnableIpV4(true) - .SetLocalMRPConfig(Optional<ReliableMessageProtocolConfig>::Value(32_ms32, 30_ms32, 10_ms16)) // SII and SAI to match below - .SetICDModeToAdvertise(ICDModeAdvertise::kSIT); +OperationalAdvertisingParameters operationalParams2 = OperationalAdvertisingParameters() + .SetPeerId(kPeerId2) + .SetMac(ByteSpan(kMac)) + .SetPort(CHIP_PORT) + .EnableIpV4(true) + .SetLocalMRPConfig(std::make_optional<ReliableMessageProtocolConfig>( + 32_ms32, 30_ms32, 10_ms16)) // SII and SAI to match below + .SetICDModeToAdvertise(ICDModeAdvertise::kSIT); test::ExpectedCall operationalCall2 = test::ExpectedCall() .SetProtocol(DnssdServiceProtocol::kDnssdProtocolTcp) .SetServiceName("_matter") @@ -87,17 +87,17 @@ CommissionAdvertisingParameters commissionableNodeParamsLargeBasic = .SetMac(ByteSpan(kMac, sizeof(kMac))) .SetLongDiscriminator(22) .SetShortDiscriminator(2) - .SetVendorId(Optional<uint16_t>(555)) - .SetDeviceType(Optional<uint32_t>(70000)) + .SetVendorId(std::make_optional<uint16_t>(555)) + .SetDeviceType(std::make_optional<uint32_t>(70000)) .SetCommissioningMode(CommissioningMode::kEnabledBasic) - .SetDeviceName(Optional<const char *>("testy-test")) - .SetPairingHint(Optional<uint16_t>(3)) - .SetPairingInstruction(Optional<const char *>("Pair me")) - .SetProductId(Optional<uint16_t>(897)) - .SetRotatingDeviceId(Optional<const char *>("id_that_spins")) + .SetDeviceName(std::make_optional<const char *>("testy-test")) + .SetPairingHint(std::make_optional<uint16_t>(3)) + .SetPairingInstruction(std::make_optional<const char *>("Pair me")) + .SetProductId(std::make_optional<uint16_t>(897)) + .SetRotatingDeviceId(std::make_optional<const char *>("id_that_spins")) .SetICDModeToAdvertise(ICDModeAdvertise::kSIT) // 3600005 is over the max, so this should be adjusted by the platform - .SetLocalMRPConfig(Optional<ReliableMessageProtocolConfig>::Value(3600000_ms32, 3600005_ms32, 65535_ms16)); + .SetLocalMRPConfig(std::make_optional<ReliableMessageProtocolConfig>(3600000_ms32, 3600005_ms32, 65535_ms16)); test::ExpectedCall commissionableLargeBasic = test::ExpectedCall() .SetProtocol(DnssdServiceProtocol::kDnssdProtocolUdp) @@ -126,14 +126,14 @@ CommissionAdvertisingParameters commissionableNodeParamsLargeEnhanced = .SetMac(ByteSpan(kMac, sizeof(kMac))) .SetLongDiscriminator(22) .SetShortDiscriminator(2) - .SetVendorId(chip::Optional<uint16_t>(555)) - .SetDeviceType(chip::Optional<uint32_t>(70000)) + .SetVendorId(std::make_optional<uint16_t>(555)) + .SetDeviceType(std::make_optional<uint32_t>(70000)) .SetCommissioningMode(CommissioningMode::kEnabledEnhanced) - .SetDeviceName(chip::Optional<const char *>("testy-test")) - .SetPairingHint(chip::Optional<uint16_t>(3)) - .SetPairingInstruction(chip::Optional<const char *>("Pair me")) - .SetProductId(chip::Optional<uint16_t>(897)) - .SetRotatingDeviceId(chip::Optional<const char *>("id_that_spins")); + .SetDeviceName(std::make_optional<const char *>("testy-test")) + .SetPairingHint(std::make_optional<uint16_t>(3)) + .SetPairingInstruction(std::make_optional<const char *>("Pair me")) + .SetProductId(std::make_optional<uint16_t>(897)) + .SetRotatingDeviceId(std::make_optional<const char *>("id_that_spins")); test::ExpectedCall commissionableLargeEnhanced = test::ExpectedCall() .SetProtocol(DnssdServiceProtocol::kDnssdProtocolUdp) diff --git a/src/lib/dnssd/tests/TestActiveResolveAttempts.cpp b/src/lib/dnssd/tests/TestActiveResolveAttempts.cpp index 4c2665658f3493..0648c9880c597b 100644 --- a/src/lib/dnssd/tests/TestActiveResolveAttempts.cpp +++ b/src/lib/dnssd/tests/TestActiveResolveAttempts.cpp @@ -31,14 +31,17 @@ PeerId MakePeerId(NodeId nodeId) return peerId.SetNodeId(nodeId).SetCompressedFabricId(123); } -Optional<ActiveResolveAttempts::ScheduledAttempt> ScheduledPeer(NodeId id, bool first) +std::optional<ActiveResolveAttempts::ScheduledAttempt> ScheduledPeer(NodeId id, bool first) { - return Optional<ActiveResolveAttempts::ScheduledAttempt>::Value(ActiveResolveAttempts::ScheduledAttempt(MakePeerId(id), first)); + return std::make_optional<ActiveResolveAttempts::ScheduledAttempt>( + ActiveResolveAttempts::ScheduledAttempt(MakePeerId(id), first)); } -Optional<ActiveResolveAttempts::ScheduledAttempt> ScheduledBrowse(const Dnssd::DiscoveryFilter & filter, - const Dnssd::DiscoveryType type, bool first) + +std::optional<ActiveResolveAttempts::ScheduledAttempt> ScheduledBrowse(const Dnssd::DiscoveryFilter & filter, + const Dnssd::DiscoveryType type, bool first) { - return Optional<ActiveResolveAttempts::ScheduledAttempt>::Value(ActiveResolveAttempts::ScheduledAttempt(filter, type, first)); + return std::make_optional<ActiveResolveAttempts::ScheduledAttempt>( + ActiveResolveAttempts::ScheduledAttempt(filter, type, first)); } TEST(TestActiveResolveAttempts, TestSinglePeerAddRemove) @@ -49,39 +52,39 @@ TEST(TestActiveResolveAttempts, TestSinglePeerAddRemove) mockClock.AdvanceMonotonic(1234_ms32); // Starting up, no scheduled peers are expected - EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().HasValue()); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().has_value()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // Adding a single peer should result in it being scheduled attempts.MarkPending(MakePeerId(1)); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(0_ms32)); EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, true)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // one Next schedule is called, expect to have a delay of 1000 ms - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(1000_ms32)); mockClock.AdvanceMonotonic(500_ms32); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(500_ms32)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(500_ms32)); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // past due date: timeout should be 0 mockClock.AdvanceMonotonic(800_ms32); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(0_ms32)); EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, false)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // one Next schedule is called, expect to have a delay of 2000 ms // sincve the timeout doubles every time - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(2000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(2000_ms32)); mockClock.AdvanceMonotonic(100_ms32); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1900_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(1900_ms32)); // once complete, nothing to schedule attempts.Complete(MakePeerId(1)); - EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().HasValue()); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().has_value()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); } TEST(TestActiveResolveAttempts, TestSingleBrowseAddRemove) @@ -94,41 +97,41 @@ TEST(TestActiveResolveAttempts, TestSingleBrowseAddRemove) mockClock.AdvanceMonotonic(1234_ms32); // Starting up, no scheduled peers are expected - EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().HasValue()); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().has_value()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // Adding a single attempt should result in it being scheduled attempts.MarkPending(filter, type); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(0_ms32)); EXPECT_EQ(attempts.NextScheduled(), ScheduledBrowse(filter, type, true)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // one Next schedule is called, expect to have a delay of 1000 ms - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(1000_ms32)); mockClock.AdvanceMonotonic(500_ms32); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(500_ms32)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(500_ms32)); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // past due date: timeout should be 0 mockClock.AdvanceMonotonic(800_ms32); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(0_ms32)); EXPECT_EQ(attempts.NextScheduled(), ScheduledBrowse(filter, type, false)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // one Next schedule is called, expect to have a delay of 2000 ms // sincve the timeout doubles every time - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(2000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(2000_ms32)); mockClock.AdvanceMonotonic(100_ms32); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1900_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(1900_ms32)); // once complete, nothing to schedule Dnssd::DiscoveredNodeData data; data.Set<chip::Dnssd::CommissionNodeData>(); data.Get<chip::Dnssd::CommissionNodeData>().longDiscriminator = 1234; attempts.CompleteCommissionable(data); - EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().HasValue()); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().has_value()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); } TEST(TestActiveResolveAttempts, TestRescheduleSamePeerId) @@ -140,27 +143,27 @@ TEST(TestActiveResolveAttempts, TestRescheduleSamePeerId) attempts.MarkPending(MakePeerId(1)); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(0_ms32)); EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, true)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // one Next schedule is called, expect to have a delay of 1000 ms - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(1000_ms32)); // 2nd try goes to 2 seconds (once at least 1 second passes) mockClock.AdvanceMonotonic(1234_ms32); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(0_ms32)); EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, false)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(2000_ms32)); + EXPECT_FALSE(attempts.NextScheduled().has_value()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(2000_ms32)); // reschedule starts fresh attempts.MarkPending(MakePeerId(1)); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(0_ms32)); EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, true)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); + EXPECT_FALSE(attempts.NextScheduled().has_value()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(1000_ms32)); } TEST(TestActiveResolveAttempts, TestRescheduleSameFilter) @@ -174,27 +177,27 @@ TEST(TestActiveResolveAttempts, TestRescheduleSameFilter) attempts.MarkPending(filter, type); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(0_ms32)); EXPECT_EQ(attempts.NextScheduled(), ScheduledBrowse(filter, type, true)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // one Next schedule is called, expect to have a delay of 1000 ms - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(1000_ms32)); // 2nd try goes to 2 seconds (once at least 1 second passes) mockClock.AdvanceMonotonic(1234_ms32); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(0_ms32)); EXPECT_EQ(attempts.NextScheduled(), ScheduledBrowse(filter, type, false)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(2000_ms32)); + EXPECT_FALSE(attempts.NextScheduled().has_value()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(2000_ms32)); // reschedule starts fresh attempts.MarkPending(filter, type); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(0_ms32)); EXPECT_EQ(attempts.NextScheduled(), ScheduledBrowse(filter, type, true)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); + EXPECT_FALSE(attempts.NextScheduled().has_value()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(1000_ms32)); } TEST(TestActiveResolveAttempts, TestLRU) @@ -208,15 +211,15 @@ TEST(TestActiveResolveAttempts, TestLRU) // add a single very old peer attempts.MarkPending(MakePeerId(9999)); EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(9999, true)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); mockClock.AdvanceMonotonic(1000_ms32); EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(9999, false)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); mockClock.AdvanceMonotonic(2000_ms32); EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(9999, false)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // at this point, peer 9999 has a delay of 4 seconds. Fill up the rest of the table @@ -226,25 +229,26 @@ TEST(TestActiveResolveAttempts, TestLRU) mockClock.AdvanceMonotonic(1_ms32); EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(i, true)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); } // +2 because: 1 element skipped, one element is the "current" that has a delay of 1000ms EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), - Optional<System::Clock::Timeout>::Value( + std::make_optional<System::Clock::Timeout>( System::Clock::Milliseconds32(1000 - mdns::Minimal::ActiveResolveAttempts::kRetryQueueSize + 2))); // add another element - this should overwrite peer 9999 attempts.MarkPending(MakePeerId(mdns::Minimal::ActiveResolveAttempts::kRetryQueueSize)); mockClock.AdvanceMonotonic(32_s16); - for (Optional<ActiveResolveAttempts::ScheduledAttempt> s = attempts.NextScheduled(); s.HasValue(); s = attempts.NextScheduled()) + for (std::optional<ActiveResolveAttempts::ScheduledAttempt> s = attempts.NextScheduled(); s.has_value(); + s = attempts.NextScheduled()) { - EXPECT_NE(s.Value().ResolveData().peerId.GetNodeId(), 9999u); + EXPECT_NE(s->ResolveData().peerId.GetNodeId(), 9999u); } // Still have active pending items (queue is full) - EXPECT_TRUE(attempts.GetTimeUntilNextExpectedResponse().HasValue()); + EXPECT_TRUE(attempts.GetTimeUntilNextExpectedResponse().has_value()); // expire all of them. Since we double timeout every expiry, we expect a // few iteratios to be able to expire the entire queue @@ -253,18 +257,19 @@ TEST(TestActiveResolveAttempts, TestLRU) int i = 0; for (; i < kMaxIterations; i++) { - Optional<System::Clock::Timeout> ms = attempts.GetTimeUntilNextExpectedResponse(); - if (!ms.HasValue()) + std::optional<System::Clock::Timeout> ms = attempts.GetTimeUntilNextExpectedResponse(); + if (!ms.has_value()) { break; } - mockClock.AdvanceMonotonic(ms.Value()); + mockClock.AdvanceMonotonic(*ms); - Optional<ActiveResolveAttempts::ScheduledAttempt> s = attempts.NextScheduled(); - while (s.HasValue()) + std::optional<ActiveResolveAttempts::ScheduledAttempt> s = attempts.NextScheduled(); + while (s.has_value()) { - EXPECT_NE(s.Value().ResolveData().peerId.GetNodeId(), 9999u); + // NOLINTNEXTLINE(bugprone-unchecked-optional-access): this is checked in the while loop + EXPECT_NE(s->ResolveData().peerId.GetNodeId(), 9999u); s = attempts.NextScheduled(); } } @@ -282,48 +287,48 @@ TEST(TestActiveResolveAttempts, TestNextPeerOrdering) attempts.MarkPending(MakePeerId(1)); EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, true)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); + EXPECT_FALSE(attempts.NextScheduled().has_value()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(1000_ms32)); mockClock.AdvanceMonotonic(20_ms32); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(980_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(980_ms32)); // expect peerid to be resolve within 1 second from now attempts.MarkPending(MakePeerId(2)); // mock that we are querying 2 as well EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(2, true)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); mockClock.AdvanceMonotonic(80_ms32); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(900_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(900_ms32)); // Peer 1 is done, now peer2 should be pending (in 980ms) attempts.Complete(MakePeerId(1)); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(920_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(920_ms32)); mockClock.AdvanceMonotonic(20_ms32); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(900_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(900_ms32)); // Once peer 3 is added, queue should be // - 900 ms until peer id 2 is pending // - 1000 ms until peer id 3 is pending attempts.MarkPending(MakePeerId(3)); EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(3, true)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(900_ms32)); + EXPECT_FALSE(attempts.NextScheduled().has_value()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(900_ms32)); // After the clock advance // - 400 ms until peer id 2 is pending // - 500 ms until peer id 3 is pending mockClock.AdvanceMonotonic(500_ms32); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(400_ms32)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(400_ms32)); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // advancing the clock 'too long' will return both other entries, in reverse order due to how // the internal cache is built mockClock.AdvanceMonotonic(500_ms32); EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(3, false)); EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(2, false)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); } TEST(TestActiveResolveAttempts, TestCombination) @@ -342,32 +347,32 @@ TEST(TestActiveResolveAttempts, TestCombination) EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, true)); EXPECT_EQ(attempts.NextScheduled(), ScheduledBrowse(filter, type, true)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // At this point, both should reset, so we're back to 1000ms - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(1000_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(1000_ms32)); // We used 20 ms, so the next time for the peer and resolve should be 980 ms mockClock.AdvanceMonotonic(20_ms32); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(980_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(980_ms32)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // Add a second Peer mockClock.AdvanceMonotonic(20_ms32); attempts.MarkPending(MakePeerId(2)); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(0_ms32)); EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(2, true)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // Advance to the retry time of peer 1 and the resolve mockClock.AdvanceMonotonic(960_ms32); - EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), Optional<Timeout>(0_ms32)); + EXPECT_EQ(attempts.GetTimeUntilNextExpectedResponse(), std::make_optional<Timeout>(0_ms32)); EXPECT_EQ(attempts.NextScheduled(), ScheduledPeer(1, false)); EXPECT_EQ(attempts.NextScheduled(), ScheduledBrowse(filter, type, false)); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); // Complete all, we should see no more scheduled. attempts.Complete(MakePeerId(2)); @@ -377,7 +382,7 @@ TEST(TestActiveResolveAttempts, TestCombination) data.Get<chip::Dnssd::CommissionNodeData>().longDiscriminator = 1234; attempts.CompleteCommissionable(data); - EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().HasValue()); - EXPECT_FALSE(attempts.NextScheduled().HasValue()); + EXPECT_FALSE(attempts.GetTimeUntilNextExpectedResponse().has_value()); + EXPECT_FALSE(attempts.NextScheduled().has_value()); } } // namespace diff --git a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp index 1c14aeb91dd21d..c28cb86edf0085 100644 --- a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp +++ b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp @@ -1738,7 +1738,7 @@ CHIP_ERROR GenericThreadStackManagerImpl_OpenThread<ImplClass>::FromOtDnsRespons if (!otIp6IsAddressUnspecified(&serviceInfo.mHostAddress)) { mdnsService.mAddressType = Inet::IPAddressType::kIPv6; - mdnsService.mAddress = MakeOptional(ToIPAddress(serviceInfo.mHostAddress)); + mdnsService.mAddress = std::make_optional(ToIPAddress(serviceInfo.mHostAddress)); } // Check if TXT record was included in DNS response. @@ -1812,9 +1812,9 @@ void GenericThreadStackManagerImpl_OpenThread<ImplClass>::DispatchResolve(intptr Dnssd::DnssdService & service = dnsResult->mMdnsService; Span<Inet::IPAddress> ipAddrs; - if (service.mAddress.HasValue()) + if (service.mAddress.has_value()) { - ipAddrs = Span<Inet::IPAddress>(&service.mAddress.Value(), 1); + ipAddrs = Span<Inet::IPAddress>(&*service.mAddress, 1); } ThreadStackMgrImpl().mDnsResolveCallback(dnsResult->context, &service, ipAddrs, dnsResult->error); @@ -1964,7 +1964,7 @@ void GenericThreadStackManagerImpl_OpenThread<ImplClass>::OnDnsAddressResolveRes error = MapOpenThreadError(otDnsAddressResponseGetAddress(aResponse, 0, &address, nullptr)); if (error == CHIP_NO_ERROR) { - dnsResult->mMdnsService.mAddress = MakeOptional(ToIPAddress(address)); + dnsResult->mMdnsService.mAddress = std::make_optional(ToIPAddress(address)); } dnsResult->error = error; diff --git a/src/platform/Tizen/DnssdImpl.cpp b/src/platform/Tizen/DnssdImpl.cpp index cc3e5a1e8f76a6..1b57e1811a1495 100644 --- a/src/platform/Tizen/DnssdImpl.cpp +++ b/src/platform/Tizen/DnssdImpl.cpp @@ -354,7 +354,7 @@ void OnResolve(dnssd_error_e result, dnssd_service_h service, void * userData) VerifyOrExit(ret == DNSSD_ERROR_NONE, ChipLogError(DeviceLayer, "dnssd_service_get_all_txt_record() failed: %s", get_error_message(ret))); - rCtx->mResult.mAddress.SetValue(ipAddr); + rCtx->mResult.mAddress.emplace(ipAddr); { // Before calling the Resolve() callback, we need to lock stack mutex. @@ -467,7 +467,7 @@ void ResolveContext::Finalize(CHIP_ERROR error) mResult.mTextEntries = textEntries.empty() ? nullptr : textEntries.data(); mResult.mTextEntrySize = textEntries.size(); - chip::Inet::IPAddress ipAddr = mResult.mAddress.Value(); + chip::Inet::IPAddress ipAddr = mResult.mAddress.value(); mCallback(mCbContext, &mResult, chip::Span<chip::Inet::IPAddress>(&ipAddr, 1), CHIP_NO_ERROR); } diff --git a/src/platform/nxp/common/DnssdImpl.cpp b/src/platform/nxp/common/DnssdImpl.cpp index 8050da137f26b8..17116f21fc277f 100644 --- a/src/platform/nxp/common/DnssdImpl.cpp +++ b/src/platform/nxp/common/DnssdImpl.cpp @@ -778,9 +778,9 @@ void DispatchResolve(intptr_t context) Dnssd::DnssdService & service = resolveContext->mMdnsService; Span<Inet::IPAddress> ipAddrs; - if (service.mAddress.HasValue()) + if (service.mAddress.has_value()) { - ipAddrs = Span<Inet::IPAddress>(&service.mAddress.Value(), 1); + ipAddrs = Span<Inet::IPAddress>(&*service.mAddress, 1); } mDnsResolveCallback(resolveContext->matterCtx, &service, ipAddrs, resolveContext->error); From 745c17cd10b957aa82683837726c51de316fdf9d Mon Sep 17 00:00:00 2001 From: Mihai Ignat <50373067+mihai-ignat@users.noreply.github.com> Date: Tue, 30 Apr 2024 20:05:54 +0300 Subject: [PATCH 088/124] [nxp][platform][k32w] BLE force disconnect handler calls API to allow low power (#33167) --- src/platform/nxp/k32w/common/BLEManagerCommon.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/platform/nxp/k32w/common/BLEManagerCommon.cpp b/src/platform/nxp/k32w/common/BLEManagerCommon.cpp index 12b32b8e4b71b2..4c9048a3f68192 100644 --- a/src/platform/nxp/k32w/common/BLEManagerCommon.cpp +++ b/src/platform/nxp/k32w/common/BLEManagerCommon.cpp @@ -1075,6 +1075,10 @@ void BLEManagerCommon::HandleForceDisconnect() { ChipLogProgress(DeviceLayer, "Gap_Disconnect() failed."); } + +#if defined(chip_with_low_power) && (chip_with_low_power == 1) + PWR_AllowDeviceToSleep(); +#endif } /******************************************************************************* From a30b439061036455538a61969c5d170167721a6d Mon Sep 17 00:00:00 2001 From: Andrei Litvin <andy314@gmail.com> Date: Tue, 30 Apr 2024 13:15:25 -0400 Subject: [PATCH 089/124] Some interface cleanup and make AttributeValueEncoder/Decoder more similar (#33028) * Uniform API: provide subject descriptor only for both value encode and decode * Split out AttributeEncodeState and decouple things to use less friend classes * Fix tests * Slight move around based on pahole results, to try to make size differences a bit smaller * Fix typo ... amazingly enough tests still pass, so test read is maybe broken * Two more replacements for state compare logic * Restyle * Fix logic error in Descripto creation for test * Update argument name * Remove useless comments * move AttributeEncodeState to a separate file * Make the copy from a pointer logic cleaner * Fix value passing * Fix const correctness * Fix one more compile * Put back AccessingFabricIndex * Updated back the comments and file layout --------- Co-authored-by: Andrei Litvin <andreilitvin@google.com> --- src/app/AttributeEncodeState.h | 103 ++++++++++++++++++ src/app/AttributeValueEncoder.cpp | 10 +- src/app/AttributeValueEncoder.h | 59 +++------- src/app/BUILD.gn | 1 + src/app/ConcreteAttributePath.h | 2 +- src/app/ReadHandler.cpp | 4 +- src/app/ReadHandler.h | 6 +- src/app/dynamic_server/DynamicDispatcher.cpp | 2 +- src/app/reporting/Engine.cpp | 8 +- src/app/reporting/Engine.h | 3 +- src/app/tests/TestAttributeValueEncoder.cpp | 32 +++++- src/app/tests/TestPowerSourceCluster.cpp | 3 +- src/app/tests/TestReadInteraction.cpp | 4 +- .../tests/integration/chip_im_initiator.cpp | 2 +- .../tests/integration/chip_im_responder.cpp | 5 +- .../util/ember-compatibility-functions.cpp | 15 ++- src/app/util/ember-compatibility-functions.h | 2 +- src/app/util/mock/Functions.h | 2 +- src/app/util/mock/attribute-storage.cpp | 11 +- src/controller/tests/data_model/TestRead.cpp | 35 +++--- 20 files changed, 201 insertions(+), 108 deletions(-) create mode 100644 src/app/AttributeEncodeState.h diff --git a/src/app/AttributeEncodeState.h b/src/app/AttributeEncodeState.h new file mode 100644 index 00000000000000..271e16235f0947 --- /dev/null +++ b/src/app/AttributeEncodeState.h @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2021-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. + */ +#pragma once + +#include <lib/core/DataModelTypes.h> + +namespace chip { +namespace app { + +/// Maintains the internal state of list encoding +/// +/// List encoding is generally assumed incremental and chunkable (i.e. +/// partial encoding is ok.). For this purpose the class maintains two +/// pieces of data: +/// - AllowPartialData tracks if partial encoding is acceptable in the +/// current encoding state (to be used for atomic/non-atomic list item writes) +/// - CurrentEncodingListIndex representing the list index that is next +/// to be encoded in the output. kInvalidListIndex means that a new list +/// encoding has been started. +class AttributeEncodeState +{ +public: + AttributeEncodeState() = default; + + /// Allows the encode state to be initialized from an OPTIONAL + /// other encoding state + /// + /// if other is nullptr, this is the same as the default initializer. + AttributeEncodeState(const AttributeEncodeState * other) + { + if (other != nullptr) + { + *this = *other; + } + else + { + mCurrentEncodingListIndex = kInvalidListIndex; + mAllowPartialData = false; + } + } + + bool AllowPartialData() const { return mAllowPartialData; } + ListIndex CurrentEncodingListIndex() const { return mCurrentEncodingListIndex; } + + AttributeEncodeState & SetAllowPartialData(bool allow) + { + mAllowPartialData = allow; + return *this; + } + + AttributeEncodeState & SetCurrentEncodingListIndex(ListIndex idx) + { + mCurrentEncodingListIndex = idx; + return *this; + } + + void Reset() + { + mCurrentEncodingListIndex = kInvalidListIndex; + mAllowPartialData = false; + } + +private: + /** + * If set to kInvalidListIndex, indicates that we have not encoded any data for the list yet and + * need to start by encoding an empty list before we start encoding any list items. + * + * When set to a valid ListIndex value, indicates the index of the next list item that needs to be + * encoded (i.e. the count of items encoded so far). + */ + ListIndex mCurrentEncodingListIndex = kInvalidListIndex; + + /** + * When an attempt to encode an attribute returns an error, the buffer may contain tailing dirty data + * (since the put was aborted). The report engine normally rolls back the buffer to right before encoding + * of the attribute started on errors. + * + * When chunking a list, EncodeListItem will atomically encode list items, ensuring that the + * state of the buffer is valid to send (i.e. contains no trailing garbage), and return an error + * if the list doesn't entirely fit. In this situation, mAllowPartialData is set to communicate to the + * report engine that it should not roll back the list items. + * + * TODO: There might be a better name for this variable. + */ + bool mAllowPartialData = false; +}; + +} // namespace app +} // namespace chip diff --git a/src/app/AttributeValueEncoder.cpp b/src/app/AttributeValueEncoder.cpp index da4edd1fc483e7..4b6bb10e66abdb 100644 --- a/src/app/AttributeValueEncoder.cpp +++ b/src/app/AttributeValueEncoder.cpp @@ -32,13 +32,13 @@ CHIP_ERROR AttributeValueEncoder::EnsureListStarted() { VerifyOrDie(mCurrentEncodingListIndex == kInvalidListIndex); - mEncodingInitialList = (mEncodeState.mCurrentEncodingListIndex == kInvalidListIndex); + mEncodingInitialList = (mEncodeState.CurrentEncodingListIndex() == kInvalidListIndex); if (mEncodingInitialList) { // Clear mAllowPartialData flag here since this encode procedure is not atomic. // The most common error in this function is CHIP_ERROR_NO_MEMORY / CHIP_ERROR_BUFFER_TOO_SMALL, just revert and try // next time is ok. - mEncodeState.mAllowPartialData = false; + mEncodeState.SetAllowPartialData(false); AttributeReportBuilder builder; @@ -59,7 +59,7 @@ CHIP_ERROR AttributeValueEncoder::EnsureListStarted() ReturnErrorOnFailure( mAttributeReportIBsBuilder.GetWriter()->ReserveBuffer(kEndOfAttributeReportIBByteCount + kEndOfListByteCount)); - mEncodeState.mCurrentEncodingListIndex = 0; + mEncodeState.SetCurrentEncodingListIndex(0); } else { @@ -72,7 +72,7 @@ CHIP_ERROR AttributeValueEncoder::EnsureListStarted() // After encoding the initial list start, the remaining items are atomically encoded into the buffer. Tell report engine to not // revert partial data. - mEncodeState.mAllowPartialData = true; + mEncodeState.SetAllowPartialData(true); return CHIP_NO_ERROR; } @@ -105,7 +105,7 @@ void AttributeValueEncoder::EnsureListEnded() // If we succeeded at encoding the whole list (i.e. the list is in fact // empty and we fit in the packet), mAllowPartialData will be ignored, // so it's safe to set it to false even if encoding succeeded. - mEncodeState.mAllowPartialData = false; + mEncodeState.SetAllowPartialData(false); } } diff --git a/src/app/AttributeValueEncoder.h b/src/app/AttributeValueEncoder.h index d5efe1768c9d06..5c196f91f2e426 100644 --- a/src/app/AttributeValueEncoder.h +++ b/src/app/AttributeValueEncoder.h @@ -16,6 +16,8 @@ */ #pragma once +#include <access/SubjectDescriptor.h> +#include <app/AttributeEncodeState.h> #include <app/AttributeReportBuilder.h> #include <app/ConcreteAttributePath.h> #include <app/MessageDef/AttributeReportIBs.h> @@ -51,9 +53,9 @@ class AttributeValueEncoder // If we are encoding for a fabric filtered attribute read and the fabric index does not match that present in the // request, skip encoding this list item. VerifyOrReturnError(!mAttributeValueEncoder.mIsFabricFiltered || - aArg.GetFabricIndex() == mAttributeValueEncoder.mAccessingFabricIndex, + aArg.GetFabricIndex() == mAttributeValueEncoder.AccessingFabricIndex(), CHIP_NO_ERROR); - return mAttributeValueEncoder.EncodeListItem(mAttributeValueEncoder.mAccessingFabricIndex, std::forward<T>(aArg)); + return mAttributeValueEncoder.EncodeListItem(mAttributeValueEncoder.AccessingFabricIndex(), std::forward<T>(aArg)); } template <typename T, std::enable_if_t<!DataModel::IsFabricScoped<T>::value, bool> = true> @@ -66,42 +68,11 @@ class AttributeValueEncoder AttributeValueEncoder & mAttributeValueEncoder; }; - class AttributeEncodeState - { - public: - AttributeEncodeState() : mAllowPartialData(false), mCurrentEncodingListIndex(kInvalidListIndex) {} - bool AllowPartialData() const { return mAllowPartialData; } - - private: - friend class AttributeValueEncoder; - /** - * When an attempt to encode an attribute returns an error, the buffer may contain tailing dirty data - * (since the put was aborted). The report engine normally rolls back the buffer to right before encoding - * of the attribute started on errors. - * - * When chunking a list, EncodeListItem will atomically encode list items, ensuring that the - * state of the buffer is valid to send (i.e. contains no trailing garbage), and return an error - * if the list doesn't entirely fit. In this situation, mAllowPartialData is set to communicate to the - * report engine that it should not roll back the list items. - * - * TODO: There might be a better name for this variable. - */ - bool mAllowPartialData = false; - /** - * If set to kInvalidListIndex, indicates that we have not encoded any data for the list yet and - * need to start by encoding an empty list before we start encoding any list items. - * - * When set to a valid ListIndex value, indicates the index of the next list item that needs to be - * encoded (i.e. the count of items encoded so far). - */ - ListIndex mCurrentEncodingListIndex = kInvalidListIndex; - }; - - AttributeValueEncoder(AttributeReportIBs::Builder & aAttributeReportIBsBuilder, FabricIndex aAccessingFabricIndex, + AttributeValueEncoder(AttributeReportIBs::Builder & aAttributeReportIBsBuilder, Access::SubjectDescriptor subjectDescriptor, const ConcreteAttributePath & aPath, DataVersion aDataVersion, bool aIsFabricFiltered = false, const AttributeEncodeState & aState = AttributeEncodeState()) : mAttributeReportIBsBuilder(aAttributeReportIBsBuilder), - mAccessingFabricIndex(aAccessingFabricIndex), mPath(aPath.mEndpointId, aPath.mClusterId, aPath.mAttributeId), + mSubjectDescriptor(subjectDescriptor), mPath(aPath.mEndpointId, aPath.mClusterId, aPath.mAttributeId), mDataVersion(aDataVersion), mIsFabricFiltered(aIsFabricFiltered), mEncodeState(aState) {} @@ -169,17 +140,19 @@ class AttributeValueEncoder if (err == CHIP_NO_ERROR) { // The Encode procedure finished without any error, clear the state. - mEncodeState = AttributeEncodeState(); + mEncodeState.Reset(); } return err; } bool TriedEncode() const { return mTriedEncode; } + const Access::SubjectDescriptor & GetSubjectDescriptor() const { return mSubjectDescriptor; } + /** * The accessing fabric index for this read or subscribe interaction. */ - FabricIndex AccessingFabricIndex() const { return mAccessingFabricIndex; } + FabricIndex AccessingFabricIndex() const { return GetSubjectDescriptor().fabricIndex; } /** * AttributeValueEncoder is a short lived object, and the state is persisted by mEncodeState and restored by constructor. @@ -195,7 +168,7 @@ class AttributeValueEncoder { // EncodeListItem must be called after EnsureListStarted(), thus mCurrentEncodingListIndex and // mEncodeState.mCurrentEncodingListIndex are not invalid values. - if (mCurrentEncodingListIndex < mEncodeState.mCurrentEncodingListIndex) + if (mCurrentEncodingListIndex < mEncodeState.CurrentEncodingListIndex()) { // We have encoded this element in previous chunks, skip it. mCurrentEncodingListIndex++; @@ -226,7 +199,7 @@ class AttributeValueEncoder } mCurrentEncodingListIndex++; - mEncodeState.mCurrentEncodingListIndex++; + mEncodeState.SetCurrentEncodingListIndex(mCurrentEncodingListIndex); mEncodedAtLeastOneListItem = true; return CHIP_NO_ERROR; } @@ -266,20 +239,20 @@ class AttributeValueEncoder */ void EnsureListEnded(); - bool mTriedEncode = false; AttributeReportIBs::Builder & mAttributeReportIBsBuilder; - const FabricIndex mAccessingFabricIndex; + const Access::SubjectDescriptor mSubjectDescriptor; ConcreteDataAttributePath mPath; DataVersion mDataVersion; + bool mTriedEncode = false; bool mIsFabricFiltered = false; // mEncodingInitialList is true if we're encoding a list and we have not // started chunking it yet, so we're encoding a single attribute report IB // for the whole list, not one per item. bool mEncodingInitialList = false; // mEncodedAtLeastOneListItem becomes true once we successfully encode a list item. - bool mEncodedAtLeastOneListItem = false; - AttributeEncodeState mEncodeState; + bool mEncodedAtLeastOneListItem = false; ListIndex mCurrentEncodingListIndex = kInvalidListIndex; + AttributeEncodeState mEncodeState; }; } // namespace app diff --git a/src/app/BUILD.gn b/src/app/BUILD.gn index 042d3ba92281d4..e40847403cd01f 100644 --- a/src/app/BUILD.gn +++ b/src/app/BUILD.gn @@ -281,6 +281,7 @@ static_library("attribute-access") { "AttributeAccessInterfaceCache.h", "AttributeAccessInterfaceRegistry.cpp", "AttributeAccessInterfaceRegistry.h", + "AttributeEncodeState.h", "AttributeReportBuilder.cpp", "AttributeReportBuilder.h", "AttributeValueDecoder.h", diff --git a/src/app/ConcreteAttributePath.h b/src/app/ConcreteAttributePath.h index 03e801bd9b3395..99afb4614e574f 100644 --- a/src/app/ConcreteAttributePath.h +++ b/src/app/ConcreteAttributePath.h @@ -101,7 +101,7 @@ struct ConcreteReadAttributePath : public ConcreteAttributePath */ struct ConcreteDataAttributePath : public ConcreteAttributePath { - enum class ListOperation + enum class ListOperation : uint8_t { NotList, // Path points to an attribute that isn't a list. ReplaceAll, // Path points to an attribute that is a list, indicating that the contents of the list should be replaced in diff --git a/src/app/ReadHandler.cpp b/src/app/ReadHandler.cpp index 142df8015601ca..461add0f2dc150 100644 --- a/src/app/ReadHandler.cpp +++ b/src/app/ReadHandler.cpp @@ -841,7 +841,7 @@ void ReadHandler::PersistSubscription() void ReadHandler::ResetPathIterator() { mAttributePathExpandIterator = AttributePathExpandIterator(mpAttributePathList); - mAttributeEncoderState = AttributeValueEncoder::AttributeEncodeState(); + mAttributeEncoderState.Reset(); } void ReadHandler::AttributePathIsDirty(const AttributePathParams & aAttributeChanged) @@ -870,7 +870,7 @@ void ReadHandler::AttributePathIsDirty(const AttributePathParams & aAttributeCha // our iterator to point back to the beginning of that cluster. This ensures that the receiver will get a coherent view of // the state of the cluster as present on the server mAttributePathExpandIterator.ResetCurrentCluster(); - mAttributeEncoderState = AttributeValueEncoder::AttributeEncodeState(); + mAttributeEncoderState.Reset(); } // ReportScheduler will take care of verifying the reportability of the handler and schedule the run diff --git a/src/app/ReadHandler.h b/src/app/ReadHandler.h index f5355372ac5301..a30f1f8974ad25 100644 --- a/src/app/ReadHandler.h +++ b/src/app/ReadHandler.h @@ -412,8 +412,8 @@ class ReadHandler : public Messaging::ExchangeDelegate /// or after the min interval is reached if it has not yet been reached. void ForceDirtyState(); - const AttributeValueEncoder::AttributeEncodeState & GetAttributeEncodeState() const { return mAttributeEncoderState; } - void SetAttributeEncodeState(const AttributeValueEncoder::AttributeEncodeState & aState) { mAttributeEncoderState = aState; } + const AttributeEncodeState & GetAttributeEncodeState() const { return mAttributeEncoderState; } + void SetAttributeEncodeState(const AttributeEncodeState & aState) { mAttributeEncoderState = aState; } uint32_t GetLastWrittenEventsBytes() const { return mLastWrittenEventsBytes; } // Returns the number of interested paths, including wildcard and concrete paths. @@ -562,7 +562,7 @@ class ReadHandler : public Messaging::ExchangeDelegate // The detailed encoding state for a single attribute, used by list chunking feature. // The size of AttributeEncoderState is 2 bytes for now. - AttributeValueEncoder::AttributeEncodeState mAttributeEncoderState; + AttributeEncodeState mAttributeEncoderState; // Current Handler state HandlerState mState = HandlerState::Idle; diff --git a/src/app/dynamic_server/DynamicDispatcher.cpp b/src/app/dynamic_server/DynamicDispatcher.cpp index 5f9476aa6fd40a..e1f458f0bc3df1 100644 --- a/src/app/dynamic_server/DynamicDispatcher.cpp +++ b/src/app/dynamic_server/DynamicDispatcher.cpp @@ -123,7 +123,7 @@ Status DetermineAttributeStatus(const ConcreteAttributePath & aPath, bool aIsWri CHIP_ERROR ReadSingleClusterData(const SubjectDescriptor & aSubjectDescriptor, bool aIsFabricFiltered, const ConcreteReadAttributePath & aPath, AttributeReportIBs::Builder & aAttributeReports, - AttributeValueEncoder::AttributeEncodeState * aEncoderState) + AttributeEncodeState * aEncoderState) { Status status = DetermineAttributeStatus(aPath, /* aIsWrite = */ false); return aAttributeReports.EncodeAttributeStatus(aPath, StatusIB(status)); diff --git a/src/app/reporting/Engine.cpp b/src/app/reporting/Engine.cpp index 37c7e31dd645fb..39c582f3e45f0b 100644 --- a/src/app/reporting/Engine.cpp +++ b/src/app/reporting/Engine.cpp @@ -82,7 +82,7 @@ bool Engine::IsClusterDataVersionMatch(const SingleLinkedListNode<DataVersionFil CHIP_ERROR Engine::RetrieveClusterData(const SubjectDescriptor & aSubjectDescriptor, bool aIsFabricFiltered, AttributeReportIBs::Builder & aAttributeReportIBs, const ConcreteReadAttributePath & aPath, - AttributeValueEncoder::AttributeEncodeState * aEncoderState) + AttributeEncodeState * aEncoderState) { ChipLogDetail(DataManagement, "<RE:Run> Cluster %" PRIx32 ", Attribute %" PRIx32 " is dirty", aPath.mClusterId, aPath.mAttributeId); @@ -199,7 +199,7 @@ CHIP_ERROR Engine::BuildSingleReportDataAttributeReportIBs(ReportDataMessage::Bu attributeReportIBs.Checkpoint(attributeBackup); ConcreteReadAttributePath pathForRetrieval(readPath); // Load the saved state from previous encoding session for chunking of one single attribute (list chunking). - AttributeValueEncoder::AttributeEncodeState encodeState = apReadHandler->GetAttributeEncodeState(); + AttributeEncodeState encodeState = apReadHandler->GetAttributeEncodeState(); err = RetrieveClusterData(apReadHandler->GetSubjectDescriptor(), apReadHandler->IsFabricFiltered(), attributeReportIBs, pathForRetrieval, &encodeState); if (err != CHIP_NO_ERROR) @@ -226,7 +226,7 @@ CHIP_ERROR Engine::BuildSingleReportDataAttributeReportIBs(ReportDataMessage::Bu // We met a error during writing reports, one common case is we are running out of buffer, rollback the // attributeReportIB to avoid any partial data. attributeReportIBs.Rollback(attributeBackup); - apReadHandler->SetAttributeEncodeState(AttributeValueEncoder::AttributeEncodeState()); + apReadHandler->SetAttributeEncodeState(AttributeEncodeState()); if (!IsOutOfWriterSpaceError(err)) { @@ -256,7 +256,7 @@ CHIP_ERROR Engine::BuildSingleReportDataAttributeReportIBs(ReportDataMessage::Bu } SuccessOrExit(err); // Successfully encoded the attribute, clear the internal state. - apReadHandler->SetAttributeEncodeState(AttributeValueEncoder::AttributeEncodeState()); + apReadHandler->SetAttributeEncodeState(AttributeEncodeState()); } // We just visited all paths interested by this read handler and did not abort in the middle of iteration, there are no more // chunks for this report. diff --git a/src/app/reporting/Engine.h b/src/app/reporting/Engine.h index fccf9e08ab020f..0bf7a9f83de1ae 100644 --- a/src/app/reporting/Engine.h +++ b/src/app/reporting/Engine.h @@ -170,8 +170,7 @@ class Engine bool aBufferIsUsed, bool * apHasMoreChunks, bool * apHasEncodedData); CHIP_ERROR RetrieveClusterData(const Access::SubjectDescriptor & aSubjectDescriptor, bool aIsFabricFiltered, AttributeReportIBs::Builder & aAttributeReportIBs, - const ConcreteReadAttributePath & aClusterInfo, - AttributeValueEncoder::AttributeEncodeState * apEncoderState); + const ConcreteReadAttributePath & aClusterInfo, AttributeEncodeState * apEncoderState); CHIP_ERROR CheckAccessDeniedEventPaths(TLV::TLVWriter & aWriter, bool & aHasEncodedData, ReadHandler * apReadHandler); // If version match, it means don't send, if version mismatch, it means send. diff --git a/src/app/tests/TestAttributeValueEncoder.cpp b/src/app/tests/TestAttributeValueEncoder.cpp index 25ea87736c84e8..085c4f870cdf64 100644 --- a/src/app/tests/TestAttributeValueEncoder.cpp +++ b/src/app/tests/TestAttributeValueEncoder.cpp @@ -49,15 +49,37 @@ constexpr ClusterId kRandomClusterId = 0xaa; constexpr AttributeId kRandomAttributeId = 0xcc; constexpr DataVersion kRandomDataVersion = 0x99; constexpr FabricIndex kTestFabricIndex = 1; +constexpr NodeId kFakeNodeId = 1; constexpr TLV::Tag kFabricIndexTag = TLV::ContextTag(254); +Access::SubjectDescriptor DescriptorWithFabric(FabricIndex fabricIndex) +{ + Access::SubjectDescriptor result; + + result.fabricIndex = fabricIndex; + result.subject = kFakeNodeId; + + if (fabricIndex == kUndefinedFabricIndex) + { + // Make it seem somewhat valid: a fabric index is not available in PASE + // before AddNOC + result.authMode = Access::AuthMode::kPase; + } + else + { + result.authMode = Access::AuthMode::kCase; + } + return result; +} + template <size_t N> struct LimitedTestSetup { LimitedTestSetup(nlTestSuite * aSuite, const FabricIndex aFabricIndex = kUndefinedFabricIndex, - const AttributeValueEncoder::AttributeEncodeState & aState = AttributeValueEncoder::AttributeEncodeState()) : - encoder(builder, aFabricIndex, ConcreteAttributePath(kRandomEndpointId, kRandomClusterId, kRandomAttributeId), - kRandomDataVersion, aFabricIndex != kUndefinedFabricIndex, aState) + const AttributeEncodeState & aState = AttributeEncodeState()) : + encoder(builder, DescriptorWithFabric(aFabricIndex), + ConcreteAttributePath(kRandomEndpointId, kRandomClusterId, kRandomAttributeId), kRandomDataVersion, + aFabricIndex != kUndefinedFabricIndex, aState) { writer.Init(buf); { @@ -275,7 +297,7 @@ void TestEncodeFabricScoped(nlTestSuite * aSuite, void * aContext) void TestEncodeListChunking(nlTestSuite * aSuite, void * aContext) { - AttributeValueEncoder::AttributeEncodeState state; + AttributeEncodeState state; bool list[] = { true, false, false, true, true, false }; auto listEncoder = [&list](const auto & encoder) -> CHIP_ERROR { @@ -400,7 +422,7 @@ void TestEncodeListChunking(nlTestSuite * aSuite, void * aContext) void TestEncodeListChunking2(nlTestSuite * aSuite, void * aContext) { - AttributeValueEncoder::AttributeEncodeState state; + AttributeEncodeState state; bool list[] = { true, false, false, true, true, false }; auto listEncoder = [&list](const auto & encoder) -> CHIP_ERROR { diff --git a/src/app/tests/TestPowerSourceCluster.cpp b/src/app/tests/TestPowerSourceCluster.cpp index 46371b332a1804..374b9619d38684 100644 --- a/src/app/tests/TestPowerSourceCluster.cpp +++ b/src/app/tests/TestPowerSourceCluster.cpp @@ -80,7 +80,8 @@ std::vector<EndpointId> ReadEndpointsThroughAttributeReader(nlTestSuite * apSuit ConcreteAttributePath path(endpoint, Clusters::PowerSource::Id, Clusters::PowerSource::Attributes::EndpointList::Id); ConcreteReadAttributePath readPath(path); chip::DataVersion dataVersion(0); - AttributeValueEncoder aEncoder(builder, 0, path, dataVersion); + Access::SubjectDescriptor subjectDescriptor; + AttributeValueEncoder aEncoder(builder, subjectDescriptor, path, dataVersion); err = attrAccess.Read(readPath, aEncoder); diff --git a/src/app/tests/TestReadInteraction.cpp b/src/app/tests/TestReadInteraction.cpp index eacd9a1d6f7762..8173761b6ca83a 100644 --- a/src/app/tests/TestReadInteraction.cpp +++ b/src/app/tests/TestReadInteraction.cpp @@ -303,7 +303,7 @@ namespace app { CHIP_ERROR ReadSingleClusterData(const Access::SubjectDescriptor & aSubjectDescriptor, bool aIsFabricFiltered, const ConcreteReadAttributePath & aPath, AttributeReportIBs::Builder & aAttributeReports, - AttributeValueEncoder::AttributeEncodeState * apEncoderState) + AttributeEncodeState * apEncoderState) { if (aPath.mClusterId >= Test::kMockEndpointMin) { @@ -331,7 +331,7 @@ CHIP_ERROR ReadSingleClusterData(const Access::SubjectDescriptor & aSubjectDescr return attributeReport.EndOfAttributeReportIB(); } - return AttributeValueEncoder(aAttributeReports, 0, aPath, 0).Encode(kTestFieldValue1); + return AttributeValueEncoder(aAttributeReports, aSubjectDescriptor, aPath, 0 /* dataVersion */).Encode(kTestFieldValue1); } bool IsClusterDataVersionEqual(const ConcreteClusterPath & aConcreteClusterPath, DataVersion aRequiredVersion) diff --git a/src/app/tests/integration/chip_im_initiator.cpp b/src/app/tests/integration/chip_im_initiator.cpp index 56cd7f37005ce5..48a66cb7fc2bba 100644 --- a/src/app/tests/integration/chip_im_initiator.cpp +++ b/src/app/tests/integration/chip_im_initiator.cpp @@ -631,7 +631,7 @@ void DispatchSingleClusterCommand(const ConcreteCommandPath & aCommandPath, chip CHIP_ERROR ReadSingleClusterData(const Access::SubjectDescriptor & aSubjectDescriptor, bool aIsFabricFiltered, const ConcreteReadAttributePath & aPath, AttributeReportIBs::Builder & aAttributeReports, - AttributeValueEncoder::AttributeEncodeState * apEncoderState) + AttributeEncodeState * apEncoderState) { AttributeReportIB::Builder & attributeReport = aAttributeReports.CreateAttributeReport(); ReturnErrorOnFailure(aAttributeReports.GetError()); diff --git a/src/app/tests/integration/chip_im_responder.cpp b/src/app/tests/integration/chip_im_responder.cpp index 0250cd0fbc7e69..72f056ca6ab8b7 100644 --- a/src/app/tests/integration/chip_im_responder.cpp +++ b/src/app/tests/integration/chip_im_responder.cpp @@ -121,10 +121,9 @@ void DispatchSingleClusterCommand(const ConcreteCommandPath & aRequestCommandPat CHIP_ERROR ReadSingleClusterData(const Access::SubjectDescriptor & aSubjectDescriptor, bool aIsFabricFiltered, const ConcreteReadAttributePath & aPath, AttributeReportIBs::Builder & aAttributeReports, - AttributeValueEncoder::AttributeEncodeState * apEncoderState) + AttributeEncodeState * apEncoderState) { - ReturnErrorOnFailure(AttributeValueEncoder(aAttributeReports, 0, aPath, 0).Encode(kTestFieldValue1)); - return CHIP_NO_ERROR; + return AttributeValueEncoder(aAttributeReports, aSubjectDescriptor, aPath, 0).Encode(kTestFieldValue1); } bool ConcreteAttributePathExists(const ConcreteAttributePath & aPath) diff --git a/src/app/util/ember-compatibility-functions.cpp b/src/app/util/ember-compatibility-functions.cpp index 3c98863aa50fb1..e87e0f564a5ff7 100644 --- a/src/app/util/ember-compatibility-functions.cpp +++ b/src/app/util/ember-compatibility-functions.cpp @@ -425,16 +425,15 @@ CHIP_ERROR GlobalAttributeReader::EncodeCommandList(const ConcreteClusterPath & // Helper function for trying to read an attribute value via an // AttributeAccessInterface. On failure, the read has failed. On success, the // aTriedEncode outparam is set to whether the AttributeAccessInterface tried to encode a value. -CHIP_ERROR ReadViaAccessInterface(FabricIndex aAccessingFabricIndex, bool aIsFabricFiltered, +CHIP_ERROR ReadViaAccessInterface(const SubjectDescriptor & subjectDescriptor, bool aIsFabricFiltered, const ConcreteReadAttributePath & aPath, AttributeReportIBs::Builder & aAttributeReports, - AttributeValueEncoder::AttributeEncodeState * aEncoderState, - AttributeAccessInterface * aAccessInterface, bool * aTriedEncode) + AttributeEncodeState * aEncoderState, AttributeAccessInterface * aAccessInterface, + bool * aTriedEncode) { - AttributeValueEncoder::AttributeEncodeState state = - (aEncoderState == nullptr ? AttributeValueEncoder::AttributeEncodeState() : *aEncoderState); + AttributeEncodeState state(aEncoderState); DataVersion version = 0; ReturnErrorOnFailure(ReadClusterDataVersion(aPath, version)); - AttributeValueEncoder valueEncoder(aAttributeReports, aAccessingFabricIndex, aPath, version, aIsFabricFiltered, state); + AttributeValueEncoder valueEncoder(aAttributeReports, subjectDescriptor, aPath, version, aIsFabricFiltered, state); CHIP_ERROR err = aAccessInterface->Read(aPath, valueEncoder); if (err == CHIP_IM_GLOBAL_STATUS(UnsupportedRead) && aPath.mExpanded) @@ -523,7 +522,7 @@ bool ConcreteAttributePathExists(const ConcreteAttributePath & aPath) CHIP_ERROR ReadSingleClusterData(const SubjectDescriptor & aSubjectDescriptor, bool aIsFabricFiltered, const ConcreteReadAttributePath & aPath, AttributeReportIBs::Builder & aAttributeReports, - AttributeValueEncoder::AttributeEncodeState * apEncoderState) + AttributeEncodeState * apEncoderState) { ChipLogDetail(DataManagement, "Reading attribute: Cluster=" ChipLogFormatMEI " Endpoint=%x AttributeId=" ChipLogFormatMEI " (expanded=%d)", @@ -569,7 +568,7 @@ CHIP_ERROR ReadSingleClusterData(const SubjectDescriptor & aSubjectDescriptor, b if (attributeOverride) { bool triedEncode = false; - ReturnErrorOnFailure(ReadViaAccessInterface(aSubjectDescriptor.fabricIndex, aIsFabricFiltered, aPath, aAttributeReports, + ReturnErrorOnFailure(ReadViaAccessInterface(aSubjectDescriptor, aIsFabricFiltered, aPath, aAttributeReports, apEncoderState, attributeOverride, &triedEncode)); ReturnErrorCodeIf(triedEncode, CHIP_NO_ERROR); } diff --git a/src/app/util/ember-compatibility-functions.h b/src/app/util/ember-compatibility-functions.h index 72d4379bce69f0..ca7f16950bad39 100644 --- a/src/app/util/ember-compatibility-functions.h +++ b/src/app/util/ember-compatibility-functions.h @@ -60,7 +60,7 @@ bool ConcreteAttributePathExists(const ConcreteAttributePath & aPath); */ CHIP_ERROR ReadSingleClusterData(const Access::SubjectDescriptor & aSubjectDescriptor, bool aIsFabricFiltered, const ConcreteReadAttributePath & aPath, AttributeReportIBs::Builder & aAttributeReports, - AttributeValueEncoder::AttributeEncodeState * apEncoderState); + AttributeEncodeState * apEncoderState); /** * Returns the metadata of the attribute for the given path. diff --git a/src/app/util/mock/Functions.h b/src/app/util/mock/Functions.h index 2304d54c589787..6d58e6370cf39d 100644 --- a/src/app/util/mock/Functions.h +++ b/src/app/util/mock/Functions.h @@ -35,7 +35,7 @@ namespace Test { CHIP_ERROR ReadSingleMockClusterData(FabricIndex aAccessingFabricIndex, const app::ConcreteAttributePath & aPath, app::AttributeReportIBs::Builder & aAttributeReports, - app::AttributeValueEncoder::AttributeEncodeState * apEncoderState); + app::AttributeEncodeState * apEncoderState); /// Increase the current value for `GetVersion` void BumpVersion(); diff --git a/src/app/util/mock/attribute-storage.cpp b/src/app/util/mock/attribute-storage.cpp index 7326886851ff37..2293a48a8403e4 100644 --- a/src/app/util/mock/attribute-storage.cpp +++ b/src/app/util/mock/attribute-storage.cpp @@ -321,8 +321,7 @@ DataVersion GetVersion() } CHIP_ERROR ReadSingleMockClusterData(FabricIndex aAccessingFabricIndex, const ConcreteAttributePath & aPath, - AttributeReportIBs::Builder & aAttributeReports, - AttributeValueEncoder::AttributeEncodeState * apEncoderState) + AttributeReportIBs::Builder & aAttributeReports, AttributeEncodeState * apEncoderState) { bool dataExists = (emberAfGetServerAttributeIndexByAttributeId(aPath.mEndpointId, aPath.mClusterId, aPath.mAttributeId) != UINT16_MAX); @@ -351,9 +350,11 @@ CHIP_ERROR ReadSingleMockClusterData(FabricIndex aAccessingFabricIndex, const Co // Attribute 4 acts as a large attribute to trigger chunking. if (aPath.mAttributeId == MockAttributeId(4)) { - AttributeValueEncoder::AttributeEncodeState state = - (apEncoderState == nullptr ? AttributeValueEncoder::AttributeEncodeState() : *apEncoderState); - AttributeValueEncoder valueEncoder(aAttributeReports, aAccessingFabricIndex, aPath, dataVersion, false, state); + AttributeEncodeState state(apEncoderState); + Access::SubjectDescriptor subject; + subject.fabricIndex = aAccessingFabricIndex; + + AttributeValueEncoder valueEncoder(aAttributeReports, subject, aPath, dataVersion, /* aIsFabricFiltered = */ false, state); CHIP_ERROR err = valueEncoder.EncodeList([](const auto & encoder) -> CHIP_ERROR { for (int i = 0; i < 6; i++) diff --git a/src/controller/tests/data_model/TestRead.cpp b/src/controller/tests/data_model/TestRead.cpp index fc2cfaf516524b..bcf0233662d2bc 100644 --- a/src/controller/tests/data_model/TestRead.cpp +++ b/src/controller/tests/data_model/TestRead.cpp @@ -89,7 +89,7 @@ namespace chip { namespace app { CHIP_ERROR ReadSingleClusterData(const Access::SubjectDescriptor & aSubjectDescriptor, bool aIsFabricFiltered, const ConcreteReadAttributePath & aPath, AttributeReportIBs::Builder & aAttributeReports, - AttributeValueEncoder::AttributeEncodeState * apEncoderState) + AttributeEncodeState * apEncoderState) { if (aPath.mEndpointId >= chip::Test::kMockEndpointMin) { @@ -109,10 +109,8 @@ CHIP_ERROR ReadSingleClusterData(const Access::SubjectDescriptor & aSubjectDescr // Use an incorrect attribute id for some of the responses. path.mAttributeId = static_cast<AttributeId>(path.mAttributeId + (i / 2) + (responseDirective == kSendManyDataResponsesWrongPath)); - AttributeValueEncoder::AttributeEncodeState state = - (apEncoderState == nullptr ? AttributeValueEncoder::AttributeEncodeState() : *apEncoderState); - AttributeValueEncoder valueEncoder(aAttributeReports, aSubjectDescriptor.fabricIndex, path, - kDataVersion /* data version */, aIsFabricFiltered, state); + AttributeEncodeState state(apEncoderState); + AttributeValueEncoder valueEncoder(aAttributeReports, aSubjectDescriptor, path, kDataVersion, aIsFabricFiltered, state); ReturnErrorOnFailure(valueEncoder.Encode(true)); } @@ -124,10 +122,9 @@ CHIP_ERROR ReadSingleClusterData(const Access::SubjectDescriptor & aSubjectDescr if (aPath.mClusterId == app::Clusters::UnitTesting::Id && aPath.mAttributeId == app::Clusters::UnitTesting::Attributes::ListFabricScoped::Id) { - AttributeValueEncoder::AttributeEncodeState state = - (apEncoderState == nullptr ? AttributeValueEncoder::AttributeEncodeState() : *apEncoderState); - AttributeValueEncoder valueEncoder(aAttributeReports, aSubjectDescriptor.fabricIndex, aPath, - kDataVersion /* data version */, aIsFabricFiltered, state); + AttributeEncodeState state(apEncoderState); + AttributeValueEncoder valueEncoder(aAttributeReports, aSubjectDescriptor, aPath, kDataVersion, aIsFabricFiltered, + state); return valueEncoder.EncodeList([aSubjectDescriptor](const auto & encoder) -> CHIP_ERROR { app::Clusters::UnitTesting::Structs::TestFabricScoped::Type val; @@ -141,19 +138,18 @@ CHIP_ERROR ReadSingleClusterData(const Access::SubjectDescriptor & aSubjectDescr if (aPath.mClusterId == app::Clusters::UnitTesting::Id && aPath.mAttributeId == app::Clusters::UnitTesting::Attributes::Int16u::Id) { - AttributeValueEncoder::AttributeEncodeState state = - (apEncoderState == nullptr ? AttributeValueEncoder::AttributeEncodeState() : *apEncoderState); - AttributeValueEncoder valueEncoder(aAttributeReports, aSubjectDescriptor.fabricIndex, aPath, - kDataVersion /* data version */, aIsFabricFiltered, state); + AttributeEncodeState state(apEncoderState); + AttributeValueEncoder valueEncoder(aAttributeReports, aSubjectDescriptor, aPath, kDataVersion, aIsFabricFiltered, + state); return valueEncoder.Encode(++totalReadCount); } if (aPath.mClusterId == kPerpetualClusterId || (aPath.mClusterId == app::Clusters::UnitTesting::Id && aPath.mAttributeId == kPerpetualAttributeid)) { - AttributeValueEncoder::AttributeEncodeState state = AttributeValueEncoder::AttributeEncodeState(); - AttributeValueEncoder valueEncoder(aAttributeReports, aSubjectDescriptor.fabricIndex, aPath, - kDataVersion /* data version */, aIsFabricFiltered, state); + AttributeEncodeState state; + AttributeValueEncoder valueEncoder(aAttributeReports, aSubjectDescriptor, aPath, kDataVersion, aIsFabricFiltered, + state); CHIP_ERROR err = valueEncoder.EncodeList([](const auto & encoder) -> CHIP_ERROR { encoder.Encode(static_cast<uint8_t>(1)); @@ -174,10 +170,9 @@ CHIP_ERROR ReadSingleClusterData(const Access::SubjectDescriptor & aSubjectDescr if (aPath.mClusterId == app::Clusters::IcdManagement::Id && aPath.mAttributeId == app::Clusters::IcdManagement::Attributes::OperatingMode::Id) { - AttributeValueEncoder::AttributeEncodeState state = - (apEncoderState == nullptr ? AttributeValueEncoder::AttributeEncodeState() : *apEncoderState); - AttributeValueEncoder valueEncoder(aAttributeReports, aSubjectDescriptor.fabricIndex, aPath, - kDataVersion /* data version */, aIsFabricFiltered, state); + AttributeEncodeState state(apEncoderState); + AttributeValueEncoder valueEncoder(aAttributeReports, aSubjectDescriptor, aPath, kDataVersion, aIsFabricFiltered, + state); return valueEncoder.Encode(isLitIcd ? Clusters::IcdManagement::OperatingModeEnum::kLit : Clusters::IcdManagement::OperatingModeEnum::kSit); From 1b9d971c8d55a3adb84ca618e26ad45f9c1dac38 Mon Sep 17 00:00:00 2001 From: Wang Qixiang <43193572+wqx6@users.noreply.github.com> Date: Wed, 1 May 2024 01:17:13 +0800 Subject: [PATCH 090/124] chef: Use -u flag to force linking non-weak functions for esp32 example (#33209) --- examples/chef/common/stubs.cpp | 4 ++++ examples/chef/esp32/main/CMakeLists.txt | 3 +++ 2 files changed, 7 insertions(+) diff --git a/examples/chef/common/stubs.cpp b/examples/chef/common/stubs.cpp index 91a7b5a84d10e1..5756aaa35b7e26 100644 --- a/examples/chef/common/stubs.cpp +++ b/examples/chef/common/stubs.cpp @@ -235,3 +235,7 @@ void emberAfWakeOnLanClusterInitCallback(EndpointId endpoint) WakeOnLan::SetDefaultDelegate(endpoint, &wakeOnLanManager); } #endif + +// No-op function, used to force linking this file, +// instead of the weak functions from other files +extern "C" void chef_include_stubs_impl(void) {} diff --git a/examples/chef/esp32/main/CMakeLists.txt b/examples/chef/esp32/main/CMakeLists.txt index 75cf0b85222d95..549f98abcfac9c 100644 --- a/examples/chef/esp32/main/CMakeLists.txt +++ b/examples/chef/esp32/main/CMakeLists.txt @@ -121,6 +121,9 @@ idf_component_register(PRIV_INCLUDE_DIRS PRIV_REQUIRES chip nvs_flash bt console mbedtls QRCode tft screen-framework spidriver SRC_DIRS ${SRC_DIRS_LIST}) +# Forces the linker to include common/stubs.cpp +target_link_libraries(${COMPONENT_LIB} INTERFACE "-u chef_include_stubs_impl") + include("${CHIP_ROOT}/build/chip/esp32/esp32_codegen.cmake") chip_app_component_codegen("${CHEF}/devices/${SAMPLE_NAME}.matter") chip_app_component_zapgen("${CHEF}/devices/${SAMPLE_NAME}.zap") From 4b58ad287f56215c757a64b6e6736727f7969bf2 Mon Sep 17 00:00:00 2001 From: Wang Qixiang <43193572+wqx6@users.noreply.github.com> Date: Wed, 1 May 2024 02:40:08 +0800 Subject: [PATCH 091/124] examples: Remove requires in main components for esp32 examples (#33213) --- .../all-clusters-app/esp32/main/CMakeLists.txt | 17 +++-------------- .../esp32/main/CMakeLists.txt | 15 ++------------- examples/bridge-app/esp32/main/CMakeLists.txt | 3 +-- examples/chef/esp32/main/CMakeLists.txt | 1 - .../esp32/main/CMakeLists.txt | 9 +-------- .../light-switch-app/esp32/main/CMakeLists.txt | 4 ++-- examples/lighting-app/esp32/main/CMakeLists.txt | 10 +--------- examples/lock-app/esp32/main/CMakeLists.txt | 4 ++-- .../ota-provider-app/esp32/main/CMakeLists.txt | 3 +-- .../ota-requestor-app/esp32/main/CMakeLists.txt | 5 +---- .../esp32/main/CMakeLists.txt | 3 +-- examples/pigweed-app/esp32/main/CMakeLists.txt | 3 +-- examples/shell/esp32/main/CMakeLists.txt | 3 +-- .../esp32/main/CMakeLists.txt | 3 --- 14 files changed, 17 insertions(+), 66 deletions(-) diff --git a/examples/all-clusters-app/esp32/main/CMakeLists.txt b/examples/all-clusters-app/esp32/main/CMakeLists.txt index 63851b1deeb611..7fd1d548609257 100644 --- a/examples/all-clusters-app/esp32/main/CMakeLists.txt +++ b/examples/all-clusters-app/esp32/main/CMakeLists.txt @@ -96,8 +96,8 @@ set(SRC_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/time-synchronization-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/valve-configuration-and-control-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/dishwasher-alarm-server" - "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/laundry-washer-controls-server" - "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/laundry-washer-controls-server" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/laundry-washer-controls-server" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/laundry-washer-controls-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/laundry-dryer-controls-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/all-clusters-app/all-clusters-common/src" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/energy-preference-server" @@ -136,20 +136,9 @@ if (CONFIG_ENABLE_ICD_SERVER) list(APPEND SRC_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/platform/esp32/icd") endif() -set(PRIV_REQUIRES_LIST chip QRCode bt app_update nvs_flash spi_flash openthread) - -if(${IDF_TARGET} STREQUAL "esp32") - list(APPEND PRIV_REQUIRES_LIST spidriver screen-framework) -endif() - -if(CONFIG_DEVICE_TYPE_ESP32_C3_DEVKITM) - list(APPEND PRIV_REQUIRES_LIST led_strip) -endif() - idf_component_register(PRIV_INCLUDE_DIRS ${PRIV_INCLUDE_DIRS_LIST} SRC_DIRS ${SRC_DIRS_LIST} - EXCLUDE_SRCS ${EXCLUDE_SRCS} - PRIV_REQUIRES ${PRIV_REQUIRES_LIST}) + EXCLUDE_SRCS ${EXCLUDE_SRCS}) get_filename_component(CHIP_ROOT ${CMAKE_SOURCE_DIR}/third_party/connectedhomeip REALPATH) diff --git a/examples/all-clusters-minimal-app/esp32/main/CMakeLists.txt b/examples/all-clusters-minimal-app/esp32/main/CMakeLists.txt index cae8b64315a232..7178945c7eb21c 100644 --- a/examples/all-clusters-minimal-app/esp32/main/CMakeLists.txt +++ b/examples/all-clusters-minimal-app/esp32/main/CMakeLists.txt @@ -82,7 +82,7 @@ set(SRC_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/door-lock-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/occupancy-sensor-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/device-energy-management-server" - "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/energy-evse-server" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/energy-evse-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/ethernet-network-diagnostics-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/localization-configuration-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/time-format-localization-server" @@ -118,19 +118,8 @@ set(SRC_DIRS_LIST "${SRC_DIRS_LIST}" ) endif (CONFIG_ENABLE_PW_RPC) -set(PRIV_REQUIRES_LIST chip QRCode bt driver app_update nvs_flash spi_flash openthread) - -if(${IDF_TARGET} STREQUAL "esp32") - list(APPEND PRIV_REQUIRES_LIST spidriver screen-framework) -endif() - -if(CONFIG_DEVICE_TYPE_ESP32_C3_DEVKITM) - list(APPEND PRIV_REQUIRES_LIST led_strip) -endif() - idf_component_register(PRIV_INCLUDE_DIRS ${PRIV_INCLUDE_DIRS_LIST} - SRC_DIRS ${SRC_DIRS_LIST} - PRIV_REQUIRES ${PRIV_REQUIRES_LIST}) + SRC_DIRS ${SRC_DIRS_LIST}) get_filename_component(CHIP_ROOT ${CMAKE_SOURCE_DIR}/third_party/connectedhomeip REALPATH) diff --git a/examples/bridge-app/esp32/main/CMakeLists.txt b/examples/bridge-app/esp32/main/CMakeLists.txt index e2250f001799b5..3330f6971b68cd 100644 --- a/examples/bridge-app/esp32/main/CMakeLists.txt +++ b/examples/bridge-app/esp32/main/CMakeLists.txt @@ -48,8 +48,7 @@ idf_component_register(PRIV_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/operational-credentials-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/general-commissioning-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/platform/esp32/common" - "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/providers" - PRIV_REQUIRES chip QRCode bt nvs_flash) + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/providers") get_filename_component(CHIP_ROOT ${CMAKE_SOURCE_DIR}/third_party/connectedhomeip REALPATH) diff --git a/examples/chef/esp32/main/CMakeLists.txt b/examples/chef/esp32/main/CMakeLists.txt index 549f98abcfac9c..ac436a7919637b 100644 --- a/examples/chef/esp32/main/CMakeLists.txt +++ b/examples/chef/esp32/main/CMakeLists.txt @@ -118,7 +118,6 @@ endif (CONFIG_ENABLE_PW_RPC) idf_component_register(PRIV_INCLUDE_DIRS "${CHIP_SHELL_DIR}/shell_common/include" "${PRIV_INCLUDE_DIRS_LIST}" - PRIV_REQUIRES chip nvs_flash bt console mbedtls QRCode tft screen-framework spidriver SRC_DIRS ${SRC_DIRS_LIST}) # Forces the linker to include common/stubs.cpp diff --git a/examples/energy-management-app/esp32/main/CMakeLists.txt b/examples/energy-management-app/esp32/main/CMakeLists.txt index a38ce499bc1ea5..a9a8c4100ae2de 100644 --- a/examples/energy-management-app/esp32/main/CMakeLists.txt +++ b/examples/energy-management-app/esp32/main/CMakeLists.txt @@ -72,12 +72,6 @@ set(SRC_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/electrical-power-measurement-server" ) -set(PRIV_REQUIRES_LIST chip QRCode bt led_strip app_update openthread driver nvs_flash spi_flash) - -if(${IDF_TARGET} STREQUAL "esp32") - list(APPEND PRIV_REQUIRES_LIST spidriver screen-framework) -endif() - if (CONFIG_ENABLE_PW_RPC) # Append additional directories for RPC build @@ -103,8 +97,7 @@ set(SRC_DIRS_LIST "${SRC_DIRS_LIST}" endif (CONFIG_ENABLE_PW_RPC) idf_component_register(PRIV_INCLUDE_DIRS ${PRIV_INCLUDE_DIRS_LIST} - SRC_DIRS ${SRC_DIRS_LIST} - PRIV_REQUIRES ${PRIV_REQUIRES_LIST}) + SRC_DIRS ${SRC_DIRS_LIST}) get_filename_component(CHIP_ROOT ${CMAKE_SOURCE_DIR}/third_party/connectedhomeip REALPATH) include("${CHIP_ROOT}/build/chip/esp32/esp32_codegen.cmake") diff --git a/examples/light-switch-app/esp32/main/CMakeLists.txt b/examples/light-switch-app/esp32/main/CMakeLists.txt index 210cbcefee9a23..e2600438b55346 100644 --- a/examples/light-switch-app/esp32/main/CMakeLists.txt +++ b/examples/light-switch-app/esp32/main/CMakeLists.txt @@ -59,8 +59,8 @@ idf_component_register(PRIV_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/groups-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/group-key-mgmt-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/time-synchronization-server" - "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/icd-management-server" - PRIV_REQUIRES chip QRCode bt app_update driver nvs_flash spi_flash) + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/icd-management-server") + get_filename_component(CHIP_ROOT ${CMAKE_SOURCE_DIR}/third_party/connectedhomeip REALPATH) include("${CHIP_ROOT}/build/chip/esp32/esp32_codegen.cmake") diff --git a/examples/lighting-app/esp32/main/CMakeLists.txt b/examples/lighting-app/esp32/main/CMakeLists.txt index a7cc4136145981..8b2a2fdce397cb 100644 --- a/examples/lighting-app/esp32/main/CMakeLists.txt +++ b/examples/lighting-app/esp32/main/CMakeLists.txt @@ -67,13 +67,6 @@ set(SRC_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/scenes-server" ) -set(PRIV_REQUIRES_LIST chip QRCode bt led_strip app_update openthread driver nvs_flash spi_flash) - -if(${IDF_TARGET} STREQUAL "esp32") - list(APPEND PRIV_REQUIRES_LIST spidriver screen-framework) -endif() - - if (CONFIG_ENABLE_PW_RPC) # Append additional directories for RPC build set(PRIV_INCLUDE_DIRS_LIST "${PRIV_INCLUDE_DIRS_LIST}" @@ -98,8 +91,7 @@ set(SRC_DIRS_LIST "${SRC_DIRS_LIST}" endif (CONFIG_ENABLE_PW_RPC) idf_component_register(PRIV_INCLUDE_DIRS ${PRIV_INCLUDE_DIRS_LIST} - SRC_DIRS ${SRC_DIRS_LIST} - PRIV_REQUIRES ${PRIV_REQUIRES_LIST}) + SRC_DIRS ${SRC_DIRS_LIST}) get_filename_component(CHIP_ROOT ${CMAKE_SOURCE_DIR}/third_party/connectedhomeip REALPATH) include("${CHIP_ROOT}/build/chip/esp32/esp32_codegen.cmake") diff --git a/examples/lock-app/esp32/main/CMakeLists.txt b/examples/lock-app/esp32/main/CMakeLists.txt index e7266908ff3c1d..5c5f46abdd1860 100644 --- a/examples/lock-app/esp32/main/CMakeLists.txt +++ b/examples/lock-app/esp32/main/CMakeLists.txt @@ -74,8 +74,8 @@ idf_component_register(INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/door-lock-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/identify-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/groups-server" - "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/icd-management-server" - PRIV_REQUIRES bt chip QRCode nvs_flash driver) + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/icd-management-server") + add_dependencies(${COMPONENT_LIB} app-codegen) set(PIGWEED_ROOT "${CHIP_ROOT}/third_party/pigweed/repo") diff --git a/examples/ota-provider-app/esp32/main/CMakeLists.txt b/examples/ota-provider-app/esp32/main/CMakeLists.txt index a63033f017d8b2..41acd9e9316e00 100644 --- a/examples/ota-provider-app/esp32/main/CMakeLists.txt +++ b/examples/ota-provider-app/esp32/main/CMakeLists.txt @@ -53,8 +53,7 @@ idf_component_register(PRIV_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/platform/esp32/common" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/providers" EXCLUDE_SRCS - "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/ota-provider-app/ota-provider-common/BdxOtaSender.cpp" - PRIV_REQUIRES chip QRCode bt console spiffs spi_flash nvs_flash) + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/ota-provider-app/ota-provider-common/BdxOtaSender.cpp") get_filename_component(CHIP_ROOT ${CMAKE_SOURCE_DIR}/third_party/connectedhomeip REALPATH) include("${CHIP_ROOT}/build/chip/esp32/esp32_codegen.cmake") diff --git a/examples/ota-requestor-app/esp32/main/CMakeLists.txt b/examples/ota-requestor-app/esp32/main/CMakeLists.txt index 10c61e162900f2..fbda70f2cec48f 100644 --- a/examples/ota-requestor-app/esp32/main/CMakeLists.txt +++ b/examples/ota-requestor-app/esp32/main/CMakeLists.txt @@ -62,8 +62,6 @@ set(SRC_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/providers" ) -set(PRIV_REQUIRES_LIST chip QRCode bt console app_update nvs_flash) - if (CONFIG_ENABLE_PW_RPC) # Append additional directories for RPC build set(PRIV_INCLUDE_DIRS_LIST "${PRIV_INCLUDE_DIRS_LIST}" @@ -88,8 +86,7 @@ set(SRC_DIRS_LIST "${SRC_DIRS_LIST}" endif (CONFIG_ENABLE_PW_RPC) idf_component_register(PRIV_INCLUDE_DIRS ${PRIV_INCLUDE_DIRS_LIST} - SRC_DIRS ${SRC_DIRS_LIST} - PRIV_REQUIRES ${PRIV_REQUIRES_LIST}) + SRC_DIRS ${SRC_DIRS_LIST}) include("${CHIP_ROOT}/build/chip/esp32/esp32_codegen.cmake") chip_app_component_codegen("${CHIP_ROOT}/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.matter") diff --git a/examples/persistent-storage/esp32/main/CMakeLists.txt b/examples/persistent-storage/esp32/main/CMakeLists.txt index 30c85accfbe36d..e21c2eef5985b2 100644 --- a/examples/persistent-storage/esp32/main/CMakeLists.txt +++ b/examples/persistent-storage/esp32/main/CMakeLists.txt @@ -20,8 +20,7 @@ idf_component_register(PRIV_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/persistent-storage" SRC_DIRS "${CMAKE_CURRENT_LIST_DIR}" - "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/persistent-storage" - PRIV_REQUIRES chip nvs_flash) + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/persistent-storage") set_property(TARGET ${COMPONENT_LIB} PROPERTY CXX_STANDARD 17) target_compile_options(${COMPONENT_LIB} PRIVATE "-DCHIP_HAVE_CONFIG_H") diff --git a/examples/pigweed-app/esp32/main/CMakeLists.txt b/examples/pigweed-app/esp32/main/CMakeLists.txt index e06bb5a5296a14..7ac0373b72b612 100644 --- a/examples/pigweed-app/esp32/main/CMakeLists.txt +++ b/examples/pigweed-app/esp32/main/CMakeLists.txt @@ -33,8 +33,7 @@ idf_component_register(INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/platform/esp32" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/common/pigweed" - "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/common/pigweed/esp32" - PRIV_REQUIRES bt chip) + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/common/pigweed/esp32") get_filename_component(CHIP_ROOT ${CMAKE_SOURCE_DIR}/third_party/connectedhomeip REALPATH) set(PIGWEED_ROOT "${CHIP_ROOT}/third_party/pigweed/repo") diff --git a/examples/shell/esp32/main/CMakeLists.txt b/examples/shell/esp32/main/CMakeLists.txt index 5a565edb90a6d5..147b10bc7e1c88 100644 --- a/examples/shell/esp32/main/CMakeLists.txt +++ b/examples/shell/esp32/main/CMakeLists.txt @@ -22,5 +22,4 @@ set(CHIP_SHELL_DIR "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/she idf_component_register(SRCS main.cpp "${CHIP_SHELL_DIR}/shell_common/globals.cpp" PRIV_INCLUDE_DIRS - "${CHIP_SHELL_DIR}/shell_common/include" - PRIV_REQUIRES chip nvs_flash bt) + "${CHIP_SHELL_DIR}/shell_common/include") diff --git a/examples/temperature-measurement-app/esp32/main/CMakeLists.txt b/examples/temperature-measurement-app/esp32/main/CMakeLists.txt index 89fa5e9f755455..8bc94f7b97969a 100644 --- a/examples/temperature-measurement-app/esp32/main/CMakeLists.txt +++ b/examples/temperature-measurement-app/esp32/main/CMakeLists.txt @@ -55,8 +55,6 @@ set(SRC_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/examples/providers" ) -set(PRIV_REQUIRES_LIST chip QRCode bt nvs_flash espcoredump) - if (CONFIG_ENABLE_PW_RPC) # Append additional directories for RPC build set(PRIV_INCLUDE_DIRS_LIST "${PRIV_INCLUDE_DIRS_LIST}" @@ -82,7 +80,6 @@ endif (CONFIG_ENABLE_PW_RPC) idf_component_register(PRIV_INCLUDE_DIRS ${PRIV_INCLUDE_DIRS_LIST} SRC_DIRS ${SRC_DIRS_LIST} - PRIV_REQUIRES ${PRIV_REQUIRES_LIST} EMBED_FILES diagnostic_logs/end_user_support.log diagnostic_logs/network_diag.log) include("${CHIP_ROOT}/build/chip/esp32/esp32_codegen.cmake") From 3062e9162f856597b25b3d04366485990ca4d59f Mon Sep 17 00:00:00 2001 From: mkardous-silabs <84793247+mkardous-silabs@users.noreply.github.com> Date: Tue, 30 Apr 2024 15:33:03 -0400 Subject: [PATCH 092/124] [ICD] Convert TestICDMonitoringTable to gTest (#33239) * Move tests to icd/server/tests * Remove App dependency from the TestICDManager and build it on its own * Convert TestICDMonitoringTable to gtest * Fix build and address review comments * Add define guards in case some builds dont use TCP / UDP endpoints --- src/BUILD.gn | 2 + src/app/icd/server/tests/BUILD.gn | 50 ++ .../{ => icd/server}/tests/TestICDManager.cpp | 46 +- .../server/tests/TestICDMonitoringTable.cpp | 413 +++++++++++++++ src/app/tests/BUILD.gn | 13 - src/app/tests/TestICDMonitoringTable.cpp | 493 ------------------ src/inet/tests/TestInetCommonPosix.cpp | 16 +- .../openiotsdk/unit-tests/test_components.txt | 1 + .../unit-tests/test_components_nl.txt | 1 + .../raw/tests/NetworkTestHelpers.cpp | 7 +- 10 files changed, 514 insertions(+), 528 deletions(-) create mode 100644 src/app/icd/server/tests/BUILD.gn rename src/app/{ => icd/server}/tests/TestICDManager.cpp (98%) create mode 100644 src/app/icd/server/tests/TestICDMonitoringTable.cpp delete mode 100644 src/app/tests/TestICDMonitoringTable.cpp 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 <app/EventManagement.h> #include <app/SubscriptionsInfoProvider.h> #include <app/TestEventTriggerDelegate.h> #include <app/icd/server/ICDConfigurationData.h> #include <app/icd/server/ICDManager.h> +#include <app/icd/server/ICDMonitoringTable.h> #include <app/icd/server/ICDNotifier.h> #include <app/icd/server/ICDStateObserver.h> -#include <app/tests/AppTestContext.h> +#include <crypto/DefaultSessionKeystore.h> #include <lib/core/DataModelTypes.h> #include <lib/core/NodeId.h> #include <lib/support/TestPersistentStorageDelegate.h> @@ -30,11 +30,10 @@ #include <lib/support/UnitTestContext.h> #include <lib/support/UnitTestExtendedAssertions.h> #include <lib/support/UnitTestRegistration.h> +#include <messaging/tests/MessagingContext.h> #include <nlunit-test.h> #include <system/SystemLayerImpl.h> -#include <crypto/DefaultSessionKeystore.h> - 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 <app/icd/server/ICDMonitoringTable.h> +#include <crypto/CHIPCryptoPAL.h> +#include <crypto/DefaultSessionKeystore.h> +#include <gtest/gtest.h> +#include <lib/core/CHIPError.h> +#include <lib/support/DefaultStorageKeyAllocator.h> +#include <lib/support/TestPersistentStorageDelegate.h> + +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<Crypto::Symmetric128BitsKeyByteArray>(), + entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), 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<Crypto::Symmetric128BitsKeyByteArray>(), + entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), 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<Crypto::Symmetric128BitsKeyByteArray>(), + entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), 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<Crypto::Symmetric128BitsKeyByteArray>(), + entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), 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<Crypto::Symmetric128BitsKeyByteArray>(), + entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), 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<Crypto::Symmetric128BitsKeyByteArray>(), + entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), 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<Crypto::Symmetric128BitsKeyByteArray>(), + entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), 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<Crypto::Symmetric128BitsKeyByteArray>(), + entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), 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<Crypto::Symmetric128BitsKeyByteArray>(), + entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), 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<Crypto::Symmetric128BitsKeyByteArray>(), + entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), 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<Crypto::Symmetric128BitsKeyByteArray>(), + entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), 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<Crypto::Symmetric128BitsKeyByteArray>(), + entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), 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 <app/icd/server/ICDMonitoringTable.h> -#include <crypto/CHIPCryptoPAL.h> -#include <lib/core/CHIPError.h> -#include <lib/support/DefaultStorageKeyAllocator.h> -#include <lib/support/TestPersistentStorageDelegate.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> - -#include <crypto/DefaultSessionKeystore.h> - -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<Crypto::Symmetric128BitsKeyByteArray>(), - entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), - 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<Crypto::Symmetric128BitsKeyByteArray>(), - entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), - 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<Crypto::Symmetric128BitsKeyByteArray>(), - entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), - 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<Crypto::Symmetric128BitsKeyByteArray>(), - entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), - 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<Crypto::Symmetric128BitsKeyByteArray>(), - entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), - 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<Crypto::Symmetric128BitsKeyByteArray>(), - entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), - 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<Crypto::Symmetric128BitsKeyByteArray>(), - entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), - 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<Crypto::Symmetric128BitsKeyByteArray>(), - entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), - 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<Crypto::Symmetric128BitsKeyByteArray>(), - entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), - 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<Crypto::Symmetric128BitsKeyByteArray>(), - entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), - 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<Crypto::Symmetric128BitsKeyByteArray>(), - entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), - 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<Crypto::Symmetric128BitsKeyByteArray>(), - entry.hmacKeyHandle.As<Crypto::Symmetric128BitsKeyByteArray>(), - 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; } From 335ae1912d9356e3710fb74ee1e7d1ddeda9515e Mon Sep 17 00:00:00 2001 From: Boris Zbarsky <bzbarsky@apple.com> Date: Tue, 30 Apr 2024 17:09:54 -0400 Subject: [PATCH 093/124] Add some better logging around PASE session setup in Matter.framework. (#33231) Log the device ID being used. --- .../Framework/CHIP/MTRDeviceController.mm | 9 ++++++++- src/darwin/Framework/CHIP/MTRSetupPayload.h | 2 ++ src/darwin/Framework/CHIP/MTRSetupPayload.mm | 20 +++++++++++++++++++ .../Framework/CHIPTests/MTRDeviceTests.m | 10 ++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.mm b/src/darwin/Framework/CHIP/MTRDeviceController.mm index 94d9882b4cd9d1..fe266c22a2fff9 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController.mm @@ -616,6 +616,8 @@ - (BOOL)setupCommissioningSessionWithPayload:(MTRSetupPayload *)payload newNodeID:(NSNumber *)newNodeID error:(NSError * __autoreleasing *)error { + MTR_LOG_DEFAULT("Setting up commissioning session for device ID 0x%016llX with setup payload %@", newNodeID.unsignedLongLongValue, payload); + [[MTRMetricsCollector sharedInstance] resetMetrics]; // Track overall commissioning @@ -663,6 +665,8 @@ - (BOOL)setupCommissioningSessionWithDiscoveredDevice:(MTRCommissionableBrowserR newNodeID:(NSNumber *)newNodeID error:(NSError * __autoreleasing *)error { + MTR_LOG_DEFAULT("Setting up commissioning session for already-discovered device %@ and device ID 0x%016llX with setup payload %@", discoveredDevice, newNodeID.unsignedLongLongValue, payload); + [[MTRMetricsCollector sharedInstance] resetMetrics]; // Track overall commissioning @@ -912,7 +916,10 @@ - (MTRBaseDevice *)deviceBeingCommissionedWithNodeID:(NSNumber *)nodeID error:(N return [[MTRBaseDevice alloc] initWithPASEDevice:deviceProxy controller:self]; }; - return [self syncRunOnWorkQueueWithReturnValue:block error:error]; + MTRBaseDevice * device = [self syncRunOnWorkQueueWithReturnValue:block error:error]; + MTR_LOG_DEFAULT("Getting device being commissioned with node ID 0x%016llX: %@ (error: %@)", + nodeID.unsignedLongLongValue, device, (error ? *error : nil)); + return device; } - (MTRBaseDevice *)baseDeviceForNodeID:(NSNumber *)nodeID diff --git a/src/darwin/Framework/CHIP/MTRSetupPayload.h b/src/darwin/Framework/CHIP/MTRSetupPayload.h index 9d6466b9cbdc32..7f11fc582ba4b3 100644 --- a/src/darwin/Framework/CHIP/MTRSetupPayload.h +++ b/src/darwin/Framework/CHIP/MTRSetupPayload.h @@ -28,6 +28,8 @@ typedef NS_OPTIONS(NSUInteger, MTRDiscoveryCapabilities) { MTRDiscoveryCapabilitiesBLE = 1 << 1, // Device supports BLE MTRDiscoveryCapabilitiesOnNetwork = 1 << 2, // Device supports On Network setup + // If new values are added here, update the "description" method to include them. + MTRDiscoveryCapabilitiesAllMask = MTRDiscoveryCapabilitiesSoftAP | MTRDiscoveryCapabilitiesBLE | MTRDiscoveryCapabilitiesOnNetwork, }; diff --git a/src/darwin/Framework/CHIP/MTRSetupPayload.mm b/src/darwin/Framework/CHIP/MTRSetupPayload.mm index 11afc2a15c1cde..d5788c63dc6f6c 100644 --- a/src/darwin/Framework/CHIP/MTRSetupPayload.mm +++ b/src/darwin/Framework/CHIP/MTRSetupPayload.mm @@ -246,6 +246,26 @@ + (MTRSetupPayload * _Nullable)setupPayloadWithOnboardingPayload:(NSString *)onb return payload; } +- (NSString *)description +{ + NSMutableArray<NSString *> * capabilities = [NSMutableArray array]; + if (self.discoveryCapabilities & MTRDiscoveryCapabilitiesSoftAP) { + [capabilities addObject:@"SoftAP"]; + } + if (self.discoveryCapabilities & MTRDiscoveryCapabilitiesBLE) { + [capabilities addObject:@"BLE"]; + } + if (self.discoveryCapabilities & MTRDiscoveryCapabilitiesOnNetwork) { + [capabilities addObject:@"OnNetwork"]; + } + if (capabilities.count == 0) { + [capabilities addObject:@"Unknown"]; + } + + return [NSString stringWithFormat:@"<MTRSetupPayload: discriminator=0x%x hasShortDiscriminator=%@ discoveryCapabilities=%@>", + self.discriminator.unsignedIntValue, self.hasShortDiscriminator ? @"YES" : @"NO", [capabilities componentsJoinedByString:@"|"]]; +} + #pragma mark - NSSecureCoding static NSString * const MTRSetupPayloadCodingKeyVersion = @"MTRSP.ck.version"; diff --git a/src/darwin/Framework/CHIPTests/MTRDeviceTests.m b/src/darwin/Framework/CHIPTests/MTRDeviceTests.m index da6ba88650a448..2dc01461826b40 100644 --- a/src/darwin/Framework/CHIPTests/MTRDeviceTests.m +++ b/src/darwin/Framework/CHIPTests/MTRDeviceTests.m @@ -95,6 +95,16 @@ - (void)controller:(MTRDeviceController *)controller commissioningSessionEstabli { XCTAssertEqual(error.code, 0); + NSError * getDeviceError = nil; + __auto_type * device = [controller deviceBeingCommissionedWithNodeID:@(kDeviceId) error:&getDeviceError]; + XCTAssertNil(getDeviceError); + XCTAssertNotNil(device); + + // Now check that getting with some other random id fails. + device = [controller deviceBeingCommissionedWithNodeID:@(kDeviceId + 1) error:&getDeviceError]; + XCTAssertNil(device); + XCTAssertNotNil(getDeviceError); + __auto_type * params = [[MTRCommissioningParameters alloc] init]; params.countryCode = @("au"); From a8cfbac07730816dbc68cd797332ea81227892d5 Mon Sep 17 00:00:00 2001 From: Pradip De <pradipd@google.com> Date: Tue, 26 Mar 2024 20:59:15 -0700 Subject: [PATCH 094/124] TCP connection setup/management and CASESession association. Add TCPConnect()/TCPDisconnect() API for explicit connection setup. Currently, connecting to a peer is coupled with sending a message to the peer. This decouples the two and creates a clear API for connecting to a peer address. Goes along with the existing Disconnect() API. This would be essential during activation of retained sessions by solely connecting to the peer and associating with the retained session. Surface Connection completion and Closure callbacks and hook them through SessionManager(TransportMgr delegate) and CASESession. Mark SecureSession as defunct on connection closures. Modify ActiveConnectionState in TCPBase to hold state for each connection, so that it is able to handle the various control flow paths. Associate a session with a connection object. Associate the PeerAddress with the session early. Pass the PeerAddress in the Find APIs. This helps check against the correct TransportType when searching for a Sesssion in the SessionTable. Add a `large payload` flag in EstablishSession() and Session lookup functions to create/associate with the correct session and transport. Have default configurations for TCP in a separate TCPConfig.h. Refactor echo_requester.cpp and echo_responder.cpp to use the session associated with the connection. Handle Connection closure at ExchangeMgr and uplevel to corresponding ExchangeContext using the corresponding session handle. Add tests around connection establishment in TestTCP. --- examples/shell/shell_common/include/Globals.h | 2 + src/app/CASESessionManager.cpp | 65 ++- src/app/CASESessionManager.h | 35 +- src/app/OperationalSessionSetup.cpp | 28 +- src/app/OperationalSessionSetup.h | 17 +- src/app/server/Server.cpp | 9 + src/app/server/Server.h | 10 + src/app/tests/TestCommissionManager.cpp | 4 + .../CHIPDeviceControllerFactory.cpp | 6 + .../CHIPDeviceControllerSystemState.h | 23 +- .../internal/GenericPlatformManagerImpl.ipp | 14 + src/messaging/ExchangeContext.cpp | 7 + src/messaging/ExchangeContext.h | 3 + src/messaging/ExchangeMgr.cpp | 16 + src/messaging/ExchangeMgr.h | 7 + src/messaging/tests/echo/common.cpp | 5 - src/messaging/tests/echo/echo_requester.cpp | 146 +++++- src/messaging/tests/echo/echo_responder.cpp | 2 + src/protocols/secure_channel/CASESession.cpp | 130 +++++- src/protocols/secure_channel/CASESession.h | 17 + .../secure_channel/PairingSession.cpp | 13 + .../UserDirectedCommissioning.h | 6 +- .../UserDirectedCommissioningClient.cpp | 4 +- .../UserDirectedCommissioningServer.cpp | 4 +- src/transport/BUILD.gn | 1 + src/transport/Session.h | 21 + src/transport/SessionConnectionDelegate.h | 46 ++ src/transport/SessionDelegate.h | 4 + src/transport/SessionManager.cpp | 289 ++++++++++-- src/transport/SessionManager.h | 81 +++- src/transport/TransportMgr.h | 23 +- src/transport/TransportMgrBase.cpp | 79 +++- src/transport/TransportMgrBase.h | 23 +- src/transport/UnauthenticatedSessionTable.h | 42 +- src/transport/raw/ActiveTCPConnectionState.h | 125 ++++++ src/transport/raw/BUILD.gn | 12 +- src/transport/raw/Base.h | 63 ++- src/transport/raw/TCP.cpp | 424 ++++++++++++------ src/transport/raw/TCP.h | 155 ++++--- src/transport/raw/TCPConfig.h | 127 ++++++ src/transport/raw/Tuple.h | 79 +++- src/transport/raw/tests/BUILD.gn | 7 +- src/transport/raw/tests/TestTCP.cpp | 253 ++++++++++- src/transport/raw/tests/TestUDP.cpp | 3 +- 44 files changed, 2062 insertions(+), 368 deletions(-) create mode 100644 src/transport/SessionConnectionDelegate.h create mode 100644 src/transport/raw/ActiveTCPConnectionState.h create mode 100644 src/transport/raw/TCPConfig.h diff --git a/examples/shell/shell_common/include/Globals.h b/examples/shell/shell_common/include/Globals.h index d91620ca0ad171..69162be92f5204 100644 --- a/examples/shell/shell_common/include/Globals.h +++ b/examples/shell/shell_common/include/Globals.h @@ -24,7 +24,9 @@ #include <protocols/secure_channel/MessageCounterManager.h> #include <transport/SessionHolder.h> #include <transport/SessionManager.h> +#if INET_CONFIG_ENABLE_TCP_ENDPOINT #include <transport/raw/TCP.h> +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT #include <transport/raw/UDP.h> #if INET_CONFIG_ENABLE_TCP_ENDPOINT diff --git a/src/app/CASESessionManager.cpp b/src/app/CASESessionManager.cpp index c15ddcabe01c04..162ae7021a9f9f 100644 --- a/src/app/CASESessionManager.cpp +++ b/src/app/CASESessionManager.cpp @@ -30,62 +30,55 @@ CHIP_ERROR CASESessionManager::Init(chip::System::Layer * systemLayer, const CAS } void CASESessionManager::FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection, - Callback::Callback<OnDeviceConnectionFailure> * onFailure + Callback::Callback<OnDeviceConnectionFailure> * onFailure, #if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES - , - uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry + uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry, #endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES -) + TransportPayloadCapability transportPayloadCapability) { - FindOrEstablishSessionHelper(peerId, onConnection, onFailure, nullptr + FindOrEstablishSessionHelper(peerId, onConnection, onFailure, nullptr, #if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES - , - attemptCount, onRetry + attemptCount, onRetry, #endif - ); + transportPayloadCapability); } void CASESessionManager::FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection, - Callback::Callback<OperationalSessionSetup::OnSetupFailure> * onSetupFailure + Callback::Callback<OperationalSessionSetup::OnSetupFailure> * onSetupFailure, #if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES - , - uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry + uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry, #endif -) + TransportPayloadCapability transportPayloadCapability) { - FindOrEstablishSessionHelper(peerId, onConnection, nullptr, onSetupFailure + FindOrEstablishSessionHelper(peerId, onConnection, nullptr, onSetupFailure, #if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES - , - attemptCount, onRetry + attemptCount, onRetry, #endif - ); + transportPayloadCapability); } void CASESessionManager::FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection, - std::nullptr_t + std::nullptr_t, #if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES - , - uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry + uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry, #endif -) + TransportPayloadCapability transportPayloadCapability) { - FindOrEstablishSessionHelper(peerId, onConnection, nullptr, nullptr + FindOrEstablishSessionHelper(peerId, onConnection, nullptr, nullptr, #if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES - , - attemptCount, onRetry + attemptCount, onRetry, #endif - ); + transportPayloadCapability); } void CASESessionManager::FindOrEstablishSessionHelper(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection, Callback::Callback<OnDeviceConnectionFailure> * onFailure, - Callback::Callback<OperationalSessionSetup::OnSetupFailure> * onSetupFailure + Callback::Callback<OperationalSessionSetup::OnSetupFailure> * onSetupFailure, #if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES - , - uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry + uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry, #endif -) + TransportPayloadCapability transportPayloadCapability) { ChipLogDetail(CASESessionManager, "FindOrEstablishSession: PeerId = [%d:" ChipLogFormatX64 "]", peerId.GetFabricIndex(), ChipLogValueX64(peerId.GetNodeId())); @@ -124,12 +117,12 @@ void CASESessionManager::FindOrEstablishSessionHelper(const ScopedNodeId & peerI if (onFailure != nullptr) { - session->Connect(onConnection, onFailure); + session->Connect(onConnection, onFailure, transportPayloadCapability); } if (onSetupFailure != nullptr) { - session->Connect(onConnection, onSetupFailure); + session->Connect(onConnection, onSetupFailure, transportPayloadCapability); } } @@ -143,10 +136,11 @@ void CASESessionManager::ReleaseAllSessions() mConfig.sessionSetupPool->ReleaseAllSessionSetup(); } -CHIP_ERROR CASESessionManager::GetPeerAddress(const ScopedNodeId & peerId, Transport::PeerAddress & addr) +CHIP_ERROR CASESessionManager::GetPeerAddress(const ScopedNodeId & peerId, Transport::PeerAddress & addr, + TransportPayloadCapability transportPayloadCapability) { ReturnErrorOnFailure(mConfig.sessionInitParams.Validate()); - auto optionalSessionHandle = FindExistingSession(peerId); + auto optionalSessionHandle = FindExistingSession(peerId, transportPayloadCapability); ReturnErrorCodeIf(!optionalSessionHandle.HasValue(), CHIP_ERROR_NOT_CONNECTED); addr = optionalSessionHandle.Value()->AsSecureSession()->GetPeerAddress(); return CHIP_NO_ERROR; @@ -182,10 +176,11 @@ OperationalSessionSetup * CASESessionManager::FindExistingSessionSetup(const Sco return mConfig.sessionSetupPool->FindSessionSetup(peerId, forAddressUpdate); } -Optional<SessionHandle> CASESessionManager::FindExistingSession(const ScopedNodeId & peerId) const +Optional<SessionHandle> CASESessionManager::FindExistingSession(const ScopedNodeId & peerId, + const TransportPayloadCapability transportPayloadCapability) const { - return mConfig.sessionInitParams.sessionManager->FindSecureSessionForNode(peerId, - MakeOptional(Transport::SecureSession::Type::kCASE)); + return mConfig.sessionInitParams.sessionManager->FindSecureSessionForNode( + peerId, MakeOptional(Transport::SecureSession::Type::kCASE), transportPayloadCapability); } void CASESessionManager::ReleaseSession(OperationalSessionSetup * session) diff --git a/src/app/CASESessionManager.h b/src/app/CASESessionManager.h index e78478852b640e..38b39108b43b7e 100644 --- a/src/app/CASESessionManager.h +++ b/src/app/CASESessionManager.h @@ -26,6 +26,7 @@ #include <lib/support/Pool.h> #include <platform/CHIPDeviceLayer.h> #include <transport/SessionDelegate.h> +#include <transport/SessionManager.h> #include <transport/SessionUpdateDelegate.h> namespace chip { @@ -78,12 +79,11 @@ class CASESessionManager : public OperationalSessionReleaseDelegate, public Sess * setup is not successful. */ void FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection, - Callback::Callback<OnDeviceConnectionFailure> * onFailure + Callback::Callback<OnDeviceConnectionFailure> * onFailure, #if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES - , - uint8_t attemptCount = 1, Callback::Callback<OnDeviceConnectionRetry> * onRetry = nullptr + uint8_t attemptCount = 1, Callback::Callback<OnDeviceConnectionRetry> * onRetry = nullptr, #endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES - ); + TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload); /** * Find an existing session for the given node ID or trigger a new session request. @@ -106,14 +106,14 @@ class CASESessionManager : public OperationalSessionReleaseDelegate, public Sess * @param onSetupFailure A callback to be called upon an extended device connection failure. * @param attemptCount The number of retry attempts if session setup fails (default is 1). * @param onRetry A callback to be called on a retry attempt (enabled by a config flag). + * @param transportPayloadCapability An indicator of what payload types the session needs to be able to transport. */ void FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection, - Callback::Callback<OperationalSessionSetup::OnSetupFailure> * onSetupFailure + Callback::Callback<OperationalSessionSetup::OnSetupFailure> * onSetupFailure, #if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES - , - uint8_t attemptCount = 1, Callback::Callback<OnDeviceConnectionRetry> * onRetry = nullptr + uint8_t attemptCount = 1, Callback::Callback<OnDeviceConnectionRetry> * onRetry = nullptr, #endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES - ); + TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload); /** * Find an existing session for the given node ID or trigger a new session request. @@ -134,13 +134,13 @@ class CASESessionManager : public OperationalSessionReleaseDelegate, public Sess * @param onConnection A callback to be called upon successful connection establishment. * @param attemptCount The number of retry attempts if session setup fails (default is 1). * @param onRetry A callback to be called on a retry attempt (enabled by a config flag). + * @param transportPayloadCapability An indicator of what payload types the session needs to be able to transport. */ - void FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection, std::nullptr_t + void FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection, std::nullptr_t, #if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES - , - uint8_t attemptCount = 1, Callback::Callback<OnDeviceConnectionRetry> * onRetry = nullptr + uint8_t attemptCount = 1, Callback::Callback<OnDeviceConnectionRetry> * onRetry = nullptr, #endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES - ); + TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload); void ReleaseSessionsForFabric(FabricIndex fabricIndex); @@ -154,7 +154,8 @@ class CASESessionManager : public OperationalSessionReleaseDelegate, public Sess * an ongoing session with the peer node. If the session doesn't exist, the API will return * `CHIP_ERROR_NOT_CONNECTED` error. */ - CHIP_ERROR GetPeerAddress(const ScopedNodeId & peerId, Transport::PeerAddress & addr); + CHIP_ERROR GetPeerAddress(const ScopedNodeId & peerId, Transport::PeerAddress & addr, + TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload); //////////// OperationalSessionReleaseDelegate Implementation /////////////// void ReleaseSession(OperationalSessionSetup * device) override; @@ -165,15 +166,17 @@ class CASESessionManager : public OperationalSessionReleaseDelegate, public Sess private: OperationalSessionSetup * FindExistingSessionSetup(const ScopedNodeId & peerId, bool forAddressUpdate = false) const; - Optional<SessionHandle> FindExistingSession(const ScopedNodeId & peerId) const; + Optional<SessionHandle> FindExistingSession( + const ScopedNodeId & peerId, + const TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload) const; void FindOrEstablishSessionHelper(const ScopedNodeId & peerId, Callback::Callback<OnDeviceConnected> * onConnection, Callback::Callback<OnDeviceConnectionFailure> * onFailure, Callback::Callback<OperationalSessionSetup::OnSetupFailure> * onSetupFailure, #if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES - uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry + uint8_t attemptCount, Callback::Callback<OnDeviceConnectionRetry> * onRetry, #endif - ); + TransportPayloadCapability transportPayloadCapability); CASESessionManagerConfig mConfig; }; diff --git a/src/app/OperationalSessionSetup.cpp b/src/app/OperationalSessionSetup.cpp index 157de953116ef5..9d91b7b573a59f 100644 --- a/src/app/OperationalSessionSetup.cpp +++ b/src/app/OperationalSessionSetup.cpp @@ -76,8 +76,8 @@ bool OperationalSessionSetup::AttachToExistingSecureSession() mState == State::WaitingForRetry, false); - auto sessionHandle = - mInitParams.sessionManager->FindSecureSessionForNode(mPeerId, MakeOptional(Transport::SecureSession::Type::kCASE)); + auto sessionHandle = mInitParams.sessionManager->FindSecureSessionForNode( + mPeerId, MakeOptional(Transport::SecureSession::Type::kCASE), mTransportPayloadCapability); if (!sessionHandle.HasValue()) return false; @@ -93,11 +93,13 @@ bool OperationalSessionSetup::AttachToExistingSecureSession() void OperationalSessionSetup::Connect(Callback::Callback<OnDeviceConnected> * onConnection, Callback::Callback<OnDeviceConnectionFailure> * onFailure, - Callback::Callback<OnSetupFailure> * onSetupFailure) + Callback::Callback<OnSetupFailure> * onSetupFailure, + TransportPayloadCapability transportPayloadCapability) { CHIP_ERROR err = CHIP_NO_ERROR; bool isConnected = false; + mTransportPayloadCapability = transportPayloadCapability; // // Always enqueue our user provided callbacks into our callback list. // If anything goes wrong below, we'll trigger failures (including any queued from @@ -180,15 +182,17 @@ void OperationalSessionSetup::Connect(Callback::Callback<OnDeviceConnected> * on } void OperationalSessionSetup::Connect(Callback::Callback<OnDeviceConnected> * onConnection, - Callback::Callback<OnDeviceConnectionFailure> * onFailure) + Callback::Callback<OnDeviceConnectionFailure> * onFailure, + TransportPayloadCapability transportPayloadCapability) { - Connect(onConnection, onFailure, nullptr); + Connect(onConnection, onFailure, nullptr, transportPayloadCapability); } void OperationalSessionSetup::Connect(Callback::Callback<OnDeviceConnected> * onConnection, - Callback::Callback<OnSetupFailure> * onSetupFailure) + Callback::Callback<OnSetupFailure> * onSetupFailure, + TransportPayloadCapability transportPayloadCapability) { - Connect(onConnection, nullptr, onSetupFailure); + Connect(onConnection, nullptr, onSetupFailure, transportPayloadCapability); } void OperationalSessionSetup::UpdateDeviceData(const Transport::PeerAddress & addr, const ReliableMessageProtocolConfig & config) @@ -288,6 +292,16 @@ void OperationalSessionSetup::UpdateDeviceData(const Transport::PeerAddress & ad CHIP_ERROR OperationalSessionSetup::EstablishConnection(const ReliableMessageProtocolConfig & config) { +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + // TODO: Combine LargePayload flag with DNS-SD advertisements from peer. + // Issue #32348. + if (mTransportPayloadCapability == TransportPayloadCapability::kLargePayload) + { + // Set the transport type for carrying large payloads + mDeviceAddress.SetTransportType(chip::Transport::Type::kTcp); + } +#endif + mCASEClient = mClientPool->Allocate(); ReturnErrorCodeIf(mCASEClient == nullptr, CHIP_ERROR_NO_MEMORY); diff --git a/src/app/OperationalSessionSetup.h b/src/app/OperationalSessionSetup.h index 1de8c305353314..5955dbab0713bd 100644 --- a/src/app/OperationalSessionSetup.h +++ b/src/app/OperationalSessionSetup.h @@ -210,8 +210,12 @@ class DLL_EXPORT OperationalSessionSetup : public SessionEstablishmentDelegate, * `onFailure` may be called before the Connect call returns, for error * cases that are detected synchronously (e.g. inability to start an address * lookup). + * + * `transportPayloadCapability` is set to kLargePayload when the session needs to be established + * over a transport that allows large payloads to be transferred, e.g., TCP. */ - void Connect(Callback::Callback<OnDeviceConnected> * onConnection, Callback::Callback<OnDeviceConnectionFailure> * onFailure); + void Connect(Callback::Callback<OnDeviceConnected> * onConnection, Callback::Callback<OnDeviceConnectionFailure> * onFailure, + TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload); /* * This function can be called to establish a secure session with the device. @@ -227,8 +231,12 @@ class DLL_EXPORT OperationalSessionSetup : public SessionEstablishmentDelegate, * * `onSetupFailure` may be called before the Connect call returns, for error cases that are detected synchronously * (e.g. inability to start an address lookup). + * + * `transportPayloadCapability` is set to kLargePayload when the session needs to be established + * over a transport that allows large payloads to be transferred, e.g., TCP. */ - void Connect(Callback::Callback<OnDeviceConnected> * onConnection, Callback::Callback<OnSetupFailure> * onSetupFailure); + void Connect(Callback::Callback<OnDeviceConnected> * onConnection, Callback::Callback<OnSetupFailure> * onSetupFailure, + TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload); bool IsForAddressUpdate() const { return mPerformingAddressUpdate; } @@ -318,6 +326,8 @@ class DLL_EXPORT OperationalSessionSetup : public SessionEstablishmentDelegate, System::Clock::Milliseconds16 mRequestedBusyDelay = System::Clock::kZero; #endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES || CHIP_CONFIG_ENABLE_BUSY_HANDLING_FOR_OPERATIONAL_SESSION_SETUP + TransportPayloadCapability mTransportPayloadCapability = TransportPayloadCapability::kMRPPayload; + #if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES // When we TryNextResult on the resolver, it will synchronously call back // into our OnNodeAddressResolved when it succeeds. We need to track @@ -351,7 +361,8 @@ class DLL_EXPORT OperationalSessionSetup : public SessionEstablishmentDelegate, void CleanupCASEClient(); void Connect(Callback::Callback<OnDeviceConnected> * onConnection, Callback::Callback<OnDeviceConnectionFailure> * onFailure, - Callback::Callback<OnSetupFailure> * onSetupFailure); + Callback::Callback<OnSetupFailure> * onSetupFailure, + TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload); void EnqueueConnectionCallbacks(Callback::Callback<OnDeviceConnected> * onConnection, Callback::Callback<OnDeviceConnectionFailure> * onFailure, diff --git a/src/app/server/Server.cpp b/src/app/server/Server.cpp index cd9c56f9f021f7..1ad98d271262da 100644 --- a/src/app/server/Server.cpp +++ b/src/app/server/Server.cpp @@ -71,6 +71,9 @@ using chip::Transport::BleListenParameters; #endif using chip::Transport::PeerAddress; using chip::Transport::UdpListenParameters; +#if INET_CONFIG_ENABLE_TCP_ENDPOINT +using chip::Transport::TcpListenParameters; +#endif namespace { @@ -201,6 +204,12 @@ CHIP_ERROR Server::Init(const ServerInitParams & initParams) #if CONFIG_NETWORK_LAYER_BLE , BleListenParameters(DeviceLayer::ConnectivityMgr().GetBleLayer()) +#endif +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + , + TcpListenParameters(DeviceLayer::TCPEndPointManager()) + .SetAddressType(IPAddressType::kIPv6) + .SetListenPort(mOperationalServicePort) #endif ); diff --git a/src/app/server/Server.h b/src/app/server/Server.h index 8f6fcd5abecc66..d649e0fc923896 100644 --- a/src/app/server/Server.h +++ b/src/app/server/Server.h @@ -77,6 +77,12 @@ namespace chip { inline constexpr size_t kMaxBlePendingPackets = 1; +#if INET_CONFIG_ENABLE_TCP_ENDPOINT +inline constexpr size_t kMaxTcpActiveConnectionCount = CHIP_CONFIG_MAX_ACTIVE_TCP_CONNECTIONS; + +inline constexpr size_t kMaxTcpPendingPackets = CHIP_CONFIG_MAX_TCP_PENDING_PACKETS; +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + // // NOTE: Please do not alter the order of template specialization here as the logic // in the Server impl depends on this. @@ -89,6 +95,10 @@ using ServerTransportMgr = chip::TransportMgr<chip::Transport::UDP #if CONFIG_NETWORK_LAYER_BLE , chip::Transport::BLE<kMaxBlePendingPackets> +#endif +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + , + chip::Transport::TCP<kMaxTcpActiveConnectionCount, kMaxTcpPendingPackets> #endif >; diff --git a/src/app/tests/TestCommissionManager.cpp b/src/app/tests/TestCommissionManager.cpp index 0076fd6a55718f..188f51aee6a609 100644 --- a/src/app/tests/TestCommissionManager.cpp +++ b/src/app/tests/TestCommissionManager.cpp @@ -20,6 +20,7 @@ #include <app/reporting/ReportSchedulerImpl.h> #include <app/server/CommissioningWindowManager.h> #include <app/server/Server.h> +#include <crypto/RandUtils.h> #include <lib/dnssd/Advertiser.h> #include <lib/support/Span.h> #include <lib/support/UnitTestRegistration.h> @@ -104,6 +105,9 @@ void InitializeChip(nlTestSuite * suite) static chip::SimpleTestEventTriggerDelegate sSimpleTestEventTriggerDelegate; initParams.testEventTriggerDelegate = &sSimpleTestEventTriggerDelegate; (void) initParams.InitializeStaticResourcesBeforeServerInit(); + // Set a randomized server port(slightly shifted from CHIP_PORT) for testing + initParams.operationalServicePort = static_cast<uint16_t>(initParams.operationalServicePort + chip::Crypto::GetRandU16() % 20); + err = chip::Server::GetInstance().Init(initParams); NL_TEST_ASSERT(suite, err == CHIP_NO_ERROR); diff --git a/src/controller/CHIPDeviceControllerFactory.cpp b/src/controller/CHIPDeviceControllerFactory.cpp index 198d0c47c9f614..eb52e389a6b9d6 100644 --- a/src/controller/CHIPDeviceControllerFactory.cpp +++ b/src/controller/CHIPDeviceControllerFactory.cpp @@ -161,6 +161,12 @@ CHIP_ERROR DeviceControllerFactory::InitSystemState(FactoryInitParams params) #if CONFIG_NETWORK_LAYER_BLE , Transport::BleListenParameters(stateParams.bleLayer) +#endif +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + , + Transport::TcpListenParameters(stateParams.tcpEndPointManager) + .SetAddressType(IPAddressType::kIPv6) + .SetListenPort(params.listenPort) #endif )); diff --git a/src/controller/CHIPDeviceControllerSystemState.h b/src/controller/CHIPDeviceControllerSystemState.h index 389bb557f6c0cc..1ea0593d594993 100644 --- a/src/controller/CHIPDeviceControllerSystemState.h +++ b/src/controller/CHIPDeviceControllerSystemState.h @@ -57,16 +57,27 @@ namespace chip { inline constexpr size_t kMaxDeviceTransportBlePendingPackets = 1; -using DeviceTransportMgr = TransportMgr<Transport::UDP /* IPv6 */ +#if INET_CONFIG_ENABLE_TCP_ENDPOINT +inline constexpr size_t kMaxDeviceTransportTcpActiveConnectionCount = CHIP_CONFIG_MAX_ACTIVE_TCP_CONNECTIONS; + +inline constexpr size_t kMaxDeviceTransportTcpPendingPackets = CHIP_CONFIG_MAX_TCP_PENDING_PACKETS; +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + +using DeviceTransportMgr = + TransportMgr<Transport::UDP /* IPv6 */ #if INET_CONFIG_ENABLE_IPV4 - , - Transport::UDP /* IPv4 */ + , + Transport::UDP /* IPv4 */ #endif #if CONFIG_NETWORK_LAYER_BLE - , - Transport::BLE<kMaxDeviceTransportBlePendingPackets> /* BLE */ + , + Transport::BLE<kMaxDeviceTransportBlePendingPackets> /* BLE */ +#endif +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + , + Transport::TCP<kMaxDeviceTransportTcpActiveConnectionCount, kMaxDeviceTransportTcpPendingPackets> #endif - >; + >; namespace Controller { diff --git a/src/include/platform/internal/GenericPlatformManagerImpl.ipp b/src/include/platform/internal/GenericPlatformManagerImpl.ipp index d6f29ed515e034..64878f5928cd9b 100644 --- a/src/include/platform/internal/GenericPlatformManagerImpl.ipp +++ b/src/include/platform/internal/GenericPlatformManagerImpl.ipp @@ -89,6 +89,16 @@ CHIP_ERROR GenericPlatformManagerImpl<ImplClass>::_InitChipStack() } SuccessOrExit(err); +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + // Initialize the CHIP TCP layer. + err = TCPEndPointManager()->Init(SystemLayer()); + if (err != CHIP_NO_ERROR) + { + ChipLogError(DeviceLayer, "TCP initialization failed: %" CHIP_ERROR_FORMAT, err.Format()); + } + SuccessOrExit(err); +#endif + // TODO Perform dynamic configuration of the core CHIP objects based on stored settings. // Initialize the CHIP BLE manager. @@ -132,6 +142,10 @@ void GenericPlatformManagerImpl<ImplClass>::_Shutdown() ChipLogError(DeviceLayer, "Inet Layer shutdown"); UDPEndPointManager()->Shutdown(); +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + TCPEndPointManager()->Shutdown(); +#endif + #if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE ChipLogError(DeviceLayer, "BLE shutdown"); BLEMgr().Shutdown(); diff --git a/src/messaging/ExchangeContext.cpp b/src/messaging/ExchangeContext.cpp index f36a274be1da2a..bca044d91f230d 100644 --- a/src/messaging/ExchangeContext.cpp +++ b/src/messaging/ExchangeContext.cpp @@ -670,5 +670,12 @@ void ExchangeContext::ExchangeSessionHolder::GrabExpiredSession(const SessionHan GrabUnchecked(session); } +#if INET_CONFIG_ENABLE_TCP_ENDPOINT +void ExchangeContext::OnSessionConnectionClosed(CHIP_ERROR conErr) +{ + // TODO: Handle connection closure at the ExchangeContext level. +} +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + } // namespace Messaging } // namespace chip diff --git a/src/messaging/ExchangeContext.h b/src/messaging/ExchangeContext.h index fc20a5aace5273..47cf0ddbef2783 100644 --- a/src/messaging/ExchangeContext.h +++ b/src/messaging/ExchangeContext.h @@ -86,6 +86,9 @@ class DLL_EXPORT ExchangeContext : public ReliableMessageContext, NewSessionHandlingPolicy GetNewSessionHandlingPolicy() override { return NewSessionHandlingPolicy::kStayAtOldSession; } void OnSessionReleased() override; +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + void OnSessionConnectionClosed(CHIP_ERROR conErr) override; +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT /** * Send a CHIP message on this exchange. * diff --git a/src/messaging/ExchangeMgr.cpp b/src/messaging/ExchangeMgr.cpp index 3971864bb7e06e..a184723726781e 100644 --- a/src/messaging/ExchangeMgr.cpp +++ b/src/messaging/ExchangeMgr.cpp @@ -77,6 +77,9 @@ CHIP_ERROR ExchangeManager::Init(SessionManager * sessionManager) sessionManager->SetMessageDelegate(this); +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + sessionManager->SetConnectionDelegate(this); +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT mReliableMessageMgr.Init(sessionManager->SystemLayer()); mState = State::kState_Initialized; @@ -413,5 +416,18 @@ void ExchangeManager::CloseAllContextsForDelegate(const ExchangeDelegate * deleg }); } +#if INET_CONFIG_ENABLE_TCP_ENDPOINT +void ExchangeManager::OnTCPConnectionClosed(const SessionHandle & session, CHIP_ERROR conErr) +{ + mContextPool.ForEachActiveObject([&](auto * ec) { + if (ec->HasSessionHandle() && ec->GetSessionHandle() == session) + { + ec->OnSessionConnectionClosed(conErr); + } + return Loop::Continue; + }); +} +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + } // namespace Messaging } // namespace chip diff --git a/src/messaging/ExchangeMgr.h b/src/messaging/ExchangeMgr.h index 48c6f8df673fb6..b6e416cdbf74e7 100644 --- a/src/messaging/ExchangeMgr.h +++ b/src/messaging/ExchangeMgr.h @@ -49,6 +49,10 @@ static constexpr int16_t kAnyMessageType = -1; * handling the registration/unregistration of unsolicited message handlers. */ class DLL_EXPORT ExchangeManager : public SessionMessageDelegate +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + , + public SessionConnectionDelegate +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT { friend class ExchangeContext; @@ -242,6 +246,9 @@ class DLL_EXPORT ExchangeManager : public SessionMessageDelegate DuplicateMessage isDuplicate, System::PacketBufferHandle && msgBuf) override; void SendStandaloneAckIfNeeded(const PacketHeader & packetHeader, const PayloadHeader & payloadHeader, const SessionHandle & session, MessageFlags msgFlags, System::PacketBufferHandle && msgBuf); +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + void OnTCPConnectionClosed(const SessionHandle & session, CHIP_ERROR conErr) override; +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT }; } // namespace Messaging diff --git a/src/messaging/tests/echo/common.cpp b/src/messaging/tests/echo/common.cpp index 80befc92d27ae6..10eeeb67738024 100644 --- a/src/messaging/tests/echo/common.cpp +++ b/src/messaging/tests/echo/common.cpp @@ -51,10 +51,6 @@ void InitializeChip() err = chip::DeviceLayer::PlatformMgr().InitChipStack(); SuccessOrExit(err); - // Initialize TCP. - err = chip::DeviceLayer::TCPEndPointManager()->Init(chip::DeviceLayer::SystemLayer()); - SuccessOrExit(err); - exit: if (err != CHIP_NO_ERROR) { @@ -68,6 +64,5 @@ void ShutdownChip() gMessageCounterManager.Shutdown(); gExchangeManager.Shutdown(); gSessionManager.Shutdown(); - (void) chip::DeviceLayer::TCPEndPointManager()->Shutdown(); chip::DeviceLayer::PlatformMgr().Shutdown(); } diff --git a/src/messaging/tests/echo/echo_requester.cpp b/src/messaging/tests/echo/echo_requester.cpp index 1bff8e70f55d8d..b06edb359b989f 100644 --- a/src/messaging/tests/echo/echo_requester.cpp +++ b/src/messaging/tests/echo/echo_requester.cpp @@ -35,7 +35,9 @@ #include <protocols/echo/Echo.h> #include <protocols/secure_channel/PASESession.h> #include <system/SystemPacketBuffer.h> +#if INET_CONFIG_ENABLE_TCP_ENDPOINT #include <transport/raw/TCP.h> +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT #include <transport/raw/UDP.h> #include <inttypes.h> @@ -49,6 +51,9 @@ namespace { // Max value for the number of EchoRequests sent. constexpr size_t kMaxEchoCount = 3; +// Max value for the number of tcp connect attempts. +constexpr size_t kMaxTCPConnectAttempts = 3; + // The CHIP Echo interval time. constexpr chip::System::Clock::Timeout gEchoInterval = chip::System::Clock::Seconds16(1); @@ -62,9 +67,21 @@ chip::TransportMgr<chip::Transport::TCP<kMaxTcpActiveConnectionCount, kMaxTcpPen chip::Inet::IPAddress gDestAddr; chip::SessionHolder gSession; +chip::Transport::AppTCPConnectionCallbackCtxt gAppTCPConnCbCtxt; +chip::Transport::ActiveTCPConnectionState * gActiveTCPConnState = nullptr; + // The last time a CHIP Echo was attempted to be sent. chip::System::Clock::Timestamp gLastEchoTime = chip::System::Clock::kZero; +// True, if client is still connecting to the server, false otherwise. +static bool gClientConInProgress = false; + +// True, once client connection to server is established. +static bool gClientConEstablished = false; + +// The handle to the TCP connection to the peer. +// static chip::Transport::ActiveTCPConnectionState * gCon = nullptr; + // Count of the number of EchoRequests sent. uint64_t gEchoCount = 0; @@ -73,9 +90,14 @@ uint64_t gEchoRespCount = 0; bool gUseTCP = false; +uint64_t gTCPConnAttemptCount = 0; + CHIP_ERROR SendEchoRequest(); void EchoTimerHandler(chip::System::Layer * systemLayer, void * appState); +static void HandleConnectionAttemptComplete(chip::Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr); +static void HandleConnectionClosed(chip::Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr); + void Shutdown() { chip::DeviceLayer::SystemLayer().CancelTimer(EchoTimerHandler, nullptr); @@ -148,8 +170,9 @@ CHIP_ERROR SendEchoRequest() return err; } -CHIP_ERROR EstablishSecureSession() +CHIP_ERROR EstablishSecureSession(chip::Transport::ActiveTCPConnectionState * conn = nullptr) { + char peerAddrBuf[chip::Transport::PeerAddress::kMaxToStringSize]; chip::Transport::PeerAddress peerAddr; if (gUseTCP) { @@ -160,7 +183,9 @@ CHIP_ERROR EstablishSecureSession() peerAddr = chip::Transport::PeerAddress::UDP(gDestAddr, CHIP_PORT, chip::Inet::InterfaceId::Null()); } - // Attempt to connect to the peer. + peerAddr.ToString(peerAddrBuf); + + // Establish secure session to the peer. CHIP_ERROR err = gSessionManager.InjectPaseSessionWithTestKey(gSession, 1, chip::kTestDeviceNodeId, 1, gFabricIndex, peerAddr, chip::CryptoContext::SessionRole::kInitiator); if (err != CHIP_NO_ERROR) @@ -170,12 +195,93 @@ CHIP_ERROR EstablishSecureSession() } else { - printf("Establish secure session succeeded\n"); + if (gUseTCP) + { + printf("Associating secure session with connection %p\n", conn); + gSession.Get().Value()->AsSecureSession()->SetTCPConnection(conn); + } + + printf("Successfully established secure session with peer at %s\n", peerAddrBuf); } return err; } +void CloseConnection() +{ + char peerAddrBuf[chip::Transport::PeerAddress::kMaxToStringSize]; + chip::Transport::PeerAddress peerAddr = chip::Transport::PeerAddress::TCP(gDestAddr, CHIP_PORT); + + gSessionManager.TCPDisconnect(peerAddr); + + peerAddr.ToString(peerAddrBuf); + printf("Connection closed to peer at %s\n", peerAddrBuf); + + gClientConEstablished = false; + gClientConInProgress = false; +} + +void HandleConnectionAttemptComplete(chip::Transport::ActiveTCPConnectionState * conn, CHIP_ERROR err) +{ + chip::DeviceLayer::PlatformMgr().StopEventLoopTask(); + + if (err != CHIP_NO_ERROR) + { + printf("Connection FAILED with err: %s\n", chip::ErrorStr(err)); + + gLastEchoTime = chip::System::SystemClock().GetMonotonicTimestamp(); + CloseConnection(); + gTCPConnAttemptCount++; + return; + } + + err = EstablishSecureSession(conn); + if (err != CHIP_NO_ERROR) + { + printf("Secure session FAILED with err: %s\n", chip::ErrorStr(err)); + + gLastEchoTime = chip::System::SystemClock().GetMonotonicTimestamp(); + CloseConnection(); + return; + } + + gClientConEstablished = true; + gClientConInProgress = false; +} + +void HandleConnectionClosed(chip::Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr) +{ + CloseConnection(); +} + +void EstablishTCPConnection() +{ + CHIP_ERROR err = CHIP_NO_ERROR; + // Previous connection attempt underway. + if (gClientConInProgress) + { + return; + } + + gClientConEstablished = false; + + chip::Transport::PeerAddress peerAddr = chip::Transport::PeerAddress::TCP(gDestAddr, CHIP_PORT); + + // Connect to the peer + err = gSessionManager.TCPConnect(peerAddr, &gAppTCPConnCbCtxt, &gActiveTCPConnState); + if (err != CHIP_NO_ERROR) + { + printf("Connection FAILED with err: %s\n", chip::ErrorStr(err)); + + gLastEchoTime = chip::System::SystemClock().GetMonotonicTimestamp(); + CloseConnection(); + gTCPConnAttemptCount++; + return; + } + + gClientConInProgress = true; +} + void HandleEchoResponseReceived(chip::Messaging::ExchangeContext * ec, chip::System::PacketBufferHandle && payload) { chip::System::Clock::Timestamp respTime = chip::System::SystemClock().GetMonotonicTimestamp(); @@ -236,6 +342,10 @@ int main(int argc, char * argv[]) err = gSessionManager.Init(&chip::DeviceLayer::SystemLayer(), &gTCPManager, &gMessageCounterManager, &gStorage, &gFabricTable, gSessionKeystore); SuccessOrExit(err); + + gAppTCPConnCbCtxt.appContext = nullptr; + gAppTCPConnCbCtxt.connCompleteCb = HandleConnectionAttemptComplete; + gAppTCPConnCbCtxt.connClosedCb = HandleConnectionClosed; } else { @@ -255,9 +365,29 @@ int main(int argc, char * argv[]) err = gMessageCounterManager.Init(&gExchangeManager); SuccessOrExit(err); - // Start the CHIP connection to the CHIP echo responder. - err = EstablishSecureSession(); - SuccessOrExit(err); + if (gUseTCP) + { + + while (!gClientConEstablished) + { + // For TCP transport, attempt to establish the connection to the CHIP echo responder. + // On Connection completion, call EstablishSecureSession(conn); + EstablishTCPConnection(); + + chip::DeviceLayer::PlatformMgr().RunEventLoop(); + + if (gTCPConnAttemptCount > kMaxTCPConnectAttempts) + { + ExitNow(); + } + } + } + else + { + // Start the CHIP session to the CHIP echo responder. + err = EstablishSecureSession(nullptr); + SuccessOrExit(err); + } err = gEchoClient.Init(&gExchangeManager, gSession.Get().Value()); SuccessOrExit(err); @@ -274,14 +404,14 @@ int main(int argc, char * argv[]) if (gUseTCP) { - gTCPManager.Disconnect(chip::Transport::PeerAddress::TCP(gDestAddr)); + gTCPManager.TCPDisconnect(chip::Transport::PeerAddress::TCP(gDestAddr)); } gTCPManager.Close(); Shutdown(); exit: - if ((err != CHIP_NO_ERROR) || (gEchoRespCount != kMaxEchoCount)) + if ((err != CHIP_NO_ERROR) || (gEchoRespCount != kMaxEchoCount) || (gTCPConnAttemptCount > kMaxTCPConnectAttempts)) { printf("ChipEchoClient failed: %s\n", chip::ErrorStr(err)); exit(EXIT_FAILURE); diff --git a/src/messaging/tests/echo/echo_responder.cpp b/src/messaging/tests/echo/echo_responder.cpp index 140aab00b0ff23..0cd2366a1f6c2b 100644 --- a/src/messaging/tests/echo/echo_responder.cpp +++ b/src/messaging/tests/echo/echo_responder.cpp @@ -35,7 +35,9 @@ #include <protocols/echo/Echo.h> #include <protocols/secure_channel/PASESession.h> #include <system/SystemPacketBuffer.h> +#if INET_CONFIG_ENABLE_TCP_ENDPOINT #include <transport/raw/TCP.h> +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT #include <transport/raw/UDP.h> namespace { diff --git a/src/protocols/secure_channel/CASESession.cpp b/src/protocols/secure_channel/CASESession.cpp index 745bd3898fa865..ccc2bc2188d176 100644 --- a/src/protocols/secure_channel/CASESession.cpp +++ b/src/protocols/secure_channel/CASESession.cpp @@ -419,6 +419,21 @@ void CASESession::Clear() mPeerNodeId = kUndefinedNodeId; mFabricsTable = nullptr; mFabricIndex = kUndefinedFabricIndex; +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + // Clear the context object. + mTCPConnCbCtxt.appContext = nullptr; + mTCPConnCbCtxt.connCompleteCb = nullptr; + mTCPConnCbCtxt.connClosedCb = nullptr; + mTCPConnCbCtxt.connReceivedCb = nullptr; + + if (mPeerConnState && mPeerConnState->mConnectionState != Transport::TCPState::kConnected) + { + // Abort the connection if the CASESession is being destroyed and the + // connection is in the middle of being set up. + mSessionManager->TCPDisconnect(mPeerConnState, /* shouldAbort = */ true); + mPeerConnState = nullptr; + } +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT } void CASESession::InvalidateIfPendingEstablishmentOnFabric(FabricIndex fabricIndex) @@ -446,7 +461,9 @@ CHIP_ERROR CASESession::Init(SessionManager & sessionManager, Credentials::Certi ReturnErrorOnFailure(mCommissioningHash.Begin()); - mDelegate = delegate; + mDelegate = delegate; + mSessionManager = &sessionManager; + ReturnErrorOnFailure(AllocateSecureSession(sessionManager, sessionEvictionHint)); mValidContext.Reset(); @@ -454,6 +471,11 @@ CHIP_ERROR CASESession::Init(SessionManager & sessionManager, Credentials::Certi mValidContext.mRequiredKeyPurposes.Set(KeyPurposeFlags::kServerAuth); mValidContext.mValidityPolicy = policy; +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + mTCPConnCbCtxt.appContext = this; + mTCPConnCbCtxt.connCompleteCb = HandleConnectionAttemptComplete; + mTCPConnCbCtxt.connClosedCb = HandleConnectionClosed; +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT return CHIP_NO_ERROR; } @@ -516,12 +538,18 @@ CHIP_ERROR CASESession::EstablishSession(SessionManager & sessionManager, Fabric // This is to make sure the exchange will get closed if Init() returned an error. mExchangeCtxt.Emplace(*exchangeCtxt); + Transport::PeerAddress peerAddress = mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->GetPeerAddress(); + // From here onwards, let's go to exit on error, as some state might have already // been initialized SuccessOrExit(err); SuccessOrExit(err = fabricTable->AddFabricDelegate(this)); + // Set the PeerAddress in the secure session up front to indicate the + // Transport Type of the session that is being set up. + mSecureSessionHolder->AsSecureSession()->SetPeerAddress(peerAddress); + mFabricsTable = fabricTable; mFabricIndex = fabricInfo->GetFabricIndex(); mSessionResumptionStorage = sessionResumptionStorage; @@ -534,8 +562,18 @@ CHIP_ERROR CASESession::EstablishSession(SessionManager & sessionManager, Fabric ChipLogProgress(SecureChannel, "Initiating session on local FabricIndex %u from 0x" ChipLogFormatX64 " -> 0x" ChipLogFormatX64, static_cast<unsigned>(mFabricIndex), ChipLogValueX64(mLocalNodeId), ChipLogValueX64(mPeerNodeId)); - err = SendSigma1(); - SuccessOrExit(err); + if (peerAddress.GetTransportType() == Transport::Type::kTcp) + { +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + err = sessionManager.TCPConnect(peerAddress, &mTCPConnCbCtxt, &mPeerConnState); + SuccessOrExit(err); +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + } + else + { + err = SendSigma1(); + SuccessOrExit(err); + } exit: if (err != CHIP_NO_ERROR) @@ -648,6 +686,78 @@ CHIP_ERROR CASESession::RecoverInitiatorIpk() return CHIP_NO_ERROR; } +#if INET_CONFIG_ENABLE_TCP_ENDPOINT +void CASESession::HandleConnectionAttemptComplete(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR err) +{ + VerifyOrReturn(conn != nullptr); + // conn->mAppState should not be NULL. SessionManager has already checked + // before calling this callback. + VerifyOrDie(conn->mAppState != nullptr); + + char peerAddrBuf[chip::Transport::PeerAddress::kMaxToStringSize]; + conn->mPeerAddr.ToString(peerAddrBuf); + + CASESession * caseSession = reinterpret_cast<CASESession *>(conn->mAppState->appContext); + VerifyOrReturn(caseSession != nullptr); + + // Exit and disconnect if connection setup encountered an error. + SuccessOrExit(err); + + ChipLogDetail(SecureChannel, "TCP Connection established with %s before session establishment", peerAddrBuf); + + // Associate the connection with the current unauthenticated session for the + // CASE exchange. + caseSession->mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->SetTCPConnection(conn); + + // Associate the connection with the current secure session that is being + // set up. + caseSession->mSecureSessionHolder.Get().Value()->AsSecureSession()->SetTCPConnection(conn); + + // Send Sigma1 after connection is established for sessions over TCP + err = caseSession->SendSigma1(); + SuccessOrExit(err); + +exit: + if (err != CHIP_NO_ERROR) + { + ChipLogError(SecureChannel, "Connection establishment failed with peer at %s: %" CHIP_ERROR_FORMAT, peerAddrBuf, + err.Format()); + + // Close the underlying connection and ensure that the CASESession is + // not holding on to a stale ActiveTCPConnectionState. We call + // TCPDisconnect() here explicitly in order to abort the connection + // even after it establishes successfully, but SendSigma1() fails for + // some reason. + caseSession->mSessionManager->TCPDisconnect(conn, /* shouldAbort = */ true); + caseSession->mPeerConnState = nullptr; + + caseSession->Clear(); + } +} + +void CASESession::HandleConnectionClosed(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr) +{ + VerifyOrReturn(conn != nullptr); + // conn->mAppState should not be NULL. SessionManager has already checked + // before calling this callback. + VerifyOrDie(conn->mAppState != nullptr); + + CASESession * caseSession = reinterpret_cast<CASESession *>(conn->mAppState->appContext); + VerifyOrReturn(caseSession != nullptr); + + // Drop our pointer to the now-invalid connection state. + // + // Since the connection is closed, message sends over the ExchangeContext + // will just fail and be handled like normal send errors. + // + // Additionally, SessionManager notifies (via ExchangeMgr) all ExchangeContexts on the + // connection closures for the attached sessions and the ExchangeContexts + // can close proactively if that's appropriate. + caseSession->mPeerConnState = nullptr; + ChipLogDetail(SecureChannel, "TCP Connection for this session has closed"); +} +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + CHIP_ERROR CASESession::SendSigma1() { MATTER_TRACE_SCOPE("SendSigma1", "CASESession"); @@ -2143,10 +2253,16 @@ CHIP_ERROR CASESession::OnMessageReceived(ExchangeContext * ec, const PayloadHea #endif // CONFIG_BUILD_FOR_HOST_UNIT_TEST #if CHIP_CONFIG_SLOW_CRYPTO - if (msgType == Protocols::SecureChannel::MsgType::CASE_Sigma1 || msgType == Protocols::SecureChannel::MsgType::CASE_Sigma2 || - msgType == Protocols::SecureChannel::MsgType::CASE_Sigma2Resume || - msgType == Protocols::SecureChannel::MsgType::CASE_Sigma3) - { + if ((msgType == Protocols::SecureChannel::MsgType::CASE_Sigma1 || msgType == Protocols::SecureChannel::MsgType::CASE_Sigma2 || + msgType == Protocols::SecureChannel::MsgType::CASE_Sigma2Resume || + msgType == Protocols::SecureChannel::MsgType::CASE_Sigma3) && + mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->GetPeerAddress().GetTransportType() != + Transport::Type::kTcp) + { + // TODO: Rename FlushAcks() to something more semantically correct and + // call unconditionally for TCP or MRP from here. Inside, the + // PeerAddress type could be consulted to selectively flush MRP Acks + // when transport is not TCP. Issue #33183 SuccessOrExit(err = mExchangeCtxt.Value()->FlushAcks()); } #endif // CHIP_CONFIG_SLOW_CRYPTO diff --git a/src/protocols/secure_channel/CASESession.h b/src/protocols/secure_channel/CASESession.h index b7c6b429b950ad..045d1982dd723c 100644 --- a/src/protocols/secure_channel/CASESession.h +++ b/src/protocols/secure_channel/CASESession.h @@ -286,6 +286,22 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler, void InvalidateIfPendingEstablishmentOnFabric(FabricIndex fabricIndex); +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + static void HandleConnectionAttemptComplete(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr); + static void HandleConnectionClosed(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr); + + // Context to pass down when connecting to peer + Transport::AppTCPConnectionCallbackCtxt mTCPConnCbCtxt; + // Pointer to the underlying TCP connection state. Returned by the + // TCPConnect() method (on the connection Initiator side) when an + // ActiveTCPConnectionState object is allocated. This connection + // context is used on the CASE Initiator side to facilitate the + // invocation of the callbacks when the connection is established/closed. + // + // This pointer must be nulled out when the connection is closed. + Transport::ActiveTCPConnectionState * mPeerConnState = nullptr; +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + #if CONFIG_BUILD_FOR_HOST_UNIT_TEST void SetStopSigmaHandshakeAt(Optional<State> state) { mStopHandshakeAtState = state; } #endif // CONFIG_BUILD_FOR_HOST_UNIT_TEST @@ -301,6 +317,7 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler, uint8_t mIPK[kIPKSize]; SessionResumptionStorage * mSessionResumptionStorage = nullptr; + SessionManager * mSessionManager = nullptr; FabricTable * mFabricsTable = nullptr; FabricIndex mFabricIndex = kUndefinedFabricIndex; diff --git a/src/protocols/secure_channel/PairingSession.cpp b/src/protocols/secure_channel/PairingSession.cpp index 1f7874bdf115dc..ae4ca272858a78 100644 --- a/src/protocols/secure_channel/PairingSession.cpp +++ b/src/protocols/secure_channel/PairingSession.cpp @@ -22,6 +22,7 @@ #include <lib/core/CHIPConfig.h> #include <lib/core/TLVTypes.h> #include <lib/support/SafeInt.h> +#include <transport/SessionManager.h> namespace chip { @@ -58,6 +59,18 @@ void PairingSession::Finish() { Transport::PeerAddress address = mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->GetPeerAddress(); +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + if (address.GetTransportType() == Transport::Type::kTcp) + { + // Fetch the connection for the unauthenticated session used to set up + // the secure session. + Transport::ActiveTCPConnectionState * conn = + mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->GetTCPConnection(); + + // Associate the connection with the secure session being activated. + mSecureSessionHolder->AsSecureSession()->SetTCPConnection(conn); + } +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT // Discard the exchange so that Clear() doesn't try closing it. The exchange will handle that. DiscardExchange(); diff --git a/src/protocols/user_directed_commissioning/UserDirectedCommissioning.h b/src/protocols/user_directed_commissioning/UserDirectedCommissioning.h index 86fd4d51ed4e48..7a496e5a2f0a33 100644 --- a/src/protocols/user_directed_commissioning/UserDirectedCommissioning.h +++ b/src/protocols/user_directed_commissioning/UserDirectedCommissioning.h @@ -539,7 +539,8 @@ class DLL_EXPORT UserDirectedCommissioningClient : public TransportMgrDelegate } private: - void OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msgBuf) override; + void OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msgBuf, + Transport::MessageTransportContext * ctxt = nullptr) override; CommissionerDeclarationHandler * mCommissionerDeclarationHandler = nullptr; }; @@ -652,7 +653,8 @@ class DLL_EXPORT UserDirectedCommissioningServer : public TransportMgrDelegate void HandleNewUDC(const Transport::PeerAddress & source, IdentificationDeclaration & id); void HandleUDCCancel(IdentificationDeclaration & id); void HandleUDCCommissionerPasscodeReady(IdentificationDeclaration & id); - void OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msgBuf) override; + void OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msgBuf, + Transport::MessageTransportContext * ctxt = nullptr) override; UDCClients<kMaxUDCClients> mUdcClients; // < Active UDC clients diff --git a/src/protocols/user_directed_commissioning/UserDirectedCommissioningClient.cpp b/src/protocols/user_directed_commissioning/UserDirectedCommissioningClient.cpp index 9fc43634d7ec7d..6d7c315ffb5308 100644 --- a/src/protocols/user_directed_commissioning/UserDirectedCommissioningClient.cpp +++ b/src/protocols/user_directed_commissioning/UserDirectedCommissioningClient.cpp @@ -24,6 +24,7 @@ */ #include "UserDirectedCommissioning.h" +#include <transport/raw/Base.h> #ifdef __ZEPHYR__ #include <zephyr/kernel.h> @@ -235,7 +236,8 @@ CHIP_ERROR CommissionerDeclaration::ReadPayload(uint8_t * udcPayload, size_t pay return CHIP_NO_ERROR; } -void UserDirectedCommissioningClient::OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msg) +void UserDirectedCommissioningClient::OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msg, + Transport::MessageTransportContext * ctxt) { char addrBuffer[chip::Transport::PeerAddress::kMaxToStringSize]; source.ToString(addrBuffer); diff --git a/src/protocols/user_directed_commissioning/UserDirectedCommissioningServer.cpp b/src/protocols/user_directed_commissioning/UserDirectedCommissioningServer.cpp index 2efd8d0a33de28..a06bffcec62b3a 100644 --- a/src/protocols/user_directed_commissioning/UserDirectedCommissioningServer.cpp +++ b/src/protocols/user_directed_commissioning/UserDirectedCommissioningServer.cpp @@ -26,6 +26,7 @@ #include "UserDirectedCommissioning.h" #include <lib/core/CHIPSafeCasts.h> #include <system/TLVPacketBufferBackingStore.h> +#include <transport/raw/Base.h> #include <unistd.h> @@ -33,7 +34,8 @@ namespace chip { namespace Protocols { namespace UserDirectedCommissioning { -void UserDirectedCommissioningServer::OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msg) +void UserDirectedCommissioningServer::OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msg, + Transport::MessageTransportContext * ctxt) { char addrBuffer[chip::Transport::PeerAddress::kMaxToStringSize]; source.ToString(addrBuffer); diff --git a/src/transport/BUILD.gn b/src/transport/BUILD.gn index fa556d40afd5b0..c4649c9b92d27c 100644 --- a/src/transport/BUILD.gn +++ b/src/transport/BUILD.gn @@ -37,6 +37,7 @@ static_library("transport") { "SecureSessionTable.h", "Session.cpp", "Session.h", + "SessionConnectionDelegate.h", "SessionDelegate.h", "SessionHolder.cpp", "SessionHolder.h", diff --git a/src/transport/Session.h b/src/transport/Session.h index 0b6048d5c077c0..d9840ec3ee33f1 100644 --- a/src/transport/Session.h +++ b/src/transport/Session.h @@ -28,6 +28,9 @@ #include <messaging/SessionParameters.h> #include <platform/LockTracker.h> #include <transport/SessionDelegate.h> +#if INET_CONFIG_ENABLE_TCP_ENDPOINT +#include <transport/raw/TCP.h> +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT namespace chip { namespace Transport { @@ -225,6 +228,15 @@ class Session bool IsUnauthenticatedSession() const { return GetSessionType() == SessionType::kUnauthenticated; } +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + // This API is used to associate the connection with the session when the + // latter is about to be marked active. It is also used to reset the + // connection to a nullptr when the connection is lost and the session + // is marked as Defunct. + ActiveTCPConnectionState * GetTCPConnection() const { return mTCPConnection; } + void SetTCPConnection(ActiveTCPConnectionState * conn) { mTCPConnection = conn; } +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + void DispatchSessionEvent(SessionDelegate::Event event) { // Holders might remove themselves when notified. @@ -264,6 +276,15 @@ class Session private: FabricIndex mFabricIndex = kUndefinedFabricIndex; +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + // The underlying TCP connection object over which the session is + // established. + // The lifetime of this member connection pointer is, essentially, the same + // as that of the underlying connection with the peer. + // It would remain as a nullptr for all sessions that are not set up over + // a TCP connection. + ActiveTCPConnectionState * mTCPConnection = nullptr; +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT }; // diff --git a/src/transport/SessionConnectionDelegate.h b/src/transport/SessionConnectionDelegate.h new file mode 100644 index 00000000000000..4557d0ae107e68 --- /dev/null +++ b/src/transport/SessionConnectionDelegate.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2023 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. + */ + +#pragma once + +#include <transport/Session.h> +#include <transport/raw/MessageHeader.h> + +namespace chip { + +/** + * @brief + * This class defines a delegate that will be called by the SessionManager on + * specific connection-related (e.g. for TCP) events. If the user of SessionManager + * is interested in receiving these callbacks, they can specialize this class and + * handle each trigger in their implementation of this class. + */ +class DLL_EXPORT SessionConnectionDelegate +{ +public: + virtual ~SessionConnectionDelegate() {} + + /** + * @brief + * Called when the underlying connection for the session is closed. + * + * @param session The handle to the secure session + * @param conErr The connection error code + */ + virtual void OnTCPConnectionClosed(const SessionHandle & session, CHIP_ERROR conErr) = 0; +}; + +} // namespace chip diff --git a/src/transport/SessionDelegate.h b/src/transport/SessionDelegate.h index b9e0a7b8b38b0c..503aaa2b0c4f5c 100644 --- a/src/transport/SessionDelegate.h +++ b/src/transport/SessionDelegate.h @@ -66,6 +66,10 @@ class DLL_EXPORT SessionDelegate * SessionManager to allocate a new session. If they desire to do so, it MUST be done asynchronously. */ virtual void OnSessionHang() {} + +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + virtual void OnSessionConnectionClosed(CHIP_ERROR conErr) {} +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT }; } // namespace chip diff --git a/src/transport/SessionManager.cpp b/src/transport/SessionManager.cpp index 5adfde18b47ff4..d49e66fb6f5116 100644 --- a/src/transport/SessionManager.cpp +++ b/src/transport/SessionManager.cpp @@ -147,6 +147,11 @@ CHIP_ERROR SessionManager::Init(System::Layer * systemLayer, TransportMgrBase * mTransportMgr->SetSessionManager(this); +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + mConnCompleteCb = nullptr; + mConnClosedCb = nullptr; +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + return CHIP_NO_ERROR; } @@ -602,7 +607,8 @@ CHIP_ERROR SessionManager::InjectCaseSessionWithTestKey(SessionHolder & sessionH return CHIP_NO_ERROR; } -void SessionManager::OnMessageReceived(const PeerAddress & peerAddress, System::PacketBufferHandle && msg) +void SessionManager::OnMessageReceived(const PeerAddress & peerAddress, System::PacketBufferHandle && msg, + Transport::MessageTransportContext * ctxt) { PacketHeader partialPacketHeader; @@ -621,20 +627,151 @@ void SessionManager::OnMessageReceived(const PeerAddress & peerAddress, System:: } else { - SecureUnicastMessageDispatch(partialPacketHeader, peerAddress, std::move(msg)); + SecureUnicastMessageDispatch(partialPacketHeader, peerAddress, std::move(msg), ctxt); } } else { - UnauthenticatedMessageDispatch(partialPacketHeader, peerAddress, std::move(msg)); + UnauthenticatedMessageDispatch(partialPacketHeader, peerAddress, std::move(msg), ctxt); + } +} + +#if INET_CONFIG_ENABLE_TCP_ENDPOINT +void SessionManager::HandleConnectionReceived(Transport::ActiveTCPConnectionState * conn) +{ + char peerAddrBuf[chip::Transport::PeerAddress::kMaxToStringSize]; + + VerifyOrReturn(conn != nullptr); + conn->mPeerAddr.ToString(peerAddrBuf); + ChipLogProgress(Inet, "Received TCP connection request from %s.", peerAddrBuf); + + Transport::AppTCPConnectionCallbackCtxt * appTCPConnCbCtxt = conn->mAppState; + if (appTCPConnCbCtxt != nullptr && appTCPConnCbCtxt->connReceivedCb != nullptr) + { + appTCPConnCbCtxt->connReceivedCb(conn); + } +} + +void SessionManager::HandleConnectionAttemptComplete(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr) +{ + VerifyOrReturn(conn != nullptr); + + Transport::AppTCPConnectionCallbackCtxt * appTCPConnCbCtxt = conn->mAppState; + if (appTCPConnCbCtxt == nullptr) + { + TCPDisconnect(conn, /* shouldAbort = */ true); + return; + } + + if (appTCPConnCbCtxt->connCompleteCb != nullptr) + { + appTCPConnCbCtxt->connCompleteCb(conn, conErr); + } + else + { + char peerAddrBuf[chip::Transport::PeerAddress::kMaxToStringSize]; + conn->mPeerAddr.ToString(peerAddrBuf); + + ChipLogProgress(Inet, "TCP Connection established with peer %s, but no registered handler. Disconnecting.", peerAddrBuf); + + // Close the connection + TCPDisconnect(conn, /* shouldAbort = */ true); + } +} + +void SessionManager::HandleConnectionClosed(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr) +{ + VerifyOrReturn(conn != nullptr); + + // Mark the corresponding secure sessions as defunct + mSecureSessions.ForEachSession([&](auto session) { + if (session->IsActiveSession() && session->GetTCPConnection() == conn) + { + SessionHandle handle(*session); + // Notify the SessionConnection delegate of the connection + // closure. + if (mConnDelegate != nullptr) + { + mConnDelegate->OnTCPConnectionClosed(handle, conErr); + } + + // Dis-associate the connection from session by setting it to a + // nullptr. + session->SetTCPConnection(nullptr); + // Mark session as defunct + session->MarkAsDefunct(); + } + + return Loop::Continue; + }); + + // TODO: A mechanism to mark an unauthenticated session as unusable when + // the underlying connection is broken. Issue #32323 + + Transport::AppTCPConnectionCallbackCtxt * appTCPConnCbCtxt = conn->mAppState; + VerifyOrReturn(appTCPConnCbCtxt != nullptr); + + if (appTCPConnCbCtxt->connClosedCb != nullptr) + { + appTCPConnCbCtxt->connClosedCb(conn, conErr); + } +} + +CHIP_ERROR SessionManager::TCPConnect(const PeerAddress & peerAddress, Transport::AppTCPConnectionCallbackCtxt * appState, + Transport::ActiveTCPConnectionState ** peerConnState) +{ + char peerAddrBuf[chip::Transport::PeerAddress::kMaxToStringSize]; + peerAddress.ToString(peerAddrBuf); + if (mTransportMgr != nullptr) + { + ChipLogProgress(Inet, "Connecting over TCP with peer at %s.", peerAddrBuf); + return mTransportMgr->TCPConnect(peerAddress, appState, peerConnState); + } + + ChipLogError(Inet, "The transport manager is not initialized. Unable to connect to peer at %s.", peerAddrBuf); + + return CHIP_ERROR_INCORRECT_STATE; +} + +CHIP_ERROR SessionManager::TCPDisconnect(const PeerAddress & peerAddress) +{ + if (mTransportMgr != nullptr) + { + char peerAddrBuf[chip::Transport::PeerAddress::kMaxToStringSize]; + peerAddress.ToString(peerAddrBuf); + ChipLogProgress(Inet, "Disconnecting TCP connection from peer at %s.", peerAddrBuf); + mTransportMgr->TCPDisconnect(peerAddress); } + + return CHIP_NO_ERROR; } +void SessionManager::TCPDisconnect(Transport::ActiveTCPConnectionState * conn, bool shouldAbort) +{ + if (mTransportMgr != nullptr && conn != nullptr) + { + char peerAddrBuf[chip::Transport::PeerAddress::kMaxToStringSize]; + conn->mPeerAddr.ToString(peerAddrBuf); + ChipLogProgress(Inet, "Disconnecting TCP connection from peer at %s.", peerAddrBuf); + mTransportMgr->TCPDisconnect(conn, shouldAbort); + } +} +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + void SessionManager::UnauthenticatedMessageDispatch(const PacketHeader & partialPacketHeader, - const Transport::PeerAddress & peerAddress, System::PacketBufferHandle && msg) + const Transport::PeerAddress & peerAddress, System::PacketBufferHandle && msg, + Transport::MessageTransportContext * ctxt) { MATTER_TRACE_SCOPE("Unauthenticated Message Dispatch", "SessionManager"); +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + if (peerAddress.GetTransportType() == Transport::Type::kTcp && ctxt->conn == nullptr) + { + ChipLogError(Inet, "Connection object is missing for received message."); + return; + } +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + // Drop unsecured messages with privacy enabled. if (partialPacketHeader.HasPrivacyFlag()) { @@ -660,7 +797,7 @@ void SessionManager::UnauthenticatedMessageDispatch(const PacketHeader & partial if (source.HasValue()) { // Assume peer is the initiator, we are the responder. - optionalSession = mUnauthenticatedSessions.FindOrAllocateResponder(source.Value(), GetDefaultMRPConfig()); + optionalSession = mUnauthenticatedSessions.FindOrAllocateResponder(source.Value(), GetDefaultMRPConfig(), peerAddress); if (!optionalSession.HasValue()) { ChipLogError(Inet, "UnauthenticatedSession exhausted"); @@ -670,7 +807,7 @@ void SessionManager::UnauthenticatedMessageDispatch(const PacketHeader & partial else { // Assume peer is the responder, we are the initiator. - optionalSession = mUnauthenticatedSessions.FindInitiator(destination.Value()); + optionalSession = mUnauthenticatedSessions.FindInitiator(destination.Value(), peerAddress); if (!optionalSession.HasValue()) { ChipLogProgress(Inet, "Received unknown unsecure packet for initiator 0x" ChipLogFormatX64, @@ -685,6 +822,25 @@ void SessionManager::UnauthenticatedMessageDispatch(const PacketHeader & partial CorrectPeerAddressInterfaceID(mutablePeerAddress); unsecuredSession->SetPeerAddress(mutablePeerAddress); SessionMessageDelegate::DuplicateMessage isDuplicate = SessionMessageDelegate::DuplicateMessage::No; +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + // Associate the unauthenticated session with the connection, if not done already. + if (peerAddress.GetTransportType() == Transport::Type::kTcp) + { + Transport::ActiveTCPConnectionState * sessionConn = unsecuredSession->GetTCPConnection(); + if (sessionConn == nullptr) + { + unsecuredSession->SetTCPConnection(ctxt->conn); + } + else + { + if (sessionConn != ctxt->conn) + { + ChipLogError(Inet, "Data received over wrong connection %p. Dropping it!", ctxt->conn); + return; + } + } + } +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT unsecuredSession->MarkActiveRx(); @@ -723,13 +879,55 @@ void SessionManager::UnauthenticatedMessageDispatch(const PacketHeader & partial } void SessionManager::SecureUnicastMessageDispatch(const PacketHeader & partialPacketHeader, - const Transport::PeerAddress & peerAddress, System::PacketBufferHandle && msg) + const Transport::PeerAddress & peerAddress, System::PacketBufferHandle && msg, + Transport::MessageTransportContext * ctxt) { MATTER_TRACE_SCOPE("Secure Unicast Message Dispatch", "SessionManager"); CHIP_ERROR err = CHIP_NO_ERROR; +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + if (peerAddress.GetTransportType() == Transport::Type::kTcp && ctxt->conn == nullptr) + { + ChipLogError(Inet, "Connection object is missing for received message."); + return; + } +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + Optional<SessionHandle> session = mSecureSessions.FindSecureSessionByLocalKey(partialPacketHeader.GetSessionId()); + if (!session.HasValue()) + { + ChipLogError(Inet, "Data received on an unknown session (LSID=%d). Dropping it!", partialPacketHeader.GetSessionId()); + return; + } + + Transport::SecureSession * secureSession = session.Value()->AsSecureSession(); + Transport::PeerAddress mutablePeerAddress = peerAddress; + CorrectPeerAddressInterfaceID(mutablePeerAddress); + if (secureSession->GetPeerAddress() != mutablePeerAddress) + { + secureSession->SetPeerAddress(mutablePeerAddress); + } + +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + // Associate the secure session with the connection, if not done already. + if (peerAddress.GetTransportType() == Transport::Type::kTcp) + { + Transport::ActiveTCPConnectionState * sessionConn = secureSession->GetTCPConnection(); + if (sessionConn == nullptr) + { + secureSession->SetTCPConnection(ctxt->conn); + } + else + { + if (sessionConn != ctxt->conn) + { + ChipLogError(Inet, "Data received over wrong connection %p. Dropping it!", ctxt->conn); + return; + } + } + } +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT PayloadHeader payloadHeader; @@ -751,14 +949,6 @@ void SessionManager::SecureUnicastMessageDispatch(const PacketHeader & partialPa return; } - if (!session.HasValue()) - { - ChipLogError(Inet, "Data received on an unknown session (LSID=%d). Dropping it!", packetHeader.GetSessionId()); - return; - } - - Transport::SecureSession * secureSession = session.Value()->AsSecureSession(); - // We need to allow through messages even on sessions that are pending // evictions, because for some cases (UpdateNOC, RemoveFabric, etc) there // can be a single exchange alive on the session waiting for a MRP ack, and @@ -816,13 +1006,6 @@ void SessionManager::SecureUnicastMessageDispatch(const PacketHeader & partialPa secureSession->GetSessionMessageCounter().GetPeerMessageCounter().CommitEncryptedUnicast(packetHeader.GetMessageCounter()); } - Transport::PeerAddress mutablePeerAddress = peerAddress; - CorrectPeerAddressInterfaceID(mutablePeerAddress); - if (secureSession->GetPeerAddress() != mutablePeerAddress) - { - secureSession->SetPeerAddress(mutablePeerAddress); - } - if (mCB != nullptr) { MATTER_LOG_MESSAGE_RECEIVED(chip::Tracing::IncomingMessageType::kSecureUnicast, &payloadHeader, &packetHeader, @@ -1057,27 +1240,69 @@ void SessionManager::SecureGroupMessageDispatch(const PacketHeader & partialPack } Optional<SessionHandle> SessionManager::FindSecureSessionForNode(ScopedNodeId peerNodeId, - const Optional<Transport::SecureSession::Type> & type) + const Optional<Transport::SecureSession::Type> & type, + TransportPayloadCapability transportPayloadCapability) { - SecureSession * found = nullptr; - - mSecureSessions.ForEachSession([&peerNodeId, &type, &found](auto session) { + SecureSession * mrpSession = nullptr; +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + SecureSession * tcpSession = nullptr; +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + + mSecureSessions.ForEachSession([&peerNodeId, &type, &mrpSession, +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + &tcpSession, +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + &transportPayloadCapability](auto session) { if (session->IsActiveSession() && session->GetPeer() == peerNodeId && (!type.HasValue() || type.Value() == session->GetSecureSessionType())) { - // - // Select the active session with the most recent activity to return back to the caller. - // - if ((found == nullptr) || (found->GetLastActivityTime() < session->GetLastActivityTime())) +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + if ((transportPayloadCapability == TransportPayloadCapability::kMRPOrTCPCompatiblePayload || + transportPayloadCapability == TransportPayloadCapability::kLargePayload) && + session->GetTCPConnection() != nullptr) { - found = session; + // Set up a TCP transport based session as standby + if ((tcpSession == nullptr) || (tcpSession->GetLastActivityTime() < session->GetLastActivityTime())) + { + tcpSession = session; + } + } +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + + if ((mrpSession == nullptr) || (mrpSession->GetLastActivityTime() < session->GetLastActivityTime())) + { + mrpSession = session; } } return Loop::Continue; }); - return found != nullptr ? MakeOptional<SessionHandle>(*found) : Optional<SessionHandle>::Missing(); +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + if (transportPayloadCapability == TransportPayloadCapability::kLargePayload) + { + return tcpSession != nullptr ? MakeOptional<SessionHandle>(*tcpSession) : Optional<SessionHandle>::Missing(); + } + + if (transportPayloadCapability == TransportPayloadCapability::kMRPOrTCPCompatiblePayload) + { + // If MRP-based session is available, use it. + if (mrpSession != nullptr) + { + return MakeOptional<SessionHandle>(*mrpSession); + } + + // Otherwise, look for a tcp-based session + if (tcpSession != nullptr) + { + return MakeOptional<SessionHandle>(*tcpSession); + } + + return Optional<SessionHandle>::Missing(); + } +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + + return mrpSession != nullptr ? MakeOptional<SessionHandle>(*mrpSession) : Optional<SessionHandle>::Missing(); } /** diff --git a/src/transport/SessionManager.h b/src/transport/SessionManager.h index 5f2e6f7603cad0..b7a1630b3d2851 100644 --- a/src/transport/SessionManager.h +++ b/src/transport/SessionManager.h @@ -52,8 +52,30 @@ #include <transport/raw/PeerAddress.h> #include <transport/raw/Tuple.h> +#if INET_CONFIG_ENABLE_TCP_ENDPOINT +#include <transport/SessionConnectionDelegate.h> +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + namespace chip { +/* + * This enum indicates whether a session needs to be established over a + * suitable transport that meets certain payload size requirements for + * transmitted messages. + * + */ +enum class TransportPayloadCapability : uint8_t +{ + kMRPPayload, // Transport requires the maximum payload size to fit within a single + // IPv6 packet(1280 bytes). + kLargePayload, // Transport needs to handle payloads larger than the single IPv6 + // packet, as supported by MRP. The transport of choice, in this + // case, is TCP. + kMRPOrTCPCompatiblePayload // This option provides the ability to use MRP + // as the preferred transport, but use a large + // payload transport if that is already + // available. +}; /** * @brief * Tracks ownership of a encrypted packet buffer. @@ -151,6 +173,10 @@ class DLL_EXPORT SessionManager : public TransportMgrDelegate, public FabricTabl /// ExchangeManager) void SetMessageDelegate(SessionMessageDelegate * cb) { mCB = cb; } +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + void SetConnectionDelegate(SessionConnectionDelegate * cb) { mConnDelegate = cb; } +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + // Test-only: create a session on the fly. CHIP_ERROR InjectPaseSessionWithTestKey(SessionHolder & sessionHolder, uint16_t localSessionId, NodeId peerNodeId, uint16_t peerSessionId, FabricIndex fabricIndex, @@ -413,8 +439,34 @@ class DLL_EXPORT SessionManager : public TransportMgrDelegate, public FabricTabl * * @param source the source address of the package * @param msgBuf the buffer containing a full CHIP message (except for the optional length field). + * @param ctxt pointer to additional context on the underlying transport. For TCP, it is a pointer + * to the underlying connection object. */ - void OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msgBuf) override; + void OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msgBuf, + Transport::MessageTransportContext * ctxt = nullptr) override; + +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + CHIP_ERROR TCPConnect(const Transport::PeerAddress & peerAddress, Transport::AppTCPConnectionCallbackCtxt * appState, + Transport::ActiveTCPConnectionState ** peerConnState); + + CHIP_ERROR TCPDisconnect(const Transport::PeerAddress & peerAddress); + + void TCPDisconnect(Transport::ActiveTCPConnectionState * conn, bool shouldAbort = 0); + + void HandleConnectionReceived(Transport::ActiveTCPConnectionState * conn) override; + + void HandleConnectionAttemptComplete(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr) override; + + void HandleConnectionClosed(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr) override; + + // Functors for callbacks into higher layers + using OnTCPConnectionReceivedCallback = void (*)(Transport::ActiveTCPConnectionState * conn); + + using OnTCPConnectionCompleteCallback = void (*)(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr); + + using OnTCPConnectionClosedCallback = void (*)(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr); + +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT Optional<SessionHandle> CreateUnauthenticatedSession(const Transport::PeerAddress & peerAddress, const ReliableMessageProtocolConfig & config) @@ -436,8 +488,9 @@ class DLL_EXPORT SessionManager : public TransportMgrDelegate, public FabricTabl // is returned. Otherwise, an Optional<SessionHandle> with no value set is returned. // // - Optional<SessionHandle> FindSecureSessionForNode(ScopedNodeId peerNodeId, - const Optional<Transport::SecureSession::Type> & type = NullOptional); + Optional<SessionHandle> + FindSecureSessionForNode(ScopedNodeId peerNodeId, const Optional<Transport::SecureSession::Type> & type = NullOptional, + TransportPayloadCapability transportPayloadCapability = TransportPayloadCapability::kMRPPayload); using SessionHandleCallback = bool (*)(void * context, SessionHandle & sessionHandle); CHIP_ERROR ForEachSessionHandle(void * context, SessionHandleCallback callback); @@ -477,8 +530,22 @@ class DLL_EXPORT SessionManager : public TransportMgrDelegate, public FabricTabl State mState; // < Initialization state of the object chip::Transport::GroupOutgoingCounters mGroupClientCounter; +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + OnTCPConnectionReceivedCallback mConnReceivedCb = nullptr; + OnTCPConnectionCompleteCallback mConnCompleteCb = nullptr; + OnTCPConnectionClosedCallback mConnClosedCb = nullptr; + + // Hold the TCPConnection callback context for the receiver application in the SessionManager. + // On receipt of a connection from a peer, the SessionManager + Transport::AppTCPConnectionCallbackCtxt * mServerTCPConnCbCtxt = nullptr; +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + SessionMessageDelegate * mCB = nullptr; +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + SessionConnectionDelegate * mConnDelegate = nullptr; +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + TransportMgrBase * mTransportMgr = nullptr; Transport::MessageCounterManagerInterface * mMessageCounterManager = nullptr; @@ -491,9 +558,11 @@ class DLL_EXPORT SessionManager : public TransportMgrDelegate, public FabricTabl * If the message decrypts successfully, this will be filled with a fully decoded PacketHeader. * @param[in] peerAddress The PeerAddress of the message as provided by the receiving Transport Endpoint. * @param msg The full message buffer, including header fields. + * @param ctxt The pointer to additional context on the underlying transport. For TCP, it is a pointer + * to the underlying connection object. */ void SecureUnicastMessageDispatch(const PacketHeader & partialPacketHeader, const Transport::PeerAddress & peerAddress, - System::PacketBufferHandle && msg); + System::PacketBufferHandle && msg, Transport::MessageTransportContext * ctxt = nullptr); /** * @brief Parse, decrypt, validate, and dispatch a secure group message. @@ -511,9 +580,11 @@ class DLL_EXPORT SessionManager : public TransportMgrDelegate, public FabricTabl * @param partialPacketHeader The partial PacketHeader of the message after processing with DecodeFixed. * @param peerAddress The PeerAddress of the message as provided by the receiving Transport Endpoint. * @param msg The full message buffer, including header fields. + * @param ctxt The pointer to additional context on the underlying transport. For TCP, it is a pointer + * to the underlying connection object. */ void UnauthenticatedMessageDispatch(const PacketHeader & partialPacketHeader, const Transport::PeerAddress & peerAddress, - System::PacketBufferHandle && msg); + System::PacketBufferHandle && msg, Transport::MessageTransportContext * ctxt = nullptr); void OnReceiveError(CHIP_ERROR error, const Transport::PeerAddress & source); diff --git a/src/transport/TransportMgr.h b/src/transport/TransportMgr.h index 494db39de964fd..6e5f03ab4a44a6 100644 --- a/src/transport/TransportMgr.h +++ b/src/transport/TransportMgr.h @@ -34,6 +34,9 @@ #include <transport/raw/MessageHeader.h> #include <transport/raw/PeerAddress.h> #include <transport/raw/Tuple.h> +#if INET_CONFIG_ENABLE_TCP_ENDPOINT +#include <transport/raw/TCP.h> +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT namespace chip { @@ -49,8 +52,26 @@ class TransportMgrDelegate * * @param source the source address of the package * @param msgBuf the buffer containing a full CHIP message (except for the optional length field). + * @param ctxt the pointer to additional context on the underlying transport. For TCP, it is a pointer + * to the underlying connection object. */ - virtual void OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msgBuf) = 0; + virtual void OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msgBuf, + Transport::MessageTransportContext * ctxt = nullptr) = 0; + +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + /** + * @brief + * Handle connection attempt completion. + * + * @param conn the connection object + * @param conErr the connection error on the attempt, or CHIP_NO_ERROR. + */ + virtual void HandleConnectionAttemptComplete(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr){}; + + virtual void HandleConnectionClosed(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr){}; + + virtual void HandleConnectionReceived(Transport::ActiveTCPConnectionState * conn){}; +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT }; template <typename... TransportTypes> diff --git a/src/transport/TransportMgrBase.cpp b/src/transport/TransportMgrBase.cpp index bde54a96c195b6..98997102eb92ca 100644 --- a/src/transport/TransportMgrBase.cpp +++ b/src/transport/TransportMgrBase.cpp @@ -28,11 +28,24 @@ CHIP_ERROR TransportMgrBase::SendMessage(const Transport::PeerAddress & address, return mTransport->SendMessage(address, std::move(msgBuf)); } -void TransportMgrBase::Disconnect(const Transport::PeerAddress & address) +#if INET_CONFIG_ENABLE_TCP_ENDPOINT +CHIP_ERROR TransportMgrBase::TCPConnect(const Transport::PeerAddress & address, Transport::AppTCPConnectionCallbackCtxt * appState, + Transport::ActiveTCPConnectionState ** peerConnState) { - mTransport->Disconnect(address); + return mTransport->TCPConnect(address, appState, peerConnState); } +void TransportMgrBase::TCPDisconnect(const Transport::PeerAddress & address) +{ + mTransport->TCPDisconnect(address); +} + +void TransportMgrBase::TCPDisconnect(Transport::ActiveTCPConnectionState * conn, bool shouldAbort) +{ + mTransport->TCPDisconnect(conn, shouldAbort); +} +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + CHIP_ERROR TransportMgrBase::Init(Transport::Base * transport) { if (mTransport != nullptr) @@ -41,6 +54,7 @@ CHIP_ERROR TransportMgrBase::Init(Transport::Base * transport) } mTransport = transport; mTransport->SetDelegate(this); + ChipLogDetail(Inet, "TransportMgr initialized"); return CHIP_NO_ERROR; } @@ -56,7 +70,8 @@ CHIP_ERROR TransportMgrBase::MulticastGroupJoinLeave(const Transport::PeerAddres return mTransport->MulticastGroupJoinLeave(address, join); } -void TransportMgrBase::HandleMessageReceived(const Transport::PeerAddress & peerAddress, System::PacketBufferHandle && msg) +void TransportMgrBase::HandleMessageReceived(const Transport::PeerAddress & peerAddress, System::PacketBufferHandle && msg, + Transport::MessageTransportContext * ctxt) { // This is the first point all incoming messages funnel through. Ensure // that our message receipts are all synchronized correctly. @@ -73,7 +88,7 @@ void TransportMgrBase::HandleMessageReceived(const Transport::PeerAddress & peer if (mSessionManager != nullptr) { - mSessionManager->OnMessageReceived(peerAddress, std::move(msg)); + mSessionManager->OnMessageReceived(peerAddress, std::move(msg), ctxt); } else { @@ -83,4 +98,60 @@ void TransportMgrBase::HandleMessageReceived(const Transport::PeerAddress & peer } } +#if INET_CONFIG_ENABLE_TCP_ENDPOINT +void TransportMgrBase::HandleConnectionReceived(Transport::ActiveTCPConnectionState * conn) +{ + if (mSessionManager != nullptr) + { + mSessionManager->HandleConnectionReceived(conn); + } + else + { + Transport::TCPBase * tcp = reinterpret_cast<Transport::TCPBase *>(conn->mEndPoint->mAppState); + + // Close connection here since no upper layer is interested in the + // connection. + if (tcp) + { + tcp->TCPDisconnect(conn, /* shouldAbort = */ true); + } + } +} + +void TransportMgrBase::HandleConnectionAttemptComplete(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr) +{ + if (mSessionManager != nullptr) + { + mSessionManager->HandleConnectionAttemptComplete(conn, conErr); + } + else + { + Transport::TCPBase * tcp = reinterpret_cast<Transport::TCPBase *>(conn->mEndPoint->mAppState); + + // Close connection here since no upper layer is interested in the + // connection. + if (tcp) + { + tcp->TCPDisconnect(conn, /* shouldAbort = */ true); + } + } +} + +void TransportMgrBase::HandleConnectionClosed(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr) +{ + if (mSessionManager != nullptr) + { + mSessionManager->HandleConnectionClosed(conn, conErr); + } + else + { + Transport::TCPBase * tcp = reinterpret_cast<Transport::TCPBase *>(conn->mEndPoint->mAppState); + if (tcp) + { + tcp->TCPDisconnect(conn, /* shouldAbort = */ true); + } + } +} +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT + } // namespace chip diff --git a/src/transport/TransportMgrBase.h b/src/transport/TransportMgrBase.h index e4942ca6ecd90b..2b0f33bfb9e3a7 100644 --- a/src/transport/TransportMgrBase.h +++ b/src/transport/TransportMgrBase.h @@ -21,6 +21,9 @@ #include <transport/raw/Base.h> #include <transport/raw/MessageHeader.h> #include <transport/raw/PeerAddress.h> +#if INET_CONFIG_ENABLE_TCP_ENDPOINT +#include <transport/raw/TCP.h> +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT namespace chip { @@ -39,13 +42,29 @@ class TransportMgrBase : public Transport::RawTransportDelegate void Close(); - void Disconnect(const Transport::PeerAddress & address); +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + CHIP_ERROR TCPConnect(const Transport::PeerAddress & address, Transport::AppTCPConnectionCallbackCtxt * appState, + Transport::ActiveTCPConnectionState ** peerConnState); + + void TCPDisconnect(const Transport::PeerAddress & address); + + void TCPDisconnect(Transport::ActiveTCPConnectionState * conn, bool shouldAbort = 0); + + void HandleConnectionReceived(Transport::ActiveTCPConnectionState * conn) override; + + void HandleConnectionAttemptComplete(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr) override; + + void HandleConnectionClosed(Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr) override; +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT void SetSessionManager(TransportMgrDelegate * sessionManager) { mSessionManager = sessionManager; } + TransportMgrDelegate * GetSessionManager() { return mSessionManager; }; + CHIP_ERROR MulticastGroupJoinLeave(const Transport::PeerAddress & address, bool join); - void HandleMessageReceived(const Transport::PeerAddress & peerAddress, System::PacketBufferHandle && msg) override; + void HandleMessageReceived(const Transport::PeerAddress & peerAddress, System::PacketBufferHandle && msg, + Transport::MessageTransportContext * ctxt = nullptr) override; private: TransportMgrDelegate * mSessionManager = nullptr; diff --git a/src/transport/UnauthenticatedSessionTable.h b/src/transport/UnauthenticatedSessionTable.h index 1c3ff7ed55586a..913058229e1a6b 100644 --- a/src/transport/UnauthenticatedSessionTable.h +++ b/src/transport/UnauthenticatedSessionTable.h @@ -45,9 +45,10 @@ class UnauthenticatedSession : public Session, public ReferenceCounted<Unauthent }; protected: - UnauthenticatedSession(SessionRole sessionRole, NodeId ephemeralInitiatorNodeID, const ReliableMessageProtocolConfig & config) : - mEphemeralInitiatorNodeId(ephemeralInitiatorNodeID), mSessionRole(sessionRole), - mLastActivityTime(System::SystemClock().GetMonotonicTimestamp()), + UnauthenticatedSession(SessionRole sessionRole, NodeId ephemeralInitiatorNodeID, const Transport::PeerAddress & peerAddress, + const ReliableMessageProtocolConfig & config) : + mEphemeralInitiatorNodeId(ephemeralInitiatorNodeID), + mSessionRole(sessionRole), mPeerAddress(peerAddress), mLastActivityTime(System::SystemClock().GetMonotonicTimestamp()), mLastPeerActivityTime(System::Clock::kZero), // Start at zero to default to IDLE state mRemoteSessionParams(config) {} @@ -175,9 +176,9 @@ class UnauthenticatedSessionPoolEntry : public UnauthenticatedSession { public: UnauthenticatedSessionPoolEntry(SessionRole sessionRole, NodeId ephemeralInitiatorNodeID, - const ReliableMessageProtocolConfig & config, + const Transport::PeerAddress & peerAddress, const ReliableMessageProtocolConfig & config, UnauthenticatedSessionTable<kMaxSessionCount> & sessionTable) : - UnauthenticatedSession(sessionRole, ephemeralInitiatorNodeID, config) + UnauthenticatedSession(sessionRole, ephemeralInitiatorNodeID, peerAddress, config) #if CHIP_SYSTEM_CONFIG_POOL_USE_HEAP , mSessionTable(sessionTable) @@ -224,13 +225,16 @@ class UnauthenticatedSessionTable * @return the session found or allocated, or Optional::Missing if not found and allocation failed. */ CHECK_RETURN_VALUE - Optional<SessionHandle> FindOrAllocateResponder(NodeId ephemeralInitiatorNodeID, const ReliableMessageProtocolConfig & config) + Optional<SessionHandle> FindOrAllocateResponder(NodeId ephemeralInitiatorNodeID, const ReliableMessageProtocolConfig & config, + const Transport::PeerAddress & peerAddress) { - UnauthenticatedSession * result = FindEntry(UnauthenticatedSession::SessionRole::kResponder, ephemeralInitiatorNodeID); + UnauthenticatedSession * result = + FindEntry(UnauthenticatedSession::SessionRole::kResponder, ephemeralInitiatorNodeID, peerAddress); if (result != nullptr) return MakeOptional<SessionHandle>(*result); - CHIP_ERROR err = AllocEntry(UnauthenticatedSession::SessionRole::kResponder, ephemeralInitiatorNodeID, config, result); + CHIP_ERROR err = + AllocEntry(UnauthenticatedSession::SessionRole::kResponder, ephemeralInitiatorNodeID, peerAddress, config, result); if (err == CHIP_NO_ERROR) { return MakeOptional<SessionHandle>(*result); @@ -239,9 +243,11 @@ class UnauthenticatedSessionTable return Optional<SessionHandle>::Missing(); } - CHECK_RETURN_VALUE Optional<SessionHandle> FindInitiator(NodeId ephemeralInitiatorNodeID) + CHECK_RETURN_VALUE Optional<SessionHandle> FindInitiator(NodeId ephemeralInitiatorNodeID, + const Transport::PeerAddress & peerAddress) { - UnauthenticatedSession * result = FindEntry(UnauthenticatedSession::SessionRole::kInitiator, ephemeralInitiatorNodeID); + UnauthenticatedSession * result = + FindEntry(UnauthenticatedSession::SessionRole::kInitiator, ephemeralInitiatorNodeID, peerAddress); if (result != nullptr) { return MakeOptional<SessionHandle>(*result); @@ -254,7 +260,8 @@ class UnauthenticatedSessionTable const ReliableMessageProtocolConfig & config) { UnauthenticatedSession * result = nullptr; - CHIP_ERROR err = AllocEntry(UnauthenticatedSession::SessionRole::kInitiator, ephemeralInitiatorNodeID, config, result); + CHIP_ERROR err = + AllocEntry(UnauthenticatedSession::SessionRole::kInitiator, ephemeralInitiatorNodeID, peerAddress, config, result); if (err == CHIP_NO_ERROR) { result->SetPeerAddress(peerAddress); @@ -276,9 +283,10 @@ class UnauthenticatedSessionTable */ CHECK_RETURN_VALUE CHIP_ERROR AllocEntry(UnauthenticatedSession::SessionRole sessionRole, NodeId ephemeralInitiatorNodeID, - const ReliableMessageProtocolConfig & config, UnauthenticatedSession *& entry) + const PeerAddress & peerAddress, const ReliableMessageProtocolConfig & config, + UnauthenticatedSession *& entry) { - auto entryToUse = mEntries.CreateObject(sessionRole, ephemeralInitiatorNodeID, config, *this); + auto entryToUse = mEntries.CreateObject(sessionRole, ephemeralInitiatorNodeID, peerAddress, config, *this); if (entryToUse != nullptr) { entry = entryToUse; @@ -294,7 +302,7 @@ class UnauthenticatedSessionTable // Drop the least recent entry to allow for a new alloc. mEntries.ReleaseObject(entryToUse); - entryToUse = mEntries.CreateObject(sessionRole, ephemeralInitiatorNodeID, config, *this); + entryToUse = mEntries.CreateObject(sessionRole, ephemeralInitiatorNodeID, peerAddress, config, *this); if (entryToUse == nullptr) { @@ -308,11 +316,13 @@ class UnauthenticatedSessionTable } CHECK_RETURN_VALUE UnauthenticatedSession * FindEntry(UnauthenticatedSession::SessionRole sessionRole, - NodeId ephemeralInitiatorNodeID) + NodeId ephemeralInitiatorNodeID, + const Transport::PeerAddress & peerAddress) { UnauthenticatedSession * result = nullptr; mEntries.ForEachActiveObject([&](UnauthenticatedSession * entry) { - if (entry->GetSessionRole() == sessionRole && entry->GetEphemeralInitiatorNodeID() == ephemeralInitiatorNodeID) + if (entry->GetSessionRole() == sessionRole && entry->GetEphemeralInitiatorNodeID() == ephemeralInitiatorNodeID && + entry->GetPeerAddress().GetTransportType() == peerAddress.GetTransportType()) { result = entry; return Loop::Break; diff --git a/src/transport/raw/ActiveTCPConnectionState.h b/src/transport/raw/ActiveTCPConnectionState.h new file mode 100644 index 00000000000000..0f53d4479e9300 --- /dev/null +++ b/src/transport/raw/ActiveTCPConnectionState.h @@ -0,0 +1,125 @@ +/* + * + * 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. + */ + +/** + * @file + * This file defines the CHIP Active Connection object that maintains TCP connections. + */ + +#pragma once + +#include <inet/IPAddress.h> +#include <inet/InetInterface.h> +#include <inet/TCPEndPoint.h> +#include <lib/core/CHIPCore.h> +#include <transport/raw/PeerAddress.h> +#include <transport/raw/TCPConfig.h> + +namespace chip { +namespace Transport { + +/** + * The State of the TCP connection + */ +enum class TCPState +{ + kNotReady = 0, /**< State before initialization. */ + kInitialized = 1, /**< State after class is listening and ready. */ + kConnecting = 3, /**< Connection with peer has been initiated. */ + kConnected = 4, /**< Connected with peer and ready for Send/Receive. */ + kClosed = 5, /**< Connection is closed. */ +}; + +struct AppTCPConnectionCallbackCtxt; +/** + * State for each active TCP connection + */ +struct ActiveTCPConnectionState +{ + + void Init(Inet::TCPEndPoint * endPoint, const PeerAddress & peerAddr) + { + mEndPoint = endPoint; + mPeerAddr = peerAddr; + mReceived = nullptr; + mAppState = nullptr; + } + + void Free() + { + mEndPoint->Free(); + mPeerAddr = PeerAddress::Uninitialized(); + mEndPoint = nullptr; + mReceived = nullptr; + mAppState = nullptr; + } + + bool InUse() const { return mEndPoint != nullptr; } + + bool IsConnected() const { return (mEndPoint != nullptr && mConnectionState == TCPState::kConnected); } + + bool IsConnecting() const { return (mEndPoint != nullptr && mConnectionState == TCPState::kConnecting); } + + // Associated endpoint. + Inet::TCPEndPoint * mEndPoint; + + // Peer Node Address + PeerAddress mPeerAddr; + + // Buffers received but not yet consumed. + System::PacketBufferHandle mReceived; + + // Current state of the connection + TCPState mConnectionState; + + // A pointer to an application-specific state object. It should + // represent an object that is at a layer above the SessionManager. The + // SessionManager would accept this object at the time of connecting to + // the peer, and percolate it down to the TransportManager that then, + // should store this state in the corresponding connection object that + // is created. + // At various connection events, this state is passed back to the + // corresponding application. + AppTCPConnectionCallbackCtxt * mAppState = nullptr; + + // KeepAlive interval in seconds + uint16_t mTCPKeepAliveIntervalSecs = CHIP_CONFIG_TCP_KEEPALIVE_INTERVAL_SECS; + uint16_t mTCPMaxNumKeepAliveProbes = CHIP_CONFIG_MAX_TCP_KEEPALIVE_PROBES; +}; + +// Functors for callbacks into higher layers +using OnTCPConnectionReceivedCallback = void (*)(ActiveTCPConnectionState * conn); + +using OnTCPConnectionCompleteCallback = void (*)(ActiveTCPConnectionState * conn, CHIP_ERROR conErr); + +using OnTCPConnectionClosedCallback = void (*)(ActiveTCPConnectionState * conn, CHIP_ERROR conErr); + +/* + * Application callback state that is passed down at connection establishment + * stage. + * */ +struct AppTCPConnectionCallbackCtxt +{ + void * appContext = nullptr; // A pointer to an application context object. + OnTCPConnectionReceivedCallback connReceivedCb = nullptr; + OnTCPConnectionCompleteCallback connCompleteCb = nullptr; + OnTCPConnectionClosedCallback connClosedCb = nullptr; +}; + +} // namespace Transport +} // namespace chip diff --git a/src/transport/raw/BUILD.gn b/src/transport/raw/BUILD.gn index 736b16cdb08477..3e8d3d4761dca3 100644 --- a/src/transport/raw/BUILD.gn +++ b/src/transport/raw/BUILD.gn @@ -14,6 +14,7 @@ import("//build_overrides/chip.gni") import("${chip_root}/src/ble/ble.gni") +import("${chip_root}/src/inet/inet.gni") static_library("raw") { output_name = "libRawTransport" @@ -23,13 +24,20 @@ static_library("raw") { "MessageHeader.cpp", "MessageHeader.h", "PeerAddress.h", - "TCP.cpp", - "TCP.h", "Tuple.h", "UDP.cpp", "UDP.h", ] + if (chip_inet_config_enable_tcp_endpoint) { + sources += [ + "ActiveTCPConnectionState.h", + "TCP.cpp", + "TCP.h", + "TCPConfig.h", + ] + } + if (chip_config_network_layer_ble) { sources += [ "BLE.cpp", diff --git a/src/transport/raw/Base.h b/src/transport/raw/Base.h index 66c01a5fcc3d5d..920f932b82be41 100644 --- a/src/transport/raw/Base.h +++ b/src/transport/raw/Base.h @@ -24,20 +24,38 @@ #pragma once #include <inet/IPAddress.h> +#include <inet/TCPEndPoint.h> #include <inet/UDPEndPoint.h> #include <lib/core/CHIPError.h> #include <system/SystemPacketBuffer.h> #include <transport/raw/MessageHeader.h> #include <transport/raw/PeerAddress.h> +#if INET_CONFIG_ENABLE_TCP_ENDPOINT +#include <transport/raw/ActiveTCPConnectionState.h> +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT namespace chip { namespace Transport { +struct MessageTransportContext +{ +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + ActiveTCPConnectionState * conn = nullptr; +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT +}; + class RawTransportDelegate { public: virtual ~RawTransportDelegate() {} - virtual void HandleMessageReceived(const Transport::PeerAddress & peerAddress, System::PacketBufferHandle && msg) = 0; + virtual void HandleMessageReceived(const Transport::PeerAddress & peerAddress, System::PacketBufferHandle && msg, + MessageTransportContext * ctxt = nullptr) = 0; + +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + virtual void HandleConnectionReceived(ActiveTCPConnectionState * conn){}; + virtual void HandleConnectionAttemptComplete(ActiveTCPConnectionState * conn, CHIP_ERROR conErr){}; + virtual void HandleConnectionClosed(ActiveTCPConnectionState * conn, CHIP_ERROR conErr){}; +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT }; /** @@ -77,10 +95,26 @@ class Base */ virtual bool CanListenMulticast() { return false; } +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + /** + * Connect to the specified peer. + */ + virtual CHIP_ERROR TCPConnect(const PeerAddress & address, Transport::AppTCPConnectionCallbackCtxt * appState, + Transport::ActiveTCPConnectionState ** peerConnState) + { + return CHIP_NO_ERROR; + } + /** * Handle disconnection from the specified peer if currently connected to it. */ - virtual void Disconnect(const PeerAddress & address) {} + virtual void TCPDisconnect(const PeerAddress & address) {} + + /** + * Disconnect on the active connection that is passed in. + */ + virtual void TCPDisconnect(Transport::ActiveTCPConnectionState * conn, bool shouldAbort = 0) {} +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT /** * Enable Listening for multicast messages ( IPV6 UDP only) @@ -97,12 +131,31 @@ class Base * Method used by subclasses to notify that a packet has been received after * any associated headers have been decoded. */ - void HandleMessageReceived(const PeerAddress & source, System::PacketBufferHandle && buffer) + void HandleMessageReceived(const PeerAddress & source, System::PacketBufferHandle && buffer, + MessageTransportContext * ctxt = nullptr) + { + mDelegate->HandleMessageReceived(source, std::move(buffer), ctxt); + } + +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + // Handle an incoming connection request from a peer. + void HandleConnectionReceived(ActiveTCPConnectionState * conn) { mDelegate->HandleConnectionReceived(conn); } + + // Callback during connection establishment to notify of success or any + // error. + void HandleConnectionAttemptComplete(ActiveTCPConnectionState * conn, CHIP_ERROR conErr) + { + mDelegate->HandleConnectionAttemptComplete(conn, conErr); + } + + // Callback to notify the higher layer of an unexpected connection closure. + void HandleConnectionClosed(ActiveTCPConnectionState * conn, CHIP_ERROR conErr) { - mDelegate->HandleMessageReceived(source, std::move(buffer)); + mDelegate->HandleConnectionClosed(conn, conErr); } +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT - RawTransportDelegate * mDelegate; + RawTransportDelegate * mDelegate = nullptr; }; } // namespace Transport diff --git a/src/transport/raw/TCP.cpp b/src/transport/raw/TCP.cpp index a1b1df1fe45a2d..e33590a63a6fdf 100644 --- a/src/transport/raw/TCP.cpp +++ b/src/transport/raw/TCP.cpp @@ -67,8 +67,7 @@ void TCPBase::CloseActiveConnections() { if (mActiveConnections[i].InUse()) { - mActiveConnections[i].Free(); - mUsedEndPointCount--; + CloseConnectionInternal(&mActiveConnections[i], CHIP_NO_ERROR, SuppressCallback::Yes); } } } @@ -77,7 +76,7 @@ CHIP_ERROR TCPBase::Init(TcpListenParameters & params) { CHIP_ERROR err = CHIP_NO_ERROR; - VerifyOrExit(mState == State::kNotReady, err = CHIP_ERROR_INCORRECT_STATE); + VerifyOrExit(mState == TCPState::kNotReady, err = CHIP_ERROR_INCORRECT_STATE); #if INET_CONFIG_ENABLE_TCP_ENDPOINT err = params.GetEndPointManager()->NewEndPoint(&mListenSocket); @@ -90,23 +89,21 @@ CHIP_ERROR TCPBase::Init(TcpListenParameters & params) params.GetInterfaceId().IsPresent()); SuccessOrExit(err); + mListenSocket->mAppState = reinterpret_cast<void *>(this); + mListenSocket->OnConnectionReceived = HandleIncomingConnection; + mListenSocket->OnAcceptError = HandleAcceptError; + + mEndpointType = params.GetAddressType(); + err = mListenSocket->Listen(kListenBacklogSize); SuccessOrExit(err); - mListenSocket->mAppState = reinterpret_cast<void *>(this); - mListenSocket->OnDataReceived = OnTcpReceive; - mListenSocket->OnConnectComplete = OnConnectionComplete; - mListenSocket->OnConnectionClosed = OnConnectionClosed; - mListenSocket->OnConnectionReceived = OnConnectionReceived; - mListenSocket->OnAcceptError = OnAcceptError; - mEndpointType = params.GetAddressType(); - - mState = State::kInitialized; + mState = TCPState::kInitialized; exit: if (err != CHIP_NO_ERROR) { - ChipLogError(Inet, "Failed to initialize TCP transport: %s", ErrorStr(err)); + ChipLogError(Inet, "Failed to initialize TCP transport: %" CHIP_ERROR_FORMAT, err.Format()); if (mListenSocket) { mListenSocket->Free(); @@ -124,10 +121,24 @@ void TCPBase::Close() mListenSocket->Free(); mListenSocket = nullptr; } - mState = State::kNotReady; + mState = TCPState::kNotReady; +} + +ActiveTCPConnectionState * TCPBase::AllocateConnection() +{ + for (size_t i = 0; i < mActiveConnectionsSize; i++) + { + if (!mActiveConnections[i].InUse()) + { + return &mActiveConnections[i]; + } + } + + return nullptr; } -TCPBase::ActiveConnectionState * TCPBase::FindActiveConnection(const PeerAddress & address) +// Find an ActiveTCPConnectionState corresponding to a peer address +ActiveTCPConnectionState * TCPBase::FindActiveConnection(const PeerAddress & address) { if (address.GetTransportType() != Type::kTcp) { @@ -136,7 +147,7 @@ TCPBase::ActiveConnectionState * TCPBase::FindActiveConnection(const PeerAddress for (size_t i = 0; i < mActiveConnectionsSize; i++) { - if (!mActiveConnections[i].InUse()) + if (!mActiveConnections[i].IsConnected()) { continue; } @@ -153,8 +164,26 @@ TCPBase::ActiveConnectionState * TCPBase::FindActiveConnection(const PeerAddress return nullptr; } -TCPBase::ActiveConnectionState * TCPBase::FindActiveConnection(const Inet::TCPEndPoint * endPoint) +// Find the ActiveTCPConnectionState for a given TCPEndPoint +ActiveTCPConnectionState * TCPBase::FindActiveConnection(const Inet::TCPEndPoint * endPoint) { + for (size_t i = 0; i < mActiveConnectionsSize; i++) + { + if (mActiveConnections[i].mEndPoint == endPoint && mActiveConnections[i].IsConnected()) + { + return &mActiveConnections[i]; + } + } + return nullptr; +} + +ActiveTCPConnectionState * TCPBase::FindInUseConnection(const Inet::TCPEndPoint * endPoint) +{ + if (endPoint == nullptr) + { + return nullptr; + } + for (size_t i = 0; i < mActiveConnectionsSize; i++) { if (mActiveConnections[i].mEndPoint == endPoint) @@ -172,7 +201,7 @@ CHIP_ERROR TCPBase::SendMessage(const Transport::PeerAddress & address, System:: // - actual data VerifyOrReturnError(address.GetTransportType() == Type::kTcp, CHIP_ERROR_INVALID_ARGUMENT); - VerifyOrReturnError(mState == State::kInitialized, CHIP_ERROR_INCORRECT_STATE); + VerifyOrReturnError(mState == TCPState::kInitialized, CHIP_ERROR_INCORRECT_STATE); VerifyOrReturnError(kPacketSizeBytes + msgBuf->DataLength() <= std::numeric_limits<uint16_t>::max(), CHIP_ERROR_INVALID_ARGUMENT); @@ -186,7 +215,7 @@ CHIP_ERROR TCPBase::SendMessage(const Transport::PeerAddress & address, System:: // Reuse existing connection if one exists, otherwise a new one // will be established - ActiveConnectionState * connection = FindActiveConnection(address); + ActiveTCPConnectionState * connection = FindActiveConnection(address); if (connection != nullptr) { @@ -196,8 +225,46 @@ CHIP_ERROR TCPBase::SendMessage(const Transport::PeerAddress & address, System:: return SendAfterConnect(address, std::move(msgBuf)); } +CHIP_ERROR TCPBase::StartConnect(const PeerAddress & addr, Transport::AppTCPConnectionCallbackCtxt * appState, + Transport::ActiveTCPConnectionState ** outPeerConnState) +{ +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + ActiveTCPConnectionState * activeConnection = nullptr; + Inet::TCPEndPoint * endPoint = nullptr; + *outPeerConnState = nullptr; + ReturnErrorOnFailure(mListenSocket->GetEndPointManager().NewEndPoint(&endPoint)); + + auto EndPointDeletor = [](Inet::TCPEndPoint * e) { e->Free(); }; + std::unique_ptr<Inet::TCPEndPoint, decltype(EndPointDeletor)> endPointHolder(endPoint, EndPointDeletor); + + endPoint->mAppState = reinterpret_cast<void *>(this); + endPoint->OnConnectComplete = HandleTCPEndPointConnectComplete; + endPoint->SetConnectTimeout(mConnectTimeout); + + activeConnection = AllocateConnection(); + VerifyOrReturnError(activeConnection != nullptr, CHIP_ERROR_NO_MEMORY); + activeConnection->Init(endPoint, addr); + activeConnection->mAppState = appState; + activeConnection->mConnectionState = TCPState::kConnecting; + // Set the return value of the peer connection state to the allocated + // connection. + *outPeerConnState = activeConnection; + + ReturnErrorOnFailure(endPoint->Connect(addr.GetIPAddress(), addr.GetPort(), addr.GetInterface())); + + mUsedEndPointCount++; + + endPointHolder.release(); + + return CHIP_NO_ERROR; +#else + return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE; +#endif +} + CHIP_ERROR TCPBase::SendAfterConnect(const PeerAddress & addr, System::PacketBufferHandle && msg) { +#if INET_CONFIG_ENABLE_TCP_ENDPOINT // This will initiate a connection to the specified peer bool alreadyConnecting = false; @@ -224,28 +291,13 @@ CHIP_ERROR TCPBase::SendAfterConnect(const PeerAddress & addr, System::PacketBuf // Ensures sufficient active connections size exist VerifyOrReturnError(mUsedEndPointCount < mActiveConnectionsSize, CHIP_ERROR_NO_MEMORY); -#if INET_CONFIG_ENABLE_TCP_ENDPOINT - Inet::TCPEndPoint * endPoint = nullptr; - ReturnErrorOnFailure(mListenSocket->GetEndPointManager().NewEndPoint(&endPoint)); - auto EndPointDeletor = [](Inet::TCPEndPoint * e) { e->Free(); }; - std::unique_ptr<Inet::TCPEndPoint, decltype(EndPointDeletor)> endPointHolder(endPoint, EndPointDeletor); - - endPoint->mAppState = reinterpret_cast<void *>(this); - endPoint->OnDataReceived = OnTcpReceive; - endPoint->OnConnectComplete = OnConnectionComplete; - endPoint->OnConnectionClosed = OnConnectionClosed; - endPoint->OnConnectionReceived = OnConnectionReceived; - endPoint->OnAcceptError = OnAcceptError; - endPoint->OnPeerClose = OnPeerClosed; - - ReturnErrorOnFailure(endPoint->Connect(addr.GetIPAddress(), addr.GetPort(), addr.GetInterface())); + Transport::ActiveTCPConnectionState * peerConnState = nullptr; + ReturnErrorOnFailure(StartConnect(addr, nullptr, &peerConnState)); // enqueue the packet once the connection succeeds VerifyOrReturnError(mPendingPackets.CreateObject(addr, std::move(msg)) != nullptr, CHIP_ERROR_NO_MEMORY); mUsedEndPointCount++; - endPointHolder.release(); - return CHIP_NO_ERROR; #else return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE; @@ -255,7 +307,7 @@ CHIP_ERROR TCPBase::SendAfterConnect(const PeerAddress & addr, System::PacketBuf CHIP_ERROR TCPBase::ProcessReceivedBuffer(Inet::TCPEndPoint * endPoint, const PeerAddress & peerAddress, System::PacketBufferHandle && buffer) { - ActiveConnectionState * state = FindActiveConnection(endPoint); + ActiveTCPConnectionState * state = FindActiveConnection(endPoint); VerifyOrReturnError(state != nullptr, CHIP_ERROR_INTERNAL); state->mReceived.AddToEnd(std::move(buffer)); @@ -275,6 +327,7 @@ CHIP_ERROR TCPBase::ProcessReceivedBuffer(Inet::TCPEndPoint * endPoint, const Pe uint16_t messageSize = LittleEndian::Get16(messageSizeBuf); if (messageSize >= kMaxMessageSize) { + // This message is too long for upper layers. return CHIP_ERROR_MESSAGE_TOO_LONG; } @@ -291,12 +344,15 @@ CHIP_ERROR TCPBase::ProcessReceivedBuffer(Inet::TCPEndPoint * endPoint, const Pe return CHIP_NO_ERROR; } -CHIP_ERROR TCPBase::ProcessSingleMessage(const PeerAddress & peerAddress, ActiveConnectionState * state, uint16_t messageSize) +CHIP_ERROR TCPBase::ProcessSingleMessage(const PeerAddress & peerAddress, ActiveTCPConnectionState * state, uint16_t messageSize) { // We enter with `state->mReceived` containing at least one full message, perhaps in a chain. // `state->mReceived->Start()` currently points to the message data. // On exit, `state->mReceived` will have had `messageSize` bytes consumed, no matter what. System::PacketBufferHandle message; + MessageTransportContext msgContext; + msgContext.conn = state; + if (state->mReceived->DataLength() == messageSize) { // In this case, the head packet buffer contains exactly the message. @@ -321,23 +377,53 @@ CHIP_ERROR TCPBase::ProcessSingleMessage(const PeerAddress & peerAddress, Active message->SetDataLength(messageSize); } - HandleMessageReceived(peerAddress, std::move(message)); + HandleMessageReceived(peerAddress, std::move(message), &msgContext); return CHIP_NO_ERROR; } -void TCPBase::ReleaseActiveConnection(Inet::TCPEndPoint * endPoint) +void TCPBase::CloseConnectionInternal(ActiveTCPConnectionState * connection, CHIP_ERROR err, SuppressCallback suppressCallback) { - for (size_t i = 0; i < mActiveConnectionsSize; i++) + TCPState prevState; + + if (connection == nullptr) { - if (mActiveConnections[i].mEndPoint == endPoint) + return; + } + + if (connection->mConnectionState != TCPState::kClosed && connection->mEndPoint) + { + if (err == CHIP_NO_ERROR) { - mActiveConnections[i].Free(); - mUsedEndPointCount--; + connection->mEndPoint->Close(); } + else + { + connection->mEndPoint->Abort(); + } + + prevState = connection->mConnectionState; + connection->mConnectionState = TCPState::kClosed; + + if (suppressCallback == SuppressCallback::No) + { + if (prevState == TCPState::kConnecting) + { + // Call upper layer connection attempt complete handler + HandleConnectionAttemptComplete(connection, err); + } + else + { + // Call upper layer connection closed handler + HandleConnectionClosed(connection, err); + } + } + + connection->Free(); + mUsedEndPointCount--; } } -CHIP_ERROR TCPBase::OnTcpReceive(Inet::TCPEndPoint * endPoint, System::PacketBufferHandle && buffer) +CHIP_ERROR TCPBase::HandleTCPEndPointDataReceived(Inet::TCPEndPoint * endPoint, System::PacketBufferHandle && buffer) { Inet::IPAddress ipAddress; uint16_t port; @@ -353,13 +439,13 @@ CHIP_ERROR TCPBase::OnTcpReceive(Inet::TCPEndPoint * endPoint, System::PacketBuf if (err != CHIP_NO_ERROR) { // Connection could need to be closed at this point - ChipLogError(Inet, "Failed to accept received TCP message: %s", ErrorStr(err)); + ChipLogError(Inet, "Failed to accept received TCP message: %" CHIP_ERROR_FORMAT, err.Format()); return CHIP_ERROR_UNEXPECTED_EVENT; } return CHIP_NO_ERROR; } -void TCPBase::OnConnectionComplete(Inet::TCPEndPoint * endPoint, CHIP_ERROR inetErr) +void TCPBase::HandleTCPEndPointConnectComplete(Inet::TCPEndPoint * endPoint, CHIP_ERROR conErr) { CHIP_ERROR err = CHIP_NO_ERROR; bool foundPendingPacket = false; @@ -367,157 +453,229 @@ void TCPBase::OnConnectionComplete(Inet::TCPEndPoint * endPoint, CHIP_ERROR inet Inet::IPAddress ipAddress; uint16_t port; Inet::InterfaceId interfaceId; + ActiveTCPConnectionState * activeConnection = nullptr; endPoint->GetPeerInfo(&ipAddress, &port); endPoint->GetInterfaceId(&interfaceId); + char addrStr[Transport::PeerAddress::kMaxToStringSize]; PeerAddress addr = PeerAddress::TCP(ipAddress, port, interfaceId); + addr.ToString(addrStr); - // Send any pending packets - tcp->mPendingPackets.ForEachActiveObject([&](PendingPacket * pending) { - if (pending->mPeerAddress == addr) + if (conErr == CHIP_NO_ERROR) + { + // Set the Data received handler when connection completes + endPoint->OnDataReceived = HandleTCPEndPointDataReceived; + endPoint->OnDataSent = nullptr; + endPoint->OnConnectionClosed = HandleTCPEndPointConnectionClosed; + + activeConnection = tcp->FindInUseConnection(endPoint); + VerifyOrDie(activeConnection != nullptr); + + // Set to Connected state + activeConnection->mConnectionState = TCPState::kConnected; + + // Disable TCP Nagle buffering by setting TCP_NODELAY socket option to true. + // This is to expedite transmission of payload data and not rely on the + // network stack's configuration of collating enough data in the TCP + // window to begin transmission. + err = endPoint->EnableNoDelay(); + if (err != CHIP_NO_ERROR) { - foundPendingPacket = true; - System::PacketBufferHandle buffer = std::move(pending->mPacketBuffer); - tcp->mPendingPackets.ReleaseObject(pending); + tcp->CloseConnectionInternal(activeConnection, err, SuppressCallback::No); + return; + } - if ((inetErr == CHIP_NO_ERROR) && (err == CHIP_NO_ERROR)) + // Send any pending packets that are queued for this connection + tcp->mPendingPackets.ForEachActiveObject([&](PendingPacket * pending) { + if (pending->mPeerAddress == addr) { - err = endPoint->Send(std::move(buffer)); + foundPendingPacket = true; + System::PacketBufferHandle buffer = std::move(pending->mPacketBuffer); + tcp->mPendingPackets.ReleaseObject(pending); + + if ((conErr == CHIP_NO_ERROR) && (err == CHIP_NO_ERROR)) + { + err = endPoint->Send(std::move(buffer)); + } } - } - return Loop::Continue; - }); + return Loop::Continue; + }); - if (err == CHIP_NO_ERROR) - { - err = inetErr; - } + // Set the TCPKeepalive configurations on the established connection + endPoint->EnableKeepAlive(activeConnection->mTCPKeepAliveIntervalSecs, activeConnection->mTCPMaxNumKeepAliveProbes); - if (!foundPendingPacket && (err == CHIP_NO_ERROR)) - { - // Force a close: new connections are only expected when a - // new buffer is being sent. - ChipLogError(Inet, "Connection accepted without pending buffers"); - err = CHIP_ERROR_CONNECTION_CLOSED_UNEXPECTEDLY; - } + ChipLogProgress(Inet, "Connection established successfully with %s.", addrStr); - // cleanup packets or mark as free - if (err != CHIP_NO_ERROR) - { - ChipLogError(Inet, "Connection complete encountered an error: %s", ErrorStr(err)); - endPoint->Free(); - tcp->mUsedEndPointCount--; + // Let higher layer/delegate know that connection is successfully + // established + tcp->HandleConnectionAttemptComplete(activeConnection, CHIP_NO_ERROR); } else { - bool connectionStored = false; - for (size_t i = 0; i < tcp->mActiveConnectionsSize; i++) - { - if (!tcp->mActiveConnections[i].InUse()) - { - tcp->mActiveConnections[i].Init(endPoint); - connectionStored = true; - break; - } - } - - // since we track end points counts, we always expect to store the - // connection. - if (!connectionStored) - { - endPoint->Free(); - ChipLogError(Inet, "Internal logic error: insufficient space to store active connection"); - } + ChipLogError(Inet, "Connection establishment with %s encountered an error: %" CHIP_ERROR_FORMAT, addrStr, err.Format()); + endPoint->Free(); + tcp->mUsedEndPointCount--; } } -void TCPBase::OnConnectionClosed(Inet::TCPEndPoint * endPoint, CHIP_ERROR err) +void TCPBase::HandleTCPEndPointConnectionClosed(Inet::TCPEndPoint * endPoint, CHIP_ERROR err) { - TCPBase * tcp = reinterpret_cast<TCPBase *>(endPoint->mAppState); + TCPBase * tcp = reinterpret_cast<TCPBase *>(endPoint->mAppState); + ActiveTCPConnectionState * activeConnection = tcp->FindInUseConnection(endPoint); - ChipLogProgress(Inet, "Connection closed."); + if (activeConnection == nullptr) + { + endPoint->Free(); + return; + } - ChipLogProgress(Inet, "Freeing closed connection."); - tcp->ReleaseActiveConnection(endPoint); + if (err == CHIP_NO_ERROR && activeConnection->IsConnected()) + { + err = CHIP_ERROR_CONNECTION_CLOSED_UNEXPECTEDLY; + } + + tcp->CloseConnectionInternal(activeConnection, err, SuppressCallback::No); } -void TCPBase::OnConnectionReceived(Inet::TCPEndPoint * listenEndPoint, Inet::TCPEndPoint * endPoint, - const Inet::IPAddress & peerAddress, uint16_t peerPort) +// Handler for incoming connection requests from peer nodes +void TCPBase::HandleIncomingConnection(Inet::TCPEndPoint * listenEndPoint, Inet::TCPEndPoint * endPoint, + const Inet::IPAddress & peerAddress, uint16_t peerPort) { - TCPBase * tcp = reinterpret_cast<TCPBase *>(listenEndPoint->mAppState); + TCPBase * tcp = reinterpret_cast<TCPBase *>(listenEndPoint->mAppState); + ActiveTCPConnectionState * activeConnection = nullptr; + Inet::InterfaceId interfaceId; + Inet::IPAddress ipAddress; + uint16_t port; + + endPoint->GetPeerInfo(&ipAddress, &port); + endPoint->GetInterfaceId(&interfaceId); + PeerAddress addr = PeerAddress::TCP(ipAddress, port, interfaceId); if (tcp->mUsedEndPointCount < tcp->mActiveConnectionsSize) { - // have space to use one more (even if considering pending connections) - for (size_t i = 0; i < tcp->mActiveConnectionsSize; i++) - { - if (!tcp->mActiveConnections[i].InUse()) - { - tcp->mActiveConnections[i].Init(endPoint); - tcp->mUsedEndPointCount++; - break; - } - } + activeConnection = tcp->AllocateConnection(); + + endPoint->mAppState = listenEndPoint->mAppState; + endPoint->OnDataReceived = HandleTCPEndPointDataReceived; + endPoint->OnDataSent = nullptr; + endPoint->OnConnectionClosed = HandleTCPEndPointConnectionClosed; + + // By default, disable TCP Nagle buffering by setting TCP_NODELAY socket option to true + endPoint->EnableNoDelay(); - endPoint->mAppState = listenEndPoint->mAppState; - endPoint->OnDataReceived = OnTcpReceive; - endPoint->OnConnectComplete = OnConnectionComplete; - endPoint->OnConnectionClosed = OnConnectionClosed; - endPoint->OnConnectionReceived = OnConnectionReceived; - endPoint->OnAcceptError = OnAcceptError; - endPoint->OnPeerClose = OnPeerClosed; + // Update state for the active connection + activeConnection->Init(endPoint, addr); + tcp->mUsedEndPointCount++; + activeConnection->mConnectionState = TCPState::kConnected; + + char addrStr[Transport::PeerAddress::kMaxToStringSize]; + peerAddress.ToString(addrStr); + ChipLogProgress(Inet, "Incoming connection established with peer at %s.", addrStr); + + // Call the upper layer handler for incoming connection received. + tcp->HandleConnectionReceived(activeConnection); } else { - ChipLogError(Inet, "Insufficient connection space to accept new connections"); + ChipLogError(Inet, "Insufficient connection space to accept new connections."); endPoint->Free(); + listenEndPoint->OnAcceptError(endPoint, CHIP_ERROR_TOO_MANY_CONNECTIONS); } } -void TCPBase::OnAcceptError(Inet::TCPEndPoint * endPoint, CHIP_ERROR err) +void TCPBase::HandleAcceptError(Inet::TCPEndPoint * endPoint, CHIP_ERROR err) +{ + endPoint->Free(); + ChipLogError(Inet, "Accept error: %" CHIP_ERROR_FORMAT, err.Format()); +} + +CHIP_ERROR TCPBase::TCPConnect(const PeerAddress & address, Transport::AppTCPConnectionCallbackCtxt * appState, + Transport::ActiveTCPConnectionState ** outPeerConnState) { - ChipLogError(Inet, "Accept error: %s", ErrorStr(err)); + VerifyOrReturnError(mState == TCPState::kInitialized, CHIP_ERROR_INCORRECT_STATE); + + // Verify that PeerAddress AddressType is TCP + VerifyOrReturnError(address.GetTransportType() == Transport::Type::kTcp, CHIP_ERROR_INVALID_ARGUMENT); + + VerifyOrReturnError(mUsedEndPointCount < mActiveConnectionsSize, CHIP_ERROR_NO_MEMORY); + + char addrStr[Transport::PeerAddress::kMaxToStringSize]; + address.ToString(addrStr); + ChipLogProgress(Inet, "Connecting to peer %s.", addrStr); + + ReturnErrorOnFailure(StartConnect(address, appState, outPeerConnState)); + + return CHIP_NO_ERROR; } -void TCPBase::Disconnect(const PeerAddress & address) +void TCPBase::TCPDisconnect(const PeerAddress & address) { + CHIP_ERROR err = CHIP_NO_ERROR; // Closes an existing connection for (size_t i = 0; i < mActiveConnectionsSize; i++) { - if (mActiveConnections[i].InUse()) + if (mActiveConnections[i].IsConnected()) { Inet::IPAddress ipAddress; uint16_t port; Inet::InterfaceId interfaceId; - mActiveConnections[i].mEndPoint->GetPeerInfo(&ipAddress, &port); - mActiveConnections[i].mEndPoint->GetInterfaceId(&interfaceId); - if (address == PeerAddress::TCP(ipAddress, port, interfaceId)) + err = mActiveConnections[i].mEndPoint->GetPeerInfo(&ipAddress, &port); + if (err != CHIP_NO_ERROR) + { + ChipLogError(Inet, "TCPDisconnect: GetPeerInfo error: %" CHIP_ERROR_FORMAT, err.Format()); + return; + } + + err = mActiveConnections[i].mEndPoint->GetInterfaceId(&interfaceId); + if (err != CHIP_NO_ERROR) + { + ChipLogError(Inet, "TCPDisconnect: GetInterfaceId error: %" CHIP_ERROR_FORMAT, err.Format()); + return; + } + // if (address == PeerAddress::TCP(ipAddress, port, interfaceId)) + if (ipAddress == address.GetIPAddress() && port == address.GetPort()) { + char addrStr[Transport::PeerAddress::kMaxToStringSize]; + address.ToString(addrStr); + ChipLogProgress(Inet, "Disconnecting with peer %s.", addrStr); + // NOTE: this leaves the socket in TIME_WAIT. // Calling Abort() would clean it since SO_LINGER would be set to 0, // however this seems not to be useful. - mActiveConnections[i].Free(); - mUsedEndPointCount--; + CloseConnectionInternal(&mActiveConnections[i], CHIP_NO_ERROR, SuppressCallback::Yes); } } } } -void TCPBase::OnPeerClosed(Inet::TCPEndPoint * endPoint) +void TCPBase::TCPDisconnect(Transport::ActiveTCPConnectionState * conn, bool shouldAbort) { - TCPBase * tcp = reinterpret_cast<TCPBase *>(endPoint->mAppState); - ChipLogProgress(Inet, "Freeing connection: connection closed by peer"); + if (conn == nullptr) + { + ChipLogError(Inet, "Failed to Disconnect. Passed in Connection is null."); + return; + } - tcp->ReleaseActiveConnection(endPoint); + // This call should be able to disconnect the connection either when it is + // already established, or when it is being set up. + if ((conn->IsConnected() && shouldAbort) || conn->IsConnecting()) + { + CloseConnectionInternal(conn, CHIP_ERROR_CONNECTION_ABORTED, SuppressCallback::Yes); + } + + if (conn->IsConnected() && !shouldAbort) + { + CloseConnectionInternal(conn, CHIP_NO_ERROR, SuppressCallback::Yes); + } } bool TCPBase::HasActiveConnections() const { for (size_t i = 0; i < mActiveConnectionsSize; i++) { - if (mActiveConnections[i].InUse()) + if (mActiveConnections[i].IsConnected()) { return true; } diff --git a/src/transport/raw/TCP.h b/src/transport/raw/TCP.h index d9f78be1771b0f..bb4671215b96c8 100644 --- a/src/transport/raw/TCP.h +++ b/src/transport/raw/TCP.h @@ -34,7 +34,9 @@ #include <lib/core/CHIPCore.h> #include <lib/support/CodeUtils.h> #include <lib/support/PoolWrapper.h> +#include <transport/raw/ActiveTCPConnectionState.h> #include <transport/raw/Base.h> +#include <transport/raw/TCPConfig.h> namespace chip { namespace Transport { @@ -96,45 +98,23 @@ struct PendingPacket /** Implements a transport using TCP. */ class DLL_EXPORT TCPBase : public Base { - /** - * The State of the TCP connection - */ - enum class State - { - kNotReady = 0, /**< State before initialization. */ - kInitialized = 1, /**< State after class is listening and ready. */ - }; protected: - /** - * State for each active connection - */ - struct ActiveConnectionState + enum class ShouldAbort : uint8_t { - void Init(Inet::TCPEndPoint * endPoint) - { - mEndPoint = endPoint; - mReceived = nullptr; - } - - void Free() - { - mEndPoint->Free(); - mEndPoint = nullptr; - mReceived = nullptr; - } - bool InUse() const { return mEndPoint != nullptr; } - - // Associated endpoint. - Inet::TCPEndPoint * mEndPoint; + Yes, + No + }; - // Buffers received but not yet consumed. - System::PacketBufferHandle mReceived; + enum class SuppressCallback : uint8_t + { + Yes, + No }; public: using PendingPacketPoolType = PoolInterface<PendingPacket, const PeerAddress &, System::PacketBufferHandle &&>; - TCPBase(ActiveConnectionState * activeConnectionsBuffer, size_t bufferSize, PendingPacketPoolType & packetBuffers) : + TCPBase(ActiveTCPConnectionState * activeConnectionsBuffer, size_t bufferSize, PendingPacketPoolType & packetBuffers) : mActiveConnections(activeConnectionsBuffer), mActiveConnectionsSize(bufferSize), mPendingPackets(packetBuffers) { // activeConnectionsBuffer must be initialized by the caller. @@ -153,6 +133,13 @@ class DLL_EXPORT TCPBase : public Base */ CHIP_ERROR Init(TcpListenParameters & params); + /** + * Set the timeout (in milliseconds) for the node to wait for the TCP + * connection attempt to complete. + * + */ + void SetConnectTimeout(const uint32_t connTimeoutMsecs) { mConnectTimeout = connTimeoutMsecs; } + /** * Close the open endpoint without destroying the object */ @@ -160,14 +147,46 @@ class DLL_EXPORT TCPBase : public Base CHIP_ERROR SendMessage(const PeerAddress & address, System::PacketBufferHandle && msgBuf) override; - void Disconnect(const PeerAddress & address) override; + /* + * Connect to the given peerAddress over TCP. + * + * @param address The address of the peer. + * + * @param appState Context passed in by the application to be sent back + * via the connection attempt complete callback when + * connection attempt with peer completes. + * + * @param outPeerConnState Pointer to pointer to the active TCP connection state. This is + * an output parameter that is allocated by the + * transport layer and held by the caller object. + * This allows the caller object to abort the + * connection attempt if the caller object dies + * before the attempt completes. + * + */ + CHIP_ERROR TCPConnect(const PeerAddress & address, Transport::AppTCPConnectionCallbackCtxt * appState, + Transport::ActiveTCPConnectionState ** outPeerConnState) override; + + void TCPDisconnect(const PeerAddress & address) override; + + // Close an active connection (corresponding to the passed + // ActiveTCPConnectionState object) + // and release from the pool. + void TCPDisconnect(Transport::ActiveTCPConnectionState * conn, bool shouldAbort = false) override; bool CanSendToPeer(const PeerAddress & address) override { - return (mState == State::kInitialized) && (address.GetTransportType() == Type::kTcp) && + return (mState == TCPState::kInitialized) && (address.GetTransportType() == Type::kTcp) && (address.GetIPAddress().Type() == mEndpointType); } + const Optional<PeerAddress> GetConnectionPeerAddress(const Inet::TCPEndPoint * con) + { + ActiveTCPConnectionState * activeConState = FindActiveConnection(con); + + return activeConState != nullptr ? MakeOptional<PeerAddress>(activeConState->mPeerAddr) : Optional<PeerAddress>::Missing(); + } + /** * Helper method to determine if IO processing is still required for a TCP transport * before everything is cleaned up (socket closing is async, so after calling 'Close' on @@ -183,12 +202,22 @@ class DLL_EXPORT TCPBase : public Base private: friend class TCPTest; + /** + * Allocate an unused connection from the pool + * + */ + ActiveTCPConnectionState * AllocateConnection(); /** * Find an active connection to the given peer or return nullptr if * no active connection exists. */ - ActiveConnectionState * FindActiveConnection(const PeerAddress & addr); - ActiveConnectionState * FindActiveConnection(const Inet::TCPEndPoint * endPoint); + ActiveTCPConnectionState * FindActiveConnection(const PeerAddress & addr); + ActiveTCPConnectionState * FindActiveConnection(const Inet::TCPEndPoint * endPoint); + + /** + * Find an allocated connection that matches the corresponding TCPEndPoint. + */ + ActiveTCPConnectionState * FindInUseConnection(const Inet::TCPEndPoint * endPoint); /** * Sends the specified message once a connection has been established. @@ -223,46 +252,63 @@ class DLL_EXPORT TCPBase : public Base * is no other data). * @param[in] messageSize Size of the single message. */ - CHIP_ERROR ProcessSingleMessage(const PeerAddress & peerAddress, ActiveConnectionState * state, uint16_t messageSize); + CHIP_ERROR ProcessSingleMessage(const PeerAddress & peerAddress, ActiveTCPConnectionState * state, uint16_t messageSize); - // Release an active connection (corresponding to the passed TCPEndPoint) - // from the pool. - void ReleaseActiveConnection(Inet::TCPEndPoint * endPoint); + /** + * Initiate a connection to the given peer. On connection completion, + * HandleTCPConnectComplete callback would be called. + * + */ + CHIP_ERROR StartConnect(const PeerAddress & addr, AppTCPConnectionCallbackCtxt * appState, + Transport::ActiveTCPConnectionState ** outPeerConnState); + + /** + * Gracefully Close or Abort a given connection. + * + */ + void CloseConnectionInternal(ActiveTCPConnectionState * connection, CHIP_ERROR err, SuppressCallback suppressCallback); + + // Close the listening socket endpoint + void CloseListeningSocket(); // Callback handler for TCPEndPoint. TCP message receive handler. // @see TCPEndpoint::OnDataReceivedFunct - static CHIP_ERROR OnTcpReceive(Inet::TCPEndPoint * endPoint, System::PacketBufferHandle && buffer); + static CHIP_ERROR HandleTCPEndPointDataReceived(Inet::TCPEndPoint * endPoint, System::PacketBufferHandle && buffer); // Callback handler for TCPEndPoint. Called when a connection has been completed. // @see TCPEndpoint::OnConnectCompleteFunct - static void OnConnectionComplete(Inet::TCPEndPoint * endPoint, CHIP_ERROR err); + static void HandleTCPEndPointConnectComplete(Inet::TCPEndPoint * endPoint, CHIP_ERROR err); // Callback handler for TCPEndPoint. Called when a connection has been closed. // @see TCPEndpoint::OnConnectionClosedFunct - static void OnConnectionClosed(Inet::TCPEndPoint * endPoint, CHIP_ERROR err); - - // Callback handler for TCPEndPoint. Callend when a peer closes the connection. - // @see TCPEndpoint::OnPeerCloseFunct - static void OnPeerClosed(Inet::TCPEndPoint * endPoint); + static void HandleTCPEndPointConnectionClosed(Inet::TCPEndPoint * endPoint, CHIP_ERROR err); // Callback handler for TCPEndPoint. Called when a connection is received on the listening port. // @see TCPEndpoint::OnConnectionReceivedFunct - static void OnConnectionReceived(Inet::TCPEndPoint * listenEndPoint, Inet::TCPEndPoint * endPoint, - const Inet::IPAddress & peerAddress, uint16_t peerPort); + static void HandleIncomingConnection(Inet::TCPEndPoint * listenEndPoint, Inet::TCPEndPoint * endPoint, + const Inet::IPAddress & peerAddress, uint16_t peerPort); - // Called on accept error + // Callback handler for handling accept error // @see TCPEndpoint::OnAcceptErrorFunct - static void OnAcceptError(Inet::TCPEndPoint * endPoint, CHIP_ERROR err); + static void HandleAcceptError(Inet::TCPEndPoint * endPoint, CHIP_ERROR err); Inet::TCPEndPoint * mListenSocket = nullptr; ///< TCP socket used by the transport Inet::IPAddressType mEndpointType = Inet::IPAddressType::kUnknown; ///< Socket listening type - State mState = State::kNotReady; ///< State of the TCP transport + TCPState mState = TCPState::kNotReady; ///< State of the TCP transport + + // The configured timeout for the connection attempt to the peer, before + // giving up. + uint32_t mConnectTimeout = CHIP_CONFIG_TCP_CONNECT_TIMEOUT_MSECS; + + // The max payload size of data over a TCP connection that is transmissible + // at a time. + uint32_t mMaxTCPPayloadSize = CHIP_CONFIG_MAX_TCP_PAYLOAD_SIZE_BYTES; // Number of active and 'pending connection' endpoints size_t mUsedEndPointCount = 0; // Currently active connections - ActiveConnectionState * mActiveConnections; + ActiveTCPConnectionState * mActiveConnections; const size_t mActiveConnectionsSize; // Data to be sent when connections succeed @@ -277,14 +323,15 @@ class TCP : public TCPBase { for (size_t i = 0; i < kActiveConnectionsSize; ++i) { - mConnectionsBuffer[i].Init(nullptr); + mConnectionsBuffer[i].Init(nullptr, PeerAddress::Uninitialized()); } } + ~TCP() override { mPendingPackets.ReleaseAll(); } private: friend class TCPTest; - TCPBase::ActiveConnectionState mConnectionsBuffer[kActiveConnectionsSize]; + ActiveTCPConnectionState mConnectionsBuffer[kActiveConnectionsSize]; PoolImpl<PendingPacket, kPendingPacketSize, ObjectPoolMem::kInline, PendingPacketPoolType::Interface> mPendingPackets; }; diff --git a/src/transport/raw/TCPConfig.h b/src/transport/raw/TCPConfig.h new file mode 100644 index 00000000000000..d54a9466b4d294 --- /dev/null +++ b/src/transport/raw/TCPConfig.h @@ -0,0 +1,127 @@ +/* + * + * Copyright (c) 2023 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. + */ + +/** + * @file + * This file defines default compile-time configuration constants + * for CHIP. + * + * Package integrators that wish to override these values should + * either use preprocessor definitions or create a project- + * specific chipProjectConfig.h header and then assert + * HAVE_CHIPPROJECTCONFIG_H via the package configuration tool + * via --with-chip-project-includes=DIR where DIR is the + * directory that contains the header. + * + * + */ + +#pragma once + +#include <lib/core/CHIPConfig.h> + +namespace chip { + +/** + * @def CHIP_CONFIG_MAX_ACTIVE_TCP_CONNECTIONS + * + * @brief Maximum Number of TCP connections a device can simultaneously have + */ +#ifndef CHIP_CONFIG_MAX_ACTIVE_TCP_CONNECTIONS +#define CHIP_CONFIG_MAX_ACTIVE_TCP_CONNECTIONS 4 +#endif + +#if INET_CONFIG_ENABLE_TCP_ENDPOINT && CHIP_CONFIG_MAX_ACTIVE_TCP_CONNECTIONS < 1 +#error "If TCP is enabled, the device needs to support at least 1 TCP connection" +#endif + +#if INET_CONFIG_ENABLE_TCP_ENDPOINT && CHIP_CONFIG_MAX_ACTIVE_TCP_CONNECTIONS > INET_CONFIG_NUM_TCP_ENDPOINTS +#error "If TCP is enabled, the maximum number of connections cannot exceed the number of tcp endpoints" +#endif + +/** + * @def CHIP_CONFIG_MAX_TCP_PENDING_PACKETS + * + * @brief Maximum Number of outstanding pending packets in the queue before a TCP connection + * needs to be established + */ +#ifndef CHIP_CONFIG_MAX_TCP_PENDING_PACKETS +#define CHIP_CONFIG_MAX_TCP_PENDING_PACKETS 4 +#endif + +/** + * @def CHIP_CONFIG_MAX_TCP_PAYLOAD_SIZE_BYTES + * + * @brief Maximum payload size of a message over a TCP connection + */ +#ifndef CHIP_CONFIG_MAX_TCP_PAYLOAD_SIZE_BYTES +#define CHIP_CONFIG_MAX_TCP_PAYLOAD_SIZE_BYTES 1000000 +#endif + +/** + * @def CHIP_CONFIG_TCP_CONNECT_TIMEOUT_MSECS + * + * @brief + * This defines the default timeout for the TCP connect + * attempt to either succeed or notify the caller of an + * error. + * + */ +#ifndef CHIP_CONFIG_TCP_CONNECT_TIMEOUT_MSECS +#define CHIP_CONFIG_TCP_CONNECT_TIMEOUT_MSECS (10000) +#endif // CHIP_CONFIG_TCP_CONNECT_TIMEOUT_MSECS + +/** + * @def CHIP_CONFIG_KEEPALIVE_INTERVAL_SECS + * + * @brief + * This defines the default interval (in seconds) between + * keepalive probes for a TCP connection. + * This value also controls the time between last data + * packet sent and the transmission of the first keepalive + * probe. + * + */ +#ifndef CHIP_CONFIG_TCP_KEEPALIVE_INTERVAL_SECS +#define CHIP_CONFIG_TCP_KEEPALIVE_INTERVAL_SECS (25) +#endif // CHIP_CONFIG_TCP_KEEPALIVE_INTERVAL_SECS + +/** + * @def CHIP_CONFIG_MAX_TCP_KEEPALIVE_PROBES + * + * @brief + * This defines the default value for the maximum number of + * keepalive probes for a TCP connection. + * + */ +#ifndef CHIP_CONFIG_MAX_TCP_KEEPALIVE_PROBES +#define CHIP_CONFIG_MAX_TCP_KEEPALIVE_PROBES (5) +#endif // CHIP_CONFIG_MAX_TCP_KEEPALIVE_PROBES + +/** + * @def CHIP_CONFIG_MAX_UNACKED_DATA_TIMEOUT_SECS + * + * @brief + * This defines the default value for the maximum timeout + * of unacknowledged data for a TCP connection. + * + */ +#ifndef CHIP_CONFIG_MAX_UNACKED_DATA_TIMEOUT_SECS +#define CHIP_CONFIG_MAX_UNACKED_DATA_TIMEOUT_SECS (30) +#endif // CHIP_CONFIG_MAX_UNACKED_DATA_TIMEOUT_SECS + +} // namespace chip diff --git a/src/transport/raw/Tuple.h b/src/transport/raw/Tuple.h index 743b9b9b0e09aa..e3e52a171abcda 100644 --- a/src/transport/raw/Tuple.h +++ b/src/transport/raw/Tuple.h @@ -93,7 +93,20 @@ class Tuple : public Base bool CanSendToPeer(const PeerAddress & address) override { return CanSendToPeerImpl<0>(address); } - void Disconnect(const PeerAddress & address) override { return DisconnectImpl<0>(address); } +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + CHIP_ERROR TCPConnect(const PeerAddress & address, Transport::AppTCPConnectionCallbackCtxt * appState, + Transport::ActiveTCPConnectionState ** peerConnState) override + { + return TCPConnectImpl<0>(address, appState, peerConnState); + } + + void TCPDisconnect(const PeerAddress & address) override { return TCPDisconnectImpl<0>(address); } + + void TCPDisconnect(Transport::ActiveTCPConnectionState * conn, bool shouldAbort = 0) override + { + return TCPDisconnectImpl<0>(conn, shouldAbort); + } +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT void Close() override { return CloseImpl<0>(); } @@ -138,26 +151,78 @@ class Tuple : public Base return false; } +#if INET_CONFIG_ENABLE_TCP_ENDPOINT + /** + * Recursive TCPConnect implementation iterating through transport members. + * + * @tparam N the index of the underlying transport to send disconnect to + * + * @param address what address to connect to. + */ + template <size_t N, typename std::enable_if<(N < sizeof...(TransportTypes))>::type * = nullptr> + CHIP_ERROR TCPConnectImpl(const PeerAddress & address, Transport::AppTCPConnectionCallbackCtxt * appState, + Transport::ActiveTCPConnectionState ** peerConnState) + { + Base * base = &std::get<N>(mTransports); + if (base->CanSendToPeer(address)) + { + return base->TCPConnect(address, appState, peerConnState); + } + return TCPConnectImpl<N + 1>(address, appState, peerConnState); + } + + /** + * TCPConnectImpl template for out of range N. + */ + template <size_t N, typename std::enable_if<(N >= sizeof...(TransportTypes))>::type * = nullptr> + CHIP_ERROR TCPConnectImpl(const PeerAddress & address, Transport::AppTCPConnectionCallbackCtxt * appState, + Transport::ActiveTCPConnectionState ** peerConnState) + { + return CHIP_ERROR_NO_MESSAGE_HANDLER; + } + /** * Recursive disconnect implementation iterating through transport members. * * @tparam N the index of the underlying transport to send disconnect to * - * @param address what address to check. + * @param address what address to disconnect from. + */ + template <size_t N, typename std::enable_if<(N < sizeof...(TransportTypes))>::type * = nullptr> + void TCPDisconnectImpl(const PeerAddress & address) + { + std::get<N>(mTransports).TCPDisconnect(address); + TCPDisconnectImpl<N + 1>(address); + } + + /** + * TCPDisconnectImpl template for out of range N. + */ + template <size_t N, typename std::enable_if<(N >= sizeof...(TransportTypes))>::type * = nullptr> + void TCPDisconnectImpl(const PeerAddress & address) + {} + + /** + * Recursive disconnect implementation iterating through transport members. + * + * @tparam N the index of the underlying transport to send disconnect to + * + * @param conn pointer to the connection to the peer. */ template <size_t N, typename std::enable_if<(N < sizeof...(TransportTypes))>::type * = nullptr> - void DisconnectImpl(const PeerAddress & address) + void TCPDisconnectImpl(Transport::ActiveTCPConnectionState * conn, bool shouldAbort = 0) { - std::get<N>(mTransports).Disconnect(address); - DisconnectImpl<N + 1>(address); + std::get<N>(mTransports).TCPDisconnect(conn, shouldAbort); + TCPDisconnectImpl<N + 1>(conn, shouldAbort); } /** - * DisconnectImpl template for out of range N. + * TCPDisconnectImpl template for out of range N. */ template <size_t N, typename std::enable_if<(N >= sizeof...(TransportTypes))>::type * = nullptr> - void DisconnectImpl(const PeerAddress & address) + void TCPDisconnectImpl(Transport::ActiveTCPConnectionState * conn, bool shouldAbort = 0) {} +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT /** * Recursive disconnect implementation iterating through transport members. diff --git a/src/transport/raw/tests/BUILD.gn b/src/transport/raw/tests/BUILD.gn index c655586c5a0e35..973626af7f340b 100644 --- a/src/transport/raw/tests/BUILD.gn +++ b/src/transport/raw/tests/BUILD.gn @@ -14,7 +14,9 @@ import("//build_overrides/build.gni") import("//build_overrides/chip.gni") +import("//build_overrides/nlunit_test.gni") import("//build_overrides/pigweed.gni") +import("${chip_root}/src/inet/inet.gni") import("${chip_root}/build/chip/chip_test_suite.gni") static_library("helpers") { @@ -40,10 +42,13 @@ chip_test_suite("tests") { test_sources = [ "TestMessageHeader.cpp", "TestPeerAddress.cpp", - "TestTCP.cpp", "TestUDP.cpp", ] + if (chip_inet_config_enable_tcp_endpoint) { + test_sources += [ "TestTCP.cpp" ] + } + public_deps = [ ":helpers", "${chip_root}/src/inet/tests:helpers", diff --git a/src/transport/raw/tests/TestTCP.cpp b/src/transport/raw/tests/TestTCP.cpp index 93414e01e3d653..6a60fb330c70f7 100644 --- a/src/transport/raw/tests/TestTCP.cpp +++ b/src/transport/raw/tests/TestTCP.cpp @@ -23,6 +23,7 @@ #include "NetworkTestHelpers.h" +#include <crypto/RandUtils.h> #include <lib/core/CHIPCore.h> #include <lib/core/CHIPEncoding.h> #include <lib/support/CHIPMem.h> @@ -30,7 +31,9 @@ #include <lib/support/UnitTestUtils.h> #include <system/SystemLayer.h> #include <transport/TransportMgr.h> +#if INET_CONFIG_ENABLE_TCP_ENDPOINT #include <transport/raw/TCP.h> +#endif // INET_CONFIG_ENABLE_TCP_ENDPOINT #include <gtest/gtest.h> @@ -47,6 +50,9 @@ namespace { constexpr size_t kMaxTcpActiveConnectionCount = 4; constexpr size_t kMaxTcpPendingPackets = 4; constexpr uint16_t kPacketSizeBytes = static_cast<uint16_t>(sizeof(uint16_t)); +uint16_t gChipTCPPort = static_cast<uint16_t>(CHIP_PORT + chip::Crypto::GetRandU16() % 100); +chip::Transport::AppTCPConnectionCallbackCtxt gAppTCPConnCbCtxt; +chip::Transport::ActiveTCPConnectionState * gActiveTCPConnState = nullptr; using TCPImpl = Transport::TCP<kMaxTcpActiveConnectionCount, kMaxTcpPendingPackets>; @@ -71,7 +77,8 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate mCallback = callback; mCallbackData = callback_data; } - void OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msgBuf) override + void OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msgBuf, + Transport::MessageTransportContext * transCtxt = nullptr) override { PacketHeader packetHeader; @@ -82,12 +89,54 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate EXPECT_EQ(mCallback(msgBuf->Start(), msgBuf->DataLength(), mReceiveHandlerCallCount, mCallbackData), 0); } + ChipLogProgress(Inet, "Message Receive Handler called"); + mReceiveHandlerCallCount++; } + void HandleConnectionAttemptComplete(chip::Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr) override + { + chip::Transport::AppTCPConnectionCallbackCtxt * appConnCbCtxt = nullptr; + VerifyOrReturn(conn != nullptr); + + mHandleConnectionCompleteCalled = true; + appConnCbCtxt = conn->mAppState; + VerifyOrReturn(appConnCbCtxt != nullptr); + + if (appConnCbCtxt->connCompleteCb != nullptr) + { + appConnCbCtxt->connCompleteCb(conn, conErr); + } + else + { + ChipLogProgress(Inet, "Connection established. App callback missing."); + } + } + + void HandleConnectionClosed(chip::Transport::ActiveTCPConnectionState * conn, CHIP_ERROR conErr) override + { + chip::Transport::AppTCPConnectionCallbackCtxt * appConnCbCtxt = nullptr; + VerifyOrReturn(conn != nullptr); + + mHandleConnectionCloseCalled = true; + appConnCbCtxt = conn->mAppState; + VerifyOrReturn(appConnCbCtxt != nullptr); + + if (appConnCbCtxt->connClosedCb != nullptr) + { + appConnCbCtxt->connClosedCb(conn, conErr); + } + else + { + ChipLogProgress(Inet, "Connection Closed. App callback missing."); + } + } + void InitializeMessageTest(TCPImpl & tcp, const IPAddress & addr) { - CHIP_ERROR err = tcp.Init(Transport::TcpListenParameters(mContext->GetTCPEndPointManager()).SetAddressType(addr.Type())); + CHIP_ERROR err = tcp.Init(Transport::TcpListenParameters(mContext->GetTCPEndPointManager()) + .SetAddressType(addr.Type()) + .SetListenPort(gChipTCPPort)); // retry a few times in case the port is somehow in use. // this is a WORKAROUND for flaky testing if we run tests very fast after each other. @@ -106,7 +155,9 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate { ChipLogProgress(NotSpecified, "RETRYING tcp initialization"); chip::test_utils::SleepMillis(100); - err = tcp.Init(Transport::TcpListenParameters(mContext->GetTCPEndPointManager()).SetAddressType(addr.Type())); + err = tcp.Init(Transport::TcpListenParameters(mContext->GetTCPEndPointManager()) + .SetAddressType(addr.Type()) + .SetListenPort(gChipTCPPort)); } EXPECT_EQ(err, CHIP_NO_ERROR); @@ -114,7 +165,14 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate mTransportMgrBase.SetSessionManager(this); mTransportMgrBase.Init(&tcp); - mReceiveHandlerCallCount = 0; + mReceiveHandlerCallCount = 0; + mHandleConnectionCompleteCalled = false; + mHandleConnectionCloseCalled = false; + + gAppTCPConnCbCtxt.appContext = nullptr; + gAppTCPConnCbCtxt.connReceivedCb = nullptr; + gAppTCPConnCbCtxt.connCompleteCb = nullptr; + gAppTCPConnCbCtxt.connClosedCb = nullptr; } void SingleMessageTest(TCPImpl & tcp, const IPAddress & addr) @@ -132,7 +190,7 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate EXPECT_EQ(err, CHIP_NO_ERROR); // Should be able to send a message to itself by just calling send. - err = tcp.SendMessage(Transport::PeerAddress::TCP(addr), std::move(buffer)); + err = tcp.SendMessage(Transport::PeerAddress::TCP(addr, gChipTCPPort), std::move(buffer)); EXPECT_EQ(err, CHIP_NO_ERROR); mContext->DriveIOUntil(chip::System::Clock::Seconds16(5), [this]() { return mReceiveHandlerCallCount != 0; }); @@ -141,39 +199,114 @@ class MockTransportMgrDelegate : public chip::TransportMgrDelegate SetCallback(nullptr); } - void FinalizeMessageTest(TCPImpl & tcp, const IPAddress & addr) + void ConnectTest(TCPImpl & tcp, const IPAddress & addr) + { + // Connect and wait for seeing active connection + CHIP_ERROR err = tcp.TCPConnect(Transport::PeerAddress::TCP(addr, gChipTCPPort), &gAppTCPConnCbCtxt, &gActiveTCPConnState); + EXPECT_EQ(err, CHIP_NO_ERROR); + + mContext->DriveIOUntil(chip::System::Clock::Seconds16(5), [&tcp]() { return tcp.HasActiveConnections(); }); + EXPECT_EQ(tcp.HasActiveConnections(), true); + } + + void HandleConnectCompleteCbCalledTest(TCPImpl & tcp, const IPAddress & addr) + { + // Connect and wait for seeing active connection and connection complete + // handler being called. + CHIP_ERROR err = tcp.TCPConnect(Transport::PeerAddress::TCP(addr, gChipTCPPort), &gAppTCPConnCbCtxt, &gActiveTCPConnState); + EXPECT_EQ(err, CHIP_NO_ERROR); + + mContext->DriveIOUntil(chip::System::Clock::Seconds16(5), [this]() { return mHandleConnectionCompleteCalled; }); + EXPECT_EQ(mHandleConnectionCompleteCalled, true); + } + + void HandleConnectCloseCbCalledTest(TCPImpl & tcp, const IPAddress & addr) + { + // Connect and wait for seeing active connection and connection complete + // handler being called. + CHIP_ERROR err = tcp.TCPConnect(Transport::PeerAddress::TCP(addr, gChipTCPPort), &gAppTCPConnCbCtxt, &gActiveTCPConnState); + EXPECT_EQ(err, CHIP_NO_ERROR); + + mContext->DriveIOUntil(chip::System::Clock::Seconds16(5), [this]() { return mHandleConnectionCompleteCalled; }); + EXPECT_EQ(mHandleConnectionCompleteCalled, true); + + tcp.TCPDisconnect(Transport::PeerAddress::TCP(addr, gChipTCPPort)); + mContext->DriveIOUntil(chip::System::Clock::Seconds16(5), [&tcp]() { return !tcp.HasActiveConnections(); }); + EXPECT_EQ(mHandleConnectionCloseCalled, true); + } + + void DisconnectTest(TCPImpl & tcp, chip::Transport::ActiveTCPConnectionState * conn) { // Disconnect and wait for seeing peer close - tcp.Disconnect(Transport::PeerAddress::TCP(addr)); + tcp.TCPDisconnect(conn, true); mContext->DriveIOUntil(chip::System::Clock::Seconds16(5), [&tcp]() { return !tcp.HasActiveConnections(); }); + EXPECT_EQ(tcp.HasActiveConnections(), false); + } + + void DisconnectTest(TCPImpl & tcp, const IPAddress & addr) + { + // Disconnect and wait for seeing peer close + tcp.TCPDisconnect(Transport::PeerAddress::TCP(addr, gChipTCPPort)); + mContext->DriveIOUntil(chip::System::Clock::Seconds16(5), [&tcp]() { return !tcp.HasActiveConnections(); }); + EXPECT_EQ(tcp.HasActiveConnections(), false); + } + + CHIP_ERROR TCPConnect(const Transport::PeerAddress & peerAddress, Transport::AppTCPConnectionCallbackCtxt * appState, + Transport::ActiveTCPConnectionState ** peerConnState) + { + return mTransportMgrBase.TCPConnect(peerAddress, appState, peerConnState); + } + + using OnTCPConnectionReceivedCallback = void (*)(void * context, chip::Transport::ActiveTCPConnectionState * conn); + + using OnTCPConnectionCompleteCallback = void (*)(void * context, chip::Transport::ActiveTCPConnectionState * conn, + CHIP_ERROR conErr); + + using OnTCPConnectionClosedCallback = void (*)(void * context, chip::Transport::ActiveTCPConnectionState * conn, + CHIP_ERROR conErr); + + void SetConnectionCallbacks(OnTCPConnectionCompleteCallback connCompleteCb, OnTCPConnectionClosedCallback connClosedCb, + OnTCPConnectionReceivedCallback connReceivedCb) + { + mConnCompleteCb = connCompleteCb; + mConnClosedCb = connClosedCb; + mConnReceivedCb = connReceivedCb; } int mReceiveHandlerCallCount = 0; + bool mHandleConnectionCompleteCalled = false; + + bool mHandleConnectionCloseCalled = false; + private: TestContext * mContext; MessageReceivedCallback mCallback; void * mCallbackData; TransportMgrBase mTransportMgrBase; + OnTCPConnectionCompleteCallback mConnCompleteCb = nullptr; + OnTCPConnectionClosedCallback mConnClosedCb = nullptr; + OnTCPConnectionReceivedCallback mConnReceivedCb = nullptr; }; -/////////////////////////// Init test - class TestTCP : public ::testing::Test, public chip::Test::IOContext { protected: void SetUp() { ASSERT_EQ(Init(), CHIP_NO_ERROR); } void TearDown() { Shutdown(); } + /////////////////////////// Init test void CheckSimpleInitTest(Inet::IPAddressType type) { TCPImpl tcp; - CHIP_ERROR err = tcp.Init(Transport::TcpListenParameters(GetTCPEndPointManager()).SetAddressType(type)); + CHIP_ERROR err = + tcp.Init(Transport::TcpListenParameters(GetTCPEndPointManager()).SetAddressType(type).SetListenPort(gChipTCPPort)); EXPECT_EQ(err, CHIP_NO_ERROR); } + /////////////////////////// Messaging test void CheckMessageTest(const IPAddress & addr) { TCPImpl tcp; @@ -181,7 +314,48 @@ class TestTCP : public ::testing::Test, public chip::Test::IOContext MockTransportMgrDelegate gMockTransportMgrDelegate(this); gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr); gMockTransportMgrDelegate.SingleMessageTest(tcp, addr); - gMockTransportMgrDelegate.FinalizeMessageTest(tcp, addr); + gMockTransportMgrDelegate.DisconnectTest(tcp, addr); + } + + void ConnectToSelfTest(const IPAddress & addr) + { + TCPImpl tcp; + + MockTransportMgrDelegate gMockTransportMgrDelegate(this); + gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr); + gMockTransportMgrDelegate.ConnectTest(tcp, addr); + gMockTransportMgrDelegate.DisconnectTest(tcp, addr); + } + + void ConnectSendMessageThenCloseTest(const IPAddress & addr) + { + TCPImpl tcp; + + MockTransportMgrDelegate gMockTransportMgrDelegate(this); + gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr); + gMockTransportMgrDelegate.ConnectTest(tcp, addr); + gMockTransportMgrDelegate.SingleMessageTest(tcp, addr); + gMockTransportMgrDelegate.DisconnectTest(tcp, addr); + } + + void HandleConnCompleteTest(const IPAddress & addr) + { + TCPImpl tcp; + + MockTransportMgrDelegate gMockTransportMgrDelegate(this); + gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr); + gMockTransportMgrDelegate.HandleConnectCompleteCbCalledTest(tcp, addr); + gMockTransportMgrDelegate.DisconnectTest(tcp, addr); + } + + void HandleConnCloseTest(const IPAddress & addr) + { + TCPImpl tcp; + + MockTransportMgrDelegate gMockTransportMgrDelegate(this); + gMockTransportMgrDelegate.InitializeMessageTest(tcp, addr); + gMockTransportMgrDelegate.HandleConnectCloseCbCalledTest(tcp, addr); + gMockTransportMgrDelegate.DisconnectTest(tcp, addr); } }; @@ -211,6 +385,57 @@ TEST_F(TestTCP, CheckMessageTest6) CheckMessageTest(addr); } +#if INET_CONFIG_ENABLE_IPV4 +TEST_F(TestTCP, ConnectToSelfTest4) +{ + IPAddress addr; + IPAddress::FromString("127.0.0.1", addr); + ConnectToSelfTest(addr); +} + +TEST_F(TestTCP, ConnectSendMessageThenCloseTest4) +{ + IPAddress addr; + IPAddress::FromString("127.0.0.1", addr); + ConnectSendMessageThenCloseTest(addr); +} + +TEST_F(TestTCP, HandleConnCompleteCalledTest4) +{ + IPAddress addr; + IPAddress::FromString("127.0.0.1", addr); + HandleConnCompleteTest(addr); +} +#endif // INET_CONFIG_ENABLE_IPV4 + +TEST_F(TestTCP, ConnectToSelfTest6) +{ + IPAddress addr; + IPAddress::FromString("::1", addr); + ConnectToSelfTest(addr); +} + +TEST_F(TestTCP, ConnectSendMessageThenCloseTest6) +{ + IPAddress addr; + IPAddress::FromString("::1", addr); + ConnectSendMessageThenCloseTest(addr); +} + +TEST_F(TestTCP, HandleConnCompleteCalledTest6) +{ + IPAddress addr; + IPAddress::FromString("::1", addr); + HandleConnCompleteTest(addr); +} + +TEST_F(TestTCP, HandleConnCloseCalledTest6) +{ + IPAddress addr; + IPAddress::FromString("::1", addr); + HandleConnCloseTest(addr); +} + // Generates a packet buffer or a chain of packet buffers for a single message. struct TestData { @@ -381,8 +606,8 @@ class TCPTest // (The current TCPEndPoint implementation is not effectively mockable.) gMockTransportMgrDelegate.SingleMessageTest(tcp, addr); - Transport::PeerAddress lPeerAddress = Transport::PeerAddress::TCP(addr); - TCPBase::ActiveConnectionState * state = tcp.FindActiveConnection(lPeerAddress); + Transport::PeerAddress lPeerAddress = Transport::PeerAddress::TCP(addr, gChipTCPPort); + chip::Transport::ActiveTCPConnectionState * state = tcp.FindActiveConnection(lPeerAddress); ASSERT_NE(state, nullptr); Inet::TCPEndPoint * lEndPoint = state->mEndPoint; ASSERT_NE(lEndPoint, nullptr); @@ -433,7 +658,7 @@ class TCPTest EXPECT_EQ(err, CHIP_ERROR_MESSAGE_TOO_LONG); EXPECT_EQ(gMockTransportMgrDelegate.mReceiveHandlerCallCount, 0); - gMockTransportMgrDelegate.FinalizeMessageTest(tcp, addr); + gMockTransportMgrDelegate.DisconnectTest(tcp, addr); } }; } // namespace Transport diff --git a/src/transport/raw/tests/TestUDP.cpp b/src/transport/raw/tests/TestUDP.cpp index 70077a6fa297e9..6a22a821fdfc94 100644 --- a/src/transport/raw/tests/TestUDP.cpp +++ b/src/transport/raw/tests/TestUDP.cpp @@ -52,7 +52,8 @@ class MockTransportMgrDelegate : public TransportMgrDelegate MockTransportMgrDelegate() {} ~MockTransportMgrDelegate() override {} - void OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msgBuf) override + void OnMessageReceived(const Transport::PeerAddress & source, System::PacketBufferHandle && msgBuf, + Transport::MessageTransportContext * transCtxt = nullptr) override { PacketHeader packetHeader; From 007e11d084abbf88d0d14816d13e15515bf26cb0 Mon Sep 17 00:00:00 2001 From: Amine Alami <43780877+Alami-Amine@users.noreply.github.com> Date: Wed, 1 May 2024 15:10:59 +0200 Subject: [PATCH 095/124] pw_unit_test migration: lib support batch 5 (#33238) * pw_unit_test migration: lib support batch 5 * pw_unit_test migration: lib support batch 4 (#33199) * pw_unit_test migration: lib support batch 4 * fix merge error BUILD.gn * pw_unit_test migration: lib support batch 5 * newline * removing commented-out code * convert TestCHIPArgParser test --- src/BUILD.gn | 1 - src/lib/support/tests/BUILD.gn | 39 +-- src/lib/support/tests/TestCHIPArgParser.cpp | 214 +++++-------- src/lib/support/tests/TestPool.cpp | 293 ++++++++---------- src/lib/support/tests/TestStateMachine.cpp | 123 +++----- .../tests/TestThreadOperationalDataset.cpp | 200 +++++------- .../unit-tests/test_components_nl.txt | 1 - 7 files changed, 342 insertions(+), 529 deletions(-) diff --git a/src/BUILD.gn b/src/BUILD.gn index 8fedfa15e43fd8..aa657786cd2469 100644 --- a/src/BUILD.gn +++ b/src/BUILD.gn @@ -99,7 +99,6 @@ if (chip_build_tests) { "${chip_root}/src/credentials/tests", "${chip_root}/src/lib/format/tests", "${chip_root}/src/lib/support/tests", - "${chip_root}/src/lib/support/tests:tests_nltest", "${chip_root}/src/protocols/secure_channel/tests", "${chip_root}/src/protocols/secure_channel/tests:tests_nltest", "${chip_root}/src/system/tests", diff --git a/src/lib/support/tests/BUILD.gn b/src/lib/support/tests/BUILD.gn index 485402003fd4dd..565eb85097d133 100644 --- a/src/lib/support/tests/BUILD.gn +++ b/src/lib/support/tests/BUILD.gn @@ -40,6 +40,7 @@ chip_test_suite("tests") { "TestJsonToTlv.cpp", "TestJsonToTlvToJson.cpp", "TestPersistedCounter.cpp", + "TestPool.cpp", "TestPrivateHeap.cpp", "TestSafeInt.cpp", "TestSafeString.cpp", @@ -47,10 +48,12 @@ chip_test_suite("tests") { "TestScopedBuffer.cpp", "TestSorting.cpp", "TestSpan.cpp", + "TestStateMachine.cpp", "TestStaticSupportSmartPtr.cpp", "TestStringBuilder.cpp", "TestStringSplitter.cpp", "TestTestPersistentStorageDelegate.cpp", + "TestThreadOperationalDataset.cpp", "TestTimeUtils.cpp", "TestTlvJson.cpp", "TestTlvToJson.cpp", @@ -58,42 +61,12 @@ chip_test_suite("tests") { "TestVariant.cpp", "TestZclString.cpp", ] - sources = [] - - cflags = [ - "-Wconversion", - - # TODO(#21255): work-around for SimpleStateMachine constructor issue. - "-Wno-uninitialized", - - # TestStringSplitter intentionally validates string overflows. - "-Wno-stringop-truncation", - ] - - public_deps = [ - "${chip_root}/src/credentials", - "${chip_root}/src/lib/core", - "${chip_root}/src/lib/support:static-support", - "${chip_root}/src/lib/support:testing", - "${chip_root}/src/lib/support/jsontlv", - "${chip_root}/src/platform", - ] -} - -chip_test_suite_using_nltest("tests_nltest") { - output_name = "libSupportTestsNL" - - test_sources = [ - "TestPool.cpp", - "TestStateMachine.cpp", - "TestThreadOperationalDataset.cpp", - ] - sources = [] - if (current_os != "mbed") { test_sources += [ "TestCHIPArgParser.cpp" ] } + sources = [] + cflags = [ "-Wconversion", @@ -109,9 +82,7 @@ chip_test_suite_using_nltest("tests_nltest") { "${chip_root}/src/lib/core", "${chip_root}/src/lib/support:static-support", "${chip_root}/src/lib/support:testing", - "${chip_root}/src/lib/support:testing_nlunit", "${chip_root}/src/lib/support/jsontlv", "${chip_root}/src/platform", - "${nlunit_test_root}:nlunit-test", ] } diff --git a/src/lib/support/tests/TestCHIPArgParser.cpp b/src/lib/support/tests/TestCHIPArgParser.cpp index c54e0223ca7e07..426758aff1e5c8 100644 --- a/src/lib/support/tests/TestCHIPArgParser.cpp +++ b/src/lib/support/tests/TestCHIPArgParser.cpp @@ -22,17 +22,16 @@ #include <stdlib.h> #include <string.h> +#include <gtest/gtest.h> + #include <lib/core/CHIPCore.h> #include <lib/support/CHIPArgParser.hpp> #include <lib/support/CHIPMem.h> #include <lib/support/CHIPMemString.h> #include <lib/support/EnforceFormat.h> #include <lib/support/ScopedBuffer.h> -#include <lib/support/UnitTestRegistration.h> #include <lib/support/logging/Constants.h> -#if CHIP_CONFIG_ENABLE_ARG_PARSER - using namespace chip::ArgParser; static bool HandleOption(const char * progName, OptionSet * optSet, int id, const char * name, const char * arg); @@ -40,71 +39,68 @@ static bool HandleNonOptionArgs(const char * progName, int argc, char * const ar static void HandleArgError(const char * msg, ...); static void ClearCallbackRecords(); -#define DEBUG_TESTS 0 - -#define QuitWithError(MSG) \ - do \ - { \ - fprintf(stderr, "%s FAILED (line %d): ", __FUNCTION__, __LINE__); \ - fputs(MSG, stderr); \ - fputs("\n", stderr); \ - exit(EXIT_FAILURE); \ - } while (0) +class TestCHIPArgParser : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() + { + ClearCallbackRecords(); + chip::Platform::MemoryShutdown(); + } +}; -#define VerifyOrQuit(TST, MSG) \ - do \ - { \ - if (!(TST)) \ - { \ - QuitWithError(MSG); \ - } \ - } while (0) +#define DEBUG_TESTS 0 #define VerifyHandleOptionCallback(INDEX, EXPECT_PROG_NAME, EXPECT_OPTSET, EXPECT_ID, EXPECT_NAME, EXPECT_ARG) \ do \ { \ CallbackRecord & rec = sCallbackRecords[INDEX]; \ const char * arg = EXPECT_ARG; \ - VerifyOrQuit(rec.Type == CallbackRecord::kHandleOption, "Invalid callback type (expected HandleOption)"); \ - VerifyOrQuit(strcmp(rec.ProgName, EXPECT_PROG_NAME) == 0, "Invalid value for HandleOption argument: progName"); \ - VerifyOrQuit(rec.OptSet == EXPECT_OPTSET, "Invalid value for HandleOption argument: optSet"); \ - VerifyOrQuit(rec.Id == EXPECT_ID, "Invalid value for HandleOption argument: id"); \ - VerifyOrQuit(strcmp(rec.Name, EXPECT_NAME) == 0, "Invalid value for HandleOption argument: name"); \ + ASSERT_EQ(rec.Type, CallbackRecord::kHandleOption) << "Invalid callback type (expected HandleOption)"; \ + ASSERT_STREQ(rec.ProgName, EXPECT_PROG_NAME) << "Invalid value for HandleOption argument: progName"; \ + ASSERT_EQ(rec.OptSet, EXPECT_OPTSET) << "Invalid value for HandleOption argument: optSet"; \ + ASSERT_EQ(rec.Id, EXPECT_ID) << "Invalid value for HandleOption argument: id"; \ + ASSERT_STREQ(rec.Name, EXPECT_NAME) << "Invalid value for HandleOption argument: name"; \ if (arg != NULL) \ - VerifyOrQuit(strcmp(rec.Arg, arg) == 0, "Invalid value for HandleOption argument: arg"); \ + { \ + ASSERT_STREQ(rec.Arg, arg) << "Invalid value for HandleOption argument: arg"; \ + } \ else \ - VerifyOrQuit(rec.Arg == NULL, "Invalid value for HandleOption argument: arg"); \ + { \ + ASSERT_EQ(rec.Arg, nullptr) << "Invalid value for HandleOption argument: arg"; \ + } \ } while (0) #define VerifyHandleNonOptionArgsCallback(INDEX, EXPECT_PROG_NAME, EXPECT_ARGC) \ do \ { \ CallbackRecord & rec = sCallbackRecords[INDEX]; \ - VerifyOrQuit(rec.Type == CallbackRecord::kHandleNonOptionArgs, "Invalid callback type (expected HandleNonOptionArgs)"); \ - VerifyOrQuit(strcmp(rec.ProgName, EXPECT_PROG_NAME) == 0, "Invalid value for HandleNonOptionArgs argument: progName"); \ - VerifyOrQuit(rec.Argc == EXPECT_ARGC, "Invalid value for HandleNonOptionArgs argument: argc"); \ + ASSERT_EQ(rec.Type, CallbackRecord::kHandleNonOptionArgs) << "Invalid callback type (expected HandleNonOptionArgs)"; \ + ASSERT_STREQ(rec.ProgName, EXPECT_PROG_NAME) << "Invalid value for HandleNonOptionArgs argument: progName"; \ + ASSERT_EQ(rec.Argc, EXPECT_ARGC) << "Invalid value for HandleNonOptionArgs argument: argc"; \ } while (0) #define VerifyNonOptionArg(INDEX, EXPECT_ARG) \ do \ { \ CallbackRecord & rec = sCallbackRecords[INDEX]; \ - VerifyOrQuit(rec.Type == CallbackRecord::kNonOptionArg, "Invalid callback type (expected NonOptionArg)"); \ - VerifyOrQuit(strcmp(rec.Arg, EXPECT_ARG) == 0, "Invalid value for NonOptionArg"); \ + ASSERT_EQ(rec.Type, CallbackRecord::kNonOptionArg) << "Invalid callback type (expected NonOptionArg)"; \ + ASSERT_STREQ(rec.Arg, EXPECT_ARG) << "Invalid value for NonOptionArg"; \ } while (0) #define VerifyPrintArgErrorCallback(INDEX) \ do \ { \ CallbackRecord & rec = sCallbackRecords[INDEX]; \ - VerifyOrQuit(rec.Type == CallbackRecord::kArgError, "Invalid callback type (expected ArgError)"); \ + ASSERT_EQ(rec.Type, CallbackRecord::kArgError) << "Invalid callback type (expected ArgError)"; \ } while (0) #define VerifyArgErrorContains(INDEX, EXPECT_TEXT) \ do \ { \ CallbackRecord & rec = sCallbackRecords[INDEX]; \ - VerifyOrQuit(strstr(rec.Error, EXPECT_TEXT) != NULL, "Expected text not found in error output"); \ + ASSERT_NE(strstr(rec.Error, EXPECT_TEXT), nullptr) << "Expected text not found in error output"; \ } while (0) struct CallbackRecord @@ -212,7 +208,7 @@ TestArgv DupeArgs(const char * argv[], int argc_as_int) } // namespace -static void SimpleParseTest_SingleLongOption() +TEST_F(TestCHIPArgParser, SimpleParseTest_SingleLongOption) { bool res; @@ -232,13 +228,13 @@ static void SimpleParseTest_SingleLongOption() TestArgv argsDup = DupeArgs(argv, argc); res = ParseArgs(__FUNCTION__, argc, argsDup.argv.Get(), optionSets, HandleNonOptionArgs); - VerifyOrQuit(res == true, "ParseArgs() returned false"); - VerifyOrQuit(sCallbackRecordCount == 2, "Invalid value returned for sCallbackRecordCount"); + ASSERT_TRUE(res) << "ParseArgs() returned false"; + ASSERT_EQ(sCallbackRecordCount, 2u) << "Invalid value returned for sCallbackRecordCount"; VerifyHandleOptionCallback(0, __FUNCTION__, &sOptionSetA, '1', "--foo", nullptr); VerifyHandleNonOptionArgsCallback(1, __FUNCTION__, 0); } -static void SimpleParseTest_SingleShortOption() +TEST_F(TestCHIPArgParser, SimpleParseTest_SingleShortOption) { bool res; @@ -258,13 +254,13 @@ static void SimpleParseTest_SingleShortOption() TestArgv argsDup = DupeArgs(argv, argc); res = ParseArgs(__FUNCTION__, argc, argsDup.argv.Get(), optionSets, HandleNonOptionArgs); - VerifyOrQuit(res == true, "ParseArgs() returned false"); - VerifyOrQuit(sCallbackRecordCount == 2, "Invalid value returned for sCallbackRecordCount"); + ASSERT_TRUE(res) << "ParseArgs() returned false"; + ASSERT_EQ(sCallbackRecordCount, 2u) << "Invalid value returned for sCallbackRecordCount"; VerifyHandleOptionCallback(0, __FUNCTION__, &sOptionSetB, 's', "-s", nullptr); VerifyHandleNonOptionArgsCallback(1, __FUNCTION__, 0); } -static void SimpleParseTest_SingleLongOptionWithValue() +TEST_F(TestCHIPArgParser, SimpleParseTest_SingleLongOptionWithValue) { bool res; @@ -284,13 +280,13 @@ static void SimpleParseTest_SingleLongOptionWithValue() TestArgv argsDup = DupeArgs(argv, argc); res = ParseArgs(__FUNCTION__, argc, argsDup.argv.Get(), optionSets, HandleNonOptionArgs); - VerifyOrQuit(res == true, "ParseArgs() returned false"); - VerifyOrQuit(sCallbackRecordCount == 2, "Invalid value returned for sCallbackRecordCount"); + ASSERT_TRUE(res) << "ParseArgs() returned false"; + ASSERT_EQ(sCallbackRecordCount, 2u) << "Invalid value returned for sCallbackRecordCount"; VerifyHandleOptionCallback(0, __FUNCTION__, &sOptionSetB, 1000, "--run", "run-value"); VerifyHandleNonOptionArgsCallback(1, __FUNCTION__, 0); } -static void SimpleParseTest_SingleShortOptionWithValue() +TEST_F(TestCHIPArgParser, SimpleParseTest_SingleShortOptionWithValue) { bool res; @@ -310,13 +306,13 @@ static void SimpleParseTest_SingleShortOptionWithValue() TestArgv argsDup = DupeArgs(argv, argc); res = ParseArgs(__FUNCTION__, argc, argsDup.argv.Get(), optionSets, HandleNonOptionArgs); - VerifyOrQuit(res == true, "ParseArgs() returned false"); - VerifyOrQuit(sCallbackRecordCount == 2, "Invalid value returned for sCallbackRecordCount"); + ASSERT_TRUE(res) << "ParseArgs() returned false"; + ASSERT_EQ(sCallbackRecordCount, 2u) << "Invalid value returned for sCallbackRecordCount"; VerifyHandleOptionCallback(0, __FUNCTION__, &sOptionSetA, 'Z', "-Z", "baz-value"); VerifyHandleNonOptionArgsCallback(1, __FUNCTION__, 0); } -static void SimpleParseTest_VariousShortAndLongWithArgs() +TEST_F(TestCHIPArgParser, SimpleParseTest_VariousShortAndLongWithArgs) { bool res; @@ -345,8 +341,8 @@ static void SimpleParseTest_VariousShortAndLongWithArgs() TestArgv argsDup = DupeArgs(argv, argc); res = ParseArgs(__FUNCTION__, argc, argsDup.argv.Get(), optionSets, HandleNonOptionArgs); - VerifyOrQuit(res == true, "ParseArgs() returned false"); - VerifyOrQuit(sCallbackRecordCount == 12, "Invalid value returned for sCallbackRecordCount"); + ASSERT_TRUE(res) << "ParseArgs() returned false"; + ASSERT_EQ(sCallbackRecordCount, 12u) << "Invalid value returned for sCallbackRecordCount"; VerifyHandleOptionCallback(0, __FUNCTION__, &sOptionSetA, '1', "--foo", nullptr); VerifyHandleOptionCallback(1, __FUNCTION__, &sOptionSetB, 1000, "--run", "run-value"); VerifyHandleOptionCallback(2, __FUNCTION__, &sOptionSetB, 's', "-s", nullptr); @@ -361,7 +357,7 @@ static void SimpleParseTest_VariousShortAndLongWithArgs() VerifyNonOptionArg(11, "non-opt-arg-4"); } -static void UnknownOptionTest_UnknownShortOption() +TEST_F(TestCHIPArgParser, UnknownOptionTest_UnknownShortOption) { bool res; @@ -385,8 +381,8 @@ static void UnknownOptionTest_UnknownShortOption() TestArgv argsDup = DupeArgs(argv, argc); res = ParseArgs(__FUNCTION__, argc, argsDup.argv.Get(), optionSets, HandleNonOptionArgs); - VerifyOrQuit(res == false, "ParseArgs() returned true"); - VerifyOrQuit(sCallbackRecordCount == 3, "Invalid value returned for sCallbackRecordCount"); + ASSERT_FALSE(res) << "ParseArgs() returned true"; + ASSERT_EQ(sCallbackRecordCount, 3u) << "Invalid value returned for sCallbackRecordCount"; VerifyHandleOptionCallback(0, __FUNCTION__, &sOptionSetA, '1', "--foo", nullptr); VerifyHandleOptionCallback(1, __FUNCTION__, &sOptionSetB, 1000, "--run", "run-value"); VerifyPrintArgErrorCallback(2); @@ -394,7 +390,7 @@ static void UnknownOptionTest_UnknownShortOption() VerifyArgErrorContains(2, "-q"); } -static void UnknownOptionTest_UnknownLongOption() +TEST_F(TestCHIPArgParser, UnknownOptionTest_UnknownLongOption) { bool res; @@ -418,8 +414,8 @@ static void UnknownOptionTest_UnknownLongOption() TestArgv argsDup = DupeArgs(argv, argc); res = ParseArgs(__FUNCTION__, argc, argsDup.argv.Get(), optionSets, HandleNonOptionArgs); - VerifyOrQuit(res == false, "ParseArgs() returned true"); - VerifyOrQuit(sCallbackRecordCount == 3, "Invalid value returned for sCallbackRecordCount"); + ASSERT_FALSE(res) << "ParseArgs() returned true"; + ASSERT_EQ(sCallbackRecordCount, 3u) << "Invalid value returned for sCallbackRecordCount"; VerifyHandleOptionCallback(0, __FUNCTION__, &sOptionSetA, '1', "--foo", nullptr); VerifyHandleOptionCallback(1, __FUNCTION__, &sOptionSetB, 1000, "--run", "run-value"); VerifyPrintArgErrorCallback(2); @@ -427,7 +423,7 @@ static void UnknownOptionTest_UnknownLongOption() VerifyArgErrorContains(2, "--bad"); } -static void UnknownOptionTest_UnknownShortOptionAfterKnown() +TEST_F(TestCHIPArgParser, UnknownOptionTest_UnknownShortOptionAfterKnown) { bool res; @@ -451,8 +447,8 @@ static void UnknownOptionTest_UnknownShortOptionAfterKnown() TestArgv argsDup = DupeArgs(argv, argc); res = ParseArgs(__FUNCTION__, argc, argsDup.argv.Get(), optionSets, HandleNonOptionArgs); - VerifyOrQuit(res == false, "ParseArgs() returned true"); - VerifyOrQuit(sCallbackRecordCount == 4, "Invalid value returned for sCallbackRecordCount"); + ASSERT_FALSE(res) << "ParseArgs() returned true"; + ASSERT_EQ(sCallbackRecordCount, 4u) << "Invalid value returned for sCallbackRecordCount"; VerifyHandleOptionCallback(0, __FUNCTION__, &sOptionSetA, '1', "--foo", nullptr); VerifyHandleOptionCallback(1, __FUNCTION__, &sOptionSetB, 1000, "--run", "run-value"); VerifyHandleOptionCallback(2, __FUNCTION__, &sOptionSetA, '1', "-1", nullptr); @@ -461,7 +457,7 @@ static void UnknownOptionTest_UnknownShortOptionAfterKnown() VerifyArgErrorContains(3, "-Q"); } -static void UnknownOptionTest_UnknownShortOptionBeforeKnown() +TEST_F(TestCHIPArgParser, UnknownOptionTest_UnknownShortOptionBeforeKnown) { bool res; @@ -481,14 +477,14 @@ static void UnknownOptionTest_UnknownShortOptionBeforeKnown() TestArgv argsDup = DupeArgs(argv, argc); res = ParseArgs(__FUNCTION__, argc, argsDup.argv.Get(), optionSets, HandleNonOptionArgs); - VerifyOrQuit(res == false, "ParseArgs() returned true"); - VerifyOrQuit(sCallbackRecordCount == 1, "Invalid value returned for sCallbackRecordCount"); + ASSERT_FALSE(res) << "ParseArgs() returned true"; + ASSERT_EQ(sCallbackRecordCount, 1u) << "Invalid value returned for sCallbackRecordCount"; VerifyPrintArgErrorCallback(0); VerifyArgErrorContains(0, "Unknown"); VerifyArgErrorContains(0, "-Q"); } -static void UnknownOptionTest_UnknownShortOptionAfterArgs() +TEST_F(TestCHIPArgParser, UnknownOptionTest_UnknownShortOptionAfterArgs) { bool res; @@ -510,14 +506,14 @@ static void UnknownOptionTest_UnknownShortOptionAfterArgs() TestArgv argsDup = DupeArgs(argv, argc); res = ParseArgs(__FUNCTION__, argc, argsDup.argv.Get(), optionSets, HandleNonOptionArgs); - VerifyOrQuit(res == false, "ParseArgs() returned true"); - VerifyOrQuit(sCallbackRecordCount == 1, "Invalid value returned for sCallbackRecordCount"); + ASSERT_FALSE(res) << "ParseArgs() returned true"; + ASSERT_EQ(sCallbackRecordCount, 1u) << "Invalid value returned for sCallbackRecordCount"; VerifyPrintArgErrorCallback(0); VerifyArgErrorContains(0, "Unknown"); VerifyArgErrorContains(0, "-Q"); } -static void UnknownOptionTest_UnknownLongOptionAfterArgs() +TEST_F(TestCHIPArgParser, UnknownOptionTest_UnknownLongOptionAfterArgs) { bool res; @@ -539,15 +535,14 @@ static void UnknownOptionTest_UnknownLongOptionAfterArgs() TestArgv argsDup = DupeArgs(argv, argc); res = ParseArgs(__FUNCTION__, argc, argsDup.argv.Get(), optionSets, HandleNonOptionArgs); - VerifyOrQuit(res == false, "ParseArgs() returned true"); - VerifyOrQuit(sCallbackRecordCount == 1, "Invalid value returned for sCallbackRecordCount"); + ASSERT_FALSE(res) << "ParseArgs() returned true"; + ASSERT_EQ(sCallbackRecordCount, 1u) << "Invalid value returned for sCallbackRecordCount"; VerifyPrintArgErrorCallback(0); VerifyArgErrorContains(0, "Unknown"); VerifyArgErrorContains(0, "--barf"); } -#ifndef CHIP_CONFIG_NON_POSIX_LONG_OPT -static void UnknownOptionTest_IgnoreUnknownLongOption() +TEST_F(TestCHIPArgParser, UnknownOptionTest_IgnoreUnknownLongOption) { bool res; @@ -570,18 +565,17 @@ static void UnknownOptionTest_IgnoreUnknownLongOption() TestArgv argsDup = DupeArgs(argv, argc); res = ParseArgs(__FUNCTION__, argc, argsDup.argv.Get(), optionSets, HandleNonOptionArgs, true); - VerifyOrQuit(res == true, "ParseArgs() returned false"); + ASSERT_TRUE(res) << "ParseArgs() returned false"; - VerifyOrQuit(sCallbackRecordCount == 4, "Invalid value returned for sCallbackRecordCount"); + ASSERT_EQ(sCallbackRecordCount, 4u) << "Invalid value returned for sCallbackRecordCount"; VerifyHandleOptionCallback(0, __FUNCTION__, &sOptionSetA, 'Z', "-Z", "baz-value"); VerifyHandleNonOptionArgsCallback(1, __FUNCTION__, 2); VerifyNonOptionArg(2, "non-opt-arg-1"); VerifyNonOptionArg(3, "non-opt-arg-2"); } -#endif // !CHIP_CONFIG_NON_POSIX_LONG_OPT -static void UnknownOptionTest_IgnoreUnknownShortOption() +TEST_F(TestCHIPArgParser, UnknownOptionTest_IgnoreUnknownShortOption) { bool res; @@ -604,9 +598,9 @@ static void UnknownOptionTest_IgnoreUnknownShortOption() TestArgv argsDup = DupeArgs(argv, argc); res = ParseArgs(__FUNCTION__, argc, argsDup.argv.Get(), optionSets, HandleNonOptionArgs, true); - VerifyOrQuit(res == true, "ParseArgs() returned false"); + ASSERT_TRUE(res) << "ParseArgs() returned false"; - VerifyOrQuit(sCallbackRecordCount == 5, "Invalid value returned for sCallbackRecordCount"); + ASSERT_EQ(sCallbackRecordCount, 5u) << "Invalid value returned for sCallbackRecordCount"; VerifyHandleOptionCallback(0, __FUNCTION__, &sOptionSetA, '1', "-1", nullptr); VerifyHandleOptionCallback(1, __FUNCTION__, &sOptionSetA, 'Z', "-Z", "baz-value"); @@ -615,7 +609,7 @@ static void UnknownOptionTest_IgnoreUnknownShortOption() VerifyNonOptionArg(4, "non-opt-arg-2"); } -static void MissingValueTest_MissingShortOptionValue() +TEST_F(TestCHIPArgParser, MissingValueTest_MissingShortOptionValue) { bool res; @@ -635,14 +629,14 @@ static void MissingValueTest_MissingShortOptionValue() TestArgv argsDup = DupeArgs(argv, argc); res = ParseArgs(__FUNCTION__, argc, argsDup.argv.Get(), optionSets, HandleNonOptionArgs, true); - VerifyOrQuit(res == false, "ParseArgs() returned true"); - VerifyOrQuit(sCallbackRecordCount == 1, "Invalid value returned for sCallbackRecordCount"); + ASSERT_FALSE(res) << "ParseArgs() returned true"; + ASSERT_EQ(sCallbackRecordCount, 1u) << "Invalid value returned for sCallbackRecordCount"; VerifyPrintArgErrorCallback(0); VerifyArgErrorContains(0, "Missing"); VerifyArgErrorContains(0, "-Z"); } -static void MissingValueTest_MissingLongOptionValue() +TEST_F(TestCHIPArgParser, MissingValueTest_MissingLongOptionValue) { bool res; @@ -662,8 +656,8 @@ static void MissingValueTest_MissingLongOptionValue() TestArgv argsDup = DupeArgs(argv, argc); res = ParseArgs(__FUNCTION__, argc, argsDup.argv.Get(), optionSets, HandleNonOptionArgs, true); - VerifyOrQuit(res == false, "ParseArgs() returned true"); - VerifyOrQuit(sCallbackRecordCount == 1, "Invalid value returned for sCallbackRecordCount"); + ASSERT_FALSE(res) << "ParseArgs() returned true"; + ASSERT_EQ(sCallbackRecordCount, 1u) << "Invalid value returned for sCallbackRecordCount"; VerifyPrintArgErrorCallback(0); VerifyArgErrorContains(0, "Missing"); VerifyArgErrorContains(0, "--run"); @@ -692,7 +686,7 @@ static bool HandleOption(const char * progName, OptionSet * optSet, int id, cons printf("HandleOption called: progName:%s optSet:%08lX id:%d name:%s arg:%s\n", progName, (intptr_t) optSet, id, name, arg); #endif - VerifyOrQuit(sCallbackRecordCount < kMaxCallbackRecords, "Out of callback records"); + EXPECT_LT(sCallbackRecordCount, kMaxCallbackRecords) << "Out of callback records"; sCallbackRecords[sCallbackRecordCount].Type = CallbackRecord::kHandleOption; sCallbackRecords[sCallbackRecordCount].ProgName = chip::Platform::MemoryAllocString(progName, strlen(progName)); sCallbackRecords[sCallbackRecordCount].OptSet = optSet; @@ -717,7 +711,7 @@ static bool HandleNonOptionArgs(const char * progName, int argc, char * const ar // clang-format on #endif - VerifyOrQuit(sCallbackRecordCount < kMaxCallbackRecords, "Out of callback records"); + EXPECT_LT(sCallbackRecordCount, kMaxCallbackRecords) << "Out of callback records"; sCallbackRecords[sCallbackRecordCount].Type = CallbackRecord::kHandleNonOptionArgs; sCallbackRecords[sCallbackRecordCount].ProgName = chip::Platform::MemoryAllocString(progName, strlen(progName)); sCallbackRecords[sCallbackRecordCount].Argc = argc; @@ -725,7 +719,7 @@ static bool HandleNonOptionArgs(const char * progName, int argc, char * const ar for (int i = 0; i < argc; i++) { - VerifyOrQuit(sCallbackRecordCount < kMaxCallbackRecords, "Out of callback records"); + EXPECT_LT(sCallbackRecordCount, kMaxCallbackRecords) << "Out of callback records"; sCallbackRecords[sCallbackRecordCount].Type = CallbackRecord::kNonOptionArg; sCallbackRecords[sCallbackRecordCount].Arg = chip::Platform::MemoryAllocString(argv[i], strlen(argv[i])); sCallbackRecordCount++; @@ -740,7 +734,7 @@ static void ENFORCE_FORMAT(1, 2) HandleArgError(const char * msg, ...) int status; va_list ap; - VerifyOrQuit(sCallbackRecordCount < kMaxCallbackRecords, "Out of callback records"); + ASSERT_LT(sCallbackRecordCount, kMaxCallbackRecords) << "Out of callback records"; sCallbackRecords[sCallbackRecordCount].Type = CallbackRecord::kArgError; @@ -760,51 +754,3 @@ static void ENFORCE_FORMAT(1, 2) HandleArgError(const char * msg, ...) sCallbackRecordCount++; } - -int TestCHIPArgParser() -{ - if (chip::Platform::MemoryInit() != CHIP_NO_ERROR) - { - return EXIT_FAILURE; - } - - SimpleParseTest_SingleLongOption(); - SimpleParseTest_SingleShortOption(); - SimpleParseTest_SingleLongOptionWithValue(); - SimpleParseTest_SingleShortOptionWithValue(); - SimpleParseTest_VariousShortAndLongWithArgs(); - - UnknownOptionTest_UnknownShortOption(); - UnknownOptionTest_UnknownLongOption(); - UnknownOptionTest_UnknownShortOptionAfterArgs(); - UnknownOptionTest_UnknownShortOptionAfterKnown(); - UnknownOptionTest_UnknownShortOptionBeforeKnown(); - UnknownOptionTest_UnknownLongOptionAfterArgs(); - UnknownOptionTest_IgnoreUnknownShortOption(); - - /* Skip this test because the parser successfully captures all the options - but the error reporting is incorrect in this case due to long_opt limitations */ -#ifndef CHIP_CONFIG_NON_POSIX_LONG_OPT - UnknownOptionTest_IgnoreUnknownLongOption(); -#endif // !CHIP_CONFIG_NON_POSIX_LONG_OPT - - MissingValueTest_MissingShortOptionValue(); - MissingValueTest_MissingLongOptionValue(); - - ClearCallbackRecords(); - - printf("All tests succeeded\n"); - - chip::Platform::MemoryShutdown(); - - return (EXIT_SUCCESS); -} -#else // CHIP_CONFIG_ENABLE_ARG_PARSER -int TestCHIPArgParser(void) -{ - printf("No tests were run\n"); - return (EXIT_SUCCESS); -} -#endif // CHIP_CONFIG_ENABLE_ARG_PARSER - -CHIP_REGISTER_TEST_SUITE(TestCHIPArgParser); diff --git a/src/lib/support/tests/TestPool.cpp b/src/lib/support/tests/TestPool.cpp index 963a7b3c52f7ea..da76d7ebb70d7b 100644 --- a/src/lib/support/tests/TestPool.cpp +++ b/src/lib/support/tests/TestPool.cpp @@ -25,13 +25,11 @@ #include <set> +#include <gtest/gtest.h> + #include <lib/support/Pool.h> #include <lib/support/PoolWrapper.h> -#include <lib/support/UnitTestRegistration.h> #include <system/SystemConfig.h> - -#include <nlunit-test.h> - namespace chip { template <class POOL> @@ -51,60 +49,67 @@ namespace { using namespace chip; +class TestPool : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } +}; + template <typename T, size_t N, ObjectPoolMem P> -void TestReleaseNull(nlTestSuite * inSuite, void * inContext) +void TestReleaseNull() { ObjectPool<T, N, P> pool; pool.ReleaseObject(nullptr); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(pool) == 0); - NL_TEST_ASSERT(inSuite, pool.Allocated() == 0); + EXPECT_EQ(GetNumObjectsInUse(pool), 0u); + EXPECT_EQ(pool.Allocated(), 0u); } -void TestReleaseNullStatic(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPool, TestReleaseNullStatic) { - TestReleaseNull<uint32_t, 10, ObjectPoolMem::kInline>(inSuite, inContext); + TestReleaseNull<uint32_t, 10, ObjectPoolMem::kInline>(); } #if CHIP_SYSTEM_CONFIG_POOL_USE_HEAP -void TestReleaseNullDynamic(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPool, TestReleaseNullDynamic) { - TestReleaseNull<uint32_t, 10, ObjectPoolMem::kHeap>(inSuite, inContext); + TestReleaseNull<uint32_t, 10, ObjectPoolMem::kHeap>(); } #endif // CHIP_SYSTEM_CONFIG_POOL_USE_HEAP template <typename T, size_t N, ObjectPoolMem P> -void TestCreateReleaseObject(nlTestSuite * inSuite, void * inContext) +void TestCreateReleaseObject() { ObjectPool<uint32_t, N, ObjectPoolMem::kInline> pool; uint32_t * obj[N]; - NL_TEST_ASSERT(inSuite, pool.Allocated() == 0); + EXPECT_EQ(pool.Allocated(), 0u); for (int t = 0; t < 2; ++t) { pool.ReleaseAll(); - NL_TEST_ASSERT(inSuite, pool.Allocated() == 0); + EXPECT_EQ(pool.Allocated(), 0u); for (size_t i = 0; i < N; ++i) { obj[i] = pool.CreateObject(); - NL_TEST_ASSERT(inSuite, obj[i] != nullptr); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(pool) == i + 1); - NL_TEST_ASSERT(inSuite, pool.Allocated() == i + 1); + ASSERT_NE(obj[i], nullptr); + EXPECT_EQ(GetNumObjectsInUse(pool), i + 1); + EXPECT_EQ(pool.Allocated(), i + 1); } } for (size_t i = 0; i < N; ++i) { pool.ReleaseObject(obj[i]); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(pool) == N - i - 1); - NL_TEST_ASSERT(inSuite, pool.Allocated() == N - i - 1); + EXPECT_EQ(GetNumObjectsInUse(pool), N - i - 1); + EXPECT_EQ(pool.Allocated(), N - i - 1); } } -void TestCreateReleaseObjectStatic(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPool, TestCreateReleaseObjectStatic) { constexpr const size_t kSize = 100; - TestCreateReleaseObject<uint32_t, kSize, ObjectPoolMem::kInline>(inSuite, inContext); + TestCreateReleaseObject<uint32_t, kSize, ObjectPoolMem::kInline>(); ObjectPool<uint32_t, kSize, ObjectPoolMem::kInline> pool; uint32_t * obj[kSize]; @@ -112,44 +117,44 @@ void TestCreateReleaseObjectStatic(nlTestSuite * inSuite, void * inContext) for (size_t i = 0; i < kSize; ++i) { obj[i] = pool.CreateObject(); - NL_TEST_ASSERT(inSuite, obj[i] != nullptr); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(pool) == i + 1); - NL_TEST_ASSERT(inSuite, pool.Allocated() == i + 1); + ASSERT_NE(obj[i], nullptr); + EXPECT_EQ(GetNumObjectsInUse(pool), i + 1); + EXPECT_EQ(pool.Allocated(), i + 1); } uint32_t * fail = pool.CreateObject(); - NL_TEST_ASSERT(inSuite, fail == nullptr); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(pool) == kSize); - NL_TEST_ASSERT(inSuite, pool.Allocated() == kSize); - NL_TEST_ASSERT(inSuite, pool.Exhausted()); + EXPECT_EQ(fail, nullptr); + EXPECT_EQ(GetNumObjectsInUse(pool), kSize); + EXPECT_EQ(pool.Allocated(), kSize); + EXPECT_TRUE(pool.Exhausted()); pool.ReleaseObject(obj[55]); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(pool) == kSize - 1); - NL_TEST_ASSERT(inSuite, pool.Allocated() == kSize - 1); - NL_TEST_ASSERT(inSuite, !pool.Exhausted()); - NL_TEST_ASSERT(inSuite, obj[55] == pool.CreateObject()); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(pool) == kSize); - NL_TEST_ASSERT(inSuite, pool.Allocated() == kSize); - NL_TEST_ASSERT(inSuite, pool.Exhausted()); + EXPECT_EQ(GetNumObjectsInUse(pool), kSize - 1); + EXPECT_EQ(pool.Allocated(), kSize - 1); + EXPECT_FALSE(pool.Exhausted()); + EXPECT_EQ(obj[55], pool.CreateObject()); + EXPECT_EQ(GetNumObjectsInUse(pool), kSize); + EXPECT_EQ(pool.Allocated(), kSize); + EXPECT_TRUE(pool.Exhausted()); fail = pool.CreateObject(); - NL_TEST_ASSERT(inSuite, fail == nullptr); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(pool) == kSize); - NL_TEST_ASSERT(inSuite, pool.Allocated() == kSize); - NL_TEST_ASSERT(inSuite, pool.Exhausted()); + ASSERT_EQ(fail, nullptr); + EXPECT_EQ(GetNumObjectsInUse(pool), kSize); + EXPECT_EQ(pool.Allocated(), kSize); + EXPECT_TRUE(pool.Exhausted()); pool.ReleaseAll(); } #if CHIP_SYSTEM_CONFIG_POOL_USE_HEAP -void TestCreateReleaseObjectDynamic(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPool, TestCreateReleaseObjectDynamic) { - TestCreateReleaseObject<uint32_t, 100, ObjectPoolMem::kHeap>(inSuite, inContext); + TestCreateReleaseObject<uint32_t, 100, ObjectPoolMem::kHeap>(); } #endif // CHIP_SYSTEM_CONFIG_POOL_USE_HEAP template <ObjectPoolMem P> -void TestCreateReleaseStruct(nlTestSuite * inSuite, void * inContext) +void TestCreateReleaseStruct() { struct S { @@ -166,17 +171,17 @@ void TestCreateReleaseStruct(nlTestSuite * inSuite, void * inContext) for (size_t i = 0; i < kSize; ++i) { objs2[i] = pool.CreateObject(objs1); - NL_TEST_ASSERT(inSuite, objs2[i] != nullptr); - NL_TEST_ASSERT(inSuite, pool.Allocated() == i + 1); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(pool) == i + 1); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(pool) == objs1.size()); + ASSERT_NE(objs2[i], nullptr); + EXPECT_EQ(pool.Allocated(), i + 1); + EXPECT_EQ(GetNumObjectsInUse(pool), i + 1); + EXPECT_EQ(GetNumObjectsInUse(pool), objs1.size()); } for (size_t i = 0; i < kSize; ++i) { pool.ReleaseObject(objs2[i]); - NL_TEST_ASSERT(inSuite, pool.Allocated() == kSize - i - 1); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(pool) == kSize - i - 1); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(pool) == objs1.size()); + EXPECT_EQ(pool.Allocated(), kSize - i - 1); + EXPECT_EQ(GetNumObjectsInUse(pool), kSize - i - 1); + EXPECT_EQ(GetNumObjectsInUse(pool), objs1.size()); } // Verify that ReleaseAll() calls the destructors. @@ -184,35 +189,35 @@ void TestCreateReleaseStruct(nlTestSuite * inSuite, void * inContext) { obj = pool.CreateObject(objs1); } - NL_TEST_ASSERT(inSuite, objs1.size() == kSize); - NL_TEST_ASSERT(inSuite, pool.Allocated() == kSize); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(pool) == kSize); + EXPECT_EQ(objs1.size(), kSize); + EXPECT_EQ(pool.Allocated(), kSize); + EXPECT_EQ(GetNumObjectsInUse(pool), kSize); printf("allocated = %u\n", static_cast<unsigned int>(pool.Allocated())); printf("highwater = %u\n", static_cast<unsigned int>(pool.HighWaterMark())); pool.ReleaseAll(); printf("allocated = %u\n", static_cast<unsigned int>(pool.Allocated())); printf("highwater = %u\n", static_cast<unsigned int>(pool.HighWaterMark())); - NL_TEST_ASSERT(inSuite, objs1.size() == 0); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(pool) == 0); - NL_TEST_ASSERT(inSuite, pool.Allocated() == 0); - NL_TEST_ASSERT(inSuite, pool.HighWaterMark() == kSize); + EXPECT_EQ(objs1.size(), 0u); + EXPECT_EQ(GetNumObjectsInUse(pool), 0u); + EXPECT_EQ(pool.Allocated(), 0u); + EXPECT_EQ(pool.HighWaterMark(), kSize); } -void TestCreateReleaseStructStatic(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPool, TestCreateReleaseStructStatic) { - TestCreateReleaseStruct<ObjectPoolMem::kInline>(inSuite, inContext); + TestCreateReleaseStruct<ObjectPoolMem::kInline>(); } #if CHIP_SYSTEM_CONFIG_POOL_USE_HEAP -void TestCreateReleaseStructDynamic(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPool, TestCreateReleaseStructDynamic) { - TestCreateReleaseStruct<ObjectPoolMem::kHeap>(inSuite, inContext); + TestCreateReleaseStruct<ObjectPoolMem::kHeap>(); } #endif // CHIP_SYSTEM_CONFIG_POOL_USE_HEAP template <ObjectPoolMem P> -void TestForEachActiveObject(nlTestSuite * inSuite, void * inContext) +void TestForEachActiveObject() { struct S { @@ -229,37 +234,37 @@ void TestForEachActiveObject(nlTestSuite * inSuite, void * inContext) for (size_t i = 0; i < kSize; ++i) { objArray[i] = pool.CreateObject(i); - NL_TEST_ASSERT(inSuite, objArray[i] != nullptr); - NL_TEST_ASSERT(inSuite, objArray[i]->mId == i); + ASSERT_NE(objArray[i], nullptr); + EXPECT_EQ(objArray[i]->mId, i); objIds.insert(i); } // Default constructor of an iterator should be pointing to the pool end. { typename ObjectPoolIterator<S, P>::Type defaultIterator; - NL_TEST_ASSERT(inSuite, defaultIterator == pool.end()); + EXPECT_EQ(defaultIterator, pool.end()); } // Verify that iteration visits all objects. size_t count = 0; { size_t sum = 0; - pool.ForEachActiveObject([&](S * object) { - NL_TEST_ASSERT(inSuite, object != nullptr); + pool.ForEachActiveObject([&](S * object) -> Loop { + EXPECT_NE(object, nullptr); if (object == nullptr) { - // NL_TEST_ASSERT doesn't stop running the test and we want to avoid nullptr dereference. + // Using EXPECT_NE instead of ASSERT_NE due to compilation errors when using ASSERT_NE return Loop::Continue; } - NL_TEST_ASSERT(inSuite, objIds.count(object->mId) == 1); + EXPECT_EQ(objIds.count(object->mId), 1u); objIds.erase(object->mId); ++count; sum += object->mId; return Loop::Continue; }); - NL_TEST_ASSERT(inSuite, count == kSize); - NL_TEST_ASSERT(inSuite, sum == kSize * (kSize - 1) / 2); - NL_TEST_ASSERT(inSuite, objIds.size() == 0); + EXPECT_EQ(count, kSize); + EXPECT_EQ(sum, kSize * (kSize - 1) / 2); + EXPECT_EQ(objIds.size(), 0u); } // Test begin/end iteration @@ -273,14 +278,14 @@ void TestForEachActiveObject(nlTestSuite * inSuite, void * inContext) size_t sum = 0; for (auto v = pool.begin(); v != pool.end(); ++v) { - NL_TEST_ASSERT(inSuite, objIds.count((*v)->mId) == 1); + EXPECT_EQ(objIds.count((*v)->mId), 1u); objIds.erase((*v)->mId); ++count; sum += (*v)->mId; } - NL_TEST_ASSERT(inSuite, count == kSize); - NL_TEST_ASSERT(inSuite, sum == kSize * (kSize - 1) / 2); - NL_TEST_ASSERT(inSuite, objIds.size() == 0); + EXPECT_EQ(count, kSize); + EXPECT_EQ(sum, kSize * (kSize - 1) / 2); + EXPECT_EQ(objIds.size(), 0u); } // Verify that returning Loop::Break stops iterating. @@ -289,8 +294,8 @@ void TestForEachActiveObject(nlTestSuite * inSuite, void * inContext) objIds.insert(object->mId); return ++count != kSize / 2 ? Loop::Continue : Loop::Break; }); - NL_TEST_ASSERT(inSuite, count == kSize / 2); - NL_TEST_ASSERT(inSuite, objIds.size() == kSize / 2); + EXPECT_EQ(count, kSize / 2); + EXPECT_EQ(objIds.size(), kSize / 2); // Verify that iteration can be nested. count = 0; @@ -311,8 +316,8 @@ void TestForEachActiveObject(nlTestSuite * inSuite, void * inContext) } return Loop::Continue; }); - NL_TEST_ASSERT(inSuite, count == (kSize - 1) * kSize / 2); - NL_TEST_ASSERT(inSuite, objIds.size() == 0); + EXPECT_EQ(count, (kSize - 1) * kSize / 2); + EXPECT_EQ(objIds.size(), 0u); // Verify that iteration can be nested for iterator types { @@ -346,8 +351,8 @@ void TestForEachActiveObject(nlTestSuite * inSuite, void * inContext) } } } - NL_TEST_ASSERT(inSuite, count == (kSize - 1) * kSize / 2); - NL_TEST_ASSERT(inSuite, objIds.size() == 0); + EXPECT_EQ(count, (kSize - 1) * kSize / 2); + EXPECT_EQ(objIds.size(), 0u); } count = 0; @@ -364,18 +369,18 @@ void TestForEachActiveObject(nlTestSuite * inSuite, void * inContext) } return Loop::Continue; }); - NL_TEST_ASSERT(inSuite, count == kSize); - NL_TEST_ASSERT(inSuite, objIds.size() == kSize / 2); + EXPECT_EQ(count, kSize); + EXPECT_EQ(objIds.size(), kSize / 2); for (size_t i = 0; i < kSize; ++i) { if ((i % 2) == 0) { - NL_TEST_ASSERT(inSuite, objArray[i] == nullptr); + EXPECT_EQ(objArray[i], nullptr); } else { - NL_TEST_ASSERT(inSuite, objArray[i] != nullptr); - NL_TEST_ASSERT(inSuite, objArray[i]->mId == i); + ASSERT_NE(objArray[i], nullptr); + EXPECT_EQ(objArray[i]->mId, i); } } @@ -385,19 +390,19 @@ void TestForEachActiveObject(nlTestSuite * inSuite, void * inContext) if ((object->mId % 2) == 1) { size_t id = object->mId - 1; - NL_TEST_ASSERT(inSuite, objArray[id] == nullptr); + EXPECT_EQ(objArray[id], nullptr); objArray[id] = pool.CreateObject(id); - NL_TEST_ASSERT(inSuite, objArray[id] != nullptr); + EXPECT_NE(objArray[id], nullptr); } return Loop::Continue; }); for (size_t i = 0; i < kSize; ++i) { - NL_TEST_ASSERT(inSuite, objArray[i] != nullptr); - NL_TEST_ASSERT(inSuite, objArray[i]->mId == i); + ASSERT_NE(objArray[i], nullptr); + EXPECT_EQ(objArray[i]->mId, i); } - NL_TEST_ASSERT(inSuite, count >= kSize / 2); - NL_TEST_ASSERT(inSuite, count <= kSize); + EXPECT_GE(count, kSize / 2); + EXPECT_LE(count, kSize); // Test begin/end iteration { @@ -417,25 +422,25 @@ void TestForEachActiveObject(nlTestSuite * inSuite, void * inContext) objIds.insert(object->mId); } } - NL_TEST_ASSERT(inSuite, count == kSize); - NL_TEST_ASSERT(inSuite, objIds.size() == kSize / 2); + EXPECT_EQ(count, kSize); + EXPECT_EQ(objIds.size(), kSize / 2); // validate we iterate only over active objects for (auto object : pool) { - NL_TEST_ASSERT(inSuite, (object->mId % 2) == 1); + EXPECT_EQ((object->mId % 2), 1u); } for (size_t i = 0; i < kSize; ++i) { if ((i % 2) == 0) { - NL_TEST_ASSERT(inSuite, objArray[i] == nullptr); + EXPECT_EQ(objArray[i], nullptr); } else { - NL_TEST_ASSERT(inSuite, objArray[i] != nullptr); - NL_TEST_ASSERT(inSuite, objArray[i]->mId == i); + ASSERT_NE(objArray[i], nullptr); + EXPECT_EQ(objArray[i]->mId, i); } } @@ -448,36 +453,36 @@ void TestForEachActiveObject(nlTestSuite * inSuite, void * inContext) continue; } size_t id = object->mId - 1; - NL_TEST_ASSERT(inSuite, objArray[id] == nullptr); + EXPECT_EQ(objArray[id], nullptr); objArray[id] = pool.CreateObject(id); - NL_TEST_ASSERT(inSuite, objArray[id] != nullptr); + EXPECT_NE(objArray[id], nullptr); } for (size_t i = 0; i < kSize; ++i) { - NL_TEST_ASSERT(inSuite, objArray[i] != nullptr); - NL_TEST_ASSERT(inSuite, objArray[i]->mId == i); + ASSERT_NE(objArray[i], nullptr); + EXPECT_EQ(objArray[i]->mId, i); } - NL_TEST_ASSERT(inSuite, count >= kSize / 2); - NL_TEST_ASSERT(inSuite, count <= kSize); + EXPECT_GE(count, kSize / 2); + EXPECT_LE(count, kSize); } pool.ReleaseAll(); } -void TestForEachActiveObjectStatic(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPool, TestForEachActiveObjectStatic) { - TestForEachActiveObject<ObjectPoolMem::kInline>(inSuite, inContext); + TestForEachActiveObject<ObjectPoolMem::kInline>(); } #if CHIP_SYSTEM_CONFIG_POOL_USE_HEAP -void TestForEachActiveObjectDynamic(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPool, TestForEachActiveObjectDynamic) { - TestForEachActiveObject<ObjectPoolMem::kHeap>(inSuite, inContext); + TestForEachActiveObject<ObjectPoolMem::kHeap>(); } #endif // CHIP_SYSTEM_CONFIG_POOL_USE_HEAP template <ObjectPoolMem P> -void TestPoolInterface(nlTestSuite * inSuite, void * inContext) +void TestPoolInterface() { struct TestObject { @@ -503,84 +508,40 @@ void TestPoolInterface(nlTestSuite * inSuite, void * inContext) for (size_t i = 0; i < kSize; ++i) { objs2[i] = poolHolder.mTestObjectPoolInterface.CreateObject(&bits, i); - NL_TEST_ASSERT(inSuite, objs2[i] != nullptr); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(poolHolder.mTestObjectPoolInterface) == i + 1); - NL_TEST_ASSERT(inSuite, bits == (1ul << (i + 1)) - 1); + ASSERT_NE(objs2[i], nullptr); + EXPECT_EQ(GetNumObjectsInUse(poolHolder.mTestObjectPoolInterface), i + 1); + EXPECT_EQ(bits, (1ul << (i + 1)) - 1); } for (size_t i = 0; i < kSize; ++i) { poolHolder.mTestObjectPoolInterface.ReleaseObject(objs2[i]); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(poolHolder.mTestObjectPoolInterface) == kSize - i - 1); + EXPECT_EQ(GetNumObjectsInUse(poolHolder.mTestObjectPoolInterface), kSize - i - 1); } - NL_TEST_ASSERT(inSuite, bits == 0); + EXPECT_EQ(bits, 0u); // Verify that ReleaseAll() calls the destructors. for (size_t i = 0; i < kSize; ++i) { objs2[i] = poolHolder.mTestObjectPoolInterface.CreateObject(&bits, i); } - NL_TEST_ASSERT(inSuite, bits == (1ul << kSize) - 1); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(poolHolder.mTestObjectPoolInterface) == kSize); + EXPECT_EQ(bits, (1ul << kSize) - 1); + EXPECT_EQ(GetNumObjectsInUse(poolHolder.mTestObjectPoolInterface), kSize); poolHolder.mTestObjectPoolInterface.ReleaseAll(); - NL_TEST_ASSERT(inSuite, bits == 0); - NL_TEST_ASSERT(inSuite, GetNumObjectsInUse(poolHolder.mTestObjectPoolInterface) == 0); + EXPECT_EQ(bits, 0u); + EXPECT_EQ(GetNumObjectsInUse(poolHolder.mTestObjectPoolInterface), 0u); } -void TestPoolInterfaceStatic(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPool, TestPoolInterfaceStatic) { - TestPoolInterface<ObjectPoolMem::kInline>(inSuite, inContext); + TestPoolInterface<ObjectPoolMem::kInline>(); } #if CHIP_SYSTEM_CONFIG_POOL_USE_HEAP -void TestPoolInterfaceDynamic(nlTestSuite * inSuite, void * inContext) +TEST_F(TestPool, TestPoolInterfaceDynamic) { - TestPoolInterface<ObjectPoolMem::kHeap>(inSuite, inContext); + TestPoolInterface<ObjectPoolMem::kHeap>(); } #endif // CHIP_SYSTEM_CONFIG_POOL_USE_HEAP -int Setup(void * inContext) -{ - return ::chip::Platform::MemoryInit() == CHIP_NO_ERROR ? SUCCESS : FAILURE; -} - -int Teardown(void * inContext) -{ - ::chip::Platform::MemoryShutdown(); - return SUCCESS; -} - } // namespace - -#define NL_TEST_DEF_FN(fn) NL_TEST_DEF("Test " #fn, fn) -/** - * Test Suite. It lists all the test functions. - */ -static const nlTest sTests[] = { - // clang-format off - NL_TEST_DEF_FN(TestReleaseNullStatic), - NL_TEST_DEF_FN(TestCreateReleaseObjectStatic), - NL_TEST_DEF_FN(TestCreateReleaseStructStatic), - NL_TEST_DEF_FN(TestForEachActiveObjectStatic), - NL_TEST_DEF_FN(TestPoolInterfaceStatic), -#if CHIP_SYSTEM_CONFIG_POOL_USE_HEAP - NL_TEST_DEF_FN(TestReleaseNullDynamic), - NL_TEST_DEF_FN(TestCreateReleaseObjectDynamic), - NL_TEST_DEF_FN(TestCreateReleaseStructDynamic), - NL_TEST_DEF_FN(TestForEachActiveObjectDynamic), - NL_TEST_DEF_FN(TestPoolInterfaceDynamic), -#endif // CHIP_SYSTEM_CONFIG_POOL_USE_HEAP - NL_TEST_SENTINEL() - // clang-format on -}; - -int TestPool() -{ - nlTestSuite theSuite = { "CHIP Pool tests", &sTests[0], Setup, Teardown }; - - // Run test suite against one context. - nlTestRunner(&theSuite, nullptr); - return nlTestRunnerStats(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestPool); diff --git a/src/lib/support/tests/TestStateMachine.cpp b/src/lib/support/tests/TestStateMachine.cpp index cef020e019ff74..4b6af3a73d85cf 100644 --- a/src/lib/support/tests/TestStateMachine.cpp +++ b/src/lib/support/tests/TestStateMachine.cpp @@ -16,10 +16,10 @@ * limitations under the License. */ +#include <gtest/gtest.h> + #include <lib/support/StateMachine.h> -#include <lib/support/UnitTestRegistration.h> #include <lib/support/Variant.h> -#include <nlunit-test.h> namespace { @@ -166,67 +166,67 @@ class SimpleStateMachine ~SimpleStateMachine() {} }; -void TestInit(nlTestSuite * inSuite, void * inContext) +TEST(TestStateMachine, TestInit) { // state machine initializes to State1 SimpleStateMachine fsm; - NL_TEST_ASSERT(inSuite, fsm.mStateMachine.GetState().Is<State1>()); + EXPECT_TRUE(fsm.mStateMachine.GetState().Is<State1>()); } -void TestIgnoredEvents(nlTestSuite * inSuite, void * inContext) +TEST(TestStateMachine, TestIgnoredEvents) { // in State1 - ignore Event1 and Event3 SimpleStateMachine fsm; fsm.mStateMachine.Dispatch(Event::Create<Event1>()); - NL_TEST_ASSERT(inSuite, fsm.mStateMachine.GetState().Is<State1>()); + EXPECT_TRUE(fsm.mStateMachine.GetState().Is<State1>()); fsm.mStateMachine.Dispatch(Event::Create<Event3>()); - NL_TEST_ASSERT(inSuite, fsm.mStateMachine.GetState().Is<State1>()); + EXPECT_TRUE(fsm.mStateMachine.GetState().Is<State1>()); // transition to State2 fsm.mStateMachine.Dispatch(Event::Create<Event2>()); - NL_TEST_ASSERT(inSuite, fsm.mStateMachine.GetState().Is<State2>()); + EXPECT_TRUE(fsm.mStateMachine.GetState().Is<State2>()); // in State2 - ignore Event2 and Event3 fsm.mStateMachine.Dispatch(Event::Create<Event2>()); - NL_TEST_ASSERT(inSuite, fsm.mStateMachine.GetState().Is<State2>()); + EXPECT_TRUE(fsm.mStateMachine.GetState().Is<State2>()); fsm.mStateMachine.Dispatch(Event::Create<Event3>()); - NL_TEST_ASSERT(inSuite, fsm.mStateMachine.GetState().Is<State2>()); + EXPECT_TRUE(fsm.mStateMachine.GetState().Is<State2>()); } -void TestTransitions(nlTestSuite * inSuite, void * inContext) +TEST(TestStateMachine, TestTransitions) { // in State1 SimpleStateMachine fsm; // dispatch Event2 to transition to State2 fsm.mStateMachine.Dispatch(Event::Create<Event2>()); - NL_TEST_ASSERT(inSuite, fsm.mStateMachine.GetState().Is<State2>()); + EXPECT_TRUE(fsm.mStateMachine.GetState().Is<State2>()); // dispatch Event1 to transition back to State1 fsm.mStateMachine.Dispatch(Event::Create<Event1>()); - NL_TEST_ASSERT(inSuite, fsm.mStateMachine.GetState().Is<State1>()); + EXPECT_TRUE(fsm.mStateMachine.GetState().Is<State1>()); // dispatch Event2 to transition to State2 fsm.mStateMachine.Dispatch(Event::Create<Event2>()); - NL_TEST_ASSERT(inSuite, fsm.mStateMachine.GetState().Is<State2>()); + EXPECT_TRUE(fsm.mStateMachine.GetState().Is<State2>()); // dispatch Event4 to transitions to State1. fsm.mStateMachine.Dispatch(Event::Create<Event4>()); - NL_TEST_ASSERT(inSuite, fsm.mStateMachine.GetState().Is<State1>()); + EXPECT_TRUE(fsm.mStateMachine.GetState().Is<State1>()); } -void TestTransitionsDispatch(nlTestSuite * inSuite, void * inContext) +TEST(TestStateMachine, TestTransitionsDispatch) { // in State1 SimpleStateMachine fsm; // Dispatch Event4, which in turn dispatches Event2 from the transitions // table and ultimately places us in State2. fsm.mStateMachine.Dispatch(Event::Create<Event4>()); - NL_TEST_ASSERT(inSuite, fsm.mStateMachine.GetState().Is<State2>()); + EXPECT_TRUE(fsm.mStateMachine.GetState().Is<State2>()); } -void TestNestedDispatch(nlTestSuite * inSuite, void * inContext) +TEST(TestStateMachine, TestNestedDispatch) { // in State1 SimpleStateMachine fsm; // Dispatch Event5, which places us into State3, which will dispatch // Event5 again from its Enter method to place us into State2. fsm.mStateMachine.Dispatch(Event::Create<Event5>()); - NL_TEST_ASSERT(inSuite, fsm.mStateMachine.GetState().Is<State2>()); + EXPECT_TRUE(fsm.mStateMachine.GetState().Is<State2>()); // Make sure that Enter methods execute the correct number of times. // This helps verify that pattern matching is working correctly. // Specifically, we need to verify this case: State3 creates State2 @@ -238,74 +238,45 @@ void TestNestedDispatch(nlTestSuite * inSuite, void * inContext) // been constructed when the State3 Enter method executes a second // time. The state machine pattern matching has code to explicitly // prevent this double-execution. This is testing that. - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms1.mEntered == 0); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms1.mExited == 1); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms1.mLogged == 0); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms2.mEntered == 1); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms2.mExited == 0); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms2.mLogged == 1); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms3.mEntered == 1); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms3.mExited == 1); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms3.mLogged == 1); + EXPECT_EQ(fsm.mTransitions.mFactory.ms1.mEntered, 0u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms1.mExited, 1u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms1.mLogged, 0u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms2.mEntered, 1u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms2.mExited, 0u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms2.mLogged, 1u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms3.mEntered, 1u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms3.mExited, 1u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms3.mLogged, 1u); } -void TestMethodExec(nlTestSuite * inSuite, void * inContext) +TEST(TestStateMachine, TestMethodExec) { // in State1 SimpleStateMachine fsm; // transition to State2 fsm.mStateMachine.Dispatch(Event::Create<Event2>()); - NL_TEST_ASSERT(inSuite, fsm.mStateMachine.GetState().Is<State2>()); + EXPECT_TRUE(fsm.mStateMachine.GetState().Is<State2>()); // verify expected method calls - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms1.mEntered == 0); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms1.mExited == 1); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms1.mLogged == 0); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms1.mPrevious == nullptr); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms2.mEntered == 1); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms2.mExited == 0); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms2.mLogged == 1); - NL_TEST_ASSERT(inSuite, strcmp(fsm.mTransitions.mFactory.ms2.mPrevious, "State1") == 0); + EXPECT_EQ(fsm.mTransitions.mFactory.ms1.mEntered, 0u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms1.mExited, 1u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms1.mLogged, 0u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms1.mPrevious, nullptr); + EXPECT_EQ(fsm.mTransitions.mFactory.ms2.mEntered, 1u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms2.mExited, 0u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms2.mLogged, 1u); + EXPECT_STREQ(fsm.mTransitions.mFactory.ms2.mPrevious, "State1"); // transition back to State1 fsm.mStateMachine.Dispatch(Event::Create<Event1>()); - NL_TEST_ASSERT(inSuite, fsm.mStateMachine.GetState().Is<State1>()); + EXPECT_TRUE(fsm.mStateMachine.GetState().Is<State1>()); // verify expected method calls - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms1.mEntered == 1); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms1.mExited == 1); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms1.mLogged == 1); - NL_TEST_ASSERT(inSuite, strcmp(fsm.mTransitions.mFactory.ms1.mPrevious, "State2") == 0); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms2.mEntered == 1); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms2.mExited == 1); - NL_TEST_ASSERT(inSuite, fsm.mTransitions.mFactory.ms2.mLogged == 1); - NL_TEST_ASSERT(inSuite, strcmp(fsm.mTransitions.mFactory.ms2.mPrevious, "State1") == 0); -} - -int Setup(void * inContext) -{ - return SUCCESS; -} - -int Teardown(void * inContext) -{ - return SUCCESS; + EXPECT_EQ(fsm.mTransitions.mFactory.ms1.mEntered, 1u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms1.mExited, 1u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms1.mLogged, 1u); + EXPECT_STREQ(fsm.mTransitions.mFactory.ms1.mPrevious, "State2"); + EXPECT_EQ(fsm.mTransitions.mFactory.ms2.mEntered, 1u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms2.mExited, 1u); + EXPECT_EQ(fsm.mTransitions.mFactory.ms2.mLogged, 1u); + EXPECT_STREQ(fsm.mTransitions.mFactory.ms2.mPrevious, "State1"); } } // namespace - -static const nlTest sTests[] = { - NL_TEST_DEF("TestInit", TestInit), - NL_TEST_DEF("TestIgnoredEvents", TestIgnoredEvents), - NL_TEST_DEF("TestTransitions", TestTransitions), - NL_TEST_DEF("TestTransitionsDispatch", TestTransitionsDispatch), - NL_TEST_DEF("TestNestedDispatch", TestNestedDispatch), - NL_TEST_DEF("TestMethodExec", TestMethodExec), - NL_TEST_SENTINEL(), -}; - -int StateMachineTestSuite() -{ - nlTestSuite suite = { "CHIP State Machine tests", &sTests[0], Setup, Teardown }; - nlTestRunner(&suite, nullptr); - return nlTestRunnerStats(&suite); -} - -CHIP_REGISTER_TEST_SUITE(StateMachineTestSuite); diff --git a/src/lib/support/tests/TestThreadOperationalDataset.cpp b/src/lib/support/tests/TestThreadOperationalDataset.cpp index 27e18eac87e23e..d9e13c8c25705f 100644 --- a/src/lib/support/tests/TestThreadOperationalDataset.cpp +++ b/src/lib/support/tests/TestThreadOperationalDataset.cpp @@ -14,286 +14,252 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include <lib/support/ThreadOperationalDataset.h> -#include <lib/support/UnitTestContext.h> -#include <lib/support/UnitTestRegistration.h> -#include <nlunit-test.h> +#include <gtest/gtest.h> + +#include <lib/support/CHIPMem.h> +#include <lib/support/ThreadOperationalDataset.h> namespace { using namespace chip; -void TestInit(nlTestSuite * inSuite, void * inContext) +class TestThreadOperationalDataset : public ::testing::Test +{ +public: + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } + + static Thread::OperationalDataset dataset; +}; + +Thread::OperationalDataset TestThreadOperationalDataset::dataset; + +TEST_F(TestThreadOperationalDataset, TestInit) { - Thread::OperationalDataset & dataset = *static_cast<Thread::OperationalDataset *>(inContext); uint8_t longerThanOperationalDatasetSize[255]{}; - NL_TEST_ASSERT(inSuite, dataset.Init(ByteSpan(longerThanOperationalDatasetSize)) == CHIP_ERROR_INVALID_ARGUMENT); - NL_TEST_ASSERT(inSuite, dataset.Init(ByteSpan()) == CHIP_NO_ERROR); + EXPECT_EQ(dataset.Init(ByteSpan(longerThanOperationalDatasetSize)), CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(dataset.Init(ByteSpan()), CHIP_NO_ERROR); { uint8_t data[] = { 0x01, 0x02, 0x03 }; - NL_TEST_ASSERT(inSuite, dataset.Init(ByteSpan(data)) == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(dataset.Init(ByteSpan(data)), CHIP_ERROR_INVALID_ARGUMENT); } { uint8_t data[] = { 0x01 }; - NL_TEST_ASSERT(inSuite, dataset.Init(ByteSpan(data)) == CHIP_ERROR_INVALID_ARGUMENT); + EXPECT_EQ(dataset.Init(ByteSpan(data)), CHIP_ERROR_INVALID_ARGUMENT); } } -void TestActiveTimestamp(nlTestSuite * inSuite, void * inContext) +TEST_F(TestThreadOperationalDataset, TestActiveTimestamp) { static constexpr uint64_t kActiveTimestampValue = 1; - Thread::OperationalDataset & dataset = *static_cast<Thread::OperationalDataset *>(inContext); - uint64_t activeTimestamp = 0; - NL_TEST_ASSERT(inSuite, dataset.SetActiveTimestamp(kActiveTimestampValue) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, dataset.GetActiveTimestamp(activeTimestamp) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, activeTimestamp == kActiveTimestampValue); + EXPECT_EQ(dataset.SetActiveTimestamp(kActiveTimestampValue), CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetActiveTimestamp(activeTimestamp), CHIP_NO_ERROR); + EXPECT_EQ(activeTimestamp, kActiveTimestampValue); } -void TestChannel(nlTestSuite * inSuite, void * inContext) +TEST_F(TestThreadOperationalDataset, TestChannel) { static constexpr uint16_t kChannelValue = 15; - Thread::OperationalDataset & dataset = *static_cast<Thread::OperationalDataset *>(inContext); - uint16_t channel = 0; - NL_TEST_ASSERT(inSuite, dataset.SetChannel(kChannelValue) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, dataset.GetChannel(channel) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, channel == kChannelValue); + EXPECT_EQ(dataset.SetChannel(kChannelValue), CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetChannel(channel), CHIP_NO_ERROR); + EXPECT_EQ(channel, kChannelValue); } -void TestExtendedPanId(nlTestSuite * inSuite, void * inContext) +TEST_F(TestThreadOperationalDataset, TestExtendedPanId) { static constexpr uint8_t kExtendedPanId[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 }; - Thread::OperationalDataset & dataset = *static_cast<Thread::OperationalDataset *>(inContext); - uint8_t extendedPanId[Thread::kSizeExtendedPanId] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.SetExtendedPanId(kExtendedPanId) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, dataset.GetExtendedPanId(extendedPanId) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(extendedPanId, kExtendedPanId, sizeof(kExtendedPanId)) == 0); + EXPECT_EQ(dataset.SetExtendedPanId(kExtendedPanId), CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetExtendedPanId(extendedPanId), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(extendedPanId, kExtendedPanId, sizeof(kExtendedPanId)), 0); ByteSpan span; - NL_TEST_ASSERT(inSuite, dataset.GetExtendedPanIdAsByteSpan(span) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, span.size() == sizeof(kExtendedPanId)); - NL_TEST_ASSERT(inSuite, memcmp(extendedPanId, span.data(), sizeof(kExtendedPanId)) == 0); + EXPECT_EQ(dataset.GetExtendedPanIdAsByteSpan(span), CHIP_NO_ERROR); + EXPECT_EQ(span.size(), sizeof(kExtendedPanId)); + EXPECT_EQ(memcmp(extendedPanId, span.data(), sizeof(kExtendedPanId)), 0); } -void TestMasterKey(nlTestSuite * inSuite, void * inContext) +TEST_F(TestThreadOperationalDataset, TestMasterKey) { static constexpr uint8_t kMasterKey[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; - Thread::OperationalDataset & dataset = *static_cast<Thread::OperationalDataset *>(inContext); - uint8_t masterKey[Thread::kSizeMasterKey] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.SetMasterKey(kMasterKey) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, dataset.GetMasterKey(masterKey) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(masterKey, kMasterKey, sizeof(kMasterKey)) == 0); + EXPECT_EQ(dataset.SetMasterKey(kMasterKey), CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetMasterKey(masterKey), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(masterKey, kMasterKey, sizeof(kMasterKey)), 0); } -void TestMeshLocalPrefix(nlTestSuite * inSuite, void * inContext) +TEST_F(TestThreadOperationalDataset, TestMeshLocalPrefix) { static constexpr uint8_t kMeshLocalPrefix[] = { 0xfd, 0xde, 0xad, 0x00, 0xbe, 0xef, 0x00, 0x00 }; - Thread::OperationalDataset & dataset = *static_cast<Thread::OperationalDataset *>(inContext); - uint8_t meshLocalPrefix[Thread::kSizeMeshLocalPrefix] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.SetMeshLocalPrefix(kMeshLocalPrefix) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, dataset.GetMeshLocalPrefix(meshLocalPrefix) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(meshLocalPrefix, kMeshLocalPrefix, sizeof(kMeshLocalPrefix)) == 0); + EXPECT_EQ(dataset.SetMeshLocalPrefix(kMeshLocalPrefix), CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetMeshLocalPrefix(meshLocalPrefix), CHIP_NO_ERROR); + EXPECT_EQ(memcmp(meshLocalPrefix, kMeshLocalPrefix, sizeof(kMeshLocalPrefix)), 0); } -void TestNetworkName(nlTestSuite * inSuite, void * inContext) +TEST_F(TestThreadOperationalDataset, TestNetworkName) { static constexpr char kNetworkName[] = "ThreadNetwork"; - Thread::OperationalDataset & dataset = *static_cast<Thread::OperationalDataset *>(inContext); - char networkName[Thread::kSizeNetworkName + 1] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.SetNetworkName(kNetworkName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, dataset.GetNetworkName(networkName) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, strcmp(networkName, kNetworkName) == 0); + EXPECT_EQ(dataset.SetNetworkName(kNetworkName), CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetNetworkName(networkName), CHIP_NO_ERROR); + EXPECT_STREQ(networkName, kNetworkName); - NL_TEST_ASSERT(inSuite, dataset.SetNetworkName("0123456789abcdef") == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, dataset.SetNetworkName("0123456789abcdefg") == CHIP_ERROR_INVALID_STRING_LENGTH); - NL_TEST_ASSERT(inSuite, dataset.SetNetworkName("") == CHIP_ERROR_INVALID_STRING_LENGTH); + EXPECT_EQ(dataset.SetNetworkName("0123456789abcdef"), CHIP_NO_ERROR); + EXPECT_EQ(dataset.SetNetworkName("0123456789abcdefg"), CHIP_ERROR_INVALID_STRING_LENGTH); + EXPECT_EQ(dataset.SetNetworkName(""), CHIP_ERROR_INVALID_STRING_LENGTH); } -void TestPanId(nlTestSuite * inSuite, void * inContext) +TEST_F(TestThreadOperationalDataset, TestPanId) { static constexpr uint16_t kPanIdValue = 0x1234; - Thread::OperationalDataset & dataset = *static_cast<Thread::OperationalDataset *>(inContext); - uint16_t panid = 0; - NL_TEST_ASSERT(inSuite, dataset.SetPanId(kPanIdValue) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, dataset.GetPanId(panid) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, panid == kPanIdValue); + EXPECT_EQ(dataset.SetPanId(kPanIdValue), CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetPanId(panid), CHIP_NO_ERROR); + EXPECT_EQ(panid, kPanIdValue); } -void TestPSKc(nlTestSuite * inSuite, void * inContext) +TEST_F(TestThreadOperationalDataset, TestPSKc) { static constexpr uint8_t kPSKc[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; - Thread::OperationalDataset & dataset = *static_cast<Thread::OperationalDataset *>(inContext); - uint8_t pskc[Thread::kSizePSKc] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.SetPSKc(kPSKc) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, dataset.GetPSKc(pskc) == CHIP_NO_ERROR); - NL_TEST_ASSERT(inSuite, memcmp(pskc, kPSKc, sizeof(kPSKc)) == 0); + EXPECT_EQ(dataset.SetPSKc(kPSKc), CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetPSKc(pskc), CHIP_NO_ERROR); + EXPECT_FALSE(memcmp(pskc, kPSKc, sizeof(kPSKc))); } -void TestUnsetMasterKey(nlTestSuite * inSuite, void * inContext) +TEST_F(TestThreadOperationalDataset, TestUnsetMasterKey) { - Thread::OperationalDataset & dataset = *static_cast<Thread::OperationalDataset *>(inContext); uint8_t masterKey[Thread::kSizeMasterKey] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.GetMasterKey(masterKey) == CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetMasterKey(masterKey), CHIP_NO_ERROR); dataset.UnsetMasterKey(); - NL_TEST_ASSERT(inSuite, dataset.GetMasterKey(masterKey) == CHIP_ERROR_TLV_TAG_NOT_FOUND); - NL_TEST_ASSERT(inSuite, dataset.SetMasterKey(masterKey) == CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetMasterKey(masterKey), CHIP_ERROR_TLV_TAG_NOT_FOUND); + EXPECT_EQ(dataset.SetMasterKey(masterKey), CHIP_NO_ERROR); } -void TestUnsetPSKc(nlTestSuite * inSuite, void * inContext) +TEST_F(TestThreadOperationalDataset, TestUnsetPSKc) { - Thread::OperationalDataset & dataset = *static_cast<Thread::OperationalDataset *>(inContext); uint8_t pskc[Thread::kSizePSKc] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.GetPSKc(pskc) == CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetPSKc(pskc), CHIP_NO_ERROR); dataset.UnsetPSKc(); - NL_TEST_ASSERT(inSuite, dataset.GetPSKc(pskc) == CHIP_ERROR_TLV_TAG_NOT_FOUND); - NL_TEST_ASSERT(inSuite, dataset.SetPSKc(pskc) == CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetPSKc(pskc), CHIP_ERROR_TLV_TAG_NOT_FOUND); + EXPECT_EQ(dataset.SetPSKc(pskc), CHIP_NO_ERROR); } -void TestClear(nlTestSuite * inSuite, void * inContext) +TEST_F(TestThreadOperationalDataset, TestClear) { - Thread::OperationalDataset & dataset = *static_cast<Thread::OperationalDataset *>(inContext); { uint64_t activeTimestamp; - NL_TEST_ASSERT(inSuite, dataset.GetActiveTimestamp(activeTimestamp) == CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetActiveTimestamp(activeTimestamp), CHIP_NO_ERROR); } { uint16_t channel; - NL_TEST_ASSERT(inSuite, dataset.GetChannel(channel) == CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetChannel(channel), CHIP_NO_ERROR); } { uint8_t extendedPanId[Thread::kSizeExtendedPanId] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.GetExtendedPanId(extendedPanId) == CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetExtendedPanId(extendedPanId), CHIP_NO_ERROR); } { uint8_t masterKey[Thread::kSizeMasterKey] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.GetMasterKey(masterKey) == CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetMasterKey(masterKey), CHIP_NO_ERROR); } { uint8_t meshLocalPrefix[Thread::kSizeMeshLocalPrefix] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.GetMeshLocalPrefix(meshLocalPrefix) == CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetMeshLocalPrefix(meshLocalPrefix), CHIP_NO_ERROR); } { char networkName[Thread::kSizeNetworkName + 1] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.GetNetworkName(networkName) == CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetNetworkName(networkName), CHIP_NO_ERROR); } { uint16_t panid; - NL_TEST_ASSERT(inSuite, dataset.GetPanId(panid) == CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetPanId(panid), CHIP_NO_ERROR); } { uint8_t pskc[Thread::kSizePSKc] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.GetPSKc(pskc) == CHIP_NO_ERROR); + EXPECT_EQ(dataset.GetPSKc(pskc), CHIP_NO_ERROR); } dataset.Clear(); { uint64_t activeTimestamp; - NL_TEST_ASSERT(inSuite, dataset.GetActiveTimestamp(activeTimestamp) == CHIP_ERROR_TLV_TAG_NOT_FOUND); + EXPECT_EQ(dataset.GetActiveTimestamp(activeTimestamp), CHIP_ERROR_TLV_TAG_NOT_FOUND); } { uint16_t channel; - NL_TEST_ASSERT(inSuite, dataset.GetChannel(channel) == CHIP_ERROR_TLV_TAG_NOT_FOUND); + EXPECT_EQ(dataset.GetChannel(channel), CHIP_ERROR_TLV_TAG_NOT_FOUND); } { uint8_t extendedPanId[Thread::kSizeExtendedPanId] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.GetExtendedPanId(extendedPanId) == CHIP_ERROR_TLV_TAG_NOT_FOUND); + EXPECT_EQ(dataset.GetExtendedPanId(extendedPanId), CHIP_ERROR_TLV_TAG_NOT_FOUND); } { uint8_t masterKey[Thread::kSizeMasterKey] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.GetMasterKey(masterKey) == CHIP_ERROR_TLV_TAG_NOT_FOUND); + EXPECT_EQ(dataset.GetMasterKey(masterKey), CHIP_ERROR_TLV_TAG_NOT_FOUND); } { uint8_t meshLocalPrefix[Thread::kSizeMeshLocalPrefix] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.GetMeshLocalPrefix(meshLocalPrefix) == CHIP_ERROR_TLV_TAG_NOT_FOUND); + EXPECT_EQ(dataset.GetMeshLocalPrefix(meshLocalPrefix), CHIP_ERROR_TLV_TAG_NOT_FOUND); } { char networkName[Thread::kSizeNetworkName + 1] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.GetNetworkName(networkName) == CHIP_ERROR_TLV_TAG_NOT_FOUND); + EXPECT_EQ(dataset.GetNetworkName(networkName), CHIP_ERROR_TLV_TAG_NOT_FOUND); } { uint16_t panid; - NL_TEST_ASSERT(inSuite, dataset.GetPanId(panid) == CHIP_ERROR_TLV_TAG_NOT_FOUND); + EXPECT_EQ(dataset.GetPanId(panid), CHIP_ERROR_TLV_TAG_NOT_FOUND); } { uint8_t pskc[Thread::kSizePSKc] = { 0 }; - NL_TEST_ASSERT(inSuite, dataset.GetPSKc(pskc) == CHIP_ERROR_TLV_TAG_NOT_FOUND); + EXPECT_EQ(dataset.GetPSKc(pskc), CHIP_ERROR_TLV_TAG_NOT_FOUND); } } -const nlTest sTests[] = { - NL_TEST_DEF("TestInit", TestInit), // - NL_TEST_DEF("TestActiveTimestamp", TestActiveTimestamp), // - NL_TEST_DEF("TestChannel", TestChannel), // - NL_TEST_DEF("TestExtendedPanId", TestExtendedPanId), // - NL_TEST_DEF("TestMasterKey", TestMasterKey), // - NL_TEST_DEF("TestMeshLocalPrefix", TestMeshLocalPrefix), // - NL_TEST_DEF("TestNetworkName", TestNetworkName), // - NL_TEST_DEF("TestPanId", TestPanId), // - NL_TEST_DEF("TestPSKc", TestPSKc), // - NL_TEST_DEF("TestUnsetMasterKey", TestUnsetMasterKey), // - NL_TEST_DEF("TestUnsetPSKc", TestUnsetPSKc), // - NL_TEST_DEF("TestClear", TestClear), // - NL_TEST_SENTINEL() // -}; - } // namespace - -int TestThreadOperationalDatasetBuilder() -{ - nlTestSuite theSuite = { "ThreadOperationalDataset", sTests, nullptr, nullptr }; - - return ExecuteTestsWithContext<Thread::OperationalDataset>(&theSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestThreadOperationalDatasetBuilder) 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 e3d66b49d3f644..37f0bf2c39adbf 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt @@ -4,5 +4,4 @@ ICDServerTestsNL InetLayerTests MessagingLayerTests SecureChannelTestsNL -SupportTestsNL TransportLayerTests From 26be58444bffe8f674a08ecdc893c671c9ff7a96 Mon Sep 17 00:00:00 2001 From: Stefan Agner <stefan@agner.ch> Date: Wed, 1 May 2024 16:18:33 +0200 Subject: [PATCH 096/124] [Python] Implement async friendly GetConnectedDevice (#32760) * [Python] Implement async friendly GetConnectedDevice Currently GetConnectedDeviceSync() is blocking e.g. when a new session needs to be created. This is not asyncio friendly as it blocks the whole event loop. Implement a asyncio friendly variant GetConnectedDevice() which is a co-routine function which can be awaited. * Drop bracket * Skip timeout only when passing None Change semantics slightly to make 0 mean don't wait at all. * Add API docs --- src/controller/python/chip/ChipDeviceCtrl.py | 84 +++++++++++++++++--- 1 file changed, 75 insertions(+), 9 deletions(-) diff --git a/src/controller/python/chip/ChipDeviceCtrl.py b/src/controller/python/chip/ChipDeviceCtrl.py index b553b2f85b641e..4e57e3d6044e67 100644 --- a/src/controller/python/chip/ChipDeviceCtrl.py +++ b/src/controller/python/chip/ChipDeviceCtrl.py @@ -787,8 +787,16 @@ def GetClusterHandler(self): return self._Cluster - def GetConnectedDeviceSync(self, nodeid, allowPASE=True, timeoutMs: int = None): - ''' Returns DeviceProxyWrapper upon success.''' + def GetConnectedDeviceSync(self, nodeid, allowPASE: bool = True, timeoutMs: int = None): + ''' Gets an OperationalDeviceProxy or CommissioneeDeviceProxy for the specified Node. + + nodeId: Target's Node ID + allowPASE: Get a device proxy of a device being commissioned. + timeoutMs: Timeout for a timed invoke request. Omit or set to 'None' to indicate a non-timed request. + + Returns: + - DeviceProxyWrapper on success + ''' self.CheckIsActive() returnDevice = c_void_p(None) @@ -824,7 +832,7 @@ def deviceAvailable(self, device, err): if returnDevice.value is None: with deviceAvailableCV: timeout = None - if (timeoutMs): + if timeoutMs is not None: timeout = float(timeoutMs) / 1000 ret = deviceAvailableCV.wait(timeout) @@ -836,6 +844,64 @@ def deviceAvailable(self, device, err): return DeviceProxyWrapper(returnDevice, self._dmLib) + async def GetConnectedDevice(self, nodeid, allowPASE: bool = True, timeoutMs: int = None): + ''' Gets an OperationalDeviceProxy or CommissioneeDeviceProxy for the specified Node. + + nodeId: Target's Node ID + allowPASE: Get a device proxy of a device being commissioned. + timeoutMs: Timeout for a timed invoke request. Omit or set to 'None' to indicate a non-timed request. + + Returns: + - DeviceProxyWrapper on success + ''' + self.CheckIsActive() + + if allowPASE: + returnDevice = c_void_p(None) + res = self._ChipStack.Call(lambda: self._dmLib.pychip_GetDeviceBeingCommissioned( + self.devCtrl, nodeid, byref(returnDevice)), timeoutMs) + if res.is_success: + logging.info('Using PASE connection') + return DeviceProxyWrapper(returnDevice) + + eventLoop = asyncio.get_running_loop() + future = eventLoop.create_future() + + class DeviceAvailableClosure(): + def __init__(self, loop, future: asyncio.Future): + self._returnDevice = c_void_p(None) + self._returnErr = None + self._event_loop = loop + self._future = future + + def _deviceAvailable(self): + if self._returnDevice.value is not None: + self._future.set_result(self._returnDevice) + else: + self._future.set_exception(self._returnErr.to_exception()) + + def deviceAvailable(self, device, err): + self._returnDevice = c_void_p(device) + self._returnErr = err + self._event_loop.call_soon_threadsafe(self._deviceAvailable) + ctypes.pythonapi.Py_DecRef(ctypes.py_object(self)) + + closure = DeviceAvailableClosure(eventLoop, future) + ctypes.pythonapi.Py_IncRef(ctypes.py_object(closure)) + self._ChipStack.Call(lambda: self._dmLib.pychip_GetConnectedDeviceByNodeId( + self.devCtrl, nodeid, ctypes.py_object(closure), _DeviceAvailableCallback), + timeoutMs).raise_on_error() + + # The callback might have been received synchronously (during self._ChipStack.Call()). + # In that case the Future has already been set it will return immediately + if timeoutMs is not None: + timeout = float(timeoutMs) / 1000 + await asyncio.wait_for(future, timeout=timeout) + else: + await future + + return DeviceProxyWrapper(future.result(), self._dmLib) + def ComputeRoundTripTimeout(self, nodeid, upperLayerProcessingTimeoutMs: int = 0): ''' Returns a computed timeout value based on the round-trip time it takes for the peer at the other end of the session to receive a message, process it and send it back. This is computed based on the session type, the type of transport, @@ -900,7 +966,7 @@ async def TestOnlySendBatchCommands(self, nodeid: int, commands: typing.List[Clu eventLoop = asyncio.get_running_loop() future = eventLoop.create_future() - device = self.GetConnectedDeviceSync(nodeid, timeoutMs=interactionTimeoutMs) + device = await self.GetConnectedDevice(nodeid, timeoutMs=interactionTimeoutMs) ClusterCommand.TestOnlySendBatchCommands( future, eventLoop, device.deviceProxy, commands, @@ -921,7 +987,7 @@ async def TestOnlySendCommandTimedRequestFlagWithNoTimedInvoke(self, nodeid: int eventLoop = asyncio.get_running_loop() future = eventLoop.create_future() - device = self.GetConnectedDeviceSync(nodeid, timeoutMs=None) + device = await self.GetConnectedDevice(nodeid, timeoutMs=None) ClusterCommand.TestOnlySendCommandTimedRequestFlagWithNoTimedInvoke( future, eventLoop, responseType, device.deviceProxy, ClusterCommand.CommandPath( EndpointId=endpoint, @@ -953,7 +1019,7 @@ async def SendCommand(self, nodeid: int, endpoint: int, payload: ClusterObjects. eventLoop = asyncio.get_running_loop() future = eventLoop.create_future() - device = self.GetConnectedDeviceSync(nodeid, timeoutMs=interactionTimeoutMs) + device = await self.GetConnectedDevice(nodeid, timeoutMs=interactionTimeoutMs) ClusterCommand.SendCommand( future, eventLoop, responseType, device.deviceProxy, ClusterCommand.CommandPath( EndpointId=endpoint, @@ -994,7 +1060,7 @@ async def SendBatchCommands(self, nodeid: int, commands: typing.List[ClusterComm eventLoop = asyncio.get_running_loop() future = eventLoop.create_future() - device = self.GetConnectedDeviceSync(nodeid, timeoutMs=interactionTimeoutMs) + device = await self.GetConnectedDevice(nodeid, timeoutMs=interactionTimeoutMs) ClusterCommand.SendBatchCommands( future, eventLoop, device.deviceProxy, commands, @@ -1044,7 +1110,7 @@ async def WriteAttribute(self, nodeid: int, eventLoop = asyncio.get_running_loop() future = eventLoop.create_future() - device = self.GetConnectedDeviceSync(nodeid, timeoutMs=interactionTimeoutMs) + device = await self.GetConnectedDevice(nodeid, timeoutMs=interactionTimeoutMs) attrs = [] for v in attributes: @@ -1272,7 +1338,7 @@ async def Read(self, nodeid: int, attributes: typing.List[typing.Union[ eventLoop = asyncio.get_running_loop() future = eventLoop.create_future() - device = self.GetConnectedDeviceSync(nodeid) + device = await self.GetConnectedDevice(nodeid) attributePaths = [self._parseAttributePathTuple( v) for v in attributes] if attributes else None clusterDataVersionFilters = [self._parseDataVersionFilterTuple( From 5570be922195347a1dee9187c59d3acf87ae1e94 Mon Sep 17 00:00:00 2001 From: Justin Wood <woody@apple.com> Date: Wed, 1 May 2024 08:18:15 -0700 Subject: [PATCH 097/124] Update .pullapprove.yml --- .pullapprove.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.pullapprove.yml b/.pullapprove.yml index f7da2711417441..c18d52a36eb3b9 100644 --- a/.pullapprove.yml +++ b/.pullapprove.yml @@ -173,6 +173,14 @@ groups: teams: [reviewers-samsung] reviews: request: 10 + shared-reviewers-eve: + type: optional + conditions: + - files.include('*') + reviewers: + teams: [reviewers-eve] + reviews: + request: 10 # shared-reviewers-signify disabled for now, because the reviewers-signify # team is empty and pullapprove seems to mis-handle that badly and treats # _all_ reviewers as being in this group. From f6b3594f83bef3d850a140e8e25cf967b0dc1418 Mon Sep 17 00:00:00 2001 From: fesseha-eve <88329315+fessehaeve@users.noreply.github.com> Date: Thu, 2 May 2024 12:29:30 +0200 Subject: [PATCH 098/124] Timesync improvements - part 1 (#32848) * change cluster revision in light-switch-app * added delegate functions for better usability * - made AttemptToGetTimeFromTrustedNode() public API - free readclient memory after read is complete * added default implementation for some delegate functions * added documentation for delegate functions --- .../light-switch-app.matter | 2 +- .../light-switch-common/light-switch-app.zap | 2 +- .../DefaultTimeSyncDelegate.cpp | 22 ----------------- .../DefaultTimeSyncDelegate.h | 5 ---- .../time-synchronization-delegate.h | 24 +++++++++++++++---- .../time-synchronization-server.cpp | 3 +++ .../time-synchronization-server.h | 3 ++- 7 files changed, 26 insertions(+), 35 deletions(-) diff --git a/examples/light-switch-app/light-switch-common/light-switch-app.matter b/examples/light-switch-app/light-switch-common/light-switch-app.matter index e51a772add14e2..65e7c5198a4052 100644 --- a/examples/light-switch-app/light-switch-common/light-switch-app.matter +++ b/examples/light-switch-app/light-switch-common/light-switch-app.matter @@ -2792,7 +2792,7 @@ endpoint 0 { callback attribute acceptedCommandList; callback attribute attributeList; ram attribute featureMap default = 0x0B; - ram attribute clusterRevision default = 1; + ram attribute clusterRevision default = 2; handle command SetUTCTime; handle command SetTrustedTimeSource; diff --git a/examples/light-switch-app/light-switch-common/light-switch-app.zap b/examples/light-switch-app/light-switch-common/light-switch-app.zap index ba56db35a2669b..dcfa64d7c5e88f 100644 --- a/examples/light-switch-app/light-switch-common/light-switch-app.zap +++ b/examples/light-switch-app/light-switch-common/light-switch-app.zap @@ -3826,7 +3826,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "1", + "defaultValue": "2", "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/src/app/clusters/time-synchronization-server/DefaultTimeSyncDelegate.cpp b/src/app/clusters/time-synchronization-server/DefaultTimeSyncDelegate.cpp index e436d19f6d6136..59fb8b0bbee24d 100644 --- a/src/app/clusters/time-synchronization-server/DefaultTimeSyncDelegate.cpp +++ b/src/app/clusters/time-synchronization-server/DefaultTimeSyncDelegate.cpp @@ -24,17 +24,6 @@ using chip::TimeSyncDataProvider; using namespace chip::app::Clusters::TimeSynchronization; -void DefaultTimeSyncDelegate::TimeZoneListChanged(const Span<TimeSyncDataProvider::TimeZoneStore> timeZoneList) -{ - // placeholder implementation -} - -bool DefaultTimeSyncDelegate::HandleUpdateDSTOffset(chip::CharSpan name) -{ - // placeholder implementation - return false; -} - bool DefaultTimeSyncDelegate::IsNTPAddressValid(chip::CharSpan ntp) { // placeholder implementation @@ -67,14 +56,3 @@ CHIP_ERROR DefaultTimeSyncDelegate::UpdateTimeFromPlatformSource(chip::Callback: } return CHIP_ERROR_NOT_IMPLEMENTED; } - -CHIP_ERROR DefaultTimeSyncDelegate::UpdateTimeUsingNTPFallback(const CharSpan & fallbackNTP, - chip::Callback::Callback<OnFallbackNTPCompletion> * callback) -{ - return CHIP_ERROR_NOT_IMPLEMENTED; -} - -void DefaultTimeSyncDelegate::UTCTimeAvailabilityChanged(uint64_t time) -{ - // placeholder implementation -} diff --git a/src/app/clusters/time-synchronization-server/DefaultTimeSyncDelegate.h b/src/app/clusters/time-synchronization-server/DefaultTimeSyncDelegate.h index 01f156e4ea2ccb..0d78ef2f0fe6e9 100644 --- a/src/app/clusters/time-synchronization-server/DefaultTimeSyncDelegate.h +++ b/src/app/clusters/time-synchronization-server/DefaultTimeSyncDelegate.h @@ -29,14 +29,9 @@ class DefaultTimeSyncDelegate : public Delegate public: DefaultTimeSyncDelegate() : Delegate(){}; - void TimeZoneListChanged(const Span<TimeSyncDataProvider::TimeZoneStore> timeZoneList) override; - bool HandleUpdateDSTOffset(CharSpan name) override; bool IsNTPAddressValid(CharSpan ntp) override; bool IsNTPAddressDomain(CharSpan ntp) override; CHIP_ERROR UpdateTimeFromPlatformSource(chip::Callback::Callback<OnTimeSyncCompletion> * callback) override; - CHIP_ERROR UpdateTimeUsingNTPFallback(const CharSpan & fallbackNTP, - chip::Callback::Callback<OnFallbackNTPCompletion> * callback) override; - void UTCTimeAvailabilityChanged(uint64_t time) override; }; } // namespace TimeSynchronization diff --git a/src/app/clusters/time-synchronization-server/time-synchronization-delegate.h b/src/app/clusters/time-synchronization-server/time-synchronization-delegate.h index 7d5bad65ff0d2e..f38153528118fd 100644 --- a/src/app/clusters/time-synchronization-server/time-synchronization-delegate.h +++ b/src/app/clusters/time-synchronization-server/time-synchronization-delegate.h @@ -56,7 +56,7 @@ class Delegate * * @param timeZoneList new time zone list */ - virtual void TimeZoneListChanged(const Span<TimeSyncDataProvider::TimeZoneStore> timeZoneList) = 0; + virtual void TimeZoneListChanged(const Span<TimeSyncDataProvider::TimeZoneStore> timeZoneList) {} /** * @brief Give the delegate the chance to call SetDSTOffset on the TimeSynchronizationServer with a list of * DST offsets based on the provided time zone name. If the delegate does so, it should return true. @@ -64,7 +64,7 @@ class Delegate * * @param name name of active time zone */ - virtual bool HandleUpdateDSTOffset(const CharSpan name) = 0; + virtual bool HandleUpdateDSTOffset(const CharSpan name) { return false; } /** * @brief Returns true if the provided string is a valid NTP address (either domain name or IPv6 address). * @@ -104,12 +104,26 @@ class Delegate * a CHIP_ERROR. */ virtual CHIP_ERROR UpdateTimeUsingNTPFallback(const CharSpan & fallbackNTP, - chip::Callback::Callback<OnFallbackNTPCompletion> * callback) = 0; + chip::Callback::Callback<OnFallbackNTPCompletion> * callback) + { + return CHIP_ERROR_NOT_IMPLEMENTED; + } /** - * @brief Signals application that UTCTime has changed through the timesync cluster. + * @brief Signals application that UTCTime has changed through the timesync cluster. This gets called when + * time is available for the first time or is updated. Therefore, @param time will always have a valid value. + * The negative case of time being unavailable is handled by NotifyTimeFailure(). + */ + virtual void UTCTimeAvailabilityChanged(uint64_t time) {} + /** + * @brief Signals application that a new trusted time source is available. The application can then decide + * if it wants to attempt to query for time from this source. + */ + virtual void TrustedTimeSourceAvailabilityChanged(bool available, GranularityEnum granularity) {} + /** + * @brief Signals application that fetching time has failed. The reason is not relevant. */ - virtual void UTCTimeAvailabilityChanged(uint64_t time) = 0; + virtual void NotifyTimeFailure() {} virtual ~Delegate() = default; diff --git a/src/app/clusters/time-synchronization-server/time-synchronization-server.cpp b/src/app/clusters/time-synchronization-server/time-synchronization-server.cpp index d03d7842911d51..fda3bb50d7fda0 100644 --- a/src/app/clusters/time-synchronization-server/time-synchronization-server.cpp +++ b/src/app/clusters/time-synchronization-server/time-synchronization-server.cpp @@ -215,6 +215,7 @@ static bool emitTimeFailureEvent(EndpointId ep) // TODO: re-schedule event for after min 1hr if no time is still available // https://github.com/project-chip/connectedhomeip/issues/27200 ChipLogProgress(Zcl, "Emit TimeFailure event [ep=%d]", ep); + GetDelegate()->NotifyTimeFailure(); return true; } @@ -356,6 +357,7 @@ void TimeSynchronizationServer::OnDone(ReadClient * apReadClient) SetUTCTime(kRootEndpointId, mTimeReadInfo->utcTime.Value(), ourGranularity, TimeSourceEnum::kNodeTimeCluster); if (err == CHIP_NO_ERROR) { + mTimeReadInfo = nullptr; return; } } @@ -504,6 +506,7 @@ CHIP_ERROR TimeSynchronizationServer::SetTrustedTimeSource(const DataModel::Null { AttemptToGetTime(); } + GetDelegate()->TrustedTimeSourceAvailabilityChanged(!mTrustedTimeSource.IsNull(), mGranularity); return err; } diff --git a/src/app/clusters/time-synchronization-server/time-synchronization-server.h b/src/app/clusters/time-synchronization-server/time-synchronization-server.h index ef40eaacc790c4..2581c9712e7862 100644 --- a/src/app/clusters/time-synchronization-server/time-synchronization-server.h +++ b/src/app/clusters/time-synchronization-server/time-synchronization-server.h @@ -123,6 +123,8 @@ class TimeSynchronizationServer : public FabricTable::Delegate // ReadClient::Callback functions void OnAttributeData(const ConcreteDataAttributePath & aPath, TLV::TLVReader * apData, const StatusIB & aStatus) override; void OnDone(ReadClient * apReadClient) override; + + CHIP_ERROR AttemptToGetTimeFromTrustedNode(); #endif // Platform event handler functions @@ -166,7 +168,6 @@ class TimeSynchronizationServer : public FabricTable::Delegate // Called when the platform is set up - attempts to get time using the recommended source list in the spec. void AttemptToGetTime(); - CHIP_ERROR AttemptToGetTimeFromTrustedNode(); // Attempts to get fallback NTP from the delegate (last available source) // If successful, the function will set mGranulatiry and the time source // If unsuccessful, it will emit a TimeFailure event. From de796eb65a004435fa9eefc6f19b7155f5be1fda Mon Sep 17 00:00:00 2001 From: Thirupathi S <108743108+Thirsrin@users.noreply.github.com> Date: Thu, 2 May 2024 19:20:30 +0530 Subject: [PATCH 099/124] [Linux]DGSW_2_3 fails CurrentHeapUsed is greater than CurrentHeapHighWatermark (#33252) * changes to store max heap size * Restyled by whitespace * Restyled by clang-format * typecast changes --------- Co-authored-by: Restyled.io <commits@restyled.io> --- .../Linux/DiagnosticDataProviderImpl.cpp | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/platform/Linux/DiagnosticDataProviderImpl.cpp b/src/platform/Linux/DiagnosticDataProviderImpl.cpp index 74f7003676c051..cc57da65e2d036 100644 --- a/src/platform/Linux/DiagnosticDataProviderImpl.cpp +++ b/src/platform/Linux/DiagnosticDataProviderImpl.cpp @@ -74,6 +74,9 @@ enum class WiFiStatsCountType kWiFiOverrunCount }; +// Static variable to store the maximum heap size +static size_t maxHeapHighWatermark = 0; + CHIP_ERROR GetEthernetStatsCount(EthernetStatsCountType type, uint64_t & count) { CHIP_ERROR err = CHIP_ERROR_READ_FAILED; @@ -244,6 +247,11 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetCurrentHeapUsed(uint64_t & currentHeap // the current running program. currentHeapUsed = mallocInfo.uordblks; + // Update the maximum heap high watermark if the current heap usage exceeds it. + if (currentHeapUsed > maxHeapHighWatermark) + { + maxHeapHighWatermark = currentHeapUsed; + } return CHIP_NO_ERROR; #endif } @@ -260,9 +268,15 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetCurrentHeapHighWatermark(uint64_t & cu // has been used by the Node. // On Linux, since it uses virtual memory, whereby a page of memory could be copied to // the hard disk, called swap space, and free up that page of memory. So it is impossible - // to know accurately peak physical memory it use. We just return the current heap memory - // being used by the current running program. - currentHeapHighWatermark = mallocInfo.uordblks; + // to know accurately peak physical memory it use. + // Update the maximum heap high watermark if the current heap usage exceeds it. + if (mallocInfo.uordblks > static_cast<int>(maxHeapHighWatermark)) + { + maxHeapHighWatermark = mallocInfo.uordblks; + } + + // Set the current heap high watermark. + currentHeapHighWatermark = maxHeapHighWatermark; return CHIP_NO_ERROR; #endif @@ -275,6 +289,8 @@ CHIP_ERROR DiagnosticDataProviderImpl::ResetWatermarks() // On Linux, the write operation is non-op since we always rely on the mallinfo system // function to get the current heap memory. + struct mallinfo mallocInfo = mallinfo(); + maxHeapHighWatermark = mallocInfo.uordblks; return CHIP_NO_ERROR; } From 16b8076551471b21852611cc087a87832e3581f9 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky <bzbarsky@apple.com> Date: Thu, 2 May 2024 11:37:26 -0400 Subject: [PATCH 100/124] Fix reference cycle between controller and data store in Matter.framework. (#33263) * Fix reference cycle between controller and data store in Matter.framework. Also adds some leak detection to unit tests in CI that would have caught this. * Address review comment. * Disable the leak checks for now, because we are getting unrelated positives. --- .github/workflows/darwin.yaml | 3 + .../CHIP/MTRDeviceControllerDataStore.mm | 66 ++++++++++++++----- .../CHIPTests/MTRPerControllerStorageTests.m | 10 +-- .../CHIPTests/TestHelpers/MTRTestCase.h | 28 ++++++++ .../CHIPTests/TestHelpers/MTRTestCase.mm | 44 +++++++++++++ .../Matter.xcodeproj/project.pbxproj | 6 ++ 6 files changed, 137 insertions(+), 20 deletions(-) create mode 100644 src/darwin/Framework/CHIPTests/TestHelpers/MTRTestCase.h create mode 100644 src/darwin/Framework/CHIPTests/TestHelpers/MTRTestCase.mm diff --git a/.github/workflows/darwin.yaml b/.github/workflows/darwin.yaml index dcc025b6e2b32d..62a8d08f09ec4a 100644 --- a/.github/workflows/darwin.yaml +++ b/.github/workflows/darwin.yaml @@ -83,6 +83,9 @@ jobs: -enableUndefinedBehaviorSanitizer YES - flavor: tsan arguments: -enableThreadSanitizer YES + # "leaks" does not seem to be very compatible with asan or tsan + - flavor: leaks + defines: ENABLE_LEAK_DETECTION=1 steps: - name: Checkout uses: actions/checkout@v4 diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm index 38f0bbccf0fa18..1f515f25565ca5 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm @@ -22,6 +22,7 @@ #include <lib/core/CASEAuthTag.h> #include <lib/core/NodeId.h> +#include <lib/support/CodeUtils.h> #include <lib/support/SafeInt.h> // FIXME: Are these good key strings? https://github.com/project-chip/connectedhomeip/issues/28973 @@ -106,7 +107,8 @@ static bool IsValidCATNumber(id _Nullable value) @implementation MTRDeviceControllerDataStore { id<MTRDeviceControllerStorageDelegate> _storageDelegate; dispatch_queue_t _storageDelegateQueue; - MTRDeviceController * _controller; + // Controller owns us, so we have to make sure to not keep it alive. + __weak MTRDeviceController * _controller; // Array of nodes with resumption info, oldest-stored first. NSMutableArray<NSNumber *> * _nodesWithResumptionInfo; } @@ -126,7 +128,9 @@ - (nullable instancetype)initWithController:(MTRDeviceController *)controller __block id resumptionNodeList; dispatch_sync(_storageDelegateQueue, ^{ @autoreleasepool { - resumptionNodeList = [_storageDelegate controller:_controller + // NOTE: controller, not our weak ref, since we know it's still + // valid under this sync dispatch. + resumptionNodeList = [_storageDelegate controller:controller valueForKey:sResumptionNodeListKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; @@ -154,9 +158,12 @@ - (nullable instancetype)initWithController:(MTRDeviceController *)controller - (void)fetchAttributeDataForAllDevices:(MTRDeviceControllerDataStoreClusterDataHandler)clusterDataHandler { __block NSDictionary<NSString *, id> * dataStoreSecureLocalValues = nil; + MTRDeviceController * controller = _controller; + VerifyOrReturn(controller != nil); // No way to call delegate without controller. + dispatch_sync(_storageDelegateQueue, ^{ if ([self->_storageDelegate respondsToSelector:@selector(valuesForController:securityLevel:sharingType:)]) { - dataStoreSecureLocalValues = [self->_storageDelegate valuesForController:self->_controller securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + dataStoreSecureLocalValues = [self->_storageDelegate valuesForController:controller securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; } }); @@ -177,24 +184,27 @@ - (nullable MTRCASESessionResumptionInfo *)findResumptionInfoByResumptionID:(NSD - (void)storeResumptionInfo:(MTRCASESessionResumptionInfo *)resumptionInfo { + MTRDeviceController * controller = _controller; + VerifyOrReturn(controller != nil); // No way to call delegate without controller. + auto * oldInfo = [self findResumptionInfoByNodeID:resumptionInfo.nodeID]; dispatch_sync(_storageDelegateQueue, ^{ if (oldInfo != nil) { // Remove old resumption id key. No need to do that for the // node id, because we are about to overwrite it. - [_storageDelegate controller:_controller + [_storageDelegate controller:controller removeValueForKey:ResumptionByResumptionIDKey(oldInfo.resumptionID) securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; [_nodesWithResumptionInfo removeObject:resumptionInfo.nodeID]; } - [_storageDelegate controller:_controller + [_storageDelegate controller:controller storeValue:resumptionInfo forKey:ResumptionByNodeIDKey(resumptionInfo.nodeID) securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; - [_storageDelegate controller:_controller + [_storageDelegate controller:controller storeValue:resumptionInfo forKey:ResumptionByResumptionIDKey(resumptionInfo.resumptionID) securityLevel:MTRStorageSecurityLevelSecure @@ -202,7 +212,7 @@ - (void)storeResumptionInfo:(MTRCASESessionResumptionInfo *)resumptionInfo // Update our resumption info node list. [_nodesWithResumptionInfo addObject:resumptionInfo.nodeID]; - [_storageDelegate controller:_controller + [_storageDelegate controller:controller storeValue:[_nodesWithResumptionInfo copy] forKey:sResumptionNodeListKey securityLevel:MTRStorageSecurityLevelSecure @@ -212,17 +222,20 @@ - (void)storeResumptionInfo:(MTRCASESessionResumptionInfo *)resumptionInfo - (void)clearAllResumptionInfo { + MTRDeviceController * controller = _controller; + VerifyOrReturn(controller != nil); // No way to call delegate without controller. + // Can we do less dispatch? We would need to have a version of // _findResumptionInfoWithKey that assumes we are already on the right queue. for (NSNumber * nodeID in _nodesWithResumptionInfo) { auto * oldInfo = [self findResumptionInfoByNodeID:nodeID]; if (oldInfo != nil) { dispatch_sync(_storageDelegateQueue, ^{ - [_storageDelegate controller:_controller + [_storageDelegate controller:controller removeValueForKey:ResumptionByResumptionIDKey(oldInfo.resumptionID) securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; - [_storageDelegate controller:_controller + [_storageDelegate controller:controller removeValueForKey:ResumptionByNodeIDKey(oldInfo.nodeID) securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; @@ -235,9 +248,12 @@ - (void)clearAllResumptionInfo - (CHIP_ERROR)storeLastLocallyUsedNOC:(MTRCertificateTLVBytes)noc { + MTRDeviceController * controller = _controller; + VerifyOrReturnError(controller != nil, CHIP_ERROR_PERSISTED_STORAGE_FAILED); // No way to call delegate without controller. + __block BOOL ok; dispatch_sync(_storageDelegateQueue, ^{ - ok = [_storageDelegate controller:_controller + ok = [_storageDelegate controller:controller storeValue:noc forKey:sLastLocallyUsedNOCKey securityLevel:MTRStorageSecurityLevelSecure @@ -248,10 +264,13 @@ - (CHIP_ERROR)storeLastLocallyUsedNOC:(MTRCertificateTLVBytes)noc - (MTRCertificateTLVBytes _Nullable)fetchLastLocallyUsedNOC { + MTRDeviceController * controller = _controller; + VerifyOrReturnValue(controller != nil, nil); // No way to call delegate without controller. + __block id data; dispatch_sync(_storageDelegateQueue, ^{ @autoreleasepool { - data = [_storageDelegate controller:_controller + data = [_storageDelegate controller:controller valueForKey:sLastLocallyUsedNOCKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; @@ -271,6 +290,9 @@ - (MTRCertificateTLVBytes _Nullable)fetchLastLocallyUsedNOC - (nullable MTRCASESessionResumptionInfo *)_findResumptionInfoWithKey:(nullable NSString *)key { + MTRDeviceController * controller = _controller; + VerifyOrReturnValue(controller != nil, nil); // No way to call delegate without controller. + // key could be nil if [NSString stringWithFormat] returns nil for some reason. if (key == nil) { return nil; @@ -279,7 +301,7 @@ - (nullable MTRCASESessionResumptionInfo *)_findResumptionInfoWithKey:(nullable __block id resumptionInfo; dispatch_sync(_storageDelegateQueue, ^{ @autoreleasepool { - resumptionInfo = [_storageDelegate controller:_controller + resumptionInfo = [_storageDelegate controller:controller valueForKey:key securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; @@ -318,9 +340,12 @@ - (nullable MTRCASESessionResumptionInfo *)_findResumptionInfoWithKey:(nullable - (id)_fetchAttributeCacheValueForKey:(NSString *)key expectedClass:(Class)expectedClass; { + MTRDeviceController * controller = _controller; + VerifyOrReturnValue(controller != nil, nil); // No way to call delegate without controller. + id data; @autoreleasepool { - data = [_storageDelegate controller:_controller + data = [_storageDelegate controller:controller valueForKey:key securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; @@ -338,7 +363,10 @@ - (id)_fetchAttributeCacheValueForKey:(NSString *)key expectedClass:(Class)expec - (BOOL)_storeAttributeCacheValue:(id)value forKey:(NSString *)key { - return [_storageDelegate controller:_controller + MTRDeviceController * controller = _controller; + VerifyOrReturnValue(controller != nil, NO); // No way to call delegate without controller. + + return [_storageDelegate controller:controller storeValue:value forKey:key securityLevel:MTRStorageSecurityLevelSecure @@ -347,7 +375,10 @@ - (BOOL)_storeAttributeCacheValue:(id)value forKey:(NSString *)key - (BOOL)_bulkStoreAttributeCacheValues:(NSDictionary<NSString *, id<NSSecureCoding>> *)values { - return [_storageDelegate controller:_controller + MTRDeviceController * controller = _controller; + VerifyOrReturnValue(controller != nil, NO); // No way to call delegate without controller. + + return [_storageDelegate controller:controller storeValues:values securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; @@ -355,7 +386,10 @@ - (BOOL)_bulkStoreAttributeCacheValues:(NSDictionary<NSString *, id<NSSecureCodi - (BOOL)_removeAttributeCacheValueForKey:(NSString *)key { - return [_storageDelegate controller:_controller + MTRDeviceController * controller = _controller; + VerifyOrReturnValue(controller != nil, NO); // No way to call delegate without controller. + + return [_storageDelegate controller:controller removeValueForKey:key securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; diff --git a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m index cce918d5fd410c..3c6ebfd3b5dc2f 100644 --- a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m +++ b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m @@ -16,14 +16,12 @@ #import <Matter/Matter.h> -// system dependencies -#import <XCTest/XCTest.h> - #import "MTRDeviceControllerLocalTestStorage.h" #import "MTRDeviceTestDelegate.h" #import "MTRDevice_Internal.h" #import "MTRErrorTestUtils.h" #import "MTRFabricInfoChecker.h" +#import "MTRTestCase.h" #import "MTRTestDeclarations.h" #import "MTRTestKeys.h" #import "MTRTestPerControllerStorage.h" @@ -177,7 +175,7 @@ - (void)issueOperationalCertificateForRequest:(MTROperationalCSRInfo *)csrInfo @end -@interface MTRPerControllerStorageTests : XCTestCase +@interface MTRPerControllerStorageTests : MTRTestCase @end @implementation MTRPerControllerStorageTests { @@ -353,6 +351,8 @@ - (nullable MTRDeviceController *)startControllerWithRootKeys:(MTRTestKeys *)roo - (void)test001_BasicControllerStartup { + self.detectLeaks = YES; + __auto_type * factory = [MTRDeviceControllerFactory sharedInstance]; XCTAssertNotNil(factory); @@ -401,6 +401,8 @@ - (void)test001_BasicControllerStartup - (void)test002_TryStartingTwoControllersWithSameNodeID { + self.detectLeaks = YES; + __auto_type * rootKeys = [[MTRTestKeys alloc] init]; XCTAssertNotNil(rootKeys); diff --git a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestCase.h b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestCase.h new file mode 100644 index 00000000000000..d12ea0a1f69f84 --- /dev/null +++ b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestCase.h @@ -0,0 +1,28 @@ +/** + * 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 <XCTest/XCTest.h> + +NS_ASSUME_NONNULL_BEGIN + +@interface MTRTestCase : XCTestCase +// It would be nice to do the leak-detection automatically, but running "leaks" +// on every single sub-test is slow, and some of our tests seem to have leaks +// outside Matter.framework. So have it be opt-in for now, and improve later. +@property (nonatomic) BOOL detectLeaks; +@end + +NS_ASSUME_NONNULL_END diff --git a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestCase.mm b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestCase.mm new file mode 100644 index 00000000000000..b4cf92b1ee3322 --- /dev/null +++ b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestCase.mm @@ -0,0 +1,44 @@ +/** + * 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. + */ + +#include <stdlib.h> +#include <unistd.h> + +#import "MTRTestCase.h" + +@implementation MTRTestCase + +/** + * Unfortunately, doing this in "+ (void)tearDown" (the global suite teardown) + * does not trigger a test failure even if the XCTAssertEqual fails. + */ +- (void)tearDown +{ +#if 0 +#if defined(ENABLE_LEAK_DETECTION) && ENABLE_LEAK_DETECTION + if (_detectLeaks) { + int pid = getpid(); + __auto_type * cmd = [NSString stringWithFormat:@"leaks %d", pid]; + int ret = system(cmd.UTF8String); + XCTAssertEqual(ret, 0, "LEAKS DETECTED"); + } +#endif +#endif + + [super tearDown]; +} + +@end diff --git a/src/darwin/Framework/Matter.xcodeproj/project.pbxproj b/src/darwin/Framework/Matter.xcodeproj/project.pbxproj index 03b0b105f30feb..be1712972895fb 100644 --- a/src/darwin/Framework/Matter.xcodeproj/project.pbxproj +++ b/src/darwin/Framework/Matter.xcodeproj/project.pbxproj @@ -139,6 +139,7 @@ 512431282BA0C8BF000BC136 /* SetMRPParametersCommand.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5124311C2BA0C09A000BC136 /* SetMRPParametersCommand.mm */; }; 512431292BA0C8BF000BC136 /* ResetMRPParametersCommand.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5124311A2BA0C09A000BC136 /* ResetMRPParametersCommand.mm */; }; 5129BCFD26A9EE3300122DDF /* MTRError.h in Headers */ = {isa = PBXBuildFile; fileRef = 5129BCFC26A9EE3300122DDF /* MTRError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5131BF662BE2E1B000D5D6BC /* MTRTestCase.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5131BF642BE2E1B000D5D6BC /* MTRTestCase.mm */; }; 51339B1F2A0DA64D00C798C1 /* MTRCertificateValidityTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 51339B1E2A0DA64D00C798C1 /* MTRCertificateValidityTests.m */; }; 5136661328067D550025EDAE /* MTRDeviceController_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 5136660F28067D540025EDAE /* MTRDeviceController_Internal.h */; }; 5136661428067D550025EDAE /* MTRDeviceControllerFactory.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5136661028067D540025EDAE /* MTRDeviceControllerFactory.mm */; }; @@ -549,6 +550,8 @@ 5124311B2BA0C09A000BC136 /* SetMRPParametersCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SetMRPParametersCommand.h; sourceTree = "<group>"; }; 5124311C2BA0C09A000BC136 /* SetMRPParametersCommand.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SetMRPParametersCommand.mm; sourceTree = "<group>"; }; 5129BCFC26A9EE3300122DDF /* MTRError.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRError.h; sourceTree = "<group>"; }; + 5131BF642BE2E1B000D5D6BC /* MTRTestCase.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRTestCase.mm; sourceTree = "<group>"; }; + 5131BF652BE2E1B000D5D6BC /* MTRTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRTestCase.h; sourceTree = "<group>"; }; 51339B1E2A0DA64D00C798C1 /* MTRCertificateValidityTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRCertificateValidityTests.m; sourceTree = "<group>"; }; 5136660F28067D540025EDAE /* MTRDeviceController_Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRDeviceController_Internal.h; sourceTree = "<group>"; }; 5136661028067D540025EDAE /* MTRDeviceControllerFactory.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRDeviceControllerFactory.mm; sourceTree = "<group>"; }; @@ -1119,6 +1122,8 @@ 51189FC72A33ACE900184508 /* TestHelpers */ = { isa = PBXGroup; children = ( + 5131BF652BE2E1B000D5D6BC /* MTRTestCase.h */, + 5131BF642BE2E1B000D5D6BC /* MTRTestCase.mm */, D437613F285BDC0D0051FEA2 /* MTRTestKeys.h */, 51C8E3F72825CDB600D47D00 /* MTRTestKeys.m */, D4376140285BDC0D0051FEA2 /* MTRTestStorage.h */, @@ -1974,6 +1979,7 @@ buildActionMask = 2147483647; files = ( 51742B4E29CB6B88009974FE /* MTRPairingTests.m in Sources */, + 5131BF662BE2E1B000D5D6BC /* MTRTestCase.mm in Sources */, 51669AF02913204400F4AA36 /* MTRBackwardsCompatTests.m in Sources */, 51D10D2E2808E2CA00E8CA3D /* MTRTestStorage.m in Sources */, 51D0B12A2B61766F006E3511 /* MTRServerEndpointTests.m in Sources */, From 3fa70cff7b016c24b7875102bc94ae5798c94cef Mon Sep 17 00:00:00 2001 From: Andrei Litvin <andy314@gmail.com> Date: Thu, 2 May 2024 11:47:47 -0400 Subject: [PATCH 101/124] Replace `DispatchSessionEvent` with `NotifySessionHang` on sessions. (#33259) * Replace `Dispatch event` with `NotifySessionHang` on sessions. Only a single event was ever dispatched and the pattern of passing in pointers to member methods was not used anywhere else and resulted in fairly unique code. Spelling out the `NotifySessionHang` explicitly seems to simplify maintainability. * Update src/transport/Session.h Co-authored-by: mkardous-silabs <84793247+mkardous-silabs@users.noreply.github.com> --------- Co-authored-by: mkardous-silabs <84793247+mkardous-silabs@users.noreply.github.com> --- src/messaging/ExchangeContext.cpp | 2 +- src/messaging/ReliableMessageMgr.cpp | 2 +- src/transport/Session.h | 10 +++++----- src/transport/SessionDelegate.h | 2 -- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/messaging/ExchangeContext.cpp b/src/messaging/ExchangeContext.cpp index bca044d91f230d..554e5fbce9482d 100644 --- a/src/messaging/ExchangeContext.cpp +++ b/src/messaging/ExchangeContext.cpp @@ -485,7 +485,7 @@ void ExchangeContext::NotifyResponseTimeout(bool aCloseIfNeeded) { mSession->AsSecureSession()->MarkAsDefunct(); } - mSession->DispatchSessionEvent(&SessionDelegate::OnSessionHang); + mSession->NotifySessionHang(); } } diff --git a/src/messaging/ReliableMessageMgr.cpp b/src/messaging/ReliableMessageMgr.cpp index 3827fd096d5072..17049069b71430 100644 --- a/src/messaging/ReliableMessageMgr.cpp +++ b/src/messaging/ReliableMessageMgr.cpp @@ -158,7 +158,7 @@ void ReliableMessageMgr::ExecuteActions() { session->AsSecureSession()->MarkAsDefunct(); } - session->DispatchSessionEvent(&SessionDelegate::OnSessionHang); + session->NotifySessionHang(); } // Do not StartTimer, we will schedule the timer at the end of the timer handler. diff --git a/src/transport/Session.h b/src/transport/Session.h index d9840ec3ee33f1..87937eef521110 100644 --- a/src/transport/Session.h +++ b/src/transport/Session.h @@ -114,8 +114,8 @@ class SessionHolder : public IntrusiveListNodeBase<> Transport::Session * operator->() const { return &mSession.Value().Get(); } - // There is not delegate, nothing to do here - virtual void DispatchSessionEvent(SessionDelegate::Event event) {} + // There is no delegate, nothing to do here + virtual void OnSessionHang() {} protected: // Helper for use by the Grab methods. @@ -147,7 +147,7 @@ class SessionHolderWithDelegate : public SessionHolder SessionHolder::ShiftToSession(session); } - void DispatchSessionEvent(SessionDelegate::Event event) override { (mDelegate.*event)(); } + void OnSessionHang() override { mDelegate.OnSessionHang(); } private: SessionDelegate & mDelegate; @@ -237,7 +237,7 @@ class Session void SetTCPConnection(ActiveTCPConnectionState * conn) { mTCPConnection = conn; } #endif // INET_CONFIG_ENABLE_TCP_ENDPOINT - void DispatchSessionEvent(SessionDelegate::Event event) + void NotifySessionHang() { // Holders might remove themselves when notified. auto holder = mHolders.begin(); @@ -245,7 +245,7 @@ class Session { auto cur = holder; ++holder; - cur->DispatchSessionEvent(event); + cur->OnSessionHang(); } } diff --git a/src/transport/SessionDelegate.h b/src/transport/SessionDelegate.h index 503aaa2b0c4f5c..8de535a265796c 100644 --- a/src/transport/SessionDelegate.h +++ b/src/transport/SessionDelegate.h @@ -51,8 +51,6 @@ class DLL_EXPORT SessionDelegate */ virtual NewSessionHandlingPolicy GetNewSessionHandlingPolicy() { return NewSessionHandlingPolicy::kShiftToNewSession; } - using Event = void (SessionDelegate::*)(); - /** * @brief * Called when a session is releasing. Callees SHALL NOT make synchronous calls into SessionManager to allocate a new session. From 74c95db031b0bbd44ff12de6d844dc6d3621d128 Mon Sep 17 00:00:00 2001 From: Noah Pendleton <2538614+noahp@users.noreply.github.com> Date: Thu, 2 May 2024 14:47:39 -0400 Subject: [PATCH 102/124] Support building chip-tool with python3.12 (#33242) This updates 2 python packages to versions compatible with python3.12, fixing the following errors when running `./scripts/examples/gn_build_example.sh examples/chip-tool BUILDFOLDER`: 1. `pyyaml` 6.0 build error: `AttributeError: cython_sources`, fixed [here](https://github.com/yaml/pyyaml/pull/702) 2. `construct` import error: ``` File "/tmp/pip-install-ifgk4tul/construct_6d60304f85e249759f6c184ea89f1317/construct/core.py", line 3, in <module> import struct, io, binascii, itertools, collections, pickle, sys, os, tempfile, hashlib, importlib, imp ModuleNotFoundError: No module named 'imp' ``` this was fixed [here](https://github.com/construct/construct/commit/91cc0c65f5f8ceace2ee59da5068da92519a99c9), in version `v2.10.57` of `construct`. I'm just updating to latest though. Now running `./scripts/examples/gn_build_example.sh examples/chip-tool BUILDFOLDER` succeeds when the host python is python3.12. --- scripts/setup/constraints.txt | 5 ++--- scripts/setup/requirements.esp32.txt | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/scripts/setup/constraints.txt b/scripts/setup/constraints.txt index 5d0ca805416433..ab4bea6e965a9c 100644 --- a/scripts/setup/constraints.txt +++ b/scripts/setup/constraints.txt @@ -49,7 +49,7 @@ colorama==0.4.6 # west coloredlogs==15.0.1 # via -r requirements.all.txt -construct==2.10.54 +construct==2.10.70 # via # -r requirements.esp32.txt # esp-coredump @@ -208,7 +208,7 @@ python-socketio==4.6.1 # via -r requirements.esp32.txt pytz==2022.7.1 # via pandas -pyyaml==6.0 +pyyaml==6.0.1 # via # esptool # idf-component-manager @@ -296,4 +296,3 @@ setuptools==68.0.0 # Higher versions depend on proto-plus, which break # nanopb code generation (due to name conflict of the 'proto' module) google-api-core==2.17.0 - diff --git a/scripts/setup/requirements.esp32.txt b/scripts/setup/requirements.esp32.txt index c9043a3f0418c1..b2584bbac08803 100644 --- a/scripts/setup/requirements.esp32.txt +++ b/scripts/setup/requirements.esp32.txt @@ -9,7 +9,7 @@ reedsolo>=1.5.3,<=1.5.4 bitarray==2.6.0 bitstring>=3.1.6,<4 ecdsa>=0.16.0 -construct==2.10.54 +construct>=2.10.70 python-socketio<5 itsdangerous<2.1 ; python_version < "3.11" esp_idf_monitor==1.1.1 From e0f9ede83a282e2f8f02c81124b8f4ae800492c4 Mon Sep 17 00:00:00 2001 From: Andrei Litvin <andy314@gmail.com> Date: Thu, 2 May 2024 15:06:07 -0400 Subject: [PATCH 103/124] Fix off-by-one in look checks for QName iterators. (#33273) Unit test sizes for the string `test` were off by one which masked a off-by-one comparison in QName handling. Update unit test and comparisons. This will disallow backward references to "self" for qnames. Co-authored-by: Andrei Litvin <andreilitvin@google.com> --- src/lib/dnssd/minimal_mdns/core/QName.cpp | 2 +- src/lib/dnssd/minimal_mdns/core/tests/TestQName.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/dnssd/minimal_mdns/core/QName.cpp b/src/lib/dnssd/minimal_mdns/core/QName.cpp index 2cc6488cfb1503..880c9ead298ca3 100644 --- a/src/lib/dnssd/minimal_mdns/core/QName.cpp +++ b/src/lib/dnssd/minimal_mdns/core/QName.cpp @@ -61,7 +61,7 @@ bool SerializedQNameIterator::Next(bool followIndirectPointers) } size_t offset = static_cast<size_t>(((*mCurrentPosition & 0x3F) << 8) | *(mCurrentPosition + 1)); - if (offset > mLookBehindMax) + if (offset >= mLookBehindMax) { // Potential infinite recursion. mIsValid = false; diff --git a/src/lib/dnssd/minimal_mdns/core/tests/TestQName.cpp b/src/lib/dnssd/minimal_mdns/core/tests/TestQName.cpp index 5f430bd3c76a7a..46c0b517162133 100644 --- a/src/lib/dnssd/minimal_mdns/core/tests/TestQName.cpp +++ b/src/lib/dnssd/minimal_mdns/core/tests/TestQName.cpp @@ -135,7 +135,7 @@ TEST(TestQName, InvalidReferencing) { // Infinite recursion - static const uint8_t kData[] = "\03test\xc0\x00"; + static const uint8_t kData[] = "\04test\xc0\x00"; SerializedQNameIterator it = AsSerializedQName(kData); EXPECT_TRUE(it.Next()); @@ -145,7 +145,7 @@ TEST(TestQName, InvalidReferencing) { // Infinite recursion by referencing own element (inside the stream) - static const uint8_t kData[] = "\03test\xc0\x05"; + static const uint8_t kData[] = "\04test\xc0\x05"; SerializedQNameIterator it = AsSerializedQName(kData); EXPECT_TRUE(it.Next()); @@ -164,7 +164,7 @@ TEST(TestQName, InvalidReferencing) { // Reference that goes forwad instead of backward - static const uint8_t kData[] = "\03test\xc0\x07"; + static const uint8_t kData[] = "\04test\xc0\x07"; SerializedQNameIterator it = AsSerializedQName(kData); EXPECT_TRUE(it.Next()); From baf136e3014bc9c4fad7f411372adb37c3a7f9ad Mon Sep 17 00:00:00 2001 From: Boris Zbarsky <bzbarsky@apple.com> Date: Thu, 2 May 2024 16:30:52 -0400 Subject: [PATCH 104/124] Fix leaks of keys in Matter.framework unit tests. (#33276) * Fix leaks of keys in Matter.framework unit tests. We need to CFRelease the return from SecKeyCreateWithData, and we were not doing that. * Address review comment. --- src/darwin/Framework/CHIPTests/MTRCertificateValidityTests.m | 2 ++ src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/darwin/Framework/CHIPTests/MTRCertificateValidityTests.m b/src/darwin/Framework/CHIPTests/MTRCertificateValidityTests.m index 7a66d299e19e71..65313e92789990 100644 --- a/src/darwin/Framework/CHIPTests/MTRCertificateValidityTests.m +++ b/src/darwin/Framework/CHIPTests/MTRCertificateValidityTests.m @@ -163,6 +163,8 @@ - (void)issueOperationalCertificateForRequest:(MTROperationalCSRInfo *)csrInfo __auto_type * operationalCertificate = [self issueOperationalCertificateForNode:@(kDeviceId) operationalPublicKey:operationalPublicKey]; + // Release no-longer-needed key before we do anything else. + CFRelease(operationalPublicKey); XCTAssertNotNil(operationalCertificate); __auto_type * certChain = [[MTROperationalCertificateChain alloc] initWithOperationalCertificate:operationalCertificate diff --git a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m index 3c6ebfd3b5dc2f..19f114f7877d23 100644 --- a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m +++ b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m @@ -158,6 +158,8 @@ - (void)issueOperationalCertificateForRequest:(MTROperationalCSRInfo *)csrInfo nodeID:self.nextNodeID caseAuthenticatedTags:nil error:&error]; + // Release no-longer-needed key before we do anything else. + CFRelease(publicKey); XCTAssertNil(error); XCTAssertNotNil(operationalCert); From e29eef4356cad0de4161439fbcc69fdfd8440d0a Mon Sep 17 00:00:00 2001 From: Nivi Sarkar <55898241+nivi-apple@users.noreply.github.com> Date: Thu, 2 May 2024 13:33:24 -0700 Subject: [PATCH 105/124] =?UTF-8?q?Remove=20the=20kDNSServiceFlagsTimeout?= =?UTF-8?q?=20flag=20when=20calling=20DNSServiceGetAdd=E2=80=A6=20(#33266)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove the kDNSServiceFlagsTimeout flag when calling DNSServiceGetAddrInfo - We should not be terminating the queries if we do not get anything back quickly The queries should be running until we get something back * Remove the constants for the DNSServiceFlags - Either use the DNSServiceFlags value directly in the DNS SD API calls or define a local scoped variable * Make the registerFlags const * Restyled by clang-format * Address review comment * Restyled by clang-format --------- Co-authored-by: Restyled.io <commits@restyled.io> --- src/platform/Darwin/DnssdImpl.cpp | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/platform/Darwin/DnssdImpl.cpp b/src/platform/Darwin/DnssdImpl.cpp index b80e5958310e68..37406009cf0247 100644 --- a/src/platform/Darwin/DnssdImpl.cpp +++ b/src/platform/Darwin/DnssdImpl.cpp @@ -41,12 +41,6 @@ constexpr char kSRPDot[] = "default.service.arpa."; // The extra time in milliseconds that we will wait for the resolution on the SRP domain to complete. constexpr uint16_t kSRPTimeoutInMsec = 250; -constexpr DNSServiceFlags kRegisterFlags = kDNSServiceFlagsNoAutoRename; -constexpr DNSServiceFlags kBrowseFlags = kDNSServiceFlagsShareConnection; -constexpr DNSServiceFlags kGetAddrInfoFlags = kDNSServiceFlagsTimeout | kDNSServiceFlagsShareConnection; -constexpr DNSServiceFlags kResolveFlags = kDNSServiceFlagsShareConnection; -constexpr DNSServiceFlags kReconfirmRecordFlags = 0; - bool IsSupportedProtocol(DnssdServiceProtocol protocol) { return (protocol == DnssdServiceProtocol::kDnssdProtocolUdp) || (protocol == DnssdServiceProtocol::kDnssdProtocolTcp); @@ -179,10 +173,11 @@ CHIP_ERROR Register(void * context, DnssdPublishCallback callback, uint32_t inte ChipLogProgress(Discovery, "Registering service %s on host %s with port %u and type: %s on interface id: %" PRIu32, StringOrNullMarker(name), StringOrNullMarker(hostname), port, StringOrNullMarker(type), interfaceId); - RegisterContext * sdCtx = nullptr; + constexpr DNSServiceFlags registerFlags = kDNSServiceFlagsNoAutoRename; + RegisterContext * sdCtx = nullptr; if (CHIP_NO_ERROR == MdnsContexts::GetInstance().GetRegisterContextOfTypeAndName(type, name, &sdCtx)) { - auto err = DNSServiceUpdateRecord(sdCtx->serviceRef, nullptr, kRegisterFlags, record.size(), record.data(), 0 /* ttl */); + auto err = DNSServiceUpdateRecord(sdCtx->serviceRef, nullptr, registerFlags, record.size(), record.data(), 0 /* ttl */); VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err)); return CHIP_NO_ERROR; } @@ -194,7 +189,7 @@ CHIP_ERROR Register(void * context, DnssdPublishCallback callback, uint32_t inte VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err)); DNSServiceRef sdRef; - err = DNSServiceRegister(&sdRef, kRegisterFlags, interfaceId, name, type, kLocalDot, hostname, htons(port), record.size(), + err = DNSServiceRegister(&sdRef, registerFlags, interfaceId, name, type, kLocalDot, hostname, htons(port), record.size(), record.data(), OnRegister, sdCtx); VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err)); @@ -213,7 +208,7 @@ CHIP_ERROR BrowseOnDomain(BrowseHandler * sdCtx, uint32_t interfaceId, const cha { auto sdRef = sdCtx->serviceRef; // Mandatory copy because of kDNSServiceFlagsShareConnection - auto err = DNSServiceBrowse(&sdRef, kBrowseFlags, interfaceId, type, domain, OnBrowse, sdCtx); + auto err = DNSServiceBrowse(&sdRef, kDNSServiceFlagsShareConnection, interfaceId, type, domain, OnBrowse, sdCtx); VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err)); return CHIP_NO_ERROR; } @@ -334,8 +329,8 @@ static void GetAddrInfo(ResolveContext * sdCtx) ResolveContextWithType * contextWithType = (interface.first.isSRPResult) ? &sdCtx->resolveContextWithSRPType : &sdCtx->resolveContextWithNonSRPType; - auto err = - DNSServiceGetAddrInfo(&sdRefCopy, kGetAddrInfoFlags, interfaceId, protocol, hostname, OnGetAddrInfo, contextWithType); + auto err = DNSServiceGetAddrInfo(&sdRefCopy, kDNSServiceFlagsShareConnection, interfaceId, protocol, hostname, + OnGetAddrInfo, contextWithType); VerifyOrReturn(kDNSServiceErr_NoError == err, sdCtx->Finalize(err)); interface.second.isDNSLookUpRequested = true; } @@ -372,7 +367,8 @@ static CHIP_ERROR ResolveWithContext(ResolveContext * sdCtx, uint32_t interfaceI { auto sdRef = sdCtx->serviceRef; // Mandatory copy because of kDNSServiceFlagsShareConnection - auto err = DNSServiceResolve(&sdRef, kResolveFlags, interfaceId, name, type, domain, OnResolve, contextWithType); + auto err = + DNSServiceResolve(&sdRef, kDNSServiceFlagsShareConnection, interfaceId, name, type, domain, OnResolve, contextWithType); VerifyOrReturnError(kDNSServiceErr_NoError == err, sdCtx->Finalize(err)); return CHIP_NO_ERROR; } @@ -655,7 +651,7 @@ CHIP_ERROR ChipDnssdReconfirmRecord(const char * hostname, chip::Inet::IPAddress return CHIP_ERROR_INVALID_ARGUMENT; } - auto error = DNSServiceReconfirmRecord(kReconfirmRecordFlags, interfaceId, fullname.c_str(), rrtype, rrclass, rdlen, rdata); + auto error = DNSServiceReconfirmRecord(0 /* DNSServiceFlags */, interfaceId, fullname.c_str(), rrtype, rrclass, rdlen, rdata); LogOnFailure(__func__, error); return Error::ToChipError(error); From 997ccd0b389aa7b1f00b66d85d5bd1fcf89f35d4 Mon Sep 17 00:00:00 2001 From: pankore <86098180+pankore@users.noreply.github.com> Date: Fri, 3 May 2024 04:38:19 +0800 Subject: [PATCH 106/124] [Ameba] Add Ameba crypto implementation (#33208) * [Ameba] Add Ameba crypto implementation * Add Ameba cryto implementation for security purposes * Inject only customized operational key storage * Remove the use of chip_crypto = platform, instead keep it as mbedtls, and only inject customized operaional key storage --- .../ameba/main/chipinterface.cpp | 9 + .../ameba/main/chipinterface.cpp | 10 + .../ameba/main/chipinterface.cpp | 9 + .../lighting-app/ameba/main/chipinterface.cpp | 12 +- src/platform/Ameba/BUILD.gn | 2 + src/platform/Ameba/FactoryDataDecoder.cpp | 11 + src/platform/Ameba/FactoryDataDecoder.h | 4 + src/platform/Ameba/FactoryDataProvider.cpp | 23 +- ...baPersistentStorageOperationalKeystore.cpp | 446 ++++++++++++++++++ ...mebaPersistentStorageOperationalKeystore.h | 146 ++++++ 10 files changed, 667 insertions(+), 5 deletions(-) mode change 100644 => 100755 src/platform/Ameba/FactoryDataDecoder.cpp mode change 100644 => 100755 src/platform/Ameba/FactoryDataDecoder.h create mode 100644 src/platform/Ameba/crypto/AmebaPersistentStorageOperationalKeystore.cpp create mode 100644 src/platform/Ameba/crypto/AmebaPersistentStorageOperationalKeystore.h diff --git a/examples/air-purifier-app/ameba/main/chipinterface.cpp b/examples/air-purifier-app/ameba/main/chipinterface.cpp index fd1c568afbf44f..0829bb041e4882 100644 --- a/examples/air-purifier-app/ameba/main/chipinterface.cpp +++ b/examples/air-purifier-app/ameba/main/chipinterface.cpp @@ -37,6 +37,9 @@ #include <platform/CHIPDeviceLayer.h> #include <setup_payload/ManualSetupPayloadGenerator.h> #include <setup_payload/QRCodeSetupPayloadGenerator.h> +#if CONFIG_ENABLE_AMEBA_CRYPTO +#include <platform/Ameba/crypto/AmebaPersistentStorageOperationalKeystore.h> +#endif #include <lwip_netconf.h> @@ -130,6 +133,12 @@ static void InitServer(intptr_t context) // Init ZCL Data Model and CHIP App Server static chip::CommonCaseDeviceServerInitParams initParams; (void) initParams.InitializeStaticResourcesBeforeServerInit(); +#if CONFIG_ENABLE_AMEBA_CRYPTO + ChipLogProgress(DeviceLayer, "platform crypto enabled!"); + static chip::AmebaPersistentStorageOperationalKeystore sAmebaPersistentStorageOpKeystore; + VerifyOrDie((sAmebaPersistentStorageOpKeystore.Init(initParams.persistentStorageDelegate)) == CHIP_NO_ERROR); + initParams.operationalKeystore = &sAmebaPersistentStorageOpKeystore; +#endif chip::Server::GetInstance().Init(initParams); gExampleDeviceInfoProvider.SetStorageDelegate(&Server::GetInstance().GetPersistentStorage()); chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider); diff --git a/examples/all-clusters-app/ameba/main/chipinterface.cpp b/examples/all-clusters-app/ameba/main/chipinterface.cpp index aa7cc4afe75047..2a35d86eadc3a2 100644 --- a/examples/all-clusters-app/ameba/main/chipinterface.cpp +++ b/examples/all-clusters-app/ameba/main/chipinterface.cpp @@ -41,6 +41,9 @@ #include <microwave-oven-device.h> #include <platform/Ameba/AmebaConfig.h> #include <platform/Ameba/NetworkCommissioningDriver.h> +#if CONFIG_ENABLE_AMEBA_CRYPTO +#include <platform/Ameba/crypto/AmebaPersistentStorageOperationalKeystore.h> +#endif #include <platform/CHIPDeviceLayer.h> #include <setup_payload/ManualSetupPayloadGenerator.h> #include <setup_payload/QRCodeSetupPayloadGenerator.h> @@ -153,6 +156,13 @@ static void InitServer(intptr_t context) initParams.InitializeStaticResourcesBeforeServerInit(); +#if CONFIG_ENABLE_AMEBA_CRYPTO + ChipLogProgress(DeviceLayer, "platform crypto enabled!"); + static chip::AmebaPersistentStorageOperationalKeystore sAmebaPersistentStorageOpKeystore; + VerifyOrDie((sAmebaPersistentStorageOpKeystore.Init(initParams.persistentStorageDelegate)) == CHIP_NO_ERROR); + initParams.operationalKeystore = &sAmebaPersistentStorageOpKeystore; +#endif + chip::Server::GetInstance().Init(initParams); gExampleDeviceInfoProvider.SetStorageDelegate(&Server::GetInstance().GetPersistentStorage()); // TODO: Use our own DeviceInfoProvider diff --git a/examples/light-switch-app/ameba/main/chipinterface.cpp b/examples/light-switch-app/ameba/main/chipinterface.cpp index c141769ba7d483..35d11da6342ba5 100644 --- a/examples/light-switch-app/ameba/main/chipinterface.cpp +++ b/examples/light-switch-app/ameba/main/chipinterface.cpp @@ -34,6 +34,9 @@ #include <lib/core/ErrorStr.h> #include <platform/Ameba/AmebaConfig.h> #include <platform/Ameba/NetworkCommissioningDriver.h> +#if CONFIG_ENABLE_AMEBA_CRYPTO +#include <platform/Ameba/crypto/AmebaPersistentStorageOperationalKeystore.h> +#endif #include <platform/CHIPDeviceLayer.h> #include <setup_payload/ManualSetupPayloadGenerator.h> #include <setup_payload/QRCodeSetupPayloadGenerator.h> @@ -100,6 +103,12 @@ static void InitServer(intptr_t context) // Init ZCL Data Model and CHIP App Server static chip::CommonCaseDeviceServerInitParams initParams; initParams.InitializeStaticResourcesBeforeServerInit(); +#if CONFIG_ENABLE_AMEBA_CRYPTO + ChipLogProgress(DeviceLayer, "platform crypto enabled!"); + static chip::AmebaPersistentStorageOperationalKeystore sAmebaPersistentStorageOpKeystore; + VerifyOrDie((sAmebaPersistentStorageOpKeystore.Init(initParams.persistentStorageDelegate)) == CHIP_NO_ERROR); + initParams.operationalKeystore = &sAmebaPersistentStorageOpKeystore; +#endif chip::Server::GetInstance().Init(initParams); gExampleDeviceInfoProvider.SetStorageDelegate(&Server::GetInstance().GetPersistentStorage()); chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider); diff --git a/examples/lighting-app/ameba/main/chipinterface.cpp b/examples/lighting-app/ameba/main/chipinterface.cpp index 461b8bea6143f6..76459b728a545b 100644 --- a/examples/lighting-app/ameba/main/chipinterface.cpp +++ b/examples/lighting-app/ameba/main/chipinterface.cpp @@ -35,12 +35,14 @@ #include <lib/core/ErrorStr.h> #include <platform/Ameba/AmebaConfig.h> #include <platform/Ameba/NetworkCommissioningDriver.h> +#if CONFIG_ENABLE_AMEBA_CRYPTO +#include <platform/Ameba/crypto/AmebaPersistentStorageOperationalKeystore.h> +#endif +#include <lwip_netconf.h> #include <platform/CHIPDeviceLayer.h> #include <setup_payload/ManualSetupPayloadGenerator.h> #include <setup_payload/QRCodeSetupPayloadGenerator.h> -#include <lwip_netconf.h> - #if CONFIG_ENABLE_PW_RPC #include "Rpc.h" #endif @@ -121,6 +123,12 @@ static void InitServer(intptr_t context) // Init ZCL Data Model and CHIP App Server static chip::CommonCaseDeviceServerInitParams initParams; (void) initParams.InitializeStaticResourcesBeforeServerInit(); +#if CONFIG_ENABLE_AMEBA_CRYPTO + ChipLogProgress(DeviceLayer, "platform crypto enabled!"); + static chip::AmebaPersistentStorageOperationalKeystore sAmebaPersistentStorageOpKeystore; + VerifyOrDie((sAmebaPersistentStorageOpKeystore.Init(initParams.persistentStorageDelegate)) == CHIP_NO_ERROR); + initParams.operationalKeystore = &sAmebaPersistentStorageOpKeystore; +#endif chip::Server::GetInstance().Init(initParams); gExampleDeviceInfoProvider.SetStorageDelegate(&Server::GetInstance().GetPersistentStorage()); chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider); diff --git a/src/platform/Ameba/BUILD.gn b/src/platform/Ameba/BUILD.gn index ff05b1fdeb165a..9e06191ae667ca 100755 --- a/src/platform/Ameba/BUILD.gn +++ b/src/platform/Ameba/BUILD.gn @@ -50,6 +50,8 @@ static_library("Ameba") { "SoftwareUpdateManagerImpl.h", "SystemTimeSupport.cpp", "SystemTimeSupport.h", + "crypto/AmebaPersistentStorageOperationalKeystore.cpp", + "crypto/AmebaPersistentStorageOperationalKeystore.h", ] deps = [ diff --git a/src/platform/Ameba/FactoryDataDecoder.cpp b/src/platform/Ameba/FactoryDataDecoder.cpp old mode 100644 new mode 100755 index 4e3536e3de1455..250487342bf0d9 --- a/src/platform/Ameba/FactoryDataDecoder.cpp +++ b/src/platform/Ameba/FactoryDataDecoder.cpp @@ -41,5 +41,16 @@ CHIP_ERROR FactoryDataDecoder::DecodeFactoryData(uint8_t * buffer, FactoryData * return err; } +#if CONFIG_ENABLE_AMEBA_CRYPTO +CHIP_ERROR FactoryDataDecoder::GetSign(uint8_t * PublicKeyData, size_t PublicKeySize, const unsigned char * MessageData, + size_t MessageSize, unsigned char * Signature) +{ + int32_t error = matter_get_signature(PublicKeyData, PublicKeySize, MessageData, MessageSize, Signature); + CHIP_ERROR err = CHIP_NO_ERROR; + + return err; +} +#endif + } // namespace DeviceLayer } // namespace chip diff --git a/src/platform/Ameba/FactoryDataDecoder.h b/src/platform/Ameba/FactoryDataDecoder.h old mode 100644 new mode 100755 index 623eb8e102d093..1aa295d6a4c5e8 --- a/src/platform/Ameba/FactoryDataDecoder.h +++ b/src/platform/Ameba/FactoryDataDecoder.h @@ -27,6 +27,10 @@ class FactoryDataDecoder public: CHIP_ERROR ReadFactoryData(uint8_t * buffer, uint16_t * pfactorydata_len); CHIP_ERROR DecodeFactoryData(uint8_t * buffer, FactoryData * fdata, uint16_t factorydata_len); +#if CONFIG_ENABLE_AMEBA_CRYPTO + CHIP_ERROR GetSign(uint8_t * PublicKeyData, size_t PublicKeySize, const unsigned char * MessageData, size_t MessageSize, + unsigned char * Signature); +#endif static FactoryDataDecoder & GetInstance() { static FactoryDataDecoder instance; diff --git a/src/platform/Ameba/FactoryDataProvider.cpp b/src/platform/Ameba/FactoryDataProvider.cpp index 71243a1b7cfe84..d41f85669014b8 100644 --- a/src/platform/Ameba/FactoryDataProvider.cpp +++ b/src/platform/Ameba/FactoryDataProvider.cpp @@ -16,7 +16,6 @@ */ #include "FactoryDataProvider.h" - #include "FactoryDataDecoder.h" #include <crypto/CHIPCryptoPAL.h> #include <lib/core/CHIPError.h> @@ -254,6 +253,19 @@ CHIP_ERROR FactoryDataProvider::SignWithDeviceAttestationKey(const ByteSpan & me if (kReadFromFlash) { +#if CONFIG_ENABLE_AMEBA_CRYPTO + ReturnErrorCodeIf(!mFactoryData.dac.dac_cert.value, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); + // Extract public key from DAC cert. + ByteSpan dacCertSpan{ reinterpret_cast<uint8_t *>(mFactoryData.dac.dac_cert.value), mFactoryData.dac.dac_cert.len }; + chip::Crypto::P256PublicKey dacPublicKey; + + ReturnErrorOnFailure(chip::Crypto::ExtractPubkeyFromX509Cert(dacCertSpan, dacPublicKey)); + + CHIP_ERROR err = CHIP_NO_ERROR; + FactoryDataDecoder decoder = FactoryDataDecoder::GetInstance(); + err = decoder.GetSign(dacPublicKey.Bytes(), dacPublicKey.Length(), messageToSign.data(), messageToSign.size(), + signature.Bytes()); +#else ReturnErrorCodeIf(!mFactoryData.dac.dac_cert.value, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); ReturnErrorCodeIf(!mFactoryData.dac.dac_key.value, CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND); // Extract public key from DAC cert. @@ -261,18 +273,23 @@ CHIP_ERROR FactoryDataProvider::SignWithDeviceAttestationKey(const ByteSpan & me chip::Crypto::P256PublicKey dacPublicKey; ReturnErrorOnFailure(chip::Crypto::ExtractPubkeyFromX509Cert(dacCertSpan, dacPublicKey)); + ReturnErrorOnFailure( LoadKeypairFromRaw(ByteSpan(reinterpret_cast<uint8_t *>(mFactoryData.dac.dac_key.value), mFactoryData.dac.dac_key.len), ByteSpan(dacPublicKey.Bytes(), dacPublicKey.Length()), keypair)); +#endif } else { ReturnErrorOnFailure(LoadKeypairFromRaw(ByteSpan(kDacPrivateKey), ByteSpan(kDacPublicKey), keypair)); } - +#if CONFIG_ENABLE_AMEBA_CRYPTO + VerifyOrReturnError(signature.SetLength(chip::Crypto::kP256_ECDSA_Signature_Length_Raw) == CHIP_NO_ERROR, CHIP_ERROR_INTERNAL); + return CopySpanToMutableSpan(ByteSpan{ signature.ConstBytes(), signature.Length() }, outSignBuffer); +#else ReturnErrorOnFailure(keypair.ECDSA_sign_msg(messageToSign.data(), messageToSign.size(), signature)); - return CopySpanToMutableSpan(ByteSpan{ signature.ConstBytes(), signature.Length() }, outSignBuffer); +#endif } CHIP_ERROR FactoryDataProvider::GetSetupDiscriminator(uint16_t & setupDiscriminator) diff --git a/src/platform/Ameba/crypto/AmebaPersistentStorageOperationalKeystore.cpp b/src/platform/Ameba/crypto/AmebaPersistentStorageOperationalKeystore.cpp new file mode 100644 index 00000000000000..73358f77ea4af0 --- /dev/null +++ b/src/platform/Ameba/crypto/AmebaPersistentStorageOperationalKeystore.cpp @@ -0,0 +1,446 @@ +/* + * Copyright (c) 2022 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. + */ + +#if CONFIG_ENABLE_AMEBA_CRYPTO +#include <crypto/CHIPCryptoPAL.h> +#include <crypto/CHIPCryptoPALmbedTLS.h> +#include <crypto/OperationalKeystore.h> +#include <lib/core/CHIPError.h> +#include <lib/core/CHIPPersistentStorageDelegate.h> +#include <lib/core/DataModelTypes.h> +#include <lib/core/TLV.h> +#include <lib/support/CHIPMem.h> +#include <lib/support/CodeUtils.h> +#include <lib/support/DefaultStorageKeyAllocator.h> +#include <lib/support/SafeInt.h> + +#include <lib/core/CHIPSafeCasts.h> +#include <lib/support/SafePointerCast.h> + +#include <chip_porting.h> +#include <platform/Ameba/crypto/AmebaPersistentStorageOperationalKeystore.h> + +#include <mbedtls/ecp.h> +#include <mbedtls/x509_csr.h> + +namespace chip { + +using namespace chip::Crypto; + +static inline mbedtls_ecp_keypair * to_keypair(P256KeypairContext * context) +{ + return SafePointerCast<mbedtls_ecp_keypair *>(context); +} + +static int CryptoRNG(void * ctxt, uint8_t * out_buffer, size_t out_length) +{ + return (chip::Crypto::DRBG_get_bytes(out_buffer, out_length) == CHIP_NO_ERROR) ? 0 : 1; +} + +CHIP_ERROR AmebaP256Keypair::Initialize(Crypto::ECPKeyTarget key_target) +{ + CHIP_ERROR error = CHIP_NO_ERROR; + int result = 0; + + Clear(); + + mbedtls_ecp_keypair * keypair = to_keypair(&mKeypair); + + VerifyOrExit(matter_get_publickey(Uint8::to_uchar(mPublicKey), mPublicKey.Length()) != 0, + error = CHIP_ERROR_INVALID_PUBLIC_KEY); + + keypair = nullptr; + mInitialized = true; + +exit: + if (keypair != nullptr) + { + keypair = nullptr; + } + + _log_mbedTLS_error(result); + return error; +} + +void AmebaP256Keypair::Clear() +{ + if (mInitialized) + { + mbedtls_ecp_keypair * keypair = to_keypair(&mKeypair); + mbedtls_ecp_keypair_free(keypair); + mInitialized = false; + } +} + +AmebaP256Keypair::~AmebaP256Keypair() +{ + Clear(); +} + +namespace { + +// Tags for our operational keypair storage. +constexpr TLV::Tag kOpKeyVersionTag = TLV::ContextTag(0); +constexpr TLV::Tag kOpKeyDataTag = TLV::ContextTag(1); + +// If this version grows beyond UINT16_MAX, adjust OpKeypairTLVMaxSize +// accordingly. +constexpr uint16_t kOpKeyVersion = 1; + +constexpr size_t OpKeyTLVMaxSize() +{ + // Version and serialized key + return TLV::EstimateStructOverhead(sizeof(uint16_t), Crypto::P256SerializedKeypair::Capacity()); +} + +/** WARNING: This can leave the operational key on the stack somewhere, since many of the platform + * APIs use stack buffers and do not sanitize! This implementation is for example purposes + * only of the API and it is recommended to avoid directly accessing raw private key bits + * in storage. + */ +CHIP_ERROR StoreOperationalKey(FabricIndex fabricIndex, PersistentStorageDelegate * storage, P256Keypair * keypair) +{ + VerifyOrReturnError(IsValidFabricIndex(fabricIndex) && (storage != nullptr) && (keypair != nullptr), + CHIP_ERROR_INVALID_ARGUMENT); + + // Use a SensitiveDataBuffer to get RAII secret data clearing on scope exit. + Crypto::SensitiveDataBuffer<OpKeyTLVMaxSize()> buf; + TLV::TLVWriter writer; + + writer.Init(buf.Bytes(), buf.Capacity()); + + TLV::TLVType outerType; + ReturnErrorOnFailure(writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, outerType)); + + ReturnErrorOnFailure(writer.Put(kOpKeyVersionTag, kOpKeyVersion)); + + { + // P256SerializedKeypair has RAII secret clearing + Crypto::P256SerializedKeypair serializedOpKey; + size_t len = serializedOpKey.Length() == 0 ? serializedOpKey.Capacity() : serializedOpKey.Length(); + + int result = matter_serialize(serializedOpKey.Bytes(), len); + if (result != 0) + { + return CHIP_ERROR_INTERNAL; + } + ReturnErrorOnFailure(writer.Put(kOpKeyDataTag, ByteSpan(serializedOpKey.Bytes(), len))); + } + + ReturnErrorOnFailure(writer.EndContainer(outerType)); + + const auto opKeyLength = writer.GetLengthWritten(); + VerifyOrReturnError(CanCastTo<uint16_t>(opKeyLength), CHIP_ERROR_BUFFER_TOO_SMALL); + ReturnErrorOnFailure(storage->SyncSetKeyValue(DefaultStorageKeyAllocator::FabricOpKey(fabricIndex).KeyName(), buf.ConstBytes(), + static_cast<uint16_t>(opKeyLength))); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR ExportStoredOpKey(FabricIndex fabricIndex, PersistentStorageDelegate * storage, + Crypto::P256SerializedKeypair & serializedOpKey) +{ + VerifyOrReturnError(storage != nullptr, CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrReturnError(IsValidFabricIndex(fabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX); + + // Use a SensitiveDataBuffer to get RAII secret data clearing on scope exit. + Crypto::SensitiveDataBuffer<OpKeyTLVMaxSize()> buf; + + // Load up the operational key structure from storage + uint16_t size = static_cast<uint16_t>(buf.Capacity()); + ReturnErrorOnFailure( + storage->SyncGetKeyValue(DefaultStorageKeyAllocator::FabricOpKey(fabricIndex).KeyName(), buf.Bytes(), size)); + + buf.SetLength(static_cast<size_t>(size)); + + // Read-out the operational key TLV entry. + TLV::ContiguousBufferTLVReader reader; + reader.Init(buf.Bytes(), buf.Length()); + + ReturnErrorOnFailure(reader.Next(TLV::kTLVType_Structure, TLV::AnonymousTag())); + TLV::TLVType containerType; + ReturnErrorOnFailure(reader.EnterContainer(containerType)); + + ReturnErrorOnFailure(reader.Next(kOpKeyVersionTag)); + uint16_t opKeyVersion; + ReturnErrorOnFailure(reader.Get(opKeyVersion)); + VerifyOrReturnError(opKeyVersion == kOpKeyVersion, CHIP_ERROR_VERSION_MISMATCH); + + ReturnErrorOnFailure(reader.Next(kOpKeyDataTag)); + { + ByteSpan keyData; + ReturnErrorOnFailure(reader.GetByteView(keyData)); + + // Unfortunately, we have to copy the data into a P256SerializedKeypair. + VerifyOrReturnError(keyData.size() <= serializedOpKey.Capacity(), CHIP_ERROR_BUFFER_TOO_SMALL); + + ReturnErrorOnFailure(reader.ExitContainer(containerType)); + + memcpy(serializedOpKey.Bytes(), keyData.data(), keyData.size()); + serializedOpKey.SetLength(keyData.size()); + } + + return CHIP_NO_ERROR; +} + +/** WARNING: This can leave the operational key on the stack somewhere, since many of the platform + * APIs use stack buffers and do not sanitize! This implementation is for example purposes + * only of the API and it is recommended to avoid directly accessing raw private key bits + * in storage. + */ +CHIP_ERROR SignWithStoredOpKey(FabricIndex fabricIndex, PersistentStorageDelegate * storage, const ByteSpan & message, + P256ECDSASignature & outSignature) +{ + VerifyOrReturnError(IsValidFabricIndex(fabricIndex) && (storage != nullptr), CHIP_ERROR_INVALID_ARGUMENT); + + // Use RAII scoping for the transient keypair, to make sure it doesn't get leaked on any error paths. + // Key is put in heap since signature is a costly stack operation and P256Keypair is + // a costly class depending on the backend. + auto transientOperationalKeypair = Platform::MakeUnique<P256Keypair>(); + if (!transientOperationalKeypair) + { + return CHIP_ERROR_NO_MEMORY; + } + + // Scope 1: Load up the keypair data from storage + P256SerializedKeypair serializedOpKey; + CHIP_ERROR err = ExportStoredOpKey(fabricIndex, storage, serializedOpKey); + if (CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND == err) + { + return CHIP_ERROR_INVALID_FABRIC_INDEX; + } + + // Load-up key material + // WARNING: This makes use of the raw key bits + int result = matter_deserialize(serializedOpKey.Bytes(), serializedOpKey.Length()); + if (result != 0) + { + return CHIP_ERROR_INTERNAL; + } + + // Scope 2: Sign message with the keypair + result = matter_ecdsa_sign_msg(message.data(), message.size(), outSignature.Bytes()); + if (result != 0) + { + return CHIP_ERROR_INTERNAL; + } + + VerifyOrReturnError(outSignature.SetLength(kP256_ECDSA_Signature_Length_Raw) == CHIP_NO_ERROR, err = CHIP_ERROR_INTERNAL); + return err; +} + +} // namespace + +bool AmebaPersistentStorageOperationalKeystore::HasOpKeypairForFabric(FabricIndex fabricIndex) const +{ + VerifyOrReturnError(mStorage != nullptr, false); + VerifyOrReturnError(IsValidFabricIndex(fabricIndex), false); + + // If there was a pending keypair, then there's really a usable key + if (mIsPendingKeypairActive && (fabricIndex == mPendingFabricIndex) && (mPendingKeypair != nullptr)) + { + return true; + } + + // TODO(#16958): need to actually read the key to know if it's there due to platforms not + // properly enforcing CHIP_ERROR_BUFFER_TOO_SMALL behavior needed by + // PersistentStorageDelegate. Very unfortunate, needs fixing ASAP. + + // Use a SensitiveDataBuffer to get RAII secret data clearing on scope exit. + Crypto::SensitiveDataBuffer<OpKeyTLVMaxSize()> buf; + + uint16_t keySize = static_cast<uint16_t>(buf.Capacity()); + CHIP_ERROR err = + mStorage->SyncGetKeyValue(DefaultStorageKeyAllocator::FabricOpKey(fabricIndex).KeyName(), buf.Bytes(), keySize); + + return (err == CHIP_NO_ERROR); +} + +CHIP_ERROR AmebaPersistentStorageOperationalKeystore::NewOpKeypairForFabric(FabricIndex fabricIndex, + MutableByteSpan & outCertificateSigningRequest) +{ + VerifyOrReturnError(mStorage != nullptr, CHIP_ERROR_INCORRECT_STATE); + VerifyOrReturnError(IsValidFabricIndex(fabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX); + // If a key is pending, we cannot generate for a different fabric index until we commit or revert. + if ((mPendingFabricIndex != kUndefinedFabricIndex) && (fabricIndex != mPendingFabricIndex)) + { + return CHIP_ERROR_INVALID_FABRIC_INDEX; + } + VerifyOrReturnError(outCertificateSigningRequest.size() >= Crypto::kMIN_CSR_Buffer_Size, CHIP_ERROR_BUFFER_TOO_SMALL); + + // Replace previous pending keypair, if any was previously allocated + ResetPendingKey(); + + mPendingKeypair = Platform::New<P256Keypair>(); + VerifyOrReturnError(mPendingKeypair != nullptr, CHIP_ERROR_NO_MEMORY); + + size_t TempLength = outCertificateSigningRequest.size(); + size_t csrLength = matter_gen_new_csr(outCertificateSigningRequest.data(), TempLength); + + if (csrLength <= 0) + { + ResetPendingKey(); + return CHIP_ERROR_INTERNAL; + } + + outCertificateSigningRequest.reduce_size(csrLength); + mPendingFabricIndex = fabricIndex; + + return CHIP_NO_ERROR; +} + +CHIP_ERROR AmebaPersistentStorageOperationalKeystore::ActivateOpKeypairForFabric(FabricIndex fabricIndex, + const Crypto::P256PublicKey & nocPublicKey) +{ + VerifyOrReturnError(mStorage != nullptr, CHIP_ERROR_INCORRECT_STATE); + VerifyOrReturnError(mPendingKeypair != nullptr, CHIP_ERROR_INVALID_FABRIC_INDEX); + VerifyOrReturnError(IsValidFabricIndex(fabricIndex) && (fabricIndex == mPendingFabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX); + + // Validate public key being activated matches last generated pending keypair + mPendingKeypair = Platform::New<AmebaP256Keypair>(); + VerifyOrReturnError(mPendingKeypair != nullptr, CHIP_ERROR_NO_MEMORY); + mPendingKeypair->Initialize(Crypto::ECPKeyTarget::ECDSA); + VerifyOrReturnError(mPendingKeypair->Pubkey().Matches(nocPublicKey), CHIP_ERROR_INVALID_PUBLIC_KEY); + + mIsPendingKeypairActive = true; + + return CHIP_NO_ERROR; +} + +CHIP_ERROR AmebaPersistentStorageOperationalKeystore::CommitOpKeypairForFabric(FabricIndex fabricIndex) +{ + VerifyOrReturnError(mStorage != nullptr, CHIP_ERROR_INCORRECT_STATE); + VerifyOrReturnError(mPendingKeypair != nullptr, CHIP_ERROR_INVALID_FABRIC_INDEX); + VerifyOrReturnError(IsValidFabricIndex(fabricIndex) && (fabricIndex == mPendingFabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX); + VerifyOrReturnError(mIsPendingKeypairActive == true, CHIP_ERROR_INCORRECT_STATE); + + // Try to store persistent key. On failure, leave everything pending as-is + CHIP_ERROR err = StoreOperationalKey(fabricIndex, mStorage, mPendingKeypair); + ReturnErrorOnFailure(err); + + // If we got here, we succeeded and can reset the pending key: next `SignWithOpKeypair` will use the stored key. + ResetPendingKey(); + return CHIP_NO_ERROR; +} + +CHIP_ERROR AmebaPersistentStorageOperationalKeystore::ExportOpKeypairForFabric(FabricIndex fabricIndex, + Crypto::P256SerializedKeypair & outKeypair) +{ + VerifyOrReturnError(mStorage != nullptr, CHIP_ERROR_INCORRECT_STATE); + return ExportStoredOpKey(fabricIndex, mStorage, outKeypair); +} + +CHIP_ERROR AmebaPersistentStorageOperationalKeystore::RemoveOpKeypairForFabric(FabricIndex fabricIndex) +{ + VerifyOrReturnError(mStorage != nullptr, CHIP_ERROR_INCORRECT_STATE); + VerifyOrReturnError(IsValidFabricIndex(fabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX); + + // Remove pending state if matching + if ((mPendingKeypair != nullptr) && (fabricIndex == mPendingFabricIndex)) + { + RevertPendingKeypair(); + } + + CHIP_ERROR err = mStorage->SyncDeleteKeyValue(DefaultStorageKeyAllocator::FabricOpKey(fabricIndex).KeyName()); + if (err == CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND) + { + err = CHIP_ERROR_INVALID_FABRIC_INDEX; + } + + return err; +} + +void AmebaPersistentStorageOperationalKeystore::RevertPendingKeypair() +{ + VerifyOrReturn(mStorage != nullptr); + + // Just reset the pending key, we never stored anything + ResetPendingKey(); +} + +CHIP_ERROR AmebaPersistentStorageOperationalKeystore::SignWithOpKeypair(FabricIndex fabricIndex, const ByteSpan & message, + Crypto::P256ECDSASignature & outSignature) const +{ + VerifyOrReturnError(mStorage != nullptr, CHIP_ERROR_INCORRECT_STATE); + VerifyOrReturnError(IsValidFabricIndex(fabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX); + + if (mIsPendingKeypairActive && (fabricIndex == mPendingFabricIndex)) + { + VerifyOrReturnError(mPendingKeypair != nullptr, CHIP_ERROR_INTERNAL); + // We have an override key: sign with it! + CHIP_ERROR err = CHIP_NO_ERROR; + if (matter_ecdsa_sign_msg(message.data(), message.size(), outSignature.Bytes()) != 0) + { + return CHIP_ERROR_INTERNAL; + } + VerifyOrReturnError(outSignature.SetLength(kP256_ECDSA_Signature_Length_Raw) == CHIP_NO_ERROR, err = CHIP_ERROR_INTERNAL); + return err; + } + + return SignWithStoredOpKey(fabricIndex, mStorage, message, outSignature); +} + +Crypto::P256Keypair * AmebaPersistentStorageOperationalKeystore::AllocateEphemeralKeypairForCASE() +{ + // DO NOT CUT AND PASTE without considering the ReleaseEphemeralKeypair(). + // If allocating a derived class, then `ReleaseEphemeralKeypair` MUST + // de-allocate the derived class after up-casting the base class pointer. + return Platform::New<Crypto::P256Keypair>(); +} + +void AmebaPersistentStorageOperationalKeystore::ReleaseEphemeralKeypair(Crypto::P256Keypair * keypair) +{ + // DO NOT CUT AND PASTE without considering the AllocateEphemeralKeypairForCASE(). + // This must delete the same concrete class as allocated in `AllocateEphemeralKeypairForCASE` + Platform::Delete<Crypto::P256Keypair>(keypair); +} + +CHIP_ERROR AmebaPersistentStorageOperationalKeystore::MigrateOpKeypairForFabric(FabricIndex fabricIndex, + OperationalKeystore & operationalKeystore) const +{ + VerifyOrReturnError(mStorage != nullptr, CHIP_ERROR_INCORRECT_STATE); + VerifyOrReturnError(IsValidFabricIndex(fabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX); + + P256SerializedKeypair serializedKeypair; + + // Do not allow overwriting the existing key and just remove it from the previous Operational Keystore if needed. + if (!HasOpKeypairForFabric(fabricIndex)) + { + ReturnErrorOnFailure(operationalKeystore.ExportOpKeypairForFabric(fabricIndex, serializedKeypair)); + + auto operationalKeypair = Platform::MakeUnique<P256Keypair>(); + if (!operationalKeypair) + { + return CHIP_ERROR_NO_MEMORY; + } + + ReturnErrorOnFailure(operationalKeypair->Deserialize(serializedKeypair)); + ReturnErrorOnFailure(StoreOperationalKey(fabricIndex, mStorage, operationalKeypair.get())); + + ReturnErrorOnFailure(operationalKeystore.RemoveOpKeypairForFabric(fabricIndex)); + } + else if (operationalKeystore.HasOpKeypairForFabric(fabricIndex)) + { + ReturnErrorOnFailure(operationalKeystore.RemoveOpKeypairForFabric(fabricIndex)); + } + + return CHIP_NO_ERROR; +} + +} // namespace chip + +#endif /* CONFIG_ENABLE_AMEBA_CRYPTO */ diff --git a/src/platform/Ameba/crypto/AmebaPersistentStorageOperationalKeystore.h b/src/platform/Ameba/crypto/AmebaPersistentStorageOperationalKeystore.h new file mode 100644 index 00000000000000..4969e0677764c9 --- /dev/null +++ b/src/platform/Ameba/crypto/AmebaPersistentStorageOperationalKeystore.h @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2022 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 + +#if CONFIG_ENABLE_AMEBA_CRYPTO +#include <crypto/OperationalKeystore.h> +#include <crypto/PersistentStorageOperationalKeystore.h> +#include <lib/core/CHIPError.h> +#include <lib/core/CHIPPersistentStorageDelegate.h> +#include <lib/core/DataModelTypes.h> +#include <lib/support/CHIPMem.h> +#include <lib/support/CodeUtils.h> + +namespace chip { + +class AmebaP256Keypair : public Crypto::P256Keypair +{ +public: + AmebaP256Keypair() {} + ~AmebaP256Keypair() override; + + /** + * @brief Initialize the keypair. + * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise + **/ + CHIP_ERROR Initialize(Crypto::ECPKeyTarget key_target) override; + + /** @brief Return public key for the keypair. + **/ + const Crypto::P256PublicKey & Pubkey() const override { return mPublicKey; } + + /** Release resources associated with this key pair */ + void Clear(); + +protected: + Crypto::P256PublicKey mPublicKey; + mutable Crypto::P256KeypairContext mKeypair; + bool mInitialized = false; +}; + +/** + * @brief OperationalKeystore implementation making use of PersistentStorageDelegate + * to load/store keypairs. This is the legacy behavior of `FabricTable` prior + * to refactors to use `OperationalKeystore` and exists as a baseline example + * of how to use the interface. + * + * WARNING: Ensure that any implementation that uses this one as a starting point + * DOES NOT have the raw key material (in usable form) passed up/down to + * direct storage APIs that may make copies on heap/stack without sanitization. + */ +class AmebaPersistentStorageOperationalKeystore : public Crypto::OperationalKeystore +{ +public: + AmebaPersistentStorageOperationalKeystore() = default; + virtual ~AmebaPersistentStorageOperationalKeystore() { Finish(); } + + // Non-copyable + AmebaPersistentStorageOperationalKeystore(AmebaPersistentStorageOperationalKeystore const &) = delete; + void operator=(AmebaPersistentStorageOperationalKeystore const &) = delete; + + /** + * @brief Initialize the Operational Keystore to map to a given storage delegate. + * + * @param storage Pointer to persistent storage delegate to use. Must outlive this instance. + * @retval CHIP_NO_ERROR on success + * @retval CHIP_ERROR_INCORRECT_STATE if already initialized + */ + CHIP_ERROR Init(PersistentStorageDelegate * storage) + { + VerifyOrReturnError(mStorage == nullptr, CHIP_ERROR_INCORRECT_STATE); + mPendingFabricIndex = kUndefinedFabricIndex; + mIsExternallyOwnedKeypair = false; + mStorage = storage; + mPendingKeypair = nullptr; + mIsPendingKeypairActive = false; + return CHIP_NO_ERROR; + } + + /** + * @brief Finalize the keystore, so that subsequent operations fail + */ + void Finish() + { + VerifyOrReturn(mStorage != nullptr); + + ResetPendingKey(); + mStorage = nullptr; + } + + bool HasPendingOpKeypair() const override { return (mPendingKeypair != nullptr); } + + bool HasOpKeypairForFabric(FabricIndex fabricIndex) const override; + CHIP_ERROR NewOpKeypairForFabric(FabricIndex fabricIndex, MutableByteSpan & outCertificateSigningRequest) override; + CHIP_ERROR ActivateOpKeypairForFabric(FabricIndex fabricIndex, const Crypto::P256PublicKey & nocPublicKey) override; + CHIP_ERROR CommitOpKeypairForFabric(FabricIndex fabricIndex) override; + CHIP_ERROR ExportOpKeypairForFabric(FabricIndex fabricIndex, Crypto::P256SerializedKeypair & outKeypair) override; + CHIP_ERROR RemoveOpKeypairForFabric(FabricIndex fabricIndex) override; + void RevertPendingKeypair() override; + CHIP_ERROR SignWithOpKeypair(FabricIndex fabricIndex, const ByteSpan & message, + Crypto::P256ECDSASignature & outSignature) const override; + Crypto::P256Keypair * AllocateEphemeralKeypairForCASE() override; + void ReleaseEphemeralKeypair(Crypto::P256Keypair * keypair) override; + CHIP_ERROR MigrateOpKeypairForFabric(FabricIndex fabricIndex, OperationalKeystore & operationalKeystore) const override; + +protected: + void ResetPendingKey() + { + if (!mIsExternallyOwnedKeypair && (mPendingKeypair != nullptr)) + { + Platform::Delete(mPendingKeypair); + } + mPendingKeypair = nullptr; + mIsExternallyOwnedKeypair = false; + mIsPendingKeypairActive = false; + mPendingFabricIndex = kUndefinedFabricIndex; + } + + PersistentStorageDelegate * mStorage = nullptr; + + // This pending fabric index is `kUndefinedFabricIndex` if there isn't a pending keypair override for a given fabric. + FabricIndex mPendingFabricIndex = kUndefinedFabricIndex; + Crypto::P256Keypair * mPendingKeypair = nullptr; + bool mIsPendingKeypairActive = false; + + // If overridding NewOpKeypairForFabric method in a subclass, set this to true in + // `NewOpKeypairForFabric` if the mPendingKeypair should not be deleted when no longer in use. + bool mIsExternallyOwnedKeypair = false; +}; + +} // namespace chip +#endif /* CONFIG_ENABLE_AMEBA_CRYPTO */ From ddc06d45295eacc0ee43dcae49b21bd94b7f11d3 Mon Sep 17 00:00:00 2001 From: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> Date: Thu, 2 May 2024 18:02:23 -0400 Subject: [PATCH 107/124] [Silabs]Migration memMonitoring to cmsisos with some cleanup due to api changes (#33270) * Migration memMonitoring to cmsisos with some cleanup due to api changes change namespace and method names * fixup * Apply suggestion to use new/delete instead of longer MemoryMalloc/MemoryFree api --- examples/platform/silabs/MatterConfig.cpp | 2 +- examples/platform/silabs/MemMonitoring.cpp | 110 ++++++++++----------- examples/platform/silabs/MemMonitoring.h | 13 ++- 3 files changed, 64 insertions(+), 61 deletions(-) diff --git a/examples/platform/silabs/MatterConfig.cpp b/examples/platform/silabs/MatterConfig.cpp index 9cc030557ab0f3..0789c12f37aaac 100644 --- a/examples/platform/silabs/MatterConfig.cpp +++ b/examples/platform/silabs/MatterConfig.cpp @@ -240,7 +240,7 @@ CHIP_ERROR SilabsMatterConfig::InitMatter(const char * appName) #endif #ifdef HEAP_MONITORING - MemMonitoring::startHeapMonitoring(); + MemMonitoring::StartMonitor(); #endif //============================================== diff --git a/examples/platform/silabs/MemMonitoring.cpp b/examples/platform/silabs/MemMonitoring.cpp index 9da075e4e79d42..7ea61e4c8fe265 100644 --- a/examples/platform/silabs/MemMonitoring.cpp +++ b/examples/platform/silabs/MemMonitoring.cpp @@ -19,93 +19,91 @@ #include "MemMonitoring.h" #include "AppConfig.h" -#include "FreeRTOS.h" +#include <cmsis_os2.h> #include <platform/CHIPDeviceLayer.h> +#include <sl_cmsis_os2_common.h> -#define BLE_STACK_TASK_NAME "Bluetooth stack" -#define BLE_LINK_TASK_NAME "Bluetooth linklayer" +namespace chip { +namespace DeviceLayer { +namespace Silabs { -static StackType_t monitoringStack[MONITORING_STACK_SIZE_byte / sizeof(StackType_t)]; -static StaticTask_t monitoringTaskStruct; +static osThreadId_t sMonitorThreadHandle; +constexpr uint32_t kMonitorTaskSize = 1024; +static uint8_t monitorStack[kMonitorTaskSize]; +static osThread_t sMonitorTaskControlBlock; +constexpr osThreadAttr_t kMonitorTaskAttr = { .name = "MemMonitor", + .attr_bits = osThreadDetached, + .cb_mem = &sMonitorTaskControlBlock, + .cb_size = osThreadCbSize, + .stack_mem = monitorStack, + .stack_size = kMonitorTaskSize, + .priority = osPriorityLow }; size_t nbAllocSuccess = 0; size_t nbFreeSuccess = 0; size_t largestBlockAllocated = 0; -void MemMonitoring::startHeapMonitoring() +void MemMonitoring::StartMonitor() { - xTaskCreateStatic(HeapMonitoring, "Monitoring", MONITORING_STACK_SIZE_byte / sizeof(StackType_t), NULL, 1, monitoringStack, - &monitoringTaskStruct); + sMonitorThreadHandle = osThreadNew(MonitorTask, nullptr, &kMonitorTaskAttr); } -void MemMonitoring::HeapMonitoring(void * pvParameter) +void MemMonitoring::MonitorTask(void * pvParameter) { + uint32_t threadCount = osThreadGetCount(); - UBaseType_t appTaskValue; - UBaseType_t bleEventTaskValue; - UBaseType_t bleTaskValue; - UBaseType_t linkLayerTaskValue; - UBaseType_t openThreadTaskValue; - UBaseType_t eventLoopTaskValue; - - TaskHandle_t eventLoopHandleStruct = xTaskGetHandle(CHIP_DEVICE_CONFIG_CHIP_TASK_NAME); - TaskHandle_t otTaskHandle = xTaskGetHandle(CHIP_DEVICE_CONFIG_THREAD_TASK_NAME); - TaskHandle_t appTaskHandle = xTaskGetHandle(APP_TASK_NAME); - TaskHandle_t bleStackTaskHandle = xTaskGetHandle(BLE_STACK_TASK_NAME); - TaskHandle_t bleLinkTaskHandle = xTaskGetHandle(BLE_LINK_TASK_NAME); - TaskHandle_t bleEventTaskHandle = xTaskGetHandle(CHIP_DEVICE_CONFIG_BLE_APP_TASK_NAME); - -#if CHIP_SYSTEM_CONFIG_USE_LWIP - UBaseType_t lwipTaskValue; - TaskHandle_t lwipHandle = xTaskGetHandle(TCPIP_THREAD_NAME); -#endif // CHIP_SYSTEM_CONFIG_USE_LWIP + osThreadId_t * threadIdTable = new osThreadId_t[threadCount]; + // Forms a table of the active thread ids + osThreadEnumerate(threadIdTable, threadCount); while (true) { - appTaskValue = uxTaskGetStackHighWaterMark(appTaskHandle); - bleEventTaskValue = uxTaskGetStackHighWaterMark(bleEventTaskHandle); - bleTaskValue = uxTaskGetStackHighWaterMark(bleStackTaskHandle); - linkLayerTaskValue = uxTaskGetStackHighWaterMark(bleLinkTaskHandle); - openThreadTaskValue = uxTaskGetStackHighWaterMark(otTaskHandle); - eventLoopTaskValue = uxTaskGetStackHighWaterMark(eventLoopHandleStruct); -#if CHIP_SYSTEM_CONFIG_USE_LWIP - lwipTaskValue = uxTaskGetStackHighWaterMark(lwipHandle); -#endif // CHIP_SYSTEM_CONFIG_USE_LWIP SILABS_LOG("============================="); - SILABS_LOG(" "); - SILABS_LOG("Largest Block allocated 0x%x", largestBlockAllocated); - SILABS_LOG("Number Of Successful Alloc 0x%x", nbAllocSuccess); - SILABS_LOG("Number Of Successful Frees 0x%x", nbFreeSuccess); - SILABS_LOG(" "); - SILABS_LOG("App Task most bytes ever Free 0x%x", (appTaskValue * 4)); - SILABS_LOG("BLE Event most bytes ever Free 0x%x", (bleEventTaskValue * 4)); - SILABS_LOG("BLE Stack most bytes ever Free 0x%x", (bleTaskValue * 4)); - SILABS_LOG("Link Layer Task most bytes ever Free 0x%x", (linkLayerTaskValue * 4)); - SILABS_LOG("OpenThread Task most bytes ever Free 0x%x", (openThreadTaskValue * 4)); - SILABS_LOG("Event Loop Task most bytes ever Free 0x%x", (eventLoopTaskValue * 4)); -#if CHIP_SYSTEM_CONFIG_USE_LWIP - SILABS_LOG("LWIP Task most bytes ever Free 0x%x", (lwipTaskValue * 4)); -#endif // CHIP_SYSTEM_CONFIG_USE_LWIP - SILABS_LOG(" "); + SILABS_LOG(" "); + SILABS_LOG("Largest Block allocated %lu B", largestBlockAllocated); + SILABS_LOG("Number Of Successful Alloc %lu", nbAllocSuccess); + SILABS_LOG("Number Of Successful Frees %lu", nbFreeSuccess); + SILABS_LOG(" "); + + SILABS_LOG("Thread stack highwatermark "); + for (uint8_t tIdIndex = 0; tIdIndex < threadCount; tIdIndex++) + { + osThreadId_t tId = threadIdTable[tIdIndex]; + if (tId != sMonitorThreadHandle) // don't print stats for this current debug thread. + { + // The smallest amount of free stack space there has been since the thread creation + SILABS_LOG("\t%-10s : %6lu B", osThreadGetName(tId), osThreadGetStackSpace(tId)); + } + } + + SILABS_LOG(" "); SILABS_LOG("============================="); - vTaskDelay(pdMS_TO_TICKS(5000)); + // run loop every 5 seconds + osDelay(osKernelGetTickFreq() * 5); } + + // will never get here. Still, free allocated memory before exiting + delete threadIdTable; } +} // namespace Silabs +} // namespace DeviceLayer +} // namespace chip + extern "C" void memMonitoringTrackAlloc(void * ptr, size_t size) { if (ptr != NULL) { - nbAllocSuccess++; - if (largestBlockAllocated < size) + chip::DeviceLayer::Silabs::nbAllocSuccess++; + if (chip::DeviceLayer::Silabs::largestBlockAllocated < size) { - largestBlockAllocated = size; + chip::DeviceLayer::Silabs::largestBlockAllocated = size; } } } extern "C" void memMonitoringTrackFree(void * ptr, size_t size) { - nbFreeSuccess++; + chip::DeviceLayer::Silabs::nbFreeSuccess++; } diff --git a/examples/platform/silabs/MemMonitoring.h b/examples/platform/silabs/MemMonitoring.h index ffc430ccaf3193..c54aa2acf421ee 100644 --- a/examples/platform/silabs/MemMonitoring.h +++ b/examples/platform/silabs/MemMonitoring.h @@ -19,17 +19,22 @@ #pragma once #ifdef HEAP_MONITORING -#include "FreeRTOS.h" -#define MONITORING_STACK_SIZE_byte 1024 +namespace chip { +namespace DeviceLayer { +namespace Silabs { class MemMonitoring { public: - static void startHeapMonitoring(); + static void StartMonitor(); private: - static void HeapMonitoring(void * pvParameter); + static void MonitorTask(void * pvParameter); }; +} // namespace Silabs +} // namespace DeviceLayer +} // namespace chip + #endif From fcfc9bcc85afa4054cf84cbc1606b64eb305b94d Mon Sep 17 00:00:00 2001 From: Karsten Sperling <113487422+ksperling-apple@users.noreply.github.com> Date: Fri, 3 May 2024 12:13:52 +1200 Subject: [PATCH 108/124] Fix handling of short discriminator in QRCodeSetupPayloadGenerator (#33250) * Fix handling of short discriminator in QRCodeSetupPayloadGenerator If a SetupPayload contains a short discriminator then - isValidQRCodePayload() should return false - trying to generate a QR Code should return INVALID_ARGUMENT - generating with SetAllowInvalidPayload(true) should work (not die) * SetupPayload tweaks Make IsCommonTag, IsVendorTag, and getOptionalVendorData(tag, &info) public. The first two are just encoding spec rules that are useful for clients, and the latter allows clients to read vendor data by tag instead of having to read the whole list. Also use default values instead of explicit constructors for OptionalQRCodeInfo and fix up some doc comments to correctly reference the vendor tag range. * Address review comments Elaborate on the use case for AllowInvalidPayload in the comments, and encode a missing long discriminator as 0, to avoid a client encoding invalid payloads from relying on round-tripping a short discriminator through a QR code. * Handle rendezvousInformation and discriminator the same way * Address review comment: use ValueOr --- .../QRCodeSetupPayloadGenerator.cpp | 12 +++-- src/setup_payload/SetupPayload.cpp | 18 ++----- src/setup_payload/SetupPayload.h | 49 ++++++++----------- src/setup_payload/tests/TestQRCode.cpp | 38 ++++++++++++++ 4 files changed, 72 insertions(+), 45 deletions(-) diff --git a/src/setup_payload/QRCodeSetupPayloadGenerator.cpp b/src/setup_payload/QRCodeSetupPayloadGenerator.cpp index 6ffa2319dadb35..962a0393736683 100644 --- a/src/setup_payload/QRCodeSetupPayloadGenerator.cpp +++ b/src/setup_payload/QRCodeSetupPayloadGenerator.cpp @@ -162,6 +162,11 @@ static CHIP_ERROR generateBitSet(PayloadContents & payload, MutableByteSpan & bi size_t totalPayloadSizeInBits = kTotalPayloadDataSizeInBits + (tlvDataLengthInBytes * 8); VerifyOrReturnError(bits.size() * 8 >= totalPayloadSizeInBits, CHIP_ERROR_BUFFER_TOO_SMALL); + // isValidQRCodePayload() has already performed all relevant checks (including that we have a + // long discriminator and rendevouz information). But if AllowInvalidPayload is set these + // requirements might be violated; in that case simply encode 0 for the relevant fields. + // Encoding an invalid (or partially valid) payload is useful for clients that need to be able + // to serialize and deserialize partially populated or invalid payloads. ReturnErrorOnFailure( populateBits(bits.data(), offset, payload.version, kVersionFieldLengthInBits, kTotalPayloadDataSizeInBits)); ReturnErrorOnFailure( @@ -170,10 +175,11 @@ static CHIP_ERROR generateBitSet(PayloadContents & payload, MutableByteSpan & bi populateBits(bits.data(), offset, payload.productID, kProductIDFieldLengthInBits, kTotalPayloadDataSizeInBits)); ReturnErrorOnFailure(populateBits(bits.data(), offset, static_cast<uint64_t>(payload.commissioningFlow), kCommissioningFlowFieldLengthInBits, kTotalPayloadDataSizeInBits)); - VerifyOrReturnError(payload.rendezvousInformation.HasValue(), CHIP_ERROR_INVALID_ARGUMENT); - ReturnErrorOnFailure(populateBits(bits.data(), offset, payload.rendezvousInformation.Value().Raw(), + ReturnErrorOnFailure(populateBits(bits.data(), offset, + payload.rendezvousInformation.ValueOr(RendezvousInformationFlag::kNone).Raw(), kRendezvousInfoFieldLengthInBits, kTotalPayloadDataSizeInBits)); - ReturnErrorOnFailure(populateBits(bits.data(), offset, payload.discriminator.GetLongValue(), + auto const & pd = payload.discriminator; + ReturnErrorOnFailure(populateBits(bits.data(), offset, (!pd.IsShortDiscriminator() ? pd.GetLongValue() : 0), kPayloadDiscriminatorFieldLengthInBits, kTotalPayloadDataSizeInBits)); ReturnErrorOnFailure( populateBits(bits.data(), offset, payload.setUpPINCode, kSetupPINCodeFieldLengthInBits, kTotalPayloadDataSizeInBits)); diff --git a/src/setup_payload/SetupPayload.cpp b/src/setup_payload/SetupPayload.cpp index 3d312cd5846e8d..063456327f6a62 100644 --- a/src/setup_payload/SetupPayload.cpp +++ b/src/setup_payload/SetupPayload.cpp @@ -33,18 +33,6 @@ namespace chip { -// Spec 5.1.4.2 CHIPCommon tag numbers are in the range [0x00, 0x7F] -bool SetupPayload::IsCommonTag(uint8_t tag) -{ - return tag < 0x80; -} - -// Spec 5.1.4.1 Manufacture-specific tag numbers are in the range [0x80, 0xFF] -bool SetupPayload::IsVendorTag(uint8_t tag) -{ - return !IsCommonTag(tag); -} - // Check the Setup Payload for validity // // `vendor_id` and `product_id` are allowed all of uint16_t @@ -79,7 +67,11 @@ bool PayloadContents::isValidQRCodePayload() const return false; } - // Discriminator validity is enforced by the SetupDiscriminator class. + // General discriminator validity is enforced by the SetupDiscriminator class, but it can't be short for QR a code. + if (discriminator.IsShortDiscriminator()) + { + return false; + } if (setUpPINCode >= 1 << kSetupPINCodeFieldLengthInBits) { diff --git a/src/setup_payload/SetupPayload.h b/src/setup_payload/SetupPayload.h index 9b18574480ba6e..6e81e0e0e48ddb 100644 --- a/src/setup_payload/SetupPayload.h +++ b/src/setup_payload/SetupPayload.h @@ -153,29 +153,19 @@ enum optionalQRCodeInfoType */ struct OptionalQRCodeInfo { - OptionalQRCodeInfo() { int32 = 0; } - /*@{*/ uint8_t tag; /**< the tag number of the optional info */ enum optionalQRCodeInfoType type; /**< the type (String or Int) of the optional info */ std::string data; /**< the string value if type is optionalQRCodeInfoTypeString, otherwise should not be set */ - int32_t int32; /**< the integer value if type is optionalQRCodeInfoTypeInt, otherwise should not be set */ + int32_t int32 = 0; /**< the integer value if type is optionalQRCodeInfoTypeInt32, otherwise should not be set */ /*@}*/ }; struct OptionalQRCodeInfoExtension : OptionalQRCodeInfo { - OptionalQRCodeInfoExtension() - { - int32 = 0; - int64 = 0; - uint32 = 0; - uint64 = 0; - } - - int64_t int64; - uint64_t uint32; - uint64_t uint64; + int64_t int64 = 0; /**< the integer value if type is optionalQRCodeInfoTypeInt64, otherwise should not be set */ + uint64_t uint32 = 0; /**< the integer value if type is optionalQRCodeInfoTypeUInt32, otherwise should not be set */ + uint64_t uint64 = 0; /**< the integer value if type is optionalQRCodeInfoTypeUInt64, otherwise should not be set */ }; class SetupPayload : public PayloadContents @@ -193,17 +183,25 @@ class SetupPayload : public PayloadContents CHIP_ERROR addOptionalVendorData(uint8_t tag, std::string data); /** @brief A function to add an optional vendor data - * @param tag 7 bit [0-127] tag number + * @param tag tag number in the [0x80-0xFF] range * @param data Integer representation of data to add * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise **/ CHIP_ERROR addOptionalVendorData(uint8_t tag, int32_t data); /** @brief A function to remove an optional vendor data - * @param tag 7 bit [0-127] tag number + * @param tag tag number in the [0x80-0xFF] range * @return Returns a CHIP_ERROR_KEY_NOT_FOUND on error, CHIP_NO_ERROR otherwise **/ CHIP_ERROR removeOptionalVendorData(uint8_t tag); + + /** @brief A function to retrieve an optional QR Code info vendor object + * @param tag tag number in the [0x80-0xFF] range + * @param info retrieved OptionalQRCodeInfo object + * @return Returns a CHIP_ERROR_KEY_NOT_FOUND on error, CHIP_NO_ERROR otherwise + **/ + CHIP_ERROR getOptionalVendorData(uint8_t tag, OptionalQRCodeInfo & info) const; + /** * @brief A function to retrieve the vector of OptionalQRCodeInfo infos * @return Returns a vector of optionalQRCodeInfos @@ -235,21 +233,21 @@ class SetupPayload : public PayloadContents bool operator==(const SetupPayload & input) const; -private: - std::map<uint8_t, OptionalQRCodeInfo> optionalVendorData; - std::map<uint8_t, OptionalQRCodeInfoExtension> optionalExtensionData; - /** @brief Checks if the tag is CHIP Common type * @param tag Tag to be checked * @return Returns True if the tag is of Common type **/ - static bool IsCommonTag(uint8_t tag); + static bool IsCommonTag(uint8_t tag) { return tag < 0x80; } /** @brief Checks if the tag is vendor-specific * @param tag Tag to be checked * @return Returns True if the tag is Vendor-specific **/ - static bool IsVendorTag(uint8_t tag); + static bool IsVendorTag(uint8_t tag) { return !IsCommonTag(tag); } + +private: + std::map<uint8_t, OptionalQRCodeInfo> optionalVendorData; + std::map<uint8_t, OptionalQRCodeInfoExtension> optionalExtensionData; /** @brief A function to add an optional QR Code info vendor object * @param info Optional QR code info object to add @@ -269,13 +267,6 @@ class SetupPayload : public PayloadContents **/ std::vector<OptionalQRCodeInfoExtension> getAllOptionalExtensionData() const; - /** @brief A function to retrieve an optional QR Code info vendor object - * @param tag 7 bit [0-127] tag number - * @param info retrieved OptionalQRCodeInfo object - * @return Returns a CHIP_ERROR_KEY_NOT_FOUND on error, CHIP_NO_ERROR otherwise - **/ - CHIP_ERROR getOptionalVendorData(uint8_t tag, OptionalQRCodeInfo & info) const; - /** @brief A function to retrieve an optional QR Code info extended object * @param tag 8 bit [128-255] tag number * @param info retrieved OptionalQRCodeInfoExtension object diff --git a/src/setup_payload/tests/TestQRCode.cpp b/src/setup_payload/tests/TestQRCode.cpp index 1ec508578dec30..6ca349c2884341 100644 --- a/src/setup_payload/tests/TestQRCode.cpp +++ b/src/setup_payload/tests/TestQRCode.cpp @@ -381,6 +381,44 @@ TEST(TestQRCode, TestQRCodeToPayloadGeneration) EXPECT_EQ(result, true); } +TEST(TestQRCode, TestGenerateWithShortDiscriminatorInvalid) +{ + SetupPayload payload = GetDefaultPayload(); + EXPECT_TRUE(payload.isValidQRCodePayload()); + + // A short discriminator isn't valid for a QR Code + payload.discriminator.SetShortValue(1); + EXPECT_FALSE(payload.isValidQRCodePayload()); + + // QRCodeSetupPayloadGenerator should therefore return an error + string base38Rep; + QRCodeSetupPayloadGenerator generator(payload); + EXPECT_EQ(generator.payloadBase38Representation(base38Rep), CHIP_ERROR_INVALID_ARGUMENT); + + // If we allow invalid payloads we should be able to encode + generator.SetAllowInvalidPayload(true); + EXPECT_EQ(generator.payloadBase38Representation(base38Rep), CHIP_NO_ERROR); +} + +TEST(TestQRCode, TestGenerateWithoutRendezvousInformation) +{ + SetupPayload payload = GetDefaultPayload(); + EXPECT_TRUE(payload.isValidQRCodePayload()); + + // Rendezvouz Information is required for a QR code + payload.rendezvousInformation.ClearValue(); + EXPECT_FALSE(payload.isValidQRCodePayload()); + + // QRCodeSetupPayloadGenerator should therefore return an error + string base38Rep; + QRCodeSetupPayloadGenerator generator(payload); + EXPECT_EQ(generator.payloadBase38Representation(base38Rep), CHIP_ERROR_INVALID_ARGUMENT); + + // If we allow invalid payloads we should be able to encode + generator.SetAllowInvalidPayload(true); + EXPECT_EQ(generator.payloadBase38Representation(base38Rep), CHIP_NO_ERROR); +} + TEST(TestQRCode, TestExtractPayload) { EXPECT_EQ(QRCodeSetupPayloadParser::ExtractPayload(string("MT:ABC")), string("ABC")); From e6d3184db0f9db0f0b57b4eef42c52be3e90e176 Mon Sep 17 00:00:00 2001 From: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> Date: Fri, 3 May 2024 09:11:47 -0400 Subject: [PATCH 109/124] [Silabs] Merge PlatformManagerImpl.cpp for efr32 and si917 platforms (#33274) * Merge PlatformManagerImpl.cpp for efr32 and si917 platforms as they were mostly the same * add a nullptr check --- .../{SiWx917 => }/PlatformManagerImpl.cpp | 32 ++-- src/platform/silabs/SiWx917/BUILD.gn | 2 +- src/platform/silabs/efr32/BUILD.gn | 2 +- .../silabs/efr32/PlatformManagerImpl.cpp | 163 ------------------ 4 files changed, 17 insertions(+), 182 deletions(-) rename src/platform/silabs/{SiWx917 => }/PlatformManagerImpl.cpp (92%) delete mode 100644 src/platform/silabs/efr32/PlatformManagerImpl.cpp diff --git a/src/platform/silabs/SiWx917/PlatformManagerImpl.cpp b/src/platform/silabs/PlatformManagerImpl.cpp similarity index 92% rename from src/platform/silabs/SiWx917/PlatformManagerImpl.cpp rename to src/platform/silabs/PlatformManagerImpl.cpp index c3db4afb2510f5..669c9309d7ee57 100644 --- a/src/platform/silabs/SiWx917/PlatformManagerImpl.cpp +++ b/src/platform/silabs/PlatformManagerImpl.cpp @@ -30,6 +30,7 @@ #include <platform/PlatformManager.h> #include <platform/internal/GenericPlatformManagerImpl_FreeRTOS.ipp> #include <platform/silabs/DiagnosticDataProviderImpl.h> + #if defined(TINYCRYPT_PRIMITIVES) #include "tinycrypt/ecc.h" #endif @@ -39,7 +40,6 @@ #endif // CHIP_SYSTEM_CONFIG_USE_LWIP #include "AppConfig.h" -#include "FreeRTOS.h" using namespace chip::DeviceLayer::Internal; @@ -47,28 +47,25 @@ namespace chip { namespace DeviceLayer { PlatformManagerImpl PlatformManagerImpl::sInstance; + +#if SLI_SI91X_MCU_INTERFACE #if defined(TINYCRYPT_PRIMITIVES) sys_mutex_t PlatformManagerImpl::rngMutexHandle = NULL; -#endif -#if defined(TINYCRYPT_PRIMITIVES) int PlatformManagerImpl::uECC_RNG_Function(uint8_t * dest, unsigned int size) { - int res; - sys_mutex_lock(&rngMutexHandle); - res = (chip::Crypto::DRBG_get_bytes(dest, size) == CHIP_NO_ERROR) ? size : 0; + int res = (chip::Crypto::DRBG_get_bytes(dest, size) == CHIP_NO_ERROR) ? size : 0; sys_mutex_unlock(&rngMutexHandle); return res; } -#endif +#endif // TINYCRYPT_PRIMITIVES static void app_get_random(uint8_t * aOutput, size_t aLen) { - size_t i; - - for (i = 0; i < aLen; i++) + VerifyOrReturn(aOutput != nullptr); + for (size_t i = 0; i < aLen; i++) { aOutput[i] = rand(); } @@ -81,6 +78,7 @@ static int app_entropy_source(void * data, unsigned char * output, size_t len, s return 0; } +#endif // SLI_SI91X_MCU_INTERFACE CHIP_ERROR PlatformManagerImpl::_InitChipStack(void) { @@ -97,16 +95,15 @@ CHIP_ERROR PlatformManagerImpl::_InitChipStack(void) ReturnErrorOnFailure(System::Clock::InitClock_RealTime()); - // 16 : Threshold value - ReturnErrorOnFailure(chip::Crypto::add_entropy_source(app_entropy_source, NULL, 16)); +#if SLI_SI91X_MCU_INTERFACE + ReturnErrorOnFailure(chip::Crypto::add_entropy_source(app_entropy_source, NULL, 16 /*Threshold value*/)); #if defined(TINYCRYPT_PRIMITIVES) /* Set RNG function for tinycrypt operations. */ - err_t ret; - ret = sys_mutex_new(&rngMutexHandle); - VerifyOrExit((ERR_OK == ret), err = CHIP_ERROR_NO_MEMORY); + VerifyOrExit(sys_mutex_new(&rngMutexHandle) == ERR_OK, err = CHIP_ERROR_NO_MEMORY); uECC_set_rng(PlatformManagerImpl::uECC_RNG_Function); -#endif +#endif // TINYCRYPT_PRIMITIVES +#endif // SLI_SI91X_MCU_INTERFACE // Call _InitChipStack() on the generic implementation base class // to finish the initialization process. @@ -139,6 +136,7 @@ void PlatformManagerImpl::_Shutdown() { Internal::GenericPlatformManagerImpl_FreeRTOS<PlatformManagerImpl>::_Shutdown(); } + #if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION void PlatformManagerImpl::HandleWFXSystemEvent(wfx_event_base_t eventBase, sl_wfx_generic_message_t * eventData) { @@ -206,7 +204,7 @@ void PlatformManagerImpl::HandleWFXSystemEvent(wfx_event_base_t eventBase, sl_wf (void) sInstance.PostEvent(&event); } -#endif +#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION } // namespace DeviceLayer } // namespace chip diff --git a/src/platform/silabs/SiWx917/BUILD.gn b/src/platform/silabs/SiWx917/BUILD.gn index 2eee75de7ba3bd..9187ce8f3d4286 100644 --- a/src/platform/silabs/SiWx917/BUILD.gn +++ b/src/platform/silabs/SiWx917/BUILD.gn @@ -50,6 +50,7 @@ static_library("SiWx917") { "${silabs_platform_dir}/Logging.cpp", "${silabs_platform_dir}/MigrationManager.cpp", "${silabs_platform_dir}/MigrationManager.h", + "${silabs_platform_dir}/PlatformManagerImpl.cpp", "${silabs_platform_dir}/PlatformManagerImpl.h", "${silabs_platform_dir}/SilabsConfig.cpp", "${silabs_platform_dir}/SilabsConfig.h", @@ -63,7 +64,6 @@ static_library("SiWx917") { "../rs911x/rsi_ble_config.h", "../rs911x/wfx_sl_ble_init.c", "../rs911x/wfx_sl_ble_init.h", - "PlatformManagerImpl.cpp", ] if (chip_enable_ota_requestor) { diff --git a/src/platform/silabs/efr32/BUILD.gn b/src/platform/silabs/efr32/BUILD.gn index 25b8e9f4690555..462c32af4d871d 100644 --- a/src/platform/silabs/efr32/BUILD.gn +++ b/src/platform/silabs/efr32/BUILD.gn @@ -55,6 +55,7 @@ static_library("efr32") { "${silabs_platform_dir}/KeyValueStoreManagerImpl.h", "${silabs_platform_dir}/Logging.cpp", "${silabs_platform_dir}/MigrationManager.cpp", + "${silabs_platform_dir}/PlatformManagerImpl.cpp", "${silabs_platform_dir}/PlatformManagerImpl.h", "${silabs_platform_dir}/SilabsConfig.cpp", "${silabs_platform_dir}/SilabsConfig.h", @@ -64,7 +65,6 @@ static_library("efr32") { "${silabs_platform_dir}/platformAbstraction/SilabsPlatformBase.h", "../../FreeRTOS/SystemTimeSupport.cpp", "../../SingletonConfigurationManager.cpp", - "PlatformManagerImpl.cpp", ] if (chip_enable_ble_rs911x) { diff --git a/src/platform/silabs/efr32/PlatformManagerImpl.cpp b/src/platform/silabs/efr32/PlatformManagerImpl.cpp deleted file mode 100644 index 2ebc64d77babc5..00000000000000 --- a/src/platform/silabs/efr32/PlatformManagerImpl.cpp +++ /dev/null @@ -1,163 +0,0 @@ -/* - * - * Copyright (c) 2020 Project CHIP Authors - * Copyright (c) 2019 Nest Labs, Inc. - * - * 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. - */ - -/** - * @file - * Provides an implementation of the PlatformManager object - * for Silabs platforms using the Silicon Labs SDK. - */ -/* this file behaves like a config.h, comes first */ -#include <platform/internal/CHIPDeviceLayerInternal.h> - -#include <platform/FreeRTOS/SystemTimeSupport.h> -#include <platform/KeyValueStoreManager.h> -#include <platform/PlatformManager.h> -#include <platform/internal/GenericPlatformManagerImpl_FreeRTOS.ipp> -#include <platform/silabs/DiagnosticDataProviderImpl.h> - -#if CHIP_SYSTEM_CONFIG_USE_LWIP -#include <lwip/tcpip.h> -#endif // CHIP_SYSTEM_CONFIG_USE_LWIP - -#include "AppConfig.h" -#include "FreeRTOS.h" - -using namespace chip::DeviceLayer::Internal; - -namespace chip { -namespace DeviceLayer { - -PlatformManagerImpl PlatformManagerImpl::sInstance; - -CHIP_ERROR PlatformManagerImpl::_InitChipStack(void) -{ - CHIP_ERROR err; - - // Initialize the configuration system. - err = chip::DeviceLayer::PersistedStorage::KeyValueStoreMgrImpl().Init(); - SuccessOrExit(err); - -#if CHIP_SYSTEM_CONFIG_USE_LWIP - // Initialize LwIP. - tcpip_init(NULL, NULL); -#endif // CHIP_SYSTEM_CONFIG_USE_LWIP - - ReturnErrorOnFailure(System::Clock::InitClock_RealTime()); - - // Call _InitChipStack() on the generic implementation base class - // to finish the initialization process. - err = Internal::GenericPlatformManagerImpl_FreeRTOS<PlatformManagerImpl>::_InitChipStack(); - SuccessOrExit(err); - - // Start timer to increment TotalOperationalHours every hour - SystemLayer().StartTimer(System::Clock::Seconds32(kSecondsPerHour), UpdateOperationalHours, NULL); - -exit: - return err; -} - -void PlatformManagerImpl::UpdateOperationalHours(System::Layer * systemLayer, void * appState) -{ - uint32_t totalOperationalHours = 0; - - if (ConfigurationMgr().GetTotalOperationalHours(totalOperationalHours) == CHIP_NO_ERROR) - { - ConfigurationMgr().StoreTotalOperationalHours(totalOperationalHours + 1); - } - else - { - ChipLogError(DeviceLayer, "Failed to get total operational hours of the Node"); - } - - SystemLayer().StartTimer(System::Clock::Seconds32(kSecondsPerHour), UpdateOperationalHours, NULL); -} -void PlatformManagerImpl::_Shutdown() -{ - Internal::GenericPlatformManagerImpl_FreeRTOS<PlatformManagerImpl>::_Shutdown(); -} -#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION -void PlatformManagerImpl::HandleWFXSystemEvent(wfx_event_base_t eventBase, sl_wfx_generic_message_t * eventData) -{ - ChipDeviceEvent event; - memset(&event, 0, sizeof(event)); - event.Type = DeviceEventType::kWFXSystemEvent; - event.Platform.WFXSystemEvent.eventBase = eventBase; - - if (eventBase == WIFI_EVENT) - { - switch (eventData->header.id) - { - case SL_WFX_STARTUP_IND_ID: - memcpy(&event.Platform.WFXSystemEvent.data.startupEvent, eventData, - sizeof(event.Platform.WFXSystemEvent.data.startupEvent)); - break; - case SL_WFX_CONNECT_IND_ID: - memcpy(&event.Platform.WFXSystemEvent.data.connectEvent, eventData, - sizeof(event.Platform.WFXSystemEvent.data.connectEvent)); - break; - case SL_WFX_DISCONNECT_IND_ID: - memcpy(&event.Platform.WFXSystemEvent.data.disconnectEvent, eventData, - sizeof(event.Platform.WFXSystemEvent.data.disconnectEvent)); - break; - // case SL_WFX_RECEIVED_IND_ID: - // memcpy(&event.Platform.WFXSystemEvent.data.receivedEvent, eventData, - // sizeof(event.Platform.WFXSystemEvent.data.receivedEvent)); - // break; - // case SL_WFX_GENERIC_IND_ID: - // memcpy(&event.Platform.WFXSystemEvent.data.genericEvent, eventData, - // sizeof(event.Platform.WFXSystemEvent.data.genericEvent)); - // break; - // case SL_WFX_EXCEPTION_IND_ID: - // memcpy(&event.Platform.WFXSystemEvent.data.exceptionEvent, eventData, - // sizeof(event.Platform.WFXSystemEvent.data.exceptionEvent)); - // break; - // case SL_WFX_ERROR_IND_ID: - // memcpy(&event.Platform.WFXSystemEvent.data.errorEvent, eventData, - // sizeof(event.Platform.WFXSystemEvent.data.errorEvent)); - // break; - default: - break; - } - } - else if (eventBase == IP_EVENT) - { - switch (eventData->header.id) - { - case IP_EVENT_STA_GOT_IP: - memcpy(&event.Platform.WFXSystemEvent.data.genericMsgEvent, eventData, - sizeof(event.Platform.WFXSystemEvent.data.genericMsgEvent)); - break; - case IP_EVENT_GOT_IP6: - memcpy(&event.Platform.WFXSystemEvent.data.genericMsgEvent, eventData, - sizeof(event.Platform.WFXSystemEvent.data.genericMsgEvent)); - break; - case IP_EVENT_STA_LOST_IP: - memcpy(&event.Platform.WFXSystemEvent.data.genericMsgEvent, eventData, - sizeof(event.Platform.WFXSystemEvent.data.genericMsgEvent)); - break; - default: - break; - } - } - - (void) sInstance.PostEvent(&event); -} -#endif - -} // namespace DeviceLayer -} // namespace chip From 600564c64e8277da23f26edcbdec932f3a7ebf54 Mon Sep 17 00:00:00 2001 From: Nivi Sarkar <55898241+nivi-apple@users.noreply.github.com> Date: Fri, 3 May 2024 07:16:59 -0700 Subject: [PATCH 110/124] Add support for notifying the delegate when device configuration changes (#33146) * Add support for notifying the delegate when device configuration changes - Device configuration changes include updates in attributes parts list, server list, device type list, cluster revision or feature map in the descriptor cluster - Add a test to verify the delegate is notified when device configuration changes * Restyled by clang-format * Change device list to device type list * Add accepted commands list and attribute list to the list of attributes that qualify as device configuration changes * Set _deviceConfigurationChanged to NO in _handleReportEnd * Update src/darwin/Framework/CHIP/MTRDevice.h Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Apply suggestions from code review Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Addressed review comments * Restyled by clang-format * Apply suggestions from code review Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Update code to set _deviceConfigurationChanged correctly in _getAttributesToReportWithReportedValues - Add more tests to verify that for attributes that don't affect device configuration changed, the delegate callback is not called. Also add tests for testing an attribute report having multiple attributes one of which causes device configuration changed. * Restyled by clang-format * Add logs to test the multiple attribute report * Fix the checkAttributeReportTriggersConfigurationChanged API and invert the expectation for device configuration changed when expectConfigurationChanged is set to NO * Restyled by clang-format * Apply suggestions from code review Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Addressed comments --------- Co-authored-by: Restyled.io <commits@restyled.io> Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> --- src/darwin/Framework/CHIP/MTRDevice.h | 8 + src/darwin/Framework/CHIP/MTRDevice.mm | 56 +++ .../Framework/CHIPTests/MTRDeviceTests.m | 443 ++++++++++++++++++ .../TestHelpers/MTRDeviceTestDelegate.h | 1 + .../TestHelpers/MTRDeviceTestDelegate.m | 8 + .../TestHelpers/MTRTestDeclarations.h | 1 + 6 files changed, 517 insertions(+) diff --git a/src/darwin/Framework/CHIP/MTRDevice.h b/src/darwin/Framework/CHIP/MTRDevice.h index ee161947de000b..2d5002b87bee81 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.h +++ b/src/darwin/Framework/CHIP/MTRDevice.h @@ -423,6 +423,14 @@ MTR_EXTERN NSString * const MTRDataVersionKey MTR_NEWLY_AVAILABLE; */ - (void)deviceCachePrimed:(MTRDevice *)device MTR_NEWLY_AVAILABLE; +/** + * This is called when the MTRDevice object detects a change in the device configuration. + * + * Device configuration is the set of functionality implemented by the device. + * + */ +- (void)deviceConfigurationChanged:(MTRDevice *)device MTR_NEWLY_AVAILABLE; + @end @interface MTRDevice (Deprecated) diff --git a/src/darwin/Framework/CHIP/MTRDevice.mm b/src/darwin/Framework/CHIP/MTRDevice.mm index 1516edc300e23c..478485d509ccd1 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.mm +++ b/src/darwin/Framework/CHIP/MTRDevice.mm @@ -378,6 +378,10 @@ @implementation MTRDevice { // ReadClient). Nil if we have had no such failures. NSDate * _Nullable _lastSubscriptionFailureTime; MTRDeviceConnectivityMonitor * _connectivityMonitor; + + // This boolean keeps track of any device configuration changes received in an attribute report. + // If this is true when the report ends, we notify the delegate. + BOOL _deviceConfigurationChanged; } - (instancetype)initWithNodeID:(NSNumber *)nodeID controller:(MTRDeviceController *)controller @@ -1090,6 +1094,19 @@ - (void)_handleReportEnd _clusterDataToPersist = nil; } + // After the handling of the report, if we detected a device configuration change, notify the delegate + // of the same. + if (_deviceConfigurationChanged) { + id<MTRDeviceDelegate> delegate = _weakDelegate.strongObject; + if (delegate) { + dispatch_async(_delegateQueue, ^{ + if ([delegate respondsToSelector:@selector(deviceConfigurationChanged:)]) + [delegate deviceConfigurationChanged:self]; + }); + } + _deviceConfigurationChanged = NO; + } + // For unit testing only #ifdef DEBUG id delegate = _weakDelegate.strongObject; @@ -1132,6 +1149,15 @@ - (void)unitTestInjectEventReport:(NSArray<NSDictionary<NSString *, id> *> *)eve [self _handleEventReport:eventReport]; }); } + +- (void)unitTestInjectAttributeReport:(NSArray<NSDictionary<NSString *, id> *> *)attributeReport +{ + dispatch_async(self.queue, ^{ + [self _handleReportBegin]; + [self _handleAttributeReport:attributeReport]; + [self _handleReportEnd]; + }); +} #endif - (void)_handleEventReport:(NSArray<NSDictionary<NSString *, id> *> *)eventReport @@ -2443,6 +2469,30 @@ - (void)_noteDataVersion:(NSNumber *)dataVersion forClusterPath:(MTRClusterPath } } +- (BOOL)_attributeAffectsDeviceConfiguration:(MTRAttributePath *)attributePath +{ + // Check for attributes in the descriptor cluster that affect device configuration. + if (attributePath.cluster.unsignedLongValue == MTRClusterIDTypeDescriptorID) { + switch (attributePath.attribute.unsignedLongValue) { + case MTRAttributeIDTypeClusterDescriptorAttributePartsListID: + case MTRAttributeIDTypeClusterDescriptorAttributeServerListID: + case MTRAttributeIDTypeClusterDescriptorAttributeDeviceTypeListID: { + return YES; + } + } + } + + // Check for global attributes that affect device configuration. + switch (attributePath.attribute.unsignedLongValue) { + case MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID: + case MTRAttributeIDTypeGlobalAttributeAttributeListID: + case MTRAttributeIDTypeGlobalAttributeClusterRevisionID: + case MTRAttributeIDTypeGlobalAttributeFeatureMapID: + return YES; + } + return NO; +} + // assume lock is held - (NSArray *)_getAttributesToReportWithReportedValues:(NSArray<NSDictionary<NSString *, id> *> *)reportedAttributeValues { @@ -2495,6 +2545,12 @@ - (NSArray *)_getAttributesToReportWithReportedValues:(NSArray<NSDictionary<NSSt // Now that we have grabbed previousValue, update our cache with the attribute value. if (readCacheValueChanged) { [self _setCachedAttributeValue:attributeDataValue forPath:attributePath]; + if (!_deviceConfigurationChanged) { + _deviceConfigurationChanged = [self _attributeAffectsDeviceConfiguration:attributePath]; + if (_deviceConfigurationChanged) { + MTR_LOG_INFO("Device configuration changed due to changes in attribute %@", attributePath); + } + } } #ifdef DEBUG diff --git a/src/darwin/Framework/CHIPTests/MTRDeviceTests.m b/src/darwin/Framework/CHIPTests/MTRDeviceTests.m index 2dc01461826b40..9871e1c1af18d7 100644 --- a/src/darwin/Framework/CHIPTests/MTRDeviceTests.m +++ b/src/darwin/Framework/CHIPTests/MTRDeviceTests.m @@ -125,6 +125,17 @@ - (void)controller:(MTRDeviceController *)controller commissioningComplete:(NSEr @end @interface MTRDeviceTests : XCTestCase + ++ (void)checkAttributeReportTriggersConfigurationChanged:(MTRAttributeIDType)attributeId + clusterId:(MTRClusterIDType)clusterId + endpointId:(NSNumber *)endpointId + device:(MTRDevice *)device + delegate:(MTRDeviceTestDelegate *)delegate + dataVersion:(NSNumber *)dataVersion + attributeReport:(NSArray<NSDictionary<NSString *, id> *> *)attributeReport + testcase:(XCTestCase *)testcase + expectConfigurationChanged:(BOOL)expectConfigurationChanged; + @end @implementation MTRDeviceTests @@ -1574,6 +1585,13 @@ - (void)test017_TestMTRDeviceBasics [resubscriptionGotReportsExpectation fulfill]; }; + // Make sure there are no device configuration changed notifications during this test. + // There is nothing changing about the server that would lead to those. + __block BOOL wasOnDeviceConfigurationChangedCallbackCalled = NO; + delegate.onDeviceConfigurationChanged = ^() { + wasOnDeviceConfigurationChangedCallbackCalled = YES; + }; + // reset the onAttributeDataReceived to validate the following resubscribe test attributeReportsReceived = 0; eventReportsReceived = 0; @@ -1610,6 +1628,8 @@ - (void)test017_TestMTRDeviceBasics [self waitForExpectations:@[ resubscriptionReachableExpectation, resubscriptionGotReportsExpectation ] timeout:60]; + XCTAssertFalse(wasOnDeviceConfigurationChangedCallbackCalled); + // Now make sure we ignore later tests. Ideally we would just unsubscribe // or remove the delegate, but there's no good way to do that. delegate.onReachable = nil; @@ -2997,6 +3017,12 @@ - (void)test031_MTRDeviceAttributeCacheLocalTestStorage } NSUInteger storedAttributeCountDifferenceFromMTRDeviceReport = dataStoreAttributeCountAfterSecondSubscription - attributesReportedWithSecondSubscription; XCTAssertTrue(storedAttributeCountDifferenceFromMTRDeviceReport > 300); + + // We need to remove the device here since the MTRDevice retains its reachable state. So if the next test needs to start with a clean state, + // it can't do that since the MTRDevice becomes reachable in the previous test. Since there are no changes detected in reachability, + // the onReachable callback to the delegate is not called. + // TODO: #33205 Ensure we have a clean slate w.r.t MTRDevice before running each test. + [sController removeDevice:device]; } - (void)test032_MTRPathClassesEncoding @@ -3043,6 +3069,423 @@ - (void)test032_MTRPathClassesEncoding XCTAssertEqualObjects(originalCommandPath, decodedCommandPath); } +// Helper API to test if changes in an attribute with a path specified by endpointId, clusterId and attributeId trigger +// device configuration changed callbacks for a given MTRDevice. This API creates a fake attribute report for the given attribute path +// and injects it into MTRDevice to exercise and test the delegate's device configuration changed callback. ++ (void)checkAttributeReportTriggersConfigurationChanged:(MTRAttributeIDType)attributeId + clusterId:(MTRClusterIDType)clusterId + endpointId:(NSNumber *)endpointId + device:(MTRDevice *)device + delegate:(MTRDeviceTestDelegate *)delegate + dataVersion:(NSNumber *)dataVersion + attributeReport:(NSArray<NSDictionary<NSString *, id> *> *)attributeReport + testcase:(XCTestCase *)testcase + expectConfigurationChanged:(BOOL)expectConfigurationChanged +{ + XCTAssertNotNil(endpointId); + XCTAssertNotNil(device); + XCTAssertNotNil(delegate); + XCTAssertNotNil(dataVersion); + XCTAssertNotNil(attributeReport); + XCTAssertNotNil(testcase); + + XCTestExpectation * gotAttributeReportExpectation = [testcase expectationWithDescription:@"Attribute report has been received"]; + XCTestExpectation * gotAttributeReportEndExpectation = [testcase expectationWithDescription:@"Attribute report has ended"]; + XCTestExpectation * deviceConfigurationChangedExpectation = [testcase expectationWithDescription:@"Device configuration changed was receieved"]; + deviceConfigurationChangedExpectation.inverted = !expectConfigurationChanged; + + __block unsigned attributeReportsReceived = 0; + __block id testDataValue = nil; + + for (NSDictionary<NSString *, id> * attributeDict in attributeReport) { + MTRAttributePath * attributePath = attributeDict[MTRAttributePathKey]; + if (attributePath.attribute.unsignedLongLongValue == attributeId) { + NSDictionary * data = attributeDict[MTRDataKey]; + XCTAssertNotNil(data); + testDataValue = data[MTRValueKey]; + } + } + + // Check if the received attribute report matches the injected attribute report. + delegate.onAttributeDataReceived = ^(NSArray<NSDictionary<NSString *, id> *> * attributeReport) { + attributeReportsReceived += attributeReport.count; + XCTAssert(attributeReportsReceived > 0); + for (NSDictionary<NSString *, id> * attributeDict in attributeReport) { + MTRAttributePath * attributePath = attributeDict[MTRAttributePathKey]; + XCTAssertNotNil(attributePath); + + XCTAssertEqualObjects(attributePath.cluster, @(clusterId)); + XCTAssertEqualObjects(attributePath.attribute, @(attributeId)); + + NSDictionary * data = attributeDict[MTRDataKey]; + XCTAssertNotNil(data); + XCTAssertEqualObjects(data[MTRDataVersionKey], dataVersion); + + // This code assumes that none of the attributes in the report can have null values. + // Since we are injecting the attribute report for testing this with non-null values, + // we are fine for now. But if we plan to inject attribute reports with attributes having + // null values, we need to fix the code accordingly. + id dataValue = data[MTRValueKey]; + XCTAssertNotNil(dataValue); + XCTAssertNotNil(testDataValue); + XCTAssertEqualObjects(dataValue, testDataValue); + [gotAttributeReportExpectation fulfill]; + } + }; + + delegate.onReportEnd = ^() { + [gotAttributeReportEndExpectation fulfill]; + }; + + __block BOOL wasOnDeviceConfigurationChangedCallbackCalled = NO; + + delegate.onDeviceConfigurationChanged = ^() { + [deviceConfigurationChangedExpectation fulfill]; + wasOnDeviceConfigurationChangedCallbackCalled = YES; + }; + + [device unitTestInjectAttributeReport:attributeReport]; + + [testcase waitForExpectations:@[ gotAttributeReportExpectation, gotAttributeReportEndExpectation, deviceConfigurationChangedExpectation ] timeout:kTimeoutInSeconds]; + if (!expectConfigurationChanged) { + XCTAssertFalse(wasOnDeviceConfigurationChangedCallbackCalled); + } +} + +- (void)test033_TestMTRDeviceDeviceConfigurationChanged +{ + // Ensure the test starts with clean slate. + [sController.controllerDataStore clearAllStoredClusterData]; + NSDictionary * storedClusterDataAfterClear = [sController.controllerDataStore getStoredClusterDataForNodeID:@(kDeviceId)]; + XCTAssertEqual(storedClusterDataAfterClear.count, 0); + + __auto_type * device = [MTRDevice deviceWithNodeID:kDeviceId deviceController:sController]; + dispatch_queue_t queue = dispatch_get_main_queue(); + + // Check if subscription is set up and initial reports are received. + XCTestExpectation * subscriptionExpectation = [self expectationWithDescription:@"Subscription has been set up"]; + XCTestExpectation * gotInitialReportsExpectation = [self expectationWithDescription:@"Initial Attribute and Event reports have been received"]; + + __auto_type * delegate = [[MTRDeviceTestDelegate alloc] init]; + delegate.onReachable = ^() { + [subscriptionExpectation fulfill]; + }; + + __block unsigned attributeReportsReceived = 0; + + // Get the data version for the following attributes that we will use for the tests - parts list, device types list and server list for descriptor cluster, + // attribute list and cluster revision for the Identify cluster, accepted commands list for oven cavity operational state ID cluster and + // feature map for groups ID cluster. + __block NSNumber * dataVersionForPartsList; + __block NSNumber * dataVersionForDeviceTypesList; + __block NSNumber * dataVersionForServerList; + __block NSNumber * dataVersionForAcceptedCommandList; + __block NSNumber * dataVersionForAttributeList; + __block NSNumber * dataVersionForClusterRevision; + __block NSNumber * dataVersionForFeatureMap; + __block NSNumber * dataVersionForPowerConfigurationSources; + + delegate.onAttributeDataReceived = ^(NSArray<NSDictionary<NSString *, id> *> * attributeReport) { + attributeReportsReceived += attributeReport.count; + XCTAssert(attributeReportsReceived > 0); + + for (NSDictionary<NSString *, id> * attributeDict in attributeReport) { + MTRAttributePath * attributePath = attributeDict[MTRAttributePathKey]; + XCTAssertNotNil(attributePath); + + if (attributePath.cluster.unsignedLongValue == MTRClusterIDTypeDescriptorID) { + NSDictionary * data = attributeDict[MTRDataKey]; + XCTAssertNotNil(data); + switch (attributePath.attribute.unsignedLongValue) { + case MTRAttributeIDTypeClusterDescriptorAttributePartsListID: { + dataVersionForPartsList = data[MTRDataVersionKey]; + break; + } + case MTRAttributeIDTypeClusterDescriptorAttributeDeviceTypeListID: { + dataVersionForDeviceTypesList = data[MTRDataVersionKey]; + break; + } + case MTRAttributeIDTypeClusterDescriptorAttributeServerListID: { + dataVersionForServerList = data[MTRDataVersionKey]; + break; + } + } + } else if (attributePath.cluster.unsignedLongValue == MTRClusterIDTypeIdentifyID) { + NSDictionary * data = attributeDict[MTRDataKey]; + XCTAssertNotNil(data); + switch (attributePath.attribute.unsignedLongValue) { + case MTRAttributeIDTypeGlobalAttributeAttributeListID: { + dataVersionForAttributeList = data[MTRDataVersionKey]; + break; + } + case MTRAttributeIDTypeGlobalAttributeClusterRevisionID: { + dataVersionForClusterRevision = data[MTRDataVersionKey]; + break; + } + } + } else if (attributePath.cluster.unsignedLongValue == MTRClusterIDTypeOvenCavityOperationalStateID && attributePath.attribute.unsignedLongValue == MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID) { + NSDictionary * data = attributeDict[MTRDataKey]; + XCTAssertNotNil(data); + dataVersionForAcceptedCommandList = data[MTRDataVersionKey]; + } else if (attributePath.cluster.unsignedLongValue == MTRClusterIDTypeGroupsID && attributePath.attribute.unsignedLongValue == MTRAttributeIDTypeGlobalAttributeFeatureMapID) { + NSDictionary * data = attributeDict[MTRDataKey]; + XCTAssertNotNil(data); + dataVersionForFeatureMap = data[MTRDataVersionKey]; + } else if (attributePath.cluster.unsignedLongValue == MTRClusterIDTypePowerSourceConfigurationID && attributePath.attribute.unsignedLongValue == MTRAttributeIDTypeClusterPowerSourceConfigurationAttributeSourcesID) { + NSDictionary * data = attributeDict[MTRDataKey]; + XCTAssertNotNil(data); + dataVersionForPowerConfigurationSources = data[MTRDataVersionKey]; + } + } + }; + + delegate.onReportEnd = ^() { + XCTAssertNotNil(dataVersionForPartsList); + XCTAssertNotNil(dataVersionForDeviceTypesList); + XCTAssertNotNil(dataVersionForServerList); + XCTAssertNotNil(dataVersionForAttributeList); + XCTAssertNotNil(dataVersionForClusterRevision); + XCTAssertNotNil(dataVersionForAcceptedCommandList); + XCTAssertNotNil(dataVersionForFeatureMap); + XCTAssertNotNil(dataVersionForPowerConfigurationSources); + [gotInitialReportsExpectation fulfill]; + }; + + [device setDelegate:delegate queue:queue]; + + // Wait for subscription set up and intitial reports received. + [self waitForExpectations:@[ + subscriptionExpectation, + gotInitialReportsExpectation, + ] + timeout:60]; + + // The multiple tests below do the following: + // 1. Set the test data version to the data version for the attribute path saved from the initial attribute report incremented by 1. + // 2. Create the fake data for the attribute report for the attribute. + // 3. Call the helper checkAttributeReportTriggersConfigurationChanged to test if the attribute report affects device configuration changes. + + // Test attribute path - endpointId = 0, clusterId = descriptor, attributeId = parts list. + dataVersionForPartsList = [NSNumber numberWithUnsignedLongLong:(dataVersionForPartsList.unsignedLongLongValue + 1)]; + NSArray<NSDictionary<NSString *, id> *> * unsignedIntegerArrayValue = @[ + @{ + MTRDataKey : @ { + MTRTypeKey : MTRUnsignedIntegerValueType, + MTRValueKey : @1, + } + }, + @{ + MTRDataKey : @ { + MTRTypeKey : MTRUnsignedIntegerValueType, + MTRValueKey : @2, + } + }, + @{ + MTRDataKey : @ { + MTRTypeKey : MTRUnsignedIntegerValueType, + MTRValueKey : @3, + } + }, + ]; + + NSArray<NSDictionary<NSString *, id> *> * attributeReport = @[ @{ + MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(0) clusterID:@(MTRClusterIDTypeDescriptorID) attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributePartsListID)], + MTRDataKey : @ { + MTRDataVersionKey : dataVersionForPartsList, + MTRTypeKey : MTRArrayValueType, + MTRValueKey : unsignedIntegerArrayValue, + } + } ]; + + [MTRDeviceTests checkAttributeReportTriggersConfigurationChanged:MTRAttributeIDTypeClusterDescriptorAttributePartsListID clusterId:MTRClusterIDTypeDescriptorID endpointId:@(0) device:device delegate:delegate dataVersion:dataVersionForPartsList attributeReport:attributeReport testcase:self expectConfigurationChanged:YES]; + + // Test attribute path - endpointId = 0, clusterId = descriptor, attributeId = device types list. + dataVersionForDeviceTypesList = [NSNumber numberWithUnsignedLongLong:(dataVersionForDeviceTypesList.unsignedLongLongValue + 1)]; + NSArray<NSDictionary<NSString *, id> *> * deviceTypesListValue = @[ + @{ + MTRDataKey : @ { + MTRTypeKey : MTRStructureValueType, + MTRValueKey : @[ + @{ + MTRContextTagKey : @0, + MTRDataKey : @ { + MTRTypeKey : MTRUnsignedIntegerValueType, + MTRValueKey : @1 + }, + }, + @{ + MTRContextTagKey : @1, + MTRDataKey : @ { + MTRTypeKey : MTRUnsignedIntegerValueType, + MTRValueKey : @2 + }, + }, + ], + }, + }, + ]; + + attributeReport = @[ @{ + MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(0) clusterID:@(MTRClusterIDTypeDescriptorID) attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributeDeviceTypeListID)], + MTRDataKey : @ { + MTRDataVersionKey : dataVersionForDeviceTypesList, + MTRTypeKey : MTRArrayValueType, + MTRValueKey : deviceTypesListValue, + } + } ]; + + [MTRDeviceTests checkAttributeReportTriggersConfigurationChanged:MTRAttributeIDTypeClusterDescriptorAttributeDeviceTypeListID clusterId:MTRClusterIDTypeDescriptorID endpointId:@(0) device:device delegate:delegate dataVersion:dataVersionForDeviceTypesList attributeReport:attributeReport testcase:self expectConfigurationChanged:YES]; + + // Test attribute path - endpointId = 0, clusterId = descriptor, attributeId = server list. + dataVersionForServerList = [NSNumber numberWithUnsignedLongLong:(dataVersionForServerList.unsignedLongLongValue + 1)]; + attributeReport = @[ @{ + MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(0) clusterID:@(MTRClusterIDTypeDescriptorID) attributeID:@(MTRAttributeIDTypeClusterDescriptorAttributeServerListID)], + MTRDataKey : @ { + MTRDataVersionKey : dataVersionForServerList, + MTRTypeKey : MTRArrayValueType, + MTRValueKey : unsignedIntegerArrayValue, + } + } ]; + + [MTRDeviceTests checkAttributeReportTriggersConfigurationChanged:MTRAttributeIDTypeClusterDescriptorAttributeServerListID clusterId:MTRClusterIDTypeDescriptorID endpointId:@(0) device:device delegate:delegate dataVersion:dataVersionForServerList attributeReport:attributeReport testcase:self expectConfigurationChanged:YES]; + + // Test attribute path - endpointId = 1, clusterId = ovencavityoperationalstateID, attributeId = accepted command list. + dataVersionForAcceptedCommandList = [NSNumber numberWithUnsignedLongLong:(dataVersionForAcceptedCommandList.unsignedLongLongValue + 1)]; + attributeReport = @[ @{ + MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(1) clusterID:@(MTRClusterIDTypeOvenCavityOperationalStateID) attributeID:@(MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID)], + MTRDataKey : @ { + MTRDataVersionKey : dataVersionForAcceptedCommandList, + MTRTypeKey : MTRArrayValueType, + MTRValueKey : unsignedIntegerArrayValue, + } + } ]; + + [MTRDeviceTests checkAttributeReportTriggersConfigurationChanged:MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID clusterId:MTRClusterIDTypeOvenCavityOperationalStateID endpointId:@(1) device:device delegate:delegate dataVersion:dataVersionForAcceptedCommandList attributeReport:attributeReport testcase:self expectConfigurationChanged:YES]; + + // Test attribute path - endpointId = 0, clusterId = identify, attributeId = attribute list. + dataVersionForAttributeList = [NSNumber numberWithUnsignedLongLong:(dataVersionForAttributeList.unsignedLongLongValue + 1)]; + attributeReport = @[ @{ + MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(0) clusterID:@(MTRClusterIDTypeIdentifyID) attributeID:@(MTRAttributeIDTypeGlobalAttributeAttributeListID)], + MTRDataKey : @ { + MTRDataVersionKey : dataVersionForAttributeList, + MTRTypeKey : MTRArrayValueType, + MTRValueKey : unsignedIntegerArrayValue, + } + } ]; + + [MTRDeviceTests checkAttributeReportTriggersConfigurationChanged:MTRAttributeIDTypeGlobalAttributeAttributeListID clusterId:MTRClusterIDTypeIdentifyID endpointId:@(0) device:device delegate:delegate dataVersion:dataVersionForAttributeList attributeReport:attributeReport testcase:self expectConfigurationChanged:YES]; + + // Test attribute path - endpointId = 0, clusterId = identify, attributeId = cluster revision. + dataVersionForClusterRevision = [NSNumber numberWithUnsignedLongLong:(dataVersionForClusterRevision.unsignedLongLongValue + 1)]; + attributeReport = @[ @{ + MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(0) clusterID:@(MTRClusterIDTypeIdentifyID) attributeID:@(MTRAttributeIDTypeGlobalAttributeClusterRevisionID)], + MTRDataKey : @ { + MTRDataVersionKey : dataVersionForClusterRevision, + MTRTypeKey : MTRUnsignedIntegerValueType, + MTRValueKey : @9999, + } + } ]; + + [MTRDeviceTests checkAttributeReportTriggersConfigurationChanged:MTRAttributeIDTypeGlobalAttributeClusterRevisionID clusterId:MTRClusterIDTypeIdentifyID endpointId:@(0) device:device delegate:delegate dataVersion:dataVersionForClusterRevision attributeReport:attributeReport testcase:self expectConfigurationChanged:YES]; + + // Test attribute path - endpointId = 0, clusterId = groupsID, attributeId = feature map. + dataVersionForFeatureMap = [NSNumber numberWithUnsignedLongLong:(dataVersionForFeatureMap.unsignedLongLongValue + 1)]; + attributeReport = @[ @{ + MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(0) clusterID:@(MTRClusterIDTypeGroupsID) attributeID:@(MTRAttributeIDTypeGlobalAttributeFeatureMapID)], + MTRDataKey : @ { + MTRDataVersionKey : dataVersionForFeatureMap, + MTRTypeKey : MTRUnsignedIntegerValueType, + MTRValueKey : @2, + } + } ]; + + [MTRDeviceTests checkAttributeReportTriggersConfigurationChanged:MTRAttributeIDTypeGlobalAttributeFeatureMapID clusterId:MTRClusterIDTypeGroupsID endpointId:@(0) device:device delegate:delegate dataVersion:dataVersionForFeatureMap attributeReport:attributeReport testcase:self expectConfigurationChanged:YES]; + + // Test attribute path that doesn't cause a device configuration changed - endpointId = 1, clusterId = power source configuration, attributeId = sources. + dataVersionForPowerConfigurationSources = [NSNumber numberWithUnsignedLongLong:(dataVersionForPowerConfigurationSources.unsignedLongLongValue + 1)]; + attributeReport = @[ @{ + MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(0) clusterID:@(MTRClusterIDTypePowerSourceConfigurationID) attributeID:@(MTRAttributeIDTypeClusterPowerSourceConfigurationAttributeSourcesID)], + MTRDataKey : @ { + MTRDataVersionKey : dataVersionForPowerConfigurationSources, + MTRTypeKey : MTRArrayValueType, + MTRValueKey : unsignedIntegerArrayValue, + } + } ]; + + [MTRDeviceTests checkAttributeReportTriggersConfigurationChanged:MTRAttributeIDTypeClusterPowerSourceConfigurationAttributeSourcesID clusterId:MTRClusterIDTypePowerSourceConfigurationID endpointId:@(0) device:device delegate:delegate dataVersion:dataVersionForPowerConfigurationSources attributeReport:attributeReport testcase:self expectConfigurationChanged:NO]; + + NSArray<NSDictionary<NSString *, id> *> * newUnsignedIntegerArrayValue = @[ + @{ + MTRDataKey : @ { + MTRTypeKey : MTRUnsignedIntegerValueType, + MTRValueKey : @1, + } + }, + @{ + MTRDataKey : @ { + MTRTypeKey : MTRUnsignedIntegerValueType, + MTRValueKey : @2, + } + } + ]; + + // Test an attribute report with multiple attributes at least one of which triggers device configuration changed. + dataVersionForAttributeList = [NSNumber numberWithUnsignedLongLong:(dataVersionForAttributeList.unsignedLongLongValue + 1)]; + dataVersionForFeatureMap = [NSNumber numberWithUnsignedLongLong:(dataVersionForFeatureMap.unsignedLongLongValue + 1)]; + dataVersionForPowerConfigurationSources = [NSNumber numberWithUnsignedLongLong:(dataVersionForPowerConfigurationSources.unsignedLongLongValue + 1)]; + attributeReport = @[ + @{ + MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(0) clusterID:@(MTRClusterIDTypeIdentifyID) attributeID:@(MTRAttributeIDTypeGlobalAttributeAttributeListID)], + MTRDataKey : @ { + MTRDataVersionKey : dataVersionForAttributeList, + MTRTypeKey : MTRArrayValueType, + MTRValueKey : unsignedIntegerArrayValue, + } + }, + @{ + MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(0) clusterID:@(MTRClusterIDTypeGroupsID) attributeID:@(MTRAttributeIDTypeGlobalAttributeFeatureMapID)], + MTRDataKey : @ { + MTRDataVersionKey : dataVersionForFeatureMap, + MTRTypeKey : MTRUnsignedIntegerValueType, + MTRValueKey : @3, + } + }, + @{ + MTRAttributePathKey : [MTRAttributePath attributePathWithEndpointID:@(0) clusterID:@(MTRClusterIDTypePowerSourceConfigurationID) attributeID:@(MTRAttributeIDTypeClusterPowerSourceConfigurationAttributeSourcesID)], + MTRDataKey : @ { + MTRDataVersionKey : dataVersionForPowerConfigurationSources, + MTRTypeKey : MTRArrayValueType, + MTRValueKey : newUnsignedIntegerArrayValue, + } + } + ]; + + XCTestExpectation * gotAttributeReportWithMultipleAttributesExpectation = [self expectationWithDescription:@"Attribute report with multiple attributes has been received"]; + XCTestExpectation * gotAttributeReportWithMultipleAttributesEndExpectation = [self expectationWithDescription:@"Attribute report with multiple attributes has ended"]; + XCTestExpectation * deviceConfigurationChangedExpectationForAttributeReportWithMultipleAttributes = [self expectationWithDescription:@"Device configuration changed was receieved due to an attribute report with multiple attributes "]; + delegate.onAttributeDataReceived = ^(NSArray<NSDictionary<NSString *, id> *> * attributeReport) { + attributeReportsReceived += attributeReport.count; + XCTAssert(attributeReportsReceived > 0); + [gotAttributeReportWithMultipleAttributesExpectation fulfill]; + }; + + delegate.onReportEnd = ^() { + [gotAttributeReportWithMultipleAttributesEndExpectation fulfill]; + }; + + delegate.onDeviceConfigurationChanged = ^() { + [deviceConfigurationChangedExpectationForAttributeReportWithMultipleAttributes fulfill]; + }; + + [device unitTestInjectAttributeReport:attributeReport]; + [self waitForExpectations:@[ gotAttributeReportWithMultipleAttributesExpectation, gotAttributeReportWithMultipleAttributesEndExpectation, deviceConfigurationChangedExpectationForAttributeReportWithMultipleAttributes ] timeout:kTimeoutInSeconds]; + + // We need to remove the device here, because we injected data into its attribute cache + // that does not match the actual server. + // TODO: #33205 Ensure we have a clean slate w.r.t MTRDevice before running each test. + [sController removeDevice:device]; +} + @end @interface MTRDeviceEncoderTests : XCTestCase diff --git a/src/darwin/Framework/CHIPTests/TestHelpers/MTRDeviceTestDelegate.h b/src/darwin/Framework/CHIPTests/TestHelpers/MTRDeviceTestDelegate.h index 5c42d2eb1022af..3e749366e0d722 100644 --- a/src/darwin/Framework/CHIPTests/TestHelpers/MTRDeviceTestDelegate.h +++ b/src/darwin/Framework/CHIPTests/TestHelpers/MTRDeviceTestDelegate.h @@ -30,6 +30,7 @@ typedef void (^MTRDeviceTestDelegateDataHandler)(NSArray<NSDictionary<NSString * @property (nonatomic, nullable) dispatch_block_t onDeviceCachePrimed; @property (nonatomic) BOOL skipExpectedValuesForWrite; @property (nonatomic) BOOL forceAttributeReportsIfMatchingCache; +@property (nonatomic, nullable) dispatch_block_t onDeviceConfigurationChanged; @end NS_ASSUME_NONNULL_END diff --git a/src/darwin/Framework/CHIPTests/TestHelpers/MTRDeviceTestDelegate.m b/src/darwin/Framework/CHIPTests/TestHelpers/MTRDeviceTestDelegate.m index fd1e00190ef5b6..b515af3f9fe75b 100644 --- a/src/darwin/Framework/CHIPTests/TestHelpers/MTRDeviceTestDelegate.m +++ b/src/darwin/Framework/CHIPTests/TestHelpers/MTRDeviceTestDelegate.m @@ -69,4 +69,12 @@ - (BOOL)unitTestForceAttributeReportsIfMatchingCache:(MTRDevice *)device { return self.forceAttributeReportsIfMatchingCache; } + +- (void)deviceConfigurationChanged:(MTRDevice *)device +{ + if (self.onDeviceConfigurationChanged != nil) { + self.onDeviceConfigurationChanged(); + } +} + @end diff --git a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h index ba0d94e1c341dc..3b4cdae5cacb2d 100644 --- a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h +++ b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h @@ -62,6 +62,7 @@ NS_ASSUME_NONNULL_BEGIN @interface MTRDevice (TestDebug) - (void)unitTestInjectEventReport:(NSArray<NSDictionary<NSString *, id> *> *)eventReport; +- (void)unitTestInjectAttributeReport:(NSArray<NSDictionary<NSString *, id> *> *)attributeReport; - (NSUInteger)unitTestAttributesReportedSinceLastCheck; - (void)unitTestClearClusterData; @end From a8e4344b52012b7f2f698cf840046d00fd26679e Mon Sep 17 00:00:00 2001 From: Alex Tsitsiura <s07641069@gmail.com> Date: Fri, 3 May 2024 19:01:43 +0300 Subject: [PATCH 111/124] [Telink] Update Docker image (Zephyr update) (#33289) --- integrations/docker/images/base/chip-build/version | 2 +- integrations/docker/images/stage-2/chip-build-telink/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/docker/images/base/chip-build/version b/integrations/docker/images/base/chip-build/version index 5b67d363eb896b..67a7593c5796b8 100644 --- a/integrations/docker/images/base/chip-build/version +++ b/integrations/docker/images/base/chip-build/version @@ -1 +1 @@ -49 : [Silabs] Update SDKs to new versions +50 : [Telink] Update Docker image (Zephyr update) diff --git a/integrations/docker/images/stage-2/chip-build-telink/Dockerfile b/integrations/docker/images/stage-2/chip-build-telink/Dockerfile index 46a1409fb6176d..1333a4bfaaa286 100644 --- a/integrations/docker/images/stage-2/chip-build-telink/Dockerfile +++ b/integrations/docker/images/stage-2/chip-build-telink/Dockerfile @@ -12,7 +12,7 @@ RUN set -x \ && : # last line # Setup Zephyr -ARG ZEPHYR_REVISION=047fe473eb7e407d9905c7f1f24533e12f534280 +ARG ZEPHYR_REVISION=68deadeb5c20b82d68700e720d4580e8003bf1d8 WORKDIR /opt/telink/zephyrproject RUN set -x \ && python3 -m pip install -U --no-cache-dir west \ From 9ba6d0cf6380ac83b83613da8e828f4b4ad76f92 Mon Sep 17 00:00:00 2001 From: Martin 'JaMa' Jansa <Martin.Jansa@gmail.com> Date: Fri, 3 May 2024 18:05:35 +0200 Subject: [PATCH 112/124] pkg-config.py: fix IndexError when --variable=prefix is empty (#33288) sometimes (e.g. with openssl-3.3.0) the pkg-config returns just new-line and prefix[-4] then fails with IndexError. Fixes: Command: python3 build/config/linux/pkg-config.py -s recipe-sysroot --system_libdir lib openssl Returned 1. stderr: Traceback (most recent call last): File "build/config/linux/pkg-config.py", line 259, in <module> sys.exit(main()) ^^^^^^ File "build/config/linux/pkg-config.py", line 156, in main prefix = GetPkgConfigPrefixToStrip(options, args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "build/config/linux/pkg-config.py", line 102, in GetPkgConfigPrefixToStrip if prefix[-4] == '/usr': ~~~~~~^^^^ IndexError: string index out of range This part was originally introduced in pkg-config.py in chromium: https://chromium.googlesource.com/chromium/src/build/config/+/3df971b0a5e23e51c1c739fc1908caa1d95b8ac8%5E%21/#F1 The -4 typo was fixed in chromium with: https://chromium.googlesource.com/chromium/src/build/config/+/be2d385088cfb3a9f9f92c1dcb5c39b40fa28271%5E%21/#F0 And prefix isn't set in openssl pkg-config since: https://github.com/openssl/openssl/commit/2ac569a67b9d0980efa2d8061a6a61e0645f37a7 Signed-off-by: Martin Jansa <martin.jansa@gmail.com> --- build/config/linux/pkg-config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/config/linux/pkg-config.py b/build/config/linux/pkg-config.py index ded24789504596..4d6e773a00d666 100755 --- a/build/config/linux/pkg-config.py +++ b/build/config/linux/pkg-config.py @@ -99,7 +99,7 @@ def GetPkgConfigPrefixToStrip(options, args): # from pkg-config's |prefix| variable. prefix = subprocess.check_output([options.pkg_config, "--variable=prefix"] + args, env=os.environ).decode('utf-8') - if prefix[-4] == '/usr': + if prefix[:4] == '/usr': return prefix[4:] return prefix From 39703f7d3919444e53784c16b71afa67942a7fc5 Mon Sep 17 00:00:00 2001 From: Wang Qixiang <43193572+wqx6@users.noreply.github.com> Date: Sat, 4 May 2024 00:09:07 +0800 Subject: [PATCH 113/124] esp32: service type should be case-insensitive for endpoint filter of mdns packets (#33206) --- src/platform/ESP32/ESP32EndpointQueueFilter.h | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/platform/ESP32/ESP32EndpointQueueFilter.h b/src/platform/ESP32/ESP32EndpointQueueFilter.h index 031ea29b64d798..aa283d9b7fd770 100644 --- a/src/platform/ESP32/ESP32EndpointQueueFilter.h +++ b/src/platform/ESP32/ESP32EndpointQueueFilter.h @@ -44,7 +44,8 @@ class ESP32EndpointQueueFilter : public EndpointQueueFilter } // Drop the mDNS packets which don't contain 'matter' or '<device-hostname>'. const uint8_t matterBytes[] = { 'm', 'a', 't', 't', 'e', 'r' }; - if (PayloadContains(pktPayload, ByteSpan(matterBytes)) || PayloadContainsHostNameCaseInsensitive(pktPayload)) + if (PayloadContainsCaseInsensitive(pktPayload, ByteSpan(matterBytes)) || + PayloadContainsCaseInsensitive(pktPayload, ByteSpan(mHostNameBuffer))) { return FilterOutcome::kAllowPacket; } @@ -79,34 +80,34 @@ class ESP32EndpointQueueFilter : public EndpointQueueFilter return false; } - static bool PayloadContains(const chip::System::PacketBufferHandle & payload, const chip::ByteSpan & byteSpan) + static bool BytesCaseInsensitiveCompare(const uint8_t * buf1, const uint8_t * buf2, size_t size) { - if (payload->HasChainedBuffer() || payload->TotalLength() < byteSpan.size()) - { - return false; - } - for (size_t i = 0; i <= payload->TotalLength() - byteSpan.size(); ++i) + for (size_t i = 0; i < size; ++i) { - if (memcmp(payload->Start() + i, byteSpan.data(), byteSpan.size()) == 0) + uint8_t byte1 = (buf1[i] >= 'A' && buf1[i] <= 'Z') ? buf1[i] - 'A' + 'a' : buf1[i]; + uint8_t byte2 = (buf2[i] >= 'A' && buf2[i] <= 'Z') ? buf2[i] - 'A' + 'a' : buf2[i]; + if (byte1 != byte2) { - return true; + return false; } } - return false; + return true; } - bool PayloadContainsHostNameCaseInsensitive(const chip::System::PacketBufferHandle & payload) + static bool PayloadContainsCaseInsensitive(const chip::System::PacketBufferHandle & payload, const chip::ByteSpan & byteSpan) { - uint8_t hostNameLowerCase[12]; - memcpy(hostNameLowerCase, mHostNameBuffer, sizeof(mHostNameBuffer)); - for (size_t i = 0; i < sizeof(hostNameLowerCase); ++i) + if (payload->HasChainedBuffer() || payload->TotalLength() < byteSpan.size()) + { + return false; + } + for (size_t i = 0; i <= payload->TotalLength() - byteSpan.size(); ++i) { - if (hostNameLowerCase[i] <= 'F' && hostNameLowerCase[i] >= 'A') + if (BytesCaseInsensitiveCompare(payload->Start() + i, byteSpan.data(), byteSpan.size())) { - hostNameLowerCase[i] = static_cast<uint8_t>('a' + hostNameLowerCase[i] - 'A'); + return true; } } - return PayloadContains(payload, ByteSpan(mHostNameBuffer)) || PayloadContains(payload, ByteSpan(hostNameLowerCase)); + return false; } static bool IsValidMdnsHostName(const chip::CharSpan & hostName) From 39000e6b2f91076be8ff646a7e412762124a899f Mon Sep 17 00:00:00 2001 From: Yufeng Wang <yufengwang@google.com> Date: Fri, 3 May 2024 16:39:08 +0000 Subject: [PATCH 114/124] [bridge-app] Fix wrong config file get included (#33278) --- examples/bridge-app/linux/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/bridge-app/linux/BUILD.gn b/examples/bridge-app/linux/BUILD.gn index 490c59d17ad6b1..212fb9dd3a9264 100644 --- a/examples/bridge-app/linux/BUILD.gn +++ b/examples/bridge-app/linux/BUILD.gn @@ -20,8 +20,8 @@ assert(chip_build_tools) executable("chip-bridge-app") { sources = [ + "${chip_root}/examples/bridge-app/bridge-common/include/CHIPProjectAppConfig.h", "${chip_root}/examples/bridge-app/linux/bridged-actions-stub.cpp", - "${chip_root}/examples/tv-app/tv-common/include/CHIPProjectAppConfig.h", "Device.cpp", "include/Device.h", "include/main.h", From beb7f11358606c2150131258cd8c723fea616c69 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky <bzbarsky@apple.com> Date: Fri, 3 May 2024 13:26:41 -0400 Subject: [PATCH 115/124] Remove provisional markings from SmokeCOAlarm and AirQuality in Matter.framework. (#33282) --- .../CHIP/templates/availability.yaml | 121 ++++++++- .../CHIP/zap-generated/MTRBaseClusters.h | 250 +++++++++--------- .../CHIP/zap-generated/MTRClusterConstants.h | 76 +++--- .../CHIP/zap-generated/MTRClusters.h | 64 ++--- .../zap-generated/MTRCommandPayloadsObjc.h | 2 +- .../CHIP/zap-generated/MTRStructsObjc.h | 32 +-- .../zap-generated/cluster/Commands.h | 131 --------- 7 files changed, 331 insertions(+), 345 deletions(-) diff --git a/src/darwin/Framework/CHIP/templates/availability.yaml b/src/darwin/Framework/CHIP/templates/availability.yaml index b745709fa434cf..19e20a541241de 100644 --- a/src/darwin/Framework/CHIP/templates/availability.yaml +++ b/src/darwin/Framework/CHIP/templates/availability.yaml @@ -7458,7 +7458,6 @@ provisional: clusters: ## Not ready at cutoff - - AirQuality # Replaceable Monitoring clusters - HEPAFilterMonitoring - ActivatedCarbonFilterMonitoring @@ -7475,7 +7474,6 @@ - TotalVolatileOrganicCompoundsConcentrationMeasurement - RefrigeratorAlarm - TemperatureControl - - SmokeCOAlarm ## Not ready to be public API yet. - ICDManagement - LaundryWasherMode @@ -8528,23 +8526,97 @@ - release: "Future" versions: "future" introduced: + clusters: + - AirQuality + - SmokeCOAlarm attributes: + AirQuality: + - AirQuality + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision FanControl: - AirflowDirection + SmokeCOAlarm: + - ExpressedState + - SmokeState + - COState + - BatteryAlert + - DeviceMuted + - TestInProgress + - HardwareFaultAlert + - EndOfServiceAlert + - InterconnectSmokeAlarm + - InterconnectCOAlarm + - ContaminationState + - SmokeSensitivityLevel + - ExpiryDate + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision commands: FanControl: - Step + SmokeCOAlarm: + - SelfTestRequest command fields: FanControl: Step: - direction - wrap - lowestOff + events: + SmokeCOAlarm: + - SmokeAlarm + - COAlarm + - LowBattery + - HardwareFault + - EndOfService + - SelfTestComplete + - AlarmMuted + - MuteEnded + - InterconnectSmokeAlarm + - InterconnectCOAlarm + - AllClear + event fields: + SmokeCOAlarm: + SmokeAlarm: + - alarmSeverityLevel + COAlarm: + - alarmSeverityLevel + LowBattery: + - alarmSeverityLevel + InterconnectSmokeAlarm: + - alarmSeverityLevel + InterconnectCOAlarm: + - alarmSeverityLevel enums: + AirQuality: + - AirQualityEnum FanControl: - StepDirectionEnum - AirflowDirectionEnum + SmokeCOAlarm: + - AlarmStateEnum + - SensitivityEnum + - ExpressedStateEnum + - MuteStateEnum + - EndOfServiceEnum + - ContaminationStateEnum enum values: + AirQuality: + AirQualityEnum: + - Unknown + - Good + - Fair + - Moderate + - Poor + - VeryPoor + - ExtremelyPoor FanControl: StepDirectionEnum: - Increase @@ -8552,11 +8624,56 @@ AirflowDirectionEnum: - Forward - Reverse + SmokeCOAlarm: + AlarmStateEnum: + - Normal + - Warning + - Critical + SensitivityEnum: + - High + - Standard + - Low + ExpressedStateEnum: + - Normal + - SmokeAlarm + - COAlarm + - BatteryAlert + - Testing + - HardwareFault + - EndOfService + - InterconnectSmoke + - InterconnectCO + MuteStateEnum: + - NotMuted + - Muted + EndOfServiceEnum: + - Normal + - Expired + ContaminationStateEnum: + - Normal + - Low + - Warning + - Critical + bitmaps: + AirQuality: + - Feature + SmokeCOAlarm: + - Feature bitmap values: + AirQuality: + Feature: + - Fair + - Moderate + - VeryPoor + - ExtremelyPoor FanControl: Feature: - Step - AirflowDirection + SmokeCOAlarm: + Feature: + - SmokeAlarm + - COAlarm provisional: clusters: # Targeting Spring 2024 Matter release diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h index d28558722a280f..675a74560dcb37 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h @@ -5849,26 +5849,26 @@ MTR_PROVISIONALLY_AVAILABLE * * Attributes for reporting air quality classification */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRBaseClusterAirQuality : MTRGenericBaseCluster -- (void)readAttributeAirQualityWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAirQualityWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAirQualityWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAirQualityWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAirQualityWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)readAttributeEventListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeEventListWithParams:(MTRSubscribeParams *)params @@ -5876,23 +5876,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeEventListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -5907,7 +5907,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -5916,7 +5916,7 @@ MTR_PROVISIONALLY_AVAILABLE * * This cluster provides an interface for observing and managing the state of smoke and CO alarms. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRBaseClusterSmokeCOAlarm : MTRGenericBaseCluster /** @@ -5924,101 +5924,101 @@ MTR_PROVISIONALLY_AVAILABLE * * This command SHALL initiate a device self-test. */ -- (void)selfTestRequestWithParams:(MTRSmokeCOAlarmClusterSelfTestRequestParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)selfTestRequestWithParams:(MTRSmokeCOAlarmClusterSelfTestRequestParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE; - (void)selfTestRequestWithCompletion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_NEWLY_AVAILABLE; -- (void)readAttributeExpressedStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeExpressedStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeExpressedStateWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeExpressedStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeExpressedStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeSmokeStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSmokeStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeSmokeStateWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSmokeStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeSmokeStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeCOStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeCOStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeCOStateWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeCOStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeCOStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeBatteryAlertWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeBatteryAlertWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeBatteryAlertWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeBatteryAlertWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeBatteryAlertWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeDeviceMutedWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeDeviceMutedWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeDeviceMutedWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeDeviceMutedWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeDeviceMutedWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeTestInProgressWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeTestInProgressWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeTestInProgressWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeTestInProgressWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeTestInProgressWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeHardwareFaultAlertWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeHardwareFaultAlertWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeHardwareFaultAlertWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeHardwareFaultAlertWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeHardwareFaultAlertWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeEndOfServiceAlertWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeEndOfServiceAlertWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeEndOfServiceAlertWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeEndOfServiceAlertWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeEndOfServiceAlertWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeInterconnectSmokeAlarmWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeInterconnectSmokeAlarmWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeInterconnectSmokeAlarmWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeInterconnectSmokeAlarmWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeInterconnectSmokeAlarmWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeInterconnectCOAlarmWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeInterconnectCOAlarmWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeInterconnectCOAlarmWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeInterconnectCOAlarmWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeInterconnectCOAlarmWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeContaminationStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeContaminationStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeContaminationStateWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeContaminationStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeContaminationStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeSmokeSensitivityLevelWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeSmokeSensitivityLevelWithValue:(NSNumber * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeSmokeSensitivityLevelWithValue:(NSNumber * _Nonnull)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSmokeSensitivityLevelWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; +- (void)writeAttributeSmokeSensitivityLevelWithValue:(NSNumber * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE; +- (void)writeAttributeSmokeSensitivityLevelWithValue:(NSNumber * _Nonnull)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeSmokeSensitivityLevelWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSmokeSensitivityLevelWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeSmokeSensitivityLevelWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeExpiryDateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeExpiryDateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeExpiryDateWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeExpiryDateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeExpiryDateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)readAttributeEventListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeEventListWithParams:(MTRSubscribeParams *)params @@ -6026,23 +6026,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeEventListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -6057,7 +6057,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -17519,67 +17519,67 @@ typedef NS_OPTIONS(uint32_t, MTRDishwasherModeFeature) { } MTR_PROVISIONALLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRAirQuality) { - MTRAirQualityUnknown MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRAirQualityGood MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRAirQualityFair MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRAirQualityModerate MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRAirQualityPoor MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRAirQualityVeryPoor MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRAirQualityExtremelyPoor MTR_PROVISIONALLY_AVAILABLE = 0x06, -} MTR_PROVISIONALLY_AVAILABLE; + MTRAirQualityUnknown MTR_NEWLY_AVAILABLE = 0x00, + MTRAirQualityGood MTR_NEWLY_AVAILABLE = 0x01, + MTRAirQualityFair MTR_NEWLY_AVAILABLE = 0x02, + MTRAirQualityModerate MTR_NEWLY_AVAILABLE = 0x03, + MTRAirQualityPoor MTR_NEWLY_AVAILABLE = 0x04, + MTRAirQualityVeryPoor MTR_NEWLY_AVAILABLE = 0x05, + MTRAirQualityExtremelyPoor MTR_NEWLY_AVAILABLE = 0x06, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRAirQualityFeature) { - MTRAirQualityFeatureFair MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRAirQualityFeatureModerate MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRAirQualityFeatureVeryPoor MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRAirQualityFeatureExtremelyPoor MTR_PROVISIONALLY_AVAILABLE = 0x8, -} MTR_PROVISIONALLY_AVAILABLE; + MTRAirQualityFeatureFair MTR_NEWLY_AVAILABLE = 0x1, + MTRAirQualityFeatureModerate MTR_NEWLY_AVAILABLE = 0x2, + MTRAirQualityFeatureVeryPoor MTR_NEWLY_AVAILABLE = 0x4, + MTRAirQualityFeatureExtremelyPoor MTR_NEWLY_AVAILABLE = 0x8, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRSmokeCOAlarmAlarmState) { - MTRSmokeCOAlarmAlarmStateNormal MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRSmokeCOAlarmAlarmStateWarning MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRSmokeCOAlarmAlarmStateCritical MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRSmokeCOAlarmAlarmStateNormal MTR_NEWLY_AVAILABLE = 0x00, + MTRSmokeCOAlarmAlarmStateWarning MTR_NEWLY_AVAILABLE = 0x01, + MTRSmokeCOAlarmAlarmStateCritical MTR_NEWLY_AVAILABLE = 0x02, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRSmokeCOAlarmContaminationState) { - MTRSmokeCOAlarmContaminationStateNormal MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRSmokeCOAlarmContaminationStateLow MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRSmokeCOAlarmContaminationStateWarning MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRSmokeCOAlarmContaminationStateCritical MTR_PROVISIONALLY_AVAILABLE = 0x03, -} MTR_PROVISIONALLY_AVAILABLE; + MTRSmokeCOAlarmContaminationStateNormal MTR_NEWLY_AVAILABLE = 0x00, + MTRSmokeCOAlarmContaminationStateLow MTR_NEWLY_AVAILABLE = 0x01, + MTRSmokeCOAlarmContaminationStateWarning MTR_NEWLY_AVAILABLE = 0x02, + MTRSmokeCOAlarmContaminationStateCritical MTR_NEWLY_AVAILABLE = 0x03, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRSmokeCOAlarmEndOfService) { - MTRSmokeCOAlarmEndOfServiceNormal MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRSmokeCOAlarmEndOfServiceExpired MTR_PROVISIONALLY_AVAILABLE = 0x01, -} MTR_PROVISIONALLY_AVAILABLE; + MTRSmokeCOAlarmEndOfServiceNormal MTR_NEWLY_AVAILABLE = 0x00, + MTRSmokeCOAlarmEndOfServiceExpired MTR_NEWLY_AVAILABLE = 0x01, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRSmokeCOAlarmExpressedState) { - MTRSmokeCOAlarmExpressedStateNormal MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRSmokeCOAlarmExpressedStateSmokeAlarm MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRSmokeCOAlarmExpressedStateCOAlarm MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRSmokeCOAlarmExpressedStateBatteryAlert MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRSmokeCOAlarmExpressedStateTesting MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRSmokeCOAlarmExpressedStateHardwareFault MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRSmokeCOAlarmExpressedStateEndOfService MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTRSmokeCOAlarmExpressedStateInterconnectSmoke MTR_PROVISIONALLY_AVAILABLE = 0x07, - MTRSmokeCOAlarmExpressedStateInterconnectCO MTR_PROVISIONALLY_AVAILABLE = 0x08, -} MTR_PROVISIONALLY_AVAILABLE; + MTRSmokeCOAlarmExpressedStateNormal MTR_NEWLY_AVAILABLE = 0x00, + MTRSmokeCOAlarmExpressedStateSmokeAlarm MTR_NEWLY_AVAILABLE = 0x01, + MTRSmokeCOAlarmExpressedStateCOAlarm MTR_NEWLY_AVAILABLE = 0x02, + MTRSmokeCOAlarmExpressedStateBatteryAlert MTR_NEWLY_AVAILABLE = 0x03, + MTRSmokeCOAlarmExpressedStateTesting MTR_NEWLY_AVAILABLE = 0x04, + MTRSmokeCOAlarmExpressedStateHardwareFault MTR_NEWLY_AVAILABLE = 0x05, + MTRSmokeCOAlarmExpressedStateEndOfService MTR_NEWLY_AVAILABLE = 0x06, + MTRSmokeCOAlarmExpressedStateInterconnectSmoke MTR_NEWLY_AVAILABLE = 0x07, + MTRSmokeCOAlarmExpressedStateInterconnectCO MTR_NEWLY_AVAILABLE = 0x08, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRSmokeCOAlarmMuteState) { - MTRSmokeCOAlarmMuteStateNotMuted MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRSmokeCOAlarmMuteStateMuted MTR_PROVISIONALLY_AVAILABLE = 0x01, -} MTR_PROVISIONALLY_AVAILABLE; + MTRSmokeCOAlarmMuteStateNotMuted MTR_NEWLY_AVAILABLE = 0x00, + MTRSmokeCOAlarmMuteStateMuted MTR_NEWLY_AVAILABLE = 0x01, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRSmokeCOAlarmSensitivity) { - MTRSmokeCOAlarmSensitivityHigh MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRSmokeCOAlarmSensitivityStandard MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRSmokeCOAlarmSensitivityLow MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRSmokeCOAlarmSensitivityHigh MTR_NEWLY_AVAILABLE = 0x00, + MTRSmokeCOAlarmSensitivityStandard MTR_NEWLY_AVAILABLE = 0x01, + MTRSmokeCOAlarmSensitivityLow MTR_NEWLY_AVAILABLE = 0x02, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRSmokeCOAlarmFeature) { - MTRSmokeCOAlarmFeatureSmokeAlarm MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRSmokeCOAlarmFeatureCOAlarm MTR_PROVISIONALLY_AVAILABLE = 0x2, -} MTR_PROVISIONALLY_AVAILABLE; + MTRSmokeCOAlarmFeatureSmokeAlarm MTR_NEWLY_AVAILABLE = 0x1, + MTRSmokeCOAlarmFeatureCOAlarm MTR_NEWLY_AVAILABLE = 0x2, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRDishwasherAlarmAlarmBitmap) { MTRDishwasherAlarmAlarmBitmapInflowError MTR_PROVISIONALLY_AVAILABLE = 0x1, diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h index 00d597ee594fd1..8acfee8619fe6c 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h @@ -137,8 +137,8 @@ typedef NS_ENUM(uint32_t, MTRClusterIDType) { MTRClusterIDTypeTemperatureControlID MTR_PROVISIONALLY_AVAILABLE = 0x00000056, MTRClusterIDTypeRefrigeratorAlarmID MTR_PROVISIONALLY_AVAILABLE = 0x00000057, MTRClusterIDTypeDishwasherModeID MTR_PROVISIONALLY_AVAILABLE = 0x00000059, - MTRClusterIDTypeAirQualityID MTR_PROVISIONALLY_AVAILABLE = 0x0000005B, - MTRClusterIDTypeSmokeCOAlarmID MTR_PROVISIONALLY_AVAILABLE = 0x0000005C, + MTRClusterIDTypeAirQualityID MTR_NEWLY_AVAILABLE = 0x0000005B, + MTRClusterIDTypeSmokeCOAlarmID MTR_NEWLY_AVAILABLE = 0x0000005C, MTRClusterIDTypeDishwasherAlarmID MTR_PROVISIONALLY_AVAILABLE = 0x0000005D, MTRClusterIDTypeMicrowaveOvenModeID MTR_PROVISIONALLY_AVAILABLE = 0x0000005E, MTRClusterIDTypeMicrowaveOvenControlID MTR_PROVISIONALLY_AVAILABLE = 0x0000005F, @@ -2409,34 +2409,34 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterDishwasherModeAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster AirQuality attributes - MTRAttributeIDTypeClusterAirQualityAttributeAirQualityID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterAirQualityAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterAirQualityAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterAirQualityAttributeAirQualityID MTR_NEWLY_AVAILABLE = 0x00000000, + MTRAttributeIDTypeClusterAirQualityAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterAirQualityAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterAirQualityAttributeEventListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeEventListID, - MTRAttributeIDTypeClusterAirQualityAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterAirQualityAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterAirQualityAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterAirQualityAttributeAttributeListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterAirQualityAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterAirQualityAttributeClusterRevisionID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster SmokeCOAlarm attributes - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeExpressedStateID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeSmokeStateID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeCOStateID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeBatteryAlertID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeDeviceMutedID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeTestInProgressID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeHardwareFaultAlertID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeEndOfServiceAlertID MTR_PROVISIONALLY_AVAILABLE = 0x00000007, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeInterconnectSmokeAlarmID MTR_PROVISIONALLY_AVAILABLE = 0x00000008, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeInterconnectCOAlarmID MTR_PROVISIONALLY_AVAILABLE = 0x00000009, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeContaminationStateID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeSmokeSensitivityLevelID MTR_PROVISIONALLY_AVAILABLE = 0x0000000B, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeExpiryDateID MTR_PROVISIONALLY_AVAILABLE = 0x0000000C, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeExpressedStateID MTR_NEWLY_AVAILABLE = 0x00000000, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeSmokeStateID MTR_NEWLY_AVAILABLE = 0x00000001, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeCOStateID MTR_NEWLY_AVAILABLE = 0x00000002, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeBatteryAlertID MTR_NEWLY_AVAILABLE = 0x00000003, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeDeviceMutedID MTR_NEWLY_AVAILABLE = 0x00000004, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeTestInProgressID MTR_NEWLY_AVAILABLE = 0x00000005, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeHardwareFaultAlertID MTR_NEWLY_AVAILABLE = 0x00000006, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeEndOfServiceAlertID MTR_NEWLY_AVAILABLE = 0x00000007, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeInterconnectSmokeAlarmID MTR_NEWLY_AVAILABLE = 0x00000008, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeInterconnectCOAlarmID MTR_NEWLY_AVAILABLE = 0x00000009, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeContaminationStateID MTR_NEWLY_AVAILABLE = 0x0000000A, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeSmokeSensitivityLevelID MTR_NEWLY_AVAILABLE = 0x0000000B, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeExpiryDateID MTR_NEWLY_AVAILABLE = 0x0000000C, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterSmokeCOAlarmAttributeEventListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeEventListID, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterSmokeCOAlarmAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeAttributeListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterSmokeCOAlarmAttributeClusterRevisionID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster DishwasherAlarm attributes MTRAttributeIDTypeClusterDishwasherAlarmAttributeMaskID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, @@ -6219,7 +6219,7 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { MTRCommandIDTypeClusterDishwasherModeCommandChangeToModeResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, // Cluster SmokeCOAlarm commands - MTRCommandIDTypeClusterSmokeCOAlarmCommandSelfTestRequestID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, + MTRCommandIDTypeClusterSmokeCOAlarmCommandSelfTestRequestID MTR_NEWLY_AVAILABLE = 0x00000000, // Cluster DishwasherAlarm commands MTRCommandIDTypeClusterDishwasherAlarmCommandResetID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, @@ -7167,17 +7167,17 @@ typedef NS_ENUM(uint32_t, MTREventIDType) { MTREventIDTypeClusterRefrigeratorAlarmEventNotifyID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, // Cluster SmokeCOAlarm events - MTREventIDTypeClusterSmokeCOAlarmEventSmokeAlarmID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTREventIDTypeClusterSmokeCOAlarmEventCOAlarmID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTREventIDTypeClusterSmokeCOAlarmEventLowBatteryID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTREventIDTypeClusterSmokeCOAlarmEventHardwareFaultID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTREventIDTypeClusterSmokeCOAlarmEventEndOfServiceID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTREventIDTypeClusterSmokeCOAlarmEventSelfTestCompleteID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTREventIDTypeClusterSmokeCOAlarmEventAlarmMutedID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTREventIDTypeClusterSmokeCOAlarmEventMuteEndedID MTR_PROVISIONALLY_AVAILABLE = 0x00000007, - MTREventIDTypeClusterSmokeCOAlarmEventInterconnectSmokeAlarmID MTR_PROVISIONALLY_AVAILABLE = 0x00000008, - MTREventIDTypeClusterSmokeCOAlarmEventInterconnectCOAlarmID MTR_PROVISIONALLY_AVAILABLE = 0x00000009, - MTREventIDTypeClusterSmokeCOAlarmEventAllClearID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, + MTREventIDTypeClusterSmokeCOAlarmEventSmokeAlarmID MTR_NEWLY_AVAILABLE = 0x00000000, + MTREventIDTypeClusterSmokeCOAlarmEventCOAlarmID MTR_NEWLY_AVAILABLE = 0x00000001, + MTREventIDTypeClusterSmokeCOAlarmEventLowBatteryID MTR_NEWLY_AVAILABLE = 0x00000002, + MTREventIDTypeClusterSmokeCOAlarmEventHardwareFaultID MTR_NEWLY_AVAILABLE = 0x00000003, + MTREventIDTypeClusterSmokeCOAlarmEventEndOfServiceID MTR_NEWLY_AVAILABLE = 0x00000004, + MTREventIDTypeClusterSmokeCOAlarmEventSelfTestCompleteID MTR_NEWLY_AVAILABLE = 0x00000005, + MTREventIDTypeClusterSmokeCOAlarmEventAlarmMutedID MTR_NEWLY_AVAILABLE = 0x00000006, + MTREventIDTypeClusterSmokeCOAlarmEventMuteEndedID MTR_NEWLY_AVAILABLE = 0x00000007, + MTREventIDTypeClusterSmokeCOAlarmEventInterconnectSmokeAlarmID MTR_NEWLY_AVAILABLE = 0x00000008, + MTREventIDTypeClusterSmokeCOAlarmEventInterconnectCOAlarmID MTR_NEWLY_AVAILABLE = 0x00000009, + MTREventIDTypeClusterSmokeCOAlarmEventAllClearID MTR_NEWLY_AVAILABLE = 0x0000000A, // Cluster DishwasherAlarm events MTREventIDTypeClusterDishwasherAlarmEventNotifyID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h index 0805d773d372df..e50e18029bf2c4 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h @@ -2776,22 +2776,22 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Air Quality * Attributes for reporting air quality classification */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRClusterAirQuality : MTRGenericCluster -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAirQualityWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAirQualityWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (NSDictionary<NSString *, id> * _Nullable)readAttributeEventListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -2806,7 +2806,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -2814,52 +2814,52 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Smoke CO Alarm * This cluster provides an interface for observing and managing the state of smoke and CO alarms. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRClusterSmokeCOAlarm : MTRGenericCluster -- (void)selfTestRequestWithParams:(MTRSmokeCOAlarmClusterSelfTestRequestParams * _Nullable)params expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)selfTestRequestWithParams:(MTRSmokeCOAlarmClusterSelfTestRequestParams * _Nullable)params expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE; - (void)selfTestRequestWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeExpressedStateWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeExpressedStateWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeSmokeStateWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeSmokeStateWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeCOStateWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeCOStateWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeBatteryAlertWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeBatteryAlertWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeDeviceMutedWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeDeviceMutedWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeTestInProgressWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeTestInProgressWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeHardwareFaultAlertWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeHardwareFaultAlertWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeEndOfServiceAlertWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeEndOfServiceAlertWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeInterconnectSmokeAlarmWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeInterconnectSmokeAlarmWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeInterconnectCOAlarmWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeInterconnectCOAlarmWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeContaminationStateWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeContaminationStateWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeSmokeSensitivityLevelWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeSmokeSensitivityLevelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeSmokeSensitivityLevelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeSmokeSensitivityLevelWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; +- (void)writeAttributeSmokeSensitivityLevelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_NEWLY_AVAILABLE; +- (void)writeAttributeSmokeSensitivityLevelWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeExpiryDateWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeExpiryDateWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (NSDictionary<NSString *, id> * _Nullable)readAttributeEventListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -2874,7 +2874,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h index 2d00e6618716e5..92631d7aefe46d 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h @@ -4361,7 +4361,7 @@ MTR_PROVISIONALLY_AVAILABLE error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRSmokeCOAlarmClusterSelfTestRequestParams : NSObject <NSCopying> /** * Controls whether the command is a timed command (using Timed Invoke). diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h index fb805fa04b3b43..db5ccba43f58f6 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h @@ -895,52 +895,52 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy) NSArray * _Nonnull modeTags MTR_PROVISIONALLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRSmokeCOAlarmClusterSmokeAlarmEvent : NSObject <NSCopying> -@property (nonatomic, copy) NSNumber * _Nonnull alarmSeverityLevel MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull alarmSeverityLevel MTR_NEWLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRSmokeCOAlarmClusterCOAlarmEvent : NSObject <NSCopying> -@property (nonatomic, copy) NSNumber * _Nonnull alarmSeverityLevel MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull alarmSeverityLevel MTR_NEWLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRSmokeCOAlarmClusterLowBatteryEvent : NSObject <NSCopying> -@property (nonatomic, copy) NSNumber * _Nonnull alarmSeverityLevel MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull alarmSeverityLevel MTR_NEWLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRSmokeCOAlarmClusterHardwareFaultEvent : NSObject <NSCopying> @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRSmokeCOAlarmClusterEndOfServiceEvent : NSObject <NSCopying> @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRSmokeCOAlarmClusterSelfTestCompleteEvent : NSObject <NSCopying> @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRSmokeCOAlarmClusterAlarmMutedEvent : NSObject <NSCopying> @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRSmokeCOAlarmClusterMuteEndedEvent : NSObject <NSCopying> @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRSmokeCOAlarmClusterInterconnectSmokeAlarmEvent : NSObject <NSCopying> -@property (nonatomic, copy) NSNumber * _Nonnull alarmSeverityLevel MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull alarmSeverityLevel MTR_NEWLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRSmokeCOAlarmClusterInterconnectCOAlarmEvent : NSObject <NSCopying> -@property (nonatomic, copy) NSNumber * _Nonnull alarmSeverityLevel MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull alarmSeverityLevel MTR_NEWLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRSmokeCOAlarmClusterAllClearEvent : NSObject <NSCopying> @end diff --git a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h index 117f2b78066392..b179b81486e462 100644 --- a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h +++ b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h @@ -61534,7 +61534,6 @@ class SubscribeAttributeDishwasherModeClusterRevision : public SubscribeAttribut #endif // MTR_ENABLE_PROVISIONAL #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster AirQuality | 0x005B | |------------------------------------------------------------------------------| @@ -61552,8 +61551,6 @@ class SubscribeAttributeDishwasherModeClusterRevision : public SubscribeAttribut | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AirQuality */ @@ -61636,9 +61633,6 @@ class SubscribeAttributeAirQualityAirQuality : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -61721,9 +61715,6 @@ class SubscribeAttributeAirQualityGeneratedCommandList : public SubscribeAttribu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -61806,7 +61797,6 @@ class SubscribeAttributeAirQualityAcceptedCommandList : public SubscribeAttribut } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -61892,7 +61882,6 @@ class SubscribeAttributeAirQualityEventList : public SubscribeAttribute { }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute AttributeList @@ -61976,9 +61965,6 @@ class SubscribeAttributeAirQualityAttributeList : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -62061,9 +62047,6 @@ class SubscribeAttributeAirQualityFeatureMap : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -62146,9 +62129,6 @@ class SubscribeAttributeAirQualityClusterRevision : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster SmokeCoAlarm | 0x005C | |------------------------------------------------------------------------------| @@ -62190,7 +62170,6 @@ class SubscribeAttributeAirQualityClusterRevision : public SubscribeAttribute { | * AllClear | 0x000A | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command SelfTestRequest */ @@ -62235,10 +62214,6 @@ class SmokeCoAlarmSelfTestRequest : public ClusterCommand { private: }; -#endif // MTR_ENABLE_PROVISIONAL - -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ExpressedState */ @@ -62321,9 +62296,6 @@ class SubscribeAttributeSmokeCoAlarmExpressedState : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SmokeState */ @@ -62406,9 +62378,6 @@ class SubscribeAttributeSmokeCoAlarmSmokeState : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute COState */ @@ -62491,9 +62460,6 @@ class SubscribeAttributeSmokeCoAlarmCOState : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute BatteryAlert */ @@ -62576,9 +62542,6 @@ class SubscribeAttributeSmokeCoAlarmBatteryAlert : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute DeviceMuted */ @@ -62661,9 +62624,6 @@ class SubscribeAttributeSmokeCoAlarmDeviceMuted : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute TestInProgress */ @@ -62746,9 +62706,6 @@ class SubscribeAttributeSmokeCoAlarmTestInProgress : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute HardwareFaultAlert */ @@ -62831,9 +62788,6 @@ class SubscribeAttributeSmokeCoAlarmHardwareFaultAlert : public SubscribeAttribu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute EndOfServiceAlert */ @@ -62916,9 +62870,6 @@ class SubscribeAttributeSmokeCoAlarmEndOfServiceAlert : public SubscribeAttribut } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute InterconnectSmokeAlarm */ @@ -63001,9 +62952,6 @@ class SubscribeAttributeSmokeCoAlarmInterconnectSmokeAlarm : public SubscribeAtt } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute InterconnectCOAlarm */ @@ -63086,9 +63034,6 @@ class SubscribeAttributeSmokeCoAlarmInterconnectCOAlarm : public SubscribeAttrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ContaminationState */ @@ -63171,9 +63116,6 @@ class SubscribeAttributeSmokeCoAlarmContaminationState : public SubscribeAttribu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SmokeSensitivityLevel */ @@ -63297,9 +63239,6 @@ class SubscribeAttributeSmokeCoAlarmSmokeSensitivityLevel : public SubscribeAttr } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ExpiryDate */ @@ -63382,9 +63321,6 @@ class SubscribeAttributeSmokeCoAlarmExpiryDate : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -63467,9 +63403,6 @@ class SubscribeAttributeSmokeCoAlarmGeneratedCommandList : public SubscribeAttri } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -63552,7 +63485,6 @@ class SubscribeAttributeSmokeCoAlarmAcceptedCommandList : public SubscribeAttrib } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -63638,7 +63570,6 @@ class SubscribeAttributeSmokeCoAlarmEventList : public SubscribeAttribute { }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute AttributeList @@ -63722,9 +63653,6 @@ class SubscribeAttributeSmokeCoAlarmAttributeList : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -63807,9 +63735,6 @@ class SubscribeAttributeSmokeCoAlarmFeatureMap : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -63892,8 +63817,6 @@ class SubscribeAttributeSmokeCoAlarmClusterRevision : public SubscribeAttribute } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster DishwasherAlarm | 0x005D | @@ -185610,7 +185533,6 @@ void registerClusterDishwasherMode(Commands & commands) } void registerClusterAirQuality(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::AirQuality; const char * clusterName = "AirQuality"; @@ -185620,137 +185542,84 @@ void registerClusterAirQuality(Commands & commands) make_unique<ReadAttribute>(Id), // make_unique<WriteAttribute>(Id), // make_unique<SubscribeAttribute>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<ReadAirQualityAirQuality>(), // make_unique<SubscribeAttributeAirQualityAirQuality>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadAirQualityGeneratedCommandList>(), // make_unique<SubscribeAttributeAirQualityGeneratedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadAirQualityAcceptedCommandList>(), // make_unique<SubscribeAttributeAirQualityAcceptedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique<ReadAirQualityEventList>(), // make_unique<SubscribeAttributeAirQualityEventList>(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadAirQualityAttributeList>(), // make_unique<SubscribeAttributeAirQualityAttributeList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadAirQualityFeatureMap>(), // make_unique<SubscribeAttributeAirQualityFeatureMap>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadAirQualityClusterRevision>(), // make_unique<SubscribeAttributeAirQualityClusterRevision>(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterSmokeCoAlarm(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::SmokeCoAlarm; const char * clusterName = "SmokeCoAlarm"; commands_list clusterCommands = { make_unique<ClusterCommand>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<SmokeCoAlarmSelfTestRequest>(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique<ReadAttribute>(Id), // make_unique<WriteAttribute>(Id), // make_unique<SubscribeAttribute>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmExpressedState>(), // make_unique<SubscribeAttributeSmokeCoAlarmExpressedState>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmSmokeState>(), // make_unique<SubscribeAttributeSmokeCoAlarmSmokeState>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmCOState>(), // make_unique<SubscribeAttributeSmokeCoAlarmCOState>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmBatteryAlert>(), // make_unique<SubscribeAttributeSmokeCoAlarmBatteryAlert>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmDeviceMuted>(), // make_unique<SubscribeAttributeSmokeCoAlarmDeviceMuted>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmTestInProgress>(), // make_unique<SubscribeAttributeSmokeCoAlarmTestInProgress>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmHardwareFaultAlert>(), // make_unique<SubscribeAttributeSmokeCoAlarmHardwareFaultAlert>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmEndOfServiceAlert>(), // make_unique<SubscribeAttributeSmokeCoAlarmEndOfServiceAlert>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmInterconnectSmokeAlarm>(), // make_unique<SubscribeAttributeSmokeCoAlarmInterconnectSmokeAlarm>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmInterconnectCOAlarm>(), // make_unique<SubscribeAttributeSmokeCoAlarmInterconnectCOAlarm>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmContaminationState>(), // make_unique<SubscribeAttributeSmokeCoAlarmContaminationState>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmSmokeSensitivityLevel>(), // make_unique<WriteSmokeCoAlarmSmokeSensitivityLevel>(), // make_unique<SubscribeAttributeSmokeCoAlarmSmokeSensitivityLevel>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmExpiryDate>(), // make_unique<SubscribeAttributeSmokeCoAlarmExpiryDate>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmGeneratedCommandList>(), // make_unique<SubscribeAttributeSmokeCoAlarmGeneratedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmAcceptedCommandList>(), // make_unique<SubscribeAttributeSmokeCoAlarmAcceptedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmEventList>(), // make_unique<SubscribeAttributeSmokeCoAlarmEventList>(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmAttributeList>(), // make_unique<SubscribeAttributeSmokeCoAlarmAttributeList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmFeatureMap>(), // make_unique<SubscribeAttributeSmokeCoAlarmFeatureMap>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadSmokeCoAlarmClusterRevision>(), // make_unique<SubscribeAttributeSmokeCoAlarmClusterRevision>(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique<ReadEvent>(Id), // make_unique<SubscribeEvent>(Id), // }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterDishwasherAlarm(Commands & commands) { From 0afc132a64faf70cbb7eaff6a2849b0810cc4d09 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky <bzbarsky@apple.com> Date: Fri, 3 May 2024 14:24:10 -0400 Subject: [PATCH 116/124] Fix leak in MTRBaseDevice tests. (#33275) Our test code in deregisterReportHandlersWithQueue would directly delete the ReadClient, but that never called OnDone, and hence never deleted the BufferedReadClientCallback<MTRDataValueDictionaryDecodableType> that we had also allocated. The fix is to put all the things we need to deallocate in the MTRReadClientContainer and consistently use it to clean those things up, including on all the various failure paths we have. Removes the CauseReadClientFailure function which did not in fact cause a failure, and instead just has the relevant test trigger a subscription drop. --- src/darwin/Framework/CHIP/MTRBaseDevice.mm | 112 ++++-------------- .../Framework/CHIPTests/MTRDeviceTests.m | 39 ++++-- .../TestHelpers/MTRTestDeclarations.h | 2 - 3 files changed, 53 insertions(+), 100 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRBaseDevice.mm b/src/darwin/Framework/CHIP/MTRBaseDevice.mm index 356e607ad86d4b..0712e779c525e6 100644 --- a/src/darwin/Framework/CHIP/MTRBaseDevice.mm +++ b/src/darwin/Framework/CHIP/MTRBaseDevice.mm @@ -91,12 +91,18 @@ NSString * const MTREventIsHistoricalKey = @"eventIsHistorical"; class MTRDataValueDictionaryCallbackBridge; +class MTRDataValueDictionaryDecodableType; +template <typename DecodableValueType> +class BufferedReadClientCallback; @interface MTRReadClientContainer : NSObject @property (nonatomic, readwrite) app::ReadClient * readClientPtr; +@property (nonatomic, readwrite) BufferedReadClientCallback<MTRDataValueDictionaryDecodableType> * callback; @property (nonatomic, readwrite) app::AttributePathParams * pathParams; @property (nonatomic, readwrite) app::EventPathParams * eventPathParams; @property (nonatomic, readwrite) uint64_t deviceID; + +- (void)cleanup; - (void)onDone; @end @@ -157,22 +163,7 @@ static void PurgeReadClientContainers( [controller asyncDispatchToMatterQueue:^() { for (MTRReadClientContainer * container in listToDelete) { - if (container.readClientPtr) { - Platform::Delete(container.readClientPtr); - container.readClientPtr = nullptr; - } - if (container.pathParams) { - static_assert(std::is_trivially_destructible<AttributePathParams>::value, - "AttributePathParams destructors won't get run"); - Platform::MemoryFree(container.pathParams); - container.pathParams = nullptr; - } - if (container.eventPathParams) { - static_assert( - std::is_trivially_destructible<EventPathParams>::value, "EventPathParams destructors won't get run"); - Platform::MemoryFree(container.eventPathParams); - container.eventPathParams = nullptr; - } + [container cleanup]; } [listToDelete removeAllObjects]; if (completion) { @@ -204,47 +195,13 @@ static void PurgeCompletedReadClientContainers(uint64_t deviceId) [readClientContainersLock unlock]; } -#ifdef DEBUG -// This function is for unit testing only. This function closes all read clients. -static void CauseReadClientFailure( - MTRDeviceController * controller, uint64_t deviceId, dispatch_queue_t queue, void (^_Nullable completion)(void)) -{ - InitializeReadClientContainers(); - - NSMutableArray<MTRReadClientContainer *> * listToFail; - NSNumber * key = [NSNumber numberWithUnsignedLongLong:deviceId]; - [readClientContainersLock lock]; - listToFail = readClientContainers[key]; - [readClientContainers removeObjectForKey:key]; - [readClientContainersLock unlock]; - - [controller - asyncDispatchToMatterQueue:^() { - for (MTRReadClientContainer * container in listToFail) { - // Send auto resubscribe request again by read clients, which must fail. - chip::app::ReadPrepareParams readParams; - if (container.readClientPtr) { - container.readClientPtr->SendAutoResubscribeRequest(std::move(readParams)); - } - } - if (completion) { - dispatch_async(queue, completion); - } - } - errorHandler:^(NSError * error) { - // Can't fail things. Just put them back. - ReinstateReadClientList(listToFail, key, queue, completion); - }]; -} -#endif - static bool CheckMemberOfType(NSDictionary<NSString *, id> * responseValue, NSString * memberName, Class expectedClass, NSString * errorMessage, NSError * __autoreleasing * error); static void LogStringAndReturnError(NSString * errorStr, CHIP_ERROR errorCode, NSError * __autoreleasing * error); static void LogStringAndReturnError(NSString * errorStr, MTRErrorCode errorCode, NSError * __autoreleasing * error); @implementation MTRReadClientContainer -- (void)onDone +- (void)cleanup { if (_readClientPtr) { Platform::Delete(_readClientPtr); @@ -260,26 +217,19 @@ - (void)onDone Platform::MemoryFree(_eventPathParams); _eventPathParams = nullptr; } - PurgeCompletedReadClientContainers(_deviceID); + if (_callback) { + Platform::Delete(_callback); + _callback = nullptr; + } } -- (void)dealloc +- (void)onDone { - if (_readClientPtr) { - Platform::Delete(_readClientPtr); - _readClientPtr = nullptr; - } - if (_pathParams) { - static_assert(std::is_trivially_destructible<AttributePathParams>::value, "AttributePathParams destructors won't get run"); - Platform::MemoryFree(_pathParams); - _pathParams = nullptr; - } - if (_eventPathParams) { - static_assert(std::is_trivially_destructible<EventPathParams>::value, "EventPathParams destructors won't get run"); - Platform::MemoryFree(_eventPathParams); - _eventPathParams = nullptr; - } + [self cleanup]; + + PurgeCompletedReadClientContainers(_deviceID); } + @end @implementation MTRBaseDevice @@ -1730,6 +1680,7 @@ - (void)subscribeToAttributePaths:(NSArray<MTRAttributeRequestPath *> * _Nullabl dispatch_async(queue, ^{ reportHandler(nil, [MTRError errorForCHIPErrorCode:CHIP_ERROR_NO_MEMORY]); }); + [container cleanup]; return; } for (MTRAttributeRequestPath * attribute in attributes) { @@ -1744,6 +1695,7 @@ - (void)subscribeToAttributePaths:(NSArray<MTRAttributeRequestPath *> * _Nullabl dispatch_async(queue, ^{ reportHandler(nil, [MTRError errorForCHIPErrorCode:CHIP_ERROR_NO_MEMORY]); }); + [container cleanup]; return; } for (MTREventRequestPath * event in events) { @@ -1763,9 +1715,6 @@ - (void)subscribeToAttributePaths:(NSArray<MTRAttributeRequestPath *> * _Nullabl auto onDone = [container](BufferedReadClientCallback<MTRDataValueDictionaryDecodableType> * callback) { [container onDone]; - // Make sure we delete callback last, because doing that actually destroys our - // lambda, so we can't access captured values after that. - chip::Platform::Delete(callback); }; auto callback = chip::Platform::MakeUnique<BufferedReadClientCallback<MTRDataValueDictionaryDecodableType>>( @@ -1775,6 +1724,9 @@ - (void)subscribeToAttributePaths:(NSArray<MTRAttributeRequestPath *> * _Nullabl auto readClient = Platform::New<app::ReadClient>( engine, exchangeManager, callback->GetBufferedCallback(), chip::app::ReadClient::InteractionType::Subscribe); + container.readClientPtr = readClient; + container.callback = callback.release(); + if (!params.resubscribeAutomatically) { err = readClient->SendRequest(readParams); } else { @@ -1785,23 +1737,12 @@ - (void)subscribeToAttributePaths:(NSArray<MTRAttributeRequestPath *> * _Nullabl dispatch_async(queue, ^{ reportHandler(nil, [MTRError errorForCHIPErrorCode:err]); }); - Platform::Delete(readClient); - if (container.pathParams != nullptr) { - Platform::MemoryFree(container.pathParams); - } - - if (container.eventPathParams != nullptr) { - Platform::MemoryFree(container.eventPathParams); - } - container.pathParams = nullptr; - container.eventPathParams = nullptr; + [container cleanup]; return; } // Read clients will be purged when deregistered. - container.readClientPtr = readClient; AddReadClientContainer(container.deviceID, container); - callback.release(); }]; } @@ -2024,13 +1965,6 @@ - (void)openCommissioningWindowWithDiscriminator:(NSNumber *)discriminator } #ifdef DEBUG -// This method is for unit testing only -- (void)failSubscribers:(dispatch_queue_t)queue completion:(void (^)(void))completion -{ - MTR_LOG_DEBUG("Causing failure in subscribers on purpose"); - CauseReadClientFailure(self.deviceController, self.nodeID, queue, completion); -} - // The following method is for unit testing purpose only + (id)CHIPEncodeAndDecodeNSObject:(id)object { diff --git a/src/darwin/Framework/CHIPTests/MTRDeviceTests.m b/src/darwin/Framework/CHIPTests/MTRDeviceTests.m index 9871e1c1af18d7..0b198bcbbc8bdf 100644 --- a/src/darwin/Framework/CHIPTests/MTRDeviceTests.m +++ b/src/darwin/Framework/CHIPTests/MTRDeviceTests.m @@ -1082,8 +1082,8 @@ - (void)test012_SubscriptionError XCTAssertTrue([result[@"data"] isKindOfClass:[NSDictionary class]]); XCTAssertTrue([result[@"data"][@"type"] isEqualToString:@"Boolean"]); if ([result[@"data"][@"value"] boolValue] == YES) { - [reportExpectation fulfill]; globalReportHandler = nil; + [reportExpectation fulfill]; } }; @@ -1120,13 +1120,34 @@ - (void)test012_SubscriptionError // Wait for report [self waitForExpectations:[NSArray arrayWithObject:reportExpectation] timeout:kTimeoutInSeconds]; - // Trigger reader failure - XCTestExpectation * failureExpectation = [self expectationWithDescription:@"failed on purpose"]; - [device failSubscribers:queue - completion:^{ - [failureExpectation fulfill]; - }]; - [self waitForExpectations:@[ failureExpectation ] timeout:kTimeoutInSeconds]; + XCTestExpectation * errorExpectation1 = [self expectationWithDescription:@"First subscription errored out"]; + XCTestExpectation * errorExpectation2 = [self expectationWithDescription:@"Second subscription errored out"]; + + globalReportHandler = ^(id _Nullable values, NSError * _Nullable error) { + XCTAssertNil(values); + XCTAssertNotNil(error); + globalReportHandler = nil; + [errorExpectation1 fulfill]; + }; + + // Try to create a second subscription, which will cancel the first + // subscription. We can use a non-existent path here to cut down on the + // work that gets done. + params.replaceExistingSubscriptions = YES; + [device subscribeToAttributesWithEndpointID:@10000 + clusterID:@6 + attributeID:@0 + params:params + queue:queue + reportHandler:^(id _Nullable values, NSError * _Nullable error) { + XCTAssertNil(values); + XCTAssertNotNil(error); + [errorExpectation2 fulfill]; + } + subscriptionEstablished:^() { + XCTFail("Did not expect this subscription to succeed"); + }]; + [self waitForExpectations:@[ errorExpectation1, errorExpectation2 ] timeout:60]; deregisterExpectation = [self expectationWithDescription:@"Report handler deregistered"]; [device deregisterReportHandlersWithQueue:queue @@ -1135,7 +1156,7 @@ - (void)test012_SubscriptionError }]; [self waitForExpectations:@[ deregisterExpectation ] timeout:kTimeoutInSeconds]; } -#endif +#endif // DEBUG - (void)test013_ReuseChipClusterObject { diff --git a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h index 3b4cdae5cacb2d..119822099ce0a3 100644 --- a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h +++ b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h @@ -54,8 +54,6 @@ NS_ASSUME_NONNULL_BEGIN @end @interface MTRBaseDevice (TestDebug) -- (void)failSubscribers:(dispatch_queue_t)queue completion:(void (^)(void))completion; - // Test function for whitebox testing + (id)CHIPEncodeAndDecodeNSObject:(id)object; @end From 881676de173e779b9471eaae944c33e5780b038c Mon Sep 17 00:00:00 2001 From: Andrei Litvin <andy314@gmail.com> Date: Fri, 3 May 2024 15:24:56 -0400 Subject: [PATCH 117/124] Do not keep going using take data if take fails (#33296) Co-authored-by: Andrei Litvin <andreilitvin@google.com> --- src/lib/dnssd/Resolver_ImplMinimalMdns.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp b/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp index 64b194339b8bd1..8e17ce26b4eed5 100644 --- a/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp +++ b/src/lib/dnssd/Resolver_ImplMinimalMdns.cpp @@ -458,6 +458,7 @@ void MinMdnsResolver::AdvancePendingResolverStates() if (err != CHIP_NO_ERROR) { ChipLogError(Discovery, "Failed to take discovery result: %" CHIP_ERROR_FORMAT, err.Format()); + continue; } mActiveResolves.Complete(nodeData.operationalData.peerId); From 408f9fc31b77693a8ad80a6b368355fd9a08b30d Mon Sep 17 00:00:00 2001 From: Karsten Sperling <113487422+ksperling-apple@users.noreply.github.com> Date: Sat, 4 May 2024 07:38:29 +1200 Subject: [PATCH 118/124] Implement separate Produce and Consume SetupPayload validation modes (#33285) * Implement separate Produce and Consume SetupPayload validation modes In Consume mode, unknown rendevouz flags are allowed. * Simplify the validation code by using VerifyOrReturnValue setUpPINCode range is checked in IsValidSetupPIN() via CheckPayloadCommonConstraints() so no separate check is needed. * Fix comment spelling. --------- Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> --- src/setup_payload/SetupPayload.cpp | 78 +++++++++----------------- src/setup_payload/SetupPayload.h | 17 +++++- src/setup_payload/tests/TestQRCode.cpp | 7 +++ 3 files changed, 48 insertions(+), 54 deletions(-) diff --git a/src/setup_payload/SetupPayload.cpp b/src/setup_payload/SetupPayload.cpp index 063456327f6a62..1ef4795d571e4d 100644 --- a/src/setup_payload/SetupPayload.cpp +++ b/src/setup_payload/SetupPayload.cpp @@ -36,60 +36,43 @@ namespace chip { // Check the Setup Payload for validity // // `vendor_id` and `product_id` are allowed all of uint16_t -bool PayloadContents::isValidQRCodePayload() const +bool PayloadContents::isValidQRCodePayload(ValidationMode mode) const { // 3-bit value specifying the QR code payload version. - if (version >= 1 << kVersionFieldLengthInBits) - { - return false; - } + VerifyOrReturnValue(version < (1 << kVersionFieldLengthInBits), false); - if (static_cast<uint8_t>(commissioningFlow) > static_cast<uint8_t>((1 << kCommissioningFlowFieldLengthInBits) - 1)) - { - return false; - } + VerifyOrReturnValue(static_cast<uint8_t>(commissioningFlow) < (1 << kCommissioningFlowFieldLengthInBits), false); // Device Commissioning Flow + // Even in ValidationMode::kConsume we can only handle modes that we understand. // 0: Standard commissioning flow: such a device, when uncommissioned, always enters commissioning mode upon power-up, subject // to the rules in [ref_Announcement_Commencement]. 1: User-intent commissioning flow: user action required to enter // commissioning mode. 2: Custom commissioning flow: interaction with a vendor-specified means is needed before commissioning. // 3: Reserved - if (commissioningFlow != CommissioningFlow::kStandard && commissioningFlow != CommissioningFlow::kUserActionRequired && - commissioningFlow != CommissioningFlow::kCustom) - { - return false; - } - - chip::RendezvousInformationFlags allvalid(RendezvousInformationFlag::kBLE, RendezvousInformationFlag::kOnNetwork, - RendezvousInformationFlag::kSoftAP); - if (!rendezvousInformation.HasValue() || !rendezvousInformation.Value().HasOnly(allvalid)) - { - return false; - } + VerifyOrReturnValue(commissioningFlow == CommissioningFlow::kStandard || + commissioningFlow == CommissioningFlow::kUserActionRequired || + commissioningFlow == CommissioningFlow::kCustom, + false); // General discriminator validity is enforced by the SetupDiscriminator class, but it can't be short for QR a code. - if (discriminator.IsShortDiscriminator()) - { - return false; - } + VerifyOrReturnValue(!discriminator.IsShortDiscriminator(), false); - if (setUpPINCode >= 1 << kSetupPINCodeFieldLengthInBits) + // RendevouzInformation must be present for a QR code. + VerifyOrReturnValue(rendezvousInformation.HasValue(), false); + if (mode == ValidationMode::kProduce) { - return false; + chip::RendezvousInformationFlags valid(RendezvousInformationFlag::kBLE, RendezvousInformationFlag::kOnNetwork, + RendezvousInformationFlag::kSoftAP); + VerifyOrReturnValue(rendezvousInformation.Value().HasOnly(valid), false); } return CheckPayloadCommonConstraints(); } -bool PayloadContents::isValidManualCode() const +bool PayloadContents::isValidManualCode(ValidationMode mode) const { - // Discriminator validity is enforced by the SetupDiscriminator class. - - if (setUpPINCode >= 1 << kSetupPINCodeFieldLengthInBits) - { - return false; - } - + // No additional constraints apply to Manual Pairing Codes. + // (If the payload has a long discriminator it will be converted automatically.) return CheckPayloadCommonConstraints(); } @@ -109,31 +92,22 @@ bool PayloadContents::IsValidSetupPIN(uint32_t setupPIN) bool PayloadContents::CheckPayloadCommonConstraints() const { - // A version not equal to 0 would be invalid for v1 and would indicate new format (e.g. version 2) - if (version != 0) - { - return false; - } + // Validation rules in this method apply to all validation modes. - if (!IsValidSetupPIN(setUpPINCode)) - { - return false; - } + // Even in ValidationMode::kConsume we don't understand how to handle any payload version other than 0. + VerifyOrReturnValue(version == 0, false); + + VerifyOrReturnValue(IsValidSetupPIN(setUpPINCode), false); // VendorID must be unspecified (0) or in valid range expected. - if (!IsVendorIdValidOperationally(vendorID) && (vendorID != VendorId::Unspecified)) - { - return false; - } + VerifyOrReturnValue((vendorID == VendorId::Unspecified) || IsVendorIdValidOperationally(vendorID), false); // A value of 0x0000 SHALL NOT be assigned to a product since Product ID = 0x0000 is used for these specific cases: // * To announce an anonymized Product ID as part of device discovery // * To indicate an OTA software update file applies to multiple Product IDs equally. // * To avoid confusion when presenting the Onboarding Payload for ECM with multiple nodes - if (productID == 0 && vendorID != VendorId::Unspecified) - { - return false; - } + // In these special cases the vendorID must be 0 (Unspecified) + VerifyOrReturnValue(productID != 0 || vendorID == VendorId::Unspecified, false); return true; } diff --git a/src/setup_payload/SetupPayload.h b/src/setup_payload/SetupPayload.h index 6e81e0e0e48ddb..cc71547671fd8f 100644 --- a/src/setup_payload/SetupPayload.h +++ b/src/setup_payload/SetupPayload.h @@ -76,6 +76,7 @@ inline constexpr uint8_t kCommissioningTimeoutTag = 0x04; inline constexpr uint32_t kSetupPINCodeMaximumValue = 99999998; inline constexpr uint32_t kSetupPINCodeUndefinedValue = 0; +static_assert(kSetupPINCodeMaximumValue < (1 << kSetupPINCodeFieldLengthInBits)); // clang-format off const int kTotalPayloadDataSizeInBits = @@ -128,8 +129,20 @@ struct PayloadContents SetupDiscriminator discriminator; uint32_t setUpPINCode = 0; - bool isValidQRCodePayload() const; - bool isValidManualCode() const; + enum class ValidationMode : uint8_t + { + kProduce, ///< Only flags or values allowed by the current spec version are allowed. + /// Producers of a Setup Payload should use this mode to ensure the + // payload is valid according to the current spec version. + kConsume, ///< Flags or values that are reserved for future use, or were allowed in + /// a previous spec version may be present. Consumers of a Setup Payload + /// should use this mode to ensure they are forward and backwards + /// compatible with payloads from older or newer Matter devices. + }; + + bool isValidQRCodePayload(ValidationMode mode = ValidationMode::kProduce) const; + bool isValidManualCode(ValidationMode mode = ValidationMode::kProduce) const; + bool operator==(const PayloadContents & input) const; static bool IsValidSetupPIN(uint32_t setupPIN); diff --git a/src/setup_payload/tests/TestQRCode.cpp b/src/setup_payload/tests/TestQRCode.cpp index 6ca349c2884341..6482b9ad0e7b0a 100644 --- a/src/setup_payload/tests/TestQRCode.cpp +++ b/src/setup_payload/tests/TestQRCode.cpp @@ -307,6 +307,13 @@ TEST(TestQRCode, TestSetupPayloadVerify) invalid.SetRaw(static_cast<uint8_t>(invalid.Raw() + 1)); test_payload.rendezvousInformation.SetValue(invalid); EXPECT_EQ(test_payload.isValidQRCodePayload(), false); + // When validating in Consume mode, unknown rendezvous flags are OK. + EXPECT_TRUE(test_payload.isValidQRCodePayload(PayloadContents::ValidationMode::kConsume)); + test_payload.rendezvousInformation.SetValue(RendezvousInformationFlags(0xff)); + EXPECT_TRUE(test_payload.isValidQRCodePayload(PayloadContents::ValidationMode::kConsume)); + // Rendezvous information is still required even in Consume mode. + test_payload.rendezvousInformation.ClearValue(); + EXPECT_FALSE(test_payload.isValidQRCodePayload(PayloadContents::ValidationMode::kConsume)); // test invalid setup PIN test_payload = payload; From f0ba37400f7c56371c3c6befa13fde9b7c717bf8 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky <bzbarsky@apple.com> Date: Fri, 3 May 2024 16:17:23 -0400 Subject: [PATCH 119/124] Remove Darwin provisional markings for resource monitoring clusters. (#33297) --- .../CHIP/templates/availability.yaml | 97 +++++++- .../CHIP/zap-generated/MTRBaseClusters.h | 224 +++++++++--------- .../CHIP/zap-generated/MTRClusterConstants.h | 52 ++-- .../CHIP/zap-generated/MTRClusters.h | 68 +++--- .../zap-generated/MTRCommandPayloadsObjc.h | 4 +- .../CHIP/zap-generated/MTRStructsObjc.h | 12 +- .../zap-generated/cluster/Commands.h | 126 ---------- 7 files changed, 274 insertions(+), 309 deletions(-) diff --git a/src/darwin/Framework/CHIP/templates/availability.yaml b/src/darwin/Framework/CHIP/templates/availability.yaml index 19e20a541241de..b1275f67ef1462 100644 --- a/src/darwin/Framework/CHIP/templates/availability.yaml +++ b/src/darwin/Framework/CHIP/templates/availability.yaml @@ -7458,9 +7458,6 @@ provisional: clusters: ## Not ready at cutoff - # Replaceable Monitoring clusters - - HEPAFilterMonitoring - - ActivatedCarbonFilterMonitoring # Concentration Measurement clusters - CarbonDioxideConcentrationMeasurement - CarbonMonoxideConcentrationMeasurement @@ -8527,9 +8524,23 @@ versions: "future" introduced: clusters: + - ActivatedCarbonFilterMonitoring - AirQuality + - HEPAFilterMonitoring - SmokeCOAlarm attributes: + ActivatedCarbonFilterMonitoring: + - Condition + - DegradationDirection + - ChangeIndication + - InPlaceIndicator + - LastChangedTime + - ReplacementProductList + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision AirQuality: - AirQuality - GeneratedCommandList @@ -8539,6 +8550,18 @@ - ClusterRevision FanControl: - AirflowDirection + HEPAFilterMonitoring: + - Condition + - DegradationDirection + - ChangeIndication + - InPlaceIndicator + - LastChangedTime + - ReplacementProductList + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision SmokeCOAlarm: - ExpressedState - SmokeState @@ -8559,8 +8582,12 @@ - FeatureMap - ClusterRevision commands: + ActivatedCarbonFilterMonitoring: + - ResetCondition FanControl: - Step + HEPAFilterMonitoring: + - ResetCondition SmokeCOAlarm: - SelfTestRequest command fields: @@ -8569,6 +8596,20 @@ - direction - wrap - lowestOff + structs: + ActivatedCarbonFilterMonitoring: + - ReplacementProductStruct + HEPAFilterMonitoring: + - ReplacementProductStruct + struct fields: + ActivatedCarbonFilterMonitoring: + ReplacementProductStruct: + - productIdentifierType + - productIdentifierValue + HEPAFilterMonitoring: + ReplacementProductStruct: + - productIdentifierType + - productIdentifierValue events: SmokeCOAlarm: - SmokeAlarm @@ -8595,11 +8636,19 @@ InterconnectCOAlarm: - alarmSeverityLevel enums: + ActivatedCarbonFilterMonitoring: + - DegradationDirectionEnum + - ChangeIndicationEnum + - ProductIdentifierTypeEnum AirQuality: - AirQualityEnum FanControl: - StepDirectionEnum - AirflowDirectionEnum + HEPAFilterMonitoring: + - DegradationDirectionEnum + - ChangeIndicationEnum + - ProductIdentifierTypeEnum SmokeCOAlarm: - AlarmStateEnum - SensitivityEnum @@ -8608,6 +8657,20 @@ - EndOfServiceEnum - ContaminationStateEnum enum values: + ActivatedCarbonFilterMonitoring: + DegradationDirectionEnum: + - Up + - Down + ChangeIndicationEnum: + - OK + - Warning + - Critical + ProductIdentifierTypeEnum: + - UPC + - GTIN8 + - EAN + - GTIN14 + - OEM AirQuality: AirQualityEnum: - Unknown @@ -8624,6 +8687,20 @@ AirflowDirectionEnum: - Forward - Reverse + HEPAFilterMonitoring: + DegradationDirectionEnum: + - Up + - Down + ChangeIndicationEnum: + - OK + - Warning + - Critical + ProductIdentifierTypeEnum: + - UPC + - GTIN8 + - EAN + - GTIN14 + - OEM SmokeCOAlarm: AlarmStateEnum: - Normal @@ -8655,17 +8732,31 @@ - Warning - Critical bitmaps: + ActivatedCarbonFilterMonitoring: + - Feature AirQuality: - Feature + HEPAFilterMonitoring: + - Feature SmokeCOAlarm: - Feature bitmap values: + ActivatedCarbonFilterMonitoring: + Feature: + - Condition + - Warning + - ReplacementProductList AirQuality: Feature: - Fair - Moderate - VeryPoor - ExtremelyPoor + HEPAFilterMonitoring: + Feature: + - Condition + - Warning + - ReplacementProductList FanControl: Feature: - Step diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h index 675a74560dcb37..fb813f93804fdb 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h @@ -6747,7 +6747,7 @@ MTR_PROVISIONALLY_AVAILABLE * * Attributes and commands for monitoring HEPA filters in a device */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRBaseClusterHEPAFilterMonitoring : MTRGenericBaseCluster /** @@ -6755,59 +6755,59 @@ MTR_PROVISIONALLY_AVAILABLE * * Reset the condition of the replaceable to the non degraded state */ -- (void)resetConditionWithParams:(MTRHEPAFilterMonitoringClusterResetConditionParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)resetConditionWithParams:(MTRHEPAFilterMonitoringClusterResetConditionParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE; - (void)resetConditionWithCompletion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_NEWLY_AVAILABLE; -- (void)readAttributeConditionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeConditionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeConditionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeConditionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeConditionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeDegradationDirectionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeDegradationDirectionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeDegradationDirectionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeDegradationDirectionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeDegradationDirectionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeChangeIndicationWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeChangeIndicationWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeChangeIndicationWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeChangeIndicationWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeChangeIndicationWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeInPlaceIndicatorWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeInPlaceIndicatorWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeInPlaceIndicatorWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeInPlaceIndicatorWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeInPlaceIndicatorWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeLastChangedTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeLastChangedTimeWithValue:(NSNumber * _Nullable)value completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeLastChangedTimeWithValue:(NSNumber * _Nullable)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeLastChangedTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; +- (void)writeAttributeLastChangedTimeWithValue:(NSNumber * _Nullable)value completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE; +- (void)writeAttributeLastChangedTimeWithValue:(NSNumber * _Nullable)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeLastChangedTimeWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeLastChangedTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeLastChangedTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeReplacementProductListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeReplacementProductListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeReplacementProductListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeReplacementProductListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeReplacementProductListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)readAttributeEventListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeEventListWithParams:(MTRSubscribeParams *)params @@ -6815,23 +6815,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeEventListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -6846,7 +6846,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -6855,7 +6855,7 @@ MTR_PROVISIONALLY_AVAILABLE * * Attributes and commands for monitoring activated carbon filters in a device */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRBaseClusterActivatedCarbonFilterMonitoring : MTRGenericBaseCluster /** @@ -6863,59 +6863,59 @@ MTR_PROVISIONALLY_AVAILABLE * * Reset the condition of the replaceable to the non degraded state */ -- (void)resetConditionWithParams:(MTRActivatedCarbonFilterMonitoringClusterResetConditionParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)resetConditionWithParams:(MTRActivatedCarbonFilterMonitoringClusterResetConditionParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE; - (void)resetConditionWithCompletion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_NEWLY_AVAILABLE; -- (void)readAttributeConditionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeConditionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeConditionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeConditionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeConditionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeDegradationDirectionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeDegradationDirectionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeDegradationDirectionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeDegradationDirectionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeDegradationDirectionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeChangeIndicationWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeChangeIndicationWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeChangeIndicationWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeChangeIndicationWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeChangeIndicationWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeInPlaceIndicatorWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeInPlaceIndicatorWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeInPlaceIndicatorWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeInPlaceIndicatorWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeInPlaceIndicatorWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeLastChangedTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeLastChangedTimeWithValue:(NSNumber * _Nullable)value completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeLastChangedTimeWithValue:(NSNumber * _Nullable)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeLastChangedTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; +- (void)writeAttributeLastChangedTimeWithValue:(NSNumber * _Nullable)value completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE; +- (void)writeAttributeLastChangedTimeWithValue:(NSNumber * _Nullable)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeLastChangedTimeWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeLastChangedTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeLastChangedTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeReplacementProductListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeReplacementProductListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeReplacementProductListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeReplacementProductListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeReplacementProductListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)readAttributeEventListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeEventListWithParams:(MTRSubscribeParams *)params @@ -6923,23 +6923,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeEventListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -6954,7 +6954,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -17649,54 +17649,54 @@ typedef NS_OPTIONS(uint32_t, MTRScenesManagementFeature) { } MTR_PROVISIONALLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRHEPAFilterMonitoringChangeIndication) { - MTRHEPAFilterMonitoringChangeIndicationOK MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRHEPAFilterMonitoringChangeIndicationWarning MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRHEPAFilterMonitoringChangeIndicationCritical MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRHEPAFilterMonitoringChangeIndicationOK MTR_NEWLY_AVAILABLE = 0x00, + MTRHEPAFilterMonitoringChangeIndicationWarning MTR_NEWLY_AVAILABLE = 0x01, + MTRHEPAFilterMonitoringChangeIndicationCritical MTR_NEWLY_AVAILABLE = 0x02, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRHEPAFilterMonitoringDegradationDirection) { - MTRHEPAFilterMonitoringDegradationDirectionUp MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRHEPAFilterMonitoringDegradationDirectionDown MTR_PROVISIONALLY_AVAILABLE = 0x01, -} MTR_PROVISIONALLY_AVAILABLE; + MTRHEPAFilterMonitoringDegradationDirectionUp MTR_NEWLY_AVAILABLE = 0x00, + MTRHEPAFilterMonitoringDegradationDirectionDown MTR_NEWLY_AVAILABLE = 0x01, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRHEPAFilterMonitoringProductIdentifierType) { - MTRHEPAFilterMonitoringProductIdentifierTypeUPC MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRHEPAFilterMonitoringProductIdentifierTypeGTIN8 MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRHEPAFilterMonitoringProductIdentifierTypeEAN MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRHEPAFilterMonitoringProductIdentifierTypeGTIN14 MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRHEPAFilterMonitoringProductIdentifierTypeOEM MTR_PROVISIONALLY_AVAILABLE = 0x04, -} MTR_PROVISIONALLY_AVAILABLE; + MTRHEPAFilterMonitoringProductIdentifierTypeUPC MTR_NEWLY_AVAILABLE = 0x00, + MTRHEPAFilterMonitoringProductIdentifierTypeGTIN8 MTR_NEWLY_AVAILABLE = 0x01, + MTRHEPAFilterMonitoringProductIdentifierTypeEAN MTR_NEWLY_AVAILABLE = 0x02, + MTRHEPAFilterMonitoringProductIdentifierTypeGTIN14 MTR_NEWLY_AVAILABLE = 0x03, + MTRHEPAFilterMonitoringProductIdentifierTypeOEM MTR_NEWLY_AVAILABLE = 0x04, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRHEPAFilterMonitoringFeature) { - MTRHEPAFilterMonitoringFeatureCondition MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRHEPAFilterMonitoringFeatureWarning MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRHEPAFilterMonitoringFeatureReplacementProductList MTR_PROVISIONALLY_AVAILABLE = 0x4, -} MTR_PROVISIONALLY_AVAILABLE; + MTRHEPAFilterMonitoringFeatureCondition MTR_NEWLY_AVAILABLE = 0x1, + MTRHEPAFilterMonitoringFeatureWarning MTR_NEWLY_AVAILABLE = 0x2, + MTRHEPAFilterMonitoringFeatureReplacementProductList MTR_NEWLY_AVAILABLE = 0x4, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRActivatedCarbonFilterMonitoringChangeIndication) { - MTRActivatedCarbonFilterMonitoringChangeIndicationOK MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRActivatedCarbonFilterMonitoringChangeIndicationWarning MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRActivatedCarbonFilterMonitoringChangeIndicationCritical MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRActivatedCarbonFilterMonitoringChangeIndicationOK MTR_NEWLY_AVAILABLE = 0x00, + MTRActivatedCarbonFilterMonitoringChangeIndicationWarning MTR_NEWLY_AVAILABLE = 0x01, + MTRActivatedCarbonFilterMonitoringChangeIndicationCritical MTR_NEWLY_AVAILABLE = 0x02, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRActivatedCarbonFilterMonitoringDegradationDirection) { - MTRActivatedCarbonFilterMonitoringDegradationDirectionUp MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRActivatedCarbonFilterMonitoringDegradationDirectionDown MTR_PROVISIONALLY_AVAILABLE = 0x01, -} MTR_PROVISIONALLY_AVAILABLE; + MTRActivatedCarbonFilterMonitoringDegradationDirectionUp MTR_NEWLY_AVAILABLE = 0x00, + MTRActivatedCarbonFilterMonitoringDegradationDirectionDown MTR_NEWLY_AVAILABLE = 0x01, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRActivatedCarbonFilterMonitoringProductIdentifierType) { - MTRActivatedCarbonFilterMonitoringProductIdentifierTypeUPC MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRActivatedCarbonFilterMonitoringProductIdentifierTypeGTIN8 MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRActivatedCarbonFilterMonitoringProductIdentifierTypeEAN MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRActivatedCarbonFilterMonitoringProductIdentifierTypeGTIN14 MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRActivatedCarbonFilterMonitoringProductIdentifierTypeOEM MTR_PROVISIONALLY_AVAILABLE = 0x04, -} MTR_PROVISIONALLY_AVAILABLE; + MTRActivatedCarbonFilterMonitoringProductIdentifierTypeUPC MTR_NEWLY_AVAILABLE = 0x00, + MTRActivatedCarbonFilterMonitoringProductIdentifierTypeGTIN8 MTR_NEWLY_AVAILABLE = 0x01, + MTRActivatedCarbonFilterMonitoringProductIdentifierTypeEAN MTR_NEWLY_AVAILABLE = 0x02, + MTRActivatedCarbonFilterMonitoringProductIdentifierTypeGTIN14 MTR_NEWLY_AVAILABLE = 0x03, + MTRActivatedCarbonFilterMonitoringProductIdentifierTypeOEM MTR_NEWLY_AVAILABLE = 0x04, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRActivatedCarbonFilterMonitoringFeature) { - MTRActivatedCarbonFilterMonitoringFeatureCondition MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRActivatedCarbonFilterMonitoringFeatureWarning MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRActivatedCarbonFilterMonitoringFeatureReplacementProductList MTR_PROVISIONALLY_AVAILABLE = 0x4, -} MTR_PROVISIONALLY_AVAILABLE; + MTRActivatedCarbonFilterMonitoringFeatureCondition MTR_NEWLY_AVAILABLE = 0x1, + MTRActivatedCarbonFilterMonitoringFeatureWarning MTR_NEWLY_AVAILABLE = 0x2, + MTRActivatedCarbonFilterMonitoringFeatureReplacementProductList MTR_NEWLY_AVAILABLE = 0x4, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint8_t, MTRBooleanStateConfigurationAlarmModeBitmap) { MTRBooleanStateConfigurationAlarmModeBitmapVisual MTR_PROVISIONALLY_AVAILABLE = 0x1, diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h index 8acfee8619fe6c..adc2e93b212f90 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h @@ -145,8 +145,8 @@ typedef NS_ENUM(uint32_t, MTRClusterIDType) { MTRClusterIDTypeOperationalStateID MTR_AVAILABLE(ios(17.4), macos(14.4), watchos(10.4), tvos(17.4)) = 0x00000060, MTRClusterIDTypeRVCOperationalStateID MTR_AVAILABLE(ios(17.4), macos(14.4), watchos(10.4), tvos(17.4)) = 0x00000061, MTRClusterIDTypeScenesManagementID MTR_PROVISIONALLY_AVAILABLE = 0x00000062, - MTRClusterIDTypeHEPAFilterMonitoringID MTR_PROVISIONALLY_AVAILABLE = 0x00000071, - MTRClusterIDTypeActivatedCarbonFilterMonitoringID MTR_PROVISIONALLY_AVAILABLE = 0x00000072, + MTRClusterIDTypeHEPAFilterMonitoringID MTR_NEWLY_AVAILABLE = 0x00000071, + MTRClusterIDTypeActivatedCarbonFilterMonitoringID MTR_NEWLY_AVAILABLE = 0x00000072, MTRClusterIDTypeBooleanStateConfigurationID MTR_PROVISIONALLY_AVAILABLE = 0x00000080, MTRClusterIDTypeValveConfigurationAndControlID MTR_PROVISIONALLY_AVAILABLE = 0x00000081, MTRClusterIDTypeElectricalPowerMeasurementID MTR_PROVISIONALLY_AVAILABLE = 0x00000090, @@ -2517,32 +2517,32 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterScenesManagementAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster HEPAFilterMonitoring attributes - MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeConditionID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeDegradationDirectionID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeChangeIndicationID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeInPlaceIndicatorID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeLastChangedTimeID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeReplacementProductListID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeConditionID MTR_NEWLY_AVAILABLE = 0x00000000, + MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeDegradationDirectionID MTR_NEWLY_AVAILABLE = 0x00000001, + MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeChangeIndicationID MTR_NEWLY_AVAILABLE = 0x00000002, + MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeInPlaceIndicatorID MTR_NEWLY_AVAILABLE = 0x00000003, + MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeLastChangedTimeID MTR_NEWLY_AVAILABLE = 0x00000004, + MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeReplacementProductListID MTR_NEWLY_AVAILABLE = 0x00000005, + MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeEventListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeEventListID, - MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeAttributeListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterHEPAFilterMonitoringAttributeClusterRevisionID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster ActivatedCarbonFilterMonitoring attributes - MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeConditionID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeDegradationDirectionID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeChangeIndicationID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeInPlaceIndicatorID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeLastChangedTimeID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeReplacementProductListID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeConditionID MTR_NEWLY_AVAILABLE = 0x00000000, + MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeDegradationDirectionID MTR_NEWLY_AVAILABLE = 0x00000001, + MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeChangeIndicationID MTR_NEWLY_AVAILABLE = 0x00000002, + MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeInPlaceIndicatorID MTR_NEWLY_AVAILABLE = 0x00000003, + MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeLastChangedTimeID MTR_NEWLY_AVAILABLE = 0x00000004, + MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeReplacementProductListID MTR_NEWLY_AVAILABLE = 0x00000005, + MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeEventListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeEventListID, - MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeAttributeListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterActivatedCarbonFilterMonitoringAttributeClusterRevisionID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster BooleanStateConfiguration attributes MTRAttributeIDTypeClusterBooleanStateConfigurationAttributeCurrentSensitivityLevelID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, @@ -6260,10 +6260,10 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { MTRCommandIDTypeClusterScenesManagementCommandCopySceneResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000040, // Cluster HEPAFilterMonitoring commands - MTRCommandIDTypeClusterHEPAFilterMonitoringCommandResetConditionID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, + MTRCommandIDTypeClusterHEPAFilterMonitoringCommandResetConditionID MTR_NEWLY_AVAILABLE = 0x00000000, // Cluster ActivatedCarbonFilterMonitoring commands - MTRCommandIDTypeClusterActivatedCarbonFilterMonitoringCommandResetConditionID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, + MTRCommandIDTypeClusterActivatedCarbonFilterMonitoringCommandResetConditionID MTR_NEWLY_AVAILABLE = 0x00000000, // Cluster BooleanStateConfiguration commands MTRCommandIDTypeClusterBooleanStateConfigurationCommandSuppressAlarmID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h index e50e18029bf2c4..34567b17901868 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h @@ -3198,38 +3198,38 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster HEPA Filter Monitoring * Attributes and commands for monitoring HEPA filters in a device */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRClusterHEPAFilterMonitoring : MTRGenericCluster -- (void)resetConditionWithParams:(MTRHEPAFilterMonitoringClusterResetConditionParams * _Nullable)params expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)resetConditionWithParams:(MTRHEPAFilterMonitoringClusterResetConditionParams * _Nullable)params expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE; - (void)resetConditionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeLastChangedTimeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeLastChangedTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeLastChangedTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeLastChangedTimeWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; +- (void)writeAttributeLastChangedTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_NEWLY_AVAILABLE; +- (void)writeAttributeLastChangedTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeReplacementProductListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeReplacementProductListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (NSDictionary<NSString *, id> * _Nullable)readAttributeEventListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -3244,7 +3244,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -3252,38 +3252,38 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Activated Carbon Filter Monitoring * Attributes and commands for monitoring activated carbon filters in a device */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRClusterActivatedCarbonFilterMonitoring : MTRGenericCluster -- (void)resetConditionWithParams:(MTRActivatedCarbonFilterMonitoringClusterResetConditionParams * _Nullable)params expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)resetConditionWithParams:(MTRActivatedCarbonFilterMonitoringClusterResetConditionParams * _Nullable)params expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE; - (void)resetConditionWithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeConditionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeDegradationDirectionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeChangeIndicationWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeInPlaceIndicatorWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeLastChangedTimeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeLastChangedTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeLastChangedTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeLastChangedTimeWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; +- (void)writeAttributeLastChangedTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_NEWLY_AVAILABLE; +- (void)writeAttributeLastChangedTimeWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeReplacementProductListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeReplacementProductListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (NSDictionary<NSString *, id> * _Nullable)readAttributeEventListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -3298,7 +3298,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h index 92631d7aefe46d..4e774a8cb54e38 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h @@ -5184,7 +5184,7 @@ MTR_PROVISIONALLY_AVAILABLE error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRHEPAFilterMonitoringClusterResetConditionParams : NSObject <NSCopying> /** * Controls whether the command is a timed command (using Timed Invoke). @@ -5212,7 +5212,7 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRActivatedCarbonFilterMonitoringClusterResetConditionParams : NSObject <NSCopying> /** * Controls whether the command is a timed command (using Timed Invoke). diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h index db5ccba43f58f6..5dbf7101e1b480 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h @@ -1037,16 +1037,16 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy) NSNumber * _Nonnull fabricIndex MTR_PROVISIONALLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRHEPAFilterMonitoringClusterReplacementProductStruct : NSObject <NSCopying> -@property (nonatomic, copy) NSNumber * _Nonnull productIdentifierType MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nonnull productIdentifierValue MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull productIdentifierType MTR_NEWLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull productIdentifierValue MTR_NEWLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRActivatedCarbonFilterMonitoringClusterReplacementProductStruct : NSObject <NSCopying> -@property (nonatomic, copy) NSNumber * _Nonnull productIdentifierType MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nonnull productIdentifierValue MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull productIdentifierType MTR_NEWLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull productIdentifierValue MTR_NEWLY_AVAILABLE; @end MTR_PROVISIONALLY_AVAILABLE diff --git a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h index b179b81486e462..2f9e82485cd77d 100644 --- a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h +++ b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h @@ -70711,7 +70711,6 @@ class SubscribeAttributeScenesManagementClusterRevision : public SubscribeAttrib #endif // MTR_ENABLE_PROVISIONAL #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster HepaFilterMonitoring | 0x0071 | |------------------------------------------------------------------------------| @@ -70735,7 +70734,6 @@ class SubscribeAttributeScenesManagementClusterRevision : public SubscribeAttrib | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command ResetCondition */ @@ -70780,10 +70778,6 @@ class HepaFilterMonitoringResetCondition : public ClusterCommand { private: }; -#endif // MTR_ENABLE_PROVISIONAL - -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Condition */ @@ -70866,9 +70860,6 @@ class SubscribeAttributeHepaFilterMonitoringCondition : public SubscribeAttribut } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute DegradationDirection */ @@ -70951,9 +70942,6 @@ class SubscribeAttributeHepaFilterMonitoringDegradationDirection : public Subscr } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ChangeIndication */ @@ -71036,9 +71024,6 @@ class SubscribeAttributeHepaFilterMonitoringChangeIndication : public SubscribeA } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute InPlaceIndicator */ @@ -71121,9 +71106,6 @@ class SubscribeAttributeHepaFilterMonitoringInPlaceIndicator : public SubscribeA } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute LastChangedTime */ @@ -71250,9 +71232,6 @@ class SubscribeAttributeHepaFilterMonitoringLastChangedTime : public SubscribeAt } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ReplacementProductList */ @@ -71335,9 +71314,6 @@ class SubscribeAttributeHepaFilterMonitoringReplacementProductList : public Subs } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -71420,9 +71396,6 @@ class SubscribeAttributeHepaFilterMonitoringGeneratedCommandList : public Subscr } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -71505,7 +71478,6 @@ class SubscribeAttributeHepaFilterMonitoringAcceptedCommandList : public Subscri } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -71591,7 +71563,6 @@ class SubscribeAttributeHepaFilterMonitoringEventList : public SubscribeAttribut }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute AttributeList @@ -71675,9 +71646,6 @@ class SubscribeAttributeHepaFilterMonitoringAttributeList : public SubscribeAttr } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -71760,9 +71728,6 @@ class SubscribeAttributeHepaFilterMonitoringFeatureMap : public SubscribeAttribu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -71845,9 +71810,6 @@ class SubscribeAttributeHepaFilterMonitoringClusterRevision : public SubscribeAt } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster ActivatedCarbonFilterMonitoring | 0x0072 | |------------------------------------------------------------------------------| @@ -71871,7 +71833,6 @@ class SubscribeAttributeHepaFilterMonitoringClusterRevision : public SubscribeAt | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command ResetCondition */ @@ -71916,10 +71877,6 @@ class ActivatedCarbonFilterMonitoringResetCondition : public ClusterCommand { private: }; -#endif // MTR_ENABLE_PROVISIONAL - -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Condition */ @@ -72002,9 +71959,6 @@ class SubscribeAttributeActivatedCarbonFilterMonitoringCondition : public Subscr } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute DegradationDirection */ @@ -72087,9 +72041,6 @@ class SubscribeAttributeActivatedCarbonFilterMonitoringDegradationDirection : pu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ChangeIndication */ @@ -72172,9 +72123,6 @@ class SubscribeAttributeActivatedCarbonFilterMonitoringChangeIndication : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute InPlaceIndicator */ @@ -72257,9 +72205,6 @@ class SubscribeAttributeActivatedCarbonFilterMonitoringInPlaceIndicator : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute LastChangedTime */ @@ -72386,9 +72331,6 @@ class SubscribeAttributeActivatedCarbonFilterMonitoringLastChangedTime : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ReplacementProductList */ @@ -72471,9 +72413,6 @@ class SubscribeAttributeActivatedCarbonFilterMonitoringReplacementProductList : } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -72556,9 +72495,6 @@ class SubscribeAttributeActivatedCarbonFilterMonitoringGeneratedCommandList : pu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -72641,7 +72577,6 @@ class SubscribeAttributeActivatedCarbonFilterMonitoringAcceptedCommandList : pub } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -72727,7 +72662,6 @@ class SubscribeAttributeActivatedCarbonFilterMonitoringEventList : public Subscr }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute AttributeList @@ -72811,9 +72745,6 @@ class SubscribeAttributeActivatedCarbonFilterMonitoringAttributeList : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -72896,9 +72827,6 @@ class SubscribeAttributeActivatedCarbonFilterMonitoringFeatureMap : public Subsc } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -72981,8 +72909,6 @@ class SubscribeAttributeActivatedCarbonFilterMonitoringClusterRevision : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster BooleanStateConfiguration | 0x0080 | @@ -185992,141 +185918,89 @@ void registerClusterScenesManagement(Commands & commands) } void registerClusterHepaFilterMonitoring(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::HepaFilterMonitoring; const char * clusterName = "HepaFilterMonitoring"; commands_list clusterCommands = { make_unique<ClusterCommand>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<HepaFilterMonitoringResetCondition>(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique<ReadAttribute>(Id), // make_unique<WriteAttribute>(Id), // make_unique<SubscribeAttribute>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<ReadHepaFilterMonitoringCondition>(), // make_unique<SubscribeAttributeHepaFilterMonitoringCondition>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadHepaFilterMonitoringDegradationDirection>(), // make_unique<SubscribeAttributeHepaFilterMonitoringDegradationDirection>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadHepaFilterMonitoringChangeIndication>(), // make_unique<SubscribeAttributeHepaFilterMonitoringChangeIndication>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadHepaFilterMonitoringInPlaceIndicator>(), // make_unique<SubscribeAttributeHepaFilterMonitoringInPlaceIndicator>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadHepaFilterMonitoringLastChangedTime>(), // make_unique<WriteHepaFilterMonitoringLastChangedTime>(), // make_unique<SubscribeAttributeHepaFilterMonitoringLastChangedTime>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadHepaFilterMonitoringReplacementProductList>(), // make_unique<SubscribeAttributeHepaFilterMonitoringReplacementProductList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadHepaFilterMonitoringGeneratedCommandList>(), // make_unique<SubscribeAttributeHepaFilterMonitoringGeneratedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadHepaFilterMonitoringAcceptedCommandList>(), // make_unique<SubscribeAttributeHepaFilterMonitoringAcceptedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique<ReadHepaFilterMonitoringEventList>(), // make_unique<SubscribeAttributeHepaFilterMonitoringEventList>(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadHepaFilterMonitoringAttributeList>(), // make_unique<SubscribeAttributeHepaFilterMonitoringAttributeList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadHepaFilterMonitoringFeatureMap>(), // make_unique<SubscribeAttributeHepaFilterMonitoringFeatureMap>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadHepaFilterMonitoringClusterRevision>(), // make_unique<SubscribeAttributeHepaFilterMonitoringClusterRevision>(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterActivatedCarbonFilterMonitoring(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::ActivatedCarbonFilterMonitoring; const char * clusterName = "ActivatedCarbonFilterMonitoring"; commands_list clusterCommands = { make_unique<ClusterCommand>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<ActivatedCarbonFilterMonitoringResetCondition>(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique<ReadAttribute>(Id), // make_unique<WriteAttribute>(Id), // make_unique<SubscribeAttribute>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<ReadActivatedCarbonFilterMonitoringCondition>(), // make_unique<SubscribeAttributeActivatedCarbonFilterMonitoringCondition>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadActivatedCarbonFilterMonitoringDegradationDirection>(), // make_unique<SubscribeAttributeActivatedCarbonFilterMonitoringDegradationDirection>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadActivatedCarbonFilterMonitoringChangeIndication>(), // make_unique<SubscribeAttributeActivatedCarbonFilterMonitoringChangeIndication>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadActivatedCarbonFilterMonitoringInPlaceIndicator>(), // make_unique<SubscribeAttributeActivatedCarbonFilterMonitoringInPlaceIndicator>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadActivatedCarbonFilterMonitoringLastChangedTime>(), // make_unique<WriteActivatedCarbonFilterMonitoringLastChangedTime>(), // make_unique<SubscribeAttributeActivatedCarbonFilterMonitoringLastChangedTime>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadActivatedCarbonFilterMonitoringReplacementProductList>(), // make_unique<SubscribeAttributeActivatedCarbonFilterMonitoringReplacementProductList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadActivatedCarbonFilterMonitoringGeneratedCommandList>(), // make_unique<SubscribeAttributeActivatedCarbonFilterMonitoringGeneratedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadActivatedCarbonFilterMonitoringAcceptedCommandList>(), // make_unique<SubscribeAttributeActivatedCarbonFilterMonitoringAcceptedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique<ReadActivatedCarbonFilterMonitoringEventList>(), // make_unique<SubscribeAttributeActivatedCarbonFilterMonitoringEventList>(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadActivatedCarbonFilterMonitoringAttributeList>(), // make_unique<SubscribeAttributeActivatedCarbonFilterMonitoringAttributeList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadActivatedCarbonFilterMonitoringFeatureMap>(), // make_unique<SubscribeAttributeActivatedCarbonFilterMonitoringFeatureMap>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadActivatedCarbonFilterMonitoringClusterRevision>(), // make_unique<SubscribeAttributeActivatedCarbonFilterMonitoringClusterRevision>(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterBooleanStateConfiguration(Commands & commands) { From 98c10ee6ff1c5a7403ec3fbf4494bf9229185a5c Mon Sep 17 00:00:00 2001 From: Boris Zbarsky <bzbarsky@apple.com> Date: Fri, 3 May 2024 18:54:34 -0400 Subject: [PATCH 120/124] Re-enable the leak detection in MTRTestCase, now that the test leaks are fixed. (#33277) --- .../Framework/CHIPTests/MTRPerControllerStorageTests.m | 8 ++++---- src/darwin/Framework/CHIPTests/TestHelpers/MTRTestCase.mm | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m index 19f114f7877d23..06968b00292ef4 100644 --- a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m +++ b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m @@ -187,6 +187,10 @@ @implementation MTRPerControllerStorageTests { - (void)setUp { + // Set detectLeaks true first, in case our superclass wants to do something + // in setUp when it's set. + self.detectLeaks = YES; + // Per-test setup, runs before each test. [super setUp]; [self setContinueAfterFailure:NO]; @@ -353,8 +357,6 @@ - (nullable MTRDeviceController *)startControllerWithRootKeys:(MTRTestKeys *)roo - (void)test001_BasicControllerStartup { - self.detectLeaks = YES; - __auto_type * factory = [MTRDeviceControllerFactory sharedInstance]; XCTAssertNotNil(factory); @@ -403,8 +405,6 @@ - (void)test001_BasicControllerStartup - (void)test002_TryStartingTwoControllersWithSameNodeID { - self.detectLeaks = YES; - __auto_type * rootKeys = [[MTRTestKeys alloc] init]; XCTAssertNotNil(rootKeys); diff --git a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestCase.mm b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestCase.mm index b4cf92b1ee3322..1dd1fea675b46c 100644 --- a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestCase.mm +++ b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestCase.mm @@ -27,7 +27,6 @@ @implementation MTRTestCase */ - (void)tearDown { -#if 0 #if defined(ENABLE_LEAK_DETECTION) && ENABLE_LEAK_DETECTION if (_detectLeaks) { int pid = getpid(); @@ -35,7 +34,6 @@ - (void)tearDown int ret = system(cmd.UTF8String); XCTAssertEqual(ret, 0, "LEAKS DETECTED"); } -#endif #endif [super tearDown]; From bd6ff658ec0e6f70efd462b25d9e6115978d43da Mon Sep 17 00:00:00 2001 From: mkardous-silabs <84793247+mkardous-silabs@users.noreply.github.com> Date: Fri, 3 May 2024 20:01:34 -0400 Subject: [PATCH 121/124] [ICD] Convert TestICDManager to gtest (#33269) * Convert TestICDManager to gtest * Refactor friend tests with a single access point * Fix openIoT * remove namespace from friend since they are in the same * fix typo * Replace VerifyOrDie with Assert statement * Remove extra namespaces --- src/BUILD.gn | 1 - src/app/icd/server/ICDConfigurationData.h | 12 +- src/app/icd/server/ICDManager.h | 10 +- src/app/icd/server/tests/BUILD.gn | 25 +- .../tests/ICDConfigurationDataTestAccess.h | 47 + src/app/icd/server/tests/TestICDManager.cpp | 1654 ++++++++--------- src/messaging/tests/BUILD.gn | 6 + .../unit-tests/test_components_nl.txt | 1 - 8 files changed, 877 insertions(+), 879 deletions(-) create mode 100644 src/app/icd/server/tests/ICDConfigurationDataTestAccess.h diff --git a/src/BUILD.gn b/src/BUILD.gn index aa657786cd2469..61292e14f92612 100644 --- a/src/BUILD.gn +++ b/src/BUILD.gn @@ -67,7 +67,6 @@ if (chip_build_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/ICDConfigurationData.h b/src/app/icd/server/ICDConfigurationData.h index 8b87d090f769e1..9358f37fd9ecc6 100644 --- a/src/app/icd/server/ICDConfigurationData.h +++ b/src/app/icd/server/ICDConfigurationData.h @@ -28,12 +28,13 @@ namespace chip { namespace app { // Forward declaration of ICDManager to allow it to be friend with ICDConfigurationData. class ICDManager; +} // namespace app -// Forward declaration of TestICDManager to allow it to be friend with the ICDConfigurationData. +namespace Test { +// Forward declaration of ICDConfigurationDataTestAccess tests to allow it to be friend with the ICDConfigurationData. // Used in unit tests -class TestICDManager; - -} // namespace app +class ICDConfigurationDataTestAccess; +} // namespace Test /** * @brief ICDConfigurationData manages and stores ICD related configurations for the ICDManager. @@ -99,7 +100,8 @@ class ICDConfigurationData // the ICDManager, the ICDManager is a friend that can access the private setters. If a consummer needs to be notified when a // value is changed, they can leverage the Observer events the ICDManager generates. See src/app/icd/server/ICDStateObserver.h friend class chip::app::ICDManager; - friend class chip::app::TestICDManager; + + friend class chip::Test::ICDConfigurationDataTestAccess; void SetICDMode(ICDMode mode) { mICDMode = mode; }; void SetSlowPollingInterval(System::Clock::Milliseconds32 slowPollInterval) { mSlowPollingInterval = slowPollInterval; }; diff --git a/src/app/icd/server/ICDManager.h b/src/app/icd/server/ICDManager.h index ec7d06b2a78ef5..bf9474b0f301da 100644 --- a/src/app/icd/server/ICDManager.h +++ b/src/app/icd/server/ICDManager.h @@ -47,9 +47,9 @@ using SymmetricKeystore = SessionKeystore; namespace chip { namespace app { -// Forward declaration of TestICDManager to allow it to be friend with ICDManager +// Forward declaration of TestICDManager tests to allow it to be friend with ICDManager // Used in unit tests -class TestICDManager; +class TestICDManager_TestShouldCheckInMsgsBeSentAtActiveModeFunction_Test; /** * @brief ICD Manager is responsible of processing the events and triggering the correct action for an ICD @@ -132,6 +132,8 @@ class ICDManager : public ICDListener, public TestEventTriggerHandler ICDConfigurationData::ICDMode GetICDMode() { return ICDConfigurationData::GetInstance().GetICDMode(); }; + OperationalState GetOperaionalState() { return mOperationalState; }; + /** * @brief Adds the referenced observer in parameters to the mStateObserverPool * A maximum of CHIP_CONFIG_ICD_OBSERVERS_POOL_SIZE observers can be concurrently registered @@ -199,7 +201,9 @@ class ICDManager : public ICDListener, public TestEventTriggerHandler void OnSubscriptionReport() override; private: - friend class TestICDManager; + // TODO : Once <gtest/gtest_prod.h> can be included, use FRIEND_TEST for the friend class. + friend class TestICDManager_TestShouldCheckInMsgsBeSentAtActiveModeFunction_Test; + /** * @brief UpdateICDMode evaluates in which mode the ICD can be in; SIT or LIT mode. * If the current operating mode does not match the evaluated operating mode, function updates the ICDMode and triggers diff --git a/src/app/icd/server/tests/BUILD.gn b/src/app/icd/server/tests/BUILD.gn index 727dd135d41c2d..08872257796ec0 100644 --- a/src/app/icd/server/tests/BUILD.gn +++ b/src/app/icd/server/tests/BUILD.gn @@ -19,31 +19,22 @@ 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" ] + test_sources = [ + "TestICDManager.cpp", + "TestICDMonitoringTable.cpp", + ] + + sources = [ "ICDConfigurationDataTestAccess.h" ] 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/messaging/tests:helpers", ] cflags = [ "-Wconversion" ] diff --git a/src/app/icd/server/tests/ICDConfigurationDataTestAccess.h b/src/app/icd/server/tests/ICDConfigurationDataTestAccess.h new file mode 100644 index 00000000000000..8771ce15b2c9a9 --- /dev/null +++ b/src/app/icd/server/tests/ICDConfigurationDataTestAccess.h @@ -0,0 +1,47 @@ +/* + * + * 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. + */ + +#pragma once + +#include <app/icd/server/ICDConfigurationData.h> + +namespace chip { +namespace Test { +/** + * @brief Class acts as an accessor to private methods of the ICDConfigurationData class without needing to give friend access to + * each individual test. + * This design is necessary because certain tests validate specific edge cases around specific configurations. + * See ICDConfigurationData.h for more details why SetModeDurations cannot be a public API. + */ +class ICDConfigurationDataTestAccess +{ +public: + ICDConfigurationDataTestAccess() = delete; + ICDConfigurationDataTestAccess(ICDConfigurationData * data) : mData(data) {} + + CHIP_ERROR SetModeDurations(Optional<System::Clock::Milliseconds32> activeModeDuration, + Optional<System::Clock::Milliseconds32> idleModeDuration) + { + return mData->SetModeDurations(activeModeDuration, idleModeDuration); + } + +private: + ICDConfigurationData * mData = nullptr; +}; + +} // namespace Test +} // namespace chip diff --git a/src/app/icd/server/tests/TestICDManager.cpp b/src/app/icd/server/tests/TestICDManager.cpp index 79b1ee817632bd..366bcb5c9280ad 100644 --- a/src/app/icd/server/tests/TestICDManager.cpp +++ b/src/app/icd/server/tests/TestICDManager.cpp @@ -22,19 +22,18 @@ #include <app/icd/server/ICDMonitoringTable.h> #include <app/icd/server/ICDNotifier.h> #include <app/icd/server/ICDStateObserver.h> +#include <app/icd/server/tests/ICDConfigurationDataTestAccess.h> #include <crypto/DefaultSessionKeystore.h> +#include <gtest/gtest.h> #include <lib/core/DataModelTypes.h> #include <lib/core/NodeId.h> #include <lib/support/TestPersistentStorageDelegate.h> #include <lib/support/TimeUtils.h> -#include <lib/support/UnitTestContext.h> -#include <lib/support/UnitTestExtendedAssertions.h> -#include <lib/support/UnitTestRegistration.h> #include <messaging/tests/MessagingContext.h> -#include <nlunit-test.h> #include <system/SystemLayerImpl.h> using namespace chip; +using namespace chip::Test; using namespace chip::app; using namespace chip::System; using namespace chip::System::Clock; @@ -44,6 +43,7 @@ using TestSessionKeystoreImpl = Crypto::DefaultSessionKeystore; namespace { +#if CHIP_CONFIG_ENABLE_ICD_CIP // Test Values constexpr uint16_t kMaxTestClients = 2; constexpr FabricIndex kTestFabricIndex1 = 1; @@ -65,6 +65,7 @@ constexpr uint8_t kKeyBuffer2a[] = { constexpr uint8_t kKeyBuffer2b[] = { 0xf2, 0xe2, 0xd2, 0xc2, 0xb2, 0xa2, 0x92, 0x82, 0x72, 0x62, 0x52, 0x42, 0x32, 0x22, 0x12, 0x02 }; +#endif // CHIP_CONFIG_ENABLE_ICD_CIP // Taken from the ICDManager Implementation enum class ICDTestEventTriggerEvent : uint64_t @@ -78,6 +79,9 @@ enum class ICDTestEventTriggerEvent : uint64_t class TestICDStateObserver : public app::ICDStateObserver { public: + TestICDStateObserver() = default; + ~TestICDStateObserver() = default; + void OnEnterActiveMode() { mOnEnterActiveModeCalled = true; } void OnEnterIdleMode() { mOnEnterIdleModeCalled = true; } void OnTransitionToIdle() { mOnTransitionToIdleCalled = true; } @@ -118,1061 +122,1007 @@ class TestSubscriptionsInfoProvider : public SubscriptionsInfoProvider bool mHasPersistedSubscription = false; }; -class TestContext : public chip::Test::LoopbackMessagingContext +System::Clock::Internal::MockClock * pMockClock = nullptr; +System::Clock::ClockBase * pRealClock = nullptr; +chip::Test::LoopbackMessagingContext * pMessagingContext = nullptr; + +} // namespace + +namespace chip { +namespace app { + +class TestICDManager : public ::testing::Test { + public: - // Performs shared setup for all tests in the test suite - CHIP_ERROR SetUpTestSuite() override + /* + * Advance the test Mock clock time by the amout passed in argument + * and then force the SystemLayer Timer event loop. It will check for any expired timer, + * and invoke their callbacks if there are any. + * + * @param time_ms: Value in milliseconds. + */ + static void AdvanceClockAndRunEventLoop(Milliseconds64 time) { - ReturnErrorOnFailure(LoopbackMessagingContext::SetUpTestSuite()); - ReturnErrorOnFailure(chip::DeviceLayer::PlatformMgr().InitChipStack()); - - DeviceLayer::SetSystemLayerForTesting(&GetSystemLayer()); - mRealClock = &chip::System::SystemClock(); - System::Clock::Internal::SetSystemClockForTesting(&mMockClock); + pMockClock->AdvanceMonotonic(time); + pMessagingContext->GetIOContext().DriveIO(); + } - return CHIP_NO_ERROR; + // Performs shared setup for all tests in the test suite + static void SetUpTestSuite() + { + if (pMockClock == nullptr) + { + pMockClock = new Clock::Internal::MockClock(); + ASSERT_NE(pMockClock, nullptr); + } + + if (pMessagingContext == nullptr) + { + pMessagingContext = new LoopbackMessagingContext(); + ASSERT_NE(pMessagingContext, nullptr); + } + + ASSERT_EQ(pMessagingContext->SetUpTestSuite(), CHIP_NO_ERROR); + ASSERT_EQ(chip::DeviceLayer::PlatformMgr().InitChipStack(), CHIP_NO_ERROR); + + DeviceLayer::SetSystemLayerForTesting(&(pMessagingContext->GetSystemLayer())); + pRealClock = &SystemClock(); + Clock::Internal::SetSystemClockForTesting(pMockClock); } // Performs shared teardown for all tests in the test suite - void TearDownTestSuite() override + static void TearDownTestSuite() { - System::Clock::Internal::SetSystemClockForTesting(mRealClock); + Clock::Internal::SetSystemClockForTesting(pRealClock); DeviceLayer::SetSystemLayerForTesting(nullptr); - chip::DeviceLayer::PlatformMgr().Shutdown(); - LoopbackMessagingContext::TearDownTestSuite(); + DeviceLayer::PlatformMgr().Shutdown(); + pMessagingContext->TearDownTestSuite(); + + if (pMockClock != nullptr) + { + delete pMockClock; + pMockClock = nullptr; + } + + if (pMessagingContext != nullptr) + { + delete pMessagingContext; + pMessagingContext = nullptr; + } + + pRealClock = nullptr; } // Performs setup for each individual test in the test suite - CHIP_ERROR SetUp() override + void SetUp() override { - ReturnErrorOnFailure(LoopbackMessagingContext::SetUp()); + EXPECT_EQ(pMessagingContext->SetUp(), CHIP_NO_ERROR); mICDStateObserver.ResetAll(); mICDManager.RegisterObserver(&mICDStateObserver); - mICDManager.Init(&testStorage, &GetFabricTable(), &mKeystore, &GetExchangeManager(), &mSubInfoProvider); - - return CHIP_NO_ERROR; + mICDManager.Init(&testStorage, &(pMessagingContext->GetFabricTable()), &mKeystore, + &(pMessagingContext->GetExchangeManager()), &mSubInfoProvider); } // Performs teardown for each individual test in the test suite void TearDown() override { mICDManager.Shutdown(); - LoopbackMessagingContext::TearDown(); + pMessagingContext->TearDown(); } - System::Clock::Internal::MockClock mMockClock; TestSessionKeystoreImpl mKeystore; - app::ICDManager mICDManager; + ICDManager mICDManager; TestSubscriptionsInfoProvider mSubInfoProvider; TestPersistentStorageDelegate testStorage; TestICDStateObserver mICDStateObserver; - -private: - System::Clock::ClockBase * mRealClock; }; -} // namespace - -namespace chip { -namespace app { -class TestICDManager +TEST_F(TestICDManager, TestICDModeDurations) { -public: - /* - * Advance the test Mock clock time by the amout passed in argument - * and then force the SystemLayer Timer event loop. It will check for any expired timer, - * and invoke their callbacks if there are any. - * - * @param time_ms: Value in milliseconds. - */ - static void AdvanceClockAndRunEventLoop(TestContext * ctx, Milliseconds64 time) - { - ctx->mMockClock.AdvanceMonotonic(time); - ctx->GetIOContext().DriveIO(); - } - - static void TestICDModeDurations(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); - - // After the init we should be in Idle mode - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetIdleModeDuration() + 1_s); - // Idle mode Duration expired, ICDManager transitioned to the ActiveMode. - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeDuration() + 1_ms32); - // Active mode Duration expired, ICDManager transitioned to the IdleMode. - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetIdleModeDuration() + 1_s); - // Idle mode Duration expired, ICDManager transitioned to the ActiveMode. - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - - // Events updating the Operation to Active mode can extend the current active mode time by 1 Active mode threshold. - // Kick an active Threshold just before the end of the ActiveMode duration and validate that the active mode is extended. - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeDuration() - 1_ms32); - ICDNotifier::GetInstance().NotifyNetworkActivityNotification(); - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeThreshold() / 2); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeThreshold()); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); - } + // After the init we should be in Idle mode + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetIdleModeDuration() + 1_s); + // Idle mode Duration expired, ICDManager transitioned to the ActiveMode. + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeDuration() + 1_ms32); + // Active mode Duration expired, ICDManager transitioned to the IdleMode. + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetIdleModeDuration() + 1_s); + // Idle mode Duration expired, ICDManager transitioned to the ActiveMode. + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + + // Events updating the Operation to Active mode can extend the current active mode time by 1 Active mode threshold. + // Kick an active Threshold just before the end of the ActiveMode duration and validate that the active mode is extended. + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeDuration() - 1_ms32); + ICDNotifier::GetInstance().NotifyNetworkActivityNotification(); + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeThreshold() / 2); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeThreshold()); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); +} - /** - * @brief Test verifies that the ICDManager starts its timers correctly based on if it will have any messages to send - * when the IdleMode timer expires - */ - static void TestICDModeDurationsWith0ActiveModeDurationWithoutActiveSub(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); - typedef ICDListener::ICDManagementEvents ICDMEvent; - ICDConfigurationData & icdConfigData = ICDConfigurationData::GetInstance(); +#if CHIP_CONFIG_ENABLE_ICD_CIP +/** + * @brief Test verifies that the ICDManager starts its timers correctly based on if it will have any messages to send + * when the IdleMode timer expires + */ +TEST_F(TestICDManager, TestICDModeDurationsWith0ActiveModeDurationWithoutActiveSub) +{ + typedef ICDListener::ICDManagementEvents ICDMEvent; + ICDConfigurationData & icdConfigData = ICDConfigurationData::GetInstance(); + ICDConfigurationDataTestAccess privateIcdConfigData(&icdConfigData); - // Set FeatureMap - Configures CIP, UAT and LITS to 1 - ctx->mICDManager.SetTestFeatureMapValue(0x07); + // Set FeatureMap - Configures CIP, UAT and LITS to 1 + mICDManager.SetTestFeatureMapValue(0x07); - // Set that there are no matching subscriptions - ctx->mSubInfoProvider.SetHasActiveSubscription(false); - ctx->mSubInfoProvider.SetHasPersistedSubscription(false); + // Set that there are no matching subscriptions + mSubInfoProvider.SetHasActiveSubscription(false); + mSubInfoProvider.SetHasPersistedSubscription(false); - // Set New durations for test case - Milliseconds32 oldActiveModeDuration = icdConfigData.GetActiveModeDuration(); - icdConfigData.SetModeDurations(MakeOptional<Milliseconds32>(0), NullOptional); + // Set New durations for test case + Milliseconds32 oldActiveModeDuration = icdConfigData.GetActiveModeDuration(); + privateIcdConfigData.SetModeDurations(MakeOptional<Milliseconds32>(0), NullOptional); - // Verify That ICDManager starts in Idle - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); + // Verify That ICDManager starts in Idle + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); - // Reset IdleModeInterval since it was started before the ActiveModeDuration change - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetIdleModeDuration() + 1_s); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); + // Reset IdleModeInterval since it was started before the ActiveModeDuration change + AdvanceClockAndRunEventLoop(icdConfigData.GetIdleModeDuration() + 1_s); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); - // Force the device to return to IdleMode - Increase time by ActiveModeThreshold since ActiveModeDuration is now 0 - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetActiveModeThreshold() + 1_ms16); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); + // Force the device to return to IdleMode - Increase time by ActiveModeThreshold since ActiveModeDuration is now 0 + AdvanceClockAndRunEventLoop(icdConfigData.GetActiveModeThreshold() + 1_ms16); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); - // Expire Idle mode duration; ICDManager should remain in IdleMode since it has no message to send - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetIdleModeDuration() + 1_s); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); + // Expire Idle mode duration; ICDManager should remain in IdleMode since it has no message to send + AdvanceClockAndRunEventLoop(icdConfigData.GetIdleModeDuration() + 1_s); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); - // Add an entry to the ICDMonitoringTable - ICDMonitoringTable table(ctx->testStorage, kTestFabricIndex1, kMaxTestClients, &(ctx->mKeystore)); + // Add an entry to the ICDMonitoringTable + ICDMonitoringTable table(testStorage, kTestFabricIndex1, kMaxTestClients, &(mKeystore)); - ICDMonitoringEntry entry(&(ctx->mKeystore)); - entry.checkInNodeID = kClientNodeId11; - entry.monitoredSubject = kClientNodeId11; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry.SetKey(ByteSpan(kKeyBuffer1a))); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == table.Set(0, entry)); + ICDMonitoringEntry entry(&(mKeystore)); + entry.checkInNodeID = kClientNodeId11; + entry.monitoredSubject = kClientNodeId11; + EXPECT_EQ(CHIP_NO_ERROR, entry.SetKey(ByteSpan(kKeyBuffer1a))); + EXPECT_EQ(CHIP_NO_ERROR, table.Set(0, entry)); - // Trigger register event after first entry was added - ICDNotifier::GetInstance().NotifyICDManagementEvent(ICDMEvent::kTableUpdated); + // Trigger register event after first entry was added + ICDNotifier::GetInstance().NotifyICDManagementEvent(ICDMEvent::kTableUpdated); - // Check ICDManager is now in the LIT operating mode - NL_TEST_ASSERT(aSuite, icdConfigData.GetICDMode() == ICDConfigurationData::ICDMode::LIT); + // Check ICDManager is now in the LIT operating mode + EXPECT_EQ(icdConfigData.GetICDMode(), ICDConfigurationData::ICDMode::LIT); - // Kick an ActiveModeThreshold since a Registration can only happen from an incoming message that would transition the ICD - // to ActiveMode - ICDNotifier::GetInstance().NotifyNetworkActivityNotification(); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); + // Kick an ActiveModeThreshold since a Registration can only happen from an incoming message that would transition the ICD + // to ActiveMode + ICDNotifier::GetInstance().NotifyNetworkActivityNotification(); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); - // Return the device to return to IdleMode - Increase time by ActiveModeThreshold since ActiveModeDuration is 0 - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetActiveModeThreshold() + 1_ms16); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); + // Return the device to return to IdleMode - Increase time by ActiveModeThreshold since ActiveModeDuration is 0 + AdvanceClockAndRunEventLoop(icdConfigData.GetActiveModeThreshold() + 1_ms16); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); - // Expire IdleMode timer - Device should be in ActiveMode since it has an ICDM registration - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetIdleModeDuration() + 1_s); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); + // Expire IdleMode timer - Device should be in ActiveMode since it has an ICDM registration + AdvanceClockAndRunEventLoop(icdConfigData.GetIdleModeDuration() + 1_s); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); - // Remove entry from the fabric - ICDManager won't have any messages to send - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == table.Remove(0)); - NL_TEST_ASSERT(aSuite, table.IsEmpty()); + // Remove entry from the fabric - ICDManager won't have any messages to send + EXPECT_EQ(CHIP_NO_ERROR, table.Remove(0)); + EXPECT_TRUE(table.IsEmpty()); - // Return the device to return to IdleMode - Increase time by ActiveModeThreshold since ActiveModeDuration is 0 - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetActiveModeThreshold() + 1_ms16); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); + // Return the device to return to IdleMode - Increase time by ActiveModeThreshold since ActiveModeDuration is 0 + AdvanceClockAndRunEventLoop(icdConfigData.GetActiveModeThreshold() + 1_ms16); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); - // Expire Idle mode duration; ICDManager should remain in IdleMode since it has no message to send - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetIdleModeDuration() + 1_s); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); + // Expire Idle mode duration; ICDManager should remain in IdleMode since it has no message to send + AdvanceClockAndRunEventLoop(icdConfigData.GetIdleModeDuration() + 1_s); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); - // Reset Old durations - icdConfigData.SetModeDurations(MakeOptional(oldActiveModeDuration), NullOptional); - } + // Reset Old durations + privateIcdConfigData.SetModeDurations(MakeOptional(oldActiveModeDuration), NullOptional); +} - /** - * @brief Test verifies that the ICDManager remains in IdleMode since it will not have any messages to send - * when the IdleMode timer expires - */ - static void TestICDModeDurationsWith0ActiveModeDurationWithActiveSub(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); - typedef ICDListener::ICDManagementEvents ICDMEvent; - ICDConfigurationData & icdConfigData = ICDConfigurationData::GetInstance(); +/** + * @brief Test verifies that the ICDManager remains in IdleMode since it will not have any messages to send + * when the IdleMode timer expires + */ +TEST_F(TestICDManager, TestICDModeDurationsWith0ActiveModeDurationWithActiveSub) +{ + typedef ICDListener::ICDManagementEvents ICDMEvent; + ICDConfigurationData & icdConfigData = ICDConfigurationData::GetInstance(); + ICDConfigurationDataTestAccess privateIcdConfigData(&icdConfigData); - // Set FeatureMap - Configures CIP, UAT and LITS to 1 - ctx->mICDManager.SetTestFeatureMapValue(0x07); + // Set FeatureMap - Configures CIP, UAT and LITS to 1 + mICDManager.SetTestFeatureMapValue(0x07); - // Set that there are not matching subscriptions - ctx->mSubInfoProvider.SetHasActiveSubscription(true); - ctx->mSubInfoProvider.SetHasPersistedSubscription(true); + // Set that there are not matching subscriptions + mSubInfoProvider.SetHasActiveSubscription(true); + mSubInfoProvider.SetHasPersistedSubscription(true); - // Set New durations for test case - Milliseconds32 oldActiveModeDuration = icdConfigData.GetActiveModeDuration(); - icdConfigData.SetModeDurations(MakeOptional<Milliseconds32>(0), NullOptional); + // Set New durations for test case + Milliseconds32 oldActiveModeDuration = icdConfigData.GetActiveModeDuration(); + privateIcdConfigData.SetModeDurations(MakeOptional<Milliseconds32>(0), NullOptional); - // Verify That ICDManager starts in Idle - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); + // Verify That ICDManager starts in Idle + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); - // Reset IdleModeInterval since it was started before the ActiveModeDuration change - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetIdleModeDuration() + 1_s); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); + // Reset IdleModeInterval since it was started before the ActiveModeDuration change + AdvanceClockAndRunEventLoop(icdConfigData.GetIdleModeDuration() + 1_s); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); - // Force the device to return to IdleMode - Increase time by ActiveModeThreshold since ActiveModeDuration is now 0 - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetActiveModeThreshold() + 1_ms16); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); + // Force the device to return to IdleMode - Increase time by ActiveModeThreshold since ActiveModeDuration is now 0 + AdvanceClockAndRunEventLoop(icdConfigData.GetActiveModeThreshold() + 1_ms16); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); - // Expire Idle mode duration; ICDManager should remain in IdleMode since it has no message to send - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetIdleModeDuration() + 1_s); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); + // Expire Idle mode duration; ICDManager should remain in IdleMode since it has no message to send + AdvanceClockAndRunEventLoop(icdConfigData.GetIdleModeDuration() + 1_s); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); - // Add an entry to the ICDMonitoringTable - ICDMonitoringTable table(ctx->testStorage, kTestFabricIndex1, kMaxTestClients, &(ctx->mKeystore)); + // Add an entry to the ICDMonitoringTable + ICDMonitoringTable table(testStorage, kTestFabricIndex1, kMaxTestClients, &(mKeystore)); - ICDMonitoringEntry entry(&(ctx->mKeystore)); - entry.checkInNodeID = kClientNodeId11; - entry.monitoredSubject = kClientNodeId11; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry.SetKey(ByteSpan(kKeyBuffer1a))); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == table.Set(0, entry)); + ICDMonitoringEntry entry(&(mKeystore)); + entry.checkInNodeID = kClientNodeId11; + entry.monitoredSubject = kClientNodeId11; + EXPECT_EQ(CHIP_NO_ERROR, entry.SetKey(ByteSpan(kKeyBuffer1a))); + EXPECT_EQ(CHIP_NO_ERROR, table.Set(0, entry)); - // Trigger register event after first entry was added - ICDNotifier::GetInstance().NotifyICDManagementEvent(ICDMEvent::kTableUpdated); + // Trigger register event after first entry was added + ICDNotifier::GetInstance().NotifyICDManagementEvent(ICDMEvent::kTableUpdated); - // Check ICDManager is now in the LIT operating mode - NL_TEST_ASSERT(aSuite, icdConfigData.GetICDMode() == ICDConfigurationData::ICDMode::LIT); + // Check ICDManager is now in the LIT operating mode + EXPECT_EQ(icdConfigData.GetICDMode(), ICDConfigurationData::ICDMode::LIT); - // Kick an ActiveModeThreshold since a Registration can only happen from an incoming message that would transition the ICD - // to ActiveMode - ICDNotifier::GetInstance().NotifyNetworkActivityNotification(); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); + // Kick an ActiveModeThreshold since a Registration can only happen from an incoming message that would transition the ICD + // to ActiveMode + ICDNotifier::GetInstance().NotifyNetworkActivityNotification(); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); - // Return the device to return to IdleMode - Increase time by ActiveModeThreshold since ActiveModeDuration is 0 - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetActiveModeThreshold() + 1_ms16); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); + // Return the device to return to IdleMode - Increase time by ActiveModeThreshold since ActiveModeDuration is 0 + AdvanceClockAndRunEventLoop(icdConfigData.GetActiveModeThreshold() + 1_ms16); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); - // Expire IdleMode timer - Device stay in IdleMode since it has an active subscription for the ICDM entry - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetIdleModeDuration() + 1_s); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); + // Expire IdleMode timer - Device stay in IdleMode since it has an active subscription for the ICDM entry + AdvanceClockAndRunEventLoop(icdConfigData.GetIdleModeDuration() + 1_s); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); - // Remove entry from the fabric - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == table.Remove(0)); - NL_TEST_ASSERT(aSuite, table.IsEmpty()); + // Remove entry from the fabric + EXPECT_EQ(CHIP_NO_ERROR, table.Remove(0)); + EXPECT_TRUE(table.IsEmpty()); - // Trigger unregister event after last entry was removed - ICDNotifier::GetInstance().NotifyICDManagementEvent(ICDMEvent::kTableUpdated); + // Trigger unregister event after last entry was removed + ICDNotifier::GetInstance().NotifyICDManagementEvent(ICDMEvent::kTableUpdated); - // Check ICDManager is now in the LIT operating mode - NL_TEST_ASSERT(aSuite, icdConfigData.GetICDMode() == ICDConfigurationData::ICDMode::SIT); + // Check ICDManager is now in the LIT operating mode + EXPECT_EQ(icdConfigData.GetICDMode(), ICDConfigurationData::ICDMode::SIT); - // Kick an ActiveModeThreshold since a Unregistration can only happen from an incoming message that would transition the ICD - // to ActiveMode - ICDNotifier::GetInstance().NotifyNetworkActivityNotification(); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); + // Kick an ActiveModeThreshold since a Unregistration can only happen from an incoming message that would transition the ICD + // to ActiveMode + ICDNotifier::GetInstance().NotifyNetworkActivityNotification(); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); - // Return the device to return to IdleMode - Increase time by ActiveModeThreshold since ActiveModeDuration is 0 - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetActiveModeThreshold() + 1_ms16); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); + // Return the device to return to IdleMode - Increase time by ActiveModeThreshold since ActiveModeDuration is 0 + AdvanceClockAndRunEventLoop(icdConfigData.GetActiveModeThreshold() + 1_ms16); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); - // Expire Idle mode duration; ICDManager should remain in IdleMode since it has no message to send - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetIdleModeDuration() + 1_s); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); + // Expire Idle mode duration; ICDManager should remain in IdleMode since it has no message to send + AdvanceClockAndRunEventLoop(icdConfigData.GetIdleModeDuration() + 1_s); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); - // Reset Old durations - icdConfigData.SetModeDurations(MakeOptional<Milliseconds32>(oldActiveModeDuration), NullOptional); - } + // Reset Old durations + privateIcdConfigData.SetModeDurations(MakeOptional<Milliseconds32>(oldActiveModeDuration), NullOptional); +} +#endif // CHIP_CONFIG_ENABLE_ICD_CIP - static void TestKeepActivemodeRequests(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); - typedef ICDListener::KeepActiveFlag ActiveFlag; - ICDNotifier notifier = ICDNotifier::GetInstance(); - - // Setting a requirement will transition the ICD to active mode. - notifier.NotifyActiveRequestNotification(ActiveFlag::kCommissioningWindowOpen); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - // Advance time so active mode duration expires. - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeDuration() + 1_ms32); - // Requirement flag still set. We stay in active mode - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - - // Remove requirement. we should directly transition to idle mode. - notifier.NotifyActiveRequestWithdrawal(ActiveFlag::kCommissioningWindowOpen); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); - - notifier.NotifyActiveRequestNotification(ActiveFlag::kFailSafeArmed); - // Requirement will transition us to active mode. - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - - // Advance time, but by less than the active mode duration and remove the requirement. - // We should stay in active mode. - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeDuration() / 2); - notifier.NotifyActiveRequestWithdrawal(ActiveFlag::kFailSafeArmed); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - - // Advance time again, The activemode duration is completed. - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeDuration() + 1_ms32); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); - - // Set two requirements - notifier.NotifyActiveRequestNotification(ActiveFlag::kFailSafeArmed); - notifier.NotifyActiveRequestNotification(ActiveFlag::kExchangeContextOpen); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - // advance time so the active mode duration expires. - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeDuration() + 1_ms32); - // A requirement flag is still set. We stay in active mode. - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - - // remove 1 requirement. Active mode is maintained - notifier.NotifyActiveRequestWithdrawal(ActiveFlag::kFailSafeArmed); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - // remove the last requirement - notifier.NotifyActiveRequestWithdrawal(ActiveFlag::kExchangeContextOpen); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); - } +TEST_F(TestICDManager, TestKeepActivemodeRequests) +{ + typedef ICDListener::KeepActiveFlag ActiveFlag; + ICDNotifier notifier = ICDNotifier::GetInstance(); + + // Setting a requirement will transition the ICD to active mode. + notifier.NotifyActiveRequestNotification(ActiveFlag::kCommissioningWindowOpen); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + // Advance time so active mode duration expires. + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeDuration() + 1_ms32); + // Requirement flag still set. We stay in active mode + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + + // Remove requirement. we should directly transition to idle mode. + notifier.NotifyActiveRequestWithdrawal(ActiveFlag::kCommissioningWindowOpen); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); + + notifier.NotifyActiveRequestNotification(ActiveFlag::kFailSafeArmed); + // Requirement will transition us to active mode. + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + + // Advance time, but by less than the active mode duration and remove the requirement. + // We should stay in active mode. + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeDuration() / 2); + notifier.NotifyActiveRequestWithdrawal(ActiveFlag::kFailSafeArmed); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + + // Advance time again, The activemode duration is completed. + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeDuration() + 1_ms32); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); + + // Set two requirements + notifier.NotifyActiveRequestNotification(ActiveFlag::kFailSafeArmed); + notifier.NotifyActiveRequestNotification(ActiveFlag::kExchangeContextOpen); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + // advance time so the active mode duration expires. + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeDuration() + 1_ms32); + // A requirement flag is still set. We stay in active mode. + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + + // remove 1 requirement. Active mode is maintained + notifier.NotifyActiveRequestWithdrawal(ActiveFlag::kFailSafeArmed); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + // remove the last requirement + notifier.NotifyActiveRequestWithdrawal(ActiveFlag::kExchangeContextOpen); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); +} - /** - * @brief Test that verifies that the ICDManager is in the correct operating mode based on entries - * in the ICDMonitoringTable - */ - static void TestICDMRegisterUnregisterEvents(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); - typedef ICDListener::ICDManagementEvents ICDMEvent; - ICDNotifier notifier = ICDNotifier::GetInstance(); +#if CHIP_CONFIG_ENABLE_ICD_CIP +/** + * @brief Test that verifies that the ICDManager is in the correct operating mode based on entries + * in the ICDMonitoringTable + */ +TEST_F(TestICDManager, TestICDMRegisterUnregisterEvents) +{ + typedef ICDListener::ICDManagementEvents ICDMEvent; + ICDNotifier notifier = ICDNotifier::GetInstance(); - // Set FeatureMap - // Configures CIP, UAT and LITS to 1 - ctx->mICDManager.SetTestFeatureMapValue(0x07); + // Set FeatureMap + // Configures CIP, UAT and LITS to 1 + mICDManager.SetTestFeatureMapValue(0x07); - // Check ICDManager starts in SIT mode if no entries are present - NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDMode() == ICDConfigurationData::ICDMode::SIT); + // Check ICDManager starts in SIT mode if no entries are present + EXPECT_EQ(ICDConfigurationData::GetInstance().GetICDMode(), ICDConfigurationData::ICDMode::SIT); - // Trigger a "fake" register, ICDManager shoudl remain in SIT mode - notifier.NotifyICDManagementEvent(ICDMEvent::kTableUpdated); + // Trigger a "fake" register, ICDManager shoudl remain in SIT mode + notifier.NotifyICDManagementEvent(ICDMEvent::kTableUpdated); - // Check ICDManager stayed in SIT mode - NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDMode() == ICDConfigurationData::ICDMode::SIT); + // Check ICDManager stayed in SIT mode + EXPECT_EQ(ICDConfigurationData::GetInstance().GetICDMode(), ICDConfigurationData::ICDMode::SIT); - // Create tables with different fabrics - ICDMonitoringTable table1(ctx->testStorage, kTestFabricIndex1, kMaxTestClients, &(ctx->mKeystore)); - ICDMonitoringTable table2(ctx->testStorage, kTestFabricIndex2, kMaxTestClients, &(ctx->mKeystore)); + // Create tables with different fabrics + ICDMonitoringTable table1(testStorage, kTestFabricIndex1, kMaxTestClients, &(mKeystore)); + ICDMonitoringTable table2(testStorage, kTestFabricIndex2, kMaxTestClients, &(mKeystore)); - // Add first entry to the first fabric - ICDMonitoringEntry entry1(&(ctx->mKeystore)); - entry1.checkInNodeID = kClientNodeId11; - entry1.monitoredSubject = kClientNodeId12; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry1.SetKey(ByteSpan(kKeyBuffer1a))); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == table1.Set(0, entry1)); + // Add first entry to the first fabric + ICDMonitoringEntry entry1(&(mKeystore)); + entry1.checkInNodeID = kClientNodeId11; + entry1.monitoredSubject = kClientNodeId12; + EXPECT_EQ(CHIP_NO_ERROR, entry1.SetKey(ByteSpan(kKeyBuffer1a))); + EXPECT_EQ(CHIP_NO_ERROR, table1.Set(0, entry1)); - // Trigger register event after first entry was added - notifier.NotifyICDManagementEvent(ICDMEvent::kTableUpdated); + // Trigger register event after first entry was added + notifier.NotifyICDManagementEvent(ICDMEvent::kTableUpdated); - // Check ICDManager is now in the LIT operating mode - NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDMode() == ICDConfigurationData::ICDMode::LIT); + // Check ICDManager is now in the LIT operating mode + EXPECT_EQ(ICDConfigurationData::GetInstance().GetICDMode(), ICDConfigurationData::ICDMode::LIT); - // Add second entry to the first fabric - ICDMonitoringEntry entry2(&(ctx->mKeystore)); - entry2.checkInNodeID = kClientNodeId12; - entry2.monitoredSubject = kClientNodeId11; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry2.SetKey(ByteSpan(kKeyBuffer1b))); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == table1.Set(1, entry2)); + // Add second entry to the first fabric + ICDMonitoringEntry entry2(&(mKeystore)); + entry2.checkInNodeID = kClientNodeId12; + entry2.monitoredSubject = kClientNodeId11; + EXPECT_EQ(CHIP_NO_ERROR, entry2.SetKey(ByteSpan(kKeyBuffer1b))); + EXPECT_EQ(CHIP_NO_ERROR, table1.Set(1, entry2)); - // Trigger register event after first entry was added - notifier.NotifyICDManagementEvent(ICDMEvent::kTableUpdated); + // Trigger register event after first entry was added + notifier.NotifyICDManagementEvent(ICDMEvent::kTableUpdated); - // Check ICDManager is now in the LIT operating mode - NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDMode() == ICDConfigurationData::ICDMode::LIT); + // Check ICDManager is now in the LIT operating mode + EXPECT_EQ(ICDConfigurationData::GetInstance().GetICDMode(), ICDConfigurationData::ICDMode::LIT); - // Add first entry to the first fabric - ICDMonitoringEntry entry3(&(ctx->mKeystore)); - entry3.checkInNodeID = kClientNodeId21; - entry3.monitoredSubject = kClientNodeId22; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry3.SetKey(ByteSpan(kKeyBuffer2a))); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == table2.Set(0, entry3)); + // Add first entry to the first fabric + ICDMonitoringEntry entry3(&(mKeystore)); + entry3.checkInNodeID = kClientNodeId21; + entry3.monitoredSubject = kClientNodeId22; + EXPECT_EQ(CHIP_NO_ERROR, entry3.SetKey(ByteSpan(kKeyBuffer2a))); + EXPECT_EQ(CHIP_NO_ERROR, table2.Set(0, entry3)); - // Trigger register event after first entry was added - notifier.NotifyICDManagementEvent(ICDMEvent::kTableUpdated); + // Trigger register event after first entry was added + notifier.NotifyICDManagementEvent(ICDMEvent::kTableUpdated); - // Check ICDManager is now in the LIT operating mode - NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDMode() == ICDConfigurationData::ICDMode::LIT); + // Check ICDManager is now in the LIT operating mode + EXPECT_EQ(ICDConfigurationData::GetInstance().GetICDMode(), ICDConfigurationData::ICDMode::LIT); - // Add second entry to the first fabric - ICDMonitoringEntry entry4(&(ctx->mKeystore)); - entry4.checkInNodeID = kClientNodeId22; - entry4.monitoredSubject = kClientNodeId21; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry4.SetKey(ByteSpan(kKeyBuffer2b))); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == table2.Set(1, entry4)); + // Add second entry to the first fabric + ICDMonitoringEntry entry4(&(mKeystore)); + entry4.checkInNodeID = kClientNodeId22; + entry4.monitoredSubject = kClientNodeId21; + EXPECT_EQ(CHIP_NO_ERROR, entry4.SetKey(ByteSpan(kKeyBuffer2b))); + EXPECT_EQ(CHIP_NO_ERROR, table2.Set(1, entry4)); - // Clear a fabric - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == table2.RemoveAll()); + // Clear a fabric + EXPECT_EQ(CHIP_NO_ERROR, table2.RemoveAll()); - // Trigger register event after fabric was cleared - notifier.NotifyICDManagementEvent(ICDMEvent::kTableUpdated); + // Trigger register event after fabric was cleared + notifier.NotifyICDManagementEvent(ICDMEvent::kTableUpdated); - // Check ICDManager is still in the LIT operating mode - NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDMode() == ICDConfigurationData::ICDMode::LIT); + // Check ICDManager is still in the LIT operating mode + EXPECT_EQ(ICDConfigurationData::GetInstance().GetICDMode(), ICDConfigurationData::ICDMode::LIT); - // Remove single entry from remaining fabric - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == table1.Remove(1)); + // Remove single entry from remaining fabric + EXPECT_EQ(CHIP_NO_ERROR, table1.Remove(1)); - // Trigger register event after fabric was cleared - notifier.NotifyICDManagementEvent(ICDMEvent::kTableUpdated); + // Trigger register event after fabric was cleared + notifier.NotifyICDManagementEvent(ICDMEvent::kTableUpdated); - // Check ICDManager is still in the LIT operating mode - NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDMode() == ICDConfigurationData::ICDMode::LIT); + // Check ICDManager is still in the LIT operating mode + EXPECT_EQ(ICDConfigurationData::GetInstance().GetICDMode(), ICDConfigurationData::ICDMode::LIT); - // Remove last entry from remaining fabric - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == table1.Remove(0)); - NL_TEST_ASSERT(aSuite, table1.IsEmpty()); - NL_TEST_ASSERT(aSuite, table2.IsEmpty()); + // Remove last entry from remaining fabric + EXPECT_EQ(CHIP_NO_ERROR, table1.Remove(0)); + EXPECT_TRUE(table1.IsEmpty()); + EXPECT_TRUE(table2.IsEmpty()); - // Trigger register event after fabric was cleared - notifier.NotifyICDManagementEvent(ICDMEvent::kTableUpdated); + // Trigger register event after fabric was cleared + notifier.NotifyICDManagementEvent(ICDMEvent::kTableUpdated); - // Check ICDManager is still in the LIT operating mode - NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDMode() == ICDConfigurationData::ICDMode::SIT); - } + // Check ICDManager is still in the LIT operating mode + EXPECT_EQ(ICDConfigurationData::GetInstance().GetICDMode(), ICDConfigurationData::ICDMode::SIT); +} - static void TestICDCounter(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); - uint32_t counter = ICDConfigurationData::GetInstance().GetICDCounter().GetValue(); +TEST_F(TestICDManager, TestICDCounter) +{ + uint32_t counter = ICDConfigurationData::GetInstance().GetICDCounter().GetValue(); - // Shut down and reinit ICDManager to increment counter - ctx->mICDManager.Shutdown(); - ctx->mICDManager.Init(&(ctx->testStorage), &(ctx->GetFabricTable()), &(ctx->mKeystore), &(ctx->GetExchangeManager()), - &(ctx->mSubInfoProvider)); - ctx->mICDManager.RegisterObserver(&(ctx->mICDStateObserver)); + // Shut down and reinit ICDManager to increment counter + mICDManager.Shutdown(); + mICDManager.Init(&(testStorage), &(pMessagingContext->GetFabricTable()), &(mKeystore), + &(pMessagingContext->GetExchangeManager()), &(mSubInfoProvider)); + mICDManager.RegisterObserver(&(mICDStateObserver)); - NL_TEST_ASSERT_EQUALS(aSuite, counter + ICDConfigurationData::kICDCounterPersistenceIncrement, - ICDConfigurationData::GetInstance().GetICDCounter().GetValue()); - } + EXPECT_EQ(counter + ICDConfigurationData::kICDCounterPersistenceIncrement, + ICDConfigurationData::GetInstance().GetICDCounter().GetValue()); +} - static void TestOnSubscriptionReport(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); - ICDNotifier notifier = ICDNotifier::GetInstance(); +TEST_F(TestICDManager, TestOnSubscriptionReport) +{ + ICDNotifier notifier = ICDNotifier::GetInstance(); - // After the init we should be in Idle mode - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); + // After the init we should be in Idle mode + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); - // Trigger a subscription report - notifier.NotifySubscriptionReport(); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); + // Trigger a subscription report + notifier.NotifySubscriptionReport(); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); - // Trigger another subscription report - active time should not be increased - notifier.NotifySubscriptionReport(); + // Trigger another subscription report - active time should not be increased + notifier.NotifySubscriptionReport(); - // Advance time so active mode interval expires. - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeDuration() + 1_ms32); + // Advance time so active mode interval expires. + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeDuration() + 1_ms32); - // After the init we should be in Idle mode - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); - } + // After the init we should be in Idle mode + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); +} +#endif // CHIP_CONFIG_ENABLE_ICD_CIP - /** - * @brief Test verifies the logic of the ICDManager when it receives a StayActiveRequest - */ - static void TestICDMStayActive(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); - ICDNotifier notifier = ICDNotifier::GetInstance(); - ICDConfigurationData & icdConfigData = ICDConfigurationData::GetInstance(); - - // Verify That ICDManager starts in Idle - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); - - // Trigger a subscription report. Put the ICD manager into active mode. - notifier.NotifySubscriptionReport(); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - - // Advance time just before ActiveMode timer expires - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetActiveModeDuration() - 1_ms32); - // Confirm ICD manager is in active mode - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - - uint32_t stayActiveRequestedMs = 20000; - // Send a stay active request for 20 seconds - uint32_t stayActivePromisedMs = ctx->mICDManager.StayActiveRequest(stayActiveRequestedMs); - // confirm the promised time is the same as the requested time - NL_TEST_ASSERT(aSuite, stayActivePromisedMs == stayActiveRequestedMs); - - // Advance time by the duration of the stay stayActiveRequestedMs - 1 ms - AdvanceClockAndRunEventLoop(ctx, Milliseconds32(stayActiveRequestedMs) - 1_ms32); - // Confirm ICD manager is in active mode - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - - // Advance time by 1ms and Confirm ICD manager is in idle mode - AdvanceClockAndRunEventLoop(ctx, 1_ms32); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); - - // Trigger a subscription report Put the ICD manager into active mode - notifier.NotifySubscriptionReport(); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - - // Advance time by the duration of the stay active request - 1 ms - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetActiveModeDuration() - 1_ms32); - stayActiveRequestedMs = 35000; - // Send a stay active request for 35 seconds, which is higher than the maximum stay active duration (30 seconds) - stayActivePromisedMs = ctx->mICDManager.StayActiveRequest(stayActiveRequestedMs); - // confirm the promised time is the maximum stay active duration (30 seconds) - NL_TEST_ASSERT(aSuite, stayActivePromisedMs == 30000); - - // Advance time by the duration of the max stay active duration - 1 ms - AdvanceClockAndRunEventLoop(ctx, Milliseconds32(30000) - 1_ms32); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - - // Advance time by 1ms and Confirm ICD manager is in idle mode - AdvanceClockAndRunEventLoop(ctx, 1_ms32); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); - - // Trigger a subscription report Put the ICD manager into active mode - notifier.NotifySubscriptionReport(); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - - // Advance time by the duration of the stay active request - 1 ms - AdvanceClockAndRunEventLoop(ctx, icdConfigData.GetActiveModeDuration() - 1_ms32); - stayActiveRequestedMs = 30000; - // Send a stay active request for 30 seconds - stayActivePromisedMs = ctx->mICDManager.StayActiveRequest(stayActiveRequestedMs); - // confirm the promised time is the same as the requested time - NL_TEST_ASSERT(aSuite, stayActivePromisedMs == 30000); - - // Advance time by the duration of the stay active request - 20000 ms - AdvanceClockAndRunEventLoop(ctx, Milliseconds32(stayActiveRequestedMs) - 20000_ms32); - // Confirm ICD manager is in active mode, we should have 20000 seconds left at that point - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - - stayActiveRequestedMs = 10000; - stayActivePromisedMs = ctx->mICDManager.StayActiveRequest(stayActiveRequestedMs); - // confirm the promised time is 20000 since the device is already planing to stay active longer than the requested time - NL_TEST_ASSERT(aSuite, stayActivePromisedMs == 20000); - } +/** + * @brief Test verifies the logic of the ICDManager when it receives a StayActiveRequest + */ +TEST_F(TestICDManager, TestICDMStayActive) +{ + ICDNotifier notifier = ICDNotifier::GetInstance(); + ICDConfigurationData & icdConfigData = ICDConfigurationData::GetInstance(); + + // Verify That ICDManager starts in Idle + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); + + // Trigger a subscription report. Put the ICD manager into active mode. + notifier.NotifySubscriptionReport(); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + + // Advance time just before ActiveMode timer expires + AdvanceClockAndRunEventLoop(icdConfigData.GetActiveModeDuration() - 1_ms32); + // Confirm ICD manager is in active mode + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + + uint32_t stayActiveRequestedMs = 20000; + // Send a stay active request for 20 seconds + uint32_t stayActivePromisedMs = mICDManager.StayActiveRequest(stayActiveRequestedMs); + // confirm the promised time is the same as the requested time + EXPECT_EQ(stayActivePromisedMs, stayActiveRequestedMs); + + // Advance time by the duration of the stay stayActiveRequestedMs - 1 ms + AdvanceClockAndRunEventLoop(Milliseconds32(stayActiveRequestedMs) - 1_ms32); + // Confirm ICD manager is in active mode + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + + // Advance time by 1ms and Confirm ICD manager is in idle mode + AdvanceClockAndRunEventLoop(1_ms32); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); + + // Trigger a subscription report Put the ICD manager into active mode + notifier.NotifySubscriptionReport(); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + + // Advance time by the duration of the stay active request - 1 ms + AdvanceClockAndRunEventLoop(icdConfigData.GetActiveModeDuration() - 1_ms32); + stayActiveRequestedMs = 35000; + // Send a stay active request for 35 seconds, which is higher than the maximum stay active duration (30 seconds) + stayActivePromisedMs = mICDManager.StayActiveRequest(stayActiveRequestedMs); + // confirm the promised time is the maximum stay active duration (30 seconds) + EXPECT_EQ(stayActivePromisedMs, 30000UL); + + // Advance time by the duration of the max stay active duration - 1 ms + AdvanceClockAndRunEventLoop(Milliseconds32(30000) - 1_ms32); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + + // Advance time by 1ms and Confirm ICD manager is in idle mode + AdvanceClockAndRunEventLoop(1_ms32); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); + + // Trigger a subscription report Put the ICD manager into active mode + notifier.NotifySubscriptionReport(); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + + // Advance time by the duration of the stay active request - 1 ms + AdvanceClockAndRunEventLoop(icdConfigData.GetActiveModeDuration() - 1_ms32); + stayActiveRequestedMs = 30000; + // Send a stay active request for 30 seconds + stayActivePromisedMs = mICDManager.StayActiveRequest(stayActiveRequestedMs); + // confirm the promised time is the same as the requested time + EXPECT_EQ(stayActivePromisedMs, 30000UL); + + // Advance time by the duration of the stay active request - 20000 ms + AdvanceClockAndRunEventLoop(Milliseconds32(stayActiveRequestedMs) - 20000_ms32); + // Confirm ICD manager is in active mode, we should have 20000 seconds left at that point + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); + + stayActiveRequestedMs = 10000; + stayActivePromisedMs = mICDManager.StayActiveRequest(stayActiveRequestedMs); + // confirm the promised time is 20000 since the device is already planing to stay active longer than the requested time + EXPECT_EQ(stayActivePromisedMs, 20000UL); +} #if CHIP_CONFIG_ENABLE_ICD_CIP #if CHIP_CONFIG_PERSIST_SUBSCRIPTIONS #if CHIP_CONFIG_SUBSCRIPTION_TIMEOUT_RESUMPTION - static void TestShouldCheckInMsgsBeSentAtActiveModeFunction(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); - - // Test 1 - Has no ActiveSubscription & no persisted subscription - ctx->mSubInfoProvider.SetHasActiveSubscription(false); - ctx->mSubInfoProvider.SetHasPersistedSubscription(false); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); - - // Test 2 - Has no active subscription & a persisted subscription - ctx->mSubInfoProvider.SetHasActiveSubscription(false); - ctx->mSubInfoProvider.SetHasPersistedSubscription(true); - NL_TEST_ASSERT(aSuite, !(ctx->mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11))); - - // Test 3 - Has an active subscription & a persisted subscription - ctx->mSubInfoProvider.SetHasActiveSubscription(true); - ctx->mSubInfoProvider.SetHasPersistedSubscription(true); - NL_TEST_ASSERT(aSuite, !(ctx->mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11))); - } +TEST_F(TestICDManager, TestShouldCheckInMsgsBeSentAtActiveModeFunction) +{ + // Test 1 - Has no ActiveSubscription & no persisted subscription + mSubInfoProvider.SetHasActiveSubscription(false); + mSubInfoProvider.SetHasPersistedSubscription(false); + EXPECT_TRUE(mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); + + // Test 2 - Has no active subscription & a persisted subscription + mSubInfoProvider.SetHasActiveSubscription(false); + mSubInfoProvider.SetHasPersistedSubscription(true); + EXPECT_FALSE(mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); + + // Test 3 - Has an active subscription & a persisted subscription + mSubInfoProvider.SetHasActiveSubscription(true); + mSubInfoProvider.SetHasPersistedSubscription(true); + EXPECT_FALSE(mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); +} #else - static void TestShouldCheckInMsgsBeSentAtActiveModeFunction(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); - - // Test 1 - Has no active subscription and no persisted subscription at boot up - ctx->mSubInfoProvider.SetHasActiveSubscription(false); - ctx->mSubInfoProvider.SetHasPersistedSubscription(false); - ctx->mICDManager.mIsBootUpResumeSubscriptionExecuted = false; - NL_TEST_ASSERT(aSuite, ctx->mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); - - // Test 2 - Has no active subscription and a persisted subscription at boot up - ctx->mSubInfoProvider.SetHasActiveSubscription(false); - ctx->mSubInfoProvider.SetHasPersistedSubscription(true); - ctx->mICDManager.mIsBootUpResumeSubscriptionExecuted = false; - NL_TEST_ASSERT(aSuite, !(ctx->mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11))); - - // Test 3 - Has an active subscription and a persisted subscription during normal operations - ctx->mSubInfoProvider.SetHasActiveSubscription(true); - ctx->mSubInfoProvider.SetHasPersistedSubscription(true); - ctx->mICDManager.mIsBootUpResumeSubscriptionExecuted = true; - NL_TEST_ASSERT(aSuite, !(ctx->mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11))); - - // Test 4 - Has no active subscription and a persisted subscription during normal operations - ctx->mSubInfoProvider.SetHasActiveSubscription(false); - ctx->mSubInfoProvider.SetHasPersistedSubscription(true); - ctx->mICDManager.mIsBootUpResumeSubscriptionExecuted = true; - NL_TEST_ASSERT(aSuite, ctx->mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); - } +TEST_F(TestICDManager, TestShouldCheckInMsgsBeSentAtActiveModeFunction) +{ + // Test 1 - Has no active subscription and no persisted subscription at boot up + mSubInfoProvider.SetHasActiveSubscription(false); + mSubInfoProvider.SetHasPersistedSubscription(false); + EXPECT_TRUE(mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); + + // Test 2 - Has no active subscription and a persisted subscription at boot up + mSubInfoProvider.SetHasActiveSubscription(false); + mSubInfoProvider.SetHasPersistedSubscription(true); + EXPECT_FALSE(mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); + + mICDManager.SetBootUpResumeSubscriptionExecuted(); + + // Test 3 - Has an active subscription and a persisted subscription during normal operations + mSubInfoProvider.SetHasActiveSubscription(true); + mSubInfoProvider.SetHasPersistedSubscription(true); + EXPECT_FALSE(mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); + + // Test 4 - Has no active subscription and a persisted subscription during normal operations + mSubInfoProvider.SetHasActiveSubscription(false); + mSubInfoProvider.SetHasPersistedSubscription(true); + EXPECT_TRUE(mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); +} #endif // CHIP_CONFIG_SUBSCRIPTION_TIMEOUT_RESUMPTION #else - static void TestShouldCheckInMsgsBeSentAtActiveModeFunction(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); - - // Test 1 - Has an active subscription - ctx->mSubInfoProvider.SetHasActiveSubscription(true); - NL_TEST_ASSERT(aSuite, - ctx->mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11) == false); +TEST_F(TestICDManager, TestShouldCheckInMsgsBeSentAtActiveModeFunction) +{ + // Test 1 - Has an active subscription + mSubInfoProvider.SetHasActiveSubscription(true); + EXPECT_FALSE(mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); - // Test 2 - Has no active subscription - ctx->mSubInfoProvider.SetHasActiveSubscription(false); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); + // Test 2 - Has no active subscription + mSubInfoProvider.SetHasActiveSubscription(false); + EXPECT_TRUE(mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); - // Test 3 - Make sure that the persisted subscription has no impact - ctx->mSubInfoProvider.SetHasPersistedSubscription(true); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); - } + // Test 3 - Make sure that the persisted subscription has no impact + mSubInfoProvider.SetHasPersistedSubscription(true); + EXPECT_TRUE(mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); +} #endif // CHIP_CONFIG_PERSIST_SUBSCRIPTIONS #endif // CHIP_CONFIG_ENABLE_ICD_CIP - static void TestHandleTestEventTriggerActiveModeReq(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); - - // Verify That ICDManager starts in Idle - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); - - // Add ActiveMode req for the Test event trigger event - ctx->mICDManager.HandleEventTrigger(static_cast<uint64_t>(ICDTestEventTriggerEvent::kAddActiveModeReq)); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - - // Advance clock by the ActiveModeDuration and check that the device is still in ActiveMode - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeDuration() + 1_ms32); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::ActiveMode); - - // Remove req and device should go to IdleMode - ctx->mICDManager.HandleEventTrigger(static_cast<uint64_t>(ICDTestEventTriggerEvent::kRemoveActiveModeReq)); - NL_TEST_ASSERT(aSuite, ctx->mICDManager.mOperationalState == ICDManager::OperationalState::IdleMode); - } - - static void TestHandleTestEventTriggerInvalidateHalfCounterValues(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); +TEST_F(TestICDManager, TestHandleTestEventTriggerActiveModeReq) +{ + // Verify That ICDManager starts in Idle + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); - constexpr uint32_t startValue = 1; - constexpr uint32_t expectedValue = 2147483648; + // Add ActiveMode req for the Test event trigger event + mICDManager.HandleEventTrigger(static_cast<uint64_t>(ICDTestEventTriggerEvent::kAddActiveModeReq)); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); - // Set starting value - uint32_t currentValue = ICDConfigurationData::GetInstance().GetICDCounter().GetValue(); - uint32_t delta = startValue - currentValue; + // Advance clock by the ActiveModeDuration and check that the device is still in ActiveMode + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeDuration() + 1_ms32); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::ActiveMode); - NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDCounter().AdvanceBy(delta) == CHIP_NO_ERROR); - NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDCounter().GetValue() == startValue); + // Remove req and device should go to IdleMode + mICDManager.HandleEventTrigger(static_cast<uint64_t>(ICDTestEventTriggerEvent::kRemoveActiveModeReq)); + EXPECT_EQ(mICDManager.GetOperaionalState(), ICDManager::OperationalState::IdleMode); +} - // Trigger ICD kInvalidateHalfCounterValues event - ctx->mICDManager.HandleEventTrigger(static_cast<uint64_t>(ICDTestEventTriggerEvent::kInvalidateHalfCounterValues)); +#if CHIP_CONFIG_ENABLE_ICD_CIP +TEST_F(TestICDManager, TestHandleTestEventTriggerInvalidateHalfCounterValues) +{ + constexpr uint32_t startValue = 1; + constexpr uint32_t expectedValue = 2147483648; - // Validate counter has the expected value - NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDCounter().GetValue() == expectedValue); - } + // Set starting value + uint32_t currentValue = ICDConfigurationData::GetInstance().GetICDCounter().GetValue(); + uint32_t delta = startValue - currentValue; - static void TestHandleTestEventTriggerInvalidateAllCounterValues(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); + EXPECT_EQ(ICDConfigurationData::GetInstance().GetICDCounter().AdvanceBy(delta), CHIP_NO_ERROR); + EXPECT_EQ(ICDConfigurationData::GetInstance().GetICDCounter().GetValue(), startValue); - constexpr uint32_t startValue = 105; - constexpr uint32_t expectedValue = 104; + // Trigger ICD kInvalidateHalfCounterValues event + mICDManager.HandleEventTrigger(static_cast<uint64_t>(ICDTestEventTriggerEvent::kInvalidateHalfCounterValues)); - // Set starting value - uint32_t currentValue = ICDConfigurationData::GetInstance().GetICDCounter().GetValue(); - uint32_t delta = startValue - currentValue; - - NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDCounter().AdvanceBy(delta) == CHIP_NO_ERROR); - NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDCounter().GetValue() == startValue); + // Validate counter has the expected value + EXPECT_EQ(ICDConfigurationData::GetInstance().GetICDCounter().GetValue(), expectedValue); +} - // Trigger ICD kInvalidateAllCounterValues event - ctx->mICDManager.HandleEventTrigger(static_cast<uint64_t>(ICDTestEventTriggerEvent::kInvalidateAllCounterValues)); +TEST_F(TestICDManager, TestHandleTestEventTriggerInvalidateAllCounterValues) +{ + constexpr uint32_t startValue = 105; + constexpr uint32_t expectedValue = 104; - // Validate counter has the expected value - NL_TEST_ASSERT(aSuite, ICDConfigurationData::GetInstance().GetICDCounter().GetValue() == expectedValue); - } + // Set starting value + uint32_t currentValue = ICDConfigurationData::GetInstance().GetICDCounter().GetValue(); + uint32_t delta = startValue - currentValue; - /** - * @brief Test verifies when OnEnterIdleMode is called during normal operations. - * Without the ActiveMode timer being extended - */ - static void TestICDStateObserverOnEnterIdleModeActiveModeDuration(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); + EXPECT_EQ(ICDConfigurationData::GetInstance().GetICDCounter().AdvanceBy(delta), CHIP_NO_ERROR); + EXPECT_EQ(ICDConfigurationData::GetInstance().GetICDCounter().GetValue(), startValue); - // Verify that ICDManager starts in IdleMode and calls OnEnterIdleMode - NL_TEST_ASSERT(aSuite, ctx->mICDStateObserver.mOnEnterIdleModeCalled); - ctx->mICDStateObserver.ResetOnEnterIdleMode(); + // Trigger ICD kInvalidateAllCounterValues event + mICDManager.HandleEventTrigger(static_cast<uint64_t>(ICDTestEventTriggerEvent::kInvalidateAllCounterValues)); - // Advance clock just before IdleMode timer expires - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetIdleModeDuration() - 1_s); - NL_TEST_ASSERT(aSuite, !ctx->mICDStateObserver.mOnEnterIdleModeCalled); + // Validate counter has the expected value + EXPECT_EQ(ICDConfigurationData::GetInstance().GetICDCounter().GetValue(), expectedValue); +} +#endif // CHIP_CONFIG_ENABLE_ICD_CIP - // Expire IdleModeInterval - AdvanceClockAndRunEventLoop(ctx, 1_s); - NL_TEST_ASSERT(aSuite, !ctx->mICDStateObserver.mOnEnterIdleModeCalled); +/** + * @brief Test verifies when OnEnterIdleMode is called during normal operations. + * Without the ActiveMode timer being extended + */ +TEST_F(TestICDManager, TestICDStateObserverOnEnterIdleModeActiveModeDuration) +{ + // Verify that ICDManager starts in IdleMode and calls OnEnterIdleMode + EXPECT_TRUE(mICDStateObserver.mOnEnterIdleModeCalled); + mICDStateObserver.ResetOnEnterIdleMode(); - // Advance clock Just before ActiveMode timer expires - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeDuration() - 1_ms32); - NL_TEST_ASSERT(aSuite, !ctx->mICDStateObserver.mOnEnterIdleModeCalled); + // Advance clock just before IdleMode timer expires + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetIdleModeDuration() - 1_s); + EXPECT_FALSE(mICDStateObserver.mOnEnterIdleModeCalled); - // Expire ActiveMode timer - AdvanceClockAndRunEventLoop(ctx, 1_ms32); - NL_TEST_ASSERT(aSuite, ctx->mICDStateObserver.mOnEnterIdleModeCalled); - } + // Expire IdleModeInterval + AdvanceClockAndRunEventLoop(1_s); + EXPECT_FALSE(mICDStateObserver.mOnEnterIdleModeCalled); - /** - * @brief Test verifies when OnEnterIdleMode is called with the ActiveMode timer gets extended - */ - static void TestICDStateObserverOnEnterIdleModeActiveModeThreshold(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); + // Advance clock Just before ActiveMode timer expires + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeDuration() - 1_ms32); + EXPECT_FALSE(mICDStateObserver.mOnEnterIdleModeCalled); - // Verify that ICDManager starts in IdleMode and calls OnEnterIdleMode - NL_TEST_ASSERT(aSuite, ctx->mICDStateObserver.mOnEnterIdleModeCalled); - ctx->mICDStateObserver.ResetOnEnterIdleMode(); + // Expire ActiveMode timer + AdvanceClockAndRunEventLoop(1_ms32); + EXPECT_TRUE(mICDStateObserver.mOnEnterIdleModeCalled); +} - // Advance clock just before the IdleMode timer expires - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetIdleModeDuration() - 1_s); - NL_TEST_ASSERT(aSuite, !ctx->mICDStateObserver.mOnEnterIdleModeCalled); +/** + * @brief Test verifies when OnEnterIdleMode is called with the ActiveMode timer gets extended + */ +TEST_F(TestICDManager, TestICDStateObserverOnEnterIdleModeActiveModeThreshold) +{ + // Verify that ICDManager starts in IdleMode and calls OnEnterIdleMode + EXPECT_TRUE(mICDStateObserver.mOnEnterIdleModeCalled); + mICDStateObserver.ResetOnEnterIdleMode(); - // Expire IdleMode timer - AdvanceClockAndRunEventLoop(ctx, 1_s); - NL_TEST_ASSERT(aSuite, !ctx->mICDStateObserver.mOnEnterIdleModeCalled); + // Advance clock just before the IdleMode timer expires + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetIdleModeDuration() - 1_s); + EXPECT_FALSE(mICDStateObserver.mOnEnterIdleModeCalled); - // Advance clock Just before ActiveMode timer expires - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeDuration() - 1_ms32); - NL_TEST_ASSERT(aSuite, !ctx->mICDStateObserver.mOnEnterIdleModeCalled); + // Expire IdleMode timer + AdvanceClockAndRunEventLoop(1_s); + EXPECT_FALSE(mICDStateObserver.mOnEnterIdleModeCalled); - // Increase ActiveMode timer by one ActiveModeThreshold - ICDNotifier::GetInstance().NotifyNetworkActivityNotification(); - NL_TEST_ASSERT(aSuite, !ctx->mICDStateObserver.mOnEnterIdleModeCalled); + // Advance clock Just before ActiveMode timer expires + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeDuration() - 1_ms32); + EXPECT_FALSE(mICDStateObserver.mOnEnterIdleModeCalled); - // Advance clock Just before ActiveMode timer expires - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeThreshold() - 1_ms32); - NL_TEST_ASSERT(aSuite, !ctx->mICDStateObserver.mOnEnterIdleModeCalled); + // Increase ActiveMode timer by one ActiveModeThreshold + ICDNotifier::GetInstance().NotifyNetworkActivityNotification(); + EXPECT_FALSE(mICDStateObserver.mOnEnterIdleModeCalled); - // Expire ActiveMode timer - AdvanceClockAndRunEventLoop(ctx, 1_ms32); - NL_TEST_ASSERT(aSuite, ctx->mICDStateObserver.mOnEnterIdleModeCalled); - } + // Advance clock Just before ActiveMode timer expires + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeThreshold() - 1_ms32); + EXPECT_FALSE(mICDStateObserver.mOnEnterIdleModeCalled); - static void TestICDStateObserverOnEnterActiveMode(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); + // Expire ActiveMode timer + AdvanceClockAndRunEventLoop(1_ms32); + EXPECT_TRUE(mICDStateObserver.mOnEnterIdleModeCalled); +} - // Verify OnEnterActiveMode wasn't called at Init - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnEnterActiveModeCalled)); +TEST_F(TestICDManager, TestICDStateObserverOnEnterActiveMode) +{ + // Verify OnEnterActiveMode wasn't called at Init + EXPECT_FALSE(mICDStateObserver.mOnEnterActiveModeCalled); - // Advance clock just before IdleMode timer expires - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetIdleModeDuration() - 1_s); - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnEnterActiveModeCalled)); + // Advance clock just before IdleMode timer expires + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetIdleModeDuration() - 1_s); + EXPECT_FALSE(mICDStateObserver.mOnEnterActiveModeCalled); - // Expire IdleMode timer and check wether OnEnterActiveMode was called - AdvanceClockAndRunEventLoop(ctx, 1_s); - NL_TEST_ASSERT(aSuite, ctx->mICDStateObserver.mOnEnterActiveModeCalled); - ctx->mICDStateObserver.ResetOnEnterActiveMode(); + // Expire IdleMode timer and check wether OnEnterActiveMode was called + AdvanceClockAndRunEventLoop(1_s); + EXPECT_TRUE(mICDStateObserver.mOnEnterActiveModeCalled); + mICDStateObserver.ResetOnEnterActiveMode(); - // Advance clock just before the ActiveMode timer expires - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeDuration() - 1_ms32); + // Advance clock just before the ActiveMode timer expires + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeDuration() - 1_ms32); - // Verify OnEnterActiveMde wasn't called - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnEnterActiveModeCalled)); + // Verify OnEnterActiveMde wasn't called + EXPECT_FALSE(mICDStateObserver.mOnEnterActiveModeCalled); - // Increase ActiveMode timer by one ActiveModeThreshold - ICDNotifier::GetInstance().NotifyNetworkActivityNotification(); + // Increase ActiveMode timer by one ActiveModeThreshold + ICDNotifier::GetInstance().NotifyNetworkActivityNotification(); - // Verify OnEnterActiveMde wasn't called - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnEnterActiveModeCalled)); + // Verify OnEnterActiveMde wasn't called + EXPECT_FALSE(mICDStateObserver.mOnEnterActiveModeCalled); - // Advance clock just before ActiveMode timer expires - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeThreshold() - 1_ms32); + // Advance clock just before ActiveMode timer expires + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeThreshold() - 1_ms32); - // Verify OnEnterActiveMde wasn't called - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnEnterActiveModeCalled)); + // Verify OnEnterActiveMde wasn't called + EXPECT_FALSE(mICDStateObserver.mOnEnterActiveModeCalled); - // Expire ActiveMode timer - AdvanceClockAndRunEventLoop(ctx, 1_ms32); + // Expire ActiveMode timer + AdvanceClockAndRunEventLoop(1_ms32); - // Verify OnEnterActiveMde wasn't called - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnEnterActiveModeCalled)); + // Verify OnEnterActiveMde wasn't called + EXPECT_FALSE(mICDStateObserver.mOnEnterActiveModeCalled); - // Advance clock just before IdleMode timer expires - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetIdleModeDuration() - 1_s); - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnEnterActiveModeCalled)); + // Advance clock just before IdleMode timer expires + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetIdleModeDuration() - 1_s); + EXPECT_FALSE(mICDStateObserver.mOnEnterActiveModeCalled); - // Expire IdleMode timer and check OnEnterActiveMode was called - AdvanceClockAndRunEventLoop(ctx, 1_s); - NL_TEST_ASSERT(aSuite, ctx->mICDStateObserver.mOnEnterActiveModeCalled); - } + // Expire IdleMode timer and check OnEnterActiveMode was called + AdvanceClockAndRunEventLoop(1_s); + EXPECT_TRUE(mICDStateObserver.mOnEnterActiveModeCalled); +} - static void TestICDStateObserverOnICDModeChange(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); - typedef ICDListener::ICDManagementEvents ICDMEvent; +#if CHIP_CONFIG_ENABLE_ICD_CIP +TEST_F(TestICDManager, TestICDStateObserverOnICDModeChange) +{ + typedef ICDListener::ICDManagementEvents ICDMEvent; - // Since we don't have a registration, we stay in SIT mode. No changes - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnICDModeChangeCalled)); + // Set FeatureMap - Configures CIP, UAT and LITS to 1 + mICDManager.SetTestFeatureMapValue(0x07); - // Trigger register event to force ICDManager to re-evaluate OperatingMode - ICDNotifier::GetInstance().NotifyICDManagementEvent(ICDMEvent::kTableUpdated); + // Since we don't have a registration, we stay in SIT mode. No changes + EXPECT_FALSE(mICDStateObserver.mOnICDModeChangeCalled); - // Since we don't have a registration, we stay in SIT mode. No changes - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnICDModeChangeCalled)); + // Trigger register event to force ICDManager to re-evaluate OperatingMode + ICDNotifier::GetInstance().NotifyICDManagementEvent(ICDMEvent::kTableUpdated); - // Add an entry to the ICDMonitoringTable - ICDMonitoringTable table(ctx->testStorage, kTestFabricIndex1, kMaxTestClients, &(ctx->mKeystore)); + // Since we don't have a registration, we stay in SIT mode. No changes + EXPECT_FALSE(mICDStateObserver.mOnICDModeChangeCalled); - ICDMonitoringEntry entry(&(ctx->mKeystore)); - entry.checkInNodeID = kClientNodeId11; - entry.monitoredSubject = kClientNodeId11; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry.SetKey(ByteSpan(kKeyBuffer1a))); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == table.Set(0, entry)); + // Add an entry to the ICDMonitoringTable + ICDMonitoringTable table(testStorage, kTestFabricIndex1, kMaxTestClients, &(mKeystore)); - // Trigger register event after first entry was added - ICDNotifier::GetInstance().NotifyICDManagementEvent(ICDMEvent::kTableUpdated); + ICDMonitoringEntry entry(&(mKeystore)); + entry.checkInNodeID = kClientNodeId11; + entry.monitoredSubject = kClientNodeId11; + EXPECT_EQ(CHIP_NO_ERROR, entry.SetKey(ByteSpan(kKeyBuffer1a))); + EXPECT_EQ(CHIP_NO_ERROR, table.Set(0, entry)); - // We have a registration. Transition to LIT mode - NL_TEST_ASSERT(aSuite, ctx->mICDStateObserver.mOnICDModeChangeCalled); - ctx->mICDStateObserver.ResetOnICDModeChange(); + // Trigger register event after first entry was added + ICDNotifier::GetInstance().NotifyICDManagementEvent(ICDMEvent::kTableUpdated); - // Trigger register event to force ICDManager to re-evaluate OperatingMode - ICDNotifier::GetInstance().NotifyICDManagementEvent(ICDMEvent::kTableUpdated); + // We have a registration. Transition to LIT mode + EXPECT_TRUE(mICDStateObserver.mOnICDModeChangeCalled); + mICDStateObserver.ResetOnICDModeChange(); - // We have a registration. We stay in LIT mode. No changes. - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnICDModeChangeCalled)); + // Trigger register event to force ICDManager to re-evaluate OperatingMode + ICDNotifier::GetInstance().NotifyICDManagementEvent(ICDMEvent::kTableUpdated); - // Remove entry from the ICDMonitoringTable - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == table.Remove(0)); - ICDNotifier::GetInstance().NotifyICDManagementEvent(ICDMEvent::kTableUpdated); + // We have a registration. We stay in LIT mode. No changes. + EXPECT_FALSE(mICDStateObserver.mOnICDModeChangeCalled); - // Since we don't have a registration anymore. Transition to SIT mode. - NL_TEST_ASSERT(aSuite, ctx->mICDStateObserver.mOnICDModeChangeCalled); - ctx->mICDStateObserver.ResetOnICDModeChange(); - } + // Remove entry from the ICDMonitoringTable + EXPECT_EQ(CHIP_NO_ERROR, table.Remove(0)); + ICDNotifier::GetInstance().NotifyICDManagementEvent(ICDMEvent::kTableUpdated); - static void TestICDStateObserverOnICDModeChangeOnInit(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); + // Since we don't have a registration anymore. Transition to SIT mode. + EXPECT_TRUE(mICDStateObserver.mOnICDModeChangeCalled); + mICDStateObserver.ResetOnICDModeChange(); +} - ICDMonitoringTable table(ctx->testStorage, kTestFabricIndex1, kMaxTestClients, &(ctx->mKeystore)); +TEST_F(TestICDManager, TestICDStateObserverOnICDModeChangeOnInit) +{ + // Set FeatureMap - Configures CIP, UAT and LITS to 1 + mICDManager.SetTestFeatureMapValue(0x07); - // Since we don't have a registration, we stay in SIT mode. No changes - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnICDModeChangeCalled)); + ICDMonitoringTable table(testStorage, kTestFabricIndex1, kMaxTestClients, &(mKeystore)); - // Add an entry to the ICDMonitoringTable - ICDMonitoringEntry entry(&(ctx->mKeystore)); - entry.checkInNodeID = kClientNodeId11; - entry.monitoredSubject = kClientNodeId11; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry.SetKey(ByteSpan(kKeyBuffer1a))); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == table.Set(0, entry)); + // Since we don't have a registration, we stay in SIT mode. No changes + EXPECT_FALSE(mICDStateObserver.mOnICDModeChangeCalled); - // Shut down and reinit ICDManager - We should go to LIT mode since we have a registration - ctx->mICDManager.Shutdown(); - ctx->mICDManager.RegisterObserver(&(ctx->mICDStateObserver)); - ctx->mICDManager.Init(&(ctx->testStorage), &(ctx->GetFabricTable()), &(ctx->mKeystore), &(ctx->GetExchangeManager()), - &(ctx->mSubInfoProvider)); + // Add an entry to the ICDMonitoringTable + ICDMonitoringEntry entry(&(mKeystore)); + entry.checkInNodeID = kClientNodeId11; + entry.monitoredSubject = kClientNodeId11; + EXPECT_EQ(CHIP_NO_ERROR, entry.SetKey(ByteSpan(kKeyBuffer1a))); + EXPECT_EQ(CHIP_NO_ERROR, table.Set(0, entry)); - // We have a registration, transition to LIT mode - NL_TEST_ASSERT(aSuite, ctx->mICDStateObserver.mOnICDModeChangeCalled); - ctx->mICDStateObserver.ResetOnICDModeChange(); + // Shut down and reinit ICDManager - We should go to LIT mode since we have a registration + mICDManager.Shutdown(); + mICDManager.RegisterObserver(&(mICDStateObserver)); + mICDManager.Init(&testStorage, &(pMessagingContext->GetFabricTable()), &mKeystore, &(pMessagingContext->GetExchangeManager()), + &mSubInfoProvider); - // Remove entry from the ICDMonitoringTable - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == table.Remove(0)); - } + // We have a registration, transition to LIT mode + EXPECT_TRUE(mICDStateObserver.mOnICDModeChangeCalled); + mICDStateObserver.ResetOnICDModeChange(); - /** - * @brief Test verifies the OnTransitionToIdleMode event when the ActiveModeDuration is greater than the - * ICD_ACTIVE_TIME_JITTER_MS - */ - static void TestICDStateObserverOnTransitionToIdleModeGreaterActiveModeDuration(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); + // Remove entry from the ICDMonitoringTable + EXPECT_EQ(CHIP_NO_ERROR, table.Remove(0)); +} +#endif - // Set New durations for test case - ActiveModeDuration must be longuer than ICD_ACTIVE_TIME_JITTER_MS - Milliseconds32 oldActiveModeDuration = ICDConfigurationData::GetInstance().GetActiveModeDuration(); - ICDConfigurationData::GetInstance().SetModeDurations( - MakeOptional<Milliseconds32>(Milliseconds32(200) + Milliseconds32(ICD_ACTIVE_TIME_JITTER_MS)), NullOptional); +/** + * @brief Test verifies the OnTransitionToIdleMode event when the ActiveModeDuration is greater than the + * ICD_ACTIVE_TIME_JITTER_MS + */ +TEST_F(TestICDManager, TestICDStateObserverOnTransitionToIdleModeGreaterActiveModeDuration) +{ + ICDConfigurationDataTestAccess privateIcdConfigData(&ICDConfigurationData::GetInstance()); - // Advance clock just before IdleMode timer expires - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetIdleModeDuration() - 1_s); - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnTransitionToIdleCalled)); + // Set New durations for test case - ActiveModeDuration must be longuer than ICD_ACTIVE_TIME_JITTER_MS + Milliseconds32 oldActiveModeDuration = ICDConfigurationData::GetInstance().GetActiveModeDuration(); + privateIcdConfigData.SetModeDurations( + MakeOptional<Milliseconds32>(Milliseconds32(200) + Milliseconds32(ICD_ACTIVE_TIME_JITTER_MS)), NullOptional); - // Expire IdleMode timer - AdvanceClockAndRunEventLoop(ctx, 1_s); - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnTransitionToIdleCalled)); + // Advance clock just before IdleMode timer expires + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetIdleModeDuration() - 1_s); + EXPECT_FALSE(mICDStateObserver.mOnTransitionToIdleCalled); - // Advance time just before OnTransitionToIdleMode is called - AdvanceClockAndRunEventLoop( - ctx, ICDConfigurationData::GetInstance().GetActiveModeDuration() - Milliseconds32(ICD_ACTIVE_TIME_JITTER_MS) - 1_ms32); + // Expire IdleMode timer + AdvanceClockAndRunEventLoop(1_s); + EXPECT_FALSE(mICDStateObserver.mOnTransitionToIdleCalled); - // Check mOnTransitionToIdleCalled has not been called - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnTransitionToIdleCalled)); + // Advance time just before OnTransitionToIdleMode is called + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeDuration() - + Milliseconds32(ICD_ACTIVE_TIME_JITTER_MS) - 1_ms32); - // Increase ActiveMode timer by one ActiveModeThreshold - ICDNotifier::GetInstance().NotifyNetworkActivityNotification(); - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnTransitionToIdleCalled)); + // Check mOnTransitionToIdleCalled has not been called + EXPECT_FALSE(mICDStateObserver.mOnTransitionToIdleCalled); - // Advance time just before OnTransitionToIdleMode is called - AdvanceClockAndRunEventLoop( - ctx, ICDConfigurationData::GetInstance().GetActiveModeThreshold() - Milliseconds32(ICD_ACTIVE_TIME_JITTER_MS) - 1_ms32); - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnTransitionToIdleCalled)); + // Increase ActiveMode timer by one ActiveModeThreshold + ICDNotifier::GetInstance().NotifyNetworkActivityNotification(); + EXPECT_FALSE(mICDStateObserver.mOnTransitionToIdleCalled); - // Expire OnTransitionToIdleMode - AdvanceClockAndRunEventLoop(ctx, 1_ms32); - // Check mOnTransitionToIdleCalled has been called - NL_TEST_ASSERT(aSuite, ctx->mICDStateObserver.mOnTransitionToIdleCalled); - ctx->mICDStateObserver.ResetOnTransitionToIdle(); + // Advance time just before OnTransitionToIdleMode is called + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeThreshold() - + Milliseconds32(ICD_ACTIVE_TIME_JITTER_MS) - 1_ms32); + EXPECT_FALSE(mICDStateObserver.mOnTransitionToIdleCalled); - // Expire ActiveMode timer - AdvanceClockAndRunEventLoop(ctx, Milliseconds32(ICD_ACTIVE_TIME_JITTER_MS)); - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnTransitionToIdleCalled)); + // Expire OnTransitionToIdleMode + AdvanceClockAndRunEventLoop(1_ms32); + // Check mOnTransitionToIdleCalled has been called + EXPECT_TRUE(mICDStateObserver.mOnTransitionToIdleCalled); + mICDStateObserver.ResetOnTransitionToIdle(); - // Reset Old durations - ICDConfigurationData::GetInstance().SetModeDurations(MakeOptional(oldActiveModeDuration), NullOptional); - } + // Expire ActiveMode timer + AdvanceClockAndRunEventLoop(Milliseconds32(ICD_ACTIVE_TIME_JITTER_MS)); + EXPECT_FALSE(mICDStateObserver.mOnTransitionToIdleCalled); - /** - * @brief Test verifies the OnTransitionToIdleMode event when the ActiveModeDuration is equal to the - * ICD_ACTIVE_TIME_JITTER_MS. - */ - static void TestICDStateObserverOnTransitionToIdleModeEqualActiveModeDuration(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); + // Reset Old durations + privateIcdConfigData.SetModeDurations(MakeOptional(oldActiveModeDuration), NullOptional); +} - // Set New durations for test case - ActiveModeDuration must be equal to ICD_ACTIVE_TIME_JITTER_MS - Milliseconds32 oldActiveModeDuration = ICDConfigurationData::GetInstance().GetActiveModeDuration(); - ICDConfigurationData::GetInstance().SetModeDurations( - MakeOptional<Milliseconds32>(Milliseconds32(ICD_ACTIVE_TIME_JITTER_MS)), NullOptional); +/** + * @brief Test verifies the OnTransitionToIdleMode event when the ActiveModeDuration is equal to the + * ICD_ACTIVE_TIME_JITTER_MS. + */ +TEST_F(TestICDManager, TestICDStateObserverOnTransitionToIdleModeEqualActiveModeDuration) +{ + ICDConfigurationDataTestAccess privateIcdConfigData(&ICDConfigurationData::GetInstance()); - // Advance clock just before IdleMode timer expires - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetIdleModeDuration() - 1_s); - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnTransitionToIdleCalled)); + // Set New durations for test case - ActiveModeDuration must be equal to ICD_ACTIVE_TIME_JITTER_MS + Milliseconds32 oldActiveModeDuration = ICDConfigurationData::GetInstance().GetActiveModeDuration(); + privateIcdConfigData.SetModeDurations(MakeOptional<Milliseconds32>(Milliseconds32(ICD_ACTIVE_TIME_JITTER_MS)), NullOptional); - // Expire IdleMode timer - AdvanceClockAndRunEventLoop(ctx, 1_s); - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnTransitionToIdleCalled)); + // Advance clock just before IdleMode timer expires + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetIdleModeDuration() - 1_s); + EXPECT_FALSE(mICDStateObserver.mOnTransitionToIdleCalled); - // Expire OnTransitionToIdleMode - AdvanceClockAndRunEventLoop(ctx, 1_ms32); - NL_TEST_ASSERT(aSuite, ctx->mICDStateObserver.mOnTransitionToIdleCalled); + // Expire IdleMode timer + AdvanceClockAndRunEventLoop(1_s); + EXPECT_FALSE(mICDStateObserver.mOnTransitionToIdleCalled); - // Reset Old durations - ICDConfigurationData::GetInstance().SetModeDurations(MakeOptional(oldActiveModeDuration), NullOptional); - } + // Expire OnTransitionToIdleMode + AdvanceClockAndRunEventLoop(1_ms32); + EXPECT_TRUE(mICDStateObserver.mOnTransitionToIdleCalled); - /** - * @brief Test verifies the OnTransitionToIdleMode event when the ActiveModeDuration is 0 and without an ActiveMode req - */ - static void TestICDStateObserverOnTransitionToIdleMode0ActiveModeDurationWithoutReq(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); + // Reset Old durations + privateIcdConfigData.SetModeDurations(MakeOptional(oldActiveModeDuration), NullOptional); +} - // Set New durations for test case - ActiveModeDuration equal 0 - Milliseconds32 oldActiveModeDuration = ICDConfigurationData::GetInstance().GetActiveModeDuration(); - ICDConfigurationData::GetInstance().SetModeDurations(MakeOptional<Milliseconds32>(0), NullOptional); +/** + * @brief Test verifies the OnTransitionToIdleMode event when the ActiveModeDuration is 0 and without an ActiveMode req + */ +TEST_F(TestICDManager, TestICDStateObserverOnTransitionToIdleMode0ActiveModeDurationWithoutReq) +{ + ICDConfigurationDataTestAccess privateIcdConfigData(&ICDConfigurationData::GetInstance()); - // Advance clock just before IdleMode timer expires - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetIdleModeDuration() - 1_s); - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnTransitionToIdleCalled)); + // Set New durations for test case - ActiveModeDuration equal 0 + Milliseconds32 oldActiveModeDuration = ICDConfigurationData::GetInstance().GetActiveModeDuration(); + privateIcdConfigData.SetModeDurations(MakeOptional<Milliseconds32>(0), NullOptional); - // Expire IdleMode timer - AdvanceClockAndRunEventLoop(ctx, 1_s); - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnTransitionToIdleCalled)); + // Advance clock just before IdleMode timer expires + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetIdleModeDuration() - 1_s); + EXPECT_FALSE(mICDStateObserver.mOnTransitionToIdleCalled); - // Increase time by 1 - Should not trigger OnTransitionToIdle. - // Timer length is one ActiveModeThreshold - AdvanceClockAndRunEventLoop(ctx, 1_ms32); - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnTransitionToIdleCalled)); + // Expire IdleMode timer + AdvanceClockAndRunEventLoop(1_s); + EXPECT_FALSE(mICDStateObserver.mOnTransitionToIdleCalled); - // Expire ActiveModeThreshold - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetActiveModeThreshold()); - NL_TEST_ASSERT(aSuite, ctx->mICDStateObserver.mOnTransitionToIdleCalled); + // Increase time by 1 - Should not trigger OnTransitionToIdle. + // Timer length is one ActiveModeThreshold + AdvanceClockAndRunEventLoop(1_ms32); + EXPECT_FALSE(mICDStateObserver.mOnTransitionToIdleCalled); - // Reset Old durations - ICDConfigurationData::GetInstance().SetModeDurations(MakeOptional(oldActiveModeDuration), NullOptional); - } + // Expire ActiveModeThreshold + AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetActiveModeThreshold()); + EXPECT_TRUE(mICDStateObserver.mOnTransitionToIdleCalled); - /** - * @brief Test verifies the OnTransitionToIdleMode event when the ActiveModeDuration is 0 with an ActiveMode req - */ - static void TestICDStateObserverOnTransitionToIdleMode0ActiveModeDurationWittReq(nlTestSuite * aSuite, void * aContext) - { - TestContext * ctx = static_cast<TestContext *>(aContext); + // Reset Old durations + privateIcdConfigData.SetModeDurations(MakeOptional(oldActiveModeDuration), NullOptional); +} - // Set New durations for test case - ActiveModeDuration equal 0 - Milliseconds32 oldActiveModeDuration = ICDConfigurationData::GetInstance().GetActiveModeDuration(); - ICDConfigurationData::GetInstance().SetModeDurations(MakeOptional<Milliseconds32>(0), NullOptional); +/** + * @brief Test verifies the OnTransitionToIdleMode event when the ActiveModeDuration is 0 with an ActiveMode req + * TODO(#33074): When the OnTransitionToIdle edge is fixed, we can enable this test + */ +// TEST_F(TestICDManager, TestICDStateObserverOnTransitionToIdleMode0ActiveModeDurationWithReq) +// { +// // Set New durations for test case - ActiveModeDuration equal 0 +// Milliseconds32 oldActiveModeDuration = ICDConfigurationData::GetInstance().GetActiveModeDuration(); +// ICDConfigurationData::GetInstance().SetModeDurations(MakeOptional<Milliseconds32>(0), NullOptional); - // Add ActiveMode req for the Test event trigger event - ctx->mICDManager.HandleEventTrigger(static_cast<uint64_t>(ICDTestEventTriggerEvent::kAddActiveModeReq)); +// // Add ActiveMode req for the Test event trigger event +// mICDManager.HandleEventTrigger(static_cast<uint64_t>(ICDTestEventTriggerEvent::kAddActiveModeReq)); - // Expire IdleMode timer - AdvanceClockAndRunEventLoop(ctx, ICDConfigurationData::GetInstance().GetIdleModeDuration()); - NL_TEST_ASSERT(aSuite, !(ctx->mICDStateObserver.mOnTransitionToIdleCalled)); +// // Expire IdleMode timer +// AdvanceClockAndRunEventLoop(ICDConfigurationData::GetInstance().GetIdleModeDuration()); +// EXPECT_FALSE(mICDStateObserver.mOnTransitionToIdleCalled); - // Reset Old durations - ICDConfigurationData::GetInstance().SetModeDurations(MakeOptional(oldActiveModeDuration), NullOptional); - } -}; +// // Reset Old durations +// ICDConfigurationData::GetInstance().SetModeDurations(MakeOptional(oldActiveModeDuration), NullOptional); +// } } // namespace app } // namespace chip - -namespace { -static const nlTest sTests[] = { - NL_TEST_DEF("TestICDModeDurations", TestICDManager::TestICDModeDurations), - NL_TEST_DEF("TestOnSubscriptionReport", TestICDManager::TestOnSubscriptionReport), - NL_TEST_DEF("TestKeepActivemodeRequests", TestICDManager::TestKeepActivemodeRequests), - 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("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("TestICDStateObserverOnTransitionToIdleModeGreaterActiveModeDuration", - TestICDManager::TestICDStateObserverOnTransitionToIdleModeGreaterActiveModeDuration), - NL_TEST_DEF("TestICDStateObserverOnTransitionToIdleModeEqualActiveModeDuration", - TestICDManager::TestICDStateObserverOnTransitionToIdleModeEqualActiveModeDuration), - NL_TEST_DEF("TestICDStateObserverOnTransitionToIdleMode0ActiveModeDurationWithoutReq", - TestICDManager::TestICDStateObserverOnTransitionToIdleMode0ActiveModeDurationWithoutReq), - // TODO(#33074): When the OnTransitionToIdle edge is fixed, we can enable this test - // NL_TEST_DEF("TestICDStateObserverOnTransitionToIdleMode0ActiveModeDurationWittReq", - // TestICDManager::TestICDStateObserverOnTransitionToIdleMode0ActiveModeDurationWittReq), - NL_TEST_SENTINEL(), -}; - -nlTestSuite cmSuite = { - "TestICDManager", - &sTests[0], - TestContext::nlTestSetUpTestSuite, - TestContext::nlTestTearDownTestSuite, - TestContext::nlTestSetUp, - TestContext::nlTestTearDown, -}; -} // namespace - -int TestSuiteICDManager() -{ - return ExecuteTestsWithContext<TestContext>(&cmSuite); -} - -CHIP_REGISTER_TEST_SUITE(TestSuiteICDManager) diff --git a/src/messaging/tests/BUILD.gn b/src/messaging/tests/BUILD.gn index 699066ff0b7402..c597c36055754a 100644 --- a/src/messaging/tests/BUILD.gn +++ b/src/messaging/tests/BUILD.gn @@ -38,6 +38,12 @@ static_library("helpers") { "${chip_root}/src/transport", "${chip_root}/src/transport/tests:helpers", ] + + # MessagingContext exposes nl-test compatible setup/teardown functions, specifically + # they return nltest specific SUCCESS/FAILURE constants hence this dependency. + # + # Once all tests are moved to pw_unittest/gtest, this dependency should be removed + public_deps = [ "${nlunit_test_root}:nlunit-test" ] } chip_test_suite_using_nltest("tests") { 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 37f0bf2c39adbf..9408e84af86d34 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt @@ -1,6 +1,5 @@ AppTests DataModelTests -ICDServerTestsNL InetLayerTests MessagingLayerTests SecureChannelTestsNL From 062e06351d75e48e710d8191e6b90c15136bfc8b Mon Sep 17 00:00:00 2001 From: Boris Zbarsky <bzbarsky@apple.com> Date: Sat, 4 May 2024 00:55:14 -0400 Subject: [PATCH 122/124] Remove Darwin provisional markings for concentration measurement clusters. (#33304) --- .../CHIP/templates/availability.yaml | 532 +++++- .../CHIP/zap-generated/MTRBaseClusters.h | 1522 ++++++++--------- .../CHIP/zap-generated/MTRClusterConstants.h | 340 ++-- .../CHIP/zap-generated/MTRClusters.h | 360 ++-- .../zap-generated/cluster/Commands.h | 830 --------- 5 files changed, 1632 insertions(+), 1952 deletions(-) diff --git a/src/darwin/Framework/CHIP/templates/availability.yaml b/src/darwin/Framework/CHIP/templates/availability.yaml index b1275f67ef1462..e344f6df2151cd 100644 --- a/src/darwin/Framework/CHIP/templates/availability.yaml +++ b/src/darwin/Framework/CHIP/templates/availability.yaml @@ -7458,17 +7458,6 @@ provisional: clusters: ## Not ready at cutoff - # Concentration Measurement clusters - - CarbonDioxideConcentrationMeasurement - - CarbonMonoxideConcentrationMeasurement - - FormaldehydeConcentrationMeasurement - - NitrogenDioxideConcentrationMeasurement - - OzoneConcentrationMeasurement - - PM10ConcentrationMeasurement - - PM1ConcentrationMeasurement - - PM25ConcentrationMeasurement - - RadonConcentrationMeasurement - - TotalVolatileOrganicCompoundsConcentrationMeasurement - RefrigeratorAlarm - TemperatureControl ## Not ready to be public API yet. @@ -8528,6 +8517,17 @@ - AirQuality - HEPAFilterMonitoring - SmokeCOAlarm + # Concentration Measurement clusters + - CarbonDioxideConcentrationMeasurement + - CarbonMonoxideConcentrationMeasurement + - FormaldehydeConcentrationMeasurement + - NitrogenDioxideConcentrationMeasurement + - OzoneConcentrationMeasurement + - PM10ConcentrationMeasurement + - PM1ConcentrationMeasurement + - PM25ConcentrationMeasurement + - RadonConcentrationMeasurement + - TotalVolatileOrganicCompoundsConcentrationMeasurement attributes: ActivatedCarbonFilterMonitoring: - Condition @@ -8581,6 +8581,176 @@ - AttributeList - FeatureMap - ClusterRevision + CarbonDioxideConcentrationMeasurement: + - MeasuredValue + - MinMeasuredValue + - MaxMeasuredValue + - PeakMeasuredValue + - PeakMeasuredValueWindow + - AverageMeasuredValue + - AverageMeasuredValueWindow + - Uncertainty + - MeasurementUnit + - MeasurementMedium + - LevelValue + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + CarbonMonoxideConcentrationMeasurement: + - MeasuredValue + - MinMeasuredValue + - MaxMeasuredValue + - PeakMeasuredValue + - PeakMeasuredValueWindow + - AverageMeasuredValue + - AverageMeasuredValueWindow + - Uncertainty + - MeasurementUnit + - MeasurementMedium + - LevelValue + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + FormaldehydeConcentrationMeasurement: + - MeasuredValue + - MinMeasuredValue + - MaxMeasuredValue + - PeakMeasuredValue + - PeakMeasuredValueWindow + - AverageMeasuredValue + - AverageMeasuredValueWindow + - Uncertainty + - MeasurementUnit + - MeasurementMedium + - LevelValue + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + NitrogenDioxideConcentrationMeasurement: + - MeasuredValue + - MinMeasuredValue + - MaxMeasuredValue + - PeakMeasuredValue + - PeakMeasuredValueWindow + - AverageMeasuredValue + - AverageMeasuredValueWindow + - Uncertainty + - MeasurementUnit + - MeasurementMedium + - LevelValue + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + OzoneConcentrationMeasurement: + - MeasuredValue + - MinMeasuredValue + - MaxMeasuredValue + - PeakMeasuredValue + - PeakMeasuredValueWindow + - AverageMeasuredValue + - AverageMeasuredValueWindow + - Uncertainty + - MeasurementUnit + - MeasurementMedium + - LevelValue + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + PM10ConcentrationMeasurement: + - MeasuredValue + - MinMeasuredValue + - MaxMeasuredValue + - PeakMeasuredValue + - PeakMeasuredValueWindow + - AverageMeasuredValue + - AverageMeasuredValueWindow + - Uncertainty + - MeasurementUnit + - MeasurementMedium + - LevelValue + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + PM1ConcentrationMeasurement: + - MeasuredValue + - MinMeasuredValue + - MaxMeasuredValue + - PeakMeasuredValue + - PeakMeasuredValueWindow + - AverageMeasuredValue + - AverageMeasuredValueWindow + - Uncertainty + - MeasurementUnit + - MeasurementMedium + - LevelValue + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + PM25ConcentrationMeasurement: + - MeasuredValue + - MinMeasuredValue + - MaxMeasuredValue + - PeakMeasuredValue + - PeakMeasuredValueWindow + - AverageMeasuredValue + - AverageMeasuredValueWindow + - Uncertainty + - MeasurementUnit + - MeasurementMedium + - LevelValue + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + RadonConcentrationMeasurement: + - MeasuredValue + - MinMeasuredValue + - MaxMeasuredValue + - PeakMeasuredValue + - PeakMeasuredValueWindow + - AverageMeasuredValue + - AverageMeasuredValueWindow + - Uncertainty + - MeasurementUnit + - MeasurementMedium + - LevelValue + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + TotalVolatileOrganicCompoundsConcentrationMeasurement: + - MeasuredValue + - MinMeasuredValue + - MaxMeasuredValue + - PeakMeasuredValue + - PeakMeasuredValueWindow + - AverageMeasuredValue + - AverageMeasuredValueWindow + - Uncertainty + - MeasurementUnit + - MeasurementMedium + - LevelValue + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision commands: ActivatedCarbonFilterMonitoring: - ResetCondition @@ -8656,6 +8826,46 @@ - MuteStateEnum - EndOfServiceEnum - ContaminationStateEnum + CarbonDioxideConcentrationMeasurement: + - MeasurementUnitEnum + - MeasurementMediumEnum + - LevelValueEnum + CarbonMonoxideConcentrationMeasurement: + - MeasurementUnitEnum + - MeasurementMediumEnum + - LevelValueEnum + FormaldehydeConcentrationMeasurement: + - MeasurementUnitEnum + - MeasurementMediumEnum + - LevelValueEnum + NitrogenDioxideConcentrationMeasurement: + - MeasurementUnitEnum + - MeasurementMediumEnum + - LevelValueEnum + OzoneConcentrationMeasurement: + - MeasurementUnitEnum + - MeasurementMediumEnum + - LevelValueEnum + PM10ConcentrationMeasurement: + - MeasurementUnitEnum + - MeasurementMediumEnum + - LevelValueEnum + PM1ConcentrationMeasurement: + - MeasurementUnitEnum + - MeasurementMediumEnum + - LevelValueEnum + PM25ConcentrationMeasurement: + - MeasurementUnitEnum + - MeasurementMediumEnum + - LevelValueEnum + RadonConcentrationMeasurement: + - MeasurementUnitEnum + - MeasurementMediumEnum + - LevelValueEnum + TotalVolatileOrganicCompoundsConcentrationMeasurement: + - MeasurementUnitEnum + - MeasurementMediumEnum + - LevelValueEnum enum values: ActivatedCarbonFilterMonitoring: DegradationDirectionEnum: @@ -8731,6 +8941,206 @@ - Low - Warning - Critical + CarbonDioxideConcentrationMeasurement: + MeasurementUnitEnum: + - PPM + - PPB + - PPT + - MGM3 + - UGM3 + - NGM3 + - PM3 + - BQM3 + MeasurementMediumEnum: + - Air + - Water + - Soil + LevelValueEnum: + - Unknown + - Low + - Medium + - High + - Critical + CarbonMonoxideConcentrationMeasurement: + MeasurementUnitEnum: + - PPM + - PPB + - PPT + - MGM3 + - UGM3 + - NGM3 + - PM3 + - BQM3 + MeasurementMediumEnum: + - Air + - Water + - Soil + LevelValueEnum: + - Unknown + - Low + - Medium + - High + - Critical + FormaldehydeConcentrationMeasurement: + MeasurementUnitEnum: + - PPM + - PPB + - PPT + - MGM3 + - UGM3 + - NGM3 + - PM3 + - BQM3 + MeasurementMediumEnum: + - Air + - Water + - Soil + LevelValueEnum: + - Unknown + - Low + - Medium + - High + - Critical + NitrogenDioxideConcentrationMeasurement: + MeasurementUnitEnum: + - PPM + - PPB + - PPT + - MGM3 + - UGM3 + - NGM3 + - PM3 + - BQM3 + MeasurementMediumEnum: + - Air + - Water + - Soil + LevelValueEnum: + - Unknown + - Low + - Medium + - High + - Critical + OzoneConcentrationMeasurement: + MeasurementUnitEnum: + - PPM + - PPB + - PPT + - MGM3 + - UGM3 + - NGM3 + - PM3 + - BQM3 + MeasurementMediumEnum: + - Air + - Water + - Soil + LevelValueEnum: + - Unknown + - Low + - Medium + - High + - Critical + PM10ConcentrationMeasurement: + MeasurementUnitEnum: + - PPM + - PPB + - PPT + - MGM3 + - UGM3 + - NGM3 + - PM3 + - BQM3 + MeasurementMediumEnum: + - Air + - Water + - Soil + LevelValueEnum: + - Unknown + - Low + - Medium + - High + - Critical + PM1ConcentrationMeasurement: + MeasurementUnitEnum: + - PPM + - PPB + - PPT + - MGM3 + - UGM3 + - NGM3 + - PM3 + - BQM3 + MeasurementMediumEnum: + - Air + - Water + - Soil + LevelValueEnum: + - Unknown + - Low + - Medium + - High + - Critical + PM25ConcentrationMeasurement: + MeasurementUnitEnum: + - PPM + - PPB + - PPT + - MGM3 + - UGM3 + - NGM3 + - PM3 + - BQM3 + MeasurementMediumEnum: + - Air + - Water + - Soil + LevelValueEnum: + - Unknown + - Low + - Medium + - High + - Critical + RadonConcentrationMeasurement: + MeasurementUnitEnum: + - PPM + - PPB + - PPT + - MGM3 + - UGM3 + - NGM3 + - PM3 + - BQM3 + MeasurementMediumEnum: + - Air + - Water + - Soil + LevelValueEnum: + - Unknown + - Low + - Medium + - High + - Critical + TotalVolatileOrganicCompoundsConcentrationMeasurement: + MeasurementUnitEnum: + - PPM + - PPB + - PPT + - MGM3 + - UGM3 + - NGM3 + - PM3 + - BQM3 + MeasurementMediumEnum: + - Air + - Water + - Soil + LevelValueEnum: + - Unknown + - Low + - Medium + - High + - Critical bitmaps: ActivatedCarbonFilterMonitoring: - Feature @@ -8740,6 +9150,26 @@ - Feature SmokeCOAlarm: - Feature + CarbonDioxideConcentrationMeasurement: + - Feature + CarbonMonoxideConcentrationMeasurement: + - Feature + FormaldehydeConcentrationMeasurement: + - Feature + NitrogenDioxideConcentrationMeasurement: + - Feature + OzoneConcentrationMeasurement: + - Feature + PM10ConcentrationMeasurement: + - Feature + PM1ConcentrationMeasurement: + - Feature + PM25ConcentrationMeasurement: + - Feature + RadonConcentrationMeasurement: + - Feature + TotalVolatileOrganicCompoundsConcentrationMeasurement: + - Feature bitmap values: ActivatedCarbonFilterMonitoring: Feature: @@ -8765,6 +9195,86 @@ Feature: - SmokeAlarm - COAlarm + CarbonDioxideConcentrationMeasurement: + Feature: + - NumericMeasurement + - LevelIndication + - MediumLevel + - CriticalLevel + - PeakMeasurement + - AverageMeasurement + CarbonMonoxideConcentrationMeasurement: + Feature: + - NumericMeasurement + - LevelIndication + - MediumLevel + - CriticalLevel + - PeakMeasurement + - AverageMeasurement + FormaldehydeConcentrationMeasurement: + Feature: + - NumericMeasurement + - LevelIndication + - MediumLevel + - CriticalLevel + - PeakMeasurement + - AverageMeasurement + NitrogenDioxideConcentrationMeasurement: + Feature: + - NumericMeasurement + - LevelIndication + - MediumLevel + - CriticalLevel + - PeakMeasurement + - AverageMeasurement + OzoneConcentrationMeasurement: + Feature: + - NumericMeasurement + - LevelIndication + - MediumLevel + - CriticalLevel + - PeakMeasurement + - AverageMeasurement + PM10ConcentrationMeasurement: + Feature: + - NumericMeasurement + - LevelIndication + - MediumLevel + - CriticalLevel + - PeakMeasurement + - AverageMeasurement + PM1ConcentrationMeasurement: + Feature: + - NumericMeasurement + - LevelIndication + - MediumLevel + - CriticalLevel + - PeakMeasurement + - AverageMeasurement + PM25ConcentrationMeasurement: + Feature: + - NumericMeasurement + - LevelIndication + - MediumLevel + - CriticalLevel + - PeakMeasurement + - AverageMeasurement + RadonConcentrationMeasurement: + Feature: + - NumericMeasurement + - LevelIndication + - MediumLevel + - CriticalLevel + - PeakMeasurement + - AverageMeasurement + TotalVolatileOrganicCompoundsConcentrationMeasurement: + Feature: + - NumericMeasurement + - LevelIndication + - MediumLevel + - CriticalLevel + - PeakMeasurement + - AverageMeasurement provisional: clusters: # Targeting Spring 2024 Matter release diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h index fb813f93804fdb..e1ef95eda2ba9b 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h @@ -11724,86 +11724,86 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) * * Attributes for reporting carbon monoxide concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRBaseClusterCarbonMonoxideConcentrationMeasurement : MTRGenericBaseCluster -- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMinMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMaxMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeUncertaintyWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementUnitWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementMediumWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeLevelValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)readAttributeEventListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeEventListWithParams:(MTRSubscribeParams *)params @@ -11811,23 +11811,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeEventListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -11842,7 +11842,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -11851,86 +11851,86 @@ MTR_PROVISIONALLY_AVAILABLE * * Attributes for reporting carbon dioxide concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRBaseClusterCarbonDioxideConcentrationMeasurement : MTRGenericBaseCluster -- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMinMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMaxMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeUncertaintyWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementUnitWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementMediumWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeLevelValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)readAttributeEventListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeEventListWithParams:(MTRSubscribeParams *)params @@ -11938,23 +11938,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeEventListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -11969,7 +11969,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -11978,86 +11978,86 @@ MTR_PROVISIONALLY_AVAILABLE * * Attributes for reporting nitrogen dioxide concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRBaseClusterNitrogenDioxideConcentrationMeasurement : MTRGenericBaseCluster -- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMinMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMaxMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeUncertaintyWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementUnitWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementMediumWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeLevelValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)readAttributeEventListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeEventListWithParams:(MTRSubscribeParams *)params @@ -12065,23 +12065,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeEventListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -12096,7 +12096,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -12105,86 +12105,86 @@ MTR_PROVISIONALLY_AVAILABLE * * Attributes for reporting ozone concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRBaseClusterOzoneConcentrationMeasurement : MTRGenericBaseCluster -- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMinMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMaxMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeUncertaintyWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementUnitWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementMediumWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeLevelValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)readAttributeEventListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeEventListWithParams:(MTRSubscribeParams *)params @@ -12192,23 +12192,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeEventListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -12223,7 +12223,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -12232,86 +12232,86 @@ MTR_PROVISIONALLY_AVAILABLE * * Attributes for reporting PM2.5 concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRBaseClusterPM25ConcentrationMeasurement : MTRGenericBaseCluster -- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMinMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMaxMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeUncertaintyWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementUnitWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementMediumWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeLevelValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)readAttributeEventListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeEventListWithParams:(MTRSubscribeParams *)params @@ -12319,23 +12319,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeEventListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -12350,7 +12350,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -12359,86 +12359,86 @@ MTR_PROVISIONALLY_AVAILABLE * * Attributes for reporting formaldehyde concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRBaseClusterFormaldehydeConcentrationMeasurement : MTRGenericBaseCluster -- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMinMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMaxMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeUncertaintyWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementUnitWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementMediumWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeLevelValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)readAttributeEventListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeEventListWithParams:(MTRSubscribeParams *)params @@ -12446,23 +12446,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeEventListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -12477,7 +12477,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -12486,86 +12486,86 @@ MTR_PROVISIONALLY_AVAILABLE * * Attributes for reporting PM1 concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRBaseClusterPM1ConcentrationMeasurement : MTRGenericBaseCluster -- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMinMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMaxMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeUncertaintyWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementUnitWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementMediumWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeLevelValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)readAttributeEventListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeEventListWithParams:(MTRSubscribeParams *)params @@ -12573,23 +12573,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeEventListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params - subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -12604,7 +12604,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -12613,86 +12613,86 @@ MTR_PROVISIONALLY_AVAILABLE * * Attributes for reporting PM10 concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRBaseClusterPM10ConcentrationMeasurement : MTRGenericBaseCluster -- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMinMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMaxMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeUncertaintyWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementUnitWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementMediumWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeLevelValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)readAttributeEventListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeEventListWithParams:(MTRSubscribeParams *)params @@ -12700,23 +12700,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeEventListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -12731,7 +12731,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -12740,86 +12740,86 @@ MTR_PROVISIONALLY_AVAILABLE * * Attributes for reporting total volatile organic compounds concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRBaseClusterTotalVolatileOrganicCompoundsConcentrationMeasurement : MTRGenericBaseCluster -- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMinMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMaxMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeUncertaintyWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementUnitWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementMediumWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeLevelValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)readAttributeEventListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeEventListWithParams:(MTRSubscribeParams *)params @@ -12827,23 +12827,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeEventListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -12858,7 +12858,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -12867,86 +12867,86 @@ MTR_PROVISIONALLY_AVAILABLE * * Attributes for reporting radon concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRBaseClusterRadonConcentrationMeasurement : MTRGenericBaseCluster -- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMinMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMinMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMinMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMaxMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMaxMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMaxMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePeakMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributePeakMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributePeakMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAverageMeasuredValueWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAverageMeasuredValueWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAverageMeasuredValueWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeUncertaintyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeUncertaintyWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeUncertaintyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementUnitWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementUnitWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementUnitWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMeasurementMediumWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeMeasurementMediumWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeMeasurementMediumWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeLevelValueWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeLevelValueWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeLevelValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)readAttributeEventListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeEventListWithParams:(MTRSubscribeParams *)params @@ -12954,23 +12954,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeEventListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE; ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -12985,7 +12985,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -19144,344 +19144,344 @@ typedef NS_OPTIONS(uint8_t, MTROccupancySensingOccupancySensorTypeBitmap) { } MTR_AVAILABLE(ios(16.5), macos(13.4), watchos(9.5), tvos(16.5)); typedef NS_ENUM(uint8_t, MTRCarbonMonoxideConcentrationMeasurementLevelValue) { - MTRCarbonMonoxideConcentrationMeasurementLevelValueUnknown MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRCarbonMonoxideConcentrationMeasurementLevelValueLow MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRCarbonMonoxideConcentrationMeasurementLevelValueMedium MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRCarbonMonoxideConcentrationMeasurementLevelValueHigh MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRCarbonMonoxideConcentrationMeasurementLevelValueCritical MTR_PROVISIONALLY_AVAILABLE = 0x04, -} MTR_PROVISIONALLY_AVAILABLE; + MTRCarbonMonoxideConcentrationMeasurementLevelValueUnknown MTR_NEWLY_AVAILABLE = 0x00, + MTRCarbonMonoxideConcentrationMeasurementLevelValueLow MTR_NEWLY_AVAILABLE = 0x01, + MTRCarbonMonoxideConcentrationMeasurementLevelValueMedium MTR_NEWLY_AVAILABLE = 0x02, + MTRCarbonMonoxideConcentrationMeasurementLevelValueHigh MTR_NEWLY_AVAILABLE = 0x03, + MTRCarbonMonoxideConcentrationMeasurementLevelValueCritical MTR_NEWLY_AVAILABLE = 0x04, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRCarbonMonoxideConcentrationMeasurementMeasurementMedium) { - MTRCarbonMonoxideConcentrationMeasurementMeasurementMediumAir MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRCarbonMonoxideConcentrationMeasurementMeasurementMediumWater MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRCarbonMonoxideConcentrationMeasurementMeasurementMediumSoil MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRCarbonMonoxideConcentrationMeasurementMeasurementMediumAir MTR_NEWLY_AVAILABLE = 0x00, + MTRCarbonMonoxideConcentrationMeasurementMeasurementMediumWater MTR_NEWLY_AVAILABLE = 0x01, + MTRCarbonMonoxideConcentrationMeasurementMeasurementMediumSoil MTR_NEWLY_AVAILABLE = 0x02, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRCarbonMonoxideConcentrationMeasurementMeasurementUnit) { - MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitPPM MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitPPB MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitPPT MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitMGM3 MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitUGM3 MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitNGM3 MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitPM3 MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitBQM3 MTR_PROVISIONALLY_AVAILABLE = 0x07, -} MTR_PROVISIONALLY_AVAILABLE; + MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitPPM MTR_NEWLY_AVAILABLE = 0x00, + MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitPPB MTR_NEWLY_AVAILABLE = 0x01, + MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitPPT MTR_NEWLY_AVAILABLE = 0x02, + MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitMGM3 MTR_NEWLY_AVAILABLE = 0x03, + MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitUGM3 MTR_NEWLY_AVAILABLE = 0x04, + MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitNGM3 MTR_NEWLY_AVAILABLE = 0x05, + MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitPM3 MTR_NEWLY_AVAILABLE = 0x06, + MTRCarbonMonoxideConcentrationMeasurementMeasurementUnitBQM3 MTR_NEWLY_AVAILABLE = 0x07, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRCarbonMonoxideConcentrationMeasurementFeature) { - MTRCarbonMonoxideConcentrationMeasurementFeatureNumericMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRCarbonMonoxideConcentrationMeasurementFeatureLevelIndication MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRCarbonMonoxideConcentrationMeasurementFeatureMediumLevel MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRCarbonMonoxideConcentrationMeasurementFeatureCriticalLevel MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRCarbonMonoxideConcentrationMeasurementFeaturePeakMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTRCarbonMonoxideConcentrationMeasurementFeatureAverageMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x20, -} MTR_PROVISIONALLY_AVAILABLE; + MTRCarbonMonoxideConcentrationMeasurementFeatureNumericMeasurement MTR_NEWLY_AVAILABLE = 0x1, + MTRCarbonMonoxideConcentrationMeasurementFeatureLevelIndication MTR_NEWLY_AVAILABLE = 0x2, + MTRCarbonMonoxideConcentrationMeasurementFeatureMediumLevel MTR_NEWLY_AVAILABLE = 0x4, + MTRCarbonMonoxideConcentrationMeasurementFeatureCriticalLevel MTR_NEWLY_AVAILABLE = 0x8, + MTRCarbonMonoxideConcentrationMeasurementFeaturePeakMeasurement MTR_NEWLY_AVAILABLE = 0x10, + MTRCarbonMonoxideConcentrationMeasurementFeatureAverageMeasurement MTR_NEWLY_AVAILABLE = 0x20, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRCarbonDioxideConcentrationMeasurementLevelValue) { - MTRCarbonDioxideConcentrationMeasurementLevelValueUnknown MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRCarbonDioxideConcentrationMeasurementLevelValueLow MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRCarbonDioxideConcentrationMeasurementLevelValueMedium MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRCarbonDioxideConcentrationMeasurementLevelValueHigh MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRCarbonDioxideConcentrationMeasurementLevelValueCritical MTR_PROVISIONALLY_AVAILABLE = 0x04, -} MTR_PROVISIONALLY_AVAILABLE; + MTRCarbonDioxideConcentrationMeasurementLevelValueUnknown MTR_NEWLY_AVAILABLE = 0x00, + MTRCarbonDioxideConcentrationMeasurementLevelValueLow MTR_NEWLY_AVAILABLE = 0x01, + MTRCarbonDioxideConcentrationMeasurementLevelValueMedium MTR_NEWLY_AVAILABLE = 0x02, + MTRCarbonDioxideConcentrationMeasurementLevelValueHigh MTR_NEWLY_AVAILABLE = 0x03, + MTRCarbonDioxideConcentrationMeasurementLevelValueCritical MTR_NEWLY_AVAILABLE = 0x04, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRCarbonDioxideConcentrationMeasurementMeasurementMedium) { - MTRCarbonDioxideConcentrationMeasurementMeasurementMediumAir MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRCarbonDioxideConcentrationMeasurementMeasurementMediumWater MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRCarbonDioxideConcentrationMeasurementMeasurementMediumSoil MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRCarbonDioxideConcentrationMeasurementMeasurementMediumAir MTR_NEWLY_AVAILABLE = 0x00, + MTRCarbonDioxideConcentrationMeasurementMeasurementMediumWater MTR_NEWLY_AVAILABLE = 0x01, + MTRCarbonDioxideConcentrationMeasurementMeasurementMediumSoil MTR_NEWLY_AVAILABLE = 0x02, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRCarbonDioxideConcentrationMeasurementMeasurementUnit) { - MTRCarbonDioxideConcentrationMeasurementMeasurementUnitPPM MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRCarbonDioxideConcentrationMeasurementMeasurementUnitPPB MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRCarbonDioxideConcentrationMeasurementMeasurementUnitPPT MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRCarbonDioxideConcentrationMeasurementMeasurementUnitMGM3 MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRCarbonDioxideConcentrationMeasurementMeasurementUnitUGM3 MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRCarbonDioxideConcentrationMeasurementMeasurementUnitNGM3 MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRCarbonDioxideConcentrationMeasurementMeasurementUnitPM3 MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTRCarbonDioxideConcentrationMeasurementMeasurementUnitBQM3 MTR_PROVISIONALLY_AVAILABLE = 0x07, -} MTR_PROVISIONALLY_AVAILABLE; + MTRCarbonDioxideConcentrationMeasurementMeasurementUnitPPM MTR_NEWLY_AVAILABLE = 0x00, + MTRCarbonDioxideConcentrationMeasurementMeasurementUnitPPB MTR_NEWLY_AVAILABLE = 0x01, + MTRCarbonDioxideConcentrationMeasurementMeasurementUnitPPT MTR_NEWLY_AVAILABLE = 0x02, + MTRCarbonDioxideConcentrationMeasurementMeasurementUnitMGM3 MTR_NEWLY_AVAILABLE = 0x03, + MTRCarbonDioxideConcentrationMeasurementMeasurementUnitUGM3 MTR_NEWLY_AVAILABLE = 0x04, + MTRCarbonDioxideConcentrationMeasurementMeasurementUnitNGM3 MTR_NEWLY_AVAILABLE = 0x05, + MTRCarbonDioxideConcentrationMeasurementMeasurementUnitPM3 MTR_NEWLY_AVAILABLE = 0x06, + MTRCarbonDioxideConcentrationMeasurementMeasurementUnitBQM3 MTR_NEWLY_AVAILABLE = 0x07, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRCarbonDioxideConcentrationMeasurementFeature) { - MTRCarbonDioxideConcentrationMeasurementFeatureNumericMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRCarbonDioxideConcentrationMeasurementFeatureLevelIndication MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRCarbonDioxideConcentrationMeasurementFeatureMediumLevel MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRCarbonDioxideConcentrationMeasurementFeatureCriticalLevel MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRCarbonDioxideConcentrationMeasurementFeaturePeakMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTRCarbonDioxideConcentrationMeasurementFeatureAverageMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x20, -} MTR_PROVISIONALLY_AVAILABLE; + MTRCarbonDioxideConcentrationMeasurementFeatureNumericMeasurement MTR_NEWLY_AVAILABLE = 0x1, + MTRCarbonDioxideConcentrationMeasurementFeatureLevelIndication MTR_NEWLY_AVAILABLE = 0x2, + MTRCarbonDioxideConcentrationMeasurementFeatureMediumLevel MTR_NEWLY_AVAILABLE = 0x4, + MTRCarbonDioxideConcentrationMeasurementFeatureCriticalLevel MTR_NEWLY_AVAILABLE = 0x8, + MTRCarbonDioxideConcentrationMeasurementFeaturePeakMeasurement MTR_NEWLY_AVAILABLE = 0x10, + MTRCarbonDioxideConcentrationMeasurementFeatureAverageMeasurement MTR_NEWLY_AVAILABLE = 0x20, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRNitrogenDioxideConcentrationMeasurementLevelValue) { - MTRNitrogenDioxideConcentrationMeasurementLevelValueUnknown MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRNitrogenDioxideConcentrationMeasurementLevelValueLow MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRNitrogenDioxideConcentrationMeasurementLevelValueMedium MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRNitrogenDioxideConcentrationMeasurementLevelValueHigh MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRNitrogenDioxideConcentrationMeasurementLevelValueCritical MTR_PROVISIONALLY_AVAILABLE = 0x04, -} MTR_PROVISIONALLY_AVAILABLE; + MTRNitrogenDioxideConcentrationMeasurementLevelValueUnknown MTR_NEWLY_AVAILABLE = 0x00, + MTRNitrogenDioxideConcentrationMeasurementLevelValueLow MTR_NEWLY_AVAILABLE = 0x01, + MTRNitrogenDioxideConcentrationMeasurementLevelValueMedium MTR_NEWLY_AVAILABLE = 0x02, + MTRNitrogenDioxideConcentrationMeasurementLevelValueHigh MTR_NEWLY_AVAILABLE = 0x03, + MTRNitrogenDioxideConcentrationMeasurementLevelValueCritical MTR_NEWLY_AVAILABLE = 0x04, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRNitrogenDioxideConcentrationMeasurementMeasurementMedium) { - MTRNitrogenDioxideConcentrationMeasurementMeasurementMediumAir MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRNitrogenDioxideConcentrationMeasurementMeasurementMediumWater MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRNitrogenDioxideConcentrationMeasurementMeasurementMediumSoil MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRNitrogenDioxideConcentrationMeasurementMeasurementMediumAir MTR_NEWLY_AVAILABLE = 0x00, + MTRNitrogenDioxideConcentrationMeasurementMeasurementMediumWater MTR_NEWLY_AVAILABLE = 0x01, + MTRNitrogenDioxideConcentrationMeasurementMeasurementMediumSoil MTR_NEWLY_AVAILABLE = 0x02, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRNitrogenDioxideConcentrationMeasurementMeasurementUnit) { - MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitPPM MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitPPB MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitPPT MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitMGM3 MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitUGM3 MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitNGM3 MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitPM3 MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitBQM3 MTR_PROVISIONALLY_AVAILABLE = 0x07, -} MTR_PROVISIONALLY_AVAILABLE; + MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitPPM MTR_NEWLY_AVAILABLE = 0x00, + MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitPPB MTR_NEWLY_AVAILABLE = 0x01, + MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitPPT MTR_NEWLY_AVAILABLE = 0x02, + MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitMGM3 MTR_NEWLY_AVAILABLE = 0x03, + MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitUGM3 MTR_NEWLY_AVAILABLE = 0x04, + MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitNGM3 MTR_NEWLY_AVAILABLE = 0x05, + MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitPM3 MTR_NEWLY_AVAILABLE = 0x06, + MTRNitrogenDioxideConcentrationMeasurementMeasurementUnitBQM3 MTR_NEWLY_AVAILABLE = 0x07, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRNitrogenDioxideConcentrationMeasurementFeature) { - MTRNitrogenDioxideConcentrationMeasurementFeatureNumericMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRNitrogenDioxideConcentrationMeasurementFeatureLevelIndication MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRNitrogenDioxideConcentrationMeasurementFeatureMediumLevel MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRNitrogenDioxideConcentrationMeasurementFeatureCriticalLevel MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRNitrogenDioxideConcentrationMeasurementFeaturePeakMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTRNitrogenDioxideConcentrationMeasurementFeatureAverageMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x20, -} MTR_PROVISIONALLY_AVAILABLE; + MTRNitrogenDioxideConcentrationMeasurementFeatureNumericMeasurement MTR_NEWLY_AVAILABLE = 0x1, + MTRNitrogenDioxideConcentrationMeasurementFeatureLevelIndication MTR_NEWLY_AVAILABLE = 0x2, + MTRNitrogenDioxideConcentrationMeasurementFeatureMediumLevel MTR_NEWLY_AVAILABLE = 0x4, + MTRNitrogenDioxideConcentrationMeasurementFeatureCriticalLevel MTR_NEWLY_AVAILABLE = 0x8, + MTRNitrogenDioxideConcentrationMeasurementFeaturePeakMeasurement MTR_NEWLY_AVAILABLE = 0x10, + MTRNitrogenDioxideConcentrationMeasurementFeatureAverageMeasurement MTR_NEWLY_AVAILABLE = 0x20, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTROzoneConcentrationMeasurementLevelValue) { - MTROzoneConcentrationMeasurementLevelValueUnknown MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTROzoneConcentrationMeasurementLevelValueLow MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTROzoneConcentrationMeasurementLevelValueMedium MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTROzoneConcentrationMeasurementLevelValueHigh MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTROzoneConcentrationMeasurementLevelValueCritical MTR_PROVISIONALLY_AVAILABLE = 0x04, -} MTR_PROVISIONALLY_AVAILABLE; + MTROzoneConcentrationMeasurementLevelValueUnknown MTR_NEWLY_AVAILABLE = 0x00, + MTROzoneConcentrationMeasurementLevelValueLow MTR_NEWLY_AVAILABLE = 0x01, + MTROzoneConcentrationMeasurementLevelValueMedium MTR_NEWLY_AVAILABLE = 0x02, + MTROzoneConcentrationMeasurementLevelValueHigh MTR_NEWLY_AVAILABLE = 0x03, + MTROzoneConcentrationMeasurementLevelValueCritical MTR_NEWLY_AVAILABLE = 0x04, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTROzoneConcentrationMeasurementMeasurementMedium) { - MTROzoneConcentrationMeasurementMeasurementMediumAir MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTROzoneConcentrationMeasurementMeasurementMediumWater MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTROzoneConcentrationMeasurementMeasurementMediumSoil MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTROzoneConcentrationMeasurementMeasurementMediumAir MTR_NEWLY_AVAILABLE = 0x00, + MTROzoneConcentrationMeasurementMeasurementMediumWater MTR_NEWLY_AVAILABLE = 0x01, + MTROzoneConcentrationMeasurementMeasurementMediumSoil MTR_NEWLY_AVAILABLE = 0x02, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTROzoneConcentrationMeasurementMeasurementUnit) { - MTROzoneConcentrationMeasurementMeasurementUnitPPM MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTROzoneConcentrationMeasurementMeasurementUnitPPB MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTROzoneConcentrationMeasurementMeasurementUnitPPT MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTROzoneConcentrationMeasurementMeasurementUnitMGM3 MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTROzoneConcentrationMeasurementMeasurementUnitUGM3 MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTROzoneConcentrationMeasurementMeasurementUnitNGM3 MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTROzoneConcentrationMeasurementMeasurementUnitPM3 MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTROzoneConcentrationMeasurementMeasurementUnitBQM3 MTR_PROVISIONALLY_AVAILABLE = 0x07, -} MTR_PROVISIONALLY_AVAILABLE; + MTROzoneConcentrationMeasurementMeasurementUnitPPM MTR_NEWLY_AVAILABLE = 0x00, + MTROzoneConcentrationMeasurementMeasurementUnitPPB MTR_NEWLY_AVAILABLE = 0x01, + MTROzoneConcentrationMeasurementMeasurementUnitPPT MTR_NEWLY_AVAILABLE = 0x02, + MTROzoneConcentrationMeasurementMeasurementUnitMGM3 MTR_NEWLY_AVAILABLE = 0x03, + MTROzoneConcentrationMeasurementMeasurementUnitUGM3 MTR_NEWLY_AVAILABLE = 0x04, + MTROzoneConcentrationMeasurementMeasurementUnitNGM3 MTR_NEWLY_AVAILABLE = 0x05, + MTROzoneConcentrationMeasurementMeasurementUnitPM3 MTR_NEWLY_AVAILABLE = 0x06, + MTROzoneConcentrationMeasurementMeasurementUnitBQM3 MTR_NEWLY_AVAILABLE = 0x07, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTROzoneConcentrationMeasurementFeature) { - MTROzoneConcentrationMeasurementFeatureNumericMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTROzoneConcentrationMeasurementFeatureLevelIndication MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTROzoneConcentrationMeasurementFeatureMediumLevel MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTROzoneConcentrationMeasurementFeatureCriticalLevel MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTROzoneConcentrationMeasurementFeaturePeakMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTROzoneConcentrationMeasurementFeatureAverageMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x20, -} MTR_PROVISIONALLY_AVAILABLE; + MTROzoneConcentrationMeasurementFeatureNumericMeasurement MTR_NEWLY_AVAILABLE = 0x1, + MTROzoneConcentrationMeasurementFeatureLevelIndication MTR_NEWLY_AVAILABLE = 0x2, + MTROzoneConcentrationMeasurementFeatureMediumLevel MTR_NEWLY_AVAILABLE = 0x4, + MTROzoneConcentrationMeasurementFeatureCriticalLevel MTR_NEWLY_AVAILABLE = 0x8, + MTROzoneConcentrationMeasurementFeaturePeakMeasurement MTR_NEWLY_AVAILABLE = 0x10, + MTROzoneConcentrationMeasurementFeatureAverageMeasurement MTR_NEWLY_AVAILABLE = 0x20, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRPM25ConcentrationMeasurementLevelValue) { - MTRPM25ConcentrationMeasurementLevelValueUnknown MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRPM25ConcentrationMeasurementLevelValueLow MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRPM25ConcentrationMeasurementLevelValueMedium MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRPM25ConcentrationMeasurementLevelValueHigh MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRPM25ConcentrationMeasurementLevelValueCritical MTR_PROVISIONALLY_AVAILABLE = 0x04, -} MTR_PROVISIONALLY_AVAILABLE; + MTRPM25ConcentrationMeasurementLevelValueUnknown MTR_NEWLY_AVAILABLE = 0x00, + MTRPM25ConcentrationMeasurementLevelValueLow MTR_NEWLY_AVAILABLE = 0x01, + MTRPM25ConcentrationMeasurementLevelValueMedium MTR_NEWLY_AVAILABLE = 0x02, + MTRPM25ConcentrationMeasurementLevelValueHigh MTR_NEWLY_AVAILABLE = 0x03, + MTRPM25ConcentrationMeasurementLevelValueCritical MTR_NEWLY_AVAILABLE = 0x04, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRPM25ConcentrationMeasurementMeasurementMedium) { - MTRPM25ConcentrationMeasurementMeasurementMediumAir MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRPM25ConcentrationMeasurementMeasurementMediumWater MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRPM25ConcentrationMeasurementMeasurementMediumSoil MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRPM25ConcentrationMeasurementMeasurementMediumAir MTR_NEWLY_AVAILABLE = 0x00, + MTRPM25ConcentrationMeasurementMeasurementMediumWater MTR_NEWLY_AVAILABLE = 0x01, + MTRPM25ConcentrationMeasurementMeasurementMediumSoil MTR_NEWLY_AVAILABLE = 0x02, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRPM25ConcentrationMeasurementMeasurementUnit) { - MTRPM25ConcentrationMeasurementMeasurementUnitPPM MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRPM25ConcentrationMeasurementMeasurementUnitPPB MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRPM25ConcentrationMeasurementMeasurementUnitPPT MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRPM25ConcentrationMeasurementMeasurementUnitMGM3 MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRPM25ConcentrationMeasurementMeasurementUnitUGM3 MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRPM25ConcentrationMeasurementMeasurementUnitNGM3 MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRPM25ConcentrationMeasurementMeasurementUnitPM3 MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTRPM25ConcentrationMeasurementMeasurementUnitBQM3 MTR_PROVISIONALLY_AVAILABLE = 0x07, -} MTR_PROVISIONALLY_AVAILABLE; + MTRPM25ConcentrationMeasurementMeasurementUnitPPM MTR_NEWLY_AVAILABLE = 0x00, + MTRPM25ConcentrationMeasurementMeasurementUnitPPB MTR_NEWLY_AVAILABLE = 0x01, + MTRPM25ConcentrationMeasurementMeasurementUnitPPT MTR_NEWLY_AVAILABLE = 0x02, + MTRPM25ConcentrationMeasurementMeasurementUnitMGM3 MTR_NEWLY_AVAILABLE = 0x03, + MTRPM25ConcentrationMeasurementMeasurementUnitUGM3 MTR_NEWLY_AVAILABLE = 0x04, + MTRPM25ConcentrationMeasurementMeasurementUnitNGM3 MTR_NEWLY_AVAILABLE = 0x05, + MTRPM25ConcentrationMeasurementMeasurementUnitPM3 MTR_NEWLY_AVAILABLE = 0x06, + MTRPM25ConcentrationMeasurementMeasurementUnitBQM3 MTR_NEWLY_AVAILABLE = 0x07, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRPM25ConcentrationMeasurementFeature) { - MTRPM25ConcentrationMeasurementFeatureNumericMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRPM25ConcentrationMeasurementFeatureLevelIndication MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRPM25ConcentrationMeasurementFeatureMediumLevel MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRPM25ConcentrationMeasurementFeatureCriticalLevel MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRPM25ConcentrationMeasurementFeaturePeakMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTRPM25ConcentrationMeasurementFeatureAverageMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x20, -} MTR_PROVISIONALLY_AVAILABLE; + MTRPM25ConcentrationMeasurementFeatureNumericMeasurement MTR_NEWLY_AVAILABLE = 0x1, + MTRPM25ConcentrationMeasurementFeatureLevelIndication MTR_NEWLY_AVAILABLE = 0x2, + MTRPM25ConcentrationMeasurementFeatureMediumLevel MTR_NEWLY_AVAILABLE = 0x4, + MTRPM25ConcentrationMeasurementFeatureCriticalLevel MTR_NEWLY_AVAILABLE = 0x8, + MTRPM25ConcentrationMeasurementFeaturePeakMeasurement MTR_NEWLY_AVAILABLE = 0x10, + MTRPM25ConcentrationMeasurementFeatureAverageMeasurement MTR_NEWLY_AVAILABLE = 0x20, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRFormaldehydeConcentrationMeasurementLevelValue) { - MTRFormaldehydeConcentrationMeasurementLevelValueUnknown MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRFormaldehydeConcentrationMeasurementLevelValueLow MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRFormaldehydeConcentrationMeasurementLevelValueMedium MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRFormaldehydeConcentrationMeasurementLevelValueHigh MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRFormaldehydeConcentrationMeasurementLevelValueCritical MTR_PROVISIONALLY_AVAILABLE = 0x04, -} MTR_PROVISIONALLY_AVAILABLE; + MTRFormaldehydeConcentrationMeasurementLevelValueUnknown MTR_NEWLY_AVAILABLE = 0x00, + MTRFormaldehydeConcentrationMeasurementLevelValueLow MTR_NEWLY_AVAILABLE = 0x01, + MTRFormaldehydeConcentrationMeasurementLevelValueMedium MTR_NEWLY_AVAILABLE = 0x02, + MTRFormaldehydeConcentrationMeasurementLevelValueHigh MTR_NEWLY_AVAILABLE = 0x03, + MTRFormaldehydeConcentrationMeasurementLevelValueCritical MTR_NEWLY_AVAILABLE = 0x04, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRFormaldehydeConcentrationMeasurementMeasurementMedium) { - MTRFormaldehydeConcentrationMeasurementMeasurementMediumAir MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRFormaldehydeConcentrationMeasurementMeasurementMediumWater MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRFormaldehydeConcentrationMeasurementMeasurementMediumSoil MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRFormaldehydeConcentrationMeasurementMeasurementMediumAir MTR_NEWLY_AVAILABLE = 0x00, + MTRFormaldehydeConcentrationMeasurementMeasurementMediumWater MTR_NEWLY_AVAILABLE = 0x01, + MTRFormaldehydeConcentrationMeasurementMeasurementMediumSoil MTR_NEWLY_AVAILABLE = 0x02, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRFormaldehydeConcentrationMeasurementMeasurementUnit) { - MTRFormaldehydeConcentrationMeasurementMeasurementUnitPPM MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRFormaldehydeConcentrationMeasurementMeasurementUnitPPB MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRFormaldehydeConcentrationMeasurementMeasurementUnitPPT MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRFormaldehydeConcentrationMeasurementMeasurementUnitMGM3 MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRFormaldehydeConcentrationMeasurementMeasurementUnitUGM3 MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRFormaldehydeConcentrationMeasurementMeasurementUnitNGM3 MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRFormaldehydeConcentrationMeasurementMeasurementUnitPM3 MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTRFormaldehydeConcentrationMeasurementMeasurementUnitBQM3 MTR_PROVISIONALLY_AVAILABLE = 0x07, -} MTR_PROVISIONALLY_AVAILABLE; + MTRFormaldehydeConcentrationMeasurementMeasurementUnitPPM MTR_NEWLY_AVAILABLE = 0x00, + MTRFormaldehydeConcentrationMeasurementMeasurementUnitPPB MTR_NEWLY_AVAILABLE = 0x01, + MTRFormaldehydeConcentrationMeasurementMeasurementUnitPPT MTR_NEWLY_AVAILABLE = 0x02, + MTRFormaldehydeConcentrationMeasurementMeasurementUnitMGM3 MTR_NEWLY_AVAILABLE = 0x03, + MTRFormaldehydeConcentrationMeasurementMeasurementUnitUGM3 MTR_NEWLY_AVAILABLE = 0x04, + MTRFormaldehydeConcentrationMeasurementMeasurementUnitNGM3 MTR_NEWLY_AVAILABLE = 0x05, + MTRFormaldehydeConcentrationMeasurementMeasurementUnitPM3 MTR_NEWLY_AVAILABLE = 0x06, + MTRFormaldehydeConcentrationMeasurementMeasurementUnitBQM3 MTR_NEWLY_AVAILABLE = 0x07, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRFormaldehydeConcentrationMeasurementFeature) { - MTRFormaldehydeConcentrationMeasurementFeatureNumericMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRFormaldehydeConcentrationMeasurementFeatureLevelIndication MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRFormaldehydeConcentrationMeasurementFeatureMediumLevel MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRFormaldehydeConcentrationMeasurementFeatureCriticalLevel MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRFormaldehydeConcentrationMeasurementFeaturePeakMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTRFormaldehydeConcentrationMeasurementFeatureAverageMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x20, -} MTR_PROVISIONALLY_AVAILABLE; + MTRFormaldehydeConcentrationMeasurementFeatureNumericMeasurement MTR_NEWLY_AVAILABLE = 0x1, + MTRFormaldehydeConcentrationMeasurementFeatureLevelIndication MTR_NEWLY_AVAILABLE = 0x2, + MTRFormaldehydeConcentrationMeasurementFeatureMediumLevel MTR_NEWLY_AVAILABLE = 0x4, + MTRFormaldehydeConcentrationMeasurementFeatureCriticalLevel MTR_NEWLY_AVAILABLE = 0x8, + MTRFormaldehydeConcentrationMeasurementFeaturePeakMeasurement MTR_NEWLY_AVAILABLE = 0x10, + MTRFormaldehydeConcentrationMeasurementFeatureAverageMeasurement MTR_NEWLY_AVAILABLE = 0x20, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRPM1ConcentrationMeasurementLevelValue) { - MTRPM1ConcentrationMeasurementLevelValueUnknown MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRPM1ConcentrationMeasurementLevelValueLow MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRPM1ConcentrationMeasurementLevelValueMedium MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRPM1ConcentrationMeasurementLevelValueHigh MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRPM1ConcentrationMeasurementLevelValueCritical MTR_PROVISIONALLY_AVAILABLE = 0x04, -} MTR_PROVISIONALLY_AVAILABLE; + MTRPM1ConcentrationMeasurementLevelValueUnknown MTR_NEWLY_AVAILABLE = 0x00, + MTRPM1ConcentrationMeasurementLevelValueLow MTR_NEWLY_AVAILABLE = 0x01, + MTRPM1ConcentrationMeasurementLevelValueMedium MTR_NEWLY_AVAILABLE = 0x02, + MTRPM1ConcentrationMeasurementLevelValueHigh MTR_NEWLY_AVAILABLE = 0x03, + MTRPM1ConcentrationMeasurementLevelValueCritical MTR_NEWLY_AVAILABLE = 0x04, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRPM1ConcentrationMeasurementMeasurementMedium) { - MTRPM1ConcentrationMeasurementMeasurementMediumAir MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRPM1ConcentrationMeasurementMeasurementMediumWater MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRPM1ConcentrationMeasurementMeasurementMediumSoil MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRPM1ConcentrationMeasurementMeasurementMediumAir MTR_NEWLY_AVAILABLE = 0x00, + MTRPM1ConcentrationMeasurementMeasurementMediumWater MTR_NEWLY_AVAILABLE = 0x01, + MTRPM1ConcentrationMeasurementMeasurementMediumSoil MTR_NEWLY_AVAILABLE = 0x02, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRPM1ConcentrationMeasurementMeasurementUnit) { - MTRPM1ConcentrationMeasurementMeasurementUnitPPM MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRPM1ConcentrationMeasurementMeasurementUnitPPB MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRPM1ConcentrationMeasurementMeasurementUnitPPT MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRPM1ConcentrationMeasurementMeasurementUnitMGM3 MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRPM1ConcentrationMeasurementMeasurementUnitUGM3 MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRPM1ConcentrationMeasurementMeasurementUnitNGM3 MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRPM1ConcentrationMeasurementMeasurementUnitPM3 MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTRPM1ConcentrationMeasurementMeasurementUnitBQM3 MTR_PROVISIONALLY_AVAILABLE = 0x07, -} MTR_PROVISIONALLY_AVAILABLE; + MTRPM1ConcentrationMeasurementMeasurementUnitPPM MTR_NEWLY_AVAILABLE = 0x00, + MTRPM1ConcentrationMeasurementMeasurementUnitPPB MTR_NEWLY_AVAILABLE = 0x01, + MTRPM1ConcentrationMeasurementMeasurementUnitPPT MTR_NEWLY_AVAILABLE = 0x02, + MTRPM1ConcentrationMeasurementMeasurementUnitMGM3 MTR_NEWLY_AVAILABLE = 0x03, + MTRPM1ConcentrationMeasurementMeasurementUnitUGM3 MTR_NEWLY_AVAILABLE = 0x04, + MTRPM1ConcentrationMeasurementMeasurementUnitNGM3 MTR_NEWLY_AVAILABLE = 0x05, + MTRPM1ConcentrationMeasurementMeasurementUnitPM3 MTR_NEWLY_AVAILABLE = 0x06, + MTRPM1ConcentrationMeasurementMeasurementUnitBQM3 MTR_NEWLY_AVAILABLE = 0x07, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRPM1ConcentrationMeasurementFeature) { - MTRPM1ConcentrationMeasurementFeatureNumericMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRPM1ConcentrationMeasurementFeatureLevelIndication MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRPM1ConcentrationMeasurementFeatureMediumLevel MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRPM1ConcentrationMeasurementFeatureCriticalLevel MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRPM1ConcentrationMeasurementFeaturePeakMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTRPM1ConcentrationMeasurementFeatureAverageMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x20, -} MTR_PROVISIONALLY_AVAILABLE; + MTRPM1ConcentrationMeasurementFeatureNumericMeasurement MTR_NEWLY_AVAILABLE = 0x1, + MTRPM1ConcentrationMeasurementFeatureLevelIndication MTR_NEWLY_AVAILABLE = 0x2, + MTRPM1ConcentrationMeasurementFeatureMediumLevel MTR_NEWLY_AVAILABLE = 0x4, + MTRPM1ConcentrationMeasurementFeatureCriticalLevel MTR_NEWLY_AVAILABLE = 0x8, + MTRPM1ConcentrationMeasurementFeaturePeakMeasurement MTR_NEWLY_AVAILABLE = 0x10, + MTRPM1ConcentrationMeasurementFeatureAverageMeasurement MTR_NEWLY_AVAILABLE = 0x20, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRPM10ConcentrationMeasurementLevelValue) { - MTRPM10ConcentrationMeasurementLevelValueUnknown MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRPM10ConcentrationMeasurementLevelValueLow MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRPM10ConcentrationMeasurementLevelValueMedium MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRPM10ConcentrationMeasurementLevelValueHigh MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRPM10ConcentrationMeasurementLevelValueCritical MTR_PROVISIONALLY_AVAILABLE = 0x04, -} MTR_PROVISIONALLY_AVAILABLE; + MTRPM10ConcentrationMeasurementLevelValueUnknown MTR_NEWLY_AVAILABLE = 0x00, + MTRPM10ConcentrationMeasurementLevelValueLow MTR_NEWLY_AVAILABLE = 0x01, + MTRPM10ConcentrationMeasurementLevelValueMedium MTR_NEWLY_AVAILABLE = 0x02, + MTRPM10ConcentrationMeasurementLevelValueHigh MTR_NEWLY_AVAILABLE = 0x03, + MTRPM10ConcentrationMeasurementLevelValueCritical MTR_NEWLY_AVAILABLE = 0x04, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRPM10ConcentrationMeasurementMeasurementMedium) { - MTRPM10ConcentrationMeasurementMeasurementMediumAir MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRPM10ConcentrationMeasurementMeasurementMediumWater MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRPM10ConcentrationMeasurementMeasurementMediumSoil MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRPM10ConcentrationMeasurementMeasurementMediumAir MTR_NEWLY_AVAILABLE = 0x00, + MTRPM10ConcentrationMeasurementMeasurementMediumWater MTR_NEWLY_AVAILABLE = 0x01, + MTRPM10ConcentrationMeasurementMeasurementMediumSoil MTR_NEWLY_AVAILABLE = 0x02, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRPM10ConcentrationMeasurementMeasurementUnit) { - MTRPM10ConcentrationMeasurementMeasurementUnitPPM MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRPM10ConcentrationMeasurementMeasurementUnitPPB MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRPM10ConcentrationMeasurementMeasurementUnitPPT MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRPM10ConcentrationMeasurementMeasurementUnitMGM3 MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRPM10ConcentrationMeasurementMeasurementUnitUGM3 MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRPM10ConcentrationMeasurementMeasurementUnitNGM3 MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRPM10ConcentrationMeasurementMeasurementUnitPM3 MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTRPM10ConcentrationMeasurementMeasurementUnitBQM3 MTR_PROVISIONALLY_AVAILABLE = 0x07, -} MTR_PROVISIONALLY_AVAILABLE; + MTRPM10ConcentrationMeasurementMeasurementUnitPPM MTR_NEWLY_AVAILABLE = 0x00, + MTRPM10ConcentrationMeasurementMeasurementUnitPPB MTR_NEWLY_AVAILABLE = 0x01, + MTRPM10ConcentrationMeasurementMeasurementUnitPPT MTR_NEWLY_AVAILABLE = 0x02, + MTRPM10ConcentrationMeasurementMeasurementUnitMGM3 MTR_NEWLY_AVAILABLE = 0x03, + MTRPM10ConcentrationMeasurementMeasurementUnitUGM3 MTR_NEWLY_AVAILABLE = 0x04, + MTRPM10ConcentrationMeasurementMeasurementUnitNGM3 MTR_NEWLY_AVAILABLE = 0x05, + MTRPM10ConcentrationMeasurementMeasurementUnitPM3 MTR_NEWLY_AVAILABLE = 0x06, + MTRPM10ConcentrationMeasurementMeasurementUnitBQM3 MTR_NEWLY_AVAILABLE = 0x07, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRPM10ConcentrationMeasurementFeature) { - MTRPM10ConcentrationMeasurementFeatureNumericMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRPM10ConcentrationMeasurementFeatureLevelIndication MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRPM10ConcentrationMeasurementFeatureMediumLevel MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRPM10ConcentrationMeasurementFeatureCriticalLevel MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRPM10ConcentrationMeasurementFeaturePeakMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTRPM10ConcentrationMeasurementFeatureAverageMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x20, -} MTR_PROVISIONALLY_AVAILABLE; + MTRPM10ConcentrationMeasurementFeatureNumericMeasurement MTR_NEWLY_AVAILABLE = 0x1, + MTRPM10ConcentrationMeasurementFeatureLevelIndication MTR_NEWLY_AVAILABLE = 0x2, + MTRPM10ConcentrationMeasurementFeatureMediumLevel MTR_NEWLY_AVAILABLE = 0x4, + MTRPM10ConcentrationMeasurementFeatureCriticalLevel MTR_NEWLY_AVAILABLE = 0x8, + MTRPM10ConcentrationMeasurementFeaturePeakMeasurement MTR_NEWLY_AVAILABLE = 0x10, + MTRPM10ConcentrationMeasurementFeatureAverageMeasurement MTR_NEWLY_AVAILABLE = 0x20, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRTotalVolatileOrganicCompoundsConcentrationMeasurementLevelValue) { - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementLevelValueUnknown MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementLevelValueLow MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementLevelValueMedium MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementLevelValueHigh MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementLevelValueCritical MTR_PROVISIONALLY_AVAILABLE = 0x04, -} MTR_PROVISIONALLY_AVAILABLE; + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementLevelValueUnknown MTR_NEWLY_AVAILABLE = 0x00, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementLevelValueLow MTR_NEWLY_AVAILABLE = 0x01, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementLevelValueMedium MTR_NEWLY_AVAILABLE = 0x02, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementLevelValueHigh MTR_NEWLY_AVAILABLE = 0x03, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementLevelValueCritical MTR_NEWLY_AVAILABLE = 0x04, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementMedium) { - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementMediumAir MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementMediumWater MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementMediumSoil MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementMediumAir MTR_NEWLY_AVAILABLE = 0x00, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementMediumWater MTR_NEWLY_AVAILABLE = 0x01, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementMediumSoil MTR_NEWLY_AVAILABLE = 0x02, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnit) { - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitPPM MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitPPB MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitPPT MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitMGM3 MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitUGM3 MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitNGM3 MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitPM3 MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitBQM3 MTR_PROVISIONALLY_AVAILABLE = 0x07, -} MTR_PROVISIONALLY_AVAILABLE; + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitPPM MTR_NEWLY_AVAILABLE = 0x00, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitPPB MTR_NEWLY_AVAILABLE = 0x01, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitPPT MTR_NEWLY_AVAILABLE = 0x02, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitMGM3 MTR_NEWLY_AVAILABLE = 0x03, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitUGM3 MTR_NEWLY_AVAILABLE = 0x04, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitNGM3 MTR_NEWLY_AVAILABLE = 0x05, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitPM3 MTR_NEWLY_AVAILABLE = 0x06, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnitBQM3 MTR_NEWLY_AVAILABLE = 0x07, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRTotalVolatileOrganicCompoundsConcentrationMeasurementFeature) { - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementFeatureNumericMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementFeatureLevelIndication MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementFeatureMediumLevel MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementFeatureCriticalLevel MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementFeaturePeakMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTRTotalVolatileOrganicCompoundsConcentrationMeasurementFeatureAverageMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x20, -} MTR_PROVISIONALLY_AVAILABLE; + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementFeatureNumericMeasurement MTR_NEWLY_AVAILABLE = 0x1, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementFeatureLevelIndication MTR_NEWLY_AVAILABLE = 0x2, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementFeatureMediumLevel MTR_NEWLY_AVAILABLE = 0x4, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementFeatureCriticalLevel MTR_NEWLY_AVAILABLE = 0x8, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementFeaturePeakMeasurement MTR_NEWLY_AVAILABLE = 0x10, + MTRTotalVolatileOrganicCompoundsConcentrationMeasurementFeatureAverageMeasurement MTR_NEWLY_AVAILABLE = 0x20, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRRadonConcentrationMeasurementLevelValue) { - MTRRadonConcentrationMeasurementLevelValueUnknown MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRRadonConcentrationMeasurementLevelValueLow MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRRadonConcentrationMeasurementLevelValueMedium MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRRadonConcentrationMeasurementLevelValueHigh MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRRadonConcentrationMeasurementLevelValueCritical MTR_PROVISIONALLY_AVAILABLE = 0x04, -} MTR_PROVISIONALLY_AVAILABLE; + MTRRadonConcentrationMeasurementLevelValueUnknown MTR_NEWLY_AVAILABLE = 0x00, + MTRRadonConcentrationMeasurementLevelValueLow MTR_NEWLY_AVAILABLE = 0x01, + MTRRadonConcentrationMeasurementLevelValueMedium MTR_NEWLY_AVAILABLE = 0x02, + MTRRadonConcentrationMeasurementLevelValueHigh MTR_NEWLY_AVAILABLE = 0x03, + MTRRadonConcentrationMeasurementLevelValueCritical MTR_NEWLY_AVAILABLE = 0x04, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRRadonConcentrationMeasurementMeasurementMedium) { - MTRRadonConcentrationMeasurementMeasurementMediumAir MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRRadonConcentrationMeasurementMeasurementMediumWater MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRRadonConcentrationMeasurementMeasurementMediumSoil MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRRadonConcentrationMeasurementMeasurementMediumAir MTR_NEWLY_AVAILABLE = 0x00, + MTRRadonConcentrationMeasurementMeasurementMediumWater MTR_NEWLY_AVAILABLE = 0x01, + MTRRadonConcentrationMeasurementMeasurementMediumSoil MTR_NEWLY_AVAILABLE = 0x02, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRRadonConcentrationMeasurementMeasurementUnit) { - MTRRadonConcentrationMeasurementMeasurementUnitPPM MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRRadonConcentrationMeasurementMeasurementUnitPPB MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRRadonConcentrationMeasurementMeasurementUnitPPT MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRRadonConcentrationMeasurementMeasurementUnitMGM3 MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRRadonConcentrationMeasurementMeasurementUnitUGM3 MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRRadonConcentrationMeasurementMeasurementUnitNGM3 MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRRadonConcentrationMeasurementMeasurementUnitPM3 MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTRRadonConcentrationMeasurementMeasurementUnitBQM3 MTR_PROVISIONALLY_AVAILABLE = 0x07, -} MTR_PROVISIONALLY_AVAILABLE; + MTRRadonConcentrationMeasurementMeasurementUnitPPM MTR_NEWLY_AVAILABLE = 0x00, + MTRRadonConcentrationMeasurementMeasurementUnitPPB MTR_NEWLY_AVAILABLE = 0x01, + MTRRadonConcentrationMeasurementMeasurementUnitPPT MTR_NEWLY_AVAILABLE = 0x02, + MTRRadonConcentrationMeasurementMeasurementUnitMGM3 MTR_NEWLY_AVAILABLE = 0x03, + MTRRadonConcentrationMeasurementMeasurementUnitUGM3 MTR_NEWLY_AVAILABLE = 0x04, + MTRRadonConcentrationMeasurementMeasurementUnitNGM3 MTR_NEWLY_AVAILABLE = 0x05, + MTRRadonConcentrationMeasurementMeasurementUnitPM3 MTR_NEWLY_AVAILABLE = 0x06, + MTRRadonConcentrationMeasurementMeasurementUnitBQM3 MTR_NEWLY_AVAILABLE = 0x07, +} MTR_NEWLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRRadonConcentrationMeasurementFeature) { - MTRRadonConcentrationMeasurementFeatureNumericMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRRadonConcentrationMeasurementFeatureLevelIndication MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRRadonConcentrationMeasurementFeatureMediumLevel MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRRadonConcentrationMeasurementFeatureCriticalLevel MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRRadonConcentrationMeasurementFeaturePeakMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTRRadonConcentrationMeasurementFeatureAverageMeasurement MTR_PROVISIONALLY_AVAILABLE = 0x20, -} MTR_PROVISIONALLY_AVAILABLE; + MTRRadonConcentrationMeasurementFeatureNumericMeasurement MTR_NEWLY_AVAILABLE = 0x1, + MTRRadonConcentrationMeasurementFeatureLevelIndication MTR_NEWLY_AVAILABLE = 0x2, + MTRRadonConcentrationMeasurementFeatureMediumLevel MTR_NEWLY_AVAILABLE = 0x4, + MTRRadonConcentrationMeasurementFeatureCriticalLevel MTR_NEWLY_AVAILABLE = 0x8, + MTRRadonConcentrationMeasurementFeaturePeakMeasurement MTR_NEWLY_AVAILABLE = 0x10, + MTRRadonConcentrationMeasurementFeatureAverageMeasurement MTR_NEWLY_AVAILABLE = 0x20, +} MTR_NEWLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRChannelType) { MTRChannelTypeSatellite MTR_PROVISIONALLY_AVAILABLE = 0x00, diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h index adc2e93b212f90..566550b98af6b5 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h @@ -174,16 +174,16 @@ typedef NS_ENUM(uint32_t, MTRClusterIDType) { MTRClusterIDTypeFlowMeasurementID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000404, MTRClusterIDTypeRelativeHumidityMeasurementID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000405, MTRClusterIDTypeOccupancySensingID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000406, - MTRClusterIDTypeCarbonMonoxideConcentrationMeasurementID MTR_PROVISIONALLY_AVAILABLE = 0x0000040C, - MTRClusterIDTypeCarbonDioxideConcentrationMeasurementID MTR_PROVISIONALLY_AVAILABLE = 0x0000040D, - MTRClusterIDTypeNitrogenDioxideConcentrationMeasurementID MTR_PROVISIONALLY_AVAILABLE = 0x00000413, - MTRClusterIDTypeOzoneConcentrationMeasurementID MTR_PROVISIONALLY_AVAILABLE = 0x00000415, - MTRClusterIDTypePM25ConcentrationMeasurementID MTR_PROVISIONALLY_AVAILABLE = 0x0000042A, - MTRClusterIDTypeFormaldehydeConcentrationMeasurementID MTR_PROVISIONALLY_AVAILABLE = 0x0000042B, - MTRClusterIDTypePM1ConcentrationMeasurementID MTR_PROVISIONALLY_AVAILABLE = 0x0000042C, - MTRClusterIDTypePM10ConcentrationMeasurementID MTR_PROVISIONALLY_AVAILABLE = 0x0000042D, - MTRClusterIDTypeTotalVolatileOrganicCompoundsConcentrationMeasurementID MTR_PROVISIONALLY_AVAILABLE = 0x0000042E, - MTRClusterIDTypeRadonConcentrationMeasurementID MTR_PROVISIONALLY_AVAILABLE = 0x0000042F, + MTRClusterIDTypeCarbonMonoxideConcentrationMeasurementID MTR_NEWLY_AVAILABLE = 0x0000040C, + MTRClusterIDTypeCarbonDioxideConcentrationMeasurementID MTR_NEWLY_AVAILABLE = 0x0000040D, + MTRClusterIDTypeNitrogenDioxideConcentrationMeasurementID MTR_NEWLY_AVAILABLE = 0x00000413, + MTRClusterIDTypeOzoneConcentrationMeasurementID MTR_NEWLY_AVAILABLE = 0x00000415, + MTRClusterIDTypePM25ConcentrationMeasurementID MTR_NEWLY_AVAILABLE = 0x0000042A, + MTRClusterIDTypeFormaldehydeConcentrationMeasurementID MTR_NEWLY_AVAILABLE = 0x0000042B, + MTRClusterIDTypePM1ConcentrationMeasurementID MTR_NEWLY_AVAILABLE = 0x0000042C, + MTRClusterIDTypePM10ConcentrationMeasurementID MTR_NEWLY_AVAILABLE = 0x0000042D, + MTRClusterIDTypeTotalVolatileOrganicCompoundsConcentrationMeasurementID MTR_NEWLY_AVAILABLE = 0x0000042E, + MTRClusterIDTypeRadonConcentrationMeasurementID MTR_NEWLY_AVAILABLE = 0x0000042F, MTRClusterIDTypeWakeOnLANID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000503, MTRClusterIDTypeChannelID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000504, MTRClusterIDTypeTargetNavigatorID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000505, @@ -4172,194 +4172,194 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterOccupancySensingAttributeClusterRevisionID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster CarbonMonoxideConcentrationMeasurement attributes - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeMinMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeMaxMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributePeakMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeAverageMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeUncertaintyID MTR_PROVISIONALLY_AVAILABLE = 0x00000007, - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeMeasurementUnitID MTR_PROVISIONALLY_AVAILABLE = 0x00000008, - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeMeasurementMediumID MTR_PROVISIONALLY_AVAILABLE = 0x00000009, - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeLevelValueID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000000, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeMinMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000001, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeMaxMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000002, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributePeakMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000003, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000004, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeAverageMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000005, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000006, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeUncertaintyID MTR_NEWLY_AVAILABLE = 0x00000007, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeMeasurementUnitID MTR_NEWLY_AVAILABLE = 0x00000008, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeMeasurementMediumID MTR_NEWLY_AVAILABLE = 0x00000009, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeLevelValueID MTR_NEWLY_AVAILABLE = 0x0000000A, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeEventListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeEventListID, - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeAttributeListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterCarbonMonoxideConcentrationMeasurementAttributeClusterRevisionID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster CarbonDioxideConcentrationMeasurement attributes - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeMinMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeMaxMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributePeakMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeAverageMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeUncertaintyID MTR_PROVISIONALLY_AVAILABLE = 0x00000007, - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeMeasurementUnitID MTR_PROVISIONALLY_AVAILABLE = 0x00000008, - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeMeasurementMediumID MTR_PROVISIONALLY_AVAILABLE = 0x00000009, - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeLevelValueID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000000, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeMinMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000001, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeMaxMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000002, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributePeakMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000003, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000004, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeAverageMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000005, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000006, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeUncertaintyID MTR_NEWLY_AVAILABLE = 0x00000007, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeMeasurementUnitID MTR_NEWLY_AVAILABLE = 0x00000008, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeMeasurementMediumID MTR_NEWLY_AVAILABLE = 0x00000009, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeLevelValueID MTR_NEWLY_AVAILABLE = 0x0000000A, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeEventListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeEventListID, - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeAttributeListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterCarbonDioxideConcentrationMeasurementAttributeClusterRevisionID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster NitrogenDioxideConcentrationMeasurement attributes - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeMinMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeMaxMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributePeakMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeAverageMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeUncertaintyID MTR_PROVISIONALLY_AVAILABLE = 0x00000007, - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeMeasurementUnitID MTR_PROVISIONALLY_AVAILABLE = 0x00000008, - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeMeasurementMediumID MTR_PROVISIONALLY_AVAILABLE = 0x00000009, - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeLevelValueID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000000, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeMinMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000001, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeMaxMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000002, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributePeakMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000003, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000004, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeAverageMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000005, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000006, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeUncertaintyID MTR_NEWLY_AVAILABLE = 0x00000007, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeMeasurementUnitID MTR_NEWLY_AVAILABLE = 0x00000008, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeMeasurementMediumID MTR_NEWLY_AVAILABLE = 0x00000009, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeLevelValueID MTR_NEWLY_AVAILABLE = 0x0000000A, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeEventListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeEventListID, - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeAttributeListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterNitrogenDioxideConcentrationMeasurementAttributeClusterRevisionID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster OzoneConcentrationMeasurement attributes - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeMinMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeMaxMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributePeakMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeAverageMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeUncertaintyID MTR_PROVISIONALLY_AVAILABLE = 0x00000007, - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeMeasurementUnitID MTR_PROVISIONALLY_AVAILABLE = 0x00000008, - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeMeasurementMediumID MTR_PROVISIONALLY_AVAILABLE = 0x00000009, - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeLevelValueID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000000, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeMinMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000001, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeMaxMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000002, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributePeakMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000003, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000004, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeAverageMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000005, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000006, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeUncertaintyID MTR_NEWLY_AVAILABLE = 0x00000007, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeMeasurementUnitID MTR_NEWLY_AVAILABLE = 0x00000008, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeMeasurementMediumID MTR_NEWLY_AVAILABLE = 0x00000009, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeLevelValueID MTR_NEWLY_AVAILABLE = 0x0000000A, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeEventListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeEventListID, - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeAttributeListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterOzoneConcentrationMeasurementAttributeClusterRevisionID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster PM25ConcentrationMeasurement attributes - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeMinMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeMaxMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributePeakMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeAverageMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeUncertaintyID MTR_PROVISIONALLY_AVAILABLE = 0x00000007, - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeMeasurementUnitID MTR_PROVISIONALLY_AVAILABLE = 0x00000008, - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeMeasurementMediumID MTR_PROVISIONALLY_AVAILABLE = 0x00000009, - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeLevelValueID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000000, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeMinMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000001, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeMaxMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000002, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributePeakMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000003, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000004, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeAverageMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000005, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000006, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeUncertaintyID MTR_NEWLY_AVAILABLE = 0x00000007, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeMeasurementUnitID MTR_NEWLY_AVAILABLE = 0x00000008, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeMeasurementMediumID MTR_NEWLY_AVAILABLE = 0x00000009, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeLevelValueID MTR_NEWLY_AVAILABLE = 0x0000000A, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeEventListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeEventListID, - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeAttributeListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterPM25ConcentrationMeasurementAttributeClusterRevisionID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster FormaldehydeConcentrationMeasurement attributes - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeMinMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeMaxMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributePeakMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeAverageMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeUncertaintyID MTR_PROVISIONALLY_AVAILABLE = 0x00000007, - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeMeasurementUnitID MTR_PROVISIONALLY_AVAILABLE = 0x00000008, - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeMeasurementMediumID MTR_PROVISIONALLY_AVAILABLE = 0x00000009, - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeLevelValueID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000000, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeMinMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000001, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeMaxMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000002, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributePeakMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000003, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000004, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeAverageMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000005, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000006, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeUncertaintyID MTR_NEWLY_AVAILABLE = 0x00000007, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeMeasurementUnitID MTR_NEWLY_AVAILABLE = 0x00000008, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeMeasurementMediumID MTR_NEWLY_AVAILABLE = 0x00000009, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeLevelValueID MTR_NEWLY_AVAILABLE = 0x0000000A, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeEventListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeEventListID, - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeAttributeListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterFormaldehydeConcentrationMeasurementAttributeClusterRevisionID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster PM1ConcentrationMeasurement attributes - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeMinMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeMaxMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributePeakMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeAverageMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeUncertaintyID MTR_PROVISIONALLY_AVAILABLE = 0x00000007, - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeMeasurementUnitID MTR_PROVISIONALLY_AVAILABLE = 0x00000008, - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeMeasurementMediumID MTR_PROVISIONALLY_AVAILABLE = 0x00000009, - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeLevelValueID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000000, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeMinMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000001, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeMaxMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000002, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributePeakMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000003, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000004, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeAverageMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000005, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000006, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeUncertaintyID MTR_NEWLY_AVAILABLE = 0x00000007, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeMeasurementUnitID MTR_NEWLY_AVAILABLE = 0x00000008, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeMeasurementMediumID MTR_NEWLY_AVAILABLE = 0x00000009, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeLevelValueID MTR_NEWLY_AVAILABLE = 0x0000000A, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeEventListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeEventListID, - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeAttributeListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterPM1ConcentrationMeasurementAttributeClusterRevisionID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster PM10ConcentrationMeasurement attributes - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeMinMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeMaxMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributePeakMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeAverageMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeUncertaintyID MTR_PROVISIONALLY_AVAILABLE = 0x00000007, - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeMeasurementUnitID MTR_PROVISIONALLY_AVAILABLE = 0x00000008, - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeMeasurementMediumID MTR_PROVISIONALLY_AVAILABLE = 0x00000009, - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeLevelValueID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000000, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeMinMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000001, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeMaxMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000002, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributePeakMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000003, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000004, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeAverageMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000005, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000006, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeUncertaintyID MTR_NEWLY_AVAILABLE = 0x00000007, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeMeasurementUnitID MTR_NEWLY_AVAILABLE = 0x00000008, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeMeasurementMediumID MTR_NEWLY_AVAILABLE = 0x00000009, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeLevelValueID MTR_NEWLY_AVAILABLE = 0x0000000A, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeEventListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeEventListID, - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeAttributeListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterPM10ConcentrationMeasurementAttributeClusterRevisionID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster TotalVolatileOrganicCompoundsConcentrationMeasurement attributes - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeMinMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeMaxMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributePeakMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeAverageMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeUncertaintyID MTR_PROVISIONALLY_AVAILABLE = 0x00000007, - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeMeasurementUnitID MTR_PROVISIONALLY_AVAILABLE = 0x00000008, - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeMeasurementMediumID MTR_PROVISIONALLY_AVAILABLE = 0x00000009, - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeLevelValueID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000000, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeMinMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000001, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeMaxMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000002, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributePeakMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000003, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000004, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeAverageMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000005, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000006, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeUncertaintyID MTR_NEWLY_AVAILABLE = 0x00000007, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeMeasurementUnitID MTR_NEWLY_AVAILABLE = 0x00000008, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeMeasurementMediumID MTR_NEWLY_AVAILABLE = 0x00000009, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeLevelValueID MTR_NEWLY_AVAILABLE = 0x0000000A, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeEventListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeEventListID, - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeAttributeListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeClusterRevisionID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster RadonConcentrationMeasurement attributes - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeMinMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeMaxMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributePeakMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeAverageMeasuredValueID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeUncertaintyID MTR_PROVISIONALLY_AVAILABLE = 0x00000007, - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeMeasurementUnitID MTR_PROVISIONALLY_AVAILABLE = 0x00000008, - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeMeasurementMediumID MTR_PROVISIONALLY_AVAILABLE = 0x00000009, - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeLevelValueID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000000, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeMinMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000001, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeMaxMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000002, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributePeakMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000003, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributePeakMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000004, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeAverageMeasuredValueID MTR_NEWLY_AVAILABLE = 0x00000005, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeAverageMeasuredValueWindowID MTR_NEWLY_AVAILABLE = 0x00000006, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeUncertaintyID MTR_NEWLY_AVAILABLE = 0x00000007, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeMeasurementUnitID MTR_NEWLY_AVAILABLE = 0x00000008, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeMeasurementMediumID MTR_NEWLY_AVAILABLE = 0x00000009, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeLevelValueID MTR_NEWLY_AVAILABLE = 0x0000000A, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeEventListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeEventListID, - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeAttributeListID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeClusterRevisionID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster WakeOnLan deprecated attribute names MTRClusterWakeOnLanAttributeMACAddressID diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h index 34567b17901868..d08b2fa36b5fb0 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h @@ -5417,42 +5417,42 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) * Cluster Carbon Monoxide Concentration Measurement * Attributes for reporting carbon monoxide concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRClusterCarbonMonoxideConcentrationMeasurement : MTRGenericCluster -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (NSDictionary<NSString *, id> * _Nullable)readAttributeEventListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -5467,7 +5467,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -5475,42 +5475,42 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Carbon Dioxide Concentration Measurement * Attributes for reporting carbon dioxide concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRClusterCarbonDioxideConcentrationMeasurement : MTRGenericCluster -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (NSDictionary<NSString *, id> * _Nullable)readAttributeEventListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -5525,7 +5525,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -5533,42 +5533,42 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Nitrogen Dioxide Concentration Measurement * Attributes for reporting nitrogen dioxide concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRClusterNitrogenDioxideConcentrationMeasurement : MTRGenericCluster -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (NSDictionary<NSString *, id> * _Nullable)readAttributeEventListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -5583,7 +5583,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -5591,42 +5591,42 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Ozone Concentration Measurement * Attributes for reporting ozone concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRClusterOzoneConcentrationMeasurement : MTRGenericCluster -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (NSDictionary<NSString *, id> * _Nullable)readAttributeEventListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -5641,7 +5641,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -5649,42 +5649,42 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster PM2.5 Concentration Measurement * Attributes for reporting PM2.5 concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRClusterPM25ConcentrationMeasurement : MTRGenericCluster -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (NSDictionary<NSString *, id> * _Nullable)readAttributeEventListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -5699,7 +5699,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -5707,42 +5707,42 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Formaldehyde Concentration Measurement * Attributes for reporting formaldehyde concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRClusterFormaldehydeConcentrationMeasurement : MTRGenericCluster -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (NSDictionary<NSString *, id> * _Nullable)readAttributeEventListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -5757,7 +5757,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -5765,42 +5765,42 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster PM1 Concentration Measurement * Attributes for reporting PM1 concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRClusterPM1ConcentrationMeasurement : MTRGenericCluster -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (NSDictionary<NSString *, id> * _Nullable)readAttributeEventListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -5815,7 +5815,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -5823,42 +5823,42 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster PM10 Concentration Measurement * Attributes for reporting PM10 concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRClusterPM10ConcentrationMeasurement : MTRGenericCluster -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (NSDictionary<NSString *, id> * _Nullable)readAttributeEventListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -5873,7 +5873,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -5881,42 +5881,42 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Total Volatile Organic Compounds Concentration Measurement * Attributes for reporting total volatile organic compounds concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRClusterTotalVolatileOrganicCompoundsConcentrationMeasurement : MTRGenericCluster -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (NSDictionary<NSString *, id> * _Nullable)readAttributeEventListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -5931,7 +5931,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end @@ -5939,42 +5939,42 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Radon Concentration Measurement * Attributes for reporting radon concentration measurements */ -MTR_PROVISIONALLY_AVAILABLE +MTR_NEWLY_AVAILABLE @interface MTRClusterRadonConcentrationMeasurement : MTRGenericCluster -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMinMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMaxMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributePeakMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAverageMeasuredValueWindowWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeUncertaintyWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementUnitWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeMeasurementMediumWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeLevelValueWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (NSDictionary<NSString *, id> * _Nullable)readAttributeEventListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; -- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary<NSString *, id> * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE; - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -5989,7 +5989,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_NEWLY_AVAILABLE; @end diff --git a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h index 2f9e82485cd77d..1015f52f3e9abd 100644 --- a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h +++ b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h @@ -129012,7 +129012,6 @@ class SubscribeAttributeOccupancySensingClusterRevision : public SubscribeAttrib } }; -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster CarbonMonoxideConcentrationMeasurement | 0x040C | |------------------------------------------------------------------------------| @@ -129040,8 +129039,6 @@ class SubscribeAttributeOccupancySensingClusterRevision : public SubscribeAttrib | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasuredValue */ @@ -129124,9 +129121,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementMeasuredValue : pu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MinMeasuredValue */ @@ -129209,9 +129203,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementMinMeasuredValue : } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MaxMeasuredValue */ @@ -129294,9 +129285,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementMaxMeasuredValue : } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValue */ @@ -129379,9 +129367,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementPeakMeasuredValue } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValueWindow */ @@ -129464,9 +129449,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementPeakMeasuredValueW } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValue */ @@ -129549,9 +129531,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementAverageMeasuredVal } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValueWindow */ @@ -129634,9 +129613,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementAverageMeasuredVal } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Uncertainty */ @@ -129719,9 +129695,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementUncertainty : publ } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementUnit */ @@ -129804,9 +129777,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementMeasurementUnit : } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementMedium */ @@ -129889,9 +129859,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementMeasurementMedium } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute LevelValue */ @@ -129974,9 +129941,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementLevelValue : publi } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -130059,9 +130023,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementGeneratedCommandLi } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -130144,7 +130105,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementAcceptedCommandLis } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -130230,7 +130190,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementEventList : public }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute AttributeList @@ -130314,9 +130273,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementAttributeList : pu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -130399,9 +130355,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementFeatureMap : publi } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -130484,9 +130437,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementClusterRevision : } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster CarbonDioxideConcentrationMeasurement | 0x040D | |------------------------------------------------------------------------------| @@ -130514,8 +130464,6 @@ class SubscribeAttributeCarbonMonoxideConcentrationMeasurementClusterRevision : | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasuredValue */ @@ -130598,9 +130546,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementMeasuredValue : pub } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MinMeasuredValue */ @@ -130683,9 +130628,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementMinMeasuredValue : } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MaxMeasuredValue */ @@ -130768,9 +130710,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementMaxMeasuredValue : } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValue */ @@ -130853,9 +130792,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementPeakMeasuredValue : } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValueWindow */ @@ -130938,9 +130874,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementPeakMeasuredValueWi } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValue */ @@ -131023,9 +130956,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementAverageMeasuredValu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValueWindow */ @@ -131108,9 +131038,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementAverageMeasuredValu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Uncertainty */ @@ -131193,9 +131120,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementUncertainty : publi } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementUnit */ @@ -131278,9 +131202,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementMeasurementUnit : p } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementMedium */ @@ -131363,9 +131284,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementMeasurementMedium : } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute LevelValue */ @@ -131448,9 +131366,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementLevelValue : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -131533,9 +131448,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementGeneratedCommandLis } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -131618,7 +131530,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementAcceptedCommandList } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -131704,7 +131615,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementEventList : public }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute AttributeList @@ -131788,9 +131698,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementAttributeList : pub } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -131873,9 +131780,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementFeatureMap : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -131958,9 +131862,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementClusterRevision : p } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster NitrogenDioxideConcentrationMeasurement | 0x0413 | |------------------------------------------------------------------------------| @@ -131988,8 +131889,6 @@ class SubscribeAttributeCarbonDioxideConcentrationMeasurementClusterRevision : p | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasuredValue */ @@ -132072,9 +131971,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementMeasuredValue : p } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MinMeasuredValue */ @@ -132157,9 +132053,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementMinMeasuredValue } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MaxMeasuredValue */ @@ -132242,9 +132135,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementMaxMeasuredValue } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValue */ @@ -132327,9 +132217,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementPeakMeasuredValue } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValueWindow */ @@ -132412,9 +132299,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementPeakMeasuredValue } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValue */ @@ -132497,9 +132381,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementAverageMeasuredVa } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValueWindow */ @@ -132582,9 +132463,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementAverageMeasuredVa } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Uncertainty */ @@ -132667,9 +132545,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementUncertainty : pub } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementUnit */ @@ -132752,9 +132627,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementMeasurementUnit : } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementMedium */ @@ -132837,9 +132709,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementMeasurementMedium } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute LevelValue */ @@ -132922,9 +132791,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementLevelValue : publ } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -133007,9 +132873,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementGeneratedCommandL } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -133092,7 +132955,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementAcceptedCommandLi } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -133178,7 +133040,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementEventList : publi }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute AttributeList @@ -133262,9 +133123,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementAttributeList : p } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -133347,9 +133205,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementFeatureMap : publ } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -133432,9 +133287,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementClusterRevision : } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster OzoneConcentrationMeasurement | 0x0415 | |------------------------------------------------------------------------------| @@ -133462,8 +133314,6 @@ class SubscribeAttributeNitrogenDioxideConcentrationMeasurementClusterRevision : | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasuredValue */ @@ -133546,9 +133396,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementMeasuredValue : public Subs } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MinMeasuredValue */ @@ -133631,9 +133478,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementMinMeasuredValue : public S } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MaxMeasuredValue */ @@ -133716,9 +133560,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementMaxMeasuredValue : public S } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValue */ @@ -133801,9 +133642,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementPeakMeasuredValue : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValueWindow */ @@ -133886,9 +133724,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementPeakMeasuredValueWindow : p } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValue */ @@ -133971,9 +133806,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementAverageMeasuredValue : publ } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValueWindow */ @@ -134056,9 +133888,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementAverageMeasuredValueWindow } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Uncertainty */ @@ -134141,9 +133970,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementUncertainty : public Subscr } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementUnit */ @@ -134226,9 +134052,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementMeasurementUnit : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementMedium */ @@ -134311,9 +134134,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementMeasurementMedium : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute LevelValue */ @@ -134396,9 +134216,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementLevelValue : public Subscri } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -134481,9 +134298,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementGeneratedCommandList : publ } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -134566,7 +134380,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementAcceptedCommandList : publi } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -134652,7 +134465,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementEventList : public Subscrib }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute AttributeList @@ -134736,9 +134548,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementAttributeList : public Subs } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -134821,9 +134630,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementFeatureMap : public Subscri } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -134906,9 +134712,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementClusterRevision : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster Pm25ConcentrationMeasurement | 0x042A | |------------------------------------------------------------------------------| @@ -134936,8 +134739,6 @@ class SubscribeAttributeOzoneConcentrationMeasurementClusterRevision : public Su | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasuredValue */ @@ -135020,9 +134821,6 @@ class SubscribeAttributePm25ConcentrationMeasurementMeasuredValue : public Subsc } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MinMeasuredValue */ @@ -135105,9 +134903,6 @@ class SubscribeAttributePm25ConcentrationMeasurementMinMeasuredValue : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MaxMeasuredValue */ @@ -135190,9 +134985,6 @@ class SubscribeAttributePm25ConcentrationMeasurementMaxMeasuredValue : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValue */ @@ -135275,9 +135067,6 @@ class SubscribeAttributePm25ConcentrationMeasurementPeakMeasuredValue : public S } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValueWindow */ @@ -135360,9 +135149,6 @@ class SubscribeAttributePm25ConcentrationMeasurementPeakMeasuredValueWindow : pu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValue */ @@ -135445,9 +135231,6 @@ class SubscribeAttributePm25ConcentrationMeasurementAverageMeasuredValue : publi } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValueWindow */ @@ -135530,9 +135313,6 @@ class SubscribeAttributePm25ConcentrationMeasurementAverageMeasuredValueWindow : } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Uncertainty */ @@ -135615,9 +135395,6 @@ class SubscribeAttributePm25ConcentrationMeasurementUncertainty : public Subscri } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementUnit */ @@ -135700,9 +135477,6 @@ class SubscribeAttributePm25ConcentrationMeasurementMeasurementUnit : public Sub } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementMedium */ @@ -135785,9 +135559,6 @@ class SubscribeAttributePm25ConcentrationMeasurementMeasurementMedium : public S } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute LevelValue */ @@ -135870,9 +135641,6 @@ class SubscribeAttributePm25ConcentrationMeasurementLevelValue : public Subscrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -135955,9 +135723,6 @@ class SubscribeAttributePm25ConcentrationMeasurementGeneratedCommandList : publi } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -136040,7 +135805,6 @@ class SubscribeAttributePm25ConcentrationMeasurementAcceptedCommandList : public } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -136126,7 +135890,6 @@ class SubscribeAttributePm25ConcentrationMeasurementEventList : public Subscribe }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute AttributeList @@ -136210,9 +135973,6 @@ class SubscribeAttributePm25ConcentrationMeasurementAttributeList : public Subsc } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -136295,9 +136055,6 @@ class SubscribeAttributePm25ConcentrationMeasurementFeatureMap : public Subscrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -136380,9 +136137,6 @@ class SubscribeAttributePm25ConcentrationMeasurementClusterRevision : public Sub } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster FormaldehydeConcentrationMeasurement | 0x042B | |------------------------------------------------------------------------------| @@ -136410,8 +136164,6 @@ class SubscribeAttributePm25ConcentrationMeasurementClusterRevision : public Sub | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasuredValue */ @@ -136494,9 +136246,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementMeasuredValue : publ } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MinMeasuredValue */ @@ -136579,9 +136328,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementMinMeasuredValue : p } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MaxMeasuredValue */ @@ -136664,9 +136410,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementMaxMeasuredValue : p } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValue */ @@ -136749,9 +136492,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementPeakMeasuredValue : } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValueWindow */ @@ -136834,9 +136574,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementPeakMeasuredValueWin } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValue */ @@ -136919,9 +136656,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementAverageMeasuredValue } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValueWindow */ @@ -137004,9 +136738,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementAverageMeasuredValue } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Uncertainty */ @@ -137089,9 +136820,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementUncertainty : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementUnit */ @@ -137174,9 +136902,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementMeasurementUnit : pu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementMedium */ @@ -137259,9 +136984,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementMeasurementMedium : } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute LevelValue */ @@ -137344,9 +137066,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementLevelValue : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -137429,9 +137148,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementGeneratedCommandList } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -137514,7 +137230,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementAcceptedCommandList } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -137600,7 +137315,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementEventList : public S }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute AttributeList @@ -137684,9 +137398,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementAttributeList : publ } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -137769,9 +137480,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementFeatureMap : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -137854,9 +137562,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementClusterRevision : pu } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster Pm1ConcentrationMeasurement | 0x042C | |------------------------------------------------------------------------------| @@ -137884,8 +137589,6 @@ class SubscribeAttributeFormaldehydeConcentrationMeasurementClusterRevision : pu | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasuredValue */ @@ -137968,9 +137671,6 @@ class SubscribeAttributePm1ConcentrationMeasurementMeasuredValue : public Subscr } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MinMeasuredValue */ @@ -138053,9 +137753,6 @@ class SubscribeAttributePm1ConcentrationMeasurementMinMeasuredValue : public Sub } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MaxMeasuredValue */ @@ -138138,9 +137835,6 @@ class SubscribeAttributePm1ConcentrationMeasurementMaxMeasuredValue : public Sub } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValue */ @@ -138223,9 +137917,6 @@ class SubscribeAttributePm1ConcentrationMeasurementPeakMeasuredValue : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValueWindow */ @@ -138308,9 +137999,6 @@ class SubscribeAttributePm1ConcentrationMeasurementPeakMeasuredValueWindow : pub } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValue */ @@ -138393,9 +138081,6 @@ class SubscribeAttributePm1ConcentrationMeasurementAverageMeasuredValue : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValueWindow */ @@ -138478,9 +138163,6 @@ class SubscribeAttributePm1ConcentrationMeasurementAverageMeasuredValueWindow : } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Uncertainty */ @@ -138563,9 +138245,6 @@ class SubscribeAttributePm1ConcentrationMeasurementUncertainty : public Subscrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementUnit */ @@ -138648,9 +138327,6 @@ class SubscribeAttributePm1ConcentrationMeasurementMeasurementUnit : public Subs } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementMedium */ @@ -138733,9 +138409,6 @@ class SubscribeAttributePm1ConcentrationMeasurementMeasurementMedium : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute LevelValue */ @@ -138818,9 +138491,6 @@ class SubscribeAttributePm1ConcentrationMeasurementLevelValue : public Subscribe } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -138903,9 +138573,6 @@ class SubscribeAttributePm1ConcentrationMeasurementGeneratedCommandList : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -138988,7 +138655,6 @@ class SubscribeAttributePm1ConcentrationMeasurementAcceptedCommandList : public } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -139074,7 +138740,6 @@ class SubscribeAttributePm1ConcentrationMeasurementEventList : public SubscribeA }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute AttributeList @@ -139158,9 +138823,6 @@ class SubscribeAttributePm1ConcentrationMeasurementAttributeList : public Subscr } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -139243,9 +138905,6 @@ class SubscribeAttributePm1ConcentrationMeasurementFeatureMap : public Subscribe } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -139328,9 +138987,6 @@ class SubscribeAttributePm1ConcentrationMeasurementClusterRevision : public Subs } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster Pm10ConcentrationMeasurement | 0x042D | |------------------------------------------------------------------------------| @@ -139358,8 +139014,6 @@ class SubscribeAttributePm1ConcentrationMeasurementClusterRevision : public Subs | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasuredValue */ @@ -139442,9 +139096,6 @@ class SubscribeAttributePm10ConcentrationMeasurementMeasuredValue : public Subsc } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MinMeasuredValue */ @@ -139527,9 +139178,6 @@ class SubscribeAttributePm10ConcentrationMeasurementMinMeasuredValue : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MaxMeasuredValue */ @@ -139612,9 +139260,6 @@ class SubscribeAttributePm10ConcentrationMeasurementMaxMeasuredValue : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValue */ @@ -139697,9 +139342,6 @@ class SubscribeAttributePm10ConcentrationMeasurementPeakMeasuredValue : public S } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValueWindow */ @@ -139782,9 +139424,6 @@ class SubscribeAttributePm10ConcentrationMeasurementPeakMeasuredValueWindow : pu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValue */ @@ -139867,9 +139506,6 @@ class SubscribeAttributePm10ConcentrationMeasurementAverageMeasuredValue : publi } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValueWindow */ @@ -139952,9 +139588,6 @@ class SubscribeAttributePm10ConcentrationMeasurementAverageMeasuredValueWindow : } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Uncertainty */ @@ -140037,9 +139670,6 @@ class SubscribeAttributePm10ConcentrationMeasurementUncertainty : public Subscri } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementUnit */ @@ -140122,9 +139752,6 @@ class SubscribeAttributePm10ConcentrationMeasurementMeasurementUnit : public Sub } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementMedium */ @@ -140207,9 +139834,6 @@ class SubscribeAttributePm10ConcentrationMeasurementMeasurementMedium : public S } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute LevelValue */ @@ -140292,9 +139916,6 @@ class SubscribeAttributePm10ConcentrationMeasurementLevelValue : public Subscrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -140377,9 +139998,6 @@ class SubscribeAttributePm10ConcentrationMeasurementGeneratedCommandList : publi } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -140462,7 +140080,6 @@ class SubscribeAttributePm10ConcentrationMeasurementAcceptedCommandList : public } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -140548,7 +140165,6 @@ class SubscribeAttributePm10ConcentrationMeasurementEventList : public Subscribe }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute AttributeList @@ -140632,9 +140248,6 @@ class SubscribeAttributePm10ConcentrationMeasurementAttributeList : public Subsc } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -140717,9 +140330,6 @@ class SubscribeAttributePm10ConcentrationMeasurementFeatureMap : public Subscrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -140802,9 +140412,6 @@ class SubscribeAttributePm10ConcentrationMeasurementClusterRevision : public Sub } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster TotalVolatileOrganicCompoundsConcentrationMeasurement | 0x042E | |------------------------------------------------------------------------------| @@ -140832,8 +140439,6 @@ class SubscribeAttributePm10ConcentrationMeasurementClusterRevision : public Sub | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasuredValue */ @@ -140916,9 +140521,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementMea } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MinMeasuredValue */ @@ -141001,9 +140603,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementMin } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MaxMeasuredValue */ @@ -141086,9 +140685,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementMax } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValue */ @@ -141171,9 +140767,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementPea } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValueWindow */ @@ -141256,9 +140849,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementPea } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValue */ @@ -141341,9 +140931,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementAve } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValueWindow */ @@ -141426,9 +141013,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementAve } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Uncertainty */ @@ -141511,9 +141095,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementUnc } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementUnit */ @@ -141596,9 +141177,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementMea } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementMedium */ @@ -141681,9 +141259,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementMea } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute LevelValue */ @@ -141766,9 +141341,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementLev } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -141851,9 +141423,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementGen } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -141936,7 +141505,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementAcc } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -142022,7 +141590,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementEve }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute AttributeList @@ -142106,9 +141673,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementAtt } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -142191,9 +141755,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementFea } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -142276,9 +141837,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementClu } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster RadonConcentrationMeasurement | 0x042F | |------------------------------------------------------------------------------| @@ -142306,8 +141864,6 @@ class SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementClu | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasuredValue */ @@ -142390,9 +141946,6 @@ class SubscribeAttributeRadonConcentrationMeasurementMeasuredValue : public Subs } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MinMeasuredValue */ @@ -142475,9 +142028,6 @@ class SubscribeAttributeRadonConcentrationMeasurementMinMeasuredValue : public S } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MaxMeasuredValue */ @@ -142560,9 +142110,6 @@ class SubscribeAttributeRadonConcentrationMeasurementMaxMeasuredValue : public S } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValue */ @@ -142645,9 +142192,6 @@ class SubscribeAttributeRadonConcentrationMeasurementPeakMeasuredValue : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PeakMeasuredValueWindow */ @@ -142730,9 +142274,6 @@ class SubscribeAttributeRadonConcentrationMeasurementPeakMeasuredValueWindow : p } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValue */ @@ -142815,9 +142356,6 @@ class SubscribeAttributeRadonConcentrationMeasurementAverageMeasuredValue : publ } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AverageMeasuredValueWindow */ @@ -142900,9 +142438,6 @@ class SubscribeAttributeRadonConcentrationMeasurementAverageMeasuredValueWindow } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Uncertainty */ @@ -142985,9 +142520,6 @@ class SubscribeAttributeRadonConcentrationMeasurementUncertainty : public Subscr } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementUnit */ @@ -143070,9 +142602,6 @@ class SubscribeAttributeRadonConcentrationMeasurementMeasurementUnit : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MeasurementMedium */ @@ -143155,9 +142684,6 @@ class SubscribeAttributeRadonConcentrationMeasurementMeasurementMedium : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute LevelValue */ @@ -143240,9 +142766,6 @@ class SubscribeAttributeRadonConcentrationMeasurementLevelValue : public Subscri } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -143325,9 +142848,6 @@ class SubscribeAttributeRadonConcentrationMeasurementGeneratedCommandList : publ } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -143410,7 +142930,6 @@ class SubscribeAttributeRadonConcentrationMeasurementAcceptedCommandList : publi } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -143496,7 +143015,6 @@ class SubscribeAttributeRadonConcentrationMeasurementEventList : public Subscrib }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute AttributeList @@ -143580,9 +143098,6 @@ class SubscribeAttributeRadonConcentrationMeasurementAttributeList : public Subs } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -143665,9 +143180,6 @@ class SubscribeAttributeRadonConcentrationMeasurementFeatureMap : public Subscri } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -143750,8 +143262,6 @@ class SubscribeAttributeRadonConcentrationMeasurementClusterRevision : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster WakeOnLan | 0x0503 | |------------------------------------------------------------------------------| @@ -188239,7 +187749,6 @@ void registerClusterOccupancySensing(Commands & commands) } void registerClusterCarbonMonoxideConcentrationMeasurement(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::CarbonMonoxideConcentrationMeasurement; const char * clusterName = "CarbonMonoxideConcentrationMeasurement"; @@ -188249,82 +187758,48 @@ void registerClusterCarbonMonoxideConcentrationMeasurement(Commands & commands) make_unique<ReadAttribute>(Id), // make_unique<WriteAttribute>(Id), // make_unique<SubscribeAttribute>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementMeasuredValue>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementMinMeasuredValue>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementMinMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementMaxMeasuredValue>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementMaxMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementPeakMeasuredValue>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementPeakMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementPeakMeasuredValueWindow>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementPeakMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementAverageMeasuredValue>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementAverageMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementAverageMeasuredValueWindow>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementAverageMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementUncertainty>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementUncertainty>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementMeasurementUnit>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementMeasurementUnit>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementMeasurementMedium>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementMeasurementMedium>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementLevelValue>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementLevelValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementGeneratedCommandList>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementGeneratedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementAcceptedCommandList>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementAcceptedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementEventList>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementEventList>(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementAttributeList>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementAttributeList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementFeatureMap>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementFeatureMap>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonMonoxideConcentrationMeasurementClusterRevision>(), // make_unique<SubscribeAttributeCarbonMonoxideConcentrationMeasurementClusterRevision>(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterCarbonDioxideConcentrationMeasurement(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::CarbonDioxideConcentrationMeasurement; const char * clusterName = "CarbonDioxideConcentrationMeasurement"; @@ -188334,82 +187809,48 @@ void registerClusterCarbonDioxideConcentrationMeasurement(Commands & commands) make_unique<ReadAttribute>(Id), // make_unique<WriteAttribute>(Id), // make_unique<SubscribeAttribute>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementMeasuredValue>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementMinMeasuredValue>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementMinMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementMaxMeasuredValue>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementMaxMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementPeakMeasuredValue>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementPeakMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementPeakMeasuredValueWindow>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementPeakMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementAverageMeasuredValue>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementAverageMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementAverageMeasuredValueWindow>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementAverageMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementUncertainty>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementUncertainty>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementMeasurementUnit>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementMeasurementUnit>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementMeasurementMedium>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementMeasurementMedium>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementLevelValue>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementLevelValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementGeneratedCommandList>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementGeneratedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementAcceptedCommandList>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementAcceptedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementEventList>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementEventList>(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementAttributeList>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementAttributeList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementFeatureMap>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementFeatureMap>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadCarbonDioxideConcentrationMeasurementClusterRevision>(), // make_unique<SubscribeAttributeCarbonDioxideConcentrationMeasurementClusterRevision>(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterNitrogenDioxideConcentrationMeasurement(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::NitrogenDioxideConcentrationMeasurement; const char * clusterName = "NitrogenDioxideConcentrationMeasurement"; @@ -188419,82 +187860,48 @@ void registerClusterNitrogenDioxideConcentrationMeasurement(Commands & commands) make_unique<ReadAttribute>(Id), // make_unique<WriteAttribute>(Id), // make_unique<SubscribeAttribute>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementMeasuredValue>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementMinMeasuredValue>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementMinMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementMaxMeasuredValue>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementMaxMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementPeakMeasuredValue>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementPeakMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementPeakMeasuredValueWindow>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementPeakMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementAverageMeasuredValue>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementAverageMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementAverageMeasuredValueWindow>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementAverageMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementUncertainty>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementUncertainty>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementMeasurementUnit>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementMeasurementUnit>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementMeasurementMedium>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementMeasurementMedium>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementLevelValue>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementLevelValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementGeneratedCommandList>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementGeneratedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementAcceptedCommandList>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementAcceptedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementEventList>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementEventList>(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementAttributeList>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementAttributeList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementFeatureMap>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementFeatureMap>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadNitrogenDioxideConcentrationMeasurementClusterRevision>(), // make_unique<SubscribeAttributeNitrogenDioxideConcentrationMeasurementClusterRevision>(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterOzoneConcentrationMeasurement(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::OzoneConcentrationMeasurement; const char * clusterName = "OzoneConcentrationMeasurement"; @@ -188504,82 +187911,48 @@ void registerClusterOzoneConcentrationMeasurement(Commands & commands) make_unique<ReadAttribute>(Id), // make_unique<WriteAttribute>(Id), // make_unique<SubscribeAttribute>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementMeasuredValue>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementMinMeasuredValue>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementMinMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementMaxMeasuredValue>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementMaxMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementPeakMeasuredValue>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementPeakMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementPeakMeasuredValueWindow>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementPeakMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementAverageMeasuredValue>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementAverageMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementAverageMeasuredValueWindow>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementAverageMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementUncertainty>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementUncertainty>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementMeasurementUnit>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementMeasurementUnit>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementMeasurementMedium>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementMeasurementMedium>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementLevelValue>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementLevelValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementGeneratedCommandList>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementGeneratedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementAcceptedCommandList>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementAcceptedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementEventList>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementEventList>(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementAttributeList>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementAttributeList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementFeatureMap>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementFeatureMap>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadOzoneConcentrationMeasurementClusterRevision>(), // make_unique<SubscribeAttributeOzoneConcentrationMeasurementClusterRevision>(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterPm25ConcentrationMeasurement(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::Pm25ConcentrationMeasurement; const char * clusterName = "Pm25ConcentrationMeasurement"; @@ -188589,82 +187962,48 @@ void registerClusterPm25ConcentrationMeasurement(Commands & commands) make_unique<ReadAttribute>(Id), // make_unique<WriteAttribute>(Id), // make_unique<SubscribeAttribute>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementMeasuredValue>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementMinMeasuredValue>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementMinMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementMaxMeasuredValue>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementMaxMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementPeakMeasuredValue>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementPeakMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementPeakMeasuredValueWindow>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementPeakMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementAverageMeasuredValue>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementAverageMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementAverageMeasuredValueWindow>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementAverageMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementUncertainty>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementUncertainty>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementMeasurementUnit>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementMeasurementUnit>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementMeasurementMedium>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementMeasurementMedium>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementLevelValue>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementLevelValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementGeneratedCommandList>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementGeneratedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementAcceptedCommandList>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementAcceptedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementEventList>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementEventList>(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementAttributeList>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementAttributeList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementFeatureMap>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementFeatureMap>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm25ConcentrationMeasurementClusterRevision>(), // make_unique<SubscribeAttributePm25ConcentrationMeasurementClusterRevision>(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterFormaldehydeConcentrationMeasurement(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::FormaldehydeConcentrationMeasurement; const char * clusterName = "FormaldehydeConcentrationMeasurement"; @@ -188674,82 +188013,48 @@ void registerClusterFormaldehydeConcentrationMeasurement(Commands & commands) make_unique<ReadAttribute>(Id), // make_unique<WriteAttribute>(Id), // make_unique<SubscribeAttribute>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementMeasuredValue>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementMinMeasuredValue>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementMinMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementMaxMeasuredValue>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementMaxMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementPeakMeasuredValue>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementPeakMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementPeakMeasuredValueWindow>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementPeakMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementAverageMeasuredValue>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementAverageMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementAverageMeasuredValueWindow>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementAverageMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementUncertainty>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementUncertainty>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementMeasurementUnit>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementMeasurementUnit>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementMeasurementMedium>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementMeasurementMedium>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementLevelValue>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementLevelValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementGeneratedCommandList>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementGeneratedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementAcceptedCommandList>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementAcceptedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementEventList>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementEventList>(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementAttributeList>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementAttributeList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementFeatureMap>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementFeatureMap>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadFormaldehydeConcentrationMeasurementClusterRevision>(), // make_unique<SubscribeAttributeFormaldehydeConcentrationMeasurementClusterRevision>(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterPm1ConcentrationMeasurement(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::Pm1ConcentrationMeasurement; const char * clusterName = "Pm1ConcentrationMeasurement"; @@ -188759,82 +188064,48 @@ void registerClusterPm1ConcentrationMeasurement(Commands & commands) make_unique<ReadAttribute>(Id), // make_unique<WriteAttribute>(Id), // make_unique<SubscribeAttribute>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementMeasuredValue>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementMinMeasuredValue>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementMinMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementMaxMeasuredValue>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementMaxMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementPeakMeasuredValue>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementPeakMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementPeakMeasuredValueWindow>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementPeakMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementAverageMeasuredValue>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementAverageMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementAverageMeasuredValueWindow>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementAverageMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementUncertainty>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementUncertainty>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementMeasurementUnit>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementMeasurementUnit>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementMeasurementMedium>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementMeasurementMedium>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementLevelValue>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementLevelValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementGeneratedCommandList>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementGeneratedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementAcceptedCommandList>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementAcceptedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementEventList>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementEventList>(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementAttributeList>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementAttributeList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementFeatureMap>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementFeatureMap>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm1ConcentrationMeasurementClusterRevision>(), // make_unique<SubscribeAttributePm1ConcentrationMeasurementClusterRevision>(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterPm10ConcentrationMeasurement(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::Pm10ConcentrationMeasurement; const char * clusterName = "Pm10ConcentrationMeasurement"; @@ -188844,82 +188115,48 @@ void registerClusterPm10ConcentrationMeasurement(Commands & commands) make_unique<ReadAttribute>(Id), // make_unique<WriteAttribute>(Id), // make_unique<SubscribeAttribute>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementMeasuredValue>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementMinMeasuredValue>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementMinMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementMaxMeasuredValue>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementMaxMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementPeakMeasuredValue>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementPeakMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementPeakMeasuredValueWindow>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementPeakMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementAverageMeasuredValue>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementAverageMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementAverageMeasuredValueWindow>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementAverageMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementUncertainty>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementUncertainty>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementMeasurementUnit>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementMeasurementUnit>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementMeasurementMedium>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementMeasurementMedium>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementLevelValue>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementLevelValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementGeneratedCommandList>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementGeneratedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementAcceptedCommandList>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementAcceptedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementEventList>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementEventList>(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementAttributeList>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementAttributeList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementFeatureMap>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementFeatureMap>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadPm10ConcentrationMeasurementClusterRevision>(), // make_unique<SubscribeAttributePm10ConcentrationMeasurementClusterRevision>(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterTotalVolatileOrganicCompoundsConcentrationMeasurement(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement; const char * clusterName = "TotalVolatileOrganicCompoundsConcentrationMeasurement"; @@ -188929,82 +188166,48 @@ void registerClusterTotalVolatileOrganicCompoundsConcentrationMeasurement(Comman make_unique<ReadAttribute>(Id), // make_unique<WriteAttribute>(Id), // make_unique<SubscribeAttribute>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementMeasuredValue>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementMinMeasuredValue>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementMinMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementMaxMeasuredValue>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementMaxMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementPeakMeasuredValue>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementPeakMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementPeakMeasuredValueWindow>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementPeakMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementAverageMeasuredValue>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementAverageMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementAverageMeasuredValueWindow>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementAverageMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementUncertainty>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementUncertainty>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnit>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementUnit>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementMedium>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementMeasurementMedium>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementLevelValue>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementLevelValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementGeneratedCommandList>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementGeneratedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementAcceptedCommandList>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementAcceptedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementEventList>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementEventList>(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeList>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementAttributeList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementFeatureMap>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementFeatureMap>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadTotalVolatileOrganicCompoundsConcentrationMeasurementClusterRevision>(), // make_unique<SubscribeAttributeTotalVolatileOrganicCompoundsConcentrationMeasurementClusterRevision>(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterRadonConcentrationMeasurement(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::RadonConcentrationMeasurement; const char * clusterName = "RadonConcentrationMeasurement"; @@ -189014,78 +188217,45 @@ void registerClusterRadonConcentrationMeasurement(Commands & commands) make_unique<ReadAttribute>(Id), // make_unique<WriteAttribute>(Id), // make_unique<SubscribeAttribute>(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementMeasuredValue>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementMinMeasuredValue>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementMinMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementMaxMeasuredValue>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementMaxMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementPeakMeasuredValue>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementPeakMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementPeakMeasuredValueWindow>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementPeakMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementAverageMeasuredValue>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementAverageMeasuredValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementAverageMeasuredValueWindow>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementAverageMeasuredValueWindow>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementUncertainty>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementUncertainty>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementMeasurementUnit>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementMeasurementUnit>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementMeasurementMedium>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementMeasurementMedium>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementLevelValue>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementLevelValue>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementGeneratedCommandList>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementGeneratedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementAcceptedCommandList>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementAcceptedCommandList>(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementEventList>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementEventList>(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementAttributeList>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementAttributeList>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementFeatureMap>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementFeatureMap>(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique<ReadRadonConcentrationMeasurementClusterRevision>(), // make_unique<SubscribeAttributeRadonConcentrationMeasurementClusterRevision>(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterWakeOnLan(Commands & commands) { From da00bcc30b17b623bedefcc9c0fcebde8243177d Mon Sep 17 00:00:00 2001 From: Maksymilian Knust <m.knust@samsung.com> Date: Mon, 6 May 2024 11:56:01 +0200 Subject: [PATCH 123/124] Make test setup functions terminate on error --- src/app/icd/server/tests/TestICDManager.cpp | 4 +-- src/app/tests/AppTestContext.cpp | 33 +++++++++---------- src/app/tests/AppTestContext.h | 4 +-- src/app/tests/TestAclAttribute.cpp | 5 ++- src/app/tests/TestAclEvent.cpp | 12 +++---- src/app/tests/TestEventLogging.cpp | 12 +++---- src/app/tests/TestEventLoggingNoUTCTime.cpp | 17 ++++------ src/app/tests/TestEventOverflow.cpp | 12 +++---- .../tests/TestFabricScopedEventLogging.cpp | 12 +++---- src/app/tests/TestReadInteraction.cpp | 22 +++++-------- src/app/tests/TestWriteInteraction.cpp | 13 ++++---- src/controller/tests/TestEventCaching.cpp | 12 +++---- src/controller/tests/TestEventChunking.cpp | 12 +++---- .../tests/TestEventNumberCaching.cpp | 12 +++---- src/messaging/tests/MessagingContext.h | 29 ++++++++-------- .../tests/TestAbortExchangesForFabric.cpp | 5 ++- src/messaging/tests/TestExchangeMgr.cpp | 5 ++- .../tests/TestReliableMessageProtocol.cpp | 7 ++-- .../secure_channel/tests/TestCASESession.cpp | 30 ++++++++--------- .../secure_channel/tests/TestPASESession.cpp | 4 +-- 20 files changed, 113 insertions(+), 149 deletions(-) diff --git a/src/app/icd/server/tests/TestICDManager.cpp b/src/app/icd/server/tests/TestICDManager.cpp index 366bcb5c9280ad..6cba8c308b4e06 100644 --- a/src/app/icd/server/tests/TestICDManager.cpp +++ b/src/app/icd/server/tests/TestICDManager.cpp @@ -163,7 +163,7 @@ class TestICDManager : public ::testing::Test ASSERT_NE(pMessagingContext, nullptr); } - ASSERT_EQ(pMessagingContext->SetUpTestSuite(), CHIP_NO_ERROR); + pMessagingContext->SetUpTestSuite(); ASSERT_EQ(chip::DeviceLayer::PlatformMgr().InitChipStack(), CHIP_NO_ERROR); DeviceLayer::SetSystemLayerForTesting(&(pMessagingContext->GetSystemLayer())); @@ -198,7 +198,7 @@ class TestICDManager : public ::testing::Test // Performs setup for each individual test in the test suite void SetUp() override { - EXPECT_EQ(pMessagingContext->SetUp(), CHIP_NO_ERROR); + pMessagingContext->SetUp(); mICDStateObserver.ResetAll(); mICDManager.RegisterObserver(&mICDStateObserver); diff --git a/src/app/tests/AppTestContext.cpp b/src/app/tests/AppTestContext.cpp index 6f22097d7d11e8..eca7a2db76c83b 100644 --- a/src/app/tests/AppTestContext.cpp +++ b/src/app/tests/AppTestContext.cpp @@ -38,15 +38,13 @@ chip::Access::AccessControl gPermissiveAccessControl; namespace chip { namespace Test { -CHIP_ERROR AppContext::SetUpTestSuite() +void AppContext::SetUpTestSuite() { CHIP_ERROR err = CHIP_NO_ERROR; - VerifyOrExit((err = LoopbackMessagingContext::SetUpTestSuite()) == CHIP_NO_ERROR, - ChipLogError(AppServer, "SetUpTestSuite lo messaging context failed: %" CHIP_ERROR_FORMAT, err.Format())); - VerifyOrExit((err = chip::DeviceLayer::PlatformMgr().InitChipStack()) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init CHIP stack failed: %" CHIP_ERROR_FORMAT, err.Format())); -exit: - return err; + LoopbackMessagingContext::SetUpTestSuite(); + // TODO: use ASSERT_EQ, once transition to pw_unit_test is complete + VerifyOrDieWithMsg((err = chip::DeviceLayer::PlatformMgr().InitChipStack()) == CHIP_NO_ERROR, AppServer, + "Init CHIP stack failed: %" CHIP_ERROR_FORMAT, err.Format()); } void AppContext::TearDownTestSuite() @@ -55,20 +53,19 @@ void AppContext::TearDownTestSuite() LoopbackMessagingContext::TearDownTestSuite(); } -CHIP_ERROR AppContext::SetUp() +void AppContext::SetUp() { CHIP_ERROR err = CHIP_NO_ERROR; - VerifyOrExit((err = LoopbackMessagingContext::SetUp()) == CHIP_NO_ERROR, - ChipLogError(AppServer, "SetUp lo messaging context failed: %" CHIP_ERROR_FORMAT, err.Format())); - VerifyOrExit((err = app::InteractionModelEngine::GetInstance()->Init( - &GetExchangeManager(), &GetFabricTable(), app::reporting::GetDefaultReportScheduler())) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init InteractionModelEngine failed: %" CHIP_ERROR_FORMAT, err.Format())); + LoopbackMessagingContext::SetUp(); + // TODO: use ASSERT_EQ, once transition to pw_unit_test is complete + VerifyOrDieWithMsg((err = app::InteractionModelEngine::GetInstance()->Init(&GetExchangeManager(), &GetFabricTable(), + app::reporting::GetDefaultReportScheduler())) == + CHIP_NO_ERROR, + AppServer, "Init InteractionModelEngine failed: %" CHIP_ERROR_FORMAT, err.Format()); Access::SetAccessControl(gPermissiveAccessControl); - VerifyOrExit((err = Access::GetAccessControl().Init(chip::Access::Examples::GetPermissiveAccessControlDelegate(), - gDeviceTypeResolver)) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init AccessControl failed: %" CHIP_ERROR_FORMAT, err.Format())); -exit: - return err; + VerifyOrDieWithMsg((err = Access::GetAccessControl().Init(chip::Access::Examples::GetPermissiveAccessControlDelegate(), + gDeviceTypeResolver)) == CHIP_NO_ERROR, + AppServer, "Init AccessControl failed: %" CHIP_ERROR_FORMAT, err.Format()); } void AppContext::TearDown() diff --git a/src/app/tests/AppTestContext.h b/src/app/tests/AppTestContext.h index 40605f237db7ab..b9945fecd3a90a 100644 --- a/src/app/tests/AppTestContext.h +++ b/src/app/tests/AppTestContext.h @@ -28,11 +28,11 @@ class AppContext : public LoopbackMessagingContext { public: // Performs shared setup for all tests in the test suite - CHIP_ERROR SetUpTestSuite() override; + void SetUpTestSuite() override; // Performs shared teardown for all tests in the test suite void TearDownTestSuite() override; // Performs setup for each individual test in the test suite - CHIP_ERROR SetUp() override; + void SetUp() override; // Performs teardown for each individual test in the test suite void TearDown() override; }; diff --git a/src/app/tests/TestAclAttribute.cpp b/src/app/tests/TestAclAttribute.cpp index da11c40a28dedf..c1bfd8acf68a73 100644 --- a/src/app/tests/TestAclAttribute.cpp +++ b/src/app/tests/TestAclAttribute.cpp @@ -81,12 +81,11 @@ class TestAccessContext : public chip::Test::AppContext { public: // Performs setup for each individual test in the test suite - CHIP_ERROR SetUp() override + void SetUp() override { - ReturnErrorOnFailure(chip::Test::AppContext::SetUp()); + chip::Test::AppContext::SetUp(); Access::GetAccessControl().Finish(); Access::GetAccessControl().Init(GetTestAccessControlDelegate(), gDeviceTypeResolver); - return CHIP_NO_ERROR; } }; diff --git a/src/app/tests/TestAclEvent.cpp b/src/app/tests/TestAclEvent.cpp index fda4a69217ccd6..f7c85e0bccaed8 100644 --- a/src/app/tests/TestAclEvent.cpp +++ b/src/app/tests/TestAclEvent.cpp @@ -86,7 +86,7 @@ class TestContext : public chip::Test::AppContext { public: // Performs setup for each individual test in the test suite - CHIP_ERROR SetUp() override + void SetUp() override { const chip::app::LogStorageResources logStorageResources[] = { { &gDebugEventBuffer[0], sizeof(gDebugEventBuffer), chip::app::PriorityLevel::Debug }, @@ -94,19 +94,17 @@ class TestContext : public chip::Test::AppContext { &gCritEventBuffer[0], sizeof(gCritEventBuffer), chip::app::PriorityLevel::Critical }, }; - ReturnErrorOnFailure(chip::Test::AppContext::SetUp()); + chip::Test::AppContext::SetUp(); CHIP_ERROR err = CHIP_NO_ERROR; - VerifyOrExit((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format())); + // TODO: use ASSERT_EQ, once transition to pw_unit_test is complete + VerifyOrDieWithMsg((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, AppServer, + "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format()); chip::app::EventManagement::CreateEventManagement(&GetExchangeManager(), ArraySize(logStorageResources), gCircularEventBuffer, logStorageResources, &mEventCounter); Access::GetAccessControl().Finish(); Access::GetAccessControl().Init(GetTestAccessControlDelegate(), gDeviceTypeResolver); - - exit: - return err; } // Performs teardown for each individual test in the test suite diff --git a/src/app/tests/TestEventLogging.cpp b/src/app/tests/TestEventLogging.cpp index baf43d6b398707..41ae31bd4295ff 100644 --- a/src/app/tests/TestEventLogging.cpp +++ b/src/app/tests/TestEventLogging.cpp @@ -64,7 +64,7 @@ class TestContext : public chip::Test::AppContext { public: // Performs setup for each individual test in the test suite - CHIP_ERROR SetUp() override + void SetUp() override { const chip::app::LogStorageResources logStorageResources[] = { { &gDebugEventBuffer[0], sizeof(gDebugEventBuffer), chip::app::PriorityLevel::Debug }, @@ -72,16 +72,14 @@ class TestContext : public chip::Test::AppContext { &gCritEventBuffer[0], sizeof(gCritEventBuffer), chip::app::PriorityLevel::Critical }, }; - ReturnErrorOnFailure(chip::Test::AppContext::SetUp()); + chip::Test::AppContext::SetUp(); CHIP_ERROR err = CHIP_NO_ERROR; - VerifyOrExit((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format())); + // TODO: use ASSERT_EQ, once transition to pw_unit_test is complete + VerifyOrDieWithMsg((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, AppServer, + "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format()); chip::app::EventManagement::CreateEventManagement(&GetExchangeManager(), ArraySize(logStorageResources), gCircularEventBuffer, logStorageResources, &mEventCounter); - - exit: - return err; } // Performs teardown for each individual test in the test suite diff --git a/src/app/tests/TestEventLoggingNoUTCTime.cpp b/src/app/tests/TestEventLoggingNoUTCTime.cpp index 8360f9a0813e98..77a8463a5f9718 100644 --- a/src/app/tests/TestEventLoggingNoUTCTime.cpp +++ b/src/app/tests/TestEventLoggingNoUTCTime.cpp @@ -84,11 +84,10 @@ class TestContext : public chip::Test::AppContext { public: // Performs shared setup for all tests in the test suite - CHIP_ERROR SetUpTestSuite() override + void SetUpTestSuite() override { - ReturnErrorOnFailure(chip::Test::AppContext::SetUpTestSuite()); + chip::Test::AppContext::SetUpTestSuite(); mClock.Emplace(chip::System::SystemClock()); - return CHIP_NO_ERROR; } // Performs shared teardown for all tests in the test suite @@ -99,7 +98,7 @@ class TestContext : public chip::Test::AppContext } // Performs setup for each individual test in the test suite - CHIP_ERROR SetUp() override + void SetUp() override { const chip::app::LogStorageResources logStorageResources[] = { { &gDebugEventBuffer[0], sizeof(gDebugEventBuffer), chip::app::PriorityLevel::Debug }, @@ -107,16 +106,14 @@ class TestContext : public chip::Test::AppContext { &gCritEventBuffer[0], sizeof(gCritEventBuffer), chip::app::PriorityLevel::Critical }, }; - ReturnErrorOnFailure(chip::Test::AppContext::SetUp()); + chip::Test::AppContext::SetUp(); CHIP_ERROR err = CHIP_NO_ERROR; - VerifyOrExit((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format())); + // TODO: use ASSERT_EQ, once transition to pw_unit_test is complete + VerifyOrDieWithMsg((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, AppServer, + "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format()); chip::app::EventManagement::CreateEventManagement(&GetExchangeManager(), ArraySize(logStorageResources), gCircularEventBuffer, logStorageResources, &mEventCounter); - - exit: - return err; } // Performs teardown for each individual test in the test suite diff --git a/src/app/tests/TestEventOverflow.cpp b/src/app/tests/TestEventOverflow.cpp index 3edc62a0445ca1..a328bec9783ef2 100644 --- a/src/app/tests/TestEventOverflow.cpp +++ b/src/app/tests/TestEventOverflow.cpp @@ -56,7 +56,7 @@ class TestContext : public chip::Test::AppContext { public: // Performs setup for each individual test in the test suite - CHIP_ERROR SetUp() override + void SetUp() override { const chip::app::LogStorageResources logStorageResources[] = { { &gDebugEventBuffer[0], sizeof(gDebugEventBuffer), chip::app::PriorityLevel::Debug }, @@ -64,16 +64,14 @@ class TestContext : public chip::Test::AppContext { &gCritEventBuffer[0], sizeof(gCritEventBuffer), chip::app::PriorityLevel::Critical }, }; - ReturnErrorOnFailure(chip::Test::AppContext::SetUp()); + chip::Test::AppContext::SetUp(); CHIP_ERROR err = CHIP_NO_ERROR; - VerifyOrExit((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format())); + // TODO: use ASSERT_EQ, once transition to pw_unit_test is complete + VerifyOrDieWithMsg((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, AppServer, + "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format()); chip::app::EventManagement::CreateEventManagement(&GetExchangeManager(), ArraySize(logStorageResources), gCircularEventBuffer, logStorageResources, &mEventCounter); - - exit: - return err; } // Performs teardown for each individual test in the test suite diff --git a/src/app/tests/TestFabricScopedEventLogging.cpp b/src/app/tests/TestFabricScopedEventLogging.cpp index d016ad5183e1c0..082aca0a2ecb7d 100644 --- a/src/app/tests/TestFabricScopedEventLogging.cpp +++ b/src/app/tests/TestFabricScopedEventLogging.cpp @@ -64,7 +64,7 @@ class TestContext : public chip::Test::AppContext { public: // Performs setup for each individual test in the test suite - CHIP_ERROR SetUp() override + void SetUp() override { const chip::app::LogStorageResources logStorageResources[] = { { &gDebugEventBuffer[0], sizeof(gDebugEventBuffer), chip::app::PriorityLevel::Debug }, @@ -72,16 +72,14 @@ class TestContext : public chip::Test::AppContext { &gCritEventBuffer[0], sizeof(gCritEventBuffer), chip::app::PriorityLevel::Critical }, }; - ReturnErrorOnFailure(chip::Test::AppContext::SetUp()); + chip::Test::AppContext::SetUp(); CHIP_ERROR err = CHIP_NO_ERROR; - VerifyOrExit((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format())); + // TODO: use ASSERT_EQ, once transition to pw_unit_test is complete + VerifyOrDieWithMsg((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, AppServer, + "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format()); chip::app::EventManagement::CreateEventManagement(&GetExchangeManager(), ArraySize(logStorageResources), gCircularEventBuffer, logStorageResources, &mEventCounter); - - exit: - return err; } // Performs teardown for each individual test in the test suite diff --git a/src/app/tests/TestReadInteraction.cpp b/src/app/tests/TestReadInteraction.cpp index 8173761b6ca83a..c327e832ce610b 100644 --- a/src/app/tests/TestReadInteraction.cpp +++ b/src/app/tests/TestReadInteraction.cpp @@ -79,9 +79,9 @@ class TestContext : public chip::Test::AppContext { public: // Performs shared setup for all tests in the test suite - CHIP_ERROR SetUpTestSuite() override + void SetUpTestSuite() override { - ReturnErrorOnFailure(chip::Test::AppContext::SetUpTestSuite()); + chip::Test::AppContext::SetUpTestSuite(); gRealClock = &chip::System::SystemClock(); chip::System::Clock::Internal::SetSystemClockForTesting(&gMockClock); @@ -94,8 +94,6 @@ class TestContext : public chip::Test::AppContext { gReportScheduler = chip::app::reporting::GetDefaultReportScheduler(); } - - return CHIP_NO_ERROR; } static int nlTestSetUpTestSuite_Sync(void * context) @@ -112,7 +110,7 @@ class TestContext : public chip::Test::AppContext } // Performs setup for each individual test in the test suite - CHIP_ERROR SetUp() override + void SetUp() override { const chip::app::LogStorageResources logStorageResources[] = { { &gDebugEventBuffer[0], sizeof(gDebugEventBuffer), chip::app::PriorityLevel::Debug }, @@ -120,16 +118,12 @@ class TestContext : public chip::Test::AppContext { &gCritEventBuffer[0], sizeof(gCritEventBuffer), chip::app::PriorityLevel::Critical }, }; - ReturnErrorOnFailure(chip::Test::AppContext::SetUp()); + chip::Test::AppContext::SetUp(); - CHIP_ERROR err = CHIP_NO_ERROR; - VerifyOrExit((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format())); + // TODO: change to ASSERT_EQ, once transition to pw_unit_test is complete + VerifyOrDie(mEventCounter.Init(0) == CHIP_NO_ERROR); chip::app::EventManagement::CreateEventManagement(&GetExchangeManager(), ArraySize(logStorageResources), gCircularEventBuffer, logStorageResources, &mEventCounter); - - exit: - return err; } // Performs teardown for each individual test in the test suite @@ -4244,7 +4238,7 @@ void TestReadInteraction::TestSubscribeClientReceiveUnsolicitedInvalidReportMess ctx.GetLoopback().mSentMessageCount = 0; auto exchange = InteractionModelEngine::GetInstance()->GetExchangeManager()->NewContext( - delegate.mpReadHandler->mSessionHandle.Get().Value(), delegate.mpReadHandler); + delegate.mpReadHandler->mSessionHandle.Get().Value(), delegate.mpReadHandler); delegate.mpReadHandler->mExchangeCtx.Grab(exchange); err = delegate.mpReadHandler->mExchangeCtx->SendMessage(Protocols::InteractionModel::MsgType::ReportData, std::move(msgBuf), Messaging::SendMessageFlags::kExpectResponse); @@ -4413,7 +4407,7 @@ void TestReadInteraction::TestSubscribeClientReceiveUnsolicitedReportMessageWith ctx.GetLoopback().mSentMessageCount = 0; auto exchange = InteractionModelEngine::GetInstance()->GetExchangeManager()->NewContext( - delegate.mpReadHandler->mSessionHandle.Get().Value(), delegate.mpReadHandler); + delegate.mpReadHandler->mSessionHandle.Get().Value(), delegate.mpReadHandler); delegate.mpReadHandler->mExchangeCtx.Grab(exchange); err = delegate.mpReadHandler->mExchangeCtx->SendMessage(Protocols::InteractionModel::MsgType::ReportData, std::move(msgBuf), Messaging::SendMessageFlags::kExpectResponse); diff --git a/src/app/tests/TestWriteInteraction.cpp b/src/app/tests/TestWriteInteraction.cpp index ce8c49176fabdf..16647ca523829e 100644 --- a/src/app/tests/TestWriteInteraction.cpp +++ b/src/app/tests/TestWriteInteraction.cpp @@ -55,22 +55,21 @@ class TestContext : public chip::Test::AppContext { public: // Performs setup for each individual test in the test suite - CHIP_ERROR SetUp() override + void SetUp() override { - ReturnErrorOnFailure(chip::Test::AppContext::SetUp()); + chip::Test::AppContext::SetUp(); gTestStorage.ClearStorage(); gGroupsProvider.SetStorageDelegate(&gTestStorage); gGroupsProvider.SetSessionKeystore(&gSessionKeystore); - ReturnErrorOnFailure(gGroupsProvider.Init()); + // TODO: use ASSERT_EQ, once transition to pw_unit_test is complete + VerifyOrDie(gGroupsProvider.Init() == CHIP_NO_ERROR); chip::Credentials::SetGroupDataProvider(&gGroupsProvider); uint8_t buf[sizeof(chip::CompressedFabricId)]; chip::MutableByteSpan span(buf); - ReturnErrorOnFailure(GetBobFabric()->GetCompressedFabricIdBytes(span)); - ReturnErrorOnFailure(chip::GroupTesting::InitData(&gGroupsProvider, GetBobFabricIndex(), span)); - - return CHIP_NO_ERROR; + VerifyOrDie(GetBobFabric()->GetCompressedFabricIdBytes(span) == CHIP_NO_ERROR); + VerifyOrDie(chip::GroupTesting::InitData(&gGroupsProvider, GetBobFabricIndex(), span) == CHIP_NO_ERROR); } // Performs teardown for each individual test in the test suite diff --git a/src/controller/tests/TestEventCaching.cpp b/src/controller/tests/TestEventCaching.cpp index dab191cd69ae65..f69f5614592db7 100644 --- a/src/controller/tests/TestEventCaching.cpp +++ b/src/controller/tests/TestEventCaching.cpp @@ -56,7 +56,7 @@ class TestContext : public chip::Test::AppContext { public: // Performs setup for each individual test in the test suite - CHIP_ERROR SetUp() override + void SetUp() override { const chip::app::LogStorageResources logStorageResources[] = { { &gDebugEventBuffer[0], sizeof(gDebugEventBuffer), chip::app::PriorityLevel::Debug }, @@ -64,16 +64,14 @@ class TestContext : public chip::Test::AppContext { &gCritEventBuffer[0], sizeof(gCritEventBuffer), chip::app::PriorityLevel::Critical }, }; - ReturnErrorOnFailure(chip::Test::AppContext::SetUp()); + chip::Test::AppContext::SetUp(); CHIP_ERROR err = CHIP_NO_ERROR; - VerifyOrExit((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format())); + // TODO: use ASSERT_EQ, once transition to pw_unit_test is complete + VerifyOrDieWithMsg((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, AppServer, + "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format()); chip::app::EventManagement::CreateEventManagement(&GetExchangeManager(), ArraySize(logStorageResources), gCircularEventBuffer, logStorageResources, &mEventCounter); - - exit: - return err; } // Performs teardown for each individual test in the test suite diff --git a/src/controller/tests/TestEventChunking.cpp b/src/controller/tests/TestEventChunking.cpp index 0555e3ef94560b..fb2b068fcbc0a0 100644 --- a/src/controller/tests/TestEventChunking.cpp +++ b/src/controller/tests/TestEventChunking.cpp @@ -60,7 +60,7 @@ class TestContext : public chip::Test::AppContext { public: // Performs setup for each individual test in the test suite - CHIP_ERROR SetUp() override + void SetUp() override { const chip::app::LogStorageResources logStorageResources[] = { { &gDebugEventBuffer[0], sizeof(gDebugEventBuffer), chip::app::PriorityLevel::Debug }, @@ -68,16 +68,14 @@ class TestContext : public chip::Test::AppContext { &gCritEventBuffer[0], sizeof(gCritEventBuffer), chip::app::PriorityLevel::Critical }, }; - ReturnErrorOnFailure(chip::Test::AppContext::SetUp()); + chip::Test::AppContext::SetUp(); CHIP_ERROR err = CHIP_NO_ERROR; - VerifyOrExit((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format())); + // TODO: use ASSERT_EQ, once transition to pw_unit_test is complete + VerifyOrDieWithMsg((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, AppServer, + "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format()); chip::app::EventManagement::CreateEventManagement(&GetExchangeManager(), ArraySize(logStorageResources), gCircularEventBuffer, logStorageResources, &mEventCounter); - - exit: - return err; } // Performs teardown for each individual test in the test suite diff --git a/src/controller/tests/TestEventNumberCaching.cpp b/src/controller/tests/TestEventNumberCaching.cpp index a0d93290253117..01526388f4e459 100644 --- a/src/controller/tests/TestEventNumberCaching.cpp +++ b/src/controller/tests/TestEventNumberCaching.cpp @@ -53,7 +53,7 @@ class TestContext : public chip::Test::AppContext { public: // Performs setup for each individual test in the test suite - CHIP_ERROR SetUp() override + void SetUp() override { const chip::app::LogStorageResources logStorageResources[] = { { &gDebugEventBuffer[0], sizeof(gDebugEventBuffer), chip::app::PriorityLevel::Debug }, @@ -61,16 +61,14 @@ class TestContext : public chip::Test::AppContext { &gCritEventBuffer[0], sizeof(gCritEventBuffer), chip::app::PriorityLevel::Critical }, }; - ReturnErrorOnFailure(chip::Test::AppContext::SetUp()); + chip::Test::AppContext::SetUp(); CHIP_ERROR err = CHIP_NO_ERROR; - VerifyOrExit((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format())); + // TODO: use ASSERT_EQ, once transition to pw_unit_test is complete + VerifyOrDieWithMsg((err = mEventCounter.Init(0)) == CHIP_NO_ERROR, AppServer, + "Init EventCounter failed: %" CHIP_ERROR_FORMAT, err.Format()); chip::app::EventManagement::CreateEventManagement(&GetExchangeManager(), ArraySize(logStorageResources), gCircularEventBuffer, logStorageResources, &mEventCounter); - - exit: - return err; } // Performs teardown for each individual test in the test suite diff --git a/src/messaging/tests/MessagingContext.h b/src/messaging/tests/MessagingContext.h index 7ae452b9678a90..9ed82de60e4d5d 100644 --- a/src/messaging/tests/MessagingContext.h +++ b/src/messaging/tests/MessagingContext.h @@ -212,15 +212,14 @@ class LoopbackMessagingContext : public LoopbackTransportManager, public Messagi virtual ~LoopbackMessagingContext() {} // Performs shared setup for all tests in the test suite - virtual CHIP_ERROR SetUpTestSuite() + virtual void SetUpTestSuite() { CHIP_ERROR err = CHIP_NO_ERROR; - VerifyOrExit((err = chip::Platform::MemoryInit()) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init CHIP memory failed: %" CHIP_ERROR_FORMAT, err.Format())); - VerifyOrExit((err = LoopbackTransportManager::Init()) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init LoopbackTransportManager failed: %" CHIP_ERROR_FORMAT, err.Format())); - exit: - return err; + // TODO: use ASSERT_EQ, once transition to pw_unit_test is complete + VerifyOrDieWithMsg((err = chip::Platform::MemoryInit()) == CHIP_NO_ERROR, AppServer, + "Init CHIP memory failed: %" CHIP_ERROR_FORMAT, err.Format()); + VerifyOrDieWithMsg((err = LoopbackTransportManager::Init()) == CHIP_NO_ERROR, AppServer, + "Init LoopbackTransportManager failed: %" CHIP_ERROR_FORMAT, err.Format()); } // Performs shared teardown for all tests in the test suite @@ -231,13 +230,11 @@ class LoopbackMessagingContext : public LoopbackTransportManager, public Messagi } // Performs setup for each individual test in the test suite - virtual CHIP_ERROR SetUp() + virtual void SetUp() { CHIP_ERROR err = CHIP_NO_ERROR; - VerifyOrExit((err = MessagingContext::Init(&GetTransportMgr(), &GetIOContext())) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init MessagingContext failed: %" CHIP_ERROR_FORMAT, err.Format())); - exit: - return err; + VerifyOrDieWithMsg((err = MessagingContext::Init(&GetTransportMgr(), &GetIOContext())) == CHIP_NO_ERROR, AppServer, + "Init MessagingContext failed: %" CHIP_ERROR_FORMAT, err.Format()); } // Performs teardown for each individual test in the test suite @@ -247,8 +244,8 @@ class LoopbackMessagingContext : public LoopbackTransportManager, public Messagi static int nlTestSetUpTestSuite(void * context) { - auto err = static_cast<LoopbackMessagingContext *>(context)->SetUpTestSuite(); - return err == CHIP_NO_ERROR ? SUCCESS : FAILURE; + static_cast<LoopbackMessagingContext *>(context)->SetUpTestSuite(); + return SUCCESS; } static int nlTestTearDownTestSuite(void * context) @@ -259,8 +256,8 @@ class LoopbackMessagingContext : public LoopbackTransportManager, public Messagi static int nlTestSetUp(void * context) { - auto err = static_cast<LoopbackMessagingContext *>(context)->SetUp(); - return err == CHIP_NO_ERROR ? SUCCESS : FAILURE; + static_cast<LoopbackMessagingContext *>(context)->SetUp(); + return SUCCESS; } static int nlTestTearDown(void * context) diff --git a/src/messaging/tests/TestAbortExchangesForFabric.cpp b/src/messaging/tests/TestAbortExchangesForFabric.cpp index 6dc5d8c2775cd3..a7ccef8cb10583 100644 --- a/src/messaging/tests/TestAbortExchangesForFabric.cpp +++ b/src/messaging/tests/TestAbortExchangesForFabric.cpp @@ -51,13 +51,12 @@ using namespace chip::Protocols; struct TestContext : Test::LoopbackMessagingContext { - virtual CHIP_ERROR SetUp() + void SetUp() override { #if CHIP_CRYPTO_PSA ReturnErrorOnFailure(psa_crypto_init() == PSA_SUCCESS ? CHIP_NO_ERROR : CHIP_ERROR_INTERNAL); #endif - ReturnErrorOnFailure(chip::Test::LoopbackMessagingContext::SetUp()); - return CHIP_NO_ERROR; + chip::Test::LoopbackMessagingContext::SetUp(); } }; diff --git a/src/messaging/tests/TestExchangeMgr.cpp b/src/messaging/tests/TestExchangeMgr.cpp index f85bebe455259e..0a9182db4478ce 100644 --- a/src/messaging/tests/TestExchangeMgr.cpp +++ b/src/messaging/tests/TestExchangeMgr.cpp @@ -55,13 +55,12 @@ struct TestContext : Test::LoopbackMessagingContext { // TODO Add TearDown function during changing test framework to Pigweed to make it more clear how does it work. // Currently, the TearDown function is from LoopbackMessagingContext - virtual CHIP_ERROR SetUp() + void SetUp() override { #if CHIP_CRYPTO_PSA ReturnErrorOnFailure(psa_crypto_init() == PSA_SUCCESS ? CHIP_NO_ERROR : CHIP_ERROR_INTERNAL); #endif - ReturnErrorOnFailure(chip::Test::LoopbackMessagingContext::SetUp()); - return CHIP_NO_ERROR; + chip::Test::LoopbackMessagingContext::SetUp(); } }; diff --git a/src/messaging/tests/TestReliableMessageProtocol.cpp b/src/messaging/tests/TestReliableMessageProtocol.cpp index 4636193bb06378..a5dc9b07474998 100644 --- a/src/messaging/tests/TestReliableMessageProtocol.cpp +++ b/src/messaging/tests/TestReliableMessageProtocol.cpp @@ -77,15 +77,14 @@ class TestContext : public chip::Test::LoopbackMessagingContext { public: // Performs setup for each individual test in the test suite - CHIP_ERROR SetUp() override + void SetUp() override { #if CHIP_CRYPTO_PSA - ReturnErrorOnFailure(psa_crypto_init() == PSA_SUCCESS ? CHIP_NO_ERROR : CHIP_ERROR_INTERNAL); + VerifyOrDie(psa_crypto_init() == PSA_SUCCESS); #endif - ReturnErrorOnFailure(chip::Test::LoopbackMessagingContext::SetUp()); + chip::Test::LoopbackMessagingContext::SetUp(); GetSessionAliceToBob()->AsSecureSession()->SetRemoteSessionParameters(GetLocalMRPConfig().ValueOr(GetDefaultMRPConfig())); GetSessionBobToAlice()->AsSecureSession()->SetRemoteSessionParameters(GetLocalMRPConfig().ValueOr(GetDefaultMRPConfig())); - return CHIP_NO_ERROR; } }; diff --git a/src/protocols/secure_channel/tests/TestCASESession.cpp b/src/protocols/secure_channel/tests/TestCASESession.cpp index df4a2edf05ea29..5cf290b4248abe 100644 --- a/src/protocols/secure_channel/tests/TestCASESession.cpp +++ b/src/protocols/secure_channel/tests/TestCASESession.cpp @@ -61,7 +61,7 @@ class TestContext : public Test::LoopbackMessagingContext { public: // Performs shared setup for all tests in the test suite - CHIP_ERROR SetUpTestSuite() override; + void SetUpTestSuite() override; // Performs shared teardown for all tests in the test suite void TearDownTestSuite() override; }; @@ -327,22 +327,20 @@ CHIP_ERROR InitCredentialSets() return CHIP_NO_ERROR; } -CHIP_ERROR TestContext::SetUpTestSuite() +void TestContext::SetUpTestSuite() { ConfigInitializeNodes(false); CHIP_ERROR err = CHIP_NO_ERROR; - VerifyOrExit((err = LoopbackMessagingContext::SetUpTestSuite()) == CHIP_NO_ERROR, - ChipLogError(AppServer, "SetUpTestSuite lo messaging context failed: %" CHIP_ERROR_FORMAT, err.Format())); - VerifyOrExit((err = chip::DeviceLayer::PlatformMgr().InitChipStack()) == CHIP_NO_ERROR, - ChipLogError(AppServer, "Init CHIP stack failed: %" CHIP_ERROR_FORMAT, err.Format())); - VerifyOrExit((err = InitFabricTable(gCommissionerFabrics, &gCommissionerStorageDelegate, /* opKeyStore = */ nullptr, - &gCommissionerOpCertStore)) == CHIP_NO_ERROR, - ChipLogError(AppServer, "InitFabricTable failed: %" CHIP_ERROR_FORMAT, err.Format())); - VerifyOrExit((err = InitCredentialSets()) == CHIP_NO_ERROR, - ChipLogError(AppServer, "InitCredentialSets failed: %" CHIP_ERROR_FORMAT, err.Format())); + LoopbackMessagingContext::SetUpTestSuite(); + // TODO: use ASSERT_EQ, once transition to pw_unit_test is complete + VerifyOrDieWithMsg((err = chip::DeviceLayer::PlatformMgr().InitChipStack()) == CHIP_NO_ERROR, AppServer, + "Init CHIP stack failed: %" CHIP_ERROR_FORMAT, err.Format()); + VerifyOrDieWithMsg((err = InitFabricTable(gCommissionerFabrics, &gCommissionerStorageDelegate, /* opKeyStore = */ nullptr, + &gCommissionerOpCertStore)) == CHIP_NO_ERROR, + AppServer, "InitFabricTable failed: %" CHIP_ERROR_FORMAT, err.Format()); + VerifyOrDieWithMsg((err = InitCredentialSets()) == CHIP_NO_ERROR, AppServer, "InitCredentialSets failed: %" CHIP_ERROR_FORMAT, + err.Format()); chip::DeviceLayer::SetSystemLayerForTesting(&GetSystemLayer()); -exit: - return err; } void TestContext::TearDownTestSuite() @@ -1042,9 +1040,9 @@ void TestCASESession::SessionResumptionStorage(nlTestSuite * inSuite, void * inC &gDeviceGroupDataProvider) == CHIP_NO_ERROR); ExchangeContext * contextCommissioner = ctx.NewUnauthenticatedExchangeToBob(pairingCommissioner); auto establishmentReturnVal = pairingCommissioner->EstablishSession( - ctx.GetSecureSessionManager(), &gCommissionerFabrics, ScopedNodeId{ Node01_01, gCommissionerFabricIndex }, - contextCommissioner, &testVectors[i].initiatorStorage, nullptr, &delegateCommissioner, - Optional<ReliableMessageProtocolConfig>::Missing()); + ctx.GetSecureSessionManager(), &gCommissionerFabrics, ScopedNodeId{ Node01_01, gCommissionerFabricIndex }, + contextCommissioner, &testVectors[i].initiatorStorage, nullptr, &delegateCommissioner, + Optional<ReliableMessageProtocolConfig>::Missing()); ServiceEvents(ctx); NL_TEST_ASSERT(inSuite, establishmentReturnVal == CHIP_NO_ERROR); NL_TEST_ASSERT(inSuite, loopback.mSentMessageCount == testVectors[i].expectedSentMessageCount); diff --git a/src/protocols/secure_channel/tests/TestPASESession.cpp b/src/protocols/secure_channel/tests/TestPASESession.cpp index 073a2afb6ae651..b25252f15b7385 100644 --- a/src/protocols/secure_channel/tests/TestPASESession.cpp +++ b/src/protocols/secure_channel/tests/TestPASESession.cpp @@ -89,10 +89,10 @@ class TestContext : public chip::Test::LoopbackMessagingContext { public: // Performs shared setup for all tests in the test suite - CHIP_ERROR SetUpTestSuite() override + void SetUpTestSuite() override { ConfigInitializeNodes(false); - return chip::Test::LoopbackMessagingContext::SetUpTestSuite(); + chip::Test::LoopbackMessagingContext::SetUpTestSuite(); } }; From a513155b2d6e443e53325116731afe7e6dfe98d6 Mon Sep 17 00:00:00 2001 From: "Restyled.io" <commits@restyled.io> Date: Tue, 23 Apr 2024 11:24:17 +0000 Subject: [PATCH 124/124] Restyled by clang-format --- src/app/tests/TestReadInteraction.cpp | 4 ++-- src/protocols/secure_channel/tests/TestCASESession.cpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/tests/TestReadInteraction.cpp b/src/app/tests/TestReadInteraction.cpp index c327e832ce610b..7e18cca7883c8f 100644 --- a/src/app/tests/TestReadInteraction.cpp +++ b/src/app/tests/TestReadInteraction.cpp @@ -4238,7 +4238,7 @@ void TestReadInteraction::TestSubscribeClientReceiveUnsolicitedInvalidReportMess ctx.GetLoopback().mSentMessageCount = 0; auto exchange = InteractionModelEngine::GetInstance()->GetExchangeManager()->NewContext( - delegate.mpReadHandler->mSessionHandle.Get().Value(), delegate.mpReadHandler); + delegate.mpReadHandler->mSessionHandle.Get().Value(), delegate.mpReadHandler); delegate.mpReadHandler->mExchangeCtx.Grab(exchange); err = delegate.mpReadHandler->mExchangeCtx->SendMessage(Protocols::InteractionModel::MsgType::ReportData, std::move(msgBuf), Messaging::SendMessageFlags::kExpectResponse); @@ -4407,7 +4407,7 @@ void TestReadInteraction::TestSubscribeClientReceiveUnsolicitedReportMessageWith ctx.GetLoopback().mSentMessageCount = 0; auto exchange = InteractionModelEngine::GetInstance()->GetExchangeManager()->NewContext( - delegate.mpReadHandler->mSessionHandle.Get().Value(), delegate.mpReadHandler); + delegate.mpReadHandler->mSessionHandle.Get().Value(), delegate.mpReadHandler); delegate.mpReadHandler->mExchangeCtx.Grab(exchange); err = delegate.mpReadHandler->mExchangeCtx->SendMessage(Protocols::InteractionModel::MsgType::ReportData, std::move(msgBuf), Messaging::SendMessageFlags::kExpectResponse); diff --git a/src/protocols/secure_channel/tests/TestCASESession.cpp b/src/protocols/secure_channel/tests/TestCASESession.cpp index 5cf290b4248abe..1ef821f30c8b50 100644 --- a/src/protocols/secure_channel/tests/TestCASESession.cpp +++ b/src/protocols/secure_channel/tests/TestCASESession.cpp @@ -1040,9 +1040,9 @@ void TestCASESession::SessionResumptionStorage(nlTestSuite * inSuite, void * inC &gDeviceGroupDataProvider) == CHIP_NO_ERROR); ExchangeContext * contextCommissioner = ctx.NewUnauthenticatedExchangeToBob(pairingCommissioner); auto establishmentReturnVal = pairingCommissioner->EstablishSession( - ctx.GetSecureSessionManager(), &gCommissionerFabrics, ScopedNodeId{ Node01_01, gCommissionerFabricIndex }, - contextCommissioner, &testVectors[i].initiatorStorage, nullptr, &delegateCommissioner, - Optional<ReliableMessageProtocolConfig>::Missing()); + ctx.GetSecureSessionManager(), &gCommissionerFabrics, ScopedNodeId{ Node01_01, gCommissionerFabricIndex }, + contextCommissioner, &testVectors[i].initiatorStorage, nullptr, &delegateCommissioner, + Optional<ReliableMessageProtocolConfig>::Missing()); ServiceEvents(ctx); NL_TEST_ASSERT(inSuite, establishmentReturnVal == CHIP_NO_ERROR); NL_TEST_ASSERT(inSuite, loopback.mSentMessageCount == testVectors[i].expectedSentMessageCount);