blob: 6de2f04f5454a220ede69dda359360bf546206f3 [file] [log] [blame]
#include "app.hpp"
#include "async_resp.hpp"
#include "chassis.hpp"
#include "http_request.hpp"
#include "http_response.hpp"
#include "snapshot_fixture.hpp"
#include "test/g3/mock_managed_store_test.hpp"
#include <boost/beast/core/string_type.hpp>
#include <boost/beast/http/message.hpp>
#include <nlohmann/json.hpp>
#include <system_error>
#include <unordered_set>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
namespace redfish
{
namespace
{
using ::testing::Contains;
using ::testing::NotNull;
constexpr std::string fakeChassis = "fakeChassis";
TEST(HandleChassisResetActionInfoGet, StaticAttributesAreExpected)
{
auto response = std::make_shared<bmcweb::AsyncResp>();
std::error_code err;
validateChassisResetActionInfoHandler(response, fakeChassis, err, "RackMount");
nlohmann::json& json = response->res.jsonValue;
EXPECT_EQ(json["@odata.type"], "#ActionInfo.v1_1_2.ActionInfo");
EXPECT_EQ(json["@odata.id"],
"/redfish/v1/Chassis/" + fakeChassis + "/ResetActionInfo");
EXPECT_EQ(json["Name"], "Reset Action Info");
EXPECT_EQ(json["Id"], "ResetActionInfo");
nlohmann::json::array_t parameters;
nlohmann::json::object_t delayParameter;
delayParameter["Name"] = "Delay";
delayParameter["Required"] = false;
delayParameter["DataType"] = "Number";
nlohmann::json::object_t parameter;
parameter["Name"] = "ResetType";
parameter["Required"] = true;
parameter["DataType"] = "String";
nlohmann::json::array_t allowed;
allowed.push_back("PowerCycle");
parameter["AllowableValues"] = std::move(allowed);
parameters.push_back(std::move(parameter));
parameters.push_back(std::move(delayParameter));
EXPECT_EQ(json["Parameters"], parameters);
}
TEST_F(SnapshotFixture, ChassisTypeTestReturnsCorrectResponse)
{
auto response = std::make_shared<bmcweb::AsyncResp>();
nlohmann::json& json = response->res.jsonValue;
json["ChassisType"] = "RackMount";
addChassisReset(response, fakeChassis, "UnsupportedType");
RunIoUntilDone();
EXPECT_EQ(json["ChassisType"], "UnsupportedType");
}
TEST_F(SnapshotFixture, GetChassisCollectionTestReturnsCorrectResposne){
handleChassisCollectionGet(app_, CreateRequest(), share_async_resp_);
RunIoUntilDone();
nlohmann::json& json = share_async_resp_->res.jsonValue;
EXPECT_EQ(json["@odata.id"], "/redfish/v1/Chassis");
EXPECT_EQ(json["@odata.type"], "#ChassisCollection.ChassisCollection");
EXPECT_EQ(json["Name"], "Chassis Collection");
EXPECT_EQ(json["Members@odata.count"], json["Members"].size());
std::unordered_set<std::string> chassis_set{{
"/redfish/v1/Chassis/Bigchassis2_1",
"/redfish/v1/Chassis/chassis1V2ND",
"/redfish/v1/Chassis/chassis3_1",
"/redfish/v1/Chassis/chassis4_1",
"/redfish/v1/Chassis/coin_battery",
"/redfish/v1/Chassis/i2cool_0",
"/redfish/v1/Chassis/i2cool_1",
"/redfish/v1/Chassis/i2cool_2",
"/redfish/v1/Chassis/ioadapter_x16_1",
"/redfish/v1/Chassis/platform1"
}};
EXPECT_EQ(json["Members"].size(), chassis_set.size());
for (const auto& member : json["Members"])
{
ASSERT_TRUE(member.contains("@odata.id"));
const std::string* chassis = member["@odata.id"].get_ptr<const std::string*>();
ASSERT_THAT(chassis, NotNull());
EXPECT_THAT(chassis_set, Contains(*chassis));
}
EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);
}
TEST_F(SnapshotFixture, GetChassisTestReturnsCorrectResposne){
handleChassisGet(app_, CreateRequest(), share_async_resp_, "platform1");
RunIoUntilDone();
nlohmann::json& json = share_async_resp_->res.jsonValue;
EXPECT_EQ(json["@odata.id"], "/redfish/v1/Chassis/platform1");
EXPECT_EQ(json["@odata.type"], "#Chassis.v1_17_0.Chassis");
EXPECT_EQ(json["Actions"]["#Chassis.Reset"]["@Redfish.ActionInfo"], "/redfish/v1/Chassis/platform1/ResetActionInfo");
EXPECT_EQ(json["Actions"]["#Chassis.Reset"]["target"], "/redfish/v1/Chassis/platform1/Actions/Chassis.Reset");
EXPECT_EQ(json["Assembly"]["@odata.id"], "/redfish/v1/Chassis/platform1/Assembly");
EXPECT_EQ(json["Certificates"]["@odata.id"], "/redfish/v1/Chassis/platform1/Certificates");
EXPECT_EQ(json["ChassisType"], "RackMount");
EXPECT_EQ(json["Drives"]["@odata.id"], "/redfish/v1/Chassis/platform1/Drives");
EXPECT_EQ(json["EnvironmentMetrics"]["@odata.id"], "/redfish/v1/Chassis/platform1/EnvironmentMetrics");
EXPECT_EQ(json["Id"], "platform1");
EXPECT_EQ(json["Links"]["Cables"].size(), json["Links"]["Cables@odata.count"]);
EXPECT_EQ(json["Links"]["Cables"][0]["@odata.id"], "/redfish/v1/Cables/NcsiCable");
EXPECT_EQ(json["Links"]["ComputerSystems"].size(), 1);
EXPECT_EQ(json["Links"]["ComputerSystems"][0]["@odata.id"], "/redfish/v1/Systems/system");
EXPECT_EQ(json["Links"]["ManagedBy"].size(), 1);
EXPECT_EQ(json["Links"]["ManagedBy"][0]["@odata.id"], "/redfish/v1/Managers/bmc");
EXPECT_EQ(json["Links"]["Processors"].size(), json["Links"]["Processors@odata.count"]);
EXPECT_EQ(json["Links"]["Processors"][0]["@odata.id"], "/redfish/v1/Systems/system/Processors/cpu0");
EXPECT_EQ(json["Links"]["Processors"][1]["@odata.id"], "/redfish/v1/Systems/system/Processors/cpu1");
EXPECT_EQ(json["Manufacturer"], "Manufacturer");
EXPECT_EQ(json["Memory"]["@odata.id"], "/redfish/v1/Systems/system/Memory");
EXPECT_EQ(json["Model"], "Model");
EXPECT_EQ(json["Name"], "platform1");
EXPECT_EQ(json["PCIeDevices"]["@odata.id"], "/redfish/v1/Systems/system/PCIeDevices");
EXPECT_EQ(json["PCIeSlots"]["@odata.id"], "/redfish/v1/Chassis/platform1/PCIeSlots");
EXPECT_EQ(json["PartNumber"], "PartNumber");
EXPECT_EQ(json["Power"]["@odata.id"], "/redfish/v1/Chassis/platform1/Power");
EXPECT_EQ(json["PowerSubsystem"]["@odata.id"], "/redfish/v1/Chassis/platform1/PowerSubsystem");
EXPECT_EQ(json["Sensors"]["@odata.id"], "/redfish/v1/Chassis/platform1/Sensors");
EXPECT_EQ(json["SerialNumber"], "SerialNumber");
EXPECT_EQ(json["Status"]["State"], "Enabled");
EXPECT_EQ(json["Thermal"]["@odata.id"], "/redfish/v1/Chassis/platform1/Thermal");
EXPECT_EQ(json["ThermalSubsystem"]["@odata.id"], "/redfish/v1/Chassis/platform1/ThermalSubsystem");
EXPECT_EQ(json["TrustedComponents"]["@odata.id"], "/redfish/v1/Chassis/platform1/TrustedComponents");
EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);
}
TEST_F(SnapshotFixture, PostChassisCycleDelayGood){
handleChassisResetActionInfoPost(app_, CreateRequest("{\"ResetType\":\"PowerCycle\", \"Delay\":1} "), share_async_resp_, "platform1");
RunIoUntilDone();
EXPECT_EQ(share_async_resp_->res.result(),boost::beast::http::status::ok);
EXPECT_EQ(share_async_resp_->res.jsonValue["ResetString"],
"systemd-run --on-active=1 --timer-property=AccuracySec=100ms -- systemctl start gbmc-psu-hardreset.target");
}
TEST_F(SnapshotFixture, PostChassisCycleDelayBadResetType){
handleChassisResetActionInfoPost(app_, CreateRequest("{\"ResetType\":\"PleaseReset\", \"Delay\":1} "), share_async_resp_, "platform1");
RunIoUntilDone();
EXPECT_EQ(share_async_resp_->res.result(),boost::beast::http::status::bad_request);
}
TEST_F(SnapshotFixture, PostChassisCycleDelayBadTime){
handleChassisResetActionInfoPost(app_, CreateRequest("{\"ResetType\":\"PowerCycle\", \"Delay\":3601} "), share_async_resp_, "platform1");
RunIoUntilDone();
EXPECT_EQ(share_async_resp_->res.result(),boost::beast::http::status::bad_request);
}
TEST_F(SnapshotFixture, PostChassisCycleInvalidParam){
handleChassisResetActionInfoPost(app_, CreateRequest("{\"ResetType\":\"PowerCycle\", \"UnknownParm_foo\":30} "), share_async_resp_, "platform1");
RunIoUntilDone();
EXPECT_EQ(share_async_resp_->res.result(),boost::beast::http::status::bad_request);
}
} // namespace
} // namespace redfish