node_status_provider.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>
7 #include "helpers.hpp"
8 
9 
11 {
13 
14  AdHocNodeStatusUpdater() : invokations(0) { }
15 
16  virtual void updateNodeStatus()
17  {
18  invokations++;
19  }
20 };
21 
22 
23 TEST(NodeStatusProvider, Basic)
24 {
26 
27  uavcan::NodeStatusProvider nsp(nodes.a);
28 
29  /*
30  * Initialization
31  */
32  uavcan::protocol::HardwareVersion hwver;
33  hwver.major = 3;
34  hwver.minor = 14;
35 
36  uavcan::protocol::SoftwareVersion swver;
37  swver.major = 2;
38  swver.minor = 18;
39  swver.vcs_commit = 0x600DF00D;
40 
41  nsp.setHardwareVersion(hwver);
42  nsp.setSoftwareVersion(swver);
43 
44  ASSERT_TRUE(nsp.getName().empty());
45  nsp.setName("superluminal_communication_unit");
46  ASSERT_STREQ("superluminal_communication_unit", nsp.getName().c_str());
47 
48  ASSERT_EQ(uavcan::protocol::NodeStatus::HEALTH_OK, nsp.getHealth());
49  ASSERT_EQ(uavcan::protocol::NodeStatus::MODE_INITIALIZATION, nsp.getMode());
50  nsp.setHealthError();
51  nsp.setModeOperational();
52  ASSERT_EQ(uavcan::protocol::NodeStatus::HEALTH_ERROR, nsp.getHealth());
53  ASSERT_EQ(uavcan::protocol::NodeStatus::MODE_OPERATIONAL, nsp.getMode());
54 
55  // Will fail - types are not registered
57  ASSERT_GT(0, nsp.startAndPublish());
58 
62  ASSERT_LE(0, nsp.startAndPublish());
63 
64  // Checking the publishing rate settings
65  ASSERT_EQ(uavcan::MonotonicDuration::fromMSec(uavcan::protocol::NodeStatus::MAX_BROADCASTING_PERIOD_MS),
67 
69  ASSERT_EQ(uavcan::MonotonicDuration::fromMSec(uavcan::protocol::NodeStatus::MIN_BROADCASTING_PERIOD_MS),
71 
73  ASSERT_EQ(uavcan::MonotonicDuration::fromMSec(uavcan::protocol::NodeStatus::MAX_BROADCASTING_PERIOD_MS),
75 
77  ASSERT_EQ(UAVCAN_NULLPTR, nsp.getAdHocNodeStatusUpdater());
78  nsp.setAdHocNodeStatusUpdater(&ad_hoc);
79  ASSERT_EQ(&ad_hoc, nsp.getAdHocNodeStatusUpdater());
80 
81  /*
82  * Initial status publication
83  */
85 
86  ASSERT_LE(0, status_sub.start());
87  ASSERT_FALSE(status_sub.collector.msg.get()); // No data yet
88 
90 
91  ASSERT_TRUE(status_sub.collector.msg.get()); // Was published at startup
92  ASSERT_EQ(uavcan::protocol::NodeStatus::HEALTH_ERROR, status_sub.collector.msg->health);
93  ASSERT_EQ(0, status_sub.collector.msg->vendor_specific_status_code);
94  ASSERT_GE(1, status_sub.collector.msg->uptime_sec);
95 
96  ASSERT_EQ(0, ad_hoc.invokations); // Not invoked from startAndPublish()
97 
98  /*
99  * Altering the vendor-specific status code, forcePublish()-ing it and checking the result
100  */
101  ASSERT_EQ(0, nsp.getVendorSpecificStatusCode());
102  nsp.setVendorSpecificStatusCode(1234);
103  ASSERT_EQ(1234, nsp.getVendorSpecificStatusCode());
104 
105  ASSERT_LE(0, nsp.forcePublish());
106 
108 
109  ASSERT_EQ(uavcan::protocol::NodeStatus::HEALTH_ERROR, status_sub.collector.msg->health);
110  ASSERT_EQ(1234, status_sub.collector.msg->vendor_specific_status_code);
111  ASSERT_GE(1, status_sub.collector.msg->uptime_sec);
112 
113  ASSERT_EQ(0, ad_hoc.invokations); // Not invoked from forcePublish()
114 
115  /*
116  * Explicit node info request
117  */
119 
120  nsp.setHealthCritical();
121 
122  ASSERT_FALSE(gni_cln.collector.result.get()); // No data yet
123  ASSERT_LE(0, gni_cln.call(1, uavcan::protocol::GetNodeInfo::Request()));
124 
126  ASSERT_TRUE(gni_cln.collector.result.get()); // Response must have been delivered
127 
128  ASSERT_TRUE(gni_cln.collector.result->isSuccessful());
129  ASSERT_EQ(1, gni_cln.collector.result->getCallID().server_node_id.get());
130 
131  ASSERT_EQ(uavcan::protocol::NodeStatus::HEALTH_CRITICAL,
132  gni_cln.collector.result->getResponse().status.health);
133 
134  ASSERT_TRUE(hwver == gni_cln.collector.result->getResponse().hardware_version);
135  ASSERT_TRUE(swver == gni_cln.collector.result->getResponse().software_version);
136 
137  ASSERT_EQ("superluminal_communication_unit", gni_cln.collector.result->getResponse().name);
138 
139  ASSERT_EQ(0, ad_hoc.invokations); // No timer-triggered publications happened yet
140 
141  /*
142  * Timer triggered publication
143  */
144  EXPECT_EQ(3, nodes.a.getDispatcher().getTransferPerfCounter().getTxTransferCount());
145 
147 
148  EXPECT_EQ(1, ad_hoc.invokations); // No timer-triggered publications happened yet
149  EXPECT_EQ(4, nodes.a.getDispatcher().getTransferPerfCounter().getTxTransferCount());
150 }
void setStatusPublicationPeriod(uavcan::MonotonicDuration period)
const NodeName & getName() const
void setSoftwareVersion(const protocol::SoftwareVersion &version)
Dispatcher & getDispatcher()
IAdHocNodeStatusUpdater * getAdHocNodeStatusUpdater() const
int startAndPublish(const TransferPriority priority=TransferPriority::Default)
uavcan::MonotonicDuration getStatusPublicationPeriod() const
TEST(NodeStatusProvider, Basic)
const uint64_t & getTxTransferCount() const
int call(uavcan::NodeID node_id, const typename DataType::Request &request)
void setVendorSpecificStatusCode(VendorSpecificStatusCode code)
void setHardwareVersion(const protocol::HardwareVersion &version)
const TransferPerfCounter & getTransferPerfCounter() const
Definition: dispatcher.hpp:236
std::uint64_t uint64_t
Definition: std.hpp:27
static GlobalDataTypeRegistry & instance()
static MonotonicDuration fromMSec(int64_t ms)
Definition: time.hpp:41
int spinBoth(uavcan::MonotonicDuration duration)
Definition: test_node.hpp:176
VendorSpecificStatusCode getVendorSpecificStatusCode() const
void setAdHocNodeStatusUpdater(IAdHocNodeStatusUpdater *updater)
void setName(const NodeName &name)


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