15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram_samples.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/statistics_recorder.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/run_loop.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/platform_thread.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/bus.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_proxy.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/test_service.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace dbus { 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The test for sender verification in ObjectProxy. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SignalSenderVerificationTest : public testing::Test { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SignalSenderVerificationTest() 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : on_name_owner_changed_called_(false), 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) on_ownership_called_(false) { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StatisticsRecorder::Initialize(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make the main thread not to allow IO. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::SetIOAllowed(false); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start the D-Bus thread. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus_thread_.reset(new base::Thread("D-Bus Thread")); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread::Options thread_options; 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) thread_options.message_loop_type = base::MessageLoop::TYPE_IO; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(dbus_thread_->StartWithOptions(thread_options)); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the client, using the D-Bus thread. 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Bus::Options bus_options; 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bus_options.bus_type = Bus::SESSION; 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bus_options.connection_type = Bus::PRIVATE; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bus_options.dbus_task_runner = dbus_thread_->message_loop_proxy(); 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bus_ = new Bus(bus_options); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) object_proxy_ = bus_->GetObjectProxy( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "org.chromium.TestService", 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ObjectPath("/org/chromium/TestObject")); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(bus_->HasDBusThread()); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_proxy_->SetNameOwnerChangedCallback( 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SignalSenderVerificationTest::OnNameOwnerChanged, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &on_name_owner_changed_called_)); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Connect to the "Test" signal of "org.chromium.TestInterface" from 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the remote object. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) object_proxy_->ConnectToSignal( 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "org.chromium.TestInterface", 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Test", 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SignalSenderVerificationTest::OnTestSignal, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this)), 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SignalSenderVerificationTest::OnConnected, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait until the object proxy is connected to the signal. 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_.reset(new base::RunLoop); 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Run(); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start the test service, using the D-Bus thread. 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TestService::Options options; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.dbus_task_runner = dbus_thread_->message_loop_proxy(); 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test_service_.reset(new TestService(options)); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_service_->StartService()); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_service_->WaitUntilServiceIsStarted()); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_service_->HasDBusThread()); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_service_->has_ownership()); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Same setup for the second TestService. This service should not have the 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ownership of the name at this point. 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) test_service2_.reset(new TestService(options)); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_service2_->StartService()); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_service2_->WaitUntilServiceIsStarted()); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_service2_->HasDBusThread()); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(test_service2_->has_ownership()); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The name should be owned and known at this point. 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!on_name_owner_changed_called_) { 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_.reset(new base::RunLoop); 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Run(); 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(latest_name_owner_.empty()); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bus_->ShutdownOnDBusThreadAndBlock(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shut down the service. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_service_->ShutdownAndBlock(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_service2_->ShutdownAndBlock(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset to the default. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::SetIOAllowed(true); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stopping a thread is considered an IO operation, so do this after 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // allowing IO. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_service_->Stop(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_service2_->Stop(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnOwnership(bool expected, bool success) { 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(expected, success); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PostTask to quit the MessageLoop as this is called from D-Bus thread. 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.PostTask( 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SignalSenderVerificationTest::OnOwnershipInternal, 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnOwnershipInternal() { 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) on_ownership_called_ = true; 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Quit(); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void OnNameOwnerChanged(bool* called_flag, 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& old_owner, 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& new_owner) { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) latest_name_owner_ = new_owner; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *called_flag = true; 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Quit(); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the "Test" signal is received, in the main thread. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy the string payload to |test_signal_string_|. 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void OnTestSignal(Signal* signal) { 1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MessageReader reader(signal); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(reader.PopString(&test_signal_string_)); 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Quit(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when connected to the signal. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnConnected(const std::string& interface_name, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& signal_name, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(success); 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Quit(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the hey signal to be received. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForTestSignal() { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnTestSignal() will quit the message loop. 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_.reset(new base::RunLoop); 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Run(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Stopping a thread is considered an IO operation, so we need to fiddle with 160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // thread restrictions before and after calling Stop() on a TestService. 161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void SafeServiceStop(TestService* test_service) { 162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::ThreadRestrictions::SetIOAllowed(true); 163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_service->Stop(); 164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::ThreadRestrictions::SetIOAllowed(false); 165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop message_loop_; 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<base::RunLoop> run_loop_; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Thread> dbus_thread_; 1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_refptr<Bus> bus_; 1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ObjectProxy* object_proxy_; 1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<TestService> test_service_; 1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<TestService> test_service2_; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Text message from "Test" signal. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string test_signal_string_; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The known latest name owner of TestService. Updated in OnNameOwnerChanged. 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string latest_name_owner_; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Boolean flags to record callback calls. 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool on_name_owner_changed_called_; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool on_ownership_called_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SignalSenderVerificationTest, TestSignalAccepted) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kMessage[] = "hello, world"; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the test signal from the exported object. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_service_->SendTestSignal(kMessage); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Receive the signal with the object proxy. The signal is handled in 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SignalSenderVerificationTest::OnTestSignal() in the main thread. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForTestSignal(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(kMessage, test_signal_string_); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Disabled, http://crbug.com/407063 . 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(SignalSenderVerificationTest, DISABLED_TestSignalRejected) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To make sure the histogram instance is created. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("DBus.RejectedSignalCount", 0); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::HistogramBase* reject_signal_histogram = 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StatisticsRecorder::FindHistogram("DBus.RejectedSignalCount"); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::HistogramSamples> samples1( 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reject_signal_histogram->SnapshotSamples()); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kNewMessage[] = "hello, new world"; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_service2_->SendTestSignal(kNewMessage); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This test tests that our callback is NOT called by the ObjectProxy. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sleep to have message delivered to the client via the D-Bus service. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformThread::Sleep(TestTimeouts::action_timeout()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::HistogramSamples> samples2( 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reject_signal_histogram->SnapshotSamples()); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ("", test_signal_string_); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(samples1->TotalCount() + 1, samples2->TotalCount()); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SignalSenderVerificationTest, TestOwnerChanged) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kMessage[] = "hello, world"; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the test signal from the exported object. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_service_->SendTestSignal(kMessage); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Receive the signal with the object proxy. The signal is handled in 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SignalSenderVerificationTest::OnTestSignal() in the main thread. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForTestSignal(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(kMessage, test_signal_string_); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Release and acquire the name ownership. 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // latest_name_owner_ should be non empty as |test_service_| owns the name. 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(latest_name_owner_.empty()); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_service_->ShutdownAndBlock(); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OnNameOwnerChanged will PostTask to quit the message loop. 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_.reset(new base::RunLoop); 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Run(); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // latest_name_owner_ should be empty as the owner is gone. 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(latest_name_owner_.empty()); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reset the flag as NameOwnerChanged is already received in setup. 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) on_name_owner_changed_called_ = false; 240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) on_ownership_called_ = false; 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_service2_->RequestOwnership( 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SignalSenderVerificationTest::OnOwnership, 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), true)); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Both of OnNameOwnerChanged() and OnOwnership() should quit the MessageLoop, 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but there's no expected order of those 2 event. 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_.reset(new base::RunLoop); 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Run(); 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!on_name_owner_changed_called_ || !on_ownership_called_) { 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_.reset(new base::RunLoop); 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Run(); 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(on_name_owner_changed_called_); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(on_ownership_called_); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // latest_name_owner_ becomes non empty as the new owner appears. 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(latest_name_owner_.empty()); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now the second service owns the name. 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kNewMessage[] = "hello, new world"; 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_service2_->SendTestSignal(kNewMessage); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WaitForTestSignal(); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(kNewMessage, test_signal_string_); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(SignalSenderVerificationTest, TestOwnerStealing) { 267a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Release and acquire the name ownership. 268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // latest_name_owner_ should be non empty as |test_service_| owns the name. 269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_FALSE(latest_name_owner_.empty()); 270a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_service_->ShutdownAndBlock(); 271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // OnNameOwnerChanged will PostTask to quit the message loop. 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_.reset(new base::RunLoop); 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Run(); 274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // latest_name_owner_ should be empty as the owner is gone. 275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(latest_name_owner_.empty()); 276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Reset the flag as NameOwnerChanged is already received in setup. 277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) on_name_owner_changed_called_ = false; 278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Start a test service that allows theft, using the D-Bus thread. 280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) TestService::Options options; 281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) options.dbus_task_runner = dbus_thread_->message_loop_proxy(); 282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) options.request_ownership_options = Bus::REQUIRE_PRIMARY_ALLOW_REPLACEMENT; 283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) TestService stealable_test_service(options); 284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(stealable_test_service.StartService()); 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(stealable_test_service.WaitUntilServiceIsStarted()); 286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(stealable_test_service.HasDBusThread()); 287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(stealable_test_service.has_ownership()); 288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // OnNameOwnerChanged will PostTask to quit the message loop. 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_.reset(new base::RunLoop); 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Run(); 292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Send a signal to check that the service is correctly owned. 294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char kMessage[] = "hello, world"; 295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Send the test signal from the exported object. 297a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) stealable_test_service.SendTestSignal(kMessage); 298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Receive the signal with the object proxy. The signal is handled in 299a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // SignalSenderVerificationTest::OnTestSignal() in the main thread. 300a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitForTestSignal(); 301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(kMessage, test_signal_string_); 302a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 303a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Reset the flag as NameOwnerChanged was called above. 304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) on_name_owner_changed_called_ = false; 305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_service2_->RequestOwnership( 306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&SignalSenderVerificationTest::OnOwnership, 307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Unretained(this), true)); 308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Both of OnNameOwnerChanged() and OnOwnership() should quit the MessageLoop, 309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // but there's no expected order of those 2 event. 3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_.reset(new base::RunLoop); 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Run(); 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!on_name_owner_changed_called_ || !on_ownership_called_) { 3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_.reset(new base::RunLoop); 3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Run(); 3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(on_name_owner_changed_called_); 317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(on_ownership_called_); 318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Now the second service owns the name. 320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char kNewMessage[] = "hello, new world"; 321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_service2_->SendTestSignal(kNewMessage); 323a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WaitForTestSignal(); 324a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(kNewMessage, test_signal_string_); 325a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SafeServiceStop(&stealable_test_service); 327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 328a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fails on Linux ChromiumOS Tests 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SignalSenderVerificationTest, DISABLED_TestMultipleObjects) { 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kMessage[] = "hello, world"; 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ObjectProxy* object_proxy2 = bus_->GetObjectProxy( 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "org.chromium.TestService", 3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ObjectPath("/org/chromium/DifferentObject")); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool second_name_owner_changed_called = false; 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_proxy2->SetNameOwnerChangedCallback( 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SignalSenderVerificationTest::OnNameOwnerChanged, 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &second_name_owner_changed_called)); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Connect to a signal on the additional remote object to trigger the 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // name owner matching. 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) object_proxy2->ConnectToSignal( 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "org.chromium.DifferentTestInterface", 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Test", 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SignalSenderVerificationTest::OnTestSignal, 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this)), 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SignalSenderVerificationTest::OnConnected, 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wait until the object proxy is connected to the signal. 3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_.reset(new base::RunLoop); 3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Run(); 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Send the test signal from the exported object. 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_service_->SendTestSignal(kMessage); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Receive the signal with the object proxy. The signal is handled in 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // SignalSenderVerificationTest::OnTestSignal() in the main thread. 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WaitForTestSignal(); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(kMessage, test_signal_string_); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Release and acquire the name ownership. 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // latest_name_owner_ should be non empty as |test_service_| owns the name. 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(latest_name_owner_.empty()); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_service_->ShutdownAndBlock(); 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OnNameOwnerChanged will PostTask to quit the message loop. 3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_.reset(new base::RunLoop); 3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Run(); 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // latest_name_owner_ should be empty as the owner is gone. 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(latest_name_owner_.empty()); 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reset the flag as NameOwnerChanged is already received in setup. 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) on_name_owner_changed_called_ = false; 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) second_name_owner_changed_called = false; 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_service2_->RequestOwnership( 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&SignalSenderVerificationTest::OnOwnership, 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this), true)); 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Both of OnNameOwnerChanged() and OnOwnership() should quit the MessageLoop, 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but there's no expected order of those 2 event. 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (!on_name_owner_changed_called_ || !second_name_owner_changed_called || 3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !on_ownership_called_) { 3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_.reset(new base::RunLoop); 3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop_->Run(); 3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(on_name_owner_changed_called_); 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(second_name_owner_changed_called); 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(on_ownership_called_); 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // latest_name_owner_ becomes non empty as the new owner appears. 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(latest_name_owner_.empty()); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now the second service owns the name. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kNewMessage[] = "hello, new world"; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_service2_->SendTestSignal(kNewMessage); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForTestSignal(); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(kNewMessage, test_signal_string_); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace dbus 402