summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorCarson Labrado <clabrado@google.com>2023-02-14 02:54:59 +0300
committerEd Tanous <ed@tanous.net>2023-05-02 20:30:16 +0300
commit46b302837c3c44376da3ba6b72fb70b7b2ce1c11 (patch)
treea399a734e93f0b93cccc9a3777042a24f9965b7e /test
parentdf7f12f0d4111a4646d5cad261473894676df132 (diff)
downloadbmcweb-46b302837c3c44376da3ba6b72fb70b7b2ce1c11.tar.xz
Aggregation: Process subordinate top collections
Adds a function to process responses from URIs that are uptree from a top level collection. A follow-up patch will hook this into the aggregation code to allow adding links to top level collections which are only supported by satellite BMCs. Adds test cases to validate this function is working correctly. Tested: New test cases pass Signed-off-by: Carson Labrado <clabrado@google.com> Change-Id: I7f0fd6c3955398e2fde136c1d3b37a6bf4bf06b9
Diffstat (limited to 'test')
-rw-r--r--test/redfish-core/include/redfish_aggregator_test.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/test/redfish-core/include/redfish_aggregator_test.cpp b/test/redfish-core/include/redfish_aggregator_test.cpp
index da3209ab9b..2d19cee705 100644
--- a/test/redfish-core/include/redfish_aggregator_test.cpp
+++ b/test/redfish-core/include/redfish_aggregator_test.cpp
@@ -647,5 +647,162 @@ TEST(searchCollectionsArray, collectionOrContainsURIs)
EXPECT_FALSE(isCollOrCon("/redfish/v1/UpdateService/SoftwareInventory2"));
}
+TEST(processContainsSubordinateResponse, addLinks)
+{
+ crow::Response resp;
+ resp.result(200);
+ nlohmann::json jsonValue;
+ resp.addHeader("Content-Type", "application/json");
+ jsonValue["@odata.id"] = "/redfish/v1";
+ jsonValue["Fabrics"]["@odata.id"] = "/redfish/v1/Fabrics";
+ jsonValue["Test"]["@odata.id"] = "/redfish/v1/Test";
+ jsonValue["TelemetryService"]["@odata.id"] = "/redfish/v1/TelemetryService";
+ jsonValue["UpdateService"]["@odata.id"] = "/redfish/v1/UpdateService";
+ resp.body() =
+ jsonValue.dump(2, ' ', true, nlohmann::json::error_handler_t::replace);
+
+ auto asyncResp = std::make_shared<bmcweb::AsyncResp>();
+ asyncResp->res.result(200);
+ asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1";
+ asyncResp->res.jsonValue["Chassis"]["@odata.id"] = "/redfish/v1/Chassis";
+
+ RedfishAggregator::processContainsSubordinateResponse("prefix", asyncResp,
+ resp);
+ EXPECT_EQ(asyncResp->res.jsonValue["Chassis"]["@odata.id"],
+ "/redfish/v1/Chassis");
+ EXPECT_EQ(asyncResp->res.jsonValue["Fabrics"]["@odata.id"],
+ "/redfish/v1/Fabrics");
+ EXPECT_EQ(asyncResp->res.jsonValue["TelemetryService"]["@odata.id"],
+ "/redfish/v1/TelemetryService");
+ EXPECT_EQ(asyncResp->res.jsonValue["UpdateService"]["@odata.id"],
+ "/redfish/v1/UpdateService");
+ EXPECT_FALSE(asyncResp->res.jsonValue.contains("Test"));
+}
+
+TEST(processContainsSubordinateResponse, localNotOK)
+{
+ auto asyncResp = std::make_shared<bmcweb::AsyncResp>();
+ asyncResp->res.addHeader("Content-Type", "application/json");
+ messages::resourceNotFound(asyncResp->res, "", "");
+
+ // This field was added by resourceNotFound()
+ // Sanity test to make sure it gets removed later
+ EXPECT_TRUE(asyncResp->res.jsonValue.contains("error"));
+
+ crow::Response resp;
+ resp.result(200);
+ nlohmann::json jsonValue;
+ resp.addHeader("Content-Type", "application/json");
+ jsonValue["@odata.id"] = "/redfish/v1";
+ jsonValue["@odata.type"] = "#ServiceRoot.v1_11_0.ServiceRoot";
+ jsonValue["Id"] = "RootService";
+ jsonValue["Name"] = "Root Service";
+ jsonValue["Fabrics"]["@odata.id"] = "/redfish/v1/Fabrics";
+ jsonValue["Test"]["@odata.id"] = "/redfish/v1/Test";
+ jsonValue["TelemetryService"]["@odata.id"] = "/redfish/v1/TelemetryService";
+ jsonValue["UpdateService"]["@odata.id"] = "/redfish/v1/UpdateService";
+ resp.body() =
+ jsonValue.dump(2, ' ', true, nlohmann::json::error_handler_t::replace);
+
+ RedfishAggregator::processContainsSubordinateResponse("prefix", asyncResp,
+ resp);
+
+ // Most of the response should get copied over since asyncResp is a 404
+ EXPECT_EQ(asyncResp->res.resultInt(), 200);
+ EXPECT_EQ(asyncResp->res.jsonValue["@odata.id"], "/redfish/v1");
+ EXPECT_EQ(asyncResp->res.jsonValue["@odata.type"],
+ "#ServiceRoot.v1_11_0.ServiceRoot");
+ EXPECT_EQ(asyncResp->res.jsonValue["Id"], "RootService");
+ EXPECT_EQ(asyncResp->res.jsonValue["Name"], "Root Service");
+
+ EXPECT_EQ(asyncResp->res.jsonValue["Fabrics"]["@odata.id"],
+ "/redfish/v1/Fabrics");
+ EXPECT_EQ(asyncResp->res.jsonValue["TelemetryService"]["@odata.id"],
+ "/redfish/v1/TelemetryService");
+ EXPECT_EQ(asyncResp->res.jsonValue["UpdateService"]["@odata.id"],
+ "/redfish/v1/UpdateService");
+ EXPECT_FALSE(asyncResp->res.jsonValue.contains("Test"));
+ EXPECT_FALSE(asyncResp->res.jsonValue.contains("error"));
+
+ // Test for local response being partially populated before throwing error
+ asyncResp = std::make_shared<bmcweb::AsyncResp>();
+ asyncResp->res.addHeader("Content-Type", "application/json");
+ asyncResp->res.jsonValue["Chassis"]["@odata.id"] = "/redfish/v1/Chassis";
+ asyncResp->res.jsonValue["Fake"]["@odata.id"] = "/redfish/v1/Fake";
+ messages::internalError(asyncResp->res);
+
+ RedfishAggregator::processContainsSubordinateResponse("prefix", asyncResp,
+ resp);
+
+ // These should also be copied over since asyncResp is a 500
+ EXPECT_EQ(asyncResp->res.resultInt(), 200);
+ EXPECT_EQ(asyncResp->res.jsonValue["@odata.id"], "/redfish/v1");
+ EXPECT_EQ(asyncResp->res.jsonValue["@odata.type"],
+ "#ServiceRoot.v1_11_0.ServiceRoot");
+ EXPECT_EQ(asyncResp->res.jsonValue["Id"], "RootService");
+ EXPECT_EQ(asyncResp->res.jsonValue["Name"], "Root Service");
+
+ EXPECT_EQ(asyncResp->res.jsonValue["Fabrics"]["@odata.id"],
+ "/redfish/v1/Fabrics");
+ EXPECT_EQ(asyncResp->res.jsonValue["TelemetryService"]["@odata.id"],
+ "/redfish/v1/TelemetryService");
+ EXPECT_EQ(asyncResp->res.jsonValue["UpdateService"]["@odata.id"],
+ "/redfish/v1/UpdateService");
+ EXPECT_FALSE(asyncResp->res.jsonValue.contains("Test"));
+ EXPECT_FALSE(asyncResp->res.jsonValue.contains("error"));
+
+ // These fields should still be present
+ EXPECT_EQ(asyncResp->res.jsonValue["Chassis"]["@odata.id"],
+ "/redfish/v1/Chassis");
+ EXPECT_EQ(asyncResp->res.jsonValue["Fake"]["@odata.id"],
+ "/redfish/v1/Fake");
+}
+
+TEST(processContainsSubordinateResponse, noValidLinks)
+{
+ auto asyncResp = std::make_shared<bmcweb::AsyncResp>();
+ asyncResp->res.result(500);
+ asyncResp->res.jsonValue["Chassis"]["@odata.id"] = "/redfish/v1/Chassis";
+
+ crow::Response resp;
+ resp.result(200);
+ nlohmann::json jsonValue;
+ resp.addHeader("Content-Type", "application/json");
+ jsonValue["@odata.id"] = "/redfish/v1";
+ resp.body() =
+ jsonValue.dump(2, ' ', true, nlohmann::json::error_handler_t::replace);
+
+ RedfishAggregator::processContainsSubordinateResponse("prefix", asyncResp,
+ resp);
+
+ // We won't add any links from response so asyncResp shouldn't change
+ EXPECT_EQ(asyncResp->res.resultInt(), 500);
+ EXPECT_EQ(asyncResp->res.jsonValue["Chassis"]["@odata.id"],
+ "/redfish/v1/Chassis");
+ EXPECT_FALSE(asyncResp->res.jsonValue.contains("@odata.id"));
+
+ // Sat response is non-500 so it shouldn't get copied over
+ asyncResp->res.result(200);
+ resp.result(500);
+ jsonValue["Fabrics"]["@odata.id"] = "/redfish/v1/Fabrics";
+ jsonValue["Test"]["@odata.id"] = "/redfish/v1/Test";
+ jsonValue["TelemetryService"]["@odata.id"] = "/redfish/v1/TelemetryService";
+ jsonValue["UpdateService"]["@odata.id"] = "/redfish/v1/UpdateService";
+ resp.body() =
+ jsonValue.dump(2, ' ', true, nlohmann::json::error_handler_t::replace);
+
+ RedfishAggregator::processContainsSubordinateResponse("prefix", asyncResp,
+ resp);
+
+ EXPECT_EQ(asyncResp->res.resultInt(), 200);
+ EXPECT_EQ(asyncResp->res.jsonValue["Chassis"]["@odata.id"],
+ "/redfish/v1/Chassis");
+ EXPECT_FALSE(asyncResp->res.jsonValue.contains("@odata.id"));
+ EXPECT_FALSE(asyncResp->res.jsonValue.contains("Fabrics"));
+ EXPECT_FALSE(asyncResp->res.jsonValue.contains("Test"));
+ EXPECT_FALSE(asyncResp->res.jsonValue.contains("TelemetryService"));
+ EXPECT_FALSE(asyncResp->res.jsonValue.contains("UpdateService"));
+}
+
} // namespace
} // namespace redfish