uhd/host/tests/chdr_parse_test.cpp
Martin Braun 74d25ea88a uhd: Remove superfluous boost/bind.hpp includes
On newer versions of Boost, they show deprecation notes. However,
they're not actually used any more so they can go.
2021-12-03 11:33:07 -08:00

162 lines
5.1 KiB
C++

//
// Copyright 2020 Ettus Research, a National Instruments Brand
//
// SPDX-License-Identifier: GPL-3.0-or-later
//
#include <uhd/rfnoc/chdr_types.hpp>
#include <uhd/utils/chdr/chdr_packet.hpp>
#include <chdr_resource/hardcoded_packets.cpp>
#include <boost/test/unit_test.hpp>
#include <bitset>
#include <iostream>
#include <memory>
#include <tuple>
constexpr uhd::rfnoc::chdr_w_t CHDR_W = uhd::rfnoc::CHDR_W_64;
namespace chdr_util = uhd::utils::chdr;
namespace chdr_rfnoc = uhd::rfnoc::chdr;
using namespace boost::unit_test;
template <size_t bits, typename val_t>
void print_bits(val_t value)
{
std::bitset<bits> set(value);
uint32_t count = 0;
for (int64_t i = set.size() - 1; i >= 0; i--) {
bool bit = set[i];
std::cout << (bit ? "1" : "0");
if (count == 7) {
count = 0;
if (i != 0) {
std::cout << "_";
}
} else {
count++;
}
}
}
void assert_packet_equal(const chdr_util::chdr_packet& lhs,
const chdr_util::chdr_packet& rhs,
uint64_t packet_num)
{
// Header Comparison
auto left_header = lhs.get_header();
auto right_header = rhs.get_header();
BOOST_CHECK(left_header.pack() == right_header.pack());
if (left_header.pack() != right_header.pack()) {
std::cout << "Packet Num " << packet_num << " - Header" << std::endl;
std::cout << "L: ";
print_bits<64, uint64_t>(left_header.pack());
std::cout << " | " << left_header.to_string();
std::cout << "R: ";
print_bits<64, uint64_t>(right_header.pack());
std::cout << " | " << right_header.to_string();
}
// Timestamp Comparison
BOOST_CHECK(lhs.get_timestamp() == rhs.get_timestamp());
// Payload Comparison
BOOST_CHECK(lhs.get_payload_bytes() == rhs.get_payload_bytes());
auto left_payload = lhs.get_payload_bytes();
auto right_payload = rhs.get_payload_bytes();
if (left_payload != right_payload) {
std::cout << "Packet Num " << packet_num << " - Payload" << std::endl;
for (size_t i = 0; i < std::min(left_payload.size(), right_payload.size()); i++) {
uint64_t left = left_payload[i];
uint64_t right = right_payload[i];
if (right == left) {
continue;
}
std::cout << "L " << i << ": ";
print_bits<64, uint64_t>(left);
std::cout << std::endl;
std::cout << "R " << i << ": ";
print_bits<64, uint64_t>(right);
std::cout << std::endl;
}
}
// Metadata Comparison
BOOST_CHECK(lhs.get_metadata() == rhs.get_metadata());
}
std::tuple<uint8_t*, size_t>* conversations[] = {
data_packet::peer0, data_packet::peer1, ctrl_packet::peer0, ctrl_packet::peer1};
size_t lengths[] = {data_packet::peer0_len,
data_packet::peer1_len,
ctrl_packet::peer0_len,
ctrl_packet::peer1_len};
void parse_all_packets(
std::tuple<uint8_t*, size_t>* packets, size_t packets_length, size_t conversation_num)
{
uint8_t* bytes;
size_t length;
for (size_t i = 0; i < packets_length; i++) {
BOOST_TEST_CHECKPOINT("Conversation #" << conversation_num << ", Packet #" << i);
std::tie(bytes, length) = packets[i];
chdr_util::chdr_packet generated_packet =
chdr_util::chdr_packet::deserialize(CHDR_W, bytes, bytes + length);
uint8_t packet_type = uint8_t(generated_packet.get_header().get_pkt_type());
size_t packet_size = generated_packet.get_header().get_length();
BOOST_CHECK(packet_type < 8);
BOOST_CHECK(packet_size > 0);
}
}
BOOST_AUTO_TEST_CASE(parse_all_packets_test)
{
for (size_t i = 0; i < 4; i++) {
parse_all_packets(conversations[i], lengths[i], i);
}
}
std::tuple<uint8_t*, size_t>* packet_data[] = {&ctrl_packet::peer0[19],
&ctrl_packet::peer1[17],
&ctrl_packet::peer0[2],
&ctrl_packet::peer0[3],
&ctrl_packet::peer0[6],
&data_packet::peer0[5],
&data_packet::peer0[8],
&data_packet::peer1[5],
&data_packet::peer1[29],
&data_packet::peer1[9],
&data_packet::eob_packet_data};
void serialize_deserialize_eq(chdr_util::chdr_packet& packet,
std::tuple<uint8_t*, size_t>* bytes,
size_t packet_num)
{
uint8_t* first;
uint8_t* last;
size_t len;
std::tie(first, len) = *bytes;
last = first + len;
chdr_util::chdr_packet generated_packet =
chdr_util::chdr_packet::deserialize(CHDR_W, first, last);
assert_packet_equal(generated_packet, packet, packet_num);
std::vector<uint8_t> generated_bytes =
generated_packet.serialize_to_byte_vector(uhd::ENDIANNESS_LITTLE);
BOOST_CHECK(generated_bytes.size() == len);
if (generated_bytes.size() == len) {
for (size_t i = 0; i < len; i++) {
BOOST_CHECK_MESSAGE(generated_bytes[i] == first[i], "index" << i);
}
}
}
BOOST_AUTO_TEST_CASE(serialize_deserialize_eq_test)
{
for (size_t i = 0; i < 11; i++) {
BOOST_TEST_CHECKPOINT("Packet #" << i);
serialize_deserialize_eq(packets[i], packet_data[i], i);
}
}