168 lines
5.4 KiB
C++
168 lines
5.4 KiB
C++
/**
|
|
* @file CoPrtCnvRadioTelegramTest.cpp
|
|
* @brief Unit tests for N_CoPrtCnv::CoPrtCnvRadioTelegram.
|
|
*
|
|
* Covers the constructors that build a telegram from scratch, the header
|
|
* accessors (ISSIs, telegram id, PDU type, identity) and the payload helpers.
|
|
* Payload words are stored MSB first, which several of these tests pin down.
|
|
*/
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#include <QtCore/QByteArray>
|
|
|
|
#include "CoPrtCnvRadioTelegram.hpp"
|
|
#include "tetra_telegram_ids.h"
|
|
|
|
using N_CoPrtCnv::CoPrtCnvRadioTelegram;
|
|
|
|
TEST(CoPrtCnvRadioTelegramTest, RegisterIndCarriesSourceIssi)
|
|
{
|
|
const uint32_t sourceISSI = 0x123456;
|
|
const CoPrtCnvRadioTelegram telegram(sourceISSI);
|
|
|
|
EXPECT_EQ(telegram.getSrcISSI(), sourceISSI);
|
|
EXPECT_EQ(telegram.getPDU_Type(), CoPrtCnvRadioTelegram::e_RegisterInd);
|
|
EXPECT_EQ(telegram.getSize(), 9);
|
|
}
|
|
|
|
TEST(CoPrtCnvRadioTelegramTest, HeaderStartsWithMagicNumber)
|
|
{
|
|
const CoPrtCnvRadioTelegram telegram(1234);
|
|
|
|
ASSERT_GT(telegram.getSize(), 0);
|
|
EXPECT_EQ(static_cast<uint8_t>(telegram.data().at(0)), CoPrtCnvRadioTelegram::MAGIC_NUMBER);
|
|
}
|
|
|
|
TEST(CoPrtCnvRadioTelegramTest, SetSrcIssiOverwritesPreviousValue)
|
|
{
|
|
CoPrtCnvRadioTelegram telegram(1);
|
|
|
|
telegram.setSrcISSI(0xABCDEF);
|
|
EXPECT_EQ(telegram.getSrcISSI(), 0xABCDEFu);
|
|
|
|
telegram.setSrcISSI(0);
|
|
EXPECT_EQ(telegram.getSrcISSI(), 0u);
|
|
}
|
|
|
|
TEST(CoPrtCnvRadioTelegramTest, TelegramIdConstructorSetsIdAndIdentity)
|
|
{
|
|
const uint16_t payloadSize = 8;
|
|
const uint16_t identity = 0x0042;
|
|
const CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, payloadSize, identity);
|
|
|
|
EXPECT_EQ(telegram.getTelID(), GEF_POSITIONS_MELDUNG);
|
|
EXPECT_EQ(telegram.getIdentity(), identity);
|
|
EXPECT_EQ(telegram.getPDU_Type(), CoPrtCnvRadioTelegram::e_DataIndReq);
|
|
EXPECT_EQ(telegram.getSize(),
|
|
payloadSize + CoPrtCnvRadioTelegram::DATA_IND_REQ_HEADER_LENGTH);
|
|
}
|
|
|
|
TEST(CoPrtCnvRadioTelegramTest, TelegramIdConstructorProducesANormalTelegram)
|
|
{
|
|
const CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, 8, 0);
|
|
|
|
EXPECT_TRUE(telegram.isNormalTelegram());
|
|
EXPECT_FALSE(telegram.isLoginTelegram());
|
|
}
|
|
|
|
TEST(CoPrtCnvRadioTelegramTest, SetIdentityIsReadBack)
|
|
{
|
|
CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, 8, 0);
|
|
|
|
telegram.setIdentity(0x1234);
|
|
EXPECT_EQ(telegram.getIdentity(), 0x1234);
|
|
// The identity lives behind the telegram id, which must survive the write.
|
|
EXPECT_EQ(telegram.getTelID(), GEF_POSITIONS_MELDUNG);
|
|
}
|
|
|
|
TEST(CoPrtCnvRadioTelegramTest, TelegramIdIsTruncatedToASingleByte)
|
|
{
|
|
// The telegram id is written into one payload byte, so ids of 256 and above
|
|
// are stored truncated. GEF_GEFECHTSFELDTELEGRAMM (300) reads back as 44.
|
|
const CoPrtCnvRadioTelegram telegram(GEF_GEFECHTSFELDTELEGRAMM, 8, 0);
|
|
|
|
EXPECT_EQ(static_cast<int>(telegram.getTelID()), GEF_GEFECHTSFELDTELEGRAMM & 0xFF);
|
|
EXPECT_NE(static_cast<int>(telegram.getTelID()), int(GEF_GEFECHTSFELDTELEGRAMM));
|
|
}
|
|
|
|
TEST(CoPrtCnvRadioTelegramTest, PayloadWordsAreStoredMostSignificantByteFirst)
|
|
{
|
|
CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, 8, 0);
|
|
|
|
telegram.setPayloadDataWithIndex(4, 0x00112233, 4);
|
|
|
|
EXPECT_EQ(telegram.getPayloadDataUInt32(4, 4), 0x00112233u);
|
|
EXPECT_EQ(telegram.getPayloadDataUInt8(4), 0x00);
|
|
EXPECT_EQ(telegram.getPayloadDataUInt8(5), 0x11);
|
|
EXPECT_EQ(telegram.getPayloadDataUInt8(6), 0x22);
|
|
EXPECT_EQ(telegram.getPayloadDataUInt8(7), 0x33);
|
|
}
|
|
|
|
TEST(CoPrtCnvRadioTelegramTest, PayloadDataUInt32HonoursRequestedWidth)
|
|
{
|
|
CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, 8, 0);
|
|
|
|
telegram.setPayloadDataWithIndex(4, 0x00112233, 4);
|
|
|
|
EXPECT_EQ(telegram.getPayloadDataUInt32(4, 1), 0x00u);
|
|
EXPECT_EQ(telegram.getPayloadDataUInt32(5, 2), 0x1122u);
|
|
EXPECT_EQ(telegram.getPayloadDataUInt32(5, 3), 0x112233u);
|
|
}
|
|
|
|
TEST(CoPrtCnvRadioTelegramTest, ConstructingFromRawDataPreservesBytes)
|
|
{
|
|
const CoPrtCnvRadioTelegram source(0x00ABCD);
|
|
const QByteArray raw = source.data();
|
|
|
|
const CoPrtCnvRadioTelegram restored(raw);
|
|
|
|
EXPECT_EQ(restored.data(), raw);
|
|
EXPECT_EQ(restored.getSrcISSI(), source.getSrcISSI());
|
|
EXPECT_EQ(restored.getPDU_Type(), source.getPDU_Type());
|
|
}
|
|
|
|
TEST(CoPrtCnvRadioTelegramTest, TelegramLengthLimits)
|
|
{
|
|
EXPECT_TRUE(CoPrtCnvRadioTelegram::isTelegramLengthOk(1));
|
|
EXPECT_TRUE(CoPrtCnvRadioTelegram::isTelegramLengthOk(
|
|
CoPrtCnvRadioTelegram::MAX_RADIO_TELEGRAM_PAYLOAD_LENGTH));
|
|
EXPECT_FALSE(CoPrtCnvRadioTelegram::isTelegramLengthOk(0xFFFF));
|
|
}
|
|
|
|
TEST(CoPrtCnvRadioTelegramTest, LoginTelegramIsRecognised)
|
|
{
|
|
const CoPrtCnvRadioTelegram login(CoPrtCnvRadioTelegram::e_LoginRequest, 0x0001, 0x001234);
|
|
|
|
EXPECT_TRUE(login.isLoginTelegram());
|
|
EXPECT_FALSE(login.isNormalTelegram());
|
|
EXPECT_EQ(login.getIdentity(), 0x0001);
|
|
EXPECT_EQ(login.getDestISSI(), 0x001234u);
|
|
}
|
|
|
|
TEST(CoPrtCnvRadioTelegramTest, BroadcastIndexRoundTrips)
|
|
{
|
|
// getBroadcastIndex() only reports an index when the payload extends past
|
|
// offset 4, so the telegram needs more than five payload bytes.
|
|
CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, 8, 0);
|
|
|
|
telegram.setBroadcastIndex(0x0107);
|
|
EXPECT_EQ(telegram.getBroadcastIndex(), 0x0107);
|
|
}
|
|
|
|
TEST(CoPrtCnvRadioTelegramTest, CounterRoundTrips)
|
|
{
|
|
CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, 8, 0);
|
|
|
|
telegram.setZaehler(0x2A);
|
|
EXPECT_EQ(telegram.zaehler(), 0x2A);
|
|
}
|
|
|
|
TEST(CoPrtCnvRadioTelegramTest, DestIssiRoundTrips)
|
|
{
|
|
CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, 8, 0);
|
|
|
|
telegram.setDestISSI(0x00FEDC);
|
|
EXPECT_EQ(telegram.getDestISSI(), 0x00FEDCu);
|
|
}
|