blob: 60392e0db5d63f33fa7879f1420472c8e6713a3a [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 "garnet/bin/run_test_component/max_severity_config.h"
#include <rapidjson/document.h>
#include <src/lib/fxl/strings/string_printf.h>
#include "garnet/bin/run_test_component/run_test_component.h"
using fxl::StringPrintf;
namespace run {
const std::string kTests = "tests";
const std::string kUrl = "url";
const std::string kMaxSeverity = "max_severity";
MaxSeverityConfig MaxSeverityConfig::ParseFromDirectory(const std::string& path) {
MaxSeverityConfig config;
config.ParseDirectory(path);
return config;
}
void MaxSeverityConfig::ParseDirectory(const std::string& path) {
auto cb = [this](rapidjson::Document document) { ParseDocument(std::move(document)); };
json_parser_.ParseFromDirectory(path, cb);
}
void MaxSeverityConfig::ParseDocument(rapidjson::Document document) {
if (!document.IsObject()) {
json_parser_.ReportError("Config file is not a JSON object.");
return;
}
auto tests_it = document.FindMember(kTests);
if (tests_it != document.MemberEnd()) {
auto& value = tests_it->value;
if (value.IsArray()) {
for (const auto& test : value.GetArray()) {
auto keys = {kUrl, kMaxSeverity};
for (const auto& key : keys) {
if (!test.HasMember(key)) {
json_parser_.ReportError(StringPrintf("'%s' not found", key.c_str()));
return;
}
if (!test[key].IsString()) {
json_parser_.ReportError(StringPrintf("'%s' is not a string", key.c_str()));
return;
}
}
std::string url = test[kUrl].GetString();
std::string severity = test[kMaxSeverity].GetString();
int32_t log_severity;
auto level_result = run::ParseLogLevel(severity);
if (level_result.is_ok()) {
log_severity = level_result.value();
} else {
json_parser_.ReportError(StringPrintf(
"'%s' is not a valid severity for %s. Must be one of: [TRACE, DEBUG, INFO, "
"WARN, ERROR, FATAL]",
severity.c_str(), url.c_str()));
return;
}
auto emplace_out = config_.emplace(url, log_severity);
if (!emplace_out.second) {
json_parser_.ReportError(StringPrintf("test %s configured twice.", url.c_str()));
return;
}
}
} else {
json_parser_.ReportError(StringPrintf("'%s' is not an array.", kTests.c_str()));
}
}
}
} // namespace run