1 #pragma once 2 3 #include "modbus/modbus_message.hpp" 4 5 #include <sdbusplus/async.hpp> 6 7 using MessageBase = phosphor::modbus::rtu::Message; 8 9 namespace phosphor::modbus::test 10 { 11 12 class MessageIntf : public MessageBase 13 { 14 friend class ServerTester; 15 }; 16 17 // Read Holding Registers Testing Constants 18 static constexpr uint8_t testDeviceAddress = 0xa; 19 constexpr uint16_t testSuccessReadHoldingRegisterOffset = 0x0102; 20 constexpr uint16_t testSuccessReadHoldingRegisterCount = 0x2; 21 constexpr uint16_t testSuccessReadHoldingRegisterSegmentedOffset = 0x0103; 22 const std::vector<uint16_t> testSuccessReadHoldingRegisterResponse = { 23 0x1234, 0x5678}; 24 constexpr uint16_t testFailureReadHoldingRegister = 0x0105; 25 26 // Device Inventory Testing Constants 27 constexpr uint16_t testReadHoldingRegisterModelOffset = 0x0112; 28 constexpr uint16_t testReadHoldingRegisterModelCount = 0x8; 29 const std::vector<uint16_t> testReadHoldingRegisterModel = { 30 0x5244, 0x4630, 0x3430, 0x4453, 0x5335, 0x3139, 0x0000, 0x3000}; 31 constexpr std::string testReadHoldingRegisterModelStr = "RDF040DSS519"; 32 33 // Device Sensors Testing Constants 34 constexpr uint16_t testReadHoldingRegisterTempCount = 0x1; 35 constexpr uint16_t testReadHoldingRegisterTempUnsignedOffset = 0x0113; 36 const std::vector<uint16_t> testReadHoldingRegisterTempUnsigned = { 37 0x0050}; // 80.0 38 constexpr uint16_t testReadHoldingRegisterTempSignedOffset = 0x0114; 39 const std::vector<uint16_t> testReadHoldingRegisterTempSigned = { 40 0xFFB0}; // -80.0 41 42 // Device Firmware Testing Constants 43 constexpr uint16_t testReadHoldingRegisterFirmwareVersionOffset = 0x0115; 44 constexpr uint16_t testReadHoldingRegisterFirmwareVersionCount = 0x2; 45 const std::vector<uint16_t> testReadHoldingRegisterFirmwareVersion = { 46 0x5244, 0x4630}; 47 constexpr std::string testReadHoldingRegisterFirmwareVersionStr = "RDF0"; 48 49 // Device Event Testing Constants 50 constexpr uint16_t testReadHoldingRegisterEventCount = 0x1; 51 constexpr uint16_t testReadHoldingRegisterEventOffset = 0x0116; 52 const std::vector<uint16_t> testReadHoldingRegisterEvent = { 53 0x0001}; // Event is enabled 54 55 static const std::map<uint16_t, std::tuple<uint16_t, std::vector<uint16_t>>> 56 testReadHoldingRegisterMap = { 57 {testSuccessReadHoldingRegisterOffset, 58 {testSuccessReadHoldingRegisterCount, 59 testSuccessReadHoldingRegisterResponse}}, 60 {testSuccessReadHoldingRegisterSegmentedOffset, 61 {testSuccessReadHoldingRegisterCount, 62 testSuccessReadHoldingRegisterResponse}}, 63 {testReadHoldingRegisterModelOffset, 64 {testReadHoldingRegisterModelCount, testReadHoldingRegisterModel}}, 65 {testReadHoldingRegisterTempUnsignedOffset, 66 {testReadHoldingRegisterTempCount, 67 testReadHoldingRegisterTempUnsigned}}, 68 {testReadHoldingRegisterTempSignedOffset, 69 {testReadHoldingRegisterTempCount, testReadHoldingRegisterTempSigned}}, 70 {testReadHoldingRegisterFirmwareVersionOffset, 71 {testReadHoldingRegisterFirmwareVersionCount, 72 testReadHoldingRegisterFirmwareVersion}}, 73 {testReadHoldingRegisterEventOffset, 74 {testReadHoldingRegisterEventCount, testReadHoldingRegisterEvent}}}; 75 76 class ServerTester 77 { 78 public: 79 explicit ServerTester(sdbusplus::async::context& ctx, int fd); 80 81 auto processRequests() -> void; 82 83 private: 84 auto processMessage(MessageIntf& request, size_t requestSize, 85 MessageIntf& response, bool& segmentedResponse) -> void; 86 87 auto processRequestsInternal() -> void; 88 89 auto processReadHoldingRegisters(MessageIntf& request, size_t requestSize, 90 MessageIntf& response, 91 bool& segmentedResponse) -> void; 92 93 int fd; 94 sdbusplus::async::fdio fdioInstance; 95 sdbusplus::async::mutex mutex; 96 }; 97 } // namespace phosphor::modbus::test 98