xref: /aosp_15_r20/external/libchrome/dbus/object_proxy_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "dbus/object_proxy.h"
6*635a8641SAndroid Build Coastguard Worker #include "base/bind.h"
7*635a8641SAndroid Build Coastguard Worker #include "base/files/file_descriptor_watcher_posix.h"
8*635a8641SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
9*635a8641SAndroid Build Coastguard Worker #include "base/message_loop/message_loop.h"
10*635a8641SAndroid Build Coastguard Worker #include "base/run_loop.h"
11*635a8641SAndroid Build Coastguard Worker #include "dbus/bus.h"
12*635a8641SAndroid Build Coastguard Worker #include "dbus/test_service.h"
13*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
14*635a8641SAndroid Build Coastguard Worker 
15*635a8641SAndroid Build Coastguard Worker namespace dbus {
16*635a8641SAndroid Build Coastguard Worker namespace {
17*635a8641SAndroid Build Coastguard Worker 
18*635a8641SAndroid Build Coastguard Worker class ObjectProxyTest : public testing::Test {
19*635a8641SAndroid Build Coastguard Worker  protected:
ObjectProxyTest()20*635a8641SAndroid Build Coastguard Worker   ObjectProxyTest() : file_descriptor_watcher_(&message_loop_) {}
21*635a8641SAndroid Build Coastguard Worker 
SetUp()22*635a8641SAndroid Build Coastguard Worker   void SetUp() override {
23*635a8641SAndroid Build Coastguard Worker     Bus::Options bus_options;
24*635a8641SAndroid Build Coastguard Worker     bus_options.bus_type = Bus::SESSION;
25*635a8641SAndroid Build Coastguard Worker     bus_options.connection_type = Bus::PRIVATE;
26*635a8641SAndroid Build Coastguard Worker     bus_ = new Bus(bus_options);
27*635a8641SAndroid Build Coastguard Worker   }
28*635a8641SAndroid Build Coastguard Worker 
TearDown()29*635a8641SAndroid Build Coastguard Worker   void TearDown() override { bus_->ShutdownAndBlock(); }
30*635a8641SAndroid Build Coastguard Worker 
31*635a8641SAndroid Build Coastguard Worker   base::MessageLoopForIO message_loop_;
32*635a8641SAndroid Build Coastguard Worker 
33*635a8641SAndroid Build Coastguard Worker   // This enables FileDescriptorWatcher, which is required by dbus::Watch.
34*635a8641SAndroid Build Coastguard Worker   base::FileDescriptorWatcher file_descriptor_watcher_;
35*635a8641SAndroid Build Coastguard Worker 
36*635a8641SAndroid Build Coastguard Worker   scoped_refptr<Bus> bus_;
37*635a8641SAndroid Build Coastguard Worker };
38*635a8641SAndroid Build Coastguard Worker 
39*635a8641SAndroid Build Coastguard Worker // Used as a WaitForServiceToBeAvailableCallback.
OnServiceIsAvailable(bool * dest_service_is_available,int * num_calls,bool src_service_is_available)40*635a8641SAndroid Build Coastguard Worker void OnServiceIsAvailable(bool* dest_service_is_available,
41*635a8641SAndroid Build Coastguard Worker                           int* num_calls,
42*635a8641SAndroid Build Coastguard Worker                           bool src_service_is_available) {
43*635a8641SAndroid Build Coastguard Worker   *dest_service_is_available = src_service_is_available;
44*635a8641SAndroid Build Coastguard Worker   (*num_calls)++;
45*635a8641SAndroid Build Coastguard Worker }
46*635a8641SAndroid Build Coastguard Worker 
47*635a8641SAndroid Build Coastguard Worker // Used as a callback for TestService::RequestOwnership().
OnOwnershipRequestDone(bool success)48*635a8641SAndroid Build Coastguard Worker void OnOwnershipRequestDone(bool success) {
49*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(success);
50*635a8641SAndroid Build Coastguard Worker }
51*635a8641SAndroid Build Coastguard Worker 
52*635a8641SAndroid Build Coastguard Worker // Used as a callback for TestService::ReleaseOwnership().
OnOwnershipReleased()53*635a8641SAndroid Build Coastguard Worker void OnOwnershipReleased() {}
54*635a8641SAndroid Build Coastguard Worker 
TEST_F(ObjectProxyTest,WaitForServiceToBeAvailableRunOnce)55*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectProxyTest, WaitForServiceToBeAvailableRunOnce) {
56*635a8641SAndroid Build Coastguard Worker   TestService::Options options;
57*635a8641SAndroid Build Coastguard Worker   TestService test_service(options);
58*635a8641SAndroid Build Coastguard Worker   ObjectProxy* object_proxy = bus_->GetObjectProxy(
59*635a8641SAndroid Build Coastguard Worker       test_service.service_name(), ObjectPath("/org/chromium/TestObject"));
60*635a8641SAndroid Build Coastguard Worker 
61*635a8641SAndroid Build Coastguard Worker   // The callback is not yet called because the service is not available.
62*635a8641SAndroid Build Coastguard Worker   int num_calls = 0;
63*635a8641SAndroid Build Coastguard Worker   bool service_is_available = false;
64*635a8641SAndroid Build Coastguard Worker   object_proxy->WaitForServiceToBeAvailable(
65*635a8641SAndroid Build Coastguard Worker       base::Bind(&OnServiceIsAvailable, &service_is_available, &num_calls));
66*635a8641SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
67*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, num_calls);
68*635a8641SAndroid Build Coastguard Worker 
69*635a8641SAndroid Build Coastguard Worker   // Start the service. The callback should be called asynchronously.
70*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(test_service.StartService());
71*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(test_service.WaitUntilServiceIsStarted());
72*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(test_service.has_ownership());
73*635a8641SAndroid Build Coastguard Worker   num_calls = 0;
74*635a8641SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
75*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, num_calls);
76*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(service_is_available);
77*635a8641SAndroid Build Coastguard Worker 
78*635a8641SAndroid Build Coastguard Worker   // Release the service's ownership of its name. The callback should not be
79*635a8641SAndroid Build Coastguard Worker   // invoked again.
80*635a8641SAndroid Build Coastguard Worker   test_service.ReleaseOwnership(base::Bind(&OnOwnershipReleased));
81*635a8641SAndroid Build Coastguard Worker   num_calls = 0;
82*635a8641SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
83*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, num_calls);
84*635a8641SAndroid Build Coastguard Worker 
85*635a8641SAndroid Build Coastguard Worker   // Take ownership of the name and check that the callback is not called.
86*635a8641SAndroid Build Coastguard Worker   test_service.RequestOwnership(base::Bind(&OnOwnershipRequestDone));
87*635a8641SAndroid Build Coastguard Worker   num_calls = 0;
88*635a8641SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
89*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, num_calls);
90*635a8641SAndroid Build Coastguard Worker }
91*635a8641SAndroid Build Coastguard Worker 
TEST_F(ObjectProxyTest,WaitForServiceToBeAvailableAlreadyRunning)92*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectProxyTest, WaitForServiceToBeAvailableAlreadyRunning) {
93*635a8641SAndroid Build Coastguard Worker   TestService::Options options;
94*635a8641SAndroid Build Coastguard Worker   TestService test_service(options);
95*635a8641SAndroid Build Coastguard Worker   ObjectProxy* object_proxy = bus_->GetObjectProxy(
96*635a8641SAndroid Build Coastguard Worker       test_service.service_name(), ObjectPath("/org/chromium/TestObject"));
97*635a8641SAndroid Build Coastguard Worker 
98*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(test_service.StartService());
99*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(test_service.WaitUntilServiceIsStarted());
100*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(test_service.has_ownership());
101*635a8641SAndroid Build Coastguard Worker 
102*635a8641SAndroid Build Coastguard Worker   // Since the service is already running, the callback should be invoked
103*635a8641SAndroid Build Coastguard Worker   // immediately (but asynchronously, rather than the callback being invoked
104*635a8641SAndroid Build Coastguard Worker   // directly within WaitForServiceToBeAvailable()).
105*635a8641SAndroid Build Coastguard Worker   int num_calls = 0;
106*635a8641SAndroid Build Coastguard Worker   bool service_is_available = false;
107*635a8641SAndroid Build Coastguard Worker   object_proxy->WaitForServiceToBeAvailable(
108*635a8641SAndroid Build Coastguard Worker       base::Bind(&OnServiceIsAvailable, &service_is_available, &num_calls));
109*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, num_calls);
110*635a8641SAndroid Build Coastguard Worker 
111*635a8641SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
112*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, num_calls);
113*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(service_is_available);
114*635a8641SAndroid Build Coastguard Worker }
115*635a8641SAndroid Build Coastguard Worker 
TEST_F(ObjectProxyTest,WaitForServiceToBeAvailableMultipleCallbacks)116*635a8641SAndroid Build Coastguard Worker TEST_F(ObjectProxyTest, WaitForServiceToBeAvailableMultipleCallbacks) {
117*635a8641SAndroid Build Coastguard Worker   TestService::Options options;
118*635a8641SAndroid Build Coastguard Worker   TestService test_service(options);
119*635a8641SAndroid Build Coastguard Worker   ObjectProxy* object_proxy = bus_->GetObjectProxy(
120*635a8641SAndroid Build Coastguard Worker       test_service.service_name(), ObjectPath("/org/chromium/TestObject"));
121*635a8641SAndroid Build Coastguard Worker 
122*635a8641SAndroid Build Coastguard Worker   // Register two callbacks.
123*635a8641SAndroid Build Coastguard Worker   int num_calls_1 = 0, num_calls_2 = 0;
124*635a8641SAndroid Build Coastguard Worker   bool service_is_available_1 = false, service_is_available_2 = false;
125*635a8641SAndroid Build Coastguard Worker   object_proxy->WaitForServiceToBeAvailable(
126*635a8641SAndroid Build Coastguard Worker       base::Bind(&OnServiceIsAvailable, &service_is_available_1, &num_calls_1));
127*635a8641SAndroid Build Coastguard Worker   object_proxy->WaitForServiceToBeAvailable(
128*635a8641SAndroid Build Coastguard Worker       base::Bind(&OnServiceIsAvailable, &service_is_available_2, &num_calls_2));
129*635a8641SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
130*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, num_calls_1);
131*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, num_calls_2);
132*635a8641SAndroid Build Coastguard Worker 
133*635a8641SAndroid Build Coastguard Worker   // Start the service and confirm that both callbacks are invoked.
134*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(test_service.StartService());
135*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(test_service.WaitUntilServiceIsStarted());
136*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(test_service.has_ownership());
137*635a8641SAndroid Build Coastguard Worker   num_calls_1 = 0;
138*635a8641SAndroid Build Coastguard Worker   num_calls_2 = 0;
139*635a8641SAndroid Build Coastguard Worker   base::RunLoop().RunUntilIdle();
140*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, num_calls_1);
141*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, num_calls_2);
142*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(service_is_available_1);
143*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(service_is_available_2);
144*635a8641SAndroid Build Coastguard Worker }
145*635a8641SAndroid Build Coastguard Worker 
146*635a8641SAndroid Build Coastguard Worker }  // namespace
147*635a8641SAndroid Build Coastguard Worker }  // namespace dbus
148