Make starterd print out its own version on failed applications
We already printed out application versions if they had self-reported a
timing report before crashing; however, it is useful to always have
_some_ version information, so include the starterd's own version in the
log message.
Change-Id: Ia75b8a1b2f54bc659d05b05d131acefa6e2aa8ee
Signed-off-by: James Kuszmaul <james.kuszmaul@bluerivertech.com>
diff --git a/aos/starter/subprocess_test.cc b/aos/starter/subprocess_test.cc
index 12f7f6d..fcc1128 100644
--- a/aos/starter/subprocess_test.cc
+++ b/aos/starter/subprocess_test.cc
@@ -105,6 +105,89 @@
ASSERT_EQ(aos::starter::State::STOPPED, echo_stderr.status());
}
+// Checks that when a child application crashing results in the starter printing
+// out its own version by default.
+TEST_F(SubprocessTest, PrintNoTimingReportVersionString) {
+ const std::string config_file =
+ ::aos::testing::ArtifactPath("aos/events/pingpong_config.json");
+
+ ::testing::internal::CaptureStderr();
+
+ // Set up application without quiet flag active
+ aos::FlatbufferDetachedBuffer<aos::Configuration> config =
+ aos::configuration::ReadConfig(config_file);
+ aos::ShmEventLoop event_loop(&config.message());
+ event_loop.SetVersionString("version_string");
+ bool observed_stopped = false;
+ Application error_out(
+ "false", "bash", &event_loop,
+ [&observed_stopped, &error_out]() {
+ if (error_out.status() == aos::starter::State::STOPPED) {
+ observed_stopped = true;
+ }
+ },
+ Application::QuietLogging::kNo);
+ error_out.set_args({"-c", "sleep 3; false"});
+
+ error_out.Start();
+ aos::TimerHandler *exit_timer =
+ event_loop.AddTimer([&event_loop]() { event_loop.Exit(); });
+ event_loop.OnRun([&event_loop, exit_timer]() {
+ exit_timer->Schedule(event_loop.monotonic_now() +
+ std::chrono::milliseconds(5000));
+ });
+
+ event_loop.Run();
+
+ // Ensure presence of logs without quiet flag
+ std::string output = ::testing::internal::GetCapturedStderr();
+ std::string expected = "starter version 'version_string'";
+
+ ASSERT_TRUE(output.find(expected) != std::string::npos) << output;
+ EXPECT_TRUE(observed_stopped);
+ EXPECT_EQ(aos::starter::State::STOPPED, error_out.status());
+}
+
+TEST_F(SubprocessTest, PrintFailedToStartVersionString) {
+ const std::string config_file =
+ ::aos::testing::ArtifactPath("aos/events/pingpong_config.json");
+
+ ::testing::internal::CaptureStderr();
+
+ // Set up application without quiet flag active
+ aos::FlatbufferDetachedBuffer<aos::Configuration> config =
+ aos::configuration::ReadConfig(config_file);
+ aos::ShmEventLoop event_loop(&config.message());
+ event_loop.SetVersionString("version_string");
+ bool observed_stopped = false;
+ Application error_out(
+ "false", "false", &event_loop,
+ [&observed_stopped, &error_out]() {
+ if (error_out.status() == aos::starter::State::STOPPED) {
+ observed_stopped = true;
+ }
+ },
+ Application::QuietLogging::kNo);
+
+ error_out.Start();
+ aos::TimerHandler *exit_timer =
+ event_loop.AddTimer([&event_loop]() { event_loop.Exit(); });
+ event_loop.OnRun([&event_loop, exit_timer]() {
+ exit_timer->Schedule(event_loop.monotonic_now() +
+ std::chrono::milliseconds(1500));
+ });
+
+ event_loop.Run();
+
+ // Ensure presence of logs without quiet flag
+ std::string output = ::testing::internal::GetCapturedStderr();
+ std::string expected = "starter version 'version_string'";
+
+ ASSERT_TRUE(output.find(expected) != std::string::npos) << output;
+ EXPECT_TRUE(observed_stopped);
+ EXPECT_EQ(aos::starter::State::STOPPED, error_out.status());
+}
+
TEST_F(SubprocessTest, UnactiveQuietFlag) {
const std::string config_file =
::aos::testing::ArtifactPath("aos/events/pingpong_config.json");
@@ -142,7 +225,8 @@
std::string expectedRun = "exited unexpectedly with status";
ASSERT_TRUE(output.find(expectedStart) != std::string::npos ||
- output.find(expectedRun) != std::string::npos);
+ output.find(expectedRun) != std::string::npos)
+ << output;
EXPECT_TRUE(observed_stopped);
EXPECT_EQ(aos::starter::State::STOPPED, error_out.status());
}