| // 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(®istry_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 |