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 14 class TestHandler : public CmdHandler 15 { 16 public: 17 TestHandler() 18 { 19 handlers.emplace(testCmd, 20 [this](const pldm_msg* request, size_t payloadLength) { 21 return this->handle(request, payloadLength); 22 }); 23 } 24 25 Response handle(const pldm_msg* /*request*/, size_t /*payloadLength*/) 26 { 27 return {100, 200}; 28 } 29 }; 30 31 TEST(CcOnlyResponse, testEncode) 32 { 33 std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr)); 34 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data()); 35 encode_get_types_req(0, request); 36 37 auto responseMsg = CmdHandler::ccOnlyResponse(request, PLDM_ERROR); 38 std::vector<uint8_t> expectMsg = {0, 0, 4, 1}; 39 EXPECT_EQ(responseMsg, expectMsg); 40 } 41 42 TEST(Registration, testSuccess) 43 { 44 Invoker invoker{}; 45 invoker.registerHandler(testType, std::make_unique<TestHandler>()); 46 auto result = invoker.handle(testType, testCmd, nullptr, 0); 47 ASSERT_EQ(result[0], 100); 48 ASSERT_EQ(result[1], 200); 49 } 50 51 TEST(Registration, testFailure) 52 { 53 Invoker invoker{}; 54 ASSERT_THROW(invoker.handle(testType, testCmd, nullptr, 0), 55 std::out_of_range); 56 invoker.registerHandler(testType, std::make_unique<TestHandler>()); 57 uint8_t badCmd = 0xFE; 58 ASSERT_THROW(invoker.handle(testType, badCmd, nullptr, 0), 59 std::out_of_range); 60 } 61