blob: c21044b4c1ef959a8130ec4f5083d9f681acd00e [file] [log] [blame]
adamk@chromium.org35c0eef2012-02-11 06:45:23 +09001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
satorux@chromium.orgdccbb7b2011-08-24 04:25:20 +09002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "dbus/bus.h"
6
satorux@chromium.orgd336d452011-09-02 15:56:23 +09007#include "base/bind.h"
8#include "base/message_loop.h"
satorux@chromium.orgdccbb7b2011-08-24 04:25:20 +09009#include "base/memory/ref_counted.h"
satorux@chromium.orgd336d452011-09-02 15:56:23 +090010#include "base/threading/thread.h"
satorux@chromium.orgdccbb7b2011-08-24 04:25:20 +090011#include "dbus/exported_object.h"
12#include "dbus/object_proxy.h"
13
14#include "testing/gtest/include/gtest/gtest.h"
15
satorux@chromium.org66bc4c22011-10-06 09:20:53 +090016namespace {
17
18// Used to test AddFilterFunction().
19DBusHandlerResult DummyHandler(DBusConnection* connection,
20 DBusMessage* raw_message,
21 void* user_data) {
22 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
23}
24
25} // namespace
26
satorux@chromium.orgdccbb7b2011-08-24 04:25:20 +090027TEST(BusTest, GetObjectProxy) {
28 dbus::Bus::Options options;
29 scoped_refptr<dbus::Bus> bus = new dbus::Bus(options);
30
31 dbus::ObjectProxy* object_proxy1 =
32 bus->GetObjectProxy("org.chromium.TestService",
33 "/org/chromium/TestObject");
34 ASSERT_TRUE(object_proxy1);
35
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);
42
43 // This should not.
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);
satorux@chromium.orgf06eb892011-10-13 09:45:26 +090049
50 bus->ShutdownAndBlock();
satorux@chromium.orgdccbb7b2011-08-24 04:25:20 +090051}
52
adamk@chromium.org35c0eef2012-02-11 06:45:23 +090053TEST(BusTest, GetObjectProxyIgnoreUnknownService) {
54 dbus::Bus::Options options;
55 scoped_refptr<dbus::Bus> bus = new dbus::Bus(options);
56
57 dbus::ObjectProxy* object_proxy1 =
58 bus->GetObjectProxyWithOptions(
59 "org.chromium.TestService",
60 "/org/chromium/TestObject",
61 dbus::ObjectProxy::IGNORE_SERVICE_UNKNOWN_ERRORS);
62 ASSERT_TRUE(object_proxy1);
63
64 // This should return the same object.
65 dbus::ObjectProxy* object_proxy2 =
66 bus->GetObjectProxyWithOptions(
67 "org.chromium.TestService",
68 "/org/chromium/TestObject",
69 dbus::ObjectProxy::IGNORE_SERVICE_UNKNOWN_ERRORS);
70 ASSERT_TRUE(object_proxy2);
71 EXPECT_EQ(object_proxy1, object_proxy2);
72
73 // This should not.
74 dbus::ObjectProxy* object_proxy3 =
75 bus->GetObjectProxyWithOptions(
76 "org.chromium.TestService",
77 "/org/chromium/DifferentTestObject",
78 dbus::ObjectProxy::IGNORE_SERVICE_UNKNOWN_ERRORS);
79 ASSERT_TRUE(object_proxy3);
80 EXPECT_NE(object_proxy1, object_proxy3);
81
82 bus->ShutdownAndBlock();
83}
84
satorux@chromium.orgdccbb7b2011-08-24 04:25:20 +090085TEST(BusTest, GetExportedObject) {
86 dbus::Bus::Options options;
87 scoped_refptr<dbus::Bus> bus = new dbus::Bus(options);
88
89 dbus::ExportedObject* object_proxy1 =
90 bus->GetExportedObject("org.chromium.TestService",
91 "/org/chromium/TestObject");
92 ASSERT_TRUE(object_proxy1);
93
94 // This should return the same object.
95 dbus::ExportedObject* object_proxy2 =
96 bus->GetExportedObject("org.chromium.TestService",
97 "/org/chromium/TestObject");
98 ASSERT_TRUE(object_proxy2);
99 EXPECT_EQ(object_proxy1, object_proxy2);
100
101 // This should not.
102 dbus::ExportedObject* object_proxy3 =
103 bus->GetExportedObject("org.chromium.TestService",
104 "/org/chromium/DifferentTestObject");
105 ASSERT_TRUE(object_proxy3);
106 EXPECT_NE(object_proxy1, object_proxy3);
satorux@chromium.orgf06eb892011-10-13 09:45:26 +0900107
108 bus->ShutdownAndBlock();
satorux@chromium.orgdccbb7b2011-08-24 04:25:20 +0900109}
satorux@chromium.orgd336d452011-09-02 15:56:23 +0900110
111TEST(BusTest, ShutdownAndBlock) {
112 dbus::Bus::Options options;
113 scoped_refptr<dbus::Bus> bus = new dbus::Bus(options);
114 ASSERT_FALSE(bus->shutdown_completed());
115
116 // Shut down synchronously.
117 bus->ShutdownAndBlock();
118 EXPECT_TRUE(bus->shutdown_completed());
119}
120
121TEST(BusTest, ShutdownAndBlockWithDBusThread) {
122 // Start the D-Bus thread.
123 base::Thread::Options thread_options;
124 thread_options.message_loop_type = MessageLoop::TYPE_IO;
125 base::Thread dbus_thread("D-Bus thread");
126 dbus_thread.StartWithOptions(thread_options);
127
128 // Create the bus.
129 dbus::Bus::Options options;
mdm@chromium.org45f2c6a2011-09-07 05:03:24 +0900130 options.dbus_thread_message_loop_proxy = dbus_thread.message_loop_proxy();
satorux@chromium.orgd336d452011-09-02 15:56:23 +0900131 scoped_refptr<dbus::Bus> bus = new dbus::Bus(options);
132 ASSERT_FALSE(bus->shutdown_completed());
133
134 // Shut down synchronously.
135 bus->ShutdownOnDBusThreadAndBlock();
136 EXPECT_TRUE(bus->shutdown_completed());
137 dbus_thread.Stop();
138}
satorux@chromium.org66bc4c22011-10-06 09:20:53 +0900139
140TEST(BusTest, AddFilterFunction) {
141 dbus::Bus::Options options;
142 scoped_refptr<dbus::Bus> bus = new dbus::Bus(options);
143 // Should connect before calling AddFilterFunction().
144 bus->Connect();
145
146 int data1 = 100;
147 int data2 = 200;
148 ASSERT_TRUE(bus->AddFilterFunction(&DummyHandler, &data1));
149 // Cannot add the same function with the same data.
150 ASSERT_FALSE(bus->AddFilterFunction(&DummyHandler, &data1));
151 // Can add the same function with different data.
152 ASSERT_TRUE(bus->AddFilterFunction(&DummyHandler, &data2));
153
154 ASSERT_TRUE(bus->RemoveFilterFunction(&DummyHandler, &data1));
155 ASSERT_FALSE(bus->RemoveFilterFunction(&DummyHandler, &data1));
156 ASSERT_TRUE(bus->RemoveFilterFunction(&DummyHandler, &data2));
157
158 bus->ShutdownAndBlock();
159}