Index: mojo/shell/tests/lifecycle/lifecycle_unittest.cc |
diff --git a/mojo/shell/tests/lifecycle/lifecycle_unittest.cc b/mojo/shell/tests/lifecycle/lifecycle_unittest.cc |
index fd34f11b17b6dffe02523d93be1f90113cd263a4..27e068f5635c59b45e4e4f92288f4b543308fbb4 100644 |
--- a/mojo/shell/tests/lifecycle/lifecycle_unittest.cc |
+++ b/mojo/shell/tests/lifecycle/lifecycle_unittest.cc |
@@ -18,6 +18,7 @@ namespace shell { |
namespace { |
const char kTestAppName[] = "mojo:lifecycle_unittest_app"; |
+const char kTestParentName[] = "mojo:lifecycle_unittest_parent"; |
const char kTestExeName[] = "exe:lifecycle_unittest_exe"; |
const char kTestPackageName[] = "mojo:lifecycle_unittest_package"; |
const char kTestPackageAppNameA[] = "mojo:lifecycle_unittest_package_app_a"; |
@@ -438,6 +439,34 @@ TEST_F(LifecycleTest, Exe_TerminateProcess) { |
EXPECT_EQ(0u, instances()->GetNewInstanceCount()); |
} |
+TEST_F(LifecycleTest, ShutdownTree) { |
+ // Verifies that Instances are destroyed when their creator is. |
+ scoped_ptr<Connection> parent_connection = |
+ connector()->Connect(kTestParentName); |
+ test::mojom::ParentPtr parent; |
+ parent_connection->GetInterface(&parent); |
+ |
+ // This asks kTestParentName to open a connection to kTestAppName and blocks |
+ // on a response from a Ping(). |
+ { |
+ base::RunLoop loop; |
+ parent->ConnectToChild(base::Bind(&QuitLoop, &loop)); |
+ loop.Run(); |
+ } |
+ |
+ // Should now have two new instances (parent and child). |
+ EXPECT_EQ(2u, instances()->GetNewInstanceCount()); |
+ EXPECT_TRUE(instances()->HasInstanceForName(kTestParentName)); |
+ EXPECT_TRUE(instances()->HasInstanceForName(kTestAppName)); |
+ |
+ parent->Quit(); |
+ |
+ // Quitting the parent should cascade-quit the child. |
+ WaitForInstanceDestruction(); |
+ EXPECT_EQ(0u, instances()->GetNewInstanceCount()); |
+ EXPECT_FALSE(instances()->HasInstanceForName(kTestParentName)); |
+ EXPECT_FALSE(instances()->HasInstanceForName(kTestAppName)); |
+} |
} // namespace shell |
} // namespace mojo |