diff options
Diffstat (limited to 'host/tests')
| -rw-r--r-- | host/tests/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | host/tests/chdr_test.cpp | 141 | ||||
| -rw-r--r-- | host/tests/math_test.cpp | 29 | ||||
| -rw-r--r-- | host/tests/sid_t_test.cpp | 158 | 
4 files changed, 332 insertions, 1 deletions
diff --git a/host/tests/CMakeLists.txt b/host/tests/CMakeLists.txt index 62544b69b..829fb8e94 100644 --- a/host/tests/CMakeLists.txt +++ b/host/tests/CMakeLists.txt @@ -27,16 +27,19 @@ SET(test_sources      addr_test.cpp      buffer_test.cpp      byteswap_test.cpp -    convert_test.cpp      cast_test.cpp +    chdr_test.cpp +    convert_test.cpp      dict_test.cpp      error_test.cpp      fp_compare_delta_test.cpp      fp_compare_epsilon_test.cpp      gain_group_test.cpp +    math_test.cpp      msg_test.cpp      property_test.cpp      ranges_test.cpp +    sid_t_test.cpp      sph_recv_test.cpp      sph_send_test.cpp      subdev_spec_test.cpp diff --git a/host/tests/chdr_test.cpp b/host/tests/chdr_test.cpp new file mode 100644 index 000000000..8893e12e5 --- /dev/null +++ b/host/tests/chdr_test.cpp @@ -0,0 +1,141 @@ +// +// Copyright 2014 Ettus Research LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program.  If not, see <http://www.gnu.org/licenses/>. +// + +#include <uhd/transport/chdr.hpp> +#include <uhd/utils/byteswap.hpp> +#include <boost/test/unit_test.hpp> +#include <boost/format.hpp> +#include <cstdlib> +#include <iostream> + +using namespace uhd::transport::vrt; + +static void pack_and_unpack( +    if_packet_info_t &if_packet_info_in +){ +    // Temp buffer for packed packet +    boost::uint32_t packet_buff[2048] = {0}; + +    // Check input (must not be lazy) +    BOOST_REQUIRE( +        (if_packet_info_in.num_payload_words32 == 0 and if_packet_info_in.num_payload_bytes == 0) +        or +        (if_packet_info_in.num_payload_words32 != 0 and if_packet_info_in.num_payload_bytes != 0) +    ); +    if (if_packet_info_in.num_payload_words32) { +        BOOST_REQUIRE(if_packet_info_in.num_payload_bytes <= 4 * if_packet_info_in.num_payload_words32); +        BOOST_REQUIRE(if_packet_info_in.num_payload_bytes > 4*(if_packet_info_in.num_payload_words32-1)); +    } + +    //pack metadata into a vrt header +    chdr::if_hdr_pack_be( +        packet_buff, if_packet_info_in +    ); +    std::cout << std::endl; +    boost::uint32_t header_bits = (uhd::ntohx(packet_buff[0]) >> 28); +    std::cout << boost::format("header bits = 0b%d%d%d%d") % bool(header_bits & 8) %  bool(header_bits & 4) % bool(header_bits & 2) % bool(header_bits & 1) << std::endl; +    for (size_t i = 0; i < 5; i++) +    { +        std::cout << boost::format("packet_buff[%u] = 0x%08x") % i % uhd::ntohx(packet_buff[i]) << std::endl; +    } + +    if_packet_info_t if_packet_info_out; +    // Must be set a-priori as per contract +    if_packet_info_out.num_packet_words32 = if_packet_info_in.num_packet_words32; + +    //unpack the vrt header back into metadata +    chdr::if_hdr_unpack_be( +        packet_buff, if_packet_info_out +    ); + +    //check the the unpacked metadata is the same +    BOOST_CHECK_EQUAL(if_packet_info_in.packet_count, if_packet_info_out.packet_count); +    BOOST_CHECK_EQUAL(if_packet_info_in.num_header_words32, if_packet_info_out.num_header_words32); +    BOOST_CHECK_EQUAL(if_packet_info_in.num_payload_words32, if_packet_info_out.num_payload_words32); +    BOOST_CHECK(if_packet_info_out.has_sid); +    BOOST_CHECK_EQUAL(if_packet_info_in.sid, if_packet_info_out.sid); +    BOOST_CHECK(if_packet_info_out.has_sid); +    BOOST_CHECK_EQUAL(if_packet_info_in.has_tsf, if_packet_info_out.has_tsf); +    if (if_packet_info_in.has_tsf and if_packet_info_out.has_tsf){ +        BOOST_CHECK_EQUAL(if_packet_info_in.tsf, if_packet_info_out.tsf); +    } +} + +BOOST_AUTO_TEST_CASE(test_with_chdr){ +    if_packet_info_t if_packet_info; +    if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_DATA; +    if_packet_info.eob = false; +    if_packet_info.packet_count = 7; +    if_packet_info.has_tsf = true; +    if_packet_info.tsf = 0x1234567890ABCDEF; +    if_packet_info.sid = 0xAABBCCDD; +    if_packet_info.num_payload_words32 = 24; +    if_packet_info.num_payload_bytes = 95; +    pack_and_unpack(if_packet_info); +} + +BOOST_AUTO_TEST_CASE(test_with_chdr_fc){ +    if_packet_info_t if_packet_info; +    if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_FC; +    if_packet_info.eob = false; +    if_packet_info.packet_count = 19; +    if_packet_info.has_tsf = false; +    if_packet_info.tsf = 0x1234567890ABCDEF; +    if_packet_info.sid = 0xAABBCCDD; +    if_packet_info.num_payload_words32 = 4; +    if_packet_info.num_payload_bytes = 16; +    pack_and_unpack(if_packet_info); +} + +BOOST_AUTO_TEST_CASE(test_with_chdr_cmd){ +    if_packet_info_t if_packet_info; +    if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_CMD; +    if_packet_info.packet_count = 19; +    if_packet_info.has_tsf = true; +    if_packet_info.tsf = 0x1234567890ABCDEF; +    if_packet_info.sid = 0xAABBCCDD; +    if_packet_info.num_payload_words32 = 4; +    if_packet_info.num_payload_bytes = 16; +    pack_and_unpack(if_packet_info); +} + +BOOST_AUTO_TEST_CASE(test_with_chdr_resp){ +    if_packet_info_t if_packet_info; +    if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_RESP; +    if_packet_info.packet_count = 123; +    if_packet_info.has_tsf = false; +    if_packet_info.tsf = 0x1234567890ABCDEF; +    if_packet_info.sid = 0xAABBCCDD; +    if_packet_info.num_payload_words32 = 4; +    if_packet_info.num_payload_bytes = 16; +    pack_and_unpack(if_packet_info); +} + +BOOST_AUTO_TEST_CASE(test_with_chdr_err){ +    if_packet_info_t if_packet_info; +    if_packet_info.packet_type = if_packet_info_t::PACKET_TYPE_ERROR; +    if_packet_info.packet_count = 1928; +    if_packet_info.eob = false; +    if_packet_info.error = false; // Needs to be set explicitly +    if_packet_info.has_tsf = false; +    if_packet_info.tsf = 0x1234567890ABCDEF; +    if_packet_info.sid = 0xAABBCCDD; +    if_packet_info.num_payload_words32 = 4; +    if_packet_info.num_payload_bytes = 16; +    pack_and_unpack(if_packet_info); +} + diff --git a/host/tests/math_test.cpp b/host/tests/math_test.cpp new file mode 100644 index 000000000..6c890c484 --- /dev/null +++ b/host/tests/math_test.cpp @@ -0,0 +1,29 @@ +// +// Copyright 2014 Ettus Research LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program.  If not, see <http://www.gnu.org/licenses/>. +// + +#include <boost/test/unit_test.hpp> +#include <boost/cstdint.hpp> +#include <uhd/utils/math.hpp> + +// NOTE: This is not the only math test case, see e.g. special tests +// for fp comparison. + +BOOST_AUTO_TEST_CASE(test_log2){ +    double y = uhd::math::log2(16.0); +    BOOST_CHECK_EQUAL(y, 4.0); +} + diff --git a/host/tests/sid_t_test.cpp b/host/tests/sid_t_test.cpp new file mode 100644 index 000000000..71ab2c213 --- /dev/null +++ b/host/tests/sid_t_test.cpp @@ -0,0 +1,158 @@ +// +// Copyright 2014 Ettus Research LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program.  If not, see <http://www.gnu.org/licenses/>. +// + +#include <iostream> +#include <sstream> +#include <boost/test/unit_test.hpp> +#include <uhd/types/sid.hpp> +#include <uhd/exception.hpp> + +using uhd::sid_t; + +BOOST_AUTO_TEST_CASE(test_sid_t) { +    boost::uint32_t sid_value = 0x01020310; +    sid_t sid(sid_value); + +    BOOST_CHECK_EQUAL(sid.is_set(), true); +    BOOST_CHECK_EQUAL(sid.to_pp_string(), "1.2>3.16"); +    BOOST_CHECK_EQUAL(sid.to_pp_string_hex(), "01:02>03:10"); +    BOOST_CHECK_EQUAL(sid.get_src(), 0x0102); +    BOOST_CHECK_EQUAL(sid.get_dst(), 0x0310); +    BOOST_CHECK_EQUAL(sid.get_src_addr(), 0x01); +    BOOST_CHECK_EQUAL(sid.get_src_endpoint(), 0x02); +    BOOST_CHECK_EQUAL(sid.get_dst_addr(), 0x03); +    BOOST_CHECK_EQUAL(sid.get_dst_endpoint(), 0x10); +    BOOST_CHECK_EQUAL(sid == sid, true); +    BOOST_CHECK_EQUAL(sid == sid_value, true); + +    boost::uint32_t check_sid_val = (boost::uint32_t) sid; +    BOOST_CHECK_EQUAL(check_sid_val, sid_value); + +    std::stringstream ss_dec; +    ss_dec << sid; +    BOOST_CHECK_EQUAL(ss_dec.str(), "1.2>3.16"); + +    std::stringstream ss_hex; +    ss_hex << std::hex << sid; +    BOOST_CHECK_EQUAL(ss_hex.str(), "01:02>03:10"); + +    sid_t empty_sid; +    BOOST_CHECK_EQUAL(empty_sid.is_set(), false); +    BOOST_CHECK_EQUAL(empty_sid.to_pp_string(), "x.x>x.x"); +    BOOST_CHECK_EQUAL(empty_sid.to_pp_string_hex(), "xx:xx>xx:xx"); +    BOOST_CHECK_EQUAL(empty_sid == sid, false); +    BOOST_CHECK_EQUAL(empty_sid == sid_value, false); +    BOOST_CHECK_EQUAL((bool) empty_sid, false); + +    empty_sid = sid_value; // No longer empty +    BOOST_CHECK_EQUAL(empty_sid.is_set(), true); +    BOOST_CHECK_EQUAL(empty_sid == sid, true); +} + +BOOST_AUTO_TEST_CASE(test_sid_t_set) { +    boost::uint32_t sid_value = 0x0; +    sid_t sid(sid_value); + +    sid.set(0x01020304); +    BOOST_CHECK_EQUAL(sid.get(), 0x01020304); +    BOOST_CHECK_EQUAL(sid.get_src_addr(), 0x01); +    BOOST_CHECK_EQUAL(sid.get_src_endpoint(), 0x02); +    BOOST_CHECK_EQUAL(sid.get_dst_addr(), 0x03); +    BOOST_CHECK_EQUAL(sid.get_dst_endpoint(), 0x04); +    BOOST_CHECK_EQUAL(sid.get_dst_xbarport(), 0x0); +    BOOST_CHECK_EQUAL(sid.get_dst_blockport(), 0x4); + +    sid.set_src_addr(0x0a); +    BOOST_CHECK_EQUAL(sid.get(), 0x0a020304); +    BOOST_CHECK_EQUAL(sid.get_src_addr(), 0x0a); +    BOOST_CHECK_EQUAL(sid.get_src_endpoint(), 0x02); +    BOOST_CHECK_EQUAL(sid.get_dst_addr(), 0x03); +    BOOST_CHECK_EQUAL(sid.get_dst_endpoint(), 0x04); + +    sid.set_src_endpoint(0x0b); +    BOOST_CHECK_EQUAL(sid.get(), 0x0a0b0304); +    BOOST_CHECK_EQUAL(sid.get_src_addr(), 0x0a); +    BOOST_CHECK_EQUAL(sid.get_src_endpoint(), 0x0b); +    BOOST_CHECK_EQUAL(sid.get_dst_addr(), 0x03); +    BOOST_CHECK_EQUAL(sid.get_dst_endpoint(), 0x04); + +    sid.set_dst_addr(0x0c); +    BOOST_CHECK_EQUAL(sid.get(), 0x0a0b0c04); +    BOOST_CHECK_EQUAL(sid.get_src_addr(), 0x0a); +    BOOST_CHECK_EQUAL(sid.get_src_endpoint(), 0x0b); +    BOOST_CHECK_EQUAL(sid.get_dst_addr(), 0x0c); +    BOOST_CHECK_EQUAL(sid.get_dst_endpoint(), 0x04); + +    sid.set_dst_endpoint(0x0d); +    BOOST_CHECK_EQUAL(sid.get(), 0x0a0b0c0d); +    BOOST_CHECK_EQUAL(sid.get_src_addr(), 0x0a); +    BOOST_CHECK_EQUAL(sid.get_src_endpoint(), 0x0b); +    BOOST_CHECK_EQUAL(sid.get_dst_addr(), 0x0c); +    BOOST_CHECK_EQUAL(sid.get_dst_endpoint(), 0x0d); + +    sid.set_dst_xbarport(0xb); +    BOOST_CHECK_EQUAL(sid.get(), 0x0a0b0cbd); +    BOOST_CHECK_EQUAL(sid.get_src_addr(), 0x0a); +    BOOST_CHECK_EQUAL(sid.get_src_endpoint(), 0x0b); +    BOOST_CHECK_EQUAL(sid.get_dst_addr(), 0x0c); +    BOOST_CHECK_EQUAL(sid.get_dst_endpoint(), 0xbd); + +    sid.set_dst_blockport(0xc); +    BOOST_CHECK_EQUAL(sid.get(), 0x0a0b0cbc); +    BOOST_CHECK_EQUAL(sid.get_src_addr(), 0x0a); +    BOOST_CHECK_EQUAL(sid.get_src_endpoint(), 0x0b); +    BOOST_CHECK_EQUAL(sid.get_dst_addr(), 0x0c); +    BOOST_CHECK_EQUAL(sid.get_dst_endpoint(), 0xbc); + +    sid_t flipped_sid = sid.reversed(); +    BOOST_CHECK_EQUAL(flipped_sid.get(), 0x0cbc0a0b); + +    // In-place +    sid.reverse(); +    BOOST_CHECK_EQUAL(sid.get(), 0x0cbc0a0b); +} + +BOOST_AUTO_TEST_CASE(test_sid_t_from_str) { +    sid_t sid("1.2>3.4"); +    BOOST_CHECK_EQUAL(sid.get_src_addr(), 1); +    BOOST_CHECK_EQUAL(sid.get_src_endpoint(), 2); +    BOOST_CHECK_EQUAL(sid.get_dst_addr(), 3); +    BOOST_CHECK_EQUAL(sid.get_dst_endpoint(), 4); + +    sid = "01:02>03:10"; +    BOOST_CHECK_EQUAL(sid.get_src_addr(), 1); +    BOOST_CHECK_EQUAL(sid.get_src_endpoint(), 2); +    BOOST_CHECK_EQUAL(sid.get_dst_addr(), 3); +    BOOST_CHECK_EQUAL(sid.get_dst_endpoint(), 16); + +    sid = "01:06/03:10"; +    BOOST_CHECK_EQUAL(sid.get_src_addr(), 1); +    BOOST_CHECK_EQUAL(sid.get_src_endpoint(), 6); +    BOOST_CHECK_EQUAL(sid.get_dst_addr(), 3); +    BOOST_CHECK_EQUAL(sid.get_dst_endpoint(), 16); + +    sid = "01:02:04:10"; +    BOOST_CHECK_EQUAL(sid.get_src_addr(), 1); +    BOOST_CHECK_EQUAL(sid.get_src_endpoint(), 2); +    BOOST_CHECK_EQUAL(sid.get_dst_addr(), 4); +    BOOST_CHECK_EQUAL(sid.get_dst_endpoint(), 16); + +    BOOST_REQUIRE_THROW(sid_t fail_sid("foobar"), uhd::value_error); +    BOOST_REQUIRE_THROW(sid_t fail_sid("01:02:03:4"), uhd::value_error); +    BOOST_REQUIRE_THROW(sid_t fail_sid("01:02:03:004"), uhd::value_error); +    BOOST_REQUIRE_THROW(sid_t fail_sid("1.2.3.0004"), uhd::value_error); +}  | 
