[WTF] Add environment variable helpers
[WebKit-https.git] / Tools / TestWebKitAPI / glib / WebKitGLib / WebKitTestBus.cpp
1 /*
2  * Copyright (C) 2012 Igalia S.L.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #include "config.h"
21 #include "WebKitTestBus.h"
22
23 #include <wtf/Environment.h>
24
25 WebKitTestBus::WebKitTestBus()
26     : m_bus(adoptGRef(g_test_dbus_new(G_TEST_DBUS_NONE)))
27 {
28 }
29
30 WebKitTestBus::~WebKitTestBus()
31 {
32     g_test_dbus_down(m_bus.get());
33 }
34
35 bool WebKitTestBus::run()
36 {
37     auto display = Environment::get("DISPLAY");
38     auto runtimeDir = Environment::get("XDG_RUNTIME_DIR");
39     g_test_dbus_up(m_bus.get());
40     m_address = g_test_dbus_get_bus_address(m_bus.get());
41     if (display)
42         Environment::setIfNotDefined("DISPLAY", *display);
43     if (runtimeDir)
44         Environment::setIfNotDefined("XDG_RUNTIME_DIR", *runtimeDir);
45     return !m_address.isNull();
46 }
47
48 GDBusConnection* WebKitTestBus::getOrCreateConnection()
49 {
50     if (m_connection)
51         return m_connection.get();
52
53     g_assert_false(m_address.isNull());
54     m_connection = adoptGRef(g_dbus_connection_new_for_address_sync(m_address.data(),
55         static_cast<GDBusConnectionFlags>(G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION),
56         nullptr, nullptr, nullptr));
57     g_assert_nonnull(m_connection.get());
58     return m_connection.get();
59 }
60
61 static void onNameAppeared(GDBusConnection*, const char*, const char*, gpointer userData)
62 {
63     g_main_loop_quit(static_cast<GMainLoop*>(userData));
64 }
65
66 GDBusProxy* WebKitTestBus::createProxy(const char* serviceName, const char* objectPath, const char* interfaceName, GMainLoop* mainLoop)
67 {
68     unsigned watcherID = g_bus_watch_name_on_connection(getOrCreateConnection(), serviceName, G_BUS_NAME_WATCHER_FLAGS_NONE, onNameAppeared, nullptr, mainLoop, nullptr);
69     g_main_loop_run(mainLoop);
70     g_bus_unwatch_name(watcherID);
71
72     GDBusProxy* proxy = g_dbus_proxy_new_sync(
73         connection(),
74         G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
75         nullptr, // GDBusInterfaceInfo
76         serviceName,
77         objectPath,
78         interfaceName,
79         nullptr, // GCancellable
80         nullptr);
81     g_assert_nonnull(proxy);
82     return proxy;
83 }