blob: 612ee5d393d9d54b36447f6fe81b5bf99247c272 [file] [log] [blame]
// Copyright 2019 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 <lib/inspect/cpp/health.h>
#include <lib/inspect/cpp/reader.h>
#include <zxtest/zxtest.h>
#include "lib/inspect/cpp/hierarchy.h"
namespace {
const inspect::StringPropertyValue* GetStringPropertyValue(const inspect::NodeValue& node,
const std::string& name) {
for (const auto& property : node.properties()) {
if (property.name() == name && property.Contains<inspect::StringPropertyValue>()) {
return &property.Get<inspect::StringPropertyValue>();
}
}
return nullptr;
}
bool ContainsProperty(const inspect::NodeValue& node, const std::string& name) {
for (const auto& property : node.properties()) {
if (property.name() == name) {
return true;
}
}
return false;
}
TEST(InspectHealth, Default) {
auto inspector = inspect::Inspector("root");
auto health = inspect::NodeHealth(&inspector.GetRoot());
auto hierarchy = inspect::ReadFromVmo(*inspector.GetVmo().take_value()).take_value();
auto* health_subtree = hierarchy.GetByPath({inspect::kHealthNodeName});
ASSERT_TRUE(health_subtree != nullptr);
EXPECT_STR_EQ(inspect::kHealthNodeName, health_subtree->name().c_str());
auto* status = GetStringPropertyValue(health_subtree->node(), "status");
ASSERT_TRUE(status != nullptr);
ASSERT_FALSE(ContainsProperty(health_subtree->node(), "message"));
EXPECT_STR_EQ(inspect::kHealthStartingUp, status->value().c_str());
}
TEST(InspectHealth, Ok) {
auto inspector = inspect::Inspector("root");
auto health = inspect::NodeHealth(&inspector.GetRoot());
health.Ok();
auto hierarchy = inspect::ReadFromVmo(*inspector.GetVmo().take_value()).take_value();
auto* health_subtree = hierarchy.GetByPath({inspect::kHealthNodeName});
ASSERT_TRUE(health_subtree != nullptr);
EXPECT_STR_EQ(inspect::kHealthNodeName, health_subtree->name().c_str());
auto* status = GetStringPropertyValue(health_subtree->node(), "status");
ASSERT_TRUE(status != nullptr);
ASSERT_FALSE(ContainsProperty(health_subtree->node(), "message"));
EXPECT_STR_EQ(inspect::kHealthOk, status->value().c_str());
}
TEST(InspectHealth, UnhealthyToStartingUp) {
auto inspector = inspect::Inspector("root");
auto health = inspect::NodeHealth(&inspector.GetRoot());
health.Unhealthy("test");
health.StartingUp();
auto hierarchy = inspect::ReadFromVmo(*inspector.GetVmo().take_value()).take_value();
auto* health_subtree = hierarchy.GetByPath({inspect::kHealthNodeName});
ASSERT_TRUE(health_subtree != nullptr);
EXPECT_STR_EQ(inspect::kHealthNodeName, health_subtree->name().c_str());
auto* status = GetStringPropertyValue(health_subtree->node(), "status");
ASSERT_TRUE(status != nullptr);
ASSERT_FALSE(ContainsProperty(health_subtree->node(), "message"));
EXPECT_STR_EQ(inspect::kHealthStartingUp, status->value().c_str());
}
TEST(InspectHealth, Unhealthy) {
auto inspector = inspect::Inspector("root");
auto health = inspect::NodeHealth(&inspector.GetRoot());
health.Unhealthy("test");
auto hierarchy = inspect::ReadFromVmo(*inspector.GetVmo().take_value()).take_value();
auto* health_subtree = hierarchy.GetByPath({inspect::kHealthNodeName});
ASSERT_TRUE(health_subtree != nullptr);
EXPECT_STR_EQ(inspect::kHealthNodeName, health_subtree->name().c_str());
auto* status = GetStringPropertyValue(health_subtree->node(), "status");
auto* message = GetStringPropertyValue(health_subtree->node(), "message");
ASSERT_TRUE(status != nullptr);
ASSERT_TRUE(message != nullptr);
EXPECT_STR_EQ(inspect::kHealthUnhealthy, status->value().c_str());
EXPECT_STR_EQ("test", message->value().c_str());
}
TEST(InspectHealth, StartingUpReason) {
auto inspector = inspect::Inspector("root");
auto health = inspect::NodeHealth(&inspector.GetRoot());
health.StartingUp("test");
auto hierarchy = inspect::ReadFromVmo(*inspector.GetVmo().take_value()).take_value();
auto* health_subtree = hierarchy.GetByPath({inspect::kHealthNodeName});
ASSERT_TRUE(health_subtree != nullptr);
EXPECT_STR_EQ(inspect::kHealthNodeName, health_subtree->name().c_str());
auto* status = GetStringPropertyValue(health_subtree->node(), "status");
auto* message = GetStringPropertyValue(health_subtree->node(), "message");
ASSERT_TRUE(status != nullptr);
ASSERT_TRUE(message != nullptr);
EXPECT_STR_EQ(inspect::kHealthStartingUp, status->value().c_str());
EXPECT_STR_EQ("test", message->value().c_str());
}
TEST(InspectHealth, CustomMessage) {
auto inspector = inspect::Inspector("root");
auto health = inspect::NodeHealth(&inspector.GetRoot());
health.SetStatus("BAD CONFIG", "test");
auto hierarchy = inspect::ReadFromVmo(*inspector.GetVmo().take_value()).take_value();
auto* health_subtree = hierarchy.GetByPath({inspect::kHealthNodeName});
ASSERT_TRUE(health_subtree != nullptr);
EXPECT_STR_EQ(inspect::kHealthNodeName, health_subtree->name().c_str());
auto* status = GetStringPropertyValue(health_subtree->node(), "status");
auto* message = GetStringPropertyValue(health_subtree->node(), "message");
ASSERT_TRUE(status != nullptr);
ASSERT_TRUE(message != nullptr);
EXPECT_STR_EQ("BAD CONFIG", status->value().c_str());
EXPECT_STR_EQ("test", message->value().c_str());
}
} // namespace