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