1*6c71b0f9SWilly Tu // Copyright 2022 Google LLC
2*6c71b0f9SWilly Tu //
3*6c71b0f9SWilly Tu // Licensed under the Apache License, Version 2.0 (the "License");
4*6c71b0f9SWilly Tu // you may not use this file except in compliance with the License.
5*6c71b0f9SWilly Tu // You may obtain a copy of the License at
6*6c71b0f9SWilly Tu //
7*6c71b0f9SWilly Tu //      http://www.apache.org/licenses/LICENSE-2.0
8*6c71b0f9SWilly Tu //
9*6c71b0f9SWilly Tu // Unless required by applicable law or agreed to in writing, software
10*6c71b0f9SWilly Tu // distributed under the License is distributed on an "AS IS" BASIS,
11*6c71b0f9SWilly Tu // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6c71b0f9SWilly Tu // See the License for the specific language governing permissions and
13*6c71b0f9SWilly Tu // limitations under the License.
14*6c71b0f9SWilly Tu 
15*6c71b0f9SWilly Tu #include "commands.hpp"
16*6c71b0f9SWilly Tu #include "handler_mock.hpp"
17*6c71b0f9SWilly Tu #include "helper.hpp"
18*6c71b0f9SWilly Tu #include "pcie_bifurcation.hpp"
19*6c71b0f9SWilly Tu 
20*6c71b0f9SWilly Tu #include <vector>
21*6c71b0f9SWilly Tu 
22*6c71b0f9SWilly Tu #include <gtest/gtest.h>
23*6c71b0f9SWilly Tu 
24*6c71b0f9SWilly Tu using ::testing::Return;
25*6c71b0f9SWilly Tu 
26*6c71b0f9SWilly Tu namespace google
27*6c71b0f9SWilly Tu {
28*6c71b0f9SWilly Tu namespace ipmi
29*6c71b0f9SWilly Tu {
30*6c71b0f9SWilly Tu 
31*6c71b0f9SWilly Tu using testing::_;
32*6c71b0f9SWilly Tu using ::testing::ContainerEq;
33*6c71b0f9SWilly Tu 
TEST(PcieBifurcationCommandTest,InvalidRequest)34*6c71b0f9SWilly Tu TEST(PcieBifurcationCommandTest, InvalidRequest)
35*6c71b0f9SWilly Tu {
36*6c71b0f9SWilly Tu     std::vector<uint8_t> request = {};
37*6c71b0f9SWilly Tu 
38*6c71b0f9SWilly Tu     HandlerMock hMock;
39*6c71b0f9SWilly Tu     EXPECT_EQ(::ipmi::responseReqDataLenInvalid(),
40*6c71b0f9SWilly Tu               pcieBifurcation(request, &hMock));
41*6c71b0f9SWilly Tu }
42*6c71b0f9SWilly Tu 
TEST(PcieBifurcationCommandTest,ValidRequest)43*6c71b0f9SWilly Tu TEST(PcieBifurcationCommandTest, ValidRequest)
44*6c71b0f9SWilly Tu {
45*6c71b0f9SWilly Tu     std::vector<uint8_t> request = {5};
46*6c71b0f9SWilly Tu     std::vector<uint8_t> expectedOutput = {4, 8, 1, 2};
47*6c71b0f9SWilly Tu 
48*6c71b0f9SWilly Tu     HandlerMock hMock;
49*6c71b0f9SWilly Tu     EXPECT_CALL(hMock, pcieBifurcation(5)).WillOnce(Return(expectedOutput));
50*6c71b0f9SWilly Tu 
51*6c71b0f9SWilly Tu     auto reply = pcieBifurcation(request, &hMock);
52*6c71b0f9SWilly Tu     auto result = ValidateReply(reply);
53*6c71b0f9SWilly Tu     auto& data = result.second;
54*6c71b0f9SWilly Tu 
55*6c71b0f9SWilly Tu     EXPECT_EQ(sizeof(struct PcieBifurcationReply) + expectedOutput.size(),
56*6c71b0f9SWilly Tu               data.size());
57*6c71b0f9SWilly Tu     EXPECT_EQ(SysOEMCommands::SysPCIeSlotBifurcation, result.first);
58*6c71b0f9SWilly Tu     EXPECT_THAT(std::vector<uint8_t>(data.begin() + 1, data.end()),
59*6c71b0f9SWilly Tu                 ContainerEq(expectedOutput));
60*6c71b0f9SWilly Tu }
61*6c71b0f9SWilly Tu 
TEST(PcieBifurcationCommandTest,ReplyExceddedMaxValue)62*6c71b0f9SWilly Tu TEST(PcieBifurcationCommandTest, ReplyExceddedMaxValue)
63*6c71b0f9SWilly Tu {
64*6c71b0f9SWilly Tu     std::vector<uint8_t> request = {5};
65*6c71b0f9SWilly Tu     std::vector<uint8_t> expectedOutput(64, 1);
66*6c71b0f9SWilly Tu 
67*6c71b0f9SWilly Tu     HandlerMock hMock;
68*6c71b0f9SWilly Tu     EXPECT_CALL(hMock, pcieBifurcation(5)).WillOnce(Return(expectedOutput));
69*6c71b0f9SWilly Tu     EXPECT_EQ(::ipmi::responseInvalidCommand(),
70*6c71b0f9SWilly Tu               pcieBifurcation(request, &hMock));
71*6c71b0f9SWilly Tu }
72*6c71b0f9SWilly Tu 
73*6c71b0f9SWilly Tu } // namespace ipmi
74*6c71b0f9SWilly Tu } // namespace google
75