From 3d67764b0451d773f3255bed6ec6f15f3b1ef6b0 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 21 Mar 2022 13:45:01 +0900 Subject: [PATCH 01/16] Replace g_objext_new with dummy value Change-Id: I8639e8695cba470a166fc363f4c1176e786023a5 Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dbus.cpp | 6 +++--- tests/unittest/thread-unittest-init.cpp | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/tests/unittest/mocks/thread-mock-dbus.cpp b/tests/unittest/mocks/thread-mock-dbus.cpp index 6a15cf1..bed2d02 100644 --- a/tests/unittest/mocks/thread-mock-dbus.cpp +++ b/tests/unittest/mocks/thread-mock-dbus.cpp @@ -21,7 +21,7 @@ GDBusConnection *g_bus_get_sync(GBusType bus_type, GCancellable *cancellable, GError **error) { - return (GDBusConnection *)g_object_new(G_TYPE_DBUS_CONNECTION, NULL); + return (GDBusConnection *)0x1234; } GDBusProxy *g_dbus_proxy_new_for_bus_sync(GBusType bus_type, @@ -30,7 +30,7 @@ GDBusProxy *g_dbus_proxy_new_for_bus_sync(GBusType bus_type, const gchar *interface_name, GCancellable *cancellable, GError **error) { - return (GDBusProxy *)g_object_new(G_TYPE_DBUS_PROXY, NULL); + return (GDBusProxy *)0x1234; } GDBusProxy *g_dbus_proxy_new_sync(GDBusConnection *connection, @@ -39,7 +39,7 @@ GDBusProxy *g_dbus_proxy_new_sync(GDBusConnection *connection, const gchar *interface_name, GCancellable *cancellable, GError **error) { - return (GDBusProxy *)g_object_new(G_TYPE_DBUS_PROXY, NULL); + return (GDBusProxy *)0x1234; } guint g_dbus_connection_signal_subscribe(GDBusConnection *connection, diff --git a/tests/unittest/thread-unittest-init.cpp b/tests/unittest/thread-unittest-init.cpp index 97afd45..4c18d39 100644 --- a/tests/unittest/thread-unittest-init.cpp +++ b/tests/unittest/thread-unittest-init.cpp @@ -23,12 +23,10 @@ class ThreadInitTest : public ::testing::Test protected: void SetUp() override { - //thread_mock_set_socket(false); } void TearDown() override { - //thread_mock_set_socket(false); } }; -- 2.7.4 From 93aa17a88f951f129b6995aed8eaf9b4bd31fddb Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 21 Mar 2022 15:28:54 +0900 Subject: [PATCH 02/16] Add defense code for null param Change-Id: I1b2d4584862f88c50295fac18c6c996b24491958 Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/unittest/mocks/thread-mock.cpp b/tests/unittest/mocks/thread-mock.cpp index d4e38e9..9eb2b74 100644 --- a/tests/unittest/mocks/thread-mock.cpp +++ b/tests/unittest/mocks/thread-mock.cpp @@ -18,6 +18,9 @@ int system_info_get_platform_bool(const char *key, bool *value) { - *value = true; - return SYSTEM_INFO_ERROR_NONE; + if (value == nullptr) + return SYSTEM_INFO_ERROR_INVALID_PARAMETER; + + *value = true; + return SYSTEM_INFO_ERROR_NONE; } \ No newline at end of file -- 2.7.4 From 7222f0cd600c89af1efb0438efba41c87a157732 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 22 Mar 2022 12:50:27 +0900 Subject: [PATCH 03/16] Add core test case for enable Change-Id: I33f535aa291eafc018626e42c140ff4070a1f2d1 Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-core.cpp | 48 +++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 tests/unittest/thread-unittest-core.cpp diff --git a/tests/unittest/thread-unittest-core.cpp b/tests/unittest/thread-unittest-core.cpp new file mode 100644 index 0000000..e273faa --- /dev/null +++ b/tests/unittest/thread-unittest-core.cpp @@ -0,0 +1,48 @@ +/* + * 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 ThreadCoreTest : public ::testing::Test +{ +public: + thread_instance_h instance; + +protected: + void SetUp() override + { + thread_initialize(); + instance = nullptr; + } + + void TearDown() override + { + thread_deinitialize(); + } +}; + +TEST_F(ThreadCoreTest, EnableNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_enable(&instance)); +} + +TEST_F(ThreadCoreTest, EnableErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); +} \ No newline at end of file -- 2.7.4 From 0dc9c92dedb727eed6f87a31675f3c89962a129c Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 22 Mar 2022 12:51:12 +0900 Subject: [PATCH 04/16] Add core test case for disable Change-Id: I0941fc6d74a80041f4141d5c108ac679289b97e1 Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-core.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/unittest/thread-unittest-core.cpp b/tests/unittest/thread-unittest-core.cpp index e273faa..25da988 100644 --- a/tests/unittest/thread-unittest-core.cpp +++ b/tests/unittest/thread-unittest-core.cpp @@ -45,4 +45,21 @@ TEST_F(ThreadCoreTest, EnableNotInitialized) TEST_F(ThreadCoreTest, EnableErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); +} + +TEST_F(ThreadCoreTest, DisableNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_disable(instance)); +} + +TEST_F(ThreadCoreTest, DisableInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_disable(instance)); +} + +TEST_F(ThreadCoreTest, DisableErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_disable(instance)); } \ No newline at end of file -- 2.7.4 From 1065d629f59e0517db22b0b5141d5835084979f5 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 22 Mar 2022 12:51:40 +0900 Subject: [PATCH 05/16] Add core test case for start Change-Id: I2e4ca31ddbbb4450cfd31f672a9857a8df034e0f Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-core.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/unittest/thread-unittest-core.cpp b/tests/unittest/thread-unittest-core.cpp index 25da988..754c99c 100644 --- a/tests/unittest/thread-unittest-core.cpp +++ b/tests/unittest/thread-unittest-core.cpp @@ -62,4 +62,21 @@ TEST_F(ThreadCoreTest, DisableErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_disable(instance)); +} + +TEST_F(ThreadCoreTest, StartNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_start(instance)); +} + +TEST_F(ThreadCoreTest, StartInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_start(instance)); +} + +TEST_F(ThreadCoreTest, StartErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_start(instance)); } \ No newline at end of file -- 2.7.4 From 57c0765e59fed90bd5fff79aee620ad7e5d0d840 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 22 Mar 2022 12:52:06 +0900 Subject: [PATCH 06/16] Add core test case for stop Change-Id: I7d747ae3af88e4231fff816c93072d3c5f305a94 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 754c99c..b9e9908 100644 --- a/tests/unittest/thread-unittest-core.cpp +++ b/tests/unittest/thread-unittest-core.cpp @@ -79,4 +79,22 @@ TEST_F(ThreadCoreTest, StartErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_start(instance)); +} + +TEST_F(ThreadCoreTest, StopNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_stop(instance)); +} + +TEST_F(ThreadCoreTest, StopInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_stop(instance)); +} + +TEST_F(ThreadCoreTest, StopErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_start(instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_stop(instance)); } \ No newline at end of file -- 2.7.4 From a007aae717e9b7bafdcd08e287406bc8ed02c292 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 22 Mar 2022 12:53:27 +0900 Subject: [PATCH 07/16] Add core test case for reset Change-Id: I49830c414098c2cbe24c4007cbe507e180e95d58 Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dbus.cpp | 14 +++++++++ tests/unittest/mocks/thread-mock-dummy.cpp | 46 +++++++++++++++++++++++++++--- tests/unittest/mocks/thread-mock-dummy.h | 3 ++ tests/unittest/thread-unittest-core.cpp | 17 +++++++++++ 4 files changed, 76 insertions(+), 4 deletions(-) diff --git a/tests/unittest/mocks/thread-mock-dbus.cpp b/tests/unittest/mocks/thread-mock-dbus.cpp index bed2d02..be8d356 100644 --- a/tests/unittest/mocks/thread-mock-dbus.cpp +++ b/tests/unittest/mocks/thread-mock-dbus.cpp @@ -16,6 +16,7 @@ #include #include +#include "thread-private.h" #include "thread-mock-dummy.h" GDBusConnection *g_bus_get_sync(GBusType bus_type, @@ -61,6 +62,19 @@ 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) +{ + retv_if(proxy == NULL, NULL); + + return _handle_sync_method(method_name, parameters); +} + 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 726cf3c..3c6d4ed 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -14,13 +14,20 @@ * limitations under the License. */ +#include "thread-private.h" +#include "thread-dbus-handler.h" #include "thread-mock-dummy.h" -static GVariant * __properties_changed() +static GVariant * __signal_properties_changed() { return nullptr; } +static GVariant *__method_reset(GVariant *parameters) +{ + return g_variant_new("(i)", THREAD_ERROR_NONE); +} + struct { const gchar *interface_name; const gchar *signal_name; @@ -29,9 +36,9 @@ struct { gpointer user_data; } thread_gdbus_signal_list[] = { [PROPERTIES_CHANGED] = { - "org.freedesktop.DBus.Properties", - "PropertiesChanged", - __properties_changed, + THREAD_EVENT_INTERFACE, + THREAD_EVENT_NAME, + __signal_properties_changed, NULL, NULL, }, @@ -44,12 +51,31 @@ struct { }, }; +struct { + const gchar *method_name; + GVariant *(*sync_handler)(GVariant *parameters); +} thread_gdbus_method_list[] = { + { + THREAD_DBUS_RESET_METHOD, + __method_reset, + }, + { + NULL, + NULL, + } +}; + static bool __is_same_signal(int i, const char *interface_name, const char *signal_name) { return (g_strcmp0(thread_gdbus_signal_list[i].interface_name, interface_name) == 0 && g_strcmp0(thread_gdbus_signal_list[i].signal_name, signal_name) == 0); } +static bool __is_same_method(int i, const char *method_name) +{ + return (g_strcmp0(thread_gdbus_method_list[i].method_name, method_name) == 0); +} + guint _subscribe_signal(const char *interface_name, const char *member, GDBusSignalCallback callback, gpointer user_data) @@ -63,4 +89,16 @@ guint _subscribe_signal(const char *interface_name, } } return DUMMY_SIGNAL_ID; +} + +GVariant *_handle_sync_method(const gchar *method_name, + GVariant *parameters) +{ + for (int i = 0; ; ++i) { + if (thread_gdbus_method_list[i].method_name == NULL) + return nullptr; + + if (__is_same_method(i, method_name)) + return thread_gdbus_method_list[i].sync_handler(parameters); + } } \ 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 54df057..0cae601 100644 --- a/tests/unittest/mocks/thread-mock-dummy.h +++ b/tests/unittest/mocks/thread-mock-dummy.h @@ -28,3 +28,6 @@ typedef enum { guint _subscribe_signal(const char *interface_name, const char *member, GDBusSignalCallback callback, gpointer user_data); + +GVariant *_handle_sync_method(const gchar *method_name, + GVariant *parameters); diff --git a/tests/unittest/thread-unittest-core.cpp b/tests/unittest/thread-unittest-core.cpp index b9e9908..29f763d 100644 --- a/tests/unittest/thread-unittest-core.cpp +++ b/tests/unittest/thread-unittest-core.cpp @@ -97,4 +97,21 @@ TEST_F(ThreadCoreTest, StopErrorNone) EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_start(instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_stop(instance)); +} + +TEST_F(ThreadCoreTest, ResetNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_reset(instance)); +} + +TEST_F(ThreadCoreTest, ResetInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_reset(instance)); +} + +TEST_F(ThreadCoreTest, ResetErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_reset(instance)); } \ No newline at end of file -- 2.7.4 From 7efbd356febcc3c5ea435662bbf5965c9473ebc2 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 22 Mar 2022 12:54:09 +0900 Subject: [PATCH 08/16] Add core test case for factoryreset Change-Id: I568adb7440e9dc062de1dea0b5c8e3f6fc3d0002 Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dummy.cpp | 9 +++++++++ tests/unittest/thread-unittest-core.cpp | 17 +++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index 3c6d4ed..02af7aa 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -28,6 +28,11 @@ static GVariant *__method_reset(GVariant *parameters) return g_variant_new("(i)", THREAD_ERROR_NONE); } +static GVariant *__method_factoryreset(GVariant *parameters) +{ + return g_variant_new("(i)", THREAD_ERROR_NONE); +} + struct { const gchar *interface_name; const gchar *signal_name; @@ -60,6 +65,10 @@ struct { __method_reset, }, { + THREAD_DBUS_FACTORY_RESET_METHOD, + __method_factoryreset + }, + { NULL, NULL, } diff --git a/tests/unittest/thread-unittest-core.cpp b/tests/unittest/thread-unittest-core.cpp index 29f763d..51b94c7 100644 --- a/tests/unittest/thread-unittest-core.cpp +++ b/tests/unittest/thread-unittest-core.cpp @@ -114,4 +114,21 @@ TEST_F(ThreadCoreTest, ResetErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_reset(instance)); +} + +TEST_F(ThreadCoreTest, FactoryresetNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_factoryreset(instance)); +} + +TEST_F(ThreadCoreTest, FactoryresetInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_factoryreset(instance)); +} + +TEST_F(ThreadCoreTest, FactoryresetErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_factoryreset(instance)); } \ No newline at end of file -- 2.7.4 From 304da999abe9001c087bfc73364cec46eeaf4cf4 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 22 Mar 2022 13:44:52 +0900 Subject: [PATCH 09/16] Add core test case for getting device role property Change-Id: I78c544c81edcd16a7d617faa570b0abaeaf28b49 Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dbus.cpp | 12 +++++--- tests/unittest/mocks/thread-mock-dummy.cpp | 44 ++++++++++++++++++++++++++++-- tests/unittest/mocks/thread-mock-dummy.h | 2 ++ tests/unittest/thread-unittest-core.cpp | 21 ++++++++++++++ 4 files changed, 72 insertions(+), 7 deletions(-) diff --git a/tests/unittest/mocks/thread-mock-dbus.cpp b/tests/unittest/mocks/thread-mock-dbus.cpp index be8d356..06256b4 100644 --- a/tests/unittest/mocks/thread-mock-dbus.cpp +++ b/tests/unittest/mocks/thread-mock-dbus.cpp @@ -22,7 +22,7 @@ GDBusConnection *g_bus_get_sync(GBusType bus_type, GCancellable *cancellable, GError **error) { - return (GDBusConnection *)0x1234; + return (GDBusConnection *)GINT_TO_POINTER(0x1234); } GDBusProxy *g_dbus_proxy_new_for_bus_sync(GBusType bus_type, @@ -31,7 +31,7 @@ GDBusProxy *g_dbus_proxy_new_for_bus_sync(GBusType bus_type, const gchar *interface_name, GCancellable *cancellable, GError **error) { - return (GDBusProxy *)0x1234; + return (GDBusProxy *)GINT_TO_POINTER(0x1234); } GDBusProxy *g_dbus_proxy_new_sync(GDBusConnection *connection, @@ -40,7 +40,7 @@ GDBusProxy *g_dbus_proxy_new_sync(GDBusConnection *connection, const gchar *interface_name, GCancellable *cancellable, GError **error) { - return (GDBusProxy *)0x1234; + return (GDBusProxy *)GINT_TO_POINTER(0x5678); } guint g_dbus_connection_signal_subscribe(GDBusConnection *connection, @@ -72,7 +72,11 @@ GVariant *g_dbus_proxy_call_sync(GDBusProxy *proxy, { retv_if(proxy == NULL, NULL); - return _handle_sync_method(method_name, parameters); + if (proxy == GINT_TO_POINTER(0x1234)) + return _handle_sync_method(method_name, parameters); + + if (proxy == GINT_TO_POINTER(0x5678)) + return _handle_get_property(parameters); } void g_object_unref(gpointer object) diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index 02af7aa..b09a2a0 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -33,6 +33,11 @@ static GVariant *__method_factoryreset(GVariant *parameters) return g_variant_new("(i)", THREAD_ERROR_NONE); } +static GVariant *__property_device_role() +{ + return g_variant_new("(v)", g_variant_new("s", "router")); +} + struct { const gchar *interface_name; const gchar *signal_name; @@ -58,7 +63,7 @@ struct { struct { const gchar *method_name; - GVariant *(*sync_handler)(GVariant *parameters); + GVariant *(*handler)(GVariant *parameters); } thread_gdbus_method_list[] = { { THREAD_DBUS_RESET_METHOD, @@ -66,7 +71,21 @@ struct { }, { THREAD_DBUS_FACTORY_RESET_METHOD, - __method_factoryreset + __method_factoryreset, + }, + { + NULL, + NULL, + } +}; + +struct { + const gchar *property_name; + GVariant *(*handler)(void); +} thread_gdbus_property_list[] = { + { + THREAD_DBUS_PROPERTY_DEVICE_ROLE, + __property_device_role, }, { NULL, @@ -85,6 +104,11 @@ static bool __is_same_method(int i, const char *method_name) return (g_strcmp0(thread_gdbus_method_list[i].method_name, method_name) == 0); } +static bool __is_same_property(int i, const char *property_name) +{ + return (g_strcmp0(thread_gdbus_property_list[i].property_name, property_name) == 0); +} + guint _subscribe_signal(const char *interface_name, const char *member, GDBusSignalCallback callback, gpointer user_data) @@ -108,6 +132,20 @@ GVariant *_handle_sync_method(const gchar *method_name, return nullptr; if (__is_same_method(i, method_name)) - return thread_gdbus_method_list[i].sync_handler(parameters); + return thread_gdbus_method_list[i].handler(parameters); + } +} + +GVariant *_handle_get_property(GVariant *parameters) +{ + const char *property_name; + g_variant_get(parameters, "(ss)", nullptr, &property_name); + + for (int i = 0; ; ++i) { + if (thread_gdbus_property_list[i].property_name == NULL) + return nullptr; + + if (__is_same_property(i, property_name)) + return thread_gdbus_property_list[i].handler(); } } \ 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 0cae601..0f71083 100644 --- a/tests/unittest/mocks/thread-mock-dummy.h +++ b/tests/unittest/mocks/thread-mock-dummy.h @@ -31,3 +31,5 @@ guint _subscribe_signal(const char *interface_name, GVariant *_handle_sync_method(const gchar *method_name, GVariant *parameters); + +GVariant *_handle_get_property(GVariant *parameters); \ No newline at end of file diff --git a/tests/unittest/thread-unittest-core.cpp b/tests/unittest/thread-unittest-core.cpp index 51b94c7..658b9e5 100644 --- a/tests/unittest/thread-unittest-core.cpp +++ b/tests/unittest/thread-unittest-core.cpp @@ -22,6 +22,7 @@ class ThreadCoreTest : public ::testing::Test { public: thread_instance_h instance; + thread_device_role_e deviceRole; protected: void SetUp() override @@ -131,4 +132,24 @@ TEST_F(ThreadCoreTest, FactoryresetErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_factoryreset(instance)); +} + +TEST_F(ThreadCoreTest, GetDeviceRoleNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_get_device_role(instance, &deviceRole)); +} + +TEST_F(ThreadCoreTest, GetDeviceRoleInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_get_device_role(nullptr, &deviceRole)); + + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_get_device_role(instance, nullptr)); +} + +TEST_F(ThreadCoreTest, GetDeviceRoleErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_get_device_role(instance, &deviceRole)); } \ No newline at end of file -- 2.7.4 From bdde2f8abe34a278089bfc9b7934f697bf42e6d3 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 22 Mar 2022 13:54:33 +0900 Subject: [PATCH 10/16] Add core test case for setting device role changed callback Change-Id: Ifc14e36f8fdfa3a9102f8c1965c8e993f54cf79d Signed-off-by: hyunuk.tak --- tests/unittest/thread-unittest-core.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/unittest/thread-unittest-core.cpp b/tests/unittest/thread-unittest-core.cpp index 658b9e5..4665dec 100644 --- a/tests/unittest/thread-unittest-core.cpp +++ b/tests/unittest/thread-unittest-core.cpp @@ -24,6 +24,9 @@ public: thread_instance_h instance; thread_device_role_e deviceRole; +public: + static void deviceRoleCb(thread_device_role_e device_role, void *user_data) {}; + protected: void SetUp() override { @@ -152,4 +155,24 @@ TEST_F(ThreadCoreTest, GetDeviceRoleErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_get_device_role(instance, &deviceRole)); +} + +TEST_F(ThreadCoreTest, SetDeviceRoleChangedCbNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_set_device_role_changed_cb(instance, deviceRoleCb, nullptr)); +} + +TEST_F(ThreadCoreTest, SetDeviceRoleChangedCbInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_set_device_role_changed_cb(instance, deviceRoleCb, nullptr)); +} + +TEST_F(ThreadCoreTest, SetDeviceRoleChangedCbErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_set_device_role_changed_cb(instance, deviceRoleCb, nullptr)); } \ No newline at end of file -- 2.7.4 From c5c277d1f548822620cd1dbbf038a41f0dc6f6aa Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 22 Mar 2022 14:37:45 +0900 Subject: [PATCH 11/16] Add core test case for setting device type Change-Id: Ic041a9ad82c8e5bcc909f4ddf775e55367c2cd6d Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dbus.cpp | 6 ++++-- tests/unittest/mocks/thread-mock-dummy.cpp | 33 ++++++++++++++++++++++-------- tests/unittest/mocks/thread-mock-dummy.h | 3 ++- tests/unittest/thread-unittest-core.cpp | 24 ++++++++++++++++++++++ 4 files changed, 55 insertions(+), 11 deletions(-) diff --git a/tests/unittest/mocks/thread-mock-dbus.cpp b/tests/unittest/mocks/thread-mock-dbus.cpp index 06256b4..3342ffb 100644 --- a/tests/unittest/mocks/thread-mock-dbus.cpp +++ b/tests/unittest/mocks/thread-mock-dbus.cpp @@ -70,13 +70,15 @@ GVariant *g_dbus_proxy_call_sync(GDBusProxy *proxy, GCancellable *cancellable, GError **error) { - retv_if(proxy == NULL, NULL); + retv_if(proxy == nullptr, nullptr); if (proxy == GINT_TO_POINTER(0x1234)) return _handle_sync_method(method_name, parameters); if (proxy == GINT_TO_POINTER(0x5678)) - return _handle_get_property(parameters); + return _handle_property(method_name, parameters); + + return nullptr; } void g_object_unref(gpointer object) diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index b09a2a0..93d1c0e 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -35,7 +35,12 @@ static GVariant *__method_factoryreset(GVariant *parameters) static GVariant *__property_device_role() { - return g_variant_new("(v)", g_variant_new("s", "router")); + return g_variant_new("(v)", g_variant_new("s", "child")); +} + +static GVariant *__property_link_mode() +{ + return g_variant_new("(i)", THREAD_ERROR_NONE); } struct { @@ -80,14 +85,21 @@ struct { }; struct { + const gchar *method_name; const gchar *property_name; GVariant *(*handler)(void); } thread_gdbus_property_list[] = { { + "Get", THREAD_DBUS_PROPERTY_DEVICE_ROLE, __property_device_role, }, { + "Set", + THREAD_DBUS_PROPERTY_LINK_MODE, + __property_link_mode, + }, + { NULL, NULL, } @@ -104,9 +116,10 @@ static bool __is_same_method(int i, const char *method_name) return (g_strcmp0(thread_gdbus_method_list[i].method_name, method_name) == 0); } -static bool __is_same_property(int i, const char *property_name) +static bool __is_same_property(int i, const char *method_name, const char *property_name) { - return (g_strcmp0(thread_gdbus_property_list[i].property_name, property_name) == 0); + return (g_strcmp0(thread_gdbus_property_list[i].method_name, method_name) == 0 + && g_strcmp0(thread_gdbus_property_list[i].property_name, property_name) == 0); } guint _subscribe_signal(const char *interface_name, @@ -136,16 +149,20 @@ GVariant *_handle_sync_method(const gchar *method_name, } } -GVariant *_handle_get_property(GVariant *parameters) +GVariant *_handle_property(const gchar *method_name, + GVariant *parameters) { - const char *property_name; - g_variant_get(parameters, "(ss)", nullptr, &property_name); + const char *property_name = nullptr; + if (g_strcmp0(method_name, "Get") == 0) + g_variant_get(parameters, "(ss)", nullptr, &property_name); + if (g_strcmp0(method_name, "Set") == 0) + g_variant_get(parameters, "(ssv)", nullptr, &property_name, nullptr); for (int i = 0; ; ++i) { - if (thread_gdbus_property_list[i].property_name == NULL) + if (thread_gdbus_property_list[i].method_name == NULL) return nullptr; - if (__is_same_property(i, property_name)) + if (__is_same_property(i, method_name, property_name)) return thread_gdbus_property_list[i].handler(); } } \ 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 0f71083..491a53e 100644 --- a/tests/unittest/mocks/thread-mock-dummy.h +++ b/tests/unittest/mocks/thread-mock-dummy.h @@ -32,4 +32,5 @@ guint _subscribe_signal(const char *interface_name, GVariant *_handle_sync_method(const gchar *method_name, GVariant *parameters); -GVariant *_handle_get_property(GVariant *parameters); \ No newline at end of file +GVariant *_handle_property(const gchar *method_name, + GVariant *parameters); \ No newline at end of file diff --git a/tests/unittest/thread-unittest-core.cpp b/tests/unittest/thread-unittest-core.cpp index 4665dec..4c438f6 100644 --- a/tests/unittest/thread-unittest-core.cpp +++ b/tests/unittest/thread-unittest-core.cpp @@ -175,4 +175,28 @@ TEST_F(ThreadCoreTest, SetDeviceRoleChangedCbErrorNone) EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_set_device_role_changed_cb(instance, deviceRoleCb, nullptr)); +} + +TEST_F(ThreadCoreTest, SetDeviceTypeNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, + thread_set_device_type(instance, THREAD_DEVICE_TYPE_ROUTER)); +} + +TEST_F(ThreadCoreTest, SetDeviceTypeInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, + thread_set_device_type(instance, THREAD_DEVICE_TYPE_ROUTER)); +} + +TEST_F(ThreadCoreTest, SetDeviceTypeErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_set_device_type(instance, THREAD_DEVICE_TYPE_MINIMAL_END_DEVICE)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_set_device_type(instance, THREAD_DEVICE_TYPE_SLEEPY_END_DEVICE)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_set_device_type(instance, THREAD_DEVICE_TYPE_ROUTER)); } \ No newline at end of file -- 2.7.4 From ef955b67b9ed3942d0c376ceb64abe3c3c2ab838 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 22 Mar 2022 15:00:23 +0900 Subject: [PATCH 12/16] Add core test case for getting device type Change-Id: I79ad30b08e174ed55cc642b50dcfcdfe6be86fb9 Signed-off-by: hyunuk.tak --- tests/unittest/mocks/thread-mock-dummy.cpp | 14 ++++++++++++-- tests/unittest/thread-unittest-core.cpp | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index 93d1c0e..717dcb4 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -38,11 +38,16 @@ static GVariant *__property_device_role() return g_variant_new("(v)", g_variant_new("s", "child")); } -static GVariant *__property_link_mode() +static GVariant *__property_set_link_mode() { return g_variant_new("(i)", THREAD_ERROR_NONE); } +static GVariant *__property_get_link_mode() +{ + return g_variant_new("(v)", g_variant_new("(bbb)", true, true, true)); +} + struct { const gchar *interface_name; const gchar *signal_name; @@ -97,7 +102,12 @@ struct { { "Set", THREAD_DBUS_PROPERTY_LINK_MODE, - __property_link_mode, + __property_set_link_mode, + }, + { + "Get", + THREAD_DBUS_PROPERTY_LINK_MODE, + __property_get_link_mode, }, { NULL, diff --git a/tests/unittest/thread-unittest-core.cpp b/tests/unittest/thread-unittest-core.cpp index 4c438f6..309b13a 100644 --- a/tests/unittest/thread-unittest-core.cpp +++ b/tests/unittest/thread-unittest-core.cpp @@ -23,6 +23,7 @@ class ThreadCoreTest : public ::testing::Test public: thread_instance_h instance; thread_device_role_e deviceRole; + thread_device_type_e deviceType; public: static void deviceRoleCb(thread_device_role_e device_role, void *user_data) {}; @@ -199,4 +200,21 @@ TEST_F(ThreadCoreTest, SetDeviceTypeErrorNone) thread_set_device_type(instance, THREAD_DEVICE_TYPE_SLEEPY_END_DEVICE)); EXPECT_EQ(THREAD_ERROR_NONE, thread_set_device_type(instance, THREAD_DEVICE_TYPE_ROUTER)); +} + +TEST_F(ThreadCoreTest, GetDeviceTypeNotInitialized) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); + EXPECT_EQ(THREAD_ERROR_NOT_INITIALIZED, thread_get_device_type(instance, &deviceType)); +} + +TEST_F(ThreadCoreTest, GetDeviceTypeInvalidParameter) +{ + EXPECT_EQ(THREAD_ERROR_INVALID_PARAMETER, thread_get_device_type(instance, &deviceType)); +} + +TEST_F(ThreadCoreTest, GetDeviceTypeErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_get_device_type(instance, &deviceType)); } \ No newline at end of file -- 2.7.4 From 14cbd9d4e0da627303c0c3aec6f5e5d3b6739546 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 22 Mar 2022 15:07:20 +0900 Subject: [PATCH 13/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 14/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 15/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 16/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