1 #include "pldmd/invoker.hpp"
2 
3 #include <libpldm/base.h>
4 
5 #include <stdexcept>
6 
7 #include <gtest/gtest.h>
8 
9 using namespace pldm;
10 using namespace pldm::responder;
11 constexpr Command testCmd = 0xFF;
12 constexpr Type testType = 0xFF;
13 constexpr pldm_tid_t tid = 0;
14 
15 class TestHandler : public CmdHandler
16 {
17   public:
18     TestHandler()
19     {
20         handlers.emplace(testCmd, [this](uint8_t tid, const pldm_msg* request,
21                                          size_t payloadLength) {
22             return this->handle(tid, request, payloadLength);
23         });
24     }
25 
26     Response handle(uint8_t /*tid*/, const pldm_msg* /*request*/,
27                     size_t /*payloadLength*/)
28     {
29         return {100, 200};
30     }
31 };
32 
33 TEST(CcOnlyResponse, testEncode)
34 {
35     std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr));
36     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
37     encode_get_types_req(0, request);
38 
39     auto responseMsg = CmdHandler::ccOnlyResponse(request, PLDM_ERROR);
40     std::vector<uint8_t> expectMsg = {0, 0, 4, 1};
41     EXPECT_EQ(responseMsg, expectMsg);
42 }
43 
44 TEST(Registration, testSuccess)
45 {
46     Invoker invoker{};
47     invoker.registerHandler(testType, std::make_unique<TestHandler>());
48     auto result = invoker.handle(tid, testType, testCmd, nullptr, 0);
49     ASSERT_EQ(result[0], 100);
50     ASSERT_EQ(result[1], 200);
51 }
52 
53 TEST(Registration, testFailure)
54 {
55     Invoker invoker{};
56     ASSERT_THROW(invoker.handle(tid, testType, testCmd, nullptr, 0),
57                  std::out_of_range);
58     invoker.registerHandler(testType, std::make_unique<TestHandler>());
59     uint8_t badCmd = 0xFE;
60     ASSERT_THROW(invoker.handle(tid, testType, badCmd, nullptr, 0),
61                  std::out_of_range);
62 }
63