libdoip  0.1.0
DoIP (Diagnostics over Internet Protocol) ISO 13400 C++17 Library
UdsMock.h
Go to the documentation of this file.
1 #ifndef UDSMOCK_H
2 #define UDSMOCK_H
3 
4 #include <array>
5 #include <functional>
6 #include <memory>
7 #include <unordered_map>
8 
9 #include "DoIPMessage.h"
10 #include "IUdsServiceHandler.h"
11 #include "LambdaUdsHandler.h"
12 #include "UdsResponseCode.h"
13 #include "UdsServices.h"
14 
15 using namespace doip;
16 
17 namespace doip::uds {
18 
19 constexpr uint8_t UDS_POSITIVE_RESPONSE_OFFSET = 0x40;
20 
21 class UdsMock {
22  public:
23  UdsMock() = default;
24 
25  // Register a handler owning pointer
27  m_handlers[static_cast<uint8_t>(serviceId)] = std::move(handler);
28  }
29 
30  // Register a lambda/function
31  void registerService(UdsService serviceId, std::function<UdsResponse(const ByteArray &)> fn) {
32  m_handlers[static_cast<uint8_t>(serviceId)] = std::make_unique<LambdaUdsHandler>(std::move(fn));
33  }
34 
35  // Unregister
36  void unregisterService(UdsService serviceId) {
37  m_handlers.erase(static_cast<uint8_t>(serviceId));
38  }
39 
40  // Convenience: clear all
41  void clear() { m_handlers.clear(); }
42 
43  // --- Typed registration helpers (convenience wrappers) ---
44  // Diagnostic Session Control (0x10): handler(sessionType)
45  void registerDiagnosticSessionControlHandler(std::function<UdsResponse(uint8_t sessionType)> handler);
46 
47  // ECU Reset (0x11): handler(resetType)
48  void registerECUResetHandler(std::function<UdsResponse(uint8_t resetType)> handler);
49 
50  // Read Data By Identifier (0x22): handler(did, params)
51  void registerReadDataByIdentifierHandler(std::function<UdsResponse(uint16_t did)> handler);
52 
53  // Write Data By Identifier (0x2E): handler(did, data)
54  void registerWriteDataByIdentifierHandler(std::function<UdsResponse(uint16_t did, ByteArray value)> handler);
55 
56  // Tester Present (0x3E): handler(subFunction)
57  void registerTesterPresentHandler(std::function<UdsResponse(uint8_t subFunction)> handler);
58 
59 
60  ByteArray handleDiagnosticRequest(const ByteArray &request) const;
61 
62  // Register default handlers for all known services.
63  // By default these handlers simply return ServiceNotSupported. Tests
64  // can register custom handlers afterwards to override behavior.
66  const std::array<UdsService, 19> services = {
86  };
87 
88  for (auto s : services) {
89  registerService(s, [](const ByteArray &req) -> UdsResponse {
90  (void)req;
92  });
93  }
94  }
95 
96  private:
97  static ByteArray makeResponse(const ByteArray &request, UdsResponseCode responseCode = UdsResponseCode::OK, const ByteArray &extraData = {}) {
98  if (responseCode != UdsResponseCode::OK) {
99  ByteArray negativeResponse;
100  negativeResponse.emplace_back(0x7F); // Negative response indicator
101  negativeResponse.emplace_back(request.empty() ? 0x00 : request[0]); // Original service ID or 0
102  negativeResponse.emplace_back(static_cast<uint8_t>(responseCode)); // NRC
103  return negativeResponse;
104  }
105 
106  ByteArray positiveResponse;
107  positiveResponse.emplace_back(static_cast<uint8_t>((request.empty() ? 0x00 : request[0]) + UDS_POSITIVE_RESPONSE_OFFSET)); // Positive response SID
108  positiveResponse.insert(positiveResponse.end(), extraData.begin(), extraData.end());
109  return positiveResponse;
110  }
111 
112  std::unordered_map<uint8_t, IUdsServiceHandlerPtr> m_handlers;
113 };
114 
115 } // namespace doip::uds
116 
117 #endif /* UDSMOCK_H */
void unregisterService(UdsService serviceId)
Definition: UdsMock.h:36
void registerDiagnosticSessionControlHandler(std::function< UdsResponse(uint8_t sessionType)> handler)
Definition: UdsMock.cpp:43
void registerReadDataByIdentifierHandler(std::function< UdsResponse(uint16_t did)> handler)
Definition: UdsMock.cpp:57
void registerWriteDataByIdentifierHandler(std::function< UdsResponse(uint16_t did, ByteArray value)> handler)
Definition: UdsMock.cpp:64
void registerDefaultServices()
Definition: UdsMock.h:65
void registerService(UdsService serviceId, IUdsServiceHandlerPtr handler)
Definition: UdsMock.h:26
void registerECUResetHandler(std::function< UdsResponse(uint8_t resetType)> handler)
Definition: UdsMock.cpp:50
void registerService(UdsService serviceId, std::function< UdsResponse(const ByteArray &)> fn)
Definition: UdsMock.h:31
void registerTesterPresentHandler(std::function< UdsResponse(uint8_t subFunction)> handler)
Definition: UdsMock.cpp:71
ByteArray handleDiagnosticRequest(const ByteArray &request) const
Definition: UdsMock.cpp:6
std::unique_ptr< IUdsServiceHandler > IUdsServiceHandlerPtr
constexpr uint8_t UDS_POSITIVE_RESPONSE_OFFSET
Definition: UdsMock.h:19
std::pair< UdsResponseCode, ByteArray > UdsResponse
Definition: AnsiColors.h:3
A dynamic array of bytes with utility methods for network protocol handling.
Definition: ByteArray.h:60