1*a2056e9cSWilly Tu // Copyright 2021 Google LLC
2*a2056e9cSWilly Tu //
3*a2056e9cSWilly Tu // Licensed under the Apache License, Version 2.0 (the "License");
4*a2056e9cSWilly Tu // you may not use this file except in compliance with the License.
5*a2056e9cSWilly Tu // You may obtain a copy of the License at
6*a2056e9cSWilly Tu //
7*a2056e9cSWilly Tu //      http://www.apache.org/licenses/LICENSE-2.0
8*a2056e9cSWilly Tu //
9*a2056e9cSWilly Tu // Unless required by applicable law or agreed to in writing, software
10*a2056e9cSWilly Tu // distributed under the License is distributed on an "AS IS" BASIS,
11*a2056e9cSWilly Tu // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*a2056e9cSWilly Tu // See the License for the specific language governing permissions and
13*a2056e9cSWilly Tu // limitations under the License.
14*a2056e9cSWilly Tu 
158cfa4c44Slinyuny #include "commands.hpp"
168cfa4c44Slinyuny #include "handler_mock.hpp"
178cfa4c44Slinyuny #include "host_power_off.hpp"
188cfa4c44Slinyuny 
198cfa4c44Slinyuny #include <cstdint>
208cfa4c44Slinyuny #include <cstring>
218cfa4c44Slinyuny #include <vector>
228cfa4c44Slinyuny 
238cfa4c44Slinyuny #include <gtest/gtest.h>
248cfa4c44Slinyuny 
258cfa4c44Slinyuny #define MAX_IPMI_BUFFER 64
268cfa4c44Slinyuny 
278cfa4c44Slinyuny namespace google
288cfa4c44Slinyuny {
298cfa4c44Slinyuny namespace ipmi
308cfa4c44Slinyuny {
318cfa4c44Slinyuny 
328cfa4c44Slinyuny TEST(PowerOffCommandTest, InvalidRequestLength)
338cfa4c44Slinyuny {
348cfa4c44Slinyuny     std::vector<std::uint8_t> request = {SysOEMCommands::SysHostPowerOff};
358cfa4c44Slinyuny     size_t dataLen = request.size();
368cfa4c44Slinyuny     std::uint8_t reply[MAX_IPMI_BUFFER];
378cfa4c44Slinyuny 
388cfa4c44Slinyuny     HandlerMock hMock;
398cfa4c44Slinyuny     EXPECT_EQ(IPMI_CC_REQ_DATA_LEN_INVALID,
408cfa4c44Slinyuny               hostPowerOff(request.data(), reply, &dataLen, &hMock));
418cfa4c44Slinyuny }
428cfa4c44Slinyuny 
438cfa4c44Slinyuny TEST(PowerOffCommandTest, ValidRequest)
448cfa4c44Slinyuny {
458cfa4c44Slinyuny     // Set the dealy to 15 mins
468cfa4c44Slinyuny     std::uint32_t delayValue = 0x384;
478cfa4c44Slinyuny     struct HostPowerOffRequest requestContents;
488cfa4c44Slinyuny     requestContents.subcommand = SysOEMCommands::SysHostPowerOff;
498cfa4c44Slinyuny     requestContents.delay = delayValue;
508cfa4c44Slinyuny 
518cfa4c44Slinyuny     std::vector<std::uint8_t> request(sizeof(requestContents));
528cfa4c44Slinyuny     std::memcpy(request.data(), &requestContents, sizeof(requestContents));
538cfa4c44Slinyuny     size_t dataLen = request.size();
548cfa4c44Slinyuny     std::uint8_t reply[MAX_IPMI_BUFFER];
558cfa4c44Slinyuny 
568cfa4c44Slinyuny     HandlerMock hMock;
578cfa4c44Slinyuny     EXPECT_CALL(hMock, hostPowerOffDelay(delayValue));
588cfa4c44Slinyuny     EXPECT_EQ(IPMI_CC_OK,
598cfa4c44Slinyuny               hostPowerOff(request.data(), reply, &dataLen, &hMock));
608cfa4c44Slinyuny }
618cfa4c44Slinyuny 
628cfa4c44Slinyuny } // namespace ipmi
638cfa4c44Slinyuny } // namespace google
64