1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
8 #include "base/message_loop.h"
9 #include "base/memory/ref_counted.h"
10 #include "base/threading/thread.h"
11 #include "dbus/exported_object.h"
12 #include "dbus/object_proxy.h"
14 #include "testing/gtest/include/gtest/gtest.h"
18 // Used to test AddFilterFunction().
19 DBusHandlerResult
DummyHandler(DBusConnection
* connection
,
20 DBusMessage
* raw_message
,
22 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED
;
27 TEST(BusTest
, GetObjectProxy
) {
28 dbus::Bus::Options options
;
29 scoped_refptr
<dbus::Bus
> bus
= new dbus::Bus(options
);
31 dbus::ObjectProxy
* object_proxy1
=
32 bus
->GetObjectProxy("org.chromium.TestService",
33 "/org/chromium/TestObject");
34 ASSERT_TRUE(object_proxy1
);
36 // This should return the same object.
37 dbus::ObjectProxy
* object_proxy2
=
38 bus
->GetObjectProxy("org.chromium.TestService",
39 "/org/chromium/TestObject");
40 ASSERT_TRUE(object_proxy2
);
41 EXPECT_EQ(object_proxy1
, object_proxy2
);
44 dbus::ObjectProxy
* object_proxy3
=
45 bus
->GetObjectProxy("org.chromium.TestService",
46 "/org/chromium/DifferentTestObject");
47 ASSERT_TRUE(object_proxy3
);
48 EXPECT_NE(object_proxy1
, object_proxy3
);
50 bus
->ShutdownAndBlock();
53 TEST(BusTest
, GetExportedObject
) {
54 dbus::Bus::Options options
;
55 scoped_refptr
<dbus::Bus
> bus
= new dbus::Bus(options
);
57 dbus::ExportedObject
* object_proxy1
=
58 bus
->GetExportedObject("org.chromium.TestService",
59 "/org/chromium/TestObject");
60 ASSERT_TRUE(object_proxy1
);
62 // This should return the same object.
63 dbus::ExportedObject
* object_proxy2
=
64 bus
->GetExportedObject("org.chromium.TestService",
65 "/org/chromium/TestObject");
66 ASSERT_TRUE(object_proxy2
);
67 EXPECT_EQ(object_proxy1
, object_proxy2
);
70 dbus::ExportedObject
* object_proxy3
=
71 bus
->GetExportedObject("org.chromium.TestService",
72 "/org/chromium/DifferentTestObject");
73 ASSERT_TRUE(object_proxy3
);
74 EXPECT_NE(object_proxy1
, object_proxy3
);
76 bus
->ShutdownAndBlock();
79 TEST(BusTest
, ShutdownAndBlock
) {
80 dbus::Bus::Options options
;
81 scoped_refptr
<dbus::Bus
> bus
= new dbus::Bus(options
);
82 ASSERT_FALSE(bus
->shutdown_completed());
84 // Shut down synchronously.
85 bus
->ShutdownAndBlock();
86 EXPECT_TRUE(bus
->shutdown_completed());
89 TEST(BusTest
, ShutdownAndBlockWithDBusThread
) {
90 // Start the D-Bus thread.
91 base::Thread::Options thread_options
;
92 thread_options
.message_loop_type
= MessageLoop::TYPE_IO
;
93 base::Thread
dbus_thread("D-Bus thread");
94 dbus_thread
.StartWithOptions(thread_options
);
97 dbus::Bus::Options options
;
98 options
.dbus_thread_message_loop_proxy
= dbus_thread
.message_loop_proxy();
99 scoped_refptr
<dbus::Bus
> bus
= new dbus::Bus(options
);
100 ASSERT_FALSE(bus
->shutdown_completed());
102 // Shut down synchronously.
103 bus
->ShutdownOnDBusThreadAndBlock();
104 EXPECT_TRUE(bus
->shutdown_completed());
108 TEST(BusTest
, AddFilterFunction
) {
109 dbus::Bus::Options options
;
110 scoped_refptr
<dbus::Bus
> bus
= new dbus::Bus(options
);
111 // Should connect before calling AddFilterFunction().
116 ASSERT_TRUE(bus
->AddFilterFunction(&DummyHandler
, &data1
));
117 // Cannot add the same function with the same data.
118 ASSERT_FALSE(bus
->AddFilterFunction(&DummyHandler
, &data1
));
119 // Can add the same function with different data.
120 ASSERT_TRUE(bus
->AddFilterFunction(&DummyHandler
, &data2
));
122 ASSERT_TRUE(bus
->RemoveFilterFunction(&DummyHandler
, &data1
));
123 ASSERT_FALSE(bus
->RemoveFilterFunction(&DummyHandler
, &data1
));
124 ASSERT_TRUE(bus
->RemoveFilterFunction(&DummyHandler
, &data2
));
126 bus
->ShutdownAndBlock();