diff options
author | haruki@chromium.org <haruki@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-14 11:02:59 +0000 |
---|---|---|
committer | haruki@chromium.org <haruki@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-14 11:02:59 +0000 |
commit | 6d36c0cadfc825db5336a04c1c0778ebe2652a92 (patch) | |
tree | 451eecc45061e3bc58c02deb20032a37d49c733f /dbus/object_proxy.cc | |
parent | 8a2e513493bd5b0d2eb8e068975efc2e91fb5250 (diff) | |
download | chromium_src-6d36c0cadfc825db5336a04c1c0778ebe2652a92.zip chromium_src-6d36c0cadfc825db5336a04c1c0778ebe2652a92.tar.gz chromium_src-6d36c0cadfc825db5336a04c1c0778ebe2652a92.tar.bz2 |
Make SignalSenderVerificationTest more robust
Add more assertions and a callback to check the result of RequestOwnership.
Original test can hang when test_service2_ tries to acquire the ownership before D-Bus recognizes test_service_'s disconnection.
In that situation, test_service2_ cannot own the name and cannot send a message.
BUG=158689
TEST=unittests
Review URL: https://chromiumcodereview.appspot.com/11358111
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@167649 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'dbus/object_proxy.cc')
-rw-r--r-- | dbus/object_proxy.cc | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/dbus/object_proxy.cc b/dbus/object_proxy.cc index c8f00d7..5e9bf5b 100644 --- a/dbus/object_proxy.cc +++ b/dbus/object_proxy.cc @@ -408,6 +408,12 @@ void ObjectProxy::OnConnected(OnConnectedCallback on_connected_callback, on_connected_callback.Run(interface_name, signal_name, success); } +void ObjectProxy::SetNameOwnerChangedCallback(SignalCallback callback) { + bus_->AssertOnOriginThread(); + + name_owner_changed_callback_ = callback; +} + DBusHandlerResult ObjectProxy::HandleMessage( DBusConnection* connection, DBusMessage* raw_message) { @@ -430,7 +436,7 @@ DBusHandlerResult ObjectProxy::HandleMessage( if (path.value() == kDbusSystemObjectPath && signal->GetMember() == "NameOwnerChanged") { // Handle NameOwnerChanged separately - return HandleNameOwnerChanged(signal.get()); + return HandleNameOwnerChanged(signal.Pass()); } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } @@ -619,7 +625,8 @@ void ObjectProxy::UpdateNameOwnerAndBlock() { service_name_owner_.clear(); } -DBusHandlerResult ObjectProxy::HandleNameOwnerChanged(Signal* signal) { +DBusHandlerResult ObjectProxy::HandleNameOwnerChanged( + scoped_ptr<Signal> signal) { DCHECK(signal); bus_->AssertOnDBusThread(); @@ -627,13 +634,23 @@ DBusHandlerResult ObjectProxy::HandleNameOwnerChanged(Signal* signal) { if (signal->GetMember() == "NameOwnerChanged" && signal->GetInterface() == "org.freedesktop.DBus" && signal->GetSender() == "org.freedesktop.DBus") { - MessageReader reader(signal); + MessageReader reader(signal.get()); std::string name, old_owner, new_owner; if (reader.PopString(&name) && reader.PopString(&old_owner) && reader.PopString(&new_owner) && name == service_name_) { service_name_owner_ = new_owner; + if (!name_owner_changed_callback_.is_null()) { + const base::TimeTicks start_time = base::TimeTicks::Now(); + Signal* released_signal = signal.release(); + bus_->PostTaskToOriginThread(FROM_HERE, + base::Bind(&ObjectProxy::RunMethod, + this, + start_time, + name_owner_changed_callback_, + released_signal)); + } return DBUS_HANDLER_RESULT_HANDLED; } } |