Index: dbus/signal_sender_verification_unittest.cc |
diff --git a/dbus/signal_sender_verification_unittest.cc b/dbus/signal_sender_verification_unittest.cc |
index df2acd2cf466e765acfbe2e92109cbede433c8a4..cbf4b5f71921b5dae830f358e8d7d7450f64b42b 100644 |
--- a/dbus/signal_sender_verification_unittest.cc |
+++ b/dbus/signal_sender_verification_unittest.cc |
@@ -154,6 +154,14 @@ class SignalSenderVerificationTest : public testing::Test { |
message_loop_.Run(); |
} |
+ // Stopping a thread is considered an IO operation, so we need to fiddle with |
+ // thread restrictions before and after calling Stop() on a TestService. |
+ void SafeServiceStop(TestService* test_service) { |
+ base::ThreadRestrictions::SetIOAllowed(true); |
+ test_service->Stop(); |
+ base::ThreadRestrictions::SetIOAllowed(false); |
+ } |
+ |
base::MessageLoop message_loop_; |
scoped_ptr<base::Thread> dbus_thread_; |
scoped_refptr<Bus> bus_; |
@@ -224,6 +232,7 @@ TEST_F(SignalSenderVerificationTest, TestOwnerChanged) { |
// Reset the flag as NameOwnerChanged is already received in setup. |
on_name_owner_changed_called_ = false; |
+ on_ownership_called_ = false; |
test_service2_->RequestOwnership( |
base::Bind(&SignalSenderVerificationTest::OnOwnership, |
base::Unretained(this), true)); |
@@ -246,6 +255,64 @@ TEST_F(SignalSenderVerificationTest, TestOwnerChanged) { |
ASSERT_EQ(kNewMessage, test_signal_string_); |
} |
+TEST_F(SignalSenderVerificationTest, TestOwnerStealing) { |
+ // Release and acquire the name ownership. |
+ // latest_name_owner_ should be non empty as |test_service_| owns the name. |
+ ASSERT_FALSE(latest_name_owner_.empty()); |
+ test_service_->ShutdownAndBlock(); |
+ // OnNameOwnerChanged will PostTask to quit the message loop. |
+ message_loop_.Run(); |
+ // latest_name_owner_ should be empty as the owner is gone. |
+ ASSERT_TRUE(latest_name_owner_.empty()); |
+ // Reset the flag as NameOwnerChanged is already received in setup. |
+ on_name_owner_changed_called_ = false; |
+ |
+ // Start a test service that allows theft, using the D-Bus thread. |
+ TestService::Options options; |
+ options.dbus_task_runner = dbus_thread_->message_loop_proxy(); |
+ options.request_ownership_options = Bus::REQUIRE_PRIMARY_ALLOW_REPLACEMENT; |
+ TestService stealable_test_service(options); |
+ ASSERT_TRUE(stealable_test_service.StartService()); |
+ ASSERT_TRUE(stealable_test_service.WaitUntilServiceIsStarted()); |
+ ASSERT_TRUE(stealable_test_service.HasDBusThread()); |
+ ASSERT_TRUE(stealable_test_service.has_ownership()); |
+ |
+ // OnNameOwnerChanged will PostTask to quit the message loop. |
+ message_loop_.Run(); |
+ |
+ // Send a signal to check that the service is correctly owned. |
+ const char kMessage[] = "hello, world"; |
+ |
+ // Send the test signal from the exported object. |
+ stealable_test_service.SendTestSignal(kMessage); |
+ // Receive the signal with the object proxy. The signal is handled in |
+ // SignalSenderVerificationTest::OnTestSignal() in the main thread. |
+ WaitForTestSignal(); |
+ ASSERT_EQ(kMessage, test_signal_string_); |
+ |
+ // Reset the flag as NameOwnerChanged was called above. |
+ on_name_owner_changed_called_ = false; |
+ test_service2_->RequestOwnership( |
+ base::Bind(&SignalSenderVerificationTest::OnOwnership, |
+ base::Unretained(this), true)); |
+ // Both of OnNameOwnerChanged() and OnOwnership() should quit the MessageLoop, |
+ // but there's no expected order of those 2 event. |
+ message_loop_.Run(); |
+ if (!on_name_owner_changed_called_ || !on_ownership_called_) |
+ message_loop_.Run(); |
+ ASSERT_TRUE(on_name_owner_changed_called_); |
+ ASSERT_TRUE(on_ownership_called_); |
+ |
+ // Now the second service owns the name. |
+ const char kNewMessage[] = "hello, new world"; |
+ |
+ test_service2_->SendTestSignal(kNewMessage); |
+ WaitForTestSignal(); |
+ ASSERT_EQ(kNewMessage, test_signal_string_); |
+ |
+ SafeServiceStop(&stealable_test_service); |
+} |
+ |
// Fails on Linux ChromiumOS Tests |
TEST_F(SignalSenderVerificationTest, DISABLED_TestMultipleObjects) { |
const char kMessage[] = "hello, world"; |