blob: 7daa3c9b9ee0a67dd82e45148c59c335cedc4c24 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <fuchsia/modular/session/cpp/fidl.h>
#include <fuchsia/modular/testing/cpp/fidl.h>
#include <fuchsia/testing/modular/cpp/fidl.h>
#include <gmock/gmock.h>
#include <sdk/lib/modular/testing/cpp/fake_component.h>
#include "src/modular/lib/modular_test_harness/cpp/fake_module.h"
#include "src/modular/lib/modular_test_harness/cpp/fake_session_shell.h"
#include "src/modular/lib/modular_test_harness/cpp/test_harness_fixture.h"
namespace {
class TestAgent : public modular_testing::FakeComponent {
public:
fit::closure on_create;
static std::unique_ptr<TestAgent> CreateWithDefaultOptions() {
return std::make_unique<TestAgent>(modular_testing::FakeComponent::Args{
.url = modular_testing::TestHarnessBuilder::GenerateFakeUrl()});
}
TestAgent(FakeComponent::Args args) : FakeComponent(std::move(args)) {}
// |FakeComponent|
void OnCreate(fuchsia::sys::StartupInfo startup_info) override {
FakeComponent::OnCreate(std::move(startup_info));
if (on_create)
on_create();
}
};
class AgentRestartTest : public modular_testing::TestHarnessFixture {
protected:
std::unique_ptr<TestAgent> agent_;
AgentRestartTest() : agent_(TestAgent::CreateWithDefaultOptions()) {}
};
// Test that a session agent is restarted if it crashes.
TEST_F(AgentRestartTest, SessionAgentsAreRestartedOnCrash) {
fuchsia::modular::testing::TestHarnessSpec spec;
spec.mutable_sessionmgr_config()->mutable_session_agents()->push_back(agent_->url());
modular_testing::TestHarnessBuilder builder(std::move(spec));
builder.InterceptComponent(agent_->BuildInterceptOptions());
bool was_started = false;
agent_->on_create = [&] { was_started = true; };
builder.BuildAndRun(test_harness());
RunLoopUntil([&] { return was_started; });
was_started = false;
agent_->Exit(1, fuchsia::sys::TerminationReason::EXITED);
RunLoopUntil([&] { return was_started; });
}
// Test that a session agent is not restarted if it crashes when the config field
// disable_agent_restart_on_crash is set to true.
TEST_F(AgentRestartTest, SessionAgentsAreNotRestartedOnCrashWhenDisabled) {
fuchsia::modular::testing::TestHarnessSpec spec;
spec.mutable_sessionmgr_config()->mutable_session_agents()->push_back(agent_->url());
spec.mutable_sessionmgr_config()->set_disable_agent_restart_on_crash(true);
modular_testing::TestHarnessBuilder builder(std::move(spec));
builder.InterceptComponent(agent_->BuildInterceptOptions());
bool was_started = false;
agent_->on_create = [&] { was_started = true; };
builder.BuildAndRun(test_harness());
RunLoopUntil([&] { return was_started; });
was_started = false;
agent_->Exit(1, fuchsia::sys::TerminationReason::EXITED);
sleep(3);
test_harness_launcher()->StopTestHarness();
RunLoopUntil([&]() { return !test_harness_launcher()->is_test_harness_running(); });
EXPECT_FALSE(was_started);
}
} // namespace