From 8376d649cd72fee6fad30d56449cf02153fd8788 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Fri, 25 Mar 2022 13:48:16 +0900 Subject: [PATCH 01/16] Modify a definition for dummy tlvs size Change-Id: Iea95c8ce2b1735502100349c6dc264e866ba7e1b Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-network.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unittest/thread-unittest-network.cpp b/tests/unittest/thread-unittest-network.cpp index 9e15b29..82e71b1 100644 --- a/tests/unittest/thread-unittest-network.cpp +++ b/tests/unittest/thread-unittest-network.cpp @@ -21,11 +21,11 @@ #define NETWORK_DATA_SIZE 256 #define NETWORK_TLVS_SIZE 1024 -#define DUMMY_TLVS_SIZE 106 #define DUMMY_TLVS_STR "0e080000000000010000000300001935060004001" \ "fffe00208763d64768c8f3ecf0708fdd10ceaadb65a7b05105e1ec3e" \ "16d3e0aee52fb7e618a759973030f4f70656e5468726561642d34633" \ "33801024c3804103044b2dc6512dce13b11d3386eb2ce7e0c0402a0fff8" +#define DUMMY_TLVS_SIZE (sizeof(DUMMY_TLVS_STR) / 2) #define DUMMY_IPV6_ADDRESS "fe80::1ee5:a5a9:8bd2:68de" class ThreadNetworkTest : public ::testing::Test -- 2.7.4 From df29348c5e4475fc80ab44031d3663850dfb108b Mon Sep 17 00:00:00 2001 From: Wootak Jung Date: Fri, 25 Mar 2022 11:18:46 +0900 Subject: [PATCH 02/16] Add new API to get the panid from operational network Change-Id: I658dfd3d29753b0c24024b74b172398b8ac4e54a Signed-off-by: hyunuk.tak --- include/thread.h | 21 +++++++++++++++++++++ src/thread-network.c | 24 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/include/thread.h b/include/thread.h index f430ea6..36fbb4e 100644 --- a/include/thread.h +++ b/include/thread.h @@ -363,6 +363,27 @@ int thread_network_get_active_dataset_tlvs(thread_instance_h instance, /** * @ingroup CAPI_NETWORK_THREAD_MODULE + * @brief Get the PanId from Operational Network + * @since_tizen 7.0 + * + * @param[out] panid The PanId + * + * @return 0 on success, otherwise a negative error value. + * @retval #THREAD_ERROR_NONE Successful + * @retval #THREAD_ERROR_NOT_INITIALIZED Not initialized + * @retval #THREAD_ERROR_OPERATION_FAILED Operation failed + * @retval #THREAD_ERROR_NOT_SUPPORTED Not supported + * + * @pre thread API must be initialized with thread_initialize(). + * @pre Active Operational Dataset must be set using thread_set_active_dataset_tlvs(). + * + * @see thread_network_create_operational_network() + * @see thread_set_active_dataset_tlvs() + */ +int thread_network_get_panid(thread_instance_h instance, uint16_t *panid); + +/** + * @ingroup CAPI_NETWORK_THREAD_MODULE * @brief Attach the OT hardware to the active Operational Network, which is pre-set * @since_tizen 7.0 * diff --git a/src/thread-network.c b/src/thread-network.c index 9ec8254..83bf963 100644 --- a/src/thread-network.c +++ b/src/thread-network.c @@ -236,6 +236,30 @@ int thread_network_get_active_dataset_tlvs(thread_instance_h instance, return ret; } +int thread_network_get_panid(thread_instance_h instance, uint16_t *panid) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(instance); + THREAD_VALIDATE_INPUT_PARAMETER(panid); + + int ret = THREAD_ERROR_NONE; + GVariant *out = NULL; + + /* get "PanId" dbus property */ + ret = _thread_dbus_get_property( + THREAD_DBUS_PROPERTY_PANID, &out); + retv_if(ret != THREAD_ERROR_NONE, ret); + + g_variant_get(out, "q", panid); + THREAD_DBG("Thread PanId: %u", (size_t)*panid); + g_variant_unref(out); + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + static int __thread_attach_active_network() { FUNC_ENTRY; -- 2.7.4 From fc1a0239f69538d8ee0003fa32d7935390b94b88 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Fri, 25 Mar 2022 14:30:22 +0900 Subject: [PATCH 03/16] Add joiner test case for joiner start Change-Id: If16289acf415effc8fc6932d1857436e8e84ab33 Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-joiner.cpp | 73 +++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 tests/unittest/thread-unittest-joiner.cpp diff --git a/tests/unittest/thread-unittest-joiner.cpp b/tests/unittest/thread-unittest-joiner.cpp new file mode 100644 index 0000000..6c12fd4 --- /dev/null +++ b/tests/unittest/thread-unittest-joiner.cpp @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2022 Samsung Electronics Co., Ltd 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 + +#include "thread.h" + +class ThreadJoinerTest : public ::testing::Test +{ +public: + const char *pskd = "Passkey"; + const char *provUrl = "ProvUrl"; + const char *vendorName = "VendorName"; + const char *vendorModel = "VendorModel"; + const char *vendorSwVersion = "VendorSwVersion"; + const char *vendorData = "VendorData"; + + thread_instance_h instance; + +public: + static void joinerStartCallback(int result, void* user_data) {}; + +protected: + void SetUp() override + { + thread_initialize(); + instance = nullptr; + } + + void TearDown() override + { + thread_deinitialize(); + } +}; + +TEST_F(ThreadJoinerTest, JoinerStartNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_joiner_start(instance, pskd, provUrl, + vendorName, vendorModel, vendorSwVersion, + vendorData, joinerStartCallback, nullptr)); +} + +TEST_F(ThreadJoinerTest, JoinerStartInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_joiner_start(instance, pskd, provUrl, + vendorName, vendorModel, vendorSwVersion, + vendorData, joinerStartCallback, nullptr)); +} + +TEST_F(ThreadJoinerTest, JoinerStartAttachErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_joiner_start(instance, pskd, provUrl, + vendorName, vendorModel, vendorSwVersion, + vendorData, joinerStartCallback, nullptr)); +} \ No newline at end of file -- 2.7.4 From 6cd845faee53e2e2039b6482031b7794731d430c Mon Sep 17 00:00:00 2001 From: Wootak Jung Date: Fri, 25 Mar 2022 14:29:27 +0900 Subject: [PATCH 04/16] Add test cases for panid related function Change-Id: If14ff40946bfb91d73fba8a39ce54d81b79152cc Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dummy.cpp | 12 +++++++++++- tests/unittest/thread-unittest-network.cpp | 28 +++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index 2724c6d..c9ed50f 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -132,6 +132,11 @@ static GVariant *__property_set_active_dataset_tlvs() return g_variant_new("(i)", THREAD_ERROR_NONE); } +static GVariant *__property_get_panid() +{ + return g_variant_new("(v)", g_variant_new("q", 65535)); +} + struct { const gchar *interface_name; const gchar *signal_name; @@ -223,6 +228,11 @@ struct { __property_set_active_dataset_tlvs, }, { + "Get", + THREAD_DBUS_PROPERTY_PANID, + __property_get_panid, + }, + { NULL, NULL, NULL, @@ -313,4 +323,4 @@ GVariant *_get_gdbus_async_result(GError **error) _gdbus_async_result.timeout_id = 0; } return _gdbus_async_result.result; -} \ No newline at end of file +} diff --git a/tests/unittest/thread-unittest-network.cpp b/tests/unittest/thread-unittest-network.cpp index 82e71b1..12919e6 100644 --- a/tests/unittest/thread-unittest-network.cpp +++ b/tests/unittest/thread-unittest-network.cpp @@ -294,4 +294,30 @@ TEST_F(ThreadNetworkTest, RemoveIpAddrErrorNone) EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_remove_ipaddr(instance, ipv6Address)); -} \ No newline at end of file +} + +TEST_F(ThreadNetworkTest, GetPanIdNotInitialized) +{ + uint16_t panid; + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_network_get_panid(instance, &panid)); +} + +TEST_F(ThreadNetworkTest, GetPanIdInvalidParameter) +{ + uint16_t panid; + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_network_get_panid(instance, &panid)); +} + +TEST_F(ThreadNetworkTest, GetPanIdErrorNone) +{ + uint16_t panid; + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, tlvsBufferLength)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_network_get_panid(instance, &panid)); + EXPECT_EQ(panid, panId); +} -- 2.7.4 From 6d726c3b2c50c8c19c478fbd8cf60d20f985050f Mon Sep 17 00:00:00 2001 From: Wootak Jung Date: Fri, 25 Mar 2022 15:01:15 +0900 Subject: [PATCH 05/16] Remove unnecessary check logic Change-Id: Ifde619efbe832bc38e300d8c1093a9dbcdb553c3 Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-network.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unittest/thread-unittest-network.cpp b/tests/unittest/thread-unittest-network.cpp index 12919e6..09d7861 100644 --- a/tests/unittest/thread-unittest-network.cpp +++ b/tests/unittest/thread-unittest-network.cpp @@ -319,5 +319,4 @@ TEST_F(ThreadNetworkTest, GetPanIdErrorNone) thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, tlvsBufferLength)); EXPECT_EQ(THREAD_ERROR_NONE, thread_network_get_panid(instance, &panid)); - EXPECT_EQ(panid, panId); } -- 2.7.4 From c0d31febd62d10b322c7d5373a4857c0d41d37bb Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Fri, 25 Mar 2022 16:18:03 +0900 Subject: [PATCH 06/16] Remove unnecessary iteration for joiner start Change-Id: Ifdf04d208ea5a8e9504bc42395d02701ecc395a9 Signed-off-by: hyunuk.tak --- src/thread-util.c | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/src/thread-util.c b/src/thread-util.c index 81e96bb..31a198a 100644 --- a/src/thread-util.c +++ b/src/thread-util.c @@ -102,7 +102,6 @@ int __thread_dbus_handle_joiner_start_cb(gboolean res, GVariant *val, gpointer { FUNC_ENTRY; int ret = THREAD_ERROR_NONE; - GVariantIter *iter; char *pskd = NULL; char *prov_url = NULL; char *vendor_name = NULL; @@ -118,26 +117,16 @@ int __thread_dbus_handle_joiner_start_cb(gboolean res, GVariant *val, gpointer goto end; } - g_variant_get(val, "(ssssss)", &iter); - - while (g_variant_iter_loop(iter, "(&s&s&s&s&s&s)", - &pskd, &prov_url, &vendor_name, &vendor_model, - &vendor_sw_ver, &vendor_data)) { - - THREAD_DBG("Got the thread beacon..."); - THREAD_DBG("pskd: %s", pskd); + g_variant_get(val, "(ssssss)", &pskd, &prov_url, &vendor_name, + &vendor_model, &vendor_sw_ver, &vendor_data); - THREAD_DBG("pskd: %s", pskd); - THREAD_DBG("prov_url: %s", prov_url); - THREAD_DBG("vendor_name: %s", vendor_name); - THREAD_DBG("vendor_model: %s", vendor_model); - THREAD_DBG("vendor_sw_ver: %s", vendor_sw_ver); - THREAD_DBG("vendor_data: %s", vendor_data); - - if (cb_data && cb_data->callback) - ((thread_joiner_result_cb)(cb_data->callback))(res, user_data); - } - g_variant_iter_free(iter); + THREAD_DBG("Got the thread beacon..."); + THREAD_DBG("pskd: %s", pskd); + THREAD_DBG("prov_url: %s", prov_url); + THREAD_DBG("vendor_name: %s", vendor_name); + THREAD_DBG("vendor_model: %s", vendor_model); + THREAD_DBG("vendor_sw_ver: %s", vendor_sw_ver); + THREAD_DBG("vendor_data: %s", vendor_data); end: if (cb_data && cb_data->callback) -- 2.7.4 From b5fb84aa1963b0838144c7e425f30e8f0bf39904 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Fri, 25 Mar 2022 19:12:46 +0900 Subject: [PATCH 07/16] Add jointer test case for joiner start async Change-Id: I75a232293fb181a58411bb36baa2e7fd9444595d Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dummy.cpp | 28 ++++++++++++++++++++++++++++ tests/unittest/thread-unittest-joiner.cpp | 13 +++++++++++-- tests/unittest/thread-unittest-network.cpp | 2 +- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index c9ed50f..2a778e5 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -107,6 +107,29 @@ static GVariant *__method_detach(GVariant *parameters) return g_variant_new("(i)", THREAD_ERROR_NONE); } +static GVariant *__make_joiner_start_result() +{ + const char *pskd = "Passkey"; + const char *provUrl = "ProvUrl"; + const char *vendorName = "VendorName"; + const char *vendorModel = "VendorModel"; + const char *vendorSwVersion = "VendorSwVersion"; + const char *vendorData = "VendorData"; + + return g_variant_new("(ssssss)", pskd, provUrl, + vendorName, vendorModel, vendorSwVersion, vendorData); +} + +static void __method_joiner_start(GVariant *parameters, + GAsyncReadyCallback callback, gpointer user_data) +{ + _gdbus_async_result.callback = callback; + _gdbus_async_result.result = __make_joiner_start_result(); + _gdbus_async_result.user_data = user_data; + _gdbus_async_result.timeout_id = g_timeout_add( + ASYNC_RESULT_DELAY, __reply_async_method, &_gdbus_async_result); +} + static GVariant *__property_device_role() { return g_variant_new("(v)", g_variant_new("s", "child")); @@ -191,6 +214,11 @@ struct { NULL, }, { + THREAD_DBUS_JOINER_START_METHOD, + NULL, + __method_joiner_start, + }, + { NULL, NULL, NULL, diff --git a/tests/unittest/thread-unittest-joiner.cpp b/tests/unittest/thread-unittest-joiner.cpp index 6c12fd4..0fc22fa 100644 --- a/tests/unittest/thread-unittest-joiner.cpp +++ b/tests/unittest/thread-unittest-joiner.cpp @@ -17,6 +17,7 @@ #include #include "thread.h" +#include "mocks/thread-mock-util.h" class ThreadJoinerTest : public ::testing::Test { @@ -31,7 +32,7 @@ public: thread_instance_h instance; public: - static void joinerStartCallback(int result, void* user_data) {}; + static void joinerStartCallback(int result, void* user_data); protected: void SetUp() override @@ -46,6 +47,12 @@ protected: } }; +void ThreadJoinerTest::joinerStartCallback(int result, void* user_data) +{ + if (result == true) + QUIT_GMAIN_LOOP; +} + TEST_F(ThreadJoinerTest, JoinerStartNotInitialized) { EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); @@ -63,11 +70,13 @@ TEST_F(ThreadJoinerTest, JoinerStartInvalidParameter) vendorData, joinerStartCallback, nullptr)); } -TEST_F(ThreadJoinerTest, JoinerStartAttachErrorNone) +TEST_F(ThreadJoinerTest, JoinerStartErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_joiner_start(instance, pskd, provUrl, vendorName, vendorModel, vendorSwVersion, vendorData, joinerStartCallback, nullptr)); + + RUN_GMAIN_LOOP; } \ No newline at end of file diff --git a/tests/unittest/thread-unittest-network.cpp b/tests/unittest/thread-unittest-network.cpp index 09d7861..08c6b87 100644 --- a/tests/unittest/thread-unittest-network.cpp +++ b/tests/unittest/thread-unittest-network.cpp @@ -25,7 +25,7 @@ "fffe00208763d64768c8f3ecf0708fdd10ceaadb65a7b05105e1ec3e" \ "16d3e0aee52fb7e618a759973030f4f70656e5468726561642d34633" \ "33801024c3804103044b2dc6512dce13b11d3386eb2ce7e0c0402a0fff8" -#define DUMMY_TLVS_SIZE (sizeof(DUMMY_TLVS_STR) / 2) +#define DUMMY_TLVS_SIZE ((int)(sizeof(DUMMY_TLVS_STR) / 2)) #define DUMMY_IPV6_ADDRESS "fe80::1ee5:a5a9:8bd2:68de" class ThreadNetworkTest : public ::testing::Test -- 2.7.4 From ca9e589d77d3654c9541fad5cbb8213b4932fd6f Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Fri, 25 Mar 2022 19:29:50 +0900 Subject: [PATCH 08/16] Add joiner test case for joiner stop Change-Id: If9991261397b4129fcca813f984bc8d23eaf6ea3 Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dummy.cpp | 10 ++++++++++ tests/unittest/thread-unittest-joiner.cpp | 17 +++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index 2a778e5..4dba5a7 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -130,6 +130,11 @@ static void __method_joiner_start(GVariant *parameters, ASYNC_RESULT_DELAY, __reply_async_method, &_gdbus_async_result); } +static GVariant *__method_joiner_stop(GVariant *parameters) +{ + return g_variant_new("(i)", THREAD_ERROR_NONE); +} + static GVariant *__property_device_role() { return g_variant_new("(v)", g_variant_new("s", "child")); @@ -219,6 +224,11 @@ struct { __method_joiner_start, }, { + THREAD_DBUS_JOINER_STOP_METHOD, + __method_joiner_stop, + NULL, + }, + { NULL, NULL, NULL, diff --git a/tests/unittest/thread-unittest-joiner.cpp b/tests/unittest/thread-unittest-joiner.cpp index 0fc22fa..3d49b1f 100644 --- a/tests/unittest/thread-unittest-joiner.cpp +++ b/tests/unittest/thread-unittest-joiner.cpp @@ -79,4 +79,21 @@ TEST_F(ThreadJoinerTest, JoinerStartErrorNone) vendorData, joinerStartCallback, nullptr)); RUN_GMAIN_LOOP; +} + +TEST_F(ThreadJoinerTest, JoinerStopNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_joiner_stop(instance)); +} + +TEST_F(ThreadJoinerTest, JoinerStopInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_joiner_stop(instance)); +} + +TEST_F(ThreadJoinerTest, JoinerStopErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_joiner_stop(instance)); } \ No newline at end of file -- 2.7.4 From 639006c431f7110346440136c04dc6b77658bd93 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Fri, 25 Mar 2022 19:35:02 +0900 Subject: [PATCH 09/16] Add joiner test case for joining by network key Change-Id: I064c2775e58dd050fee74336fe50fa79fba951ca Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-joiner.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/unittest/thread-unittest-joiner.cpp b/tests/unittest/thread-unittest-joiner.cpp index 3d49b1f..31812c4 100644 --- a/tests/unittest/thread-unittest-joiner.cpp +++ b/tests/unittest/thread-unittest-joiner.cpp @@ -28,6 +28,8 @@ public: const char *vendorModel = "VendorModel"; const char *vendorSwVersion = "VendorSwVersion"; const char *vendorData = "VendorData"; + const char *networkKey = "11112233445566778899AAAA1111BBBB"; + const char *panId = "0x1234"; thread_instance_h instance; @@ -96,4 +98,24 @@ TEST_F(ThreadJoinerTest, JoinerStopErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_joiner_stop(instance)); +} + +TEST_F(ThreadJoinerTest, JoinByNetworkKeyNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_joiner_join_by_network_key(instance, networkKey, panId)); +} + +TEST_F(ThreadJoinerTest, JoinByNetworkKeyInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_joiner_join_by_network_key(instance, networkKey, panId)); +} + +TEST_F(ThreadJoinerTest, JoinByNetworkKeyErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_joiner_join_by_network_key(instance, networkKey, panId)); } \ No newline at end of file -- 2.7.4 From 7728af051f3385c8f70f9fd88faffb8c206093f5 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 28 Mar 2022 10:19:21 +0900 Subject: [PATCH 10/16] Use &s when get the string value Change-Id: I1214d133b1aa0c4812638cc1db146c12a789c661 Signed-off-by: hyunuk.tak --- src/thread-util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/thread-util.c b/src/thread-util.c index 31a198a..a5b41bd 100644 --- a/src/thread-util.c +++ b/src/thread-util.c @@ -117,7 +117,7 @@ int __thread_dbus_handle_joiner_start_cb(gboolean res, GVariant *val, gpointer goto end; } - g_variant_get(val, "(ssssss)", &pskd, &prov_url, &vendor_name, + g_variant_get(val, "(&s&s&s&s&s&s)", &pskd, &prov_url, &vendor_name, &vendor_model, &vendor_sw_ver, &vendor_data); THREAD_DBG("Got the thread beacon..."); -- 2.7.4 From c2409af9ed31052739cda739f40cd2ad22f1c212 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 28 Mar 2022 11:43:13 +0900 Subject: [PATCH 11/16] Add border router test case for enable Change-Id: If13d70028f943d9d56d5e0a368cbd3392a5600a1 Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-br.cpp | 54 +++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 tests/unittest/thread-unittest-br.cpp diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp new file mode 100644 index 0000000..70ad72c --- /dev/null +++ b/tests/unittest/thread-unittest-br.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2022 Samsung Electronics Co., Ltd 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 + +#include "thread.h" + +class ThreadBRTest : public ::testing::Test +{ +public: + thread_instance_h instance; + +protected: + void SetUp() override + { + thread_initialize(); + instance = nullptr; + } + + void TearDown() override + { + thread_deinitialize(); + } +}; + +TEST_F(ThreadBRTest, BREnableNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_br_enable(instance)); +} + +TEST_F(ThreadBRTest, BREnableInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_br_enable(instance)); +} + +TEST_F(ThreadBRTest, BREnableErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_br_enable(instance)); +} \ No newline at end of file -- 2.7.4 From 223e75f6e940099edcf606f8b31f31210041d626 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 28 Mar 2022 11:47:58 +0900 Subject: [PATCH 12/16] Add to clean up after used API for instance Change-Id: I18b6e08f31df25d67462ea2e945860b93c3470ee Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-joiner.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/unittest/thread-unittest-joiner.cpp b/tests/unittest/thread-unittest-joiner.cpp index 31812c4..2b073ef 100644 --- a/tests/unittest/thread-unittest-joiner.cpp +++ b/tests/unittest/thread-unittest-joiner.cpp @@ -45,6 +45,8 @@ protected: void TearDown() override { + if (instance) + thread_disable(instance); thread_deinitialize(); } }; -- 2.7.4 From 209bd1a22cfffa7f237b59e7f4dbec263fa8705a Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 28 Mar 2022 11:49:59 +0900 Subject: [PATCH 13/16] Add border router test case for disable Change-Id: I37868e3308838dc4f774f80afaa200d592e589b6 Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-br.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index 70ad72c..ce26fac 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -32,6 +32,8 @@ protected: void TearDown() override { + if (instance) + thread_disable(instance); thread_deinitialize(); } }; @@ -51,4 +53,22 @@ TEST_F(ThreadBRTest, BREnableErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_br_enable(instance)); +} + +TEST_F(ThreadBRTest, BRDisableNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_br_disable(instance)); +} + +TEST_F(ThreadBRTest, BRDisableInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_br_disable(instance)); +} + +TEST_F(ThreadBRTest, BRDisableErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_br_enable(instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_br_disable(instance)); } \ No newline at end of file -- 2.7.4 From c938c4e949d24e6056cd517ea6c23a2b5b3b0755 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 28 Mar 2022 16:05:34 +0900 Subject: [PATCH 14/16] Add border router test case for getting external routes Change-Id: If5e0ec0ea36654a881b894abf7d00210d30f8585 Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dummy.cpp | 44 ++++++++++++++++++++++++++++++ tests/unittest/thread-unittest-br.cpp | 35 ++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index 4dba5a7..52de67d 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -14,6 +14,8 @@ * limitations under the License. */ +#include + #include "thread-private.h" #include "thread-dbus-handler.h" #include "thread-mock-util.h" @@ -165,6 +167,43 @@ static GVariant *__property_get_panid() return g_variant_new("(v)", g_variant_new("q", 65535)); } +static void __make_ipv6_address(uint8_t *ipv6Address) +{ + const char *DUMMY_IPV6_ADDRESS = "fd32:647d:8272:7562:78a:1bfb:72d:3544"; + struct in6_addr result; + inet_pton(AF_INET6, DUMMY_IPV6_ADDRESS, &result); + memcpy(ipv6Address, result.s6_addr, + THREAD_IPV6_PREFIX_SIZE * sizeof(uint8_t)); +} + +static GVariant *__make_external_routes_result() +{ + uint8_t prefixAddress[THREAD_IPV6_PREFIX_SIZE]; + uint8_t prefixLen = THREAD_IPV6_PREFIX_SIZE; + uint16_t rloc16 = 0xb801; + uint8_t preference = 0; + bool stable = TRUE; + bool nextHopIsSelf = TRUE; + + GVariantBuilder *prefixBuilder = + g_variant_builder_new(G_VARIANT_TYPE("ay")); + __make_ipv6_address(prefixAddress); + for (int i = 0; i < THREAD_IPV6_PREFIX_SIZE; ++i) + g_variant_builder_add(prefixBuilder, "y", prefixAddress[i]); + + GVariant *externalRoutesResult = g_variant_new("((ayy)qybb)", + prefixBuilder, prefixLen, rloc16, preference, stable, nextHopIsSelf); + + g_variant_builder_unref(prefixBuilder); + + return externalRoutesResult; +} + +static GVariant *__property_get_external_routes() +{ + return g_variant_new("(v)", __make_external_routes_result()); +} + struct { const gchar *interface_name; const gchar *signal_name; @@ -271,6 +310,11 @@ struct { __property_get_panid, }, { + "Get", + THREAD_DBUS_PROPERTY_EXTERNAL_ROUTES, + __property_get_external_routes, + }, + { NULL, NULL, NULL, diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index ce26fac..62cce6f 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -23,6 +23,13 @@ class ThreadBRTest : public ::testing::Test public: thread_instance_h instance; +public: + static bool GetExternalRoutesCallback(int total, + thread_route_info_h route_info, void *user_data) + { + return true; + }; + protected: void SetUp() override { @@ -71,4 +78,32 @@ TEST_F(ThreadBRTest, BRDisableErrorNone) EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_br_enable(instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_br_disable(instance)); +} + +TEST_F(ThreadBRTest, BRGetExternalRoutesNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_br_get_external_routes(instance, GetExternalRoutesCallback, nullptr)); +} + +TEST_F(ThreadBRTest, BRGetExternalRoutesInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_br_get_external_routes(instance, GetExternalRoutesCallback, nullptr)); +} + +TEST_F(ThreadBRTest, BRGetExternalRoutesNotEnabled) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NOT_ENABLED, + thread_br_get_external_routes(instance, GetExternalRoutesCallback, nullptr)); +} + +TEST_F(ThreadBRTest, BRGetExternalRoutesErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_br_enable(instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_br_get_external_routes(instance, GetExternalRoutesCallback, nullptr)); } \ No newline at end of file -- 2.7.4 From 38402e8d5e5d7aef6f3c17fee524a4c80da0932f Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 28 Mar 2022 16:26:07 +0900 Subject: [PATCH 15/16] Add border router test case for adding external route Change-Id: I1153b9cd679694c900e44625da9204be5c607200 Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dummy.cpp | 6 ++-- tests/unittest/thread-unittest-br.cpp | 58 ++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index 52de67d..c93c92b 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -167,12 +167,12 @@ static GVariant *__property_get_panid() return g_variant_new("(v)", g_variant_new("q", 65535)); } -static void __make_ipv6_address(uint8_t *ipv6Address) +static void __make_ipv6_prefix(uint8_t *ipv6Prefix) { const char *DUMMY_IPV6_ADDRESS = "fd32:647d:8272:7562:78a:1bfb:72d:3544"; struct in6_addr result; inet_pton(AF_INET6, DUMMY_IPV6_ADDRESS, &result); - memcpy(ipv6Address, result.s6_addr, + memcpy(ipv6Prefix, result.s6_addr, THREAD_IPV6_PREFIX_SIZE * sizeof(uint8_t)); } @@ -187,7 +187,7 @@ static GVariant *__make_external_routes_result() GVariantBuilder *prefixBuilder = g_variant_builder_new(G_VARIANT_TYPE("ay")); - __make_ipv6_address(prefixAddress); + __make_ipv6_prefix(prefixAddress); for (int i = 0; i < THREAD_IPV6_PREFIX_SIZE; ++i) g_variant_builder_add(prefixBuilder, "y", prefixAddress[i]); diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index 62cce6f..65817bb 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -15,13 +15,24 @@ */ #include +#include #include "thread.h" +#define DUMMY_IPV6_ADDRESS "fd32:647d:8272:7562:78a:1bfb:72d:3544" + class ThreadBRTest : public ::testing::Test { public: + uint8_t ipv6Prefix[THREAD_IPV6_PREFIX_SIZE]; + uint8_t ipv6PrefixLen; + uint16_t rloc16; + int8_t preference; + bool isStable; + bool isDeviceNextHop; + thread_instance_h instance; + thread_route_info_h routeInfo; public: static bool GetExternalRoutesCallback(int total, @@ -35,6 +46,12 @@ protected: { thread_initialize(); instance = nullptr; + makeIpv6Prefix(); + ipv6PrefixLen = THREAD_IPV6_PREFIX_SIZE; + rloc16 = 0xb801; + preference = 0; + isStable = TRUE; + isDeviceNextHop = TRUE; } void TearDown() override @@ -43,6 +60,15 @@ protected: thread_disable(instance); thread_deinitialize(); } + +private: + void makeIpv6Prefix() + { + struct in6_addr result; + inet_pton(AF_INET6, DUMMY_IPV6_ADDRESS, &result); + memcpy(ipv6Prefix, result.s6_addr, + THREAD_IPV6_PREFIX_SIZE * sizeof(uint8_t)); + } }; TEST_F(ThreadBRTest, BREnableNotInitialized) @@ -106,4 +132,36 @@ TEST_F(ThreadBRTest, BRGetExternalRoutesErrorNone) EXPECT_EQ(THREAD_ERROR_NONE, thread_br_enable(instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_br_get_external_routes(instance, GetExternalRoutesCallback, nullptr)); +} + +TEST_F(ThreadBRTest, BRAddExternalRouteNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_br_add_external_route(instance, ipv6Prefix, ipv6PrefixLen, + rloc16, preference, isStable, isDeviceNextHop, &routeInfo)); +} + +TEST_F(ThreadBRTest, BRAddExternalRouteInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_br_add_external_route(instance, ipv6Prefix, ipv6PrefixLen, + rloc16, preference, isStable, isDeviceNextHop, &routeInfo)); +} + +TEST_F(ThreadBRTest, BRAddExternalRouteNotEnabled) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NOT_ENABLED, + thread_br_add_external_route(instance, ipv6Prefix, ipv6PrefixLen, + rloc16, preference, isStable, isDeviceNextHop, &routeInfo)); +} + +TEST_F(ThreadBRTest, BRAddExternalRouteErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_br_enable(instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_br_add_external_route(instance, ipv6Prefix, ipv6PrefixLen, + rloc16, preference, isStable, isDeviceNextHop, &routeInfo)); } \ No newline at end of file -- 2.7.4 From c9820b3041b85800638a09772f4bf506a87322e7 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 28 Mar 2022 16:36:38 +0900 Subject: [PATCH 16/16] Add border router test case for removing external route Change-Id: Iec73c140b8132b78a759fcb55a76fa9aa91b552a Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-br.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index 65817bb..9ca4904 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -164,4 +164,35 @@ TEST_F(ThreadBRTest, BRAddExternalRouteErrorNone) EXPECT_EQ(THREAD_ERROR_NONE, thread_br_add_external_route(instance, ipv6Prefix, ipv6PrefixLen, rloc16, preference, isStable, isDeviceNextHop, &routeInfo)); +} + +TEST_F(ThreadBRTest, BRRemoveExternalRouteNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_br_remove_external_route(instance, routeInfo)); +} + +TEST_F(ThreadBRTest, BRRemoveExternalRouteInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_br_remove_external_route(instance, routeInfo)); +} + +TEST_F(ThreadBRTest, BRRemoveExternalRouteNotEnabled) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NOT_ENABLED, + thread_br_remove_external_route(instance, routeInfo)); +} + +TEST_F(ThreadBRTest, BRRemoveExternalRouteErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_br_enable(instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_br_add_external_route(instance, ipv6Prefix, ipv6PrefixLen, + rloc16, preference, isStable, isDeviceNextHop, &routeInfo)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_br_remove_external_route(instance, routeInfo)); } \ No newline at end of file -- 2.7.4