service_server.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #include <gtest/gtest.h>
8 #include <root_ns_a/StringService.hpp>
9 #include <root_ns_a/EmptyService.hpp>
10 #include "../clock.hpp"
11 #include "../transport/can/can.hpp"
12 #include "test_node.hpp"
13 
14 
16 {
17  const char* string_response;
18 
20 
22  root_ns_a::StringService::Response& response)
23  {
24  std::cout << request << std::endl;
25  response.string_response = request.string_request;
26  response.string_response += " --> ";
27  response.string_response += string_response;
28  std::cout << response << std::endl;
29  }
30 
33  root_ns_a::StringService::Response&)> Binder;
34 
36 };
37 
38 
40 {
42  root_ns_a::EmptyService::Response&)
43  {
44  std::cout << request << std::endl;
45  }
46 
49  root_ns_a::EmptyService::Response&)> Binder;
50 
52 };
53 
54 
55 TEST(ServiceServer, Basic)
56 {
57  // Manual type registration - we can't rely on the GDTR state
60 
61  SystemClockDriver clock_driver;
62  CanDriverMock can_driver(1, clock_driver);
63  TestNode node(can_driver, clock_driver, 1);
64 
65  StringServerImpl impl("456");
66 
67  {
69 
70  ASSERT_EQ(0, node.getDispatcher().getNumServiceRequestListeners());
71  server.start(impl.bind());
72  ASSERT_EQ(1, node.getDispatcher().getNumServiceRequestListeners());
73 
74  /*
75  * Request frames
76  */
77  for (uint8_t i = 0; i < 2; i++)
78  {
79  uavcan::Frame frame(root_ns_a::StringService::DefaultDataTypeID, uavcan::TransferTypeServiceRequest,
80  uavcan::NodeID(uint8_t(i + 0x10)), 1, i);
81 
82  const uint8_t req[] = {'r', 'e', 'q', uint8_t(i + '0')};
83  frame.setPayload(req, sizeof(req));
84 
85  frame.setStartOfTransfer(true);
86  frame.setEndOfTransfer(true);
87  frame.setPriority(i);
88 
89  uavcan::RxFrame rx_frame(frame, clock_driver.getMonotonic(), clock_driver.getUtc(), 0);
90  can_driver.ifaces[0].pushRx(rx_frame);
91  }
92 
93  node.spin(clock_driver.getMonotonic() + uavcan::MonotonicDuration::fromUSec(10000));
94 
95  /*
96  * Responses (MFT)
97  */
98  ASSERT_EQ(4, can_driver.ifaces[0].tx.size());
99  for (int i = 0; i < 2; i++)
100  {
101  char payloads[2][8];
102  std::snprintf(payloads[0], 8, "req%i ", i);
103  std::snprintf(payloads[1], 8, "--> 456");
104 
105  // First frame
106  uavcan::Frame fr;
107  ASSERT_TRUE(fr.parse(can_driver.ifaces[0].popTxFrame()));
108  std::cout << fr.toString() << std::endl;
109  ASSERT_FALSE(std::strncmp(payloads[0], reinterpret_cast<const char*>(fr.getPayloadPtr() + 2), 5)); // No CRC
110 
111  ASSERT_EQ(i, fr.getTransferID().get());
113  ASSERT_EQ(i + 0x10, fr.getDstNodeID().get());
114  ASSERT_EQ(i, fr.getPriority().get());
115 
116  // Second frame
117  ASSERT_TRUE(fr.parse(can_driver.ifaces[0].popTxFrame()));
118  std::cout << fr.toString() << std::endl;
119  // cppcheck-suppress arrayIndexOutOfBounds
120  ASSERT_FALSE(std::strncmp(payloads[1], reinterpret_cast<const char*>(fr.getPayloadPtr()), 7));
121 
122  ASSERT_EQ(i, fr.getTransferID().get());
124  ASSERT_EQ(i + 0x10, fr.getDstNodeID().get());
125  }
126 
127  ASSERT_EQ(0, server.getRequestFailureCount());
128  ASSERT_EQ(0, server.getResponseFailureCount());
129 
130  ASSERT_EQ(1, node.getDispatcher().getNumServiceRequestListeners());
131  }
132  ASSERT_EQ(0, node.getDispatcher().getNumServiceRequestListeners());
133 }
134 
135 
136 TEST(ServiceServer, Empty)
137 {
138  // Manual type registration - we can't rely on the GDTR state
141 
142  SystemClockDriver clock_driver;
143  CanDriverMock can_driver(1, clock_driver);
144  TestNode node(can_driver, clock_driver, 1);
145 
146  EmptyServerImpl impl;
147 
149 
150  std::cout << "sizeof(ServiceServer<root_ns_a::EmptyService, EmptyServerImpl::Binder>): "
152 
153  ASSERT_EQ(0, node.getDispatcher().getNumServiceRequestListeners());
154  ASSERT_GE(0, server.start(impl.bind()));
155  ASSERT_EQ(1, node.getDispatcher().getNumServiceRequestListeners());
156 }
response
const std::string response
StringServerImpl::StringServerImpl
StringServerImpl(const char *string_response)
Definition: service_server.cpp:19
uavcan::DefaultDataTypeRegistrator
Definition: global_data_type_registry.hpp:186
SystemClockDriver::getMonotonic
virtual uavcan::MonotonicTime getMonotonic() const
Definition: libuavcan/libuavcan/test/clock.hpp:67
uavcan::NodeID::get
uint8_t get() const
Definition: transfer.hpp:132
uavcan::TransferTypeServiceResponse
@ TransferTypeServiceResponse
Definition: transfer.hpp:20
uavcan::NodeID
Definition: transfer.hpp:112
StringServerImpl::string_response
const char * string_response
Definition: service_server.cpp:17
StringServerImpl::bind
Binder bind()
Definition: service_server.cpp:35
uavcan::Frame::getPriority
TransferPriority getPriority() const
Definition: frame.hpp:64
uavcan::ReceivedDataStructure
Definition: generic_subscriber.hpp:39
uavcan::Frame::getTransferID
TransferID getTransferID() const
Definition: frame.hpp:79
uavcan::TransferTypeServiceRequest
@ TransferTypeServiceRequest
Definition: transfer.hpp:21
uavcan::TransferID::get
uint8_t get() const
Definition: transfer.hpp:99
TestNode
Definition: test_node.hpp:20
EmptyServerImpl::handleRequest
void handleRequest(const uavcan::ReceivedDataStructure< root_ns_a::EmptyService::Request > &request, root_ns_a::EmptyService::Response &)
Definition: service_server.cpp:41
StringServerImpl::handleRequest
void handleRequest(const uavcan::ReceivedDataStructure< root_ns_a::StringService::Request > &request, root_ns_a::StringService::Response &response)
Definition: service_server.cpp:21
CanDriverMock::ifaces
std::vector< CanIfaceMock > ifaces
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:193
StringServerImpl::Binder
uavcan::MethodBinder< StringServerImpl *, void(StringServerImpl::*)(const uavcan::ReceivedDataStructure< root_ns_a::StringService::Request > &, root_ns_a::StringService::Response &)> Binder
Definition: service_server.cpp:33
uavcan::ServiceServer
Definition: service_server.hpp:90
uavcan::uint8_t
std::uint8_t uint8_t
Definition: std.hpp:24
uavcan::snprintf
int snprintf(char *out, std::size_t maxlen, const char *format,...)
Definition: std.hpp:73
uavcan::RxFrame
Definition: frame.hpp:104
EmptyServerImpl
Definition: service_server.cpp:39
uavcan::ServiceServer::getRequestFailureCount
uint32_t getRequestFailureCount() const
Definition: service_server.hpp:195
uavcan::TransferPriority::get
uint8_t get() const
Definition: transfer.hpp:62
uavcan::ServiceServer::getResponseFailureCount
uint32_t getResponseFailureCount() const
Definition: service_server.hpp:196
method_binder.hpp
test_node.hpp
uavcan::ServiceServer::start
int start(const Callback &callback)
Definition: service_server.hpp:158
SystemClockDriver::getUtc
virtual uavcan::UtcTime getUtc() const
Definition: libuavcan/libuavcan/test/clock.hpp:79
frame
uavcan::CanFrame frame
Definition: can.cpp:78
uavcan::Frame::getDstNodeID
NodeID getDstNodeID() const
Definition: frame.hpp:78
TEST
TEST(ServiceServer, Basic)
Definition: service_server.cpp:55
EmptyServerImpl::Binder
uavcan::MethodBinder< EmptyServerImpl *, void(EmptyServerImpl::*)(const uavcan::ReceivedDataStructure< root_ns_a::EmptyService::Request > &, root_ns_a::EmptyService::Response &)> Binder
Definition: service_server.cpp:49
uavcan::MethodBinder
Definition: method_binder.hpp:20
CanDriverMock
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:190
uavcan::Frame
Definition: frame.hpp:17
uavcan::Frame::parse
bool parse(const CanFrame &can_frame)
Definition: uc_frame.cpp:34
uavcan::Frame::getTransferType
TransferType getTransferType() const
Definition: frame.hpp:75
EmptyServerImpl::bind
Binder bind()
Definition: service_server.cpp:51
StringServerImpl
Definition: service_server.cpp:15
pyuavcan_v0.introspect.node
node
Definition: introspect.py:398
SystemClockDriver
Definition: libuavcan/libuavcan/test/clock.hpp:62
uavcan::GlobalDataTypeRegistry::instance
static GlobalDataTypeRegistry & instance()
Definition: uc_global_data_type_registry.cpp:128
uavcan::Frame::getPayloadPtr
const uint8_t * getPayloadPtr() const
Definition: frame.hpp:73
service_server.hpp
uavcan::DurationBase< MonotonicDuration >::fromUSec
static MonotonicDuration fromUSec(int64_t us)
Definition: time.hpp:35


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:03