You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.3 KiB
111 lines
3.3 KiB
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Digital Voice Modem - Test Suite
|
|
* GPLv2 Open Source. Use is subject to license terms.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright (C) 2025 Bryan Biedenkapp, N2PLL
|
|
*
|
|
*/
|
|
|
|
#include <catch2/catch_test_macros.hpp>
|
|
#include <cstring>
|
|
#include <memory>
|
|
|
|
#include "common/dmr/lc/FullLC.h"
|
|
#include "common/dmr/lc/LC.h"
|
|
#include "common/dmr/DMRDefines.h"
|
|
|
|
using namespace dmr;
|
|
using namespace dmr::defines;
|
|
using namespace dmr::lc;
|
|
|
|
TEST_CASE("FullLC encodes and decodes VOICE_LC_HEADER for private call", "[dmr][fulllc]") {
|
|
uint8_t frame[DMR_FRAME_LENGTH_BYTES + 2U];
|
|
::memset(frame, 0x00U, sizeof(frame));
|
|
|
|
uint32_t srcId = 12345U;
|
|
uint32_t dstId = 54321U;
|
|
|
|
LC lc(FLCO::PRIVATE, srcId, dstId);
|
|
lc.setFID(0x10U);
|
|
|
|
FullLC fullLC;
|
|
fullLC.encode(lc, frame + 2U, DataType::VOICE_LC_HEADER);
|
|
|
|
// Decode and verify
|
|
std::unique_ptr<LC> decoded = fullLC.decode(frame + 2U, DataType::VOICE_LC_HEADER);
|
|
REQUIRE(decoded != nullptr);
|
|
REQUIRE(decoded->getFLCO() == FLCO::PRIVATE);
|
|
REQUIRE(decoded->getSrcId() == srcId);
|
|
REQUIRE(decoded->getDstId() == dstId);
|
|
REQUIRE(decoded->getFID() == 0x10U);
|
|
}
|
|
|
|
TEST_CASE("FullLC encodes and decodes VOICE_LC_HEADER for group call", "[dmr][fulllc]") {
|
|
uint8_t frame[DMR_FRAME_LENGTH_BYTES + 2U];
|
|
::memset(frame, 0x00U, sizeof(frame));
|
|
|
|
uint32_t srcId = 1001U;
|
|
uint32_t dstId = 9999U;
|
|
|
|
LC lc(FLCO::GROUP, srcId, dstId);
|
|
lc.setFID(0x00U);
|
|
|
|
FullLC fullLC;
|
|
fullLC.encode(lc, frame + 2U, DataType::VOICE_LC_HEADER);
|
|
|
|
// Decode and verify
|
|
std::unique_ptr<LC> decoded = fullLC.decode(frame + 2U, DataType::VOICE_LC_HEADER);
|
|
REQUIRE(decoded != nullptr);
|
|
REQUIRE(decoded->getFLCO() == FLCO::GROUP);
|
|
REQUIRE(decoded->getSrcId() == srcId);
|
|
REQUIRE(decoded->getDstId() == dstId);
|
|
}
|
|
|
|
TEST_CASE("FullLC encodes and decodes TERMINATOR_WITH_LC", "[dmr][fulllc]") {
|
|
uint8_t frame[DMR_FRAME_LENGTH_BYTES + 2U];
|
|
::memset(frame, 0x00U, sizeof(frame));
|
|
|
|
uint32_t srcId = 7777U;
|
|
uint32_t dstId = 8888U;
|
|
|
|
LC lc(FLCO::GROUP, srcId, dstId);
|
|
lc.setFID(0x02U);
|
|
|
|
FullLC fullLC;
|
|
fullLC.encode(lc, frame + 2U, DataType::TERMINATOR_WITH_LC);
|
|
|
|
// Decode and verify
|
|
std::unique_ptr<LC> decoded = fullLC.decode(frame + 2U, DataType::TERMINATOR_WITH_LC);
|
|
REQUIRE(decoded != nullptr);
|
|
REQUIRE(decoded->getFLCO() == FLCO::GROUP);
|
|
REQUIRE(decoded->getSrcId() == srcId);
|
|
REQUIRE(decoded->getDstId() == dstId);
|
|
REQUIRE(decoded->getFID() == 0x02U);
|
|
}
|
|
|
|
TEST_CASE("FullLC preserves service options", "[dmr][fulllc]") {
|
|
uint8_t frame[DMR_FRAME_LENGTH_BYTES + 2U];
|
|
::memset(frame, 0x00U, sizeof(frame));
|
|
|
|
uint32_t srcId = 100U;
|
|
uint32_t dstId = 200U;
|
|
|
|
LC lc(FLCO::PRIVATE, srcId, dstId);
|
|
lc.setFID(0x01U);
|
|
lc.setEmergency(true);
|
|
lc.setEncrypted(true);
|
|
lc.setPriority(3U);
|
|
|
|
FullLC fullLC;
|
|
fullLC.encode(lc, frame + 2U, DataType::VOICE_LC_HEADER);
|
|
|
|
// Decode and verify options
|
|
std::unique_ptr<LC> decoded = fullLC.decode(frame + 2U, DataType::VOICE_LC_HEADER);
|
|
REQUIRE(decoded != nullptr);
|
|
REQUIRE(decoded->getEmergency() == true);
|
|
REQUIRE(decoded->getEncrypted() == true);
|
|
REQUIRE(decoded->getPriority() == 3U);
|
|
}
|