blob: 55a29c043f2bbe0f0dfc707ddc50bf51921fc911 [file] [log] [blame]
// Copyright 2020 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 "src/sys/time/network_time_service/inspect.h"
#include <lib/async/cpp/executor.h>
#include <lib/gtest/test_loop_fixture.h>
#include <lib/inspect/testing/cpp/inspect.h>
namespace network_time_service {
class InspectTest : public gtest::TestLoopFixture {
public:
InspectTest() : executor_(dispatcher()) {}
protected:
void RunPromiseToCompletion(fit::promise<> promise) {
executor_.schedule_task(std::move(promise));
RunLoopUntilIdle();
}
private:
async::Executor executor_;
};
TEST_F(InspectTest, Success) {
inspect::Inspector inspector;
Inspect inspect(std::move(inspector.GetRoot()));
RunPromiseToCompletion(
inspect::ReadFromInspector(inspector).then([&](fit::result<inspect::Hierarchy>& hierarchy) {
ASSERT_TRUE(hierarchy.is_ok());
auto* success_count =
hierarchy.value().node().get_property<inspect::UintPropertyValue>("success_count");
ASSERT_TRUE(success_count);
ASSERT_EQ(0u, success_count->value());
}));
inspect.Success();
RunPromiseToCompletion(
inspect::ReadFromInspector(inspector).then([&](fit::result<inspect::Hierarchy>& hierarchy) {
ASSERT_TRUE(hierarchy.is_ok());
auto* success_count =
hierarchy.value().node().get_property<inspect::UintPropertyValue>("success_count");
ASSERT_TRUE(success_count);
ASSERT_EQ(1u, success_count->value());
}));
}
TEST_F(InspectTest, Failure) {
inspect::Inspector inspector;
Inspect inspect(std::move(inspector.GetRoot()));
RunPromiseToCompletion(
inspect::ReadFromInspector(inspector).then([&](fit::result<inspect::Hierarchy>& hierarchy) {
ASSERT_TRUE(hierarchy.is_ok());
auto* failure_node = hierarchy.value().GetByPath({"failure_count"});
ASSERT_TRUE(failure_node);
ASSERT_TRUE(failure_node->children().empty());
}));
inspect.Failure(time_server::BAD_RESPONSE);
RunPromiseToCompletion(
inspect::ReadFromInspector(inspector).then([&](fit::result<inspect::Hierarchy>& hierarchy) {
ASSERT_TRUE(hierarchy.is_ok());
auto* failure_node = hierarchy.value().GetByPath({"failure_count"});
ASSERT_TRUE(failure_node);
ASSERT_EQ(1u, failure_node->node().properties().size());
auto* bad_response =
failure_node->node().get_property<inspect::UintPropertyValue>("bad_response");
ASSERT_TRUE(bad_response);
ASSERT_EQ(1u, bad_response->value());
}));
inspect.Failure(time_server::BAD_RESPONSE);
inspect.Failure(time_server::NETWORK_ERROR);
RunPromiseToCompletion(
inspect::ReadFromInspector(inspector).then([&](fit::result<inspect::Hierarchy>& hierarchy) {
ASSERT_TRUE(hierarchy.is_ok());
auto* failure_node = hierarchy.value().GetByPath({"failure_count"});
ASSERT_TRUE(failure_node);
ASSERT_EQ(2u, failure_node->node().properties().size());
auto* bad_response =
failure_node->node().get_property<inspect::UintPropertyValue>("bad_response");
ASSERT_TRUE(bad_response);
ASSERT_EQ(2u, bad_response->value());
auto* network = failure_node->node().get_property<inspect::UintPropertyValue>("network");
ASSERT_TRUE(network);
ASSERT_EQ(1u, network->value());
}));
}
} // namespace network_time_service