allocation_request_manager.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2015 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #include <gtest/gtest.h>
8 #include "event_tracer.hpp"
9 #include "../helpers.hpp"
10 
11 
13 
15 {
16  std::vector<std::pair<UniqueID, uavcan::NodeID> > requests_;
17 
18 public:
20 
21  AllocationRequestHandler() : can_followup(false) { }
22 
23  virtual void handleAllocationRequest(const UniqueID& unique_id, uavcan::NodeID preferred_node_id)
24  {
25  requests_.push_back(std::pair<UniqueID, uavcan::NodeID>(unique_id, preferred_node_id));
26  }
27 
29  {
30  return can_followup;
31  }
32 
33  bool matchAndPopLastRequest(const UniqueID& unique_id, uavcan::NodeID preferred_node_id)
34  {
35  if (requests_.empty())
36  {
37  std::cout << "No pending requests" << std::endl;
38  return false;
39  }
40 
41  const std::pair<UniqueID, uavcan::NodeID> pair = requests_.at(requests_.size() - 1U);
42  requests_.pop_back();
43 
44  if (pair.first != unique_id)
45  {
46  std::cout << "Unique ID mismatch" << std::endl;
47  return false;
48  }
49 
50  if (pair.second != preferred_node_id)
51  {
52  std::cout << "Node ID mismatch (" << pair.second.get() << ", " << preferred_node_id.get() << ")"
53  << std::endl;
54  return false;
55  }
56 
57  return true;
58  }
59 
60  void reset() { requests_.clear(); }
61 };
62 
63 
64 TEST(dynamic_node_id_server_AllocationRequestManager, Basic)
65 {
66  using namespace uavcan::protocol::dynamic_node_id;
67  using namespace uavcan::protocol::dynamic_node_id::server;
68  using namespace uavcan::dynamic_node_id_server;
69 
72 
73  // Node A is Allocator, Node B is Allocatee
75 
76  uavcan::DynamicNodeIDClient client(nodes.b);
77 
78  /*
79  * Client initialization
80  */
81  uavcan::protocol::HardwareVersion::FieldTypes::unique_id unique_id;
82  for (uavcan::uint8_t i = 0; i < unique_id.size(); i++)
83  {
84  unique_id[i] = i;
85  }
86  const uavcan::NodeID PreferredNodeID = 42;
87  ASSERT_LE(0, client.start(unique_id, PreferredNodeID));
88 
89  /*
90  * Request manager initialization
91  */
92  EventTracer tracer;
94  handler.can_followup = true;
95 
96  AllocationRequestManager manager(nodes.a, tracer, handler);
97 
99 
100  /*
101  * Allocation
102  */
104 
105  ASSERT_TRUE(handler.matchAndPopLastRequest(unique_id, PreferredNodeID));
106 
107  ASSERT_LE(0, manager.broadcastAllocationResponse(unique_id, PreferredNodeID));
108 
110 
111  /*
112  * Checking the client
113  */
114  ASSERT_TRUE(client.isAllocationComplete());
115 
116  ASSERT_EQ(PreferredNodeID, client.getAllocatedNodeID());
117 }
std::uint8_t uint8_t
Definition: std.hpp:24
virtual void handleAllocationRequest(const UniqueID &unique_id, uavcan::NodeID preferred_node_id)
virtual bool canPublishFollowupAllocationResponse() const
static const NodeID Broadcast
Definition: transfer.hpp:122
bool matchAndPopLastRequest(const UniqueID &unique_id, uavcan::NodeID preferred_node_id)
uint8_t get() const
Definition: transfer.hpp:132
protocol::dynamic_node_id::server::Entry::FieldTypes::unique_id UniqueID
std::vector< std::pair< UniqueID, uavcan::NodeID > > requests_
static GlobalDataTypeRegistry & instance()
int broadcastAllocationResponse(const UniqueID &unique_id, NodeID allocated_node_id)
static MonotonicDuration fromMSec(int64_t ms)
Definition: time.hpp:41
int spinBoth(uavcan::MonotonicDuration duration)
Definition: test_node.hpp:176
TEST(dynamic_node_id_server_AllocationRequestManager, Basic)
static const TransferPriority OneHigherThanLowest
Definition: transfer.hpp:40
int start(const UniqueID &unique_id, const NodeID preferred_node_id=NodeID::Broadcast, const TransferPriority transfer_priority=TransferPriority::OneHigherThanLowest)


uavcan_communicator
Author(s):
autogenerated on Wed Jan 11 2023 03:59:39