34
DbusTestService * service = NULL;
37
DbusTestService * testsystem = NULL;
35
38
AccountsServiceMock service_mock;
40
DbusTestService * testsession = NULL;
42
DbusTestProcess * systemmonitor = nullptr;
43
DbusTestProcess * sessionmonitor = nullptr;
37
45
GDBusConnection * system = NULL;
46
GDBusConnection * session = NULL;
38
47
GDBusProxy * proxy = NULL;
49
std::chrono::milliseconds _eventuallyTime = std::chrono::seconds{5};
40
51
virtual void SetUp() {
41
service = dbus_test_service_new(NULL);
42
dbus_test_service_set_bus(service, DBUS_TEST_SERVICE_BUS_SYSTEM);
44
dbus_test_service_add_task(service, (DbusTestTask*)service_mock);
45
dbus_test_service_start_tasks(service);
53
testsystem = dbus_test_service_new(NULL);
54
dbus_test_service_set_bus(testsystem, DBUS_TEST_SERVICE_BUS_SYSTEM);
56
systemmonitor = dbus_test_process_new("dbus-monitor");
57
dbus_test_process_append_param(systemmonitor, "--system");
58
dbus_test_task_set_name(DBUS_TEST_TASK(systemmonitor), "System");
59
dbus_test_service_add_task(testsystem, DBUS_TEST_TASK(systemmonitor));
61
dbus_test_service_add_task(testsystem, (DbusTestTask*)service_mock);
62
dbus_test_service_start_tasks(testsystem);
47
64
system = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
48
65
ASSERT_NE(nullptr, system);
49
66
g_dbus_connection_set_exit_on_close(system, FALSE);
50
67
g_object_add_weak_pointer(G_OBJECT(system), (gpointer *)&system);
70
testsession = dbus_test_service_new(NULL);
71
dbus_test_service_set_bus(testsession, DBUS_TEST_SERVICE_BUS_SESSION);
73
sessionmonitor = dbus_test_process_new("dbus-monitor");
74
dbus_test_process_append_param(sessionmonitor, "--session");
75
dbus_test_task_set_name(DBUS_TEST_TASK(sessionmonitor), "Session");
76
dbus_test_service_add_task(testsession, DBUS_TEST_TASK(sessionmonitor));
78
dbus_test_service_start_tasks(testsession);
80
session = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
81
ASSERT_NE(nullptr, session);
82
g_dbus_connection_set_exit_on_close(session, FALSE);
83
g_object_add_weak_pointer(G_OBJECT(session), (gpointer *)&session);
52
86
proxy = g_dbus_proxy_new_sync(system,
53
87
G_DBUS_PROXY_FLAGS_NONE,
95
134
void set_property (const gchar * name, GVariant * value) {
96
135
dbus_test_dbus_mock_object_update_property((DbusTestDbusMock *)service_mock, service_mock.get_sound(), name, value, NULL);
138
testing::AssertionResult expectEventually (std::function<testing::AssertionResult(void)> &testfunc) {
139
auto loop = std::shared_ptr<GMainLoop>(g_main_loop_new(nullptr, FALSE), [](GMainLoop * loop) { if (loop != nullptr) g_main_loop_unref(loop); });
141
std::promise<testing::AssertionResult> retpromise;
142
auto retfuture = retpromise.get_future();
143
auto start = std::chrono::steady_clock::now();
145
/* The core of the idle function as an object so we can use the C++-isms
146
of attaching the variables and make this code reasonably readable */
147
std::function<void(void)> idlefunc = [&loop, &retpromise, &testfunc, &start, this]() -> void {
148
auto result = testfunc();
150
if (result == false && _eventuallyTime > (std::chrono::steady_clock::now() - start)) {
154
retpromise.set_value(result);
155
g_main_loop_quit(loop.get());
158
auto idlesrc = g_idle_add([](gpointer data) -> gboolean {
159
auto func = reinterpret_cast<std::function<void(void)> *>(data);
161
return G_SOURCE_CONTINUE;
164
g_main_loop_run(loop.get());
165
g_source_remove(idlesrc);
167
return retfuture.get();
170
/* Eventually Helpers */
171
#define _EVENTUALLY_HELPER(oper) \
172
template <typename... Args> testing::AssertionResult expectEventually##oper (Args&& ... args) { \
173
std::function<testing::AssertionResult(void)> func = [&]() { \
174
return testing::internal::CmpHelper##oper(std::forward<Args>(args)...); \
176
return expectEventually(func); \
179
_EVENTUALLY_HELPER(EQ);
180
_EVENTUALLY_HELPER(NE);
181
_EVENTUALLY_HELPER(LT);
182
_EVENTUALLY_HELPER(GT);
183
_EVENTUALLY_HELPER(STREQ);
184
_EVENTUALLY_HELPER(STRNE);
186
#undef _EVENTUALLY_HELPER
190
#define EXPECT_EVENTUALLY_EQ(expected, actual) \
191
EXPECT_PRED_FORMAT2(MediaPlayerUserTest::expectEventuallyEQ, expected, actual)
193
#define EXPECT_EVENTUALLY_NE(expected, actual) \
194
EXPECT_PRED_FORMAT2(MediaPlayerUserTest::expectEventuallyNE, expected, actual)
196
#define EXPECT_EVENTUALLY_LT(expected, actual) \
197
EXPECT_PRED_FORMAT2(MediaPlayerUserTest::expectEventuallyLT, expected, actual)
199
#define EXPECT_EVENTUALLY_GT(expected, actual) \
200
EXPECT_PRED_FORMAT2(MediaPlayerUserTest::expectEventuallyGT, expected, actual)
202
#define EXPECT_EVENTUALLY_STREQ(expected, actual) \
203
EXPECT_PRED_FORMAT2(MediaPlayerUserTest::expectEventuallySTREQ, expected, actual)
205
#define EXPECT_EVENTUALLY_STRNE(expected, actual) \
206
EXPECT_PRED_FORMAT2(MediaPlayerUserTest::expectEventuallySTRNE, expected, actual)
100
209
TEST_F(MediaPlayerUserTest, BasicObject) {
101
210
MediaPlayerUser * player = media_player_user_new("user");
102
211
ASSERT_NE(nullptr, player);
141
255
MediaPlayerUser * player = media_player_user_new("user");
142
256
ASSERT_NE(nullptr, player);
144
/* Get the proxy -- and it's precious precious data -- oh, my, precious! */
147
258
/* Ensure even with the proxy we don't have anything */
148
EXPECT_TRUE(media_player_get_is_running(MEDIA_PLAYER(player)));
259
bool running = false;
260
g_signal_connect(G_OBJECT(player), "notify::is-running", G_CALLBACK(running_update), &running);
261
running_update(G_OBJECT(player), nullptr, &running);
262
EXPECT_EVENTUALLY_EQ(true, running);
149
263
EXPECT_TRUE(media_player_get_can_raise(MEDIA_PLAYER(player)));
150
264
EXPECT_STREQ("user", media_player_get_id(MEDIA_PLAYER(player)));
151
265
EXPECT_STREQ("The Player Formerly Known as Prince", media_player_get_name(MEDIA_PLAYER(player)));
180
294
set_property("Album", g_variant_new_string("Vinyl is dead"));
181
295
set_property("ArtUrl", g_variant_new_string("http://art.url"));
183
/* Ensure the properties get set before we pull them */
186
297
/* Build our media player */
187
298
MediaPlayerUser * player = media_player_user_new("user");
188
299
ASSERT_NE(nullptr, player);
190
/* Get the proxy -- and the old data, so old, like forever */
301
bool running = false;
302
g_signal_connect(G_OBJECT(player), "notify::is-running", G_CALLBACK(running_update), &running);
303
running_update(G_OBJECT(player), nullptr, &running);
193
305
/* Ensure that we show up as not running */
194
EXPECT_FALSE(media_player_get_is_running(MEDIA_PLAYER(player)));
306
EXPECT_EVENTUALLY_EQ(false, running);
196
308
/* Update to make running */
197
309
set_property("Timestamp", g_variant_new_uint64(g_get_monotonic_time()));
200
EXPECT_TRUE(media_player_get_is_running(MEDIA_PLAYER(player)));
311
EXPECT_EVENTUALLY_EQ(true, running);
313
/* Clear to not run */
314
set_property("Timestamp", g_variant_new_uint64(1));
316
EXPECT_EVENTUALLY_EQ(false, running);
202
318
g_clear_object(&in_icon);
203
319
g_clear_object(&player);