xref: /openbmc/phosphor-modbus/tests/modbus_server_tester.hpp (revision acfdd55f5f8ca4db5cd41a9dcb15bce438136123)
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