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 
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 }
uavcan::NodeStatusProvider::setHardwareVersion
void setHardwareVersion(const protocol::HardwareVersion &version)
Definition: uc_node_status_provider.cpp:153
uavcan::NodeStatusProvider::setVendorSpecificStatusCode
void setVendorSpecificStatusCode(VendorSpecificStatusCode code)
Definition: uc_node_status_provider.cpp:132
UAVCAN_NULLPTR
#define UAVCAN_NULLPTR
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:51
uavcan::uint64_t
std::uint64_t uint64_t
Definition: std.hpp:27
TEST
TEST(NodeStatusProvider, Basic)
Definition: node_status_provider.cpp:23
uavcan::DefaultDataTypeRegistrator
Definition: global_data_type_registry.hpp:186
uavcan::NodeStatusProvider::getMode
uint8_t getMode() const
Definition: node_status_provider.hpp:137
SubscriberWithCollector
Definition: libuavcan/libuavcan/test/protocol/helpers.hpp:33
uavcan::NodeStatusProvider::setModeOperational
void setModeOperational()
Definition: node_status_provider.hpp:139
uavcan::DurationBase< MonotonicDuration >::fromMSec
static MonotonicDuration fromMSec(int64_t ms)
Definition: time.hpp:41
uavcan::NodeStatusProvider
Definition: node_status_provider.hpp:51
uavcan::INode::getDispatcher
Dispatcher & getDispatcher()
Definition: abstract_node.hpp:28
uavcan::NodeStatusProvider::setHealthError
void setHealthError()
Definition: node_status_provider.hpp:131
ServiceClientWithCollector::call
int call(uavcan::NodeID node_id, const typename DataType::Request &request)
Definition: libuavcan/libuavcan/test/protocol/helpers.hpp:111
SubscriberWithCollector::start
int start()
Definition: libuavcan/libuavcan/test/protocol/helpers.hpp:45
uavcan::MonotonicDuration
Definition: time.hpp:182
ServiceClientWithCollector
Definition: libuavcan/libuavcan/test/protocol/helpers.hpp:99
ServiceCallResultCollector::result
std::unique_ptr< Result > result
Definition: libuavcan/libuavcan/test/protocol/helpers.hpp:88
uavcan::NodeStatusProvider::setAdHocNodeStatusUpdater
void setAdHocNodeStatusUpdater(IAdHocNodeStatusUpdater *updater)
Definition: uc_node_status_provider.cpp:117
uavcan::NodeStatusProvider::getHealth
uint8_t getHealth() const
Definition: node_status_provider.hpp:127
uavcan::NodeStatusProvider::setName
void setName(const NodeName &name)
Definition: uc_node_status_provider.cpp:137
uavcan::NodeStatusProvider::setHealthCritical
void setHealthCritical()
Definition: node_status_provider.hpp:132
helpers.hpp
uavcan::NodeStatusProvider::forcePublish
int forcePublish()
Definition: node_status_provider.hpp:105
uavcan::NodeStatusProvider::setStatusPublicationPeriod
void setStatusPublicationPeriod(uavcan::MonotonicDuration period)
Definition: uc_node_status_provider.cpp:96
InterlinkedTestNodes
Definition: test_node.hpp:149
SubscriberWithCollector::collector
Collector collector
Definition: libuavcan/libuavcan/test/protocol/helpers.hpp:38
AdHocNodeStatusUpdater::invokations
uavcan::uint64_t invokations
Definition: node_status_provider.cpp:12
uavcan::NodeStatusProvider::getVendorSpecificStatusCode
VendorSpecificStatusCode getVendorSpecificStatusCode() const
Definition: node_status_provider.hpp:149
uavcan::NodeStatusProvider::getName
const NodeName & getName() const
Definition: node_status_provider.hpp:159
uavcan::NodeStatusProvider::getAdHocNodeStatusUpdater
IAdHocNodeStatusUpdater * getAdHocNodeStatusUpdater() const
Definition: node_status_provider.hpp:122
uavcan::IAdHocNodeStatusUpdater
Definition: node_status_provider.hpp:23
InterlinkedTestNodes::a
TestNode a
Definition: test_node.hpp:155
uavcan::TransferPerfCounter::getTxTransferCount
const uint64_t & getTxTransferCount() const
Definition: perf_counter.hpp:63
uavcan::NodeStatusProvider::startAndPublish
int startAndPublish(const TransferPriority priority=TransferPriority::Default)
Definition: uc_node_status_provider.cpp:58
SubscriptionCollector::msg
std::unique_ptr< DataType > msg
Definition: libuavcan/libuavcan/test/protocol/helpers.hpp:23
InterlinkedTestNodes::spinBoth
int spinBoth(uavcan::MonotonicDuration duration)
Definition: test_node.hpp:176
uavcan::Dispatcher::getTransferPerfCounter
const TransferPerfCounter & getTransferPerfCounter() const
Definition: dispatcher.hpp:236
AdHocNodeStatusUpdater::updateNodeStatus
virtual void updateNodeStatus()
Definition: node_status_provider.cpp:16
uavcan::NodeStatusProvider::setSoftwareVersion
void setSoftwareVersion(const protocol::SoftwareVersion &version)
Definition: uc_node_status_provider.cpp:145
uavcan::NodeStatusProvider::getStatusPublicationPeriod
uavcan::MonotonicDuration getStatusPublicationPeriod() const
Definition: uc_node_status_provider.cpp:112
uavcan::GlobalDataTypeRegistry::instance
static GlobalDataTypeRegistry & instance()
Definition: uc_global_data_type_registry.cpp:128
InterlinkedTestNodes::b
TestNode b
Definition: test_node.hpp:156
AdHocNodeStatusUpdater
Definition: node_status_provider.cpp:10
node_status_provider.hpp
ServiceClientWithCollector::collector
Collector collector
Definition: libuavcan/libuavcan/test/protocol/helpers.hpp:104
AdHocNodeStatusUpdater::AdHocNodeStatusUpdater
AdHocNodeStatusUpdater()
Definition: node_status_provider.cpp:14


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