2 * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * TODO: Add logic to methodcall and it's mock reply.
19 * TODO: Add logic to emit mock signals.
23 #include "mock_gdbus.h"
28 static bool mock_gdbus_result;
29 static bool mock_gdbus_devicePolicy;
30 static bool mock_gdbus_powered;
31 #define MOCK_TECH_COUNT_MAX 2
32 #define MOCK_SERVICES_COUNT_MAX 2
33 #define ERROR_DOMAIN 5
37 GAsyncReadyCallback callback;
39 const char *method_name;
40 } gdbus_async_callback_info_s;
44 GDBusSignalCallback callback;
46 } gdbus_signal_callback_info_s;
49 static const char *gdbus_signal_list[WIFI_MOCK_GDBUS_SIGNAL_MAX] = {
50 [WIFI_MOCK_GDBUS_SIGNAL_STATE_CHANGED_PROPERTIES] = "StateChangedPropertie",
51 [WIFI_MOCK_GDBUS_SIGNAL_PROPERTY_CHANGED] = "PropertyChanged",
52 [WIFI_MOCK_GDBUS_SIGNAL_SCAN_CHANGED] = "ScanChanged",
53 [WIFI_MOCK_GDBUS_SIGNAL_SCAN_DONE] = "ScanDone",
56 static gdbus_signal_callback_info_s gdbus_signal_callbacks[WIFI_MOCK_GDBUS_SIGNAL_MAX] = {
57 {NULL, NULL}, {NULL, NULL}, {NULL, NULL}, {NULL, NULL} }; // {NULL, NULL},
58 // {NULL, NULL}, {NULL, NULL}, {NULL, NULL}, {NULL, NULL} };
61 static gdbus_async_callback_info_s gdbus_async_callback = {NULL, NULL};
65 const char *mac_address;
71 const char *EncryptionMode;
74 const char *Interface;
76 } mock_gdbus_services_s;
78 char *err_msg[ERROR_MAX] = {"", "PermissionDenied", "AccessDenied", "AlreadyExists", "InProgress", "Device or resource busy", "NULL" };
81 mock_gdbus_tech_s mock_tech[MOCK_TECH_COUNT_MAX] = {
82 {"wlan0", "11:22:33:44:55:66", 0, 0},
83 {"wlan1", "66:55:44:33:22:11", 0, 0}
86 mock_gdbus_services_s mock_services[MOCK_SERVICES_COUNT_MAX] = {
87 {"wep", "ready", "TEMP_AP1", "wlan0", "11:22:33:44:55:66"},
88 {"aes", "ready", "TEMP_AP2", "wlan0", "11:22:33:44:55:66"}
91 void mock_set_gdbus_tech_state(const char *ifname, bool powered, bool connected)
93 for (int i = 0; i < MOCK_TECH_COUNT_MAX; i++) {
94 if (g_strcmp0(mock_tech[i].ifname, ifname) != 0)
97 mock_tech[i].powered = powered;
98 mock_tech[i].connected = connected;
103 void mock_set_gdbus_error_msg(int error)
108 static GVariant * __get_mock_variant_get_technologies(void)
110 GVariant *return_parameter;
111 GVariantBuilder *builder_technologies = g_variant_builder_new(G_VARIANT_TYPE("a(oa{sv})"));;
112 GVariantBuilder *builder_technology = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
113 GVariantBuilder *deviceList = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
114 const gchar *object_path = "/net/connman/technology/wifi";
116 // TODO: fill technology data
117 g_variant_builder_add(builder_technology, "{sv}", "Name", g_variant_new_string("WiFi"));
118 g_variant_builder_add(builder_technology, "{sv}", "Type", g_variant_new_string("wifi"));
119 g_variant_builder_add(builder_technology, "{sv}", "Tethering", g_variant_new_boolean(FALSE));
120 g_variant_builder_add(builder_technology, "{sv}", "Powered", g_variant_new_boolean(TRUE));
121 g_variant_builder_add(builder_technology, "{sv}", "Connected", g_variant_new_boolean(FALSE));
123 for (int i = 0; i < MOCK_TECH_COUNT_MAX; i++) {
125 g_variant_builder_add(deviceList, "{sv}", "Ifname", g_variant_new_string(mock_tech[i].ifname));
126 g_variant_builder_add(deviceList, "{sv}", "Powered", g_variant_new_boolean(mock_tech[i].powered));
127 g_variant_builder_add(deviceList, "{sv}", "Connected", g_variant_new_boolean(mock_tech[i].connected));
128 g_variant_builder_add(deviceList, "{sv}", "MAC.Address", g_variant_new_string(mock_tech[i].mac_address));
131 g_variant_builder_add(builder_technology, "{sv}", "Device.List", g_variant_builder_end(deviceList));
133 g_variant_builder_add(builder_technologies, "(oa{sv})", object_path, builder_technology);
135 return_parameter = g_variant_new("(a(oa{sv}))", builder_technologies);
138 g_variant_builder_unref(deviceList);
139 g_variant_builder_unref(builder_technology);
140 g_variant_builder_unref(builder_technologies);
142 return return_parameter;
145 static GVariant * __get_mock_variant_get_DevicePolicyGetWifi(void)
148 if (mock_gdbus_devicePolicy)
149 value = g_variant_new("(i)", 0);
151 value = g_variant_new("(i)", 1);
156 static GVariant * __get_mock_variant_int(void)
158 return g_variant_new("(i)", 0);
161 static GVariant * __get_mock_variant_uint(void)
163 return g_variant_new("(u)", 1);
166 static GVariant * __get_mock_variant_bool(void)
168 return g_variant_new("(b)", TRUE);
171 static GVariant * __get_mock_variant_get_scanstate(void)
174 GVariantBuilder *scanstate = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
175 //g_variant_builder_add(scanstate, "{sv}", g_variant_new_string(mock_tech[0].ifname), g_variant_new_boolean(FALSE));
176 g_variant_builder_add(scanstate, "{sv}", "wlan0", g_variant_new_boolean(FALSE));
177 value = g_variant_new("(a{sv})", scanstate);
181 static GVariant * __get_mock_variant_get_services(void)
183 GVariant *return_parameter;
184 GVariantBuilder *builder_services = g_variant_builder_new(G_VARIANT_TYPE("a(oa{sv})"));;
186 for (i = 0; i < MOCK_SERVICES_COUNT_MAX; i++) {
187 GVariantBuilder *builder_service = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
188 GVariantBuilder *builder_eth = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
189 const gchar *object_path = "/net/connman/service/wifi_112233445566_496e6672612d36412d33_managed_psk";
191 // TODO: fill service data
192 g_variant_builder_add(builder_service, "{sv}", "EncryptionMode", g_variant_new_string(mock_services[i].EncryptionMode));
193 g_variant_builder_add(builder_service, "{sv}", "BSSID", g_variant_new_string(mock_services[i].BssId));
194 g_variant_builder_add(builder_service, "{sv}", "State", g_variant_new_string(mock_services[i].State));
195 g_variant_builder_add(builder_service, "{sv}", "Name", g_variant_new_string(mock_services[i].Name));
197 g_variant_builder_add(builder_eth, "{sv}", "Interface", g_variant_new_string(mock_services[i].Interface));
199 g_variant_builder_add(builder_service, "{sv}", "Ethernet", g_variant_builder_end(builder_eth));
200 g_variant_builder_add(builder_services, "(oa{sv})", object_path, builder_service);
201 g_variant_builder_unref(builder_service);
202 g_variant_builder_unref(builder_eth);
204 return_parameter = g_variant_new("(a(oa{sv}))", builder_services);
206 //g_variant_builder_unref(builder_service);
207 g_variant_builder_unref(builder_services);
209 return return_parameter;
212 static GVariant * __get_mock_variant_get_properties(void)
214 GVariant *return_parameter;
215 GVariantBuilder *builder_properties = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
217 g_variant_builder_add(builder_properties, "{sv}", "MacPolicy", g_variant_new_uint32(1));
218 g_variant_builder_add(builder_properties, "{sv}", "PreassocMacPolicy", g_variant_new_uint32(2));
219 g_variant_builder_add(builder_properties, "{sv}", "RandomMacAddrLifetime", g_variant_new_uint32(20));
221 g_variant_builder_add(builder_properties, "{sv}", "AutoConnect", g_variant_new_boolean(TRUE));
223 return_parameter = g_variant_new("(a{sv})", builder_properties);
225 g_variant_builder_unref(builder_properties);
227 return return_parameter;
230 static GVariant * __get_mock_variant_get_interfaces(void)
232 const gchar *interface_name = "wlan0";
233 GVariantBuilder *builder_interfaces = g_variant_builder_new(G_VARIANT_TYPE("as"));
235 g_variant_builder_add(builder_interfaces, "s", interface_name);
237 return g_variant_new("(as)", builder_interfaces);
240 static GVariant * __get_mock_variant_string(void)
242 return g_variant_new("(s)", "dummy");
245 void mock_set_gdbus_result(bool value)
247 mock_gdbus_result = value;
250 void mock_set_gdbus_devicePolicy(bool value)
252 mock_gdbus_devicePolicy = value;
255 void mock_set_gdbus_powered(bool value)
257 mock_gdbus_powered = value;
260 GCancellable *__wrap_g_cancellable_new(void)
262 if (mock_gdbus_result == false)
265 return (GCancellable *)g_object_new(G_TYPE_CANCELLABLE, NULL);
268 GDBusConnection *__wrap_g_bus_get_sync(GBusType bus_type, GCancellable *cancellable, GError **error)
270 if (mock_gdbus_result == false)
273 return (GDBusConnection *)g_object_new(G_TYPE_DBUS_CONNECTION, NULL);
276 typedef GVariant * (*g_dbus_reply_fn)(void);
279 const char *method_name;
281 } method_call_reply_s;
283 method_call_reply_s g_dbus_reply[] = {
284 {"GetTechnologies", __get_mock_variant_get_technologies},
285 {"GetServices", __get_mock_variant_get_services},
286 {"GetProperties", __get_mock_variant_get_properties},
287 {"GetInterfaces", __get_mock_variant_get_interfaces},
288 {"DevicePolicyGetWifi", __get_mock_variant_get_DevicePolicyGetWifi},
289 {"GetScanState", __get_mock_variant_get_scanstate},
290 {"IpConflictSetEnable", __get_mock_variant_int},
291 {"SetIpConflictPeriod", __get_mock_variant_int},
292 {"GetIpConflictPeriod", __get_mock_variant_uint},
293 {"GetIpConflictState", __get_mock_variant_uint},
294 {"SetProperty", __get_mock_variant_int},
295 {"GetAutoscan", __get_mock_variant_bool},
296 {"GetAutoscanmode", __get_mock_variant_uint},
297 {"FlushBss", __get_mock_variant_int},
298 {"CheckGetPrivilege", __get_mock_variant_int},
299 {"GetMaxScanSsid", __get_mock_variant_get_scanstate},
300 {"Get5GhzSupported", __get_mock_variant_get_scanstate},
301 {"ResumeBgscan", __get_mock_variant_string},
302 {"PauseBgscan", __get_mock_variant_string},
303 {"AddVsie", __get_mock_variant_string},
304 {"GetVsie", __get_mock_variant_string},
305 {"RemoveVsie", __get_mock_variant_string},
306 {"TdlsDiscover", __get_mock_variant_int},
307 {"TdlsConnect", __get_mock_variant_int},
308 {"TdlsDisconnect", __get_mock_variant_int},
309 {"TdlsConnectedPeer", __get_mock_variant_string},
310 {"SetBgscan", __get_mock_variant_int},
311 {"SaveConfiguration", __get_mock_variant_int},
312 {"SaveEapConfiguration", __get_mock_variant_int},
313 {"TdlsChannelSwitch", __get_mock_variant_int},
314 {"TdlsCancelChannelSwitch", __get_mock_variant_int},
315 {"LoadConfiguration", __get_mock_variant_get_scanstate},
316 {"GetConfigIds", __get_mock_variant_get_interfaces},
317 {"SetBSSID", __get_mock_variant_int},
321 GVariant *__wrap_g_dbus_connection_call_sync(GDBusConnection *connection,
322 const gchar *bus_name,
323 const gchar *object_path,
324 const gchar *interface_name,
325 const gchar *method_name,
326 GVariant *parameters,
327 const GVariantType *reply_type,
328 GDBusCallFlags flags,
330 GCancellable *cancellable,
333 if (mock_gdbus_result == false)
337 g_set_error(error, ERROR_DOMAIN, ERROR_CODE, "error message %s", err_msg[err_no]);
342 for (int i = 0; g_dbus_reply[i].method_name; i++)
343 if (!g_strcmp0(g_dbus_reply[i].method_name, method_name))
344 return g_dbus_reply[i].fn();
349 void __wrap_g_dbus_connection_call(GDBusConnection *connection,
350 const gchar *bus_name,
351 const gchar *object_path,
352 const gchar *interface_name,
353 const gchar *method_name,
354 GVariant *parameters,
355 const GVariantType *reply_type,
356 GDBusCallFlags flags,
358 GCancellable *cancellable,
359 GAsyncReadyCallback callback,
362 if (mock_gdbus_result == false)
365 gdbus_async_callback.callback = callback;
366 gdbus_async_callback.user_data = user_data;
367 gdbus_async_callback.method_name = method_name;
372 GVariant * __wrap_g_dbus_connection_call_finish(GDBusConnection *connection,
376 GVariant *params = NULL;
377 const char *method_name = gdbus_async_callback.method_name;
378 if (mock_gdbus_result == false)
380 if ((strcmp(method_name, "LoadDriver") == 0) || (strcmp(method_name, "RemoveDriver") == 0)) {
381 if (!g_strcmp0("", err_msg[err_no]))
384 g_set_error(error, ERROR_DOMAIN, ERROR_CODE, "error message %s", err_msg[err_no]);
385 params = g_variant_new("(u)", 0);
386 } else if (strcmp(method_name, "ScanDevice") == 0) {
387 g_set_error(error, ERROR_DOMAIN, ERROR_CODE, "error message %s", err_msg[err_no]);
388 params = g_variant_new("(u)", 0);
389 } else if (strcmp(method_name, "SpecificScan") == 0) {
390 g_set_error(error, ERROR_DOMAIN, ERROR_CODE, "error message %s", err_msg[err_no]);
391 params = g_variant_new("(u)", 0);
394 gdbus_async_callback.callback = NULL;
395 gdbus_async_callback.user_data = NULL;
396 gdbus_async_callback.method_name = NULL;
402 void mock_invoke_gdbus_async_callback(void)
404 if (!gdbus_async_callback.callback)
406 gdbus_async_callback.callback(NULL, NULL, gdbus_async_callback.user_data);
410 void mock_emit_gdbus_signal(int signo)
412 if (signo < WIFI_MOCK_GDBUS_SIGNAL_STATE_CHANGED_PROPERTIES || signo >= WIFI_MOCK_GDBUS_SIGNAL_MAX)
415 if (!gdbus_signal_callbacks[signo].callback)
418 GVariant *params = NULL;
421 case TETHERING_MOCK_GDBUS_SIGNAL_NET_CLOSED:
423 case TETHERING_MOCK_GDBUS_SIGNAL_WIFI_TETHER_ON:
425 case TETHERING_MOCK_GDBUS_SIGNAL_WIFI_TETHER_OFF:
426 params = g_variant_new("(s)", "There is no connection for a while");
428 case TETHERING_MOCK_GDBUS_SIGNAL_USB_TETHER_ON:
430 case TETHERING_MOCK_GDBUS_SIGNAL_USB_TETHER_OFF:
431 params = g_variant_new("(s)", "Interface is not available");
433 case TETHERING_MOCK_GDBUS_SIGNAL_BT_TETHER_ON:
435 case TETHERING_MOCK_GDBUS_SIGNAL_BT_TETHER_OFF:
436 params = g_variant_new("(s)", "There is no connection for a while");
438 case TETHERING_MOCK_GDBUS_SIGNAL_NO_DATA_TIMEOUT:
439 case TETHERING_MOCK_GDBUS_SIGNAL_LOW_BATTERY_MODE:
440 case TETHERING_MOCK_GDBUS_SIGNAL_FLIGHT_MODE:
442 case TETHERING_MOCK_GDBUS_SIGNAL_SECURITY_TYPE_CHANGED:
443 params = g_variant_new("(s)", "wpa2-psk");
445 case TETHERING_MOCK_GDBUS_SIGNAL_SSID_VISIBILITY_CHANGED:
446 params = g_variant_new("(s)", "ssid_visible");
448 case TETHERING_MOCK_GDBUS_SIGNAL_PASSPHRASE_CHANGED:
450 case TETHERING_MOCK_GDBUS_SIGNAL_DHCP_STATUS:
451 params = g_variant_new("(susssu)", "DhcpConnected", 1,
452 "192.168.43.24", "ab:cd:ef:ab:cd:ef",
453 "client", 1592460260);
458 gdbus_signal_callbacks[signo].callback(NULL, NULL,
459 NULL, NULL, gdbus_signal_list[signo],
460 params, gdbus_signal_callbacks[signo].user_data);
464 guint __wrap_g_dbus_connection_signal_subscribe(GDBusConnection *connection,
466 const gchar *interface_name,
468 const gchar *object_path,
470 GDBusSignalFlags flags,
471 GDBusSignalCallback callback,
473 GDestroyNotify user_data_free_func)
475 if (mock_gdbus_result == false)
482 for (int i = WIFI_MOCK_GDBUS_SIGNAL_STATE_CHANGED_PROPERTIES; i < WIFI_MOCK_GDBUS_SIGNAL_MAX; i++) {
483 if (strcmp(gdbus_signal_list[i], member) == 0) {
484 gdbus_signal_callbacks[i].callback = callback;
485 gdbus_signal_callbacks[i].user_data = user_data;
493 void __wrap_g_dbus_connection_signal_unsubscribe(GDBusConnection *connection,
494 guint subscription_id)
496 if (mock_gdbus_result == false)
499 if (subscription_id >= WIFI_MOCK_GDBUS_SIGNAL_STATE_CHANGED_PROPERTIES
500 && subscription_id < WIFI_MOCK_GDBUS_SIGNAL_MAX) {
501 gdbus_signal_callbacks[subscription_id].callback = NULL;
502 gdbus_signal_callbacks[subscription_id].user_data = NULL;