blob: b992d59879877d037d297129137ca4937c049383 [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 "logger/project_context_factory.h"
#include <google/protobuf/text_format.h>
#include <memory>
#include <string>
#include "./gtest.h"
#include "./logging.h"
using cobalt::config::ProjectConfigs;
namespace cobalt {
namespace logger {
namespace {
// Registry A has a single Cobalt 0.1 project.
const char kCobaltRegistryA[] = R"(
metric_configs {
customer_id: 11
project_id: 11
id: 11
}
)";
// Registry B has a single Cobalt 1.0 project.
const char kCobaltRegistryB[] = R"(
customers {
customer_name: "Customer22"
customer_id: 22
projects: {
project_name: "Project22"
project_id: 22
metrics: {
metric_name: "Metric22"
customer_id: 22
project_id: 22
id: 22
}
}
}
)";
// Registry C has one Cobalt 0.1 project and one Cobalt 1.0 project.
const char kCobaltRegistryC[] = R"(
metric_configs {
customer_id: 11
project_id: 11
id: 11
}
customers {
customer_name: "Customer22"
customer_id: 22
projects: {
project_name: "Project22"
project_id: 22
metrics: {
metric_name: "Metric22"
customer_id: 22
project_id: 22
id: 22
}
}
}
)";
// Returns the bytes of a serialized CobaltRegistry, corresponding to
// registry A, B or C, according as |which_registry| is equal to 1, 2, or 3.
std::string GetCobaltRegistryBytes(int which_registry) {
std::string registry_text;
switch (which_registry) {
case 1:
registry_text = std::string(kCobaltRegistryA);
break;
case 2:
registry_text = std::string(kCobaltRegistryB);
break;
case 3:
registry_text = std::string(kCobaltRegistryC);
break;
default:
LOG(FATAL) << "Unexpected value for which_registry: " << which_registry;
}
CobaltRegistry cobalt_registry;
google::protobuf::TextFormat::Parser parser;
parser.ParseFromString(registry_text, &cobalt_registry);
std::string registry_bytes;
cobalt_registry.SerializeToString(&registry_bytes);
return registry_bytes;
}
} // namespace
// Tests the methods of ProjectContext factory when it is constructed
// with invalid bytes.
TEST(ProjectContextFactoryTest, InvalidBytes) {
ProjectContextFactory factory("Invalid bytes");
EXPECT_FALSE(factory.is_valid());
EXPECT_FALSE(factory.is_single_project());
EXPECT_FALSE(factory.is_single_legacy_project());
EXPECT_EQ(nullptr, factory.NewProjectContext("Customer11", "Project11"));
EXPECT_EQ(nullptr, factory.NewProjectContext("Customer22", "Project22"));
EXPECT_EQ(nullptr, factory.TakeSingleProjectContext());
EXPECT_EQ(nullptr, factory.NewLegacyProjectContext(11, 11).get());
EXPECT_EQ(nullptr, factory.NewSingleLegacyProjectContext().get());
}
// Tests the methods of ProjectContext factory when it is constructed
// with the bytes of registry A.
TEST(ProjectContextFactoryTest, RegistryA) {
ProjectContextFactory factory(GetCobaltRegistryBytes(1));
// Registry A is valid
EXPECT_TRUE(factory.is_valid());
// Registry A is not a single Cobalt 1.0 project
EXPECT_FALSE(factory.is_single_project());
// Registry A is a single Cobalt 0.1 project
EXPECT_TRUE(factory.is_single_legacy_project());
// Registry A does not contain any Cobalt 1.0 projects.
EXPECT_EQ(nullptr,
factory.NewProjectContext("Customer11", "Project11").get());
EXPECT_EQ(nullptr,
factory.NewProjectContext("Customer22", "Project22").get());
// Registry A does not contain a single Cobalt 1.0 project.
EXPECT_EQ(nullptr, factory.TakeSingleProjectContext());
// Registry A does contain some Cobalt 0.1 project data.
EXPECT_NE(nullptr, factory.NewLegacyProjectContext(11, 11).get());
EXPECT_NE(nullptr, factory.NewLegacyProjectContext(22, 22).get());
// Registry A does contain a single Cobalt 0.1 project
EXPECT_NE(nullptr, factory.NewSingleLegacyProjectContext().get());
// The single Cobalt 0.1 project contains only metric 11.
auto legacy_context = factory.NewSingleLegacyProjectContext();
EXPECT_NE(nullptr, legacy_context->Metric(11));
EXPECT_EQ(nullptr, legacy_context->Metric(22));
// The Cobalt 0.1 project 11 contains only metric 11.
legacy_context = factory.NewLegacyProjectContext(11, 11);
EXPECT_NE(nullptr, legacy_context->Metric(11));
EXPECT_EQ(nullptr, legacy_context->Metric(22));
// The Cobalt 0.1 project 22 contains no metrics.
legacy_context = factory.NewLegacyProjectContext(22, 22);
EXPECT_EQ(nullptr, legacy_context->Metric(11));
EXPECT_EQ(nullptr, legacy_context->Metric(22));
}
TEST(ProjectContextFactoryTest, RegistryB) {
ProjectContextFactory factory(GetCobaltRegistryBytes(2));
// Registry B is valid.
EXPECT_TRUE(factory.is_valid());
// Registry B is a single Cobalt 1.0 poject.
EXPECT_TRUE(factory.is_single_project());
// Registry B is not a single Cobalt 0.1 project.
EXPECT_FALSE(factory.is_single_legacy_project());
// Registry B contains Cobalt 1.0 project 22, but no project 11
EXPECT_EQ(nullptr,
factory.NewProjectContext("Customer11", "Project11").get());
EXPECT_NE(nullptr,
factory.NewProjectContext("Customer22", "Project22").get());
// Registry B does not contain any Cobalt 0.1 project data.
EXPECT_EQ(nullptr, factory.NewLegacyProjectContext(11, 11).get());
EXPECT_EQ(nullptr, factory.NewSingleLegacyProjectContext().get());
// Registry B does contain a single Cobalt 1.0 project.
auto context = factory.TakeSingleProjectContext();
EXPECT_NE(nullptr, context);
// The single Cobalt 1.0 project contains metric 22 but not metric 11.
EXPECT_EQ(nullptr, context->GetMetric("Metric11"));
EXPECT_NE(nullptr, context->GetMetric("Metric22"));
// The data has been removed from the factory.
EXPECT_EQ(nullptr, factory.NewProjectContext("Customer22", "Project22"));
EXPECT_FALSE(factory.is_valid());
}
TEST(ProjectContextFactoryTest, RegistryC) {
ProjectContextFactory factory(GetCobaltRegistryBytes(3));
// Registry C is valid.
EXPECT_TRUE(factory.is_valid());
// Registry C does not contain only a single Cobalt 1.0 project.
EXPECT_FALSE(factory.is_single_project());
// Registry C does not contain only a single Cobalt 0.1 project.
EXPECT_FALSE(factory.is_single_legacy_project());
// Registry C contains Cobalt 1.0 project 22 but not project 11.
EXPECT_EQ(nullptr,
factory.NewProjectContext("Customer11", "Project11").get());
EXPECT_NE(nullptr,
factory.NewProjectContext("Customer22", "Project22").get());
// Registry C does not contain only a single Cobalt 0.1 project.
EXPECT_EQ(nullptr, factory.TakeSingleProjectContext());
// Registry C contains Cobalt 0.1 project 11 but not project 22.
EXPECT_NE(nullptr, factory.NewLegacyProjectContext(11, 11).get());
EXPECT_EQ(nullptr, factory.NewSingleLegacyProjectContext().get());
// Cobalt 0.1 project 11 contains metric 11 but not metric 22.
auto legacy_context = factory.NewLegacyProjectContext(11, 11);
EXPECT_NE(nullptr, legacy_context->Metric(11));
EXPECT_EQ(nullptr, legacy_context->Metric(22));
// There are no Cobalt 0.1 metrics for project 22.
legacy_context = factory.NewLegacyProjectContext(22, 22);
EXPECT_EQ(nullptr, legacy_context->Metric(11));
EXPECT_EQ(nullptr, legacy_context->Metric(22));
// Cobalt 1.0 project 22 contains metric 22 but not metric 21.
auto context = factory.NewProjectContext("Customer22", "Project22");
EXPECT_EQ(nullptr, context->GetMetric("Metric11"));
EXPECT_NE(nullptr, context->GetMetric("Metric22"));
}
TEST(ProjectContextFactoryTest, ReleaseStage) {
ProjectContextFactory factory(GetCobaltRegistryBytes(3));
auto context = factory.NewProjectContext("Customer22", "Project22");
EXPECT_EQ(GA, context->project().release_stage());
context = factory.NewProjectContext("Customer22", "Project22", FISHFOOD);
EXPECT_EQ(FISHFOOD, context->project().release_stage());
}
} // namespace logger
} // namespace cobalt