Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1284)

Unified Diff: dbus/signal_sender_verification_unittest.cc

Issue 11358111: Make SignalSenderVerificationTest more robust (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: fix uninitialized members Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « dbus/object_proxy.cc ('k') | dbus/test_service.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dbus/signal_sender_verification_unittest.cc
diff --git a/dbus/signal_sender_verification_unittest.cc b/dbus/signal_sender_verification_unittest.cc
index 91db93fb421157083e004739baeab124979a0ec1..6e59ea4c60cd114e95be9be898009dfd49aada96 100644
--- a/dbus/signal_sender_verification_unittest.cc
+++ b/dbus/signal_sender_verification_unittest.cc
@@ -20,7 +20,9 @@
// The test for sender verification in ObjectProxy.
class SignalSenderVerificationTest : public testing::Test {
public:
- SignalSenderVerificationTest() {
+ SignalSenderVerificationTest()
+ : on_name_owner_changed_called_(false),
+ on_ownership_called_(false) {
}
virtual void SetUp() {
@@ -35,21 +37,6 @@ class SignalSenderVerificationTest : public testing::Test {
thread_options.message_loop_type = MessageLoop::TYPE_IO;
ASSERT_TRUE(dbus_thread_->StartWithOptions(thread_options));
- // Start the test service, using the D-Bus thread.
- dbus::TestService::Options options;
- options.dbus_thread_message_loop_proxy = dbus_thread_->message_loop_proxy();
- test_service_.reset(new dbus::TestService(options));
- ASSERT_TRUE(test_service_->StartService());
- ASSERT_TRUE(test_service_->WaitUntilServiceIsStarted());
- ASSERT_TRUE(test_service_->HasDBusThread());
-
- // Same setup for the second TestService. This service should not have the
- // ownership of the name at this point.
- test_service2_.reset(new dbus::TestService(options));
- ASSERT_TRUE(test_service2_->StartService());
- ASSERT_TRUE(test_service2_->WaitUntilServiceIsStarted());
- ASSERT_TRUE(test_service2_->HasDBusThread());
-
// Create the client, using the D-Bus thread.
dbus::Bus::Options bus_options;
bus_options.bus_type = dbus::Bus::SESSION;
@@ -62,6 +49,10 @@ class SignalSenderVerificationTest : public testing::Test {
dbus::ObjectPath("/org/chromium/TestObject"));
ASSERT_TRUE(bus_->HasDBusThread());
+ object_proxy_->SetNameOwnerChangedCallback(
+ base::Bind(&SignalSenderVerificationTest::OnNameOwnerChanged,
+ base::Unretained(this)));
+
// Connect to the "Test" signal of "org.chromium.TestInterface" from
// the remote object.
object_proxy_->ConnectToSignal(
@@ -73,6 +64,29 @@ class SignalSenderVerificationTest : public testing::Test {
base::Unretained(this)));
// Wait until the object proxy is connected to the signal.
message_loop_.Run();
+
+ // Start the test service, using the D-Bus thread.
+ dbus::TestService::Options options;
+ options.dbus_thread_message_loop_proxy = dbus_thread_->message_loop_proxy();
+ test_service_.reset(new dbus::TestService(options));
+ ASSERT_TRUE(test_service_->StartService());
+ ASSERT_TRUE(test_service_->WaitUntilServiceIsStarted());
+ ASSERT_TRUE(test_service_->HasDBusThread());
+ ASSERT_TRUE(test_service_->has_ownership());
+
+ // Same setup for the second TestService. This service should not have the
+ // ownership of the name at this point.
+ test_service2_.reset(new dbus::TestService(options));
+ ASSERT_TRUE(test_service2_->StartService());
+ ASSERT_TRUE(test_service2_->WaitUntilServiceIsStarted());
+ ASSERT_TRUE(test_service2_->HasDBusThread());
+ ASSERT_FALSE(test_service2_->has_ownership());
+
+ // The name should be owned and known at this point.
+ if (!on_name_owner_changed_called_)
+ message_loop_.Run();
+ ASSERT_FALSE(latest_name_owner_.empty());
+
}
virtual void TearDown() {
@@ -91,6 +105,31 @@ class SignalSenderVerificationTest : public testing::Test {
test_service2_->Stop();
}
+ void OnOwnership(bool expected, bool success) {
+ ASSERT_EQ(expected, success);
+ // PostTask to quit the MessageLoop as this is called from D-Bus thread.
+ message_loop_.PostTask(
+ FROM_HERE,
+ base::Bind(&SignalSenderVerificationTest::OnOwnershipInternal,
+ base::Unretained(this)));
+ }
+
+ void OnOwnershipInternal() {
+ on_ownership_called_ = true;
+ message_loop_.Quit();
+ }
+
+ void OnNameOwnerChanged(dbus::Signal* signal) {
+ dbus::MessageReader reader(signal);
+ std::string name, old_owner, new_owner;
+ ASSERT_TRUE(reader.PopString(&name));
+ ASSERT_TRUE(reader.PopString(&old_owner));
+ ASSERT_TRUE(reader.PopString(&new_owner));
+ latest_name_owner_ = new_owner;
+ on_name_owner_changed_called_ = true;
+ message_loop_.Quit();
+ }
+
protected:
// Called when the "Test" signal is received, in the main thread.
@@ -123,6 +162,13 @@ class SignalSenderVerificationTest : public testing::Test {
scoped_ptr<dbus::TestService> test_service2_;
// Text message from "Test" signal.
std::string test_signal_string_;
+
+ // The known latest name owner of TestService. Updated in OnNameOwnerChanged.
+ std::string latest_name_owner_;
+
+ // Boolean flags to record callback calls.
+ bool on_name_owner_changed_called_;
+ bool on_ownership_called_;
};
TEST_F(SignalSenderVerificationTest, TestSignalAccepted) {
@@ -157,7 +203,7 @@ TEST_F(SignalSenderVerificationTest, TestSignalRejected) {
EXPECT_EQ(samples1->TotalCount() + 1, samples2->TotalCount());
}
-TEST_F(SignalSenderVerificationTest, DISABLED_TestOwnerChanged) {
+TEST_F(SignalSenderVerificationTest, TestOwnerChanged) {
const char kMessage[] = "hello, world";
// Send the test signal from the exported object.
@@ -167,9 +213,30 @@ TEST_F(SignalSenderVerificationTest, DISABLED_TestOwnerChanged) {
WaitForTestSignal();
ASSERT_EQ(kMessage, test_signal_string_);
- // Release and aquire the name ownership.
+ // 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();
- test_service2_->RequestOwnership();
+ // 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;
+ 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_);
+
+ // latest_name_owner_ becomes non empty as the new owner appears.
+ ASSERT_FALSE(latest_name_owner_.empty());
// Now the second service owns the name.
const char kNewMessage[] = "hello, new world";
« no previous file with comments | « dbus/object_proxy.cc ('k') | dbus/test_service.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698