diff options
| -rw-r--r-- | test/meson.build | 1 | ||||
| -rw-r--r-- | test/redfish-core/include/utils/telemetry_utils_test.cpp | 216 |
2 files changed, 217 insertions, 0 deletions
diff --git a/test/meson.build b/test/meson.build index a74a0906e7..1fea114cc4 100644 --- a/test/meson.build +++ b/test/meson.build @@ -55,6 +55,7 @@ srcfiles_unittest = files( 'redfish-core/include/utils/stl_utils_test.cpp', 'redfish-core/include/utils/sw_utils_test.cpp', 'redfish-core/include/utils/systems_utils_test.cpp', + 'redfish-core/include/utils/telemetry_utils_test.cpp', 'redfish-core/include/utils/time_utils_test.cpp', 'redfish-core/lib/account_service_test.cpp', 'redfish-core/lib/chassis_test.cpp', diff --git a/test/redfish-core/include/utils/telemetry_utils_test.cpp b/test/redfish-core/include/utils/telemetry_utils_test.cpp new file mode 100644 index 0000000000..d910a1f8a0 --- /dev/null +++ b/test/redfish-core/include/utils/telemetry_utils_test.cpp @@ -0,0 +1,216 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: Copyright OpenBMC Authors +#include "generated/enums/metric_report_definition.hpp" +#include "utils/telemetry_utils.hpp" + +#include <nlohmann/json.hpp> + +#include <optional> +#include <stdexcept> +#include <string> +#include <vector> + +#include <gtest/gtest.h> + +namespace redfish::telemetry +{ +namespace +{ + +TEST(GetDbusReportPath, AppendsIdToReportsCollection) +{ + EXPECT_EQ(getDbusReportPath("TestReport"), + "/xyz/openbmc_project/Telemetry/Reports/TelemetryService/" + "TestReport"); + EXPECT_EQ(getDbusReportPath("Test_Report"), + "/xyz/openbmc_project/Telemetry/Reports/TelemetryService/" + "Test_Report"); + EXPECT_EQ(getDbusReportPath("1Report"), + "/xyz/openbmc_project/Telemetry/Reports/TelemetryService/" + "1Report"); +} + +TEST(GetDbusReportPath, EmptyIdThrows) +{ + EXPECT_THROW(getDbusReportPath(""), std::invalid_argument); +} + +TEST(GetDbusReportPath, EscapesIdStartingWithUnderscore) +{ + EXPECT_EQ(getDbusReportPath("_Report"), + "/xyz/openbmc_project/Telemetry/Reports/TelemetryService/" + "_5fReport"); +} + +TEST(GetDbusTriggerPath, AppendsIdToTriggersCollection) +{ + EXPECT_EQ(getDbusTriggerPath("TestTrigger"), + "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService/" + "TestTrigger"); +} + +TEST(GetDbusTriggerPath, EmptyIdThrows) +{ + EXPECT_THROW(getDbusTriggerPath(""), std::invalid_argument); +} + +TEST(GetDbusTriggerPath, EscapesIdStartingWithUnderscore) +{ + EXPECT_EQ(getDbusTriggerPath("_Trigger"), + "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService/" + "_5fTrigger"); +} + +TEST(GetTriggerIdFromDbusPath, ReturnsLastSegment) +{ + EXPECT_EQ(getTriggerIdFromDbusPath( + "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService/" + "TestTrigger"), + std::optional<std::string>("TestTrigger")); + EXPECT_EQ(getTriggerIdFromDbusPath( + "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService/" + "Test_Trigger"), + std::optional<std::string>("Test_Trigger")); +} + +TEST(GetTriggerIdFromDbusPath, DecodesEscapedSegment) +{ + EXPECT_EQ(getTriggerIdFromDbusPath( + "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService/" + "_5fTrigger"), + std::optional<std::string>("_Trigger")); +} + +TEST(GetTriggerIdFromDbusPath, RoundTripsGetDbusTriggerPath) +{ + EXPECT_EQ(getTriggerIdFromDbusPath(getDbusTriggerPath("TestTrigger")), + std::optional<std::string>("TestTrigger")); + EXPECT_EQ(getTriggerIdFromDbusPath(getDbusTriggerPath("Test_Trigger")), + std::optional<std::string>("Test_Trigger")); + EXPECT_EQ(getTriggerIdFromDbusPath(getDbusTriggerPath("_Trigger")), + std::optional<std::string>("_Trigger")); + EXPECT_EQ(getTriggerIdFromDbusPath(getDbusTriggerPath("a.b")), + std::optional<std::string>("a.b")); +} + +TEST(GetTriggerIdFromDbusPath, RejectsEmptyId) +{ + EXPECT_EQ(getTriggerIdFromDbusPath( + "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService/"), + std::nullopt); + EXPECT_EQ(getTriggerIdFromDbusPath( + "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService/" + "_zz"), + std::nullopt); +} + +TEST(GetTriggerIdFromDbusPath, RejectsPathOutsideTriggersCollection) +{ + EXPECT_EQ(getTriggerIdFromDbusPath( + "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService"), + std::nullopt); + EXPECT_EQ(getTriggerIdFromDbusPath( + "/xyz/openbmc_project/Telemetry/Reports/TelemetryService/" + "TestReport"), + std::nullopt); + EXPECT_EQ(getTriggerIdFromDbusPath( + "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService/" + "a/b"), + std::nullopt); + EXPECT_EQ(getTriggerIdFromDbusPath(""), std::nullopt); + EXPECT_EQ(getTriggerIdFromDbusPath("NotAPath"), std::nullopt); +} + +TEST(ToRedfishCollectionFunction, ConvertsKnownOperationType) +{ + EXPECT_EQ(toRedfishCollectionFunction( + "xyz.openbmc_project.Telemetry.Report.OperationType.Maximum"), + metric_report_definition::CalculationAlgorithmEnum::Maximum); + EXPECT_EQ(toRedfishCollectionFunction( + "xyz.openbmc_project.Telemetry.Report.OperationType.Minimum"), + metric_report_definition::CalculationAlgorithmEnum::Minimum); + EXPECT_EQ(toRedfishCollectionFunction( + "xyz.openbmc_project.Telemetry.Report.OperationType.Average"), + metric_report_definition::CalculationAlgorithmEnum::Average); + EXPECT_EQ( + toRedfishCollectionFunction( + "xyz.openbmc_project.Telemetry.Report.OperationType.Summation"), + metric_report_definition::CalculationAlgorithmEnum::Summation); +} + +TEST(ToRedfishCollectionFunction, UnknownOperationTypeIsInvalid) +{ + EXPECT_EQ(toRedfishCollectionFunction(""), + metric_report_definition::CalculationAlgorithmEnum::Invalid); + EXPECT_EQ(toRedfishCollectionFunction( + "xyz.openbmc_project.Telemetry.Report.OperationType.Invalid"), + metric_report_definition::CalculationAlgorithmEnum::Invalid); + EXPECT_EQ(toRedfishCollectionFunction("Maximum"), + metric_report_definition::CalculationAlgorithmEnum::Invalid); + EXPECT_EQ(toRedfishCollectionFunction( + "xyz.openbmc_project.Telemetry.Report.OperationType.maximum"), + metric_report_definition::CalculationAlgorithmEnum::Invalid); +} + +TEST(ToDbusCollectionFunction, ConvertsKnownCalculationAlgorithm) +{ + EXPECT_EQ(toDbusCollectionFunction("Maximum"), + "xyz.openbmc_project.Telemetry.Report.OperationType.Maximum"); + EXPECT_EQ(toDbusCollectionFunction("Minimum"), + "xyz.openbmc_project.Telemetry.Report.OperationType.Minimum"); + EXPECT_EQ(toDbusCollectionFunction("Average"), + "xyz.openbmc_project.Telemetry.Report.OperationType.Average"); + EXPECT_EQ(toDbusCollectionFunction("Summation"), + "xyz.openbmc_project.Telemetry.Report.OperationType.Summation"); +} + +TEST(ToDbusCollectionFunction, UnknownCalculationAlgorithmIsEmpty) +{ + EXPECT_EQ(toDbusCollectionFunction(""), ""); + EXPECT_EQ(toDbusCollectionFunction("Invalid"), ""); + EXPECT_EQ(toDbusCollectionFunction("maximum"), ""); + EXPECT_EQ(toDbusCollectionFunction( + "xyz.openbmc_project.Telemetry.Report.OperationType.Maximum"), + ""); +} + +TEST(ToRedfishCollectionFunctions, EmptyInputGivesEmptyArray) +{ + const std::vector<std::string> dbusEnums; + + std::optional<nlohmann::json::array_t> result = + toRedfishCollectionFunctions(dbusEnums); + const std::optional<nlohmann::json::array_t> expected = + nlohmann::json::array_t{}; + EXPECT_EQ(result, expected); +} + +TEST(ToRedfishCollectionFunctions, ConvertsEachKnownOperationType) +{ + const std::vector<std::string> dbusEnums{ + "xyz.openbmc_project.Telemetry.Report.OperationType.Maximum", + "xyz.openbmc_project.Telemetry.Report.OperationType.Minimum", + "xyz.openbmc_project.Telemetry.Report.OperationType.Average", + "xyz.openbmc_project.Telemetry.Report.OperationType.Summation"}; + + std::optional<nlohmann::json::array_t> result = + toRedfishCollectionFunctions(dbusEnums); + const std::optional<nlohmann::json::array_t> expected = + nlohmann::json::array_t{"Maximum", "Minimum", "Average", "Summation"}; + EXPECT_EQ(result, expected); +} + +TEST(ToRedfishCollectionFunctions, SingleUnknownValueDiscardsWholeArray) +{ + const std::vector<std::string> withBogus{ + "xyz.openbmc_project.Telemetry.Report.OperationType.Maximum", "bogus"}; + const std::vector<std::string> redfishSpelling{"Maximum"}; + const std::vector<std::string> emptyString{""}; + + EXPECT_EQ(toRedfishCollectionFunctions(withBogus), std::nullopt); + EXPECT_EQ(toRedfishCollectionFunctions(redfishSpelling), std::nullopt); + EXPECT_EQ(toRedfishCollectionFunctions(emptyString), std::nullopt); +} + +} // namespace +} // namespace redfish::telemetry |
