gtest: add testcases for asnyc API 54/237154/3 accepted/tizen/unified/20200701.123304 submit/tizen/20200629.040440
authorSeonah Moon <seonah1.moon@samsung.com>
Thu, 25 Jun 2020 09:57:14 +0000 (18:57 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Fri, 26 Jun 2020 05:12:25 +0000 (14:12 +0900)
Change-Id: I32b69ba7efca7a06d0d29ca5b6ebd601dccedb64

tests/mocks/tethering_gdbus.c
tests/mocks/tethering_gdbus.h
tests/mocks/tethering_vconf.c
tests/tethering-gtest-async.cpp [new file with mode: 0755]
tests/tethering-gtest-util.cpp [new file with mode: 0755]
tests/tethering-gtest-util.h [new file with mode: 0755]

index ccb2f23..f5ecbad 100644 (file)
@@ -24,6 +24,7 @@
 typedef struct {
        GAsyncReadyCallback callback;
        gpointer user_data;
+       const char *method_name;
 } gdbus_async_callback_info_s;
 
 typedef struct {
@@ -32,14 +33,28 @@ typedef struct {
 } gdbus_signal_callback_info_s;
 
 static const char *gdbus_signal_list[TETHERING_MOCK_GDBUS_SIGNAL_MAX] = {
-       [TETHERING_MOCK_GDBUS_SIGNAL_ON] = "soft_ap_on",
-       [TETHERING_MOCK_GDBUS_SIGNAL_OFF] = "soft_ap_off",
+       [TETHERING_MOCK_GDBUS_SIGNAL_NET_CLOSED] = "net_closed",
+       [TETHERING_MOCK_GDBUS_SIGNAL_WIFI_TETHER_ON] = "wifi_on",
+       [TETHERING_MOCK_GDBUS_SIGNAL_WIFI_TETHER_OFF] = "wifi_off",
+       [TETHERING_MOCK_GDBUS_SIGNAL_USB_TETHER_ON] = "usb_on",
+       [TETHERING_MOCK_GDBUS_SIGNAL_USB_TETHER_OFF] = "usb_off",
+       [TETHERING_MOCK_GDBUS_SIGNAL_BT_TETHER_ON] = "bluetooth_on",
+       [TETHERING_MOCK_GDBUS_SIGNAL_BT_TETHER_OFF] = "bluetooth_off",
+       [TETHERING_MOCK_GDBUS_SIGNAL_NO_DATA_TIMEOUT] = "no_data_timeout",
        [TETHERING_MOCK_GDBUS_SIGNAL_LOW_BATTERY_MODE] = "low_batt_mode",
        [TETHERING_MOCK_GDBUS_SIGNAL_FLIGHT_MODE] = "flight_mode",
        [TETHERING_MOCK_GDBUS_SIGNAL_SECURITY_TYPE_CHANGED] = "security_type_changed",
        [TETHERING_MOCK_GDBUS_SIGNAL_SSID_VISIBILITY_CHANGED] = "ssid_visibility_changed",
        [TETHERING_MOCK_GDBUS_SIGNAL_PASSPHRASE_CHANGED] = "passphrase_changed",
-       [TETHERING_MOCK_GDBUS_SIGNAL_DHCP_STATUS] = "dhcp_status",
+       [TETHERING_MOCK_GDBUS_SIGNAL_DHCP_STATUS] = "dhcp_status"
+};
+
+static const char *gdbus_method_list[TETHERING_MOCK_GDBUS_METHOD_MAX] = {
+       [TETHERING_MOCK_GDBUS_METHOD_DISABLE_USB] = "disable_usb_tethering",
+       [TETHERING_MOCK_GDBUS_METHOD_DISABLE_WIFI] = "disable_wifi_tethering",
+       [TETHERING_MOCK_GDBUS_METHOD_DISABLE_BT] = "disable_bt_tethering",
+       [TETHERING_MOCK_GDBUS_METHOD_DISABLE_P2P] = "disable_p2p_tethering",
+       [TETHERING_MOCK_GDBUS_METHOD_GET_DATA_PACKET_USAGE] = "get_data_packet_usage",
 };
 
 static gdbus_async_callback_info_s gdbus_async_callback = {NULL, NULL};
@@ -60,13 +75,11 @@ void tethering_mock_invoke_gdbus_async_callback(void)
                return;
 
        gdbus_async_callback.callback(NULL, NULL, gdbus_async_callback.user_data);
-       gdbus_async_callback.callback = NULL;
-       gdbus_async_callback.user_data = NULL;
 }
 
 void tethering_mock_emit_gdbus_signal(int signo)
 {
-       if (signo < TETHERING_MOCK_GDBUS_SIGNAL_ON || signo >= TETHERING_MOCK_GDBUS_SIGNAL_MAX)
+       if (signo < TETHERING_MOCK_GDBUS_SIGNAL_NET_CLOSED || signo >= TETHERING_MOCK_GDBUS_SIGNAL_MAX)
                return;
 
        if (!gdbus_signal_callbacks[signo].callback)
@@ -75,22 +88,37 @@ void tethering_mock_emit_gdbus_signal(int signo)
        GVariant *params = NULL;
 
        switch (signo) {
-       case TETHERING_MOCK_GDBUS_SIGNAL_ON:
+       case TETHERING_MOCK_GDBUS_SIGNAL_NET_CLOSED:
+               break;
+       case TETHERING_MOCK_GDBUS_SIGNAL_WIFI_TETHER_ON:
+               break;
+       case TETHERING_MOCK_GDBUS_SIGNAL_WIFI_TETHER_OFF:
+               params = g_variant_new("(s)", "There is no connection for a while");
+               break;
+       case TETHERING_MOCK_GDBUS_SIGNAL_USB_TETHER_ON:
+               break;
+       case TETHERING_MOCK_GDBUS_SIGNAL_USB_TETHER_OFF:
+               params = g_variant_new("(s)", "Interface is not available");
+               break;
+       case TETHERING_MOCK_GDBUS_SIGNAL_BT_TETHER_ON:
                break;
-       case TETHERING_MOCK_GDBUS_SIGNAL_OFF:
+       case TETHERING_MOCK_GDBUS_SIGNAL_BT_TETHER_OFF:
                params = g_variant_new("(s)", "There is no connection for a while");
                break;
+       case TETHERING_MOCK_GDBUS_SIGNAL_NO_DATA_TIMEOUT:
        case TETHERING_MOCK_GDBUS_SIGNAL_LOW_BATTERY_MODE:
        case TETHERING_MOCK_GDBUS_SIGNAL_FLIGHT_MODE:
                break;
        case TETHERING_MOCK_GDBUS_SIGNAL_SECURITY_TYPE_CHANGED:
+               params = g_variant_new("(s)", "wpa2-psk");
+               break;
        case TETHERING_MOCK_GDBUS_SIGNAL_SSID_VISIBILITY_CHANGED:
-               params = g_variant_new("(i)", 1);
+               params = g_variant_new("(s)", "ssid_visible");
                break;
        case TETHERING_MOCK_GDBUS_SIGNAL_PASSPHRASE_CHANGED:
                break;
        case TETHERING_MOCK_GDBUS_SIGNAL_DHCP_STATUS:
-               params = g_variant_new("(ssssu)", "DhcpConnected",
+               params = g_variant_new("(susssu)", "DhcpConnected", 1,
                                "192.168.43.24", "ab:cd:ef:ab:cd:ef",
                                "client", 1592460260);
                break;
@@ -136,7 +164,7 @@ guint __wrap_g_dbus_connection_signal_subscribe(GDBusConnection      *connection,
                gpointer                        user_data,
                GDestroyNotify          user_data_free_func)
 {
-       for (int i = 1; i < TETHERING_MOCK_GDBUS_SIGNAL_MAX; i++) {
+       for (int i = TETHERING_MOCK_GDBUS_SIGNAL_NET_CLOSED; i < TETHERING_MOCK_GDBUS_SIGNAL_MAX; i++) {
                if (strcmp(gdbus_signal_list[i], member) == 0) {
                        gdbus_signal_callbacks[i].callback = callback;
                        gdbus_signal_callbacks[i].user_data = user_data;
@@ -149,7 +177,7 @@ guint __wrap_g_dbus_connection_signal_subscribe(GDBusConnection      *connection,
 void __wrap_g_dbus_connection_signal_unsubscribe(GDBusConnection *connection,
                guint subscription_id)
 {
-       if (subscription_id >= TETHERING_MOCK_GDBUS_SIGNAL_ON
+       if (subscription_id >= TETHERING_MOCK_GDBUS_SIGNAL_NET_CLOSED
                        && subscription_id < TETHERING_MOCK_GDBUS_SIGNAL_MAX) {
                gdbus_signal_callbacks[subscription_id].callback = NULL;
                gdbus_signal_callbacks[subscription_id].user_data = NULL;
@@ -242,12 +270,34 @@ void __wrap_g_dbus_proxy_call(GDBusProxy  *proxy,
 {
        gdbus_async_callback.callback = callback;
        gdbus_async_callback.user_data = user_data;
+       gdbus_async_callback.method_name = method_name;
 }
 
 GVariant *__wrap_g_dbus_proxy_call_finish(GDBusProxy *proxy,
                GAsyncResult *res, GError **error)
 {
-       return g_variant_new("(u)", 0);
+       GVariant *params = NULL;
+       const char *method_name = gdbus_async_callback.method_name;
+
+       if (strcmp(method_name, gdbus_method_list[TETHERING_MOCK_GDBUS_METHOD_DISABLE_USB]) == 0)
+               params = g_variant_new("(uu)", TETHERING_MOCK_GDBUS_EVENT_DISABLE_USB, 0);
+       else if (strcmp(method_name, gdbus_method_list[TETHERING_MOCK_GDBUS_METHOD_DISABLE_WIFI]) == 0)
+               params = g_variant_new("(uu)", TETHERING_MOCK_GDBUS_EVENT_DISABLE_WIFI, 0);
+       else if (strcmp(method_name, gdbus_method_list[TETHERING_MOCK_GDBUS_METHOD_DISABLE_BT]) == 0)
+               params = g_variant_new("(uu)", TETHERING_MOCK_GDBUS_EVENT_DISABLE_BT, 0);
+       else if (strcmp(method_name, gdbus_method_list[TETHERING_MOCK_GDBUS_METHOD_DISABLE_P2P]) == 0)
+               params = g_variant_new("(uu)", TETHERING_MOCK_GDBUS_EVENT_DISABLE_P2P, 0);
+       else if (strcmp(method_name,
+                               gdbus_method_list[TETHERING_MOCK_GDBUS_METHOD_GET_DATA_PACKET_USAGE]) == 0)
+               params = g_variant_new("(utt)", 1, 123456, 2312412);
+       else
+               params = g_variant_new("(u)", 0);
+
+       gdbus_async_callback.callback = NULL;
+       gdbus_async_callback.user_data = NULL;
+       gdbus_async_callback.method_name = NULL;
+
+       return params;
 }
 
 void __wrap_g_dbus_proxy_set_default_timeout(GDBusProxy *proxy, gint timeout_msec)
index 78da14d..941d46f 100644 (file)
 #include <stdbool.h>
 
 enum {
-       TETHERING_MOCK_GDBUS_SIGNAL_ON = 1,
-       TETHERING_MOCK_GDBUS_SIGNAL_OFF,
+       TETHERING_MOCK_GDBUS_SIGNAL_NET_CLOSED = 0,
+       TETHERING_MOCK_GDBUS_SIGNAL_WIFI_TETHER_ON,
+       TETHERING_MOCK_GDBUS_SIGNAL_WIFI_TETHER_OFF,
+       TETHERING_MOCK_GDBUS_SIGNAL_USB_TETHER_ON,
+       TETHERING_MOCK_GDBUS_SIGNAL_USB_TETHER_OFF,
+       TETHERING_MOCK_GDBUS_SIGNAL_BT_TETHER_ON,
+       TETHERING_MOCK_GDBUS_SIGNAL_BT_TETHER_OFF,
+       TETHERING_MOCK_GDBUS_SIGNAL_NO_DATA_TIMEOUT,
        TETHERING_MOCK_GDBUS_SIGNAL_LOW_BATTERY_MODE,
        TETHERING_MOCK_GDBUS_SIGNAL_FLIGHT_MODE,
        TETHERING_MOCK_GDBUS_SIGNAL_SECURITY_TYPE_CHANGED,
@@ -30,6 +36,32 @@ enum {
        TETHERING_MOCK_GDBUS_SIGNAL_MAX
 };
 
+enum {
+       TETHERING_MOCK_GDBUS_METHOD_DISABLE_USB = 1,
+       TETHERING_MOCK_GDBUS_METHOD_DISABLE_WIFI,
+       TETHERING_MOCK_GDBUS_METHOD_DISABLE_BT,
+       TETHERING_MOCK_GDBUS_METHOD_DISABLE_P2P,
+       TETHERING_MOCK_GDBUS_METHOD_GET_DATA_PACKET_USAGE,
+       TETHERING_MOCK_GDBUS_METHOD_MAX
+};
+
+enum {
+       TETHERING_MOCK_GDBUS_EVENT_ENABLE = 0,
+       TETHERING_MOCK_GDBUS_EVENT_DISABLE,
+       TETHERING_MOCK_GDBUS_EVENT_ENABLE_WIFI,
+       TETHERING_MOCK_GDBUS_EVENT_DISABLE_WIFI,
+       TETHERING_MOCK_GDBUS_EVENT_CHANGE_WIFI,
+       TETHERING_MOCK_GDBUS_EVENT_ENABLE_USB,
+       TETHERING_MOCK_GDBUS_EVENT_DISABLE_USB,
+       TETHERING_MOCK_GDBUS_EVENT_ENABLE_BT,
+       TETHERING_MOCK_GDBUS_EVENT_DISABLE_BT,
+       TETHERING_MOCK_GDBUS_EVENT_ENABLE_P2P,
+       TETHERING_MOCK_GDBUS_EVENT_DISABLE_P2P,
+       TETHERING_MOCK_GDBUS_EVENT_GET_STATION_INFO,
+       TETHERING_MOCK_GDBUS_EVENT_GET_DATA_PACKET_USAGE,
+       TETHERING_MOCK_GDBUS_EVENT_MAX
+};
+
 void tethering_mock_set_gdbus_result(bool value);
 void tethering_mock_invoke_gdbus_async_callback(void);
 void tethering_mock_emit_gdbus_signal(int signo);
index 4f3c0ba..05c7a26 100644 (file)
@@ -52,12 +52,13 @@ int __wrap_vconf_get_int(const char *in_key, int *intval)
        if (!tethering_mock_vconf_result)
                return -1;
 
-       if (strncmp(in_key, VCONFKEY_MOBILE_HOTSPOT_MODE,
-                               strlen(VCONFKEY_MOBILE_HOTSPOT_MODE)) == 0) {
+       if (strcmp(in_key, VCONFKEY_MOBILE_HOTSPOT_MODE) == 0) {
                *intval |= tethering_mock_enabled_state.usb ? VCONFKEY_MOBILE_HOTSPOT_MODE_USB : 0;
                *intval |= tethering_mock_enabled_state.wifi ? VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI : 0;
                *intval |= tethering_mock_enabled_state.bluetooth ? VCONFKEY_MOBILE_HOTSPOT_MODE_BT : 0;
                *intval |= tethering_mock_enabled_state.p2p ? VCONFKEY_MOBILE_HOTSPOT_MODE_P2P : 0;
+       } else if (strcmp(in_key, VCONFKEY_MOBILE_HOTSPOT_SECURITY) == 0) {
+               *intval = 1; // PSK
        } else {
                *intval = 0;
        }
diff --git a/tests/tethering-gtest-async.cpp b/tests/tethering-gtest-async.cpp
new file mode 100755 (executable)
index 0000000..6a669fc
--- /dev/null
@@ -0,0 +1,621 @@
+/*
+* Copyright (c) 2020 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 <gtest/gtest.h>
+
+#include "tethering.h"
+
+extern "C" {
+#include "mocks/tethering_gdbus.h"
+#include "mocks/tethering_memory.h"
+#include "mocks/tethering_system_info.h"
+#include "mocks/tethering_vconf.h"
+}
+
+#include "tethering-gtest-util.h"
+
+static int resultFlags;
+static void enabledCallback(tethering_error_e result, tethering_type_e type,
+               bool requested, void *data);
+static void disabledCallback(tethering_error_e result, tethering_type_e type,
+               tethering_disabled_cause_e cause, void *data);
+
+class TetheringAsyncTest: public ::testing::Test {
+       protected:
+               tethering_h handle;
+               TetheringTestUtil testUtil;
+
+               void SetUp() override
+               {
+                       tethering_mock_set_gdbus_result(true);
+                       tethering_mock_set_memory_result(true);
+                       tethering_mock_set_sysinfo_result(true);
+                       tethering_mock_set_vconf_result(true);
+
+                       tethering_create(&handle);
+
+                       tethering_set_enabled_cb(handle, TETHERING_TYPE_USB, enabledCallback, NULL);
+                       tethering_set_enabled_cb(handle, TETHERING_TYPE_WIFI, enabledCallback, NULL);
+                       tethering_set_enabled_cb(handle, TETHERING_TYPE_BT, enabledCallback, NULL);
+                       tethering_set_enabled_cb(handle, TETHERING_TYPE_P2P, enabledCallback, NULL);
+
+                       tethering_set_disabled_cb(handle, TETHERING_TYPE_USB, disabledCallback, NULL);
+                       tethering_set_disabled_cb(handle, TETHERING_TYPE_WIFI, disabledCallback, NULL);
+                       tethering_set_disabled_cb(handle, TETHERING_TYPE_BT, disabledCallback, NULL);
+                       tethering_set_disabled_cb(handle, TETHERING_TYPE_P2P, disabledCallback, NULL);
+
+                       resultFlags = 0;
+               }
+
+               void TearDown() override
+               {
+                       tethering_unset_enabled_cb(handle, TETHERING_TYPE_USB);
+                       tethering_unset_enabled_cb(handle, TETHERING_TYPE_WIFI);
+                       tethering_unset_enabled_cb(handle, TETHERING_TYPE_BT);
+
+                       tethering_unset_disabled_cb(handle, TETHERING_TYPE_USB);
+                       tethering_unset_disabled_cb(handle, TETHERING_TYPE_WIFI);
+                       tethering_unset_disabled_cb(handle, TETHERING_TYPE_BT);
+
+                       tethering_destroy(handle);
+
+                       tethering_mock_set_vconf_result(false);
+                       tethering_mock_set_sysinfo_result(false);
+                       tethering_mock_set_memory_result(true);
+                       tethering_mock_set_gdbus_result(false);
+               }
+};
+
+enum {
+       TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST = 1 << 0,
+       TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_OTHERS = 1 << 1,
+       TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST = 1 << 2,
+       TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_OTHERS = 1 << 3,
+       TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_FLIGHT_MODE = 1 << 4,
+       TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_LOW_BATTERY = 1 << 5,
+       TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_TIMEOUT = 1 << 6,
+       TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_USB_DISCONNECTION = 1 >> 7,
+       TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_NET_CLOSED = 1 << 8,
+       TETHERING_GTEST_RESULT_FLAG_RELOADED = 1 << 9,
+       TETHERING_GTEST_RESULT_FLAG_CONNECTION_STATE_CHANGED = 1 << 10,
+       TETHERING_GTEST_RESULT_FLAG_SECURITY_TYPE_CHANGED = 1 << 11,
+       TETHERING_GTEST_RESULT_FLAG_SSID_VISIBILITY_CHANGED = 1 << 12,
+       TETHERING_GTEST_RESULT_FLAG_PASSPHRASE_CHANGED = 1 << 13,
+       TETHERING_GTEST_RESULT_FLAG_DATA_USAGE = 1 << 14,
+       TETHERING_GTEST_RESULT_FLAG_SUCCESS = 1 << 15,
+       TETHERING_GTEST_RESULT_FLAG_FAILURE = 1 << 16,
+};
+
+static void enabledCallback(tethering_error_e error,
+               tethering_type_e type, bool requested, void *user_data)
+{
+       resultFlags |= (error == TETHERING_ERROR_NONE)
+               ? TETHERING_GTEST_RESULT_FLAG_SUCCESS : TETHERING_GTEST_RESULT_FLAG_FAILURE;
+
+       resultFlags |= requested
+               ? TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST : TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_OTHERS;
+}
+
+static void disabledCallback(tethering_error_e error,
+               tethering_type_e type, tethering_disabled_cause_e cause, void *user_data)
+{
+       resultFlags |= (error == TETHERING_ERROR_NONE)
+               ? TETHERING_GTEST_RESULT_FLAG_SUCCESS : TETHERING_GTEST_RESULT_FLAG_FAILURE;
+
+       if (cause == TETHERING_DISABLED_BY_FLIGHT_MODE)
+               resultFlags |= TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_FLIGHT_MODE;
+       else if (cause == TETHERING_DISABLED_BY_LOW_BATTERY)
+               resultFlags |= TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_LOW_BATTERY;
+       else if (cause == TETHERING_DISABLED_BY_TIMEOUT)
+               resultFlags |= TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_TIMEOUT;
+       else if (cause == TETHERING_DISABLED_BY_NETWORK_CLOSE)
+               resultFlags |= TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_NET_CLOSED;
+       else if (cause == TETHERING_DISABLED_BY_OTHERS)
+               resultFlags |= TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_OTHERS;
+       else if (cause == TETHERING_DISABLED_BY_REQUEST)
+               resultFlags |= TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST;
+}
+
+static void dataUsageCallback(tethering_error_e result,
+               unsigned long long received_data, unsigned long long sent_data, void *user_data)
+{
+       resultFlags |= TETHERING_GTEST_RESULT_FLAG_DATA_USAGE;
+       resultFlags |= (result == TETHERING_ERROR_NONE)
+               ? TETHERING_GTEST_RESULT_FLAG_SUCCESS : TETHERING_GTEST_RESULT_FLAG_FAILURE;
+}
+
+static void reloadedCallback(tethering_error_e result, void *user_data)
+{
+       resultFlags |= TETHERING_GTEST_RESULT_FLAG_RELOADED;
+       resultFlags |= (result == TETHERING_ERROR_NONE)
+               ? TETHERING_GTEST_RESULT_FLAG_SUCCESS : TETHERING_GTEST_RESULT_FLAG_FAILURE;
+}
+
+static void connectionChangedCallback(tethering_client_h client, bool opened, void *user_data)
+{
+       resultFlags |= TETHERING_GTEST_RESULT_FLAG_CONNECTION_STATE_CHANGED;
+}
+
+static void securityTypeChangedCallback(tethering_wifi_security_type_e changed_type, void *user_data)
+{
+       resultFlags |= TETHERING_GTEST_RESULT_FLAG_SECURITY_TYPE_CHANGED;
+}
+
+static void ssidVisibilityChangedCallback(bool changed_visibile, void *user_data)
+{
+       resultFlags |= TETHERING_GTEST_RESULT_FLAG_SSID_VISIBILITY_CHANGED;
+}
+
+static void passphraseChangedCallback(void *user_data)
+{
+       resultFlags |= TETHERING_GTEST_RESULT_FLAG_PASSPHRASE_CHANGED;
+}
+
+TEST_F(TetheringAsyncTest, EnableN)
+{
+       EXPECT_EQ(TETHERING_ERROR_INVALID_PARAMETER, tethering_enable(NULL, TETHERING_TYPE_USB));
+       EXPECT_EQ(TETHERING_ERROR_INVALID_PARAMETER, tethering_enable(handle, (tethering_type_e)-1));
+}
+
+TEST_F(TetheringAsyncTest, EnableP1)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_enable(handle, TETHERING_TYPE_USB));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_ENABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, EnableP2)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_enable(handle, TETHERING_TYPE_WIFI));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_ENABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, EnableP3)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_enable(handle, TETHERING_TYPE_BT));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_ENABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, EnableP4)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_enable(handle, TETHERING_TYPE_P2P));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_ENABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, EnableP5)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_enable(handle, TETHERING_TYPE_ALL));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_ENABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, DisableN)
+{
+       EXPECT_EQ(TETHERING_ERROR_INVALID_PARAMETER, tethering_disable(NULL, TETHERING_TYPE_USB));
+       EXPECT_EQ(TETHERING_ERROR_INVALID_PARAMETER, tethering_disable(handle, (tethering_type_e)-1));
+}
+
+TEST_F(TetheringAsyncTest, DisableP1)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_disable(handle, TETHERING_TYPE_USB));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_DISABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, DisableP2)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_disable(handle, TETHERING_TYPE_WIFI));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_DISABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, DisableP3)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_disable(handle, TETHERING_TYPE_BT));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_DISABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, DisableP4)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_disable(handle, TETHERING_TYPE_P2P));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_DISABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, DisableP5)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_disable(handle, TETHERING_TYPE_ALL));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_DISABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, Ipv6EnableN)
+{
+       EXPECT_EQ(TETHERING_ERROR_INVALID_PARAMETER, tethering_ipv6_enable(NULL, TETHERING_TYPE_USB));
+       EXPECT_EQ(TETHERING_ERROR_INVALID_PARAMETER, tethering_ipv6_enable(handle, (tethering_type_e)-1));
+}
+
+TEST_F(TetheringAsyncTest, Ipv6EnableP1)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_ipv6_enable(handle, TETHERING_TYPE_USB));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_ENABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, Ipv6EnableP2)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_ipv6_enable(handle, TETHERING_TYPE_WIFI));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_ENABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, Ipv6EnableP3)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_ipv6_enable(handle, TETHERING_TYPE_BT));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_ENABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, Ipv6DisableN)
+{
+       EXPECT_EQ(TETHERING_ERROR_INVALID_PARAMETER, tethering_ipv6_disable(NULL, TETHERING_TYPE_USB));
+       EXPECT_EQ(TETHERING_ERROR_INVALID_PARAMETER, tethering_ipv6_disable(handle, (tethering_type_e)-1));
+}
+
+TEST_F(TetheringAsyncTest, Ipv6DisableP1)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_ipv6_disable(handle, TETHERING_TYPE_USB));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_DISABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, Ipv6DisableP2)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_ipv6_disable(handle, TETHERING_TYPE_WIFI));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_DISABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, Ipv6DisableP3)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_ipv6_disable(handle, TETHERING_TYPE_BT));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_DISABLE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_REQUEST);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, GetDataUsageN)
+{
+       EXPECT_EQ(TETHERING_ERROR_INVALID_PARAMETER,
+                       tethering_get_data_usage(NULL, dataUsageCallback, NULL));
+       EXPECT_EQ(TETHERING_ERROR_INVALID_PARAMETER,
+                       tethering_get_data_usage(handle, NULL, NULL));
+
+       tethering_mock_set_enabled_state(false, false, false, false);
+       EXPECT_EQ(TETHERING_ERROR_NOT_ENABLED,
+                       tethering_get_data_usage(handle, dataUsageCallback, NULL));
+}
+
+TEST_F(TetheringAsyncTest, GetDataUsageP)
+{
+       tethering_mock_set_enabled_state(true, true, true, true);
+
+       EXPECT_EQ(TETHERING_ERROR_NONE,
+                       tethering_get_data_usage(handle, dataUsageCallback, NULL));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_DATA_USAGE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DATA_USAGE,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DATA_USAGE);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, ReloadSettingsN)
+{
+       EXPECT_EQ(TETHERING_ERROR_INVALID_PARAMETER, tethering_wifi_reload_settings(NULL, reloadedCallback, NULL));
+       EXPECT_EQ(TETHERING_ERROR_INVALID_PARAMETER, tethering_wifi_reload_settings(handle, NULL, NULL));
+       EXPECT_EQ(TETHERING_ERROR_INVALID_PARAMETER, tethering_wifi_reload_settings(NULL, NULL, NULL));
+}
+
+TEST_F(TetheringAsyncTest, ReloadSettingsP)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE, tethering_wifi_reload_settings(handle, reloadedCallback, NULL));
+
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_RELOAD);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_RELOADED, resultFlags & TETHERING_GTEST_RESULT_FLAG_RELOADED);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+// Positive only.
+// In case of an error, signals aren't emitted.
+TEST_F(TetheringAsyncTest, EnableEventP1)
+{
+       // wait changed callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_WIFI_ENABLE_EVENT);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_OTHERS,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_OTHERS);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, EnableEventP2)
+{
+       // wait changed callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_USB_ENABLE_EVENT);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_OTHERS,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_OTHERS);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, EnableEventP3)
+{
+       // wait changed callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_BT_ENABLE_EVENT);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_OTHERS,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_ENABLED_BY_OTHERS);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, DisableEventP1)
+{
+       // wait changed callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_WIFI_DISABLE_EVENT);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_TIMEOUT,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_TIMEOUT);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, DisableEventP2)
+{
+       // wait changed callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_USB_DISABLE_EVENT);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_USB_DISCONNECTION,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_USB_DISCONNECTION);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, DisableEventP3)
+{
+       // wait changed callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_BT_DISABLE_EVENT);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_TIMEOUT,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_TIMEOUT);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, ConnectionStateChangedEventP)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE,
+                       tethering_set_connection_state_changed_cb(handle,
+                               TETHERING_TYPE_USB, connectionChangedCallback, NULL));
+
+       // wait changed callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_CONNECTION_CHANGED);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_CONNECTION_STATE_CHANGED,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_CONNECTION_STATE_CHANGED);
+       EXPECT_EQ(TETHERING_ERROR_NONE,
+                       tethering_unset_connection_state_changed_cb(handle, TETHERING_TYPE_USB));
+}
+
+TEST_F(TetheringAsyncTest, SecurityTypeChangedEventP)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE,
+                       tethering_wifi_set_security_type_changed_cb(handle, securityTypeChangedCallback, NULL));
+
+       tethering_wifi_reload_settings(handle, reloadedCallback, NULL);
+
+       // wait reloaded callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_RELOAD);
+       testUtil.runMainLoop();
+       resultFlags = false;
+
+       // wait changed callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_SECURITY_TYPE_CHANGED);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SECURITY_TYPE_CHANGED,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_SECURITY_TYPE_CHANGED);
+       EXPECT_EQ(TETHERING_ERROR_NONE,
+                       tethering_wifi_unset_security_type_changed_cb(handle));
+}
+
+TEST_F(TetheringAsyncTest, SsidVisibilityChangedEventP)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE,
+                       tethering_wifi_set_ssid_visibility_changed_cb(handle,
+                               ssidVisibilityChangedCallback, NULL));
+
+       tethering_wifi_reload_settings(handle, reloadedCallback, NULL);
+
+       // wait reloaded callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_RELOAD);
+       testUtil.runMainLoop();
+       resultFlags = false;
+
+       // wait changed callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_SSID_VISIBILITY_CHANGED);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SSID_VISIBILITY_CHANGED,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_SSID_VISIBILITY_CHANGED);
+       EXPECT_EQ(TETHERING_ERROR_NONE,
+                       tethering_wifi_unset_ssid_visibility_changed_cb(handle));
+}
+
+TEST_F(TetheringAsyncTest, PassphraseChangedEventP)
+{
+       EXPECT_EQ(TETHERING_ERROR_NONE,
+                       tethering_wifi_set_passphrase_changed_cb(handle, passphraseChangedCallback, NULL));
+
+       tethering_wifi_reload_settings(handle, reloadedCallback, NULL);
+
+       // wait reloaded callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_RELOAD);
+       testUtil.runMainLoop();
+       resultFlags = false;
+
+       // wait changed callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_PASSPHRASE_CHANGED);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_PASSPHRASE_CHANGED,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_PASSPHRASE_CHANGED);
+       EXPECT_EQ(TETHERING_ERROR_NONE,
+                       tethering_wifi_unset_passphrase_changed_cb(handle));
+}
+
+TEST_F(TetheringAsyncTest, NoDataTimeoutEventP)
+{
+       // wait changed callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_NO_DATA_TIMEOUT);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_TIMEOUT,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_TIMEOUT);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, LowBatterModeEventP)
+{
+       // wait changed callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_LOW_BATTERY_MODE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_LOW_BATTERY,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_LOW_BATTERY);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, FlightModeEventP)
+{
+       // wait changed callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_FLIGHT_MODE);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_FLIGHT_MODE,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_FLIGHT_MODE);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
+
+TEST_F(TetheringAsyncTest, NetClosedEventP)
+{
+       // wait changed callback.
+       testUtil.setTestType(TETHERING_TEST_UTIL_TYPE_NET_CLOSED);
+       testUtil.runMainLoop();
+
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_NET_CLOSED,
+                       resultFlags & TETHERING_GTEST_RESULT_FLAG_DISABLED_BY_NET_CLOSED);
+       EXPECT_EQ(TETHERING_GTEST_RESULT_FLAG_SUCCESS, resultFlags & TETHERING_GTEST_RESULT_FLAG_SUCCESS);
+}
diff --git a/tests/tethering-gtest-util.cpp b/tests/tethering-gtest-util.cpp
new file mode 100755 (executable)
index 0000000..d8d00d8
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+* Copyright (c) 2020 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 "tethering-gtest-util.h"
+
+#include <glib.h>
+
+extern "C" {
+#include "mocks/tethering_gdbus.h"
+};
+
+TetheringTestUtil::TetheringTestUtil(void) : testType(TETHERING_TEST_UTIL_MAX), mainLoop(NULL), timeoutId(0)
+{
+}
+
+TetheringTestUtil::~TetheringTestUtil(void)
+{
+}
+
+void TetheringTestUtil::setTestType(int type)
+{
+       testType = type;
+}
+
+int TetheringTestUtil::getTestType(void)
+{
+       return testType;
+}
+
+void TetheringTestUtil::runMainLoop(void)
+{
+       mainLoop = g_main_loop_new(NULL, false);
+       timeoutId = g_timeout_add(10, TetheringTestUtil::timeoutCallback, this);
+       g_main_loop_run(mainLoop);
+}
+
+void TetheringTestUtil::stopMainLoop(void)
+{
+       if (mainLoop)
+               g_main_loop_quit(mainLoop);
+
+       if (timeoutId)
+               g_source_remove(timeoutId);
+}
+
+gboolean TetheringTestUtil::timeoutCallback(gpointer user_data)
+{
+       TetheringTestUtil *util = (TetheringTestUtil *)user_data;
+       int type = util->getTestType();
+
+       switch(type) {
+       case TETHERING_TEST_UTIL_TYPE_ENABLE:
+       case TETHERING_TEST_UTIL_TYPE_DISABLE:
+       case TETHERING_TEST_UTIL_TYPE_RELOAD:
+       case TETHERING_TEST_UTIL_TYPE_DATA_USAGE:
+               tethering_mock_invoke_gdbus_async_callback();
+               break;
+       case TETHERING_TEST_UTIL_TYPE_WIFI_ENABLE_EVENT:
+               tethering_mock_emit_gdbus_signal(TETHERING_MOCK_GDBUS_SIGNAL_WIFI_TETHER_ON);
+               break;
+       case TETHERING_TEST_UTIL_TYPE_WIFI_DISABLE_EVENT:
+               tethering_mock_emit_gdbus_signal(TETHERING_MOCK_GDBUS_SIGNAL_WIFI_TETHER_OFF);
+               break;
+       case TETHERING_TEST_UTIL_TYPE_USB_ENABLE_EVENT:
+               tethering_mock_emit_gdbus_signal(TETHERING_MOCK_GDBUS_SIGNAL_USB_TETHER_ON);
+               break;
+       case TETHERING_TEST_UTIL_TYPE_USB_DISABLE_EVENT:
+               tethering_mock_emit_gdbus_signal(TETHERING_MOCK_GDBUS_SIGNAL_USB_TETHER_OFF);
+               break;
+       case TETHERING_TEST_UTIL_TYPE_BT_ENABLE_EVENT:
+               tethering_mock_emit_gdbus_signal(TETHERING_MOCK_GDBUS_SIGNAL_BT_TETHER_ON);
+               break;
+       case TETHERING_TEST_UTIL_TYPE_BT_DISABLE_EVENT:
+               tethering_mock_emit_gdbus_signal(TETHERING_MOCK_GDBUS_SIGNAL_BT_TETHER_OFF);
+               break;
+       case TETHERING_TEST_UTIL_TYPE_NO_DATA_TIMEOUT:
+               tethering_mock_emit_gdbus_signal(TETHERING_MOCK_GDBUS_SIGNAL_NO_DATA_TIMEOUT);
+               break;
+       case TETHERING_TEST_UTIL_TYPE_LOW_BATTERY_MODE:
+               tethering_mock_emit_gdbus_signal(TETHERING_MOCK_GDBUS_SIGNAL_LOW_BATTERY_MODE);
+               break;
+       case TETHERING_TEST_UTIL_TYPE_FLIGHT_MODE:
+               tethering_mock_emit_gdbus_signal(TETHERING_MOCK_GDBUS_SIGNAL_FLIGHT_MODE);
+               break;
+       case TETHERING_TEST_UTIL_TYPE_NET_CLOSED:
+               tethering_mock_emit_gdbus_signal(TETHERING_MOCK_GDBUS_SIGNAL_NET_CLOSED);
+               break;
+       case TETHERING_TEST_UTIL_TYPE_SECURITY_TYPE_CHANGED:
+               tethering_mock_emit_gdbus_signal(TETHERING_MOCK_GDBUS_SIGNAL_SECURITY_TYPE_CHANGED);
+               break;
+       case TETHERING_TEST_UTIL_TYPE_SSID_VISIBILITY_CHANGED:
+               tethering_mock_emit_gdbus_signal(TETHERING_MOCK_GDBUS_SIGNAL_SSID_VISIBILITY_CHANGED);
+               break;
+       case TETHERING_TEST_UTIL_TYPE_PASSPHRASE_CHANGED:
+               tethering_mock_emit_gdbus_signal(TETHERING_MOCK_GDBUS_SIGNAL_PASSPHRASE_CHANGED);
+               break;
+       case TETHERING_TEST_UTIL_TYPE_CONNECTION_CHANGED:
+               tethering_mock_emit_gdbus_signal(TETHERING_MOCK_GDBUS_SIGNAL_DHCP_STATUS);
+               break;
+       case TETHERING_TEST_UTIL_MAX:
+       default:
+               // Do Nothing.
+               break;
+       }
+
+       util->stopMainLoop();
+
+    return FALSE;
+}
diff --git a/tests/tethering-gtest-util.h b/tests/tethering-gtest-util.h
new file mode 100755 (executable)
index 0000000..a74aa55
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+* Copyright (c) 2020 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 <glib.h>
+
+enum {
+       TETHERING_TEST_UTIL_TYPE_ENABLE = 0,
+       TETHERING_TEST_UTIL_TYPE_DISABLE,
+       TETHERING_TEST_UTIL_TYPE_RELOAD,
+       TETHERING_TEST_UTIL_TYPE_WIFI_ENABLE_EVENT,
+       TETHERING_TEST_UTIL_TYPE_WIFI_DISABLE_EVENT,
+       TETHERING_TEST_UTIL_TYPE_USB_ENABLE_EVENT,
+       TETHERING_TEST_UTIL_TYPE_USB_DISABLE_EVENT,
+       TETHERING_TEST_UTIL_TYPE_BT_ENABLE_EVENT,
+       TETHERING_TEST_UTIL_TYPE_BT_DISABLE_EVENT,
+       TETHERING_TEST_UTIL_TYPE_NO_DATA_TIMEOUT,
+       TETHERING_TEST_UTIL_TYPE_LOW_BATTERY_MODE,
+       TETHERING_TEST_UTIL_TYPE_FLIGHT_MODE,
+       TETHERING_TEST_UTIL_TYPE_NET_CLOSED,
+       TETHERING_TEST_UTIL_TYPE_SECURITY_TYPE_CHANGED,
+       TETHERING_TEST_UTIL_TYPE_SSID_VISIBILITY_CHANGED,
+       TETHERING_TEST_UTIL_TYPE_PASSPHRASE_CHANGED,
+       TETHERING_TEST_UTIL_TYPE_CONNECTION_CHANGED,
+       TETHERING_TEST_UTIL_TYPE_DATA_USAGE,
+       TETHERING_TEST_UTIL_MAX
+};
+
+class TetheringTestUtil
+{
+public:
+       TetheringTestUtil(void);
+       ~TetheringTestUtil();
+
+       void runMainLoop(void);
+       void setTestType(int type);
+       int getTestType(void);
+
+private:
+       int testType;
+       GMainLoop *mainLoop;
+       guint timeoutId;
+
+       void stopMainLoop(void);
+
+       static gboolean timeoutCallback(gpointer user_data);
+};