1 #include "async_resp.hpp"
2 #include "generated/enums/resource.hpp"
3 #include "http_response.hpp"
4 #include "systems.hpp"
5 
6 #include <boost/asio/error.hpp>
7 #include <boost/beast/http/status.hpp>
8 #include <boost/system/linux_error.hpp>
9 #include <nlohmann/json.hpp>
10 
11 #include <memory>
12 #include <string>
13 #include <utility>
14 #include <vector>
15 
16 #include <gtest/gtest.h>
17 
18 namespace redfish
19 {
20 namespace
21 {
22 
23 TEST(GetAllowedHostTransition, UnexpectedError)
24 {
25     auto response = std::make_shared<bmcweb::AsyncResp>();
26     boost::system::error_code ec = boost::asio::error::invalid_argument;
27     std::vector<std::string> allowedHostTransitions;
28 
29     afterGetAllowedHostTransitions(response, ec, allowedHostTransitions);
30 
31     EXPECT_EQ(response->res.result(),
32               boost::beast::http::status::internal_server_error);
33 }
34 
35 TEST(GetAllowedHostTransition, NoPropOnDbus)
36 {
37     auto response = std::make_shared<bmcweb::AsyncResp>();
38     boost::system::error_code ec =
39         boost::system::linux_error::bad_request_descriptor;
40     std::vector<std::string> allowedHostTransitions;
41 
42     afterGetAllowedHostTransitions(response, ec, allowedHostTransitions);
43 
44     nlohmann::json::array_t parameters;
45     nlohmann::json::object_t parameter;
46     parameter["Name"] = "ResetType";
47     parameter["Required"] = true;
48     parameter["DataType"] = "String";
49     nlohmann::json::array_t allowed;
50     allowed.emplace_back(resource::ResetType::ForceOff);
51     allowed.emplace_back(resource::ResetType::PowerCycle);
52     allowed.emplace_back(resource::ResetType::Nmi);
53     allowed.emplace_back(resource::ResetType::On);
54     allowed.emplace_back(resource::ResetType::ForceOn);
55     allowed.emplace_back(resource::ResetType::ForceRestart);
56     allowed.emplace_back(resource::ResetType::GracefulRestart);
57     allowed.emplace_back(resource::ResetType::GracefulShutdown);
58     parameter["AllowableValues"] = std::move(allowed);
59     parameters.emplace_back(std::move(parameter));
60 
61     EXPECT_EQ(response->res.jsonValue["Parameters"], parameters);
62 }
63 
64 TEST(GetAllowedHostTransition, NoForceRestart)
65 {
66     auto response = std::make_shared<bmcweb::AsyncResp>();
67     boost::system::error_code ec;
68 
69     std::vector<std::string> allowedHostTransitions = {
70         "xyz.openbmc_project.State.Host.Transition.On",
71         "xyz.openbmc_project.State.Host.Transition.Off",
72         "xyz.openbmc_project.State.Host.Transition.GracefulWarmReboot",
73     };
74 
75     afterGetAllowedHostTransitions(response, ec, allowedHostTransitions);
76 
77     nlohmann::json::array_t parameters;
78     nlohmann::json::object_t parameter;
79     parameter["Name"] = "ResetType";
80     parameter["Required"] = true;
81     parameter["DataType"] = "String";
82     nlohmann::json::array_t allowed;
83     allowed.emplace_back(resource::ResetType::ForceOff);
84     allowed.emplace_back(resource::ResetType::PowerCycle);
85     allowed.emplace_back(resource::ResetType::Nmi);
86     allowed.emplace_back(resource::ResetType::On);
87     allowed.emplace_back(resource::ResetType::ForceOn);
88     allowed.emplace_back(resource::ResetType::GracefulShutdown);
89     allowed.emplace_back(resource::ResetType::GracefulRestart);
90     parameter["AllowableValues"] = std::move(allowed);
91     parameters.emplace_back(std::move(parameter));
92 
93     EXPECT_EQ(response->res.jsonValue["Parameters"], parameters);
94 }
95 
96 TEST(GetAllowedHostTransition, AllSupported)
97 {
98     auto response = std::make_shared<bmcweb::AsyncResp>();
99     boost::system::error_code ec;
100 
101     std::vector<std::string> allowedHostTransitions = {
102         "xyz.openbmc_project.State.Host.Transition.On",
103         "xyz.openbmc_project.State.Host.Transition.Off",
104         "xyz.openbmc_project.State.Host.Transition.GracefulWarmReboot",
105         "xyz.openbmc_project.State.Host.Transition.ForceWarmReboot",
106     };
107 
108     afterGetAllowedHostTransitions(response, ec, allowedHostTransitions);
109 
110     nlohmann::json::array_t parameters;
111     nlohmann::json::object_t parameter;
112     parameter["Name"] = "ResetType";
113     parameter["Required"] = true;
114     parameter["DataType"] = "String";
115     nlohmann::json::array_t allowed;
116     allowed.emplace_back(resource::ResetType::ForceOff);
117     allowed.emplace_back(resource::ResetType::PowerCycle);
118     allowed.emplace_back(resource::ResetType::Nmi);
119     allowed.emplace_back(resource::ResetType::On);
120     allowed.emplace_back(resource::ResetType::ForceOn);
121     allowed.emplace_back(resource::ResetType::GracefulShutdown);
122     allowed.emplace_back(resource::ResetType::GracefulRestart);
123     allowed.emplace_back(resource::ResetType::ForceRestart);
124     parameter["AllowableValues"] = std::move(allowed);
125     parameters.emplace_back(std::move(parameter));
126 
127     EXPECT_EQ(response->res.jsonValue["Parameters"], parameters);
128 }
129 
130 } // namespace
131 } // namespace redfish
132