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