18#include <gtest/gtest.h>
36void TestAlarmCallback(
const AlarmNotification& )
41AlarmEndpoint MakeEndpoint()
58TEST(AlarmEndpointTests, DefaultTransportIsLayer2)
60 auto expectedMac =
MacAddress{0x02, 0x00, 0x00, 0x00, 0x00, 0x01};
65 .deviceMac = expectedMac,
67 EXPECT_EQ(endpoint.interface,
"eth0");
68 EXPECT_EQ(endpoint.controllerRef, 1);
69 EXPECT_EQ(endpoint.deviceRef, 42);
70 EXPECT_EQ(endpoint.deviceMac, expectedMac);
71 EXPECT_EQ(endpoint.transport, 0);
75TEST(AlarmEndpointTests, AllFieldsCanBeConfigured)
77 const MacAddress deviceMac{0x00, 0x11, 0x22, 0x33, 0x44, 0x55};
83 .deviceMac = deviceMac,
87 EXPECT_EQ(endpoint.interface,
"eth0");
88 EXPECT_EQ(endpoint.controllerRef, 100);
89 EXPECT_EQ(endpoint.deviceRef, 200);
90 EXPECT_EQ(endpoint.deviceMac, deviceMac);
91 EXPECT_EQ(endpoint.transport, 1);
103 ioContext = std::make_unique<asio::io_context>();
115 EXPECT_EQ(listener->IsRunning(),
false);
124 EXPECT_FALSE(listener->IsRunning());
132 bool callbackRegistered =
false;
134 listener->AddAlarmNotificationCallback([&callbackRegistered](
const AlarmNotification&)
136 callbackRegistered =
true;
141 EXPECT_FALSE(callbackRegistered);
148 bool callbackRegistered =
false;
150 listener->AddAlarmNotificationCallback(TestAlarmCallback);
161 listener->AddAlarmNotificationCallback({});
170 listener->AddAlarmNotificationCallback(TestAlarmCallback);
176 listener->RemoveAlarmNotificationCallback(TestAlarmCallback);
187 EXPECT_NO_THROW(listener->RemoveAlarmNotificationCallback(TestAlarmCallback));
199 listener->AddAlarmNotificationCallback(TestAlarmCallback);
205 listener->RemoveAlarmNotificationCallback({});
216 EXPECT_FALSE(listener->IsRunning());
228 auto socket = std::make_unique<::testing::NiceMock<MockRawEthernetSocket>>();
230 ON_CALL(*socket, Recv())
231 .WillByDefault(::testing::Return(std::vector<std::uint8_t>{}));
233 ON_CALL(*socket, SetTimeout(::testing::_))
234 .WillByDefault(::testing::Return());
235 auto ioContext = std::make_unique<asio::io_context>();
236 listener = std::make_unique<AlarmListener>(*
ioContext, endpoint, std::nullopt);
238 EXPECT_FALSE(listener->IsRunning());
240 listener->Start(std::move(socket));
242 EXPECT_TRUE(listener->IsRunning());
246 EXPECT_FALSE(listener->IsRunning());
252 const MacAddress defaultMac{0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
261 0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
262 auto ioContext = std::make_unique<asio::io_context>();
263 listener = std::make_unique<AlarmListener>(*
ioContext, endpoint, customMac);
273TEST(AlarmFrameIdTests, HighPriorityAlarmFrameId)
279TEST(AlarmFrameIdTests, LowPriorityAlarmFrameId)
285 auto socket = std::make_unique<::testing::NiceMock<MockRawEthernetSocket>>();
286 auto* s = socket.get();
288 EXPECT_CALL(*s, SetTimeout(testing::_))
289 .WillOnce(testing::Throw(std::runtime_error(
"timeout")));
291 EXPECT_THROW(listener->Start(std::move(socket)), std::runtime_error);
292 EXPECT_FALSE(listener->IsRunning());
297 auto socket = std::make_unique<::testing::NiceMock<MockRawEthernetSocket>>();
299 auto* s = socket.get();
301 EXPECT_CALL(*s, SetTimeout(testing::_))
302 .WillOnce(testing::Throw(std::runtime_error(
"timeout")));
304 EXPECT_THROW(listener->Start(std::move(socket)), std::runtime_error);
307 socket = std::make_unique<::testing::NiceMock<MockRawEthernetSocket>>();
308 EXPECT_NO_THROW(listener->Start(std::move(socket)));
309 EXPECT_TRUE(listener->IsRunning());
315 auto socket = std::make_unique<::testing::NiceMock<MockRawEthernetSocket>>();
317 listener->Start(std::move(socket));
319 EXPECT_NO_THROW(listener->Stop());
Private-access adapter used by AlarmListener tests.
Declares the PROFINET RTA alarm listener and AlarmAck transmission support.
static const MacAddress & ControllerMac(const AlarmListener &listener)
Return the listener's configured controller MAC address.
static std::size_t CallbackCount(const AlarmListener &listener)
Return the number of callbacks registered with the listener.
std::unique_ptr< asio::io_context > ioContext
std::unique_ptr< AlarmListener > listener
GoogleMock implementation of IRawEthernetSocket.
TEST_F(AlarmListenerTests, InitializesWithEndpoint)
TEST(AlarmEndpointTests, DefaultTransportIsLayer2)
std::array< std::uint8_t, macAddressLength > MacAddress
A 6-byte Ethernet MAC address.
constexpr std::uint16_t FRAME_ID_ALARM_HIGH
Frame ID used for high-priority alarms.
constexpr std::uint16_t FRAME_ID_ALARM_LOW
Frame ID used for low-priority alarms.
Alarm endpoint configuration.
std::string interface
Network interface name to bind to, e.g. "eth0".
Complete parsed AlarmNotification PDU: header fields + parsed items.
std::unique_ptr< asio::io_context > ioContext
Shared ASIO context.