From 14cbd9d4e0da627303c0c3aec6f5e5d3b6739546 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 22 Mar 2022 15:07:20 +0900 Subject: [PATCH 01/16] Add core test case for scan param create Change-Id: I7c484c2262a1f731f5b17646f3dac4b2981d3916 Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-core.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/unittest/thread-unittest-core.cpp b/tests/unittest/thread-unittest-core.cpp index 309b13a..4045aeb 100644 --- a/tests/unittest/thread-unittest-core.cpp +++ b/tests/unittest/thread-unittest-core.cpp @@ -24,6 +24,7 @@ public: thread_instance_h instance; thread_device_role_e deviceRole; thread_device_type_e deviceType; + thread_scan_param_h scanParam; public: static void deviceRoleCb(thread_device_role_e device_role, void *user_data) {}; @@ -217,4 +218,21 @@ TEST_F(ThreadCoreTest, GetDeviceTypeErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_get_device_type(instance, &deviceType)); +} + +TEST_F(ThreadCoreTest, ScanPramCreateNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_scan_param_create(instance, 10, &scanParam)); +} + +TEST_F(ThreadCoreTest, ScanPramCreateInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_scan_param_create(instance, 10, &scanParam)); +} + +TEST_F(ThreadCoreTest, ScanPramCreateErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_scan_param_create(instance, 10, &scanParam)); } \ No newline at end of file -- 2.7.4 From f18bbe2469508bddd3607d533418d7b21645b750 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 22 Mar 2022 15:11:05 +0900 Subject: [PATCH 02/16] Add core test case for scan param destroy Change-Id: I2fb9d4c43c26a4f6ee669e6f0b7ecf8dbef1980b Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-core.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/unittest/thread-unittest-core.cpp b/tests/unittest/thread-unittest-core.cpp index 4045aeb..aa3bb37 100644 --- a/tests/unittest/thread-unittest-core.cpp +++ b/tests/unittest/thread-unittest-core.cpp @@ -235,4 +235,22 @@ TEST_F(ThreadCoreTest, ScanPramCreateErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_scan_param_create(instance, 10, &scanParam)); +} + +TEST_F(ThreadCoreTest, ScanPramDestroyNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_scan_param_destroy(instance, scanParam)); +} + +TEST_F(ThreadCoreTest, ScanPramDestroyInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_scan_param_destroy(instance, scanParam)); +} + +TEST_F(ThreadCoreTest, ScanPramDestroyErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_scan_param_create(instance, 10, &scanParam)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_scan_param_destroy(instance, scanParam)); } \ No newline at end of file -- 2.7.4 From 829678392282902768bb6cd7201ea07981f399f2 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Wed, 23 Mar 2022 15:18:14 +0900 Subject: [PATCH 03/16] Add core test case for scan Change-Id: I22aeb57052fabf469fa78dee72fc5e5d04faf79a Signed-off-by: hyunuk.tak --- src/thread-util.c | 4 +- tests/unittest/mocks/thread-mock-dbus.cpp | 72 +++++++++++++++-------- tests/unittest/mocks/thread-mock-dummy.cpp | 94 +++++++++++++++++++++++++++++- tests/unittest/mocks/thread-mock-dummy.h | 8 ++- tests/unittest/mocks/thread-mock-util.cpp | 54 +++++++++++++++++ tests/unittest/mocks/thread-mock-util.h | 54 +++++++++++++++++ tests/unittest/thread-unittest-core.cpp | 36 +++++++++++- 7 files changed, 289 insertions(+), 33 deletions(-) create mode 100644 tests/unittest/mocks/thread-mock-util.cpp create mode 100644 tests/unittest/mocks/thread-mock-util.h diff --git a/src/thread-util.c b/src/thread-util.c index fc9eebd..81e96bb 100644 --- a/src/thread-util.c +++ b/src/thread-util.c @@ -162,8 +162,8 @@ void __thread_dbus_handle_scan_cb(gboolean res, int length = 0; uint16_t panid = 0; uint16_t joiner_udp_port = 0; - uint16_t channel = 0; - uint16_t rssi = 0; + uint8_t channel = 0; + uint8_t rssi = 0; uint8_t lqi = 0; uint8_t version = 0; bool is_native = 0; diff --git a/tests/unittest/mocks/thread-mock-dbus.cpp b/tests/unittest/mocks/thread-mock-dbus.cpp index 3342ffb..26da5e4 100644 --- a/tests/unittest/mocks/thread-mock-dbus.cpp +++ b/tests/unittest/mocks/thread-mock-dbus.cpp @@ -20,39 +20,39 @@ #include "thread-mock-dummy.h" GDBusConnection *g_bus_get_sync(GBusType bus_type, - GCancellable *cancellable, GError **error) + GCancellable *cancellable, GError **error) { - return (GDBusConnection *)GINT_TO_POINTER(0x1234); + return (GDBusConnection *)GINT_TO_POINTER(0x1111); } GDBusProxy *g_dbus_proxy_new_for_bus_sync(GBusType bus_type, - GDBusProxyFlags flags, GDBusInterfaceInfo *info, - const gchar *name, const gchar *object_path, - const gchar *interface_name, GCancellable *cancellable, - GError **error) + GDBusProxyFlags flags, GDBusInterfaceInfo *info, + const gchar *name, const gchar *object_path, + const gchar *interface_name, GCancellable *cancellable, + GError **error) { return (GDBusProxy *)GINT_TO_POINTER(0x1234); } GDBusProxy *g_dbus_proxy_new_sync(GDBusConnection *connection, - GDBusProxyFlags flags, GDBusInterfaceInfo *info, - const gchar *name, const gchar *object_path, - const gchar *interface_name, GCancellable *cancellable, - GError **error) + GDBusProxyFlags flags, GDBusInterfaceInfo *info, + const gchar *name, const gchar *object_path, + const gchar *interface_name, GCancellable *cancellable, + GError **error) { return (GDBusProxy *)GINT_TO_POINTER(0x5678); } guint g_dbus_connection_signal_subscribe(GDBusConnection *connection, - const gchar *sender, - const gchar *interface_name, - const gchar *member, - const gchar *object_path, - const gchar *arg0, - GDBusSignalFlags flags, - GDBusSignalCallback callback, - gpointer user_data, - GDestroyNotify user_data_free_func) + const gchar *sender, + const gchar *interface_name, + const gchar *member, + const gchar *object_path, + const gchar *arg0, + GDBusSignalFlags flags, + GDBusSignalCallback callback, + gpointer user_data, + GDestroyNotify user_data_free_func) { return _subscribe_signal(interface_name, member, callback, user_data); } @@ -63,12 +63,12 @@ void g_dbus_connection_signal_unsubscribe(GDBusConnection *connection, } GVariant *g_dbus_proxy_call_sync(GDBusProxy *proxy, - const gchar *method_name, - GVariant *parameters, - GDBusCallFlags flags, - gint timeout_msec, - GCancellable *cancellable, - GError **error) + const gchar *method_name, + GVariant *parameters, + GDBusCallFlags flags, + gint timeout_msec, + GCancellable *cancellable, + GError **error) { retv_if(proxy == nullptr, nullptr); @@ -81,6 +81,28 @@ GVariant *g_dbus_proxy_call_sync(GDBusProxy *proxy, return nullptr; } +void g_dbus_proxy_call(GDBusProxy *proxy, + const gchar *method_name, + GVariant *parameters, + GDBusCallFlags flags, + gint timeout_msec, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + ret_if(proxy == nullptr); + + if (proxy == GINT_TO_POINTER(0x1234)) + _handle_async_method(method_name, parameters, callback, user_data); +} + +GVariant *g_dbus_proxy_call_finish(GDBusProxy *proxy, + GAsyncResult *res, + GError **error) +{ + return _get_gdbus_async_result(error); +} + void g_object_unref(gpointer object) { } \ No newline at end of file diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index 717dcb4..4a3942b 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -16,8 +16,27 @@ #include "thread-private.h" #include "thread-dbus-handler.h" +#include "thread-mock-util.h" #include "thread-mock-dummy.h" +typedef struct { + GAsyncReadyCallback callback; + GVariant *result; + gpointer user_data; +} gdbus_result_data_s; + +static gdbus_result_data_s _gdbus_async_result; +static const int ASYNC_RESULT_DELAY = 5; + +static gboolean __reply_async_method(gpointer data) +{ + gdbus_result_data_s *gdbus_result = (gdbus_result_data_s *)data; + gdbus_result->callback((GObject *)g_object_new(G_TYPE_DBUS_PROXY, NULL), + NULL, + gdbus_result->user_data); + return FALSE; +} + static GVariant * __signal_properties_changed() { return nullptr; @@ -33,6 +52,49 @@ static GVariant *__method_factoryreset(GVariant *parameters) return g_variant_new("(i)", THREAD_ERROR_NONE); } +static GVariant *__make_scan_result() +{ + uint64_t ext_address = 0; + const char *network_name = "network_name"; + uint64_t ext_panid = 0; + uint16_t panid = 0; + uint16_t joiner_udp_port = 0; + uint8_t channel = 0; + uint8_t rssi = 0; + uint8_t lqi = 0; + uint8_t version = 0; + bool is_native = 0; + bool is_joinable = 0; + + GVariantBuilder *scan_results_builder = + g_variant_builder_new(G_VARIANT_TYPE("a(tstayqqyyyybb)")); + + GVariantBuilder *steering_data_builder = + g_variant_builder_new(G_VARIANT_TYPE("ay")); + g_variant_builder_add(steering_data_builder, "y", 1); + g_variant_builder_add(steering_data_builder, "y", '\0'); + + g_variant_builder_add(scan_results_builder, "(tstayqqyyyybb)", + ext_address, network_name, ext_panid, steering_data_builder, + panid, joiner_udp_port, channel, rssi, lqi, version, + is_native, is_joinable); + + GVariant *scan_results = g_variant_new("(a(tstayqqyyyybb))", scan_results_builder); + + g_variant_builder_unref(scan_results_builder); + + return scan_results; +} + +static void __method_scan(GVariant *parameters, + GAsyncReadyCallback callback, gpointer user_data) +{ + _gdbus_async_result.callback = callback; + _gdbus_async_result.result = __make_scan_result(); + _gdbus_async_result.user_data = user_data; + 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")); @@ -73,19 +135,28 @@ struct { struct { const gchar *method_name; - GVariant *(*handler)(GVariant *parameters); + GVariant *(*sync_handler)(GVariant *parameters); + void(*async_handler)(GVariant *parameters, GAsyncReadyCallback callback, gpointer user_data); } thread_gdbus_method_list[] = { { THREAD_DBUS_RESET_METHOD, __method_reset, + NULL, }, { THREAD_DBUS_FACTORY_RESET_METHOD, __method_factoryreset, + NULL, + }, + { + THREAD_DBUS_SCAN_METHOD, + NULL, + __method_scan, }, { NULL, NULL, + NULL, } }; @@ -155,7 +226,20 @@ GVariant *_handle_sync_method(const gchar *method_name, return nullptr; if (__is_same_method(i, method_name)) - return thread_gdbus_method_list[i].handler(parameters); + return thread_gdbus_method_list[i].sync_handler(parameters); + } +} + +void _handle_async_method(const gchar *method_name, + GVariant *parameters, GAsyncReadyCallback callback, + gpointer user_data) +{ + for (int i = 0; ; ++i) { + if (thread_gdbus_method_list[i].method_name == NULL) + return; + + if (__is_same_method(i, method_name)) + return thread_gdbus_method_list[i].async_handler(parameters, callback, user_data); } } @@ -175,4 +259,10 @@ GVariant *_handle_property(const gchar *method_name, if (__is_same_property(i, method_name, property_name)) return thread_gdbus_property_list[i].handler(); } +} + +GVariant *_get_gdbus_async_result(GError **error) +{ + *error = nullptr; + return _gdbus_async_result.result; } \ No newline at end of file diff --git a/tests/unittest/mocks/thread-mock-dummy.h b/tests/unittest/mocks/thread-mock-dummy.h index 491a53e..8d2f35c 100644 --- a/tests/unittest/mocks/thread-mock-dummy.h +++ b/tests/unittest/mocks/thread-mock-dummy.h @@ -32,5 +32,11 @@ guint _subscribe_signal(const char *interface_name, GVariant *_handle_sync_method(const gchar *method_name, GVariant *parameters); +void _handle_async_method(const gchar *method_name, + GVariant *parameters, GAsyncReadyCallback callback, + gpointer user_data); + GVariant *_handle_property(const gchar *method_name, - GVariant *parameters); \ No newline at end of file + GVariant *parameters); + +GVariant *_get_gdbus_async_result(GError **error); \ No newline at end of file diff --git a/tests/unittest/mocks/thread-mock-util.cpp b/tests/unittest/mocks/thread-mock-util.cpp new file mode 100644 index 0000000..84d2aae --- /dev/null +++ b/tests/unittest/mocks/thread-mock-util.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 "thread-mock-util.h" + +static gboolean _timeoutCallback(gpointer data) +{ + GMainLoop *mainLoop = NULL; + mainLoop = (GMainLoop *)data; + if (mainLoop != NULL) + g_main_loop_quit(mainLoop); + return FALSE; +} + +void ScanCallback(int result, thread_network_scanning_state_e state, + uint64_t ext_address, const char *network_name, uint64_t ext_panidi, + const uint8_t *steering_data, int length, uint16_t panid, uint16_t joiner_udp_port, uint16_t channel, + uint16_t rssi, uint8_t lqi, uint8_t version, bool is_native, bool is_joinable, void *user_data) +{ + if (state == THREAD_SCANNING_FINISHED) + QUIT_GMAIN_LOOP; +} + +void ThreadMainLoop::RunMainLoop() +{ + mainLoop = g_main_loop_new(NULL, false); + timeoutId = g_timeout_add(CALLBACK_TIMEOUT, _timeoutCallback, mainLoop); + g_main_loop_run(mainLoop); + if (timeoutId > 0) + g_source_remove(timeoutId); + mainLoop = NULL; +} + +void ThreadMainLoop::QuitMainLoop() +{ + if (mainLoop) + { + g_main_loop_quit(mainLoop); + mainLoop = NULL; + } +} \ No newline at end of file diff --git a/tests/unittest/mocks/thread-mock-util.h b/tests/unittest/mocks/thread-mock-util.h new file mode 100644 index 0000000..2f5fa08 --- /dev/null +++ b/tests/unittest/mocks/thread-mock-util.h @@ -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. + */ + +#pragma once + +#include +#include "thread-private.h" + +#define CALLBACK_TIMEOUT 10 +#define THREAD_MAIN_LOOP ThreadMainLoop::getInstance() +#define RUN_GMAIN_LOOP THREAD_MAIN_LOOP.RunMainLoop() +#define QUIT_GMAIN_LOOP THREAD_MAIN_LOOP.QuitMainLoop() + +void ScanCallback(int result, thread_network_scanning_state_e state, + uint64_t ext_address, const char *network_name, uint64_t ext_panidi, + const uint8_t *steering_data, int length, uint16_t panid, uint16_t joiner_udp_port, uint16_t channel, + uint16_t rssi, uint8_t lqi, uint8_t version, bool is_native, bool is_joinable, void *user_data); + +class ThreadMainLoop +{ +public: + static ThreadMainLoop& getInstance() + { + static ThreadMainLoop instance; + return instance; + } + + void RunMainLoop(); + void QuitMainLoop(); + +private: + ThreadMainLoop() {} + ~ThreadMainLoop() = default; + + ThreadMainLoop(const ThreadMainLoop&) = delete; + ThreadMainLoop& operator=(const ThreadMainLoop&) = delete; + +private: + GMainLoop *mainLoop; + guint timeoutId; +}; \ No newline at end of file diff --git a/tests/unittest/thread-unittest-core.cpp b/tests/unittest/thread-unittest-core.cpp index aa3bb37..d2b7ed6 100644 --- a/tests/unittest/thread-unittest-core.cpp +++ b/tests/unittest/thread-unittest-core.cpp @@ -17,10 +17,13 @@ #include #include "thread.h" +#include "mocks/thread-mock-util.h" class ThreadCoreTest : public ::testing::Test { public: + const int THREAD_DEFAULT_SCAN_TIME = 80; + thread_instance_h instance; thread_device_role_e deviceRole; thread_device_type_e deviceType; @@ -223,18 +226,21 @@ TEST_F(ThreadCoreTest, GetDeviceTypeErrorNone) TEST_F(ThreadCoreTest, ScanPramCreateNotInitialized) { EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); - EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_scan_param_create(instance, 10, &scanParam)); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_scan_param_create(instance, THREAD_DEFAULT_SCAN_TIME, &scanParam)); } TEST_F(ThreadCoreTest, ScanPramCreateInvalidParameter) { - EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_scan_param_create(instance, 10, &scanParam)); + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_scan_param_create(instance, THREAD_DEFAULT_SCAN_TIME, &scanParam)); } TEST_F(ThreadCoreTest, ScanPramCreateErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); - EXPECT_EQ(THREAD_ERROR_NONE, thread_scan_param_create(instance, 10, &scanParam)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_scan_param_create(instance, THREAD_DEFAULT_SCAN_TIME, &scanParam)); } TEST_F(ThreadCoreTest, ScanPramDestroyNotInitialized) @@ -253,4 +259,28 @@ TEST_F(ThreadCoreTest, ScanPramDestroyErrorNone) EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_scan_param_create(instance, 10, &scanParam)); EXPECT_EQ(THREAD_ERROR_NONE, thread_scan_param_destroy(instance, scanParam)); +} + +TEST_F(ThreadCoreTest, ScanNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_scan(instance, scanParam, ScanCallback, nullptr)); +} + +TEST_F(ThreadCoreTest, ScanInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_scan(instance, scanParam, ScanCallback, nullptr)); +} + +TEST_F(ThreadCoreTest, ScanErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_scan_param_create(instance, THREAD_DEFAULT_SCAN_TIME, &scanParam)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_scan(instance, scanParam, ScanCallback, nullptr)); + + RUN_GMAIN_LOOP; } \ No newline at end of file -- 2.7.4 From e2cab1477c5fad55c1dc63c6fba17387098bc0d5 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Wed, 23 Mar 2022 15:35:01 +0900 Subject: [PATCH 04/16] Add core test case for getting extended address Change-Id: Ic3dadc496378ea36b598e9bac639cea97aed1033 Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dummy.cpp | 11 +++++++++++ tests/unittest/thread-unittest-core.cpp | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index 4a3942b..bbb950d 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -110,6 +110,11 @@ static GVariant *__property_get_link_mode() return g_variant_new("(v)", g_variant_new("(bbb)", true, true, true)); } +static GVariant *__property_get_extended_address() +{ + return g_variant_new("(v)", g_variant_new("t", 0)); +} + struct { const gchar *interface_name; const gchar *signal_name; @@ -181,6 +186,12 @@ struct { __property_get_link_mode, }, { + "Get", + THREAD_DBUS_PROPERTY_EXTENDED_ADDRESS, + __property_get_extended_address, + }, + { + NULL, NULL, NULL, } diff --git a/tests/unittest/thread-unittest-core.cpp b/tests/unittest/thread-unittest-core.cpp index d2b7ed6..04b3488 100644 --- a/tests/unittest/thread-unittest-core.cpp +++ b/tests/unittest/thread-unittest-core.cpp @@ -28,6 +28,8 @@ public: thread_device_role_e deviceRole; thread_device_type_e deviceType; thread_scan_param_h scanParam; + uint64_t extendedAddress; + const char *uuid; public: static void deviceRoleCb(thread_device_role_e device_role, void *user_data) {}; @@ -283,4 +285,21 @@ TEST_F(ThreadCoreTest, ScanErrorNone) thread_scan(instance, scanParam, ScanCallback, nullptr)); RUN_GMAIN_LOOP; +} + +TEST_F(ThreadCoreTest, GetExtendedAddressNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_get_extended_address(instance, &extendedAddress)); +} + +TEST_F(ThreadCoreTest, GetExtendedAddressInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_get_extended_address(instance, &extendedAddress)); +} + +TEST_F(ThreadCoreTest, GetExtendedAddressErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_get_extended_address(instance, &extendedAddress)); } \ No newline at end of file -- 2.7.4 From ef6cccf453ae89d3f86bf2af9ed56dbaac3e613e Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Wed, 23 Mar 2022 17:59:26 +0900 Subject: [PATCH 05/16] Release timeout resource appropriately Change-Id: I4b32aa7e51f6c50649439e9c69980b7296718ebd Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dummy.cpp | 9 ++++++++- tests/unittest/mocks/thread-mock-util.cpp | 23 +++++++++++++---------- tests/unittest/mocks/thread-mock-util.h | 2 ++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index bbb950d..e5b7465 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -23,6 +23,7 @@ typedef struct { GAsyncReadyCallback callback; GVariant *result; gpointer user_data; + guint timeout_id; } gdbus_result_data_s; static gdbus_result_data_s _gdbus_async_result; @@ -92,7 +93,8 @@ static void __method_scan(GVariant *parameters, _gdbus_async_result.callback = callback; _gdbus_async_result.result = __make_scan_result(); _gdbus_async_result.user_data = user_data; - g_timeout_add(ASYNC_RESULT_DELAY, __reply_async_method, &_gdbus_async_result); + _gdbus_async_result.timeout_id = g_timeout_add( + ASYNC_RESULT_DELAY, __reply_async_method, &_gdbus_async_result); } static GVariant *__property_device_role() @@ -275,5 +277,10 @@ GVariant *_handle_property(const gchar *method_name, GVariant *_get_gdbus_async_result(GError **error) { *error = nullptr; + if (_gdbus_async_result.timeout_id > 0) + { + g_source_remove(_gdbus_async_result.timeout_id); + _gdbus_async_result.timeout_id = 0; + } return _gdbus_async_result.result; } \ No newline at end of file diff --git a/tests/unittest/mocks/thread-mock-util.cpp b/tests/unittest/mocks/thread-mock-util.cpp index 84d2aae..e6d2fb7 100644 --- a/tests/unittest/mocks/thread-mock-util.cpp +++ b/tests/unittest/mocks/thread-mock-util.cpp @@ -16,15 +16,6 @@ #include "thread-mock-util.h" -static gboolean _timeoutCallback(gpointer data) -{ - GMainLoop *mainLoop = NULL; - mainLoop = (GMainLoop *)data; - if (mainLoop != NULL) - g_main_loop_quit(mainLoop); - return FALSE; -} - void ScanCallback(int result, thread_network_scanning_state_e state, uint64_t ext_address, const char *network_name, uint64_t ext_panidi, const uint8_t *steering_data, int length, uint16_t panid, uint16_t joiner_udp_port, uint16_t channel, @@ -34,10 +25,22 @@ void ScanCallback(int result, thread_network_scanning_state_e state, QUIT_GMAIN_LOOP; } +gboolean ThreadMainLoop::timeoutCallback(gpointer data) +{ + GMainLoop *mainLoop = NULL; + mainLoop = (GMainLoop *)data; + if (mainLoop != NULL) + { + g_main_loop_quit(mainLoop); + THREAD_MAIN_LOOP.timeoutId = 0; + } + return FALSE; +} + void ThreadMainLoop::RunMainLoop() { mainLoop = g_main_loop_new(NULL, false); - timeoutId = g_timeout_add(CALLBACK_TIMEOUT, _timeoutCallback, mainLoop); + timeoutId = g_timeout_add(CALLBACK_TIMEOUT, timeoutCallback, mainLoop); g_main_loop_run(mainLoop); if (timeoutId > 0) g_source_remove(timeoutId); diff --git a/tests/unittest/mocks/thread-mock-util.h b/tests/unittest/mocks/thread-mock-util.h index 2f5fa08..bd9cc76 100644 --- a/tests/unittest/mocks/thread-mock-util.h +++ b/tests/unittest/mocks/thread-mock-util.h @@ -48,6 +48,8 @@ private: ThreadMainLoop(const ThreadMainLoop&) = delete; ThreadMainLoop& operator=(const ThreadMainLoop&) = delete; + static gboolean timeoutCallback(gpointer data); + private: GMainLoop *mainLoop; guint timeoutId; -- 2.7.4 From de371f86144e78d4f1e6abc79139c1744be5ac56 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Thu, 24 Mar 2022 12:40:09 +0900 Subject: [PATCH 06/16] Move scan callback function to member Change-Id: Ia43dcc861ab39e5f79b4ba4f605ed6cebbbecab6 Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-util.cpp | 9 --------- tests/unittest/mocks/thread-mock-util.h | 5 ----- tests/unittest/thread-unittest-core.cpp | 19 ++++++++++++++++--- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/tests/unittest/mocks/thread-mock-util.cpp b/tests/unittest/mocks/thread-mock-util.cpp index e6d2fb7..24da7c8 100644 --- a/tests/unittest/mocks/thread-mock-util.cpp +++ b/tests/unittest/mocks/thread-mock-util.cpp @@ -16,15 +16,6 @@ #include "thread-mock-util.h" -void ScanCallback(int result, thread_network_scanning_state_e state, - uint64_t ext_address, const char *network_name, uint64_t ext_panidi, - const uint8_t *steering_data, int length, uint16_t panid, uint16_t joiner_udp_port, uint16_t channel, - uint16_t rssi, uint8_t lqi, uint8_t version, bool is_native, bool is_joinable, void *user_data) -{ - if (state == THREAD_SCANNING_FINISHED) - QUIT_GMAIN_LOOP; -} - gboolean ThreadMainLoop::timeoutCallback(gpointer data) { GMainLoop *mainLoop = NULL; diff --git a/tests/unittest/mocks/thread-mock-util.h b/tests/unittest/mocks/thread-mock-util.h index bd9cc76..04e1a1d 100644 --- a/tests/unittest/mocks/thread-mock-util.h +++ b/tests/unittest/mocks/thread-mock-util.h @@ -24,11 +24,6 @@ #define RUN_GMAIN_LOOP THREAD_MAIN_LOOP.RunMainLoop() #define QUIT_GMAIN_LOOP THREAD_MAIN_LOOP.QuitMainLoop() -void ScanCallback(int result, thread_network_scanning_state_e state, - uint64_t ext_address, const char *network_name, uint64_t ext_panidi, - const uint8_t *steering_data, int length, uint16_t panid, uint16_t joiner_udp_port, uint16_t channel, - uint16_t rssi, uint8_t lqi, uint8_t version, bool is_native, bool is_joinable, void *user_data); - class ThreadMainLoop { public: diff --git a/tests/unittest/thread-unittest-core.cpp b/tests/unittest/thread-unittest-core.cpp index 04b3488..71994b7 100644 --- a/tests/unittest/thread-unittest-core.cpp +++ b/tests/unittest/thread-unittest-core.cpp @@ -33,6 +33,10 @@ public: public: static void deviceRoleCb(thread_device_role_e device_role, void *user_data) {}; + static void scanCallback(int result, thread_network_scanning_state_e state, + uint64_t ext_address, const char *network_name, uint64_t ext_panidi, + const uint8_t *steering_data, int length, uint16_t panid, uint16_t joiner_udp_port, uint16_t channel, + uint16_t rssi, uint8_t lqi, uint8_t version, bool is_native, bool is_joinable, void *user_data); protected: void SetUp() override @@ -47,6 +51,15 @@ protected: } }; +void ThreadCoreTest::scanCallback(int result, thread_network_scanning_state_e state, + uint64_t ext_address, const char *network_name, uint64_t ext_panidi, + const uint8_t *steering_data, int length, uint16_t panid, uint16_t joiner_udp_port, uint16_t channel, + uint16_t rssi, uint8_t lqi, uint8_t version, bool is_native, bool is_joinable, void *user_data) +{ + if (state == THREAD_SCANNING_FINISHED) + QUIT_GMAIN_LOOP; +} + TEST_F(ThreadCoreTest, EnableNotInitialized) { EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); @@ -267,13 +280,13 @@ TEST_F(ThreadCoreTest, ScanNotInitialized) { EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, - thread_scan(instance, scanParam, ScanCallback, nullptr)); + thread_scan(instance, scanParam, scanCallback, nullptr)); } TEST_F(ThreadCoreTest, ScanInvalidParameter) { EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, - thread_scan(instance, scanParam, ScanCallback, nullptr)); + thread_scan(instance, scanParam, scanCallback, nullptr)); } TEST_F(ThreadCoreTest, ScanErrorNone) @@ -282,7 +295,7 @@ TEST_F(ThreadCoreTest, ScanErrorNone) EXPECT_EQ(THREAD_ERROR_NONE, thread_scan_param_create(instance, THREAD_DEFAULT_SCAN_TIME, &scanParam)); EXPECT_EQ(THREAD_ERROR_NONE, - thread_scan(instance, scanParam, ScanCallback, nullptr)); + thread_scan(instance, scanParam, scanCallback, nullptr)); RUN_GMAIN_LOOP; } -- 2.7.4 From 14d6bf6aaca55159509030ba39588ec0c9cde8ce Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Thu, 24 Mar 2022 13:05:06 +0900 Subject: [PATCH 07/16] Add network test case for creating operational network Change-Id: I52de2d10b0ca977f53419a6eee8a6f3a4b362415 Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-network.cpp | 75 ++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 tests/unittest/thread-unittest-network.cpp diff --git a/tests/unittest/thread-unittest-network.cpp b/tests/unittest/thread-unittest-network.cpp new file mode 100644 index 0000000..331cb35 --- /dev/null +++ b/tests/unittest/thread-unittest-network.cpp @@ -0,0 +1,75 @@ +/* + * 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" + +#define NETWORK_DATA_SIZE 256 + +class ThreadNetworkTest : public ::testing::Test +{ +public: + thread_instance_h instance; + thread_network_h network; + char name[NETWORK_DATA_SIZE + 1]; + char key[NETWORK_DATA_SIZE + 1]; + char pskc[NETWORK_DATA_SIZE + 1]; + uint32_t channel; + uint64_t extendedPanId; + uint16_t panId; + +protected: + void SetUp() override + { + thread_initialize(); + instance = nullptr; + snprintf(name, NETWORK_DATA_SIZE + 1, "Thread-test"); + snprintf(key, NETWORK_DATA_SIZE + 1, "f780b002ec7d904c9995daaa78a50083"); + snprintf(pskc, NETWORK_DATA_SIZE + 1, "ba473fecdb235d30bd65233e6089ee50"); + channel = 0x07fff800; + extendedPanId = 18446744073709551615; + panId = 65535; + } + + void TearDown() override + { + thread_deinitialize(); + } +}; + +TEST_F(ThreadNetworkTest, CreateOperationalNetworkNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_network_create_operational_network(instance, name, + key, pskc, channel, extendedPanId, panId, &network)); +} + +TEST_F(ThreadNetworkTest, CreateOperationalNetworkInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_network_create_operational_network(instance, name, + key, pskc, channel, extendedPanId, panId, &network)); +} + +TEST_F(ThreadNetworkTest, CreateOperationalNetworkErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_network_create_operational_network(instance, name, + key, pskc, channel, extendedPanId, panId, &network)); +} \ No newline at end of file -- 2.7.4 From 45783f8f3d8e7df823e9e9eea69f24aaebea307a Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Thu, 24 Mar 2022 13:21:13 +0900 Subject: [PATCH 08/16] Add network test case for destroying operational network Change-Id: I5072948edea7a9afeaf3cf06591eb0b595c0ddfa Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-network.cpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/tests/unittest/thread-unittest-network.cpp b/tests/unittest/thread-unittest-network.cpp index 331cb35..581f4a7 100644 --- a/tests/unittest/thread-unittest-network.cpp +++ b/tests/unittest/thread-unittest-network.cpp @@ -37,11 +37,12 @@ protected: { thread_initialize(); instance = nullptr; + network = nullptr; snprintf(name, NETWORK_DATA_SIZE + 1, "Thread-test"); snprintf(key, NETWORK_DATA_SIZE + 1, "f780b002ec7d904c9995daaa78a50083"); snprintf(pskc, NETWORK_DATA_SIZE + 1, "ba473fecdb235d30bd65233e6089ee50"); channel = 0x07fff800; - extendedPanId = 18446744073709551615; + extendedPanId = strtoull("18446744073709551615LL", nullptr, 10); panId = 65535; } @@ -72,4 +73,27 @@ TEST_F(ThreadNetworkTest, CreateOperationalNetworkErrorNone) EXPECT_EQ(THREAD_ERROR_NONE, thread_network_create_operational_network(instance, name, key, pskc, channel, extendedPanId, panId, &network)); +} + +TEST_F(ThreadNetworkTest, DestroyOperationalNetworkNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_network_destroy_operational_network(instance, network)); +} + +TEST_F(ThreadNetworkTest, DestroyOperationalNetworkInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_network_destroy_operational_network(instance, network)); +} + +TEST_F(ThreadNetworkTest, DestroyOperationalNetworkErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_network_create_operational_network(instance, name, + key, pskc, channel, extendedPanId, panId, &network)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_network_destroy_operational_network(instance, network)); } \ No newline at end of file -- 2.7.4 From 6e0174ff198cb8c96517f88229b4aaaa4d3905f5 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Thu, 24 Mar 2022 15:05:04 +0900 Subject: [PATCH 09/16] Add network test case for setting active dataset tlvs Change-Id: I4fdbfbc8f026af4ff5944406bade321920eab956 Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dbus.cpp | 4 +++ tests/unittest/mocks/thread-mock-dummy.cpp | 10 ++++++++ tests/unittest/thread-unittest-network.cpp | 40 ++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/tests/unittest/mocks/thread-mock-dbus.cpp b/tests/unittest/mocks/thread-mock-dbus.cpp index 26da5e4..31131a6 100644 --- a/tests/unittest/mocks/thread-mock-dbus.cpp +++ b/tests/unittest/mocks/thread-mock-dbus.cpp @@ -105,4 +105,8 @@ GVariant *g_dbus_proxy_call_finish(GDBusProxy *proxy, void g_object_unref(gpointer object) { +} + +void g_bytes_unref(GBytes *bytes) +{ } \ No newline at end of file diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index e5b7465..7fddd40 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -117,6 +117,11 @@ static GVariant *__property_get_extended_address() return g_variant_new("(v)", g_variant_new("t", 0)); } +static GVariant *__property_set_active_dataset_tlvs() +{ + return g_variant_new("(i)", THREAD_ERROR_NONE); +} + struct { const gchar *interface_name; const gchar *signal_name; @@ -193,6 +198,11 @@ struct { __property_get_extended_address, }, { + "Set", + THREAD_DBUS_PROPERTY_ACTIVE_DATASET_TLVS, + __property_set_active_dataset_tlvs, + }, + { NULL, NULL, NULL, diff --git a/tests/unittest/thread-unittest-network.cpp b/tests/unittest/thread-unittest-network.cpp index 581f4a7..072a39b 100644 --- a/tests/unittest/thread-unittest-network.cpp +++ b/tests/unittest/thread-unittest-network.cpp @@ -19,6 +19,12 @@ #include "thread.h" #define NETWORK_DATA_SIZE 256 +#define NETWORK_TLVS_SIZE 1024 +#define DUMMY_TLVS_SIZE 106 +#define DUMMY_TLVS_STR "0e080000000000010000000300001935060004001" \ + "fffe00208763d64768c8f3ecf0708fdd10ceaadb65a7b05105e1ec3e" \ + "16d3e0aee52fb7e618a759973030f4f70656e5468726561642d34633" \ + "33801024c3804103044b2dc6512dce13b11d3386eb2ce7e0c0402a0fff8" class ThreadNetworkTest : public ::testing::Test { @@ -31,6 +37,7 @@ public: uint32_t channel; uint64_t extendedPanId; uint16_t panId; + uint8_t tlvsBuffer[NETWORK_TLVS_SIZE]; protected: void SetUp() override @@ -44,12 +51,25 @@ protected: channel = 0x07fff800; extendedPanId = strtoull("18446744073709551615LL", nullptr, 10); panId = 65535; + makeTlvsBuffer(); } void TearDown() override { thread_deinitialize(); } + +private: + void makeTlvsBuffer() + { + for (int i = 0; i < DUMMY_TLVS_SIZE; ++i) + { + char subBuffer[3]; + memcpy(subBuffer, &DUMMY_TLVS_STR[2 * i], 2); + subBuffer[2] = '\0'; + tlvsBuffer[i] = (uint8_t)strtol(subBuffer, NULL, 16); + } + } }; TEST_F(ThreadNetworkTest, CreateOperationalNetworkNotInitialized) @@ -96,4 +116,24 @@ TEST_F(ThreadNetworkTest, DestroyOperationalNetworkErrorNone) key, pskc, channel, extendedPanId, panId, &network)); EXPECT_EQ(THREAD_ERROR_NONE, thread_network_destroy_operational_network(instance, network)); +} + +TEST_F(ThreadNetworkTest, SetActiveDatasetTlvsNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, DUMMY_TLVS_SIZE)); +} + +TEST_F(ThreadNetworkTest, SetActiveDatasetTlvsInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, DUMMY_TLVS_SIZE)); +} + +TEST_F(ThreadNetworkTest, SetActiveDatasetTlvsErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, DUMMY_TLVS_SIZE)); } \ No newline at end of file -- 2.7.4 From 7e6acac82b621dad2c5bed312cec961c189d5e7f Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Thu, 24 Mar 2022 15:15:46 +0900 Subject: [PATCH 10/16] Add network test case for getting active dataset tlvs Change-Id: I8b7be34ddfcde849f13244c6b3c4902c543baa1e Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-network.cpp | 31 +++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/tests/unittest/thread-unittest-network.cpp b/tests/unittest/thread-unittest-network.cpp index 072a39b..10a5b16 100644 --- a/tests/unittest/thread-unittest-network.cpp +++ b/tests/unittest/thread-unittest-network.cpp @@ -38,6 +38,7 @@ public: uint64_t extendedPanId; uint16_t panId; uint8_t tlvsBuffer[NETWORK_TLVS_SIZE]; + int tlvsBufferLength; protected: void SetUp() override @@ -52,6 +53,7 @@ protected: extendedPanId = strtoull("18446744073709551615LL", nullptr, 10); panId = 65535; makeTlvsBuffer(); + tlvsBufferLength = DUMMY_TLVS_SIZE; } void TearDown() override @@ -122,18 +124,41 @@ TEST_F(ThreadNetworkTest, SetActiveDatasetTlvsNotInitialized) { EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, - thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, DUMMY_TLVS_SIZE)); + thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, tlvsBufferLength)); } TEST_F(ThreadNetworkTest, SetActiveDatasetTlvsInvalidParameter) { EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, - thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, DUMMY_TLVS_SIZE)); + thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, tlvsBufferLength)); } TEST_F(ThreadNetworkTest, SetActiveDatasetTlvsErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, - thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, DUMMY_TLVS_SIZE)); + thread_network_set_active_dataset_tlvs(instance, tlvsBuffer, tlvsBufferLength)); +} + +TEST_F(ThreadNetworkTest, GetActiveDatasetTlvsNotInitialized) +{ + uint8_t *tlvs_buffer = NULL; + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_network_get_active_dataset_tlvs(instance, &tlvs_buffer, &tlvsBufferLength)); +} + +TEST_F(ThreadNetworkTest, GetActiveDatasetTlvsInvalidParameter) +{ + uint8_t *tlvs_buffer = NULL; + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_network_get_active_dataset_tlvs(instance, &tlvs_buffer, &tlvsBufferLength)); +} + +TEST_F(ThreadNetworkTest, GetActiveDatasetTlvsErrorNone) +{ + uint8_t *tlvs_buffer = NULL; + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_network_get_active_dataset_tlvs(instance, &tlvs_buffer, &tlvsBufferLength)); } \ No newline at end of file -- 2.7.4 From 6b0ccb6b19bc4c999987a88edfb41abc6db44d2c Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Thu, 24 Mar 2022 15:47:56 +0900 Subject: [PATCH 11/16] Add network test case for attach Change-Id: I6110037299905da00aa71372b875ea7383f251f3 Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dummy.cpp | 10 ++++++++++ tests/unittest/thread-unittest-network.cpp | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index 7fddd40..84b80a1 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -97,6 +97,11 @@ static void __method_scan(GVariant *parameters, ASYNC_RESULT_DELAY, __reply_async_method, &_gdbus_async_result); } +static GVariant *__method_attach(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")); @@ -166,6 +171,11 @@ struct { __method_scan, }, { + THREAD_DBUS_ATTACH_METHOD, + __method_attach, + NULL, + }, + { NULL, NULL, NULL, diff --git a/tests/unittest/thread-unittest-network.cpp b/tests/unittest/thread-unittest-network.cpp index 10a5b16..569f3f1 100644 --- a/tests/unittest/thread-unittest-network.cpp +++ b/tests/unittest/thread-unittest-network.cpp @@ -161,4 +161,24 @@ TEST_F(ThreadNetworkTest, GetActiveDatasetTlvsErrorNone) EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_network_get_active_dataset_tlvs(instance, &tlvs_buffer, &tlvsBufferLength)); +} + +TEST_F(ThreadNetworkTest, AttachNotInitialized) +{ + uint8_t *tlvs_buffer = NULL; + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_network_attach(instance)); +} + +TEST_F(ThreadNetworkTest, AttachInvalidParameter) +{ + uint8_t *tlvs_buffer = NULL; + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_network_attach(instance)); +} + +TEST_F(ThreadNetworkTest, AttachErrorNone) +{ + uint8_t *tlvs_buffer = NULL; + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_network_attach(instance)); } \ No newline at end of file -- 2.7.4 From d15db4ac1524e6801d110a6c721911f876b580e3 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Thu, 24 Mar 2022 16:20:00 +0900 Subject: [PATCH 12/16] Add network test case for detach Change-Id: I5cc236639d25ce5fa83af3278ca0d35de72a6105 Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dummy.cpp | 10 ++++++++++ tests/unittest/thread-unittest-network.cpp | 23 ++++++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index 84b80a1..2724c6d 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -102,6 +102,11 @@ static GVariant *__method_attach(GVariant *parameters) return g_variant_new("(i)", THREAD_ERROR_NONE); } +static GVariant *__method_detach(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")); @@ -176,6 +181,11 @@ struct { NULL, }, { + THREAD_DBUS_DETACH_METHOD, + __method_detach, + NULL, + }, + { NULL, NULL, NULL, diff --git a/tests/unittest/thread-unittest-network.cpp b/tests/unittest/thread-unittest-network.cpp index 569f3f1..4d39ad3 100644 --- a/tests/unittest/thread-unittest-network.cpp +++ b/tests/unittest/thread-unittest-network.cpp @@ -165,20 +165,37 @@ TEST_F(ThreadNetworkTest, GetActiveDatasetTlvsErrorNone) TEST_F(ThreadNetworkTest, AttachNotInitialized) { - uint8_t *tlvs_buffer = NULL; EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_network_attach(instance)); } TEST_F(ThreadNetworkTest, AttachInvalidParameter) { - uint8_t *tlvs_buffer = NULL; EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_network_attach(instance)); } TEST_F(ThreadNetworkTest, AttachErrorNone) { - uint8_t *tlvs_buffer = NULL; EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_network_attach(instance)); +} + +TEST_F(ThreadNetworkTest, DetachNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_network_detach(instance)); +} + +TEST_F(ThreadNetworkTest, DetachInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_network_detach(instance)); +} + +TEST_F(ThreadNetworkTest, DetachErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_network_create_operational_network(instance, name, + key, pskc, channel, extendedPanId, panId, &network)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_network_detach(instance)); } \ No newline at end of file -- 2.7.4 From 40785e40d6a8c103c2792bc34d72f47eeba861a5 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Thu, 24 Mar 2022 16:32:36 +0900 Subject: [PATCH 13/16] Add network test case for getting ip address Change-Id: Ia6abac5b085ad8565649b8978110ee9c76b5f0be Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-network.cpp | 36 ++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/unittest/thread-unittest-network.cpp b/tests/unittest/thread-unittest-network.cpp index 4d39ad3..f2552fc 100644 --- a/tests/unittest/thread-unittest-network.cpp +++ b/tests/unittest/thread-unittest-network.cpp @@ -40,6 +40,10 @@ public: uint8_t tlvsBuffer[NETWORK_TLVS_SIZE]; int tlvsBufferLength; +public: + static void getIpAddrCallback(int index, char* ipaddr, + thread_ipaddr_type_e ipaddr_type, void *user_data) {}; + protected: void SetUp() override { @@ -198,4 +202,36 @@ TEST_F(ThreadNetworkTest, DetachErrorNone) thread_network_create_operational_network(instance, name, key, pskc, channel, extendedPanId, panId, &network)); EXPECT_EQ(THREAD_ERROR_NONE, thread_network_detach(instance)); +} + +TEST_F(ThreadNetworkTest, GetIpAddrNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_get_ipaddr(instance, getIpAddrCallback, + THREAD_IPADDR_TYPE_ALL, nullptr)); +} + +TEST_F(ThreadNetworkTest, GetIpAddrInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_get_ipaddr(instance, getIpAddrCallback, + THREAD_IPADDR_TYPE_ALL, nullptr)); +} + +TEST_F(ThreadNetworkTest, GetIpAddrErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_get_ipaddr(instance, getIpAddrCallback, + THREAD_IPADDR_TYPE_ALL, nullptr)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_get_ipaddr(instance, getIpAddrCallback, + THREAD_IPADDR_TYPE_LINK_LOCAL, nullptr)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_get_ipaddr(instance, getIpAddrCallback, + THREAD_IPADDR_TYPE_RLOC, nullptr)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_get_ipaddr(instance, getIpAddrCallback, + THREAD_IPADDR_TYPE_MLEID, nullptr)); } \ No newline at end of file -- 2.7.4 From 0cab811ad4da28df29abc78ad0920570c1b7adef Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Thu, 24 Mar 2022 16:46:48 +0900 Subject: [PATCH 14/16] Add network test case for adding ip address Change-Id: Id48b6097ed634bb3df7767e57f47f60fcb5ba6f6 Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-network.cpp | 32 ++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tests/unittest/thread-unittest-network.cpp b/tests/unittest/thread-unittest-network.cpp index f2552fc..27fb9ce 100644 --- a/tests/unittest/thread-unittest-network.cpp +++ b/tests/unittest/thread-unittest-network.cpp @@ -15,6 +15,7 @@ */ #include +#include #include "thread.h" @@ -25,6 +26,7 @@ "fffe00208763d64768c8f3ecf0708fdd10ceaadb65a7b05105e1ec3e" \ "16d3e0aee52fb7e618a759973030f4f70656e5468726561642d34633" \ "33801024c3804103044b2dc6512dce13b11d3386eb2ce7e0c0402a0fff8" +#define DUMMY_IPV6_ADDRESS "fe80::1ee5:a5a9:8bd2:68de" class ThreadNetworkTest : public ::testing::Test { @@ -39,6 +41,7 @@ public: uint16_t panId; uint8_t tlvsBuffer[NETWORK_TLVS_SIZE]; int tlvsBufferLength; + uint8_t ipv6Address[THREAD_IPV6_ADDRESS_SIZE]; public: static void getIpAddrCallback(int index, char* ipaddr, @@ -58,6 +61,7 @@ protected: panId = 65535; makeTlvsBuffer(); tlvsBufferLength = DUMMY_TLVS_SIZE; + makeIpv6Address(); } void TearDown() override @@ -76,6 +80,14 @@ private: tlvsBuffer[i] = (uint8_t)strtol(subBuffer, NULL, 16); } } + + void makeIpv6Address() + { + struct in6_addr result; + inet_pton(AF_INET6, DUMMY_IPV6_ADDRESS, &result); + memcpy(ipv6Address, result.s6_addr, + THREAD_IPV6_PREFIX_SIZE * sizeof(uint8_t)); + } }; TEST_F(ThreadNetworkTest, CreateOperationalNetworkNotInitialized) @@ -234,4 +246,24 @@ TEST_F(ThreadNetworkTest, GetIpAddrErrorNone) EXPECT_EQ(THREAD_ERROR_NONE, thread_get_ipaddr(instance, getIpAddrCallback, THREAD_IPADDR_TYPE_MLEID, nullptr)); +} + +TEST_F(ThreadNetworkTest, AddIpAddrNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_add_ipaddr(instance, ipv6Address)); +} + +TEST_F(ThreadNetworkTest, AddIpAddrInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_add_ipaddr(instance, ipv6Address)); +} + +TEST_F(ThreadNetworkTest, AddIpAddrErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_add_ipaddr(instance, ipv6Address)); } \ No newline at end of file -- 2.7.4 From 88f9540041afcfd47090c9f3881ba5b1adf81101 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Thu, 24 Mar 2022 16:49:21 +0900 Subject: [PATCH 15/16] Add network test case for removing ip address Change-Id: I992cdb04bebd9cfcf4bb0ba56cd570535a35ae9a Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-network.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/unittest/thread-unittest-network.cpp b/tests/unittest/thread-unittest-network.cpp index 27fb9ce..e7ffd5a 100644 --- a/tests/unittest/thread-unittest-network.cpp +++ b/tests/unittest/thread-unittest-network.cpp @@ -266,4 +266,24 @@ TEST_F(ThreadNetworkTest, AddIpAddrErrorNone) EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_add_ipaddr(instance, ipv6Address)); +} + +TEST_F(ThreadNetworkTest, RemoveIpAddrNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_remove_ipaddr(instance, ipv6Address)); +} + +TEST_F(ThreadNetworkTest, RemoveIpAddrInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_remove_ipaddr(instance, ipv6Address)); +} + +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 -- 2.7.4 From 798086a9ff646146cc77aa7ffa059a97a1c660c9 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Fri, 25 Mar 2022 12:01:32 +0900 Subject: [PATCH 16/16] Add to free a memory for tlvs_buffer Change-Id: Ia6fce11917cf66af944ba1a7124a8229e2965730 Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-network.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unittest/thread-unittest-network.cpp b/tests/unittest/thread-unittest-network.cpp index e7ffd5a..73f6d7f 100644 --- a/tests/unittest/thread-unittest-network.cpp +++ b/tests/unittest/thread-unittest-network.cpp @@ -177,6 +177,7 @@ TEST_F(ThreadNetworkTest, GetActiveDatasetTlvsErrorNone) EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_network_get_active_dataset_tlvs(instance, &tlvs_buffer, &tlvsBufferLength)); + g_free(tlvs_buffer); } TEST_F(ThreadNetworkTest, AttachNotInitialized) -- 2.7.4