[modular][testing] Add tests for TestHarness lifecycle events.

MF-412 #done

Change-Id: I4203bb2345db94b1a66b0a66801d151aebf7a4d1
diff --git a/peridot/public/lib/modular_test_harness/cpp/test_harness_fixture_test.cc b/peridot/public/lib/modular_test_harness/cpp/test_harness_fixture_test.cc
index 63c9abf..b75a92d 100644
--- a/peridot/public/lib/modular_test_harness/cpp/test_harness_fixture_test.cc
+++ b/peridot/public/lib/modular_test_harness/cpp/test_harness_fixture_test.cc
@@ -4,6 +4,7 @@
 
 #include <fuchsia/modular/testing/cpp/fidl.h>
 #include <lib/fsl/vmo/strings.h>
+#include <lib/modular_test_harness/cpp/fake_component.h>
 #include <lib/modular_test_harness/cpp/test_harness_fixture.h>
 #include <lib/sys/cpp/service_directory.h>
 #include <lib/sys/cpp/testing/test_with_environment.h>
@@ -143,3 +144,68 @@
   test_harness()->Run(builder.BuildSpec());
   RunLoopUntil([&] { return intercepted; });
 }
+
+class TestComponent : public modular::testing::FakeComponent {
+ public:
+  TestComponent(fit::function<void()> on_created,
+                fit::function<void()> on_destroyed)
+      : on_created_(std::move(on_created)),
+        on_destroyed_(std::move(on_destroyed)) {}
+
+ protected:
+  void OnCreate(fuchsia::sys::StartupInfo startup_info) override {
+    on_created_();
+  }
+
+  void OnDestroy() override { on_destroyed_(); }
+
+  fit::function<void()> on_created_;
+  fit::function<void()> on_destroyed_;
+};
+
+// Tests that FakeComponent receives lifecycle events when it is killed
+// by its parent.
+TEST_F(TestHarnessFixtureTest, FakeComponentLifecycle_KilledByParent) {
+  modular::testing::TestHarnessBuilder builder;
+
+  bool running = false;
+  TestComponent session_shell([&] { running = true; },
+                              [&] { running = false; });
+  builder.InterceptSessionShell(
+      session_shell.GetOnCreateHandler(),
+      {.url = builder.GenerateFakeUrl(),
+       .sandbox_services = {"fuchsia.modular.SessionShellContext"}});
+
+  test_harness().events().OnNewComponent = builder.BuildOnNewComponentHandler();
+  test_harness()->Run(builder.BuildSpec());
+  RunLoopUntil([&] { return session_shell.is_running(); });
+  EXPECT_TRUE(running);
+
+  fuchsia::modular::SessionShellContextPtr session_shell_context;
+  session_shell.component_context()->svc()->Connect(
+      session_shell_context.NewRequest());
+  session_shell_context->Logout();
+
+  RunLoopUntil([&] { return !session_shell.is_running(); });
+  EXPECT_FALSE(running);
+}
+
+// Tests that FakeComponent receives lifecycle events when it kills
+// itself.
+TEST_F(TestHarnessFixtureTest, FakeComponentLifecycle_KilledBySelf) {
+  modular::testing::TestHarnessBuilder builder;
+
+  bool running = false;
+  TestComponent base_shell([&] { running = true; }, [&] { running = false; });
+  builder.InterceptBaseShell(base_shell.GetOnCreateHandler(),
+                             {.url = builder.GenerateFakeUrl()});
+
+  test_harness().events().OnNewComponent = builder.BuildOnNewComponentHandler();
+  test_harness()->Run(builder.BuildSpec());
+  RunLoopUntil([&] { return base_shell.is_running(); });
+  EXPECT_TRUE(running);
+
+  base_shell.Exit(0);
+  RunLoopUntil([&] { return !base_shell.is_running(); });
+  EXPECT_FALSE(running);
+}