20#include <gtest/gtest.h>
37Bytes BuildAlarmBlock(
bool highPriority =
false, std::uint16_t specifier = 0x0401,
const Bytes& items = {})
49 EXPECT_EQ(body.size(), 20U);
51 const std::uint16_t blockType = highPriority ? 0x0001 : 0x0002;
53 Bytes rest{0x01, 0x00};
55 rest.insert(rest.end(), body.begin(), body.end());
56 rest.insert(rest.end(), items.begin(), items.end());
61 wire::PutU16(result,
static_cast<std::uint16_t
>(rest.size()));
62 result.insert(result.end(), rest.begin(), rest.end());
73class AlarmNotificationTest :
public ::testing::Test
79 static Bytes MakeChannelDiagnosisItem()
95TEST_F(AlarmNotificationTest, ItemLessAlarmIsAccepted)
97 const Bytes block = BuildAlarmBlock();
99 EXPECT_EQ(block.size(), 26U);
103 EXPECT_EQ(notification.slotNumber, 1U);
105 EXPECT_TRUE(notification.items.empty());
109TEST_F(AlarmNotificationTest, ChannelDiagnosisItemIsDecoded)
111 const Bytes item = MakeChannelDiagnosisItem();
115 ASSERT_EQ(notification.items.size(), 1U);
116 auto* diag = std::get_if<DiagnosisItem>(¬ification.items[0]);
117 EXPECT_EQ(diag->userStructureId,
static_cast<Usi>(0x8000U));
118 EXPECT_EQ(diag->channelNumber, 1U);
119 EXPECT_EQ(diag->channelErrorType, 9U);
128TEST_F(AlarmNotificationTest, EthernetPaddingIsNotParsedAsItems)
130 const Bytes block = BuildAlarmBlock(
false, 0x0401, MakeChannelDiagnosisItem());
132 Bytes padded = block;
134 padded.insert(padded.end(), 6U, 0x00);
138 EXPECT_EQ(notification.items.size(), 1U);
142TEST_F(AlarmNotificationTest, ArDiagnosisIsBit14)
146 EXPECT_TRUE(notification.arDiagnosisState);
150TEST_F(AlarmNotificationTest, ReservedBit15IsNotArDiagnosis)
154 EXPECT_FALSE(notification.arDiagnosisState);
Declares PROFINET alarm, diagnosis, maintenance, and USI payload types and parsers.
void PutU16(std::vector< std::uint8_t > &out, std::uint16_t value)
Append a 16-bit value to a buffer in big-endian order.
void PutU32(std::vector< std::uint8_t > &out, std::uint32_t value)
Append a 32-bit value to a buffer in big-endian order.
TEST_F(AlarmListenerTests, InitializesWithEndpoint)
AlarmNotification ParseAlarmNotification(const Bytes &data)
Parse a complete AlarmNotification PDU (BlockHeader + body + items).
Usi
PROFINET User Structure Identifiers (USI).
std::vector< std::uint8_t > Bytes
Generic byte buffer alias used throughout the library for raw wire data.