aboutsummaryrefslogtreecommitdiffstats
path: root/host/tests
diff options
context:
space:
mode:
authorMartin Braun <martin.braun@ettus.com>2019-08-12 14:51:29 -0700
committerMartin Braun <martin.braun@ettus.com>2019-11-26 11:49:34 -0800
commit986316132094f2218bd6ef51a182bb2b9600c5ab (patch)
tree928c5584ccd816d20d633f33732c7186145d2d2f /host/tests
parentec991efc06676521267aa05259df59898c758338 (diff)
downloaduhd-986316132094f2218bd6ef51a182bb2b9600c5ab.tar.gz
uhd-986316132094f2218bd6ef51a182bb2b9600c5ab.tar.bz2
uhd-986316132094f2218bd6ef51a182bb2b9600c5ab.zip
rfnoc: tests: Let block unit tests use regular factory
Up until now, these unit tests were bypassing the factory, and directly linking against the relevant block factories. This can cause linker issues, but it also doesn't test code paths. This change makes the unit tests look more like the actual usage.
Diffstat (limited to 'host/tests')
-rw-r--r--host/tests/CMakeLists.txt12
-rw-r--r--host/tests/rfnoc_blocks_test.cpp90
2 files changed, 53 insertions, 49 deletions
diff --git a/host/tests/CMakeLists.txt b/host/tests/CMakeLists.txt
index 9bc267e10..643efba34 100644
--- a/host/tests/CMakeLists.txt
+++ b/host/tests/CMakeLists.txt
@@ -253,18 +253,8 @@ set_source_files_properties(
UHD_ADD_NONAPI_TEST(
TARGET rfnoc_blocks_test.cpp
EXTRA_SOURCES
- ${CMAKE_SOURCE_DIR}/lib/rfnoc/noc_block_base.cpp
- ${CMAKE_SOURCE_DIR}/lib/rfnoc/block_id.cpp
- ${CMAKE_SOURCE_DIR}/lib/utils/compat_check.cpp
- ${CMAKE_SOURCE_DIR}/lib/utils/system_time.cpp
- ${CMAKE_SOURCE_DIR}/lib/rfnoc/ddc_block_control.cpp
- ${CMAKE_SOURCE_DIR}/lib/rfnoc/duc_block_control.cpp
- ${CMAKE_SOURCE_DIR}/lib/rfnoc/null_block_control.cpp
- ${CMAKE_SOURCE_DIR}/lib/rfnoc/register_iface_holder.cpp
- ${CMAKE_SOURCE_DIR}/lib/usrp/cores/dsp_core_utils.cpp
${CMAKE_SOURCE_DIR}/lib/rfnoc/graph.cpp
- INCLUDE_DIRS
- ${CMAKE_BINARY_DIR}/lib/ic_reg_maps/
+ ${CMAKE_SOURCE_DIR}/lib/rfnoc/registry_factory.cpp
)
UHD_ADD_NONAPI_TEST(
diff --git a/host/tests/rfnoc_blocks_test.cpp b/host/tests/rfnoc_blocks_test.cpp
index 528405439..df08f15ad 100644
--- a/host/tests/rfnoc_blocks_test.cpp
+++ b/host/tests/rfnoc_blocks_test.cpp
@@ -12,6 +12,7 @@
#include <uhd/rfnoc/duc_block_control.hpp>
#include <uhd/rfnoc/null_block_control.hpp>
#include <uhdlib/rfnoc/clock_iface.hpp>
+#include <uhdlib/rfnoc/factory.hpp>
#include <uhdlib/rfnoc/graph.hpp>
#include <uhdlib/rfnoc/node_accessor.hpp>
#include <uhdlib/utils/narrow.hpp>
@@ -20,6 +21,9 @@
using namespace uhd::rfnoc;
+// Redeclare this here, since it's only defined outside of UHD_API
+noc_block_base::make_args_t::~make_args_t() = default;
+
namespace {
constexpr size_t DEFAULT_MTU = 8000;
@@ -44,35 +48,42 @@ noc_block_base::make_args_ptr make_make_args(noc_id_t noc_id,
return make_args;
}
-} // namespace
-
-#define MOCK_REGISTER(BLOCK_NAME) \
- uhd::rfnoc::noc_block_base::sptr BLOCK_NAME##_make( \
- uhd::rfnoc::noc_block_base::make_args_ptr make_args);
+noc_block_base::sptr make_block(noc_block_base::make_args_ptr&& make_args)
+{
+ try {
+ auto block_factory_info =
+ factory::get_block_factory(make_args->noc_id, ANY_DEVICE);
+ return block_factory_info.factory_fn(std::move(make_args));
+ } catch (std::out_of_range&) {
+ UHD_LOG_WARNING("TEST",
+ "Skipping tests due to Windows linker misconfiguration that needs to be "
+ "resolved.");
+ exit(0);
+ }
+}
-MOCK_REGISTER(null_block_control)
-MOCK_REGISTER(ddc_block_control)
-MOCK_REGISTER(duc_block_control)
+} // namespace
BOOST_AUTO_TEST_CASE(test_null_block)
{
node_accessor_t node_accessor{};
- constexpr size_t num_chans = 2;
- constexpr uint32_t nipc = 2;
- constexpr uint32_t item_width = 32;
- constexpr noc_id_t mock_id = 0x7E570000;
+ constexpr size_t num_chans = 2;
+ constexpr uint32_t nipc = 2;
+ constexpr uint32_t item_width = 32;
+ constexpr noc_id_t noc_id = 0x00000001;
- auto make_args = make_make_args(mock_id, "0/NullSrcSink#0", num_chans, num_chans);
+ auto make_args = make_make_args(noc_id, "0/NullSrcSink#0", num_chans, num_chans);
auto reg_iface = std::dynamic_pointer_cast<mock_reg_iface_t>(make_args->reg_iface);
auto set_mem = [&](const uint32_t addr, const uint32_t data) {
reg_iface->read_memory[addr] = data;
};
- auto get_mem = [&](const uint32_t addr) { return reg_iface->write_memory[addr]; };
+ auto get_mem = [&](const uint32_t addr) { return reg_iface->write_memory[addr]; };
auto copy_mem = [&](const uint32_t addr) { set_mem(addr, get_mem(addr)); };
set_mem(null_block_control::REG_CTRL_STATUS, (nipc << 24) | (item_width << 16));
- auto test_null = std::dynamic_pointer_cast<null_block_control>(
- null_block_control_make(std::move(make_args)));
+ auto test_null =
+ std::dynamic_pointer_cast<null_block_control>(make_block(std::move(make_args)));
+ BOOST_REQUIRE(test_null);
using uhd::stream_cmd_t;
node_accessor.init_props(test_null.get());
@@ -81,10 +92,10 @@ BOOST_AUTO_TEST_CASE(test_null_block)
stream_cmd.stream_mode = stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE;
BOOST_REQUIRE_THROW(test_null->issue_stream_cmd(stream_cmd), uhd::runtime_error);
- constexpr uint64_t snk_count = 1000000000;
+ constexpr uint64_t snk_count = 1000000000;
constexpr uint64_t snk_count_pkts = 5;
- constexpr uint64_t src_count = 2323232323;
- constexpr uint64_t loop_count = 4242424242;
+ constexpr uint64_t src_count = 2323232323;
+ constexpr uint64_t loop_count = 4242424242;
set_mem(null_block_control::REG_SNK_LINE_CNT_LO,
uhd::narrow_cast<uint32_t>(snk_count & 0xFFFFFFFF));
set_mem(null_block_control::REG_SNK_LINE_CNT_HI,
@@ -125,8 +136,8 @@ BOOST_AUTO_TEST_CASE(test_null_block)
auto sca = stream_cmd_action_info::make(stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
node_accessor.send_action(test_null.get(), {res_source_info::OUTPUT_EDGE, 0}, sca);
BOOST_CHECK_EQUAL(get_mem(null_block_control::REG_CTRL_STATUS) & 0x2, 0x2);
- BOOST_REQUIRE_THROW(
- node_accessor.send_action(test_null.get(), {res_source_info::OUTPUT_EDGE, 1}, sca),
+ BOOST_REQUIRE_THROW(node_accessor.send_action(
+ test_null.get(), {res_source_info::OUTPUT_EDGE, 1}, sca),
uhd::runtime_error);
BOOST_REQUIRE_THROW(
node_accessor.send_action(test_null.get(), {res_source_info::INPUT_EDGE, 0}, sca),
@@ -146,20 +157,22 @@ BOOST_AUTO_TEST_CASE(test_null_block)
BOOST_AUTO_TEST_CASE(test_ddc_block)
{
node_accessor_t node_accessor{};
- constexpr uint32_t num_hb = 2;
- constexpr uint32_t max_cic = 128;
- constexpr size_t num_chans = 4;
- constexpr noc_id_t mock_noc_id = 0x7E57DDC0;
- constexpr int TEST_DECIM = 20;
+ constexpr uint32_t num_hb = 2;
+ constexpr uint32_t max_cic = 128;
+ constexpr size_t num_chans = 4;
+ constexpr noc_id_t noc_id = DDC_BLOCK;
+ constexpr int TEST_DECIM = 20;
- auto ddc_make_args = make_make_args(mock_noc_id, "0/DDC#0", num_chans, num_chans);
+ auto ddc_make_args = make_make_args(noc_id, "0/DDC#0", num_chans, num_chans);
ddc_make_args->args = uhd::device_addr_t("foo=bar");
- auto ddc_reg_iface = std::dynamic_pointer_cast<mock_reg_iface_t>(ddc_make_args->reg_iface);
+ auto ddc_reg_iface =
+ std::dynamic_pointer_cast<mock_reg_iface_t>(ddc_make_args->reg_iface);
ddc_reg_iface->read_memory[ddc_block_control::RB_COMPAT_NUM] =
(ddc_block_control::MAJOR_COMPAT << 16) | ddc_block_control::MINOR_COMPAT;
ddc_reg_iface->read_memory[ddc_block_control::RB_NUM_HB] = num_hb;
ddc_reg_iface->read_memory[ddc_block_control::RB_CIC_MAX_DECIM] = max_cic;
- auto test_ddc = ddc_block_control_make(std::move(ddc_make_args));
+ auto test_ddc = make_block(std::move(ddc_make_args));
+ BOOST_REQUIRE(test_ddc);
BOOST_CHECK_EQUAL(test_ddc->get_block_args().get("foo"), "bar");
node_accessor.init_props(test_ddc.get());
@@ -177,7 +190,7 @@ BOOST_AUTO_TEST_CASE(test_ddc_block)
edge_info.src_port = 0;
edge_info.dst_port = 0;
edge_info.property_propagation_active = true;
- edge_info.edge = detail::graph_t::graph_edge_t::DYNAMIC;
+ edge_info.edge = detail::graph_t::graph_edge_t::DYNAMIC;
mock_terminator_t mock_source_term(1);
mock_terminator_t mock_sink_term(1);
@@ -213,7 +226,7 @@ BOOST_AUTO_TEST_CASE(test_ddc_block)
!= 1.0);
UHD_LOG_INFO("TEST", "Setting freq to 1/8 of input rate");
- constexpr double TEST_FREQ = 1.0/8;
+ constexpr double TEST_FREQ = 1.0 / 8;
test_ddc->set_property<double>("freq", TEST_FREQ, 0);
const uint32_t freq_word_1 =
ddc_reg_iface->write_memory.at(ddc_block_control::SR_FREQ_ADDR);
@@ -242,13 +255,13 @@ BOOST_AUTO_TEST_CASE(test_ddc_block)
BOOST_AUTO_TEST_CASE(test_duc_block)
{
node_accessor_t node_accessor{};
- constexpr uint32_t num_hb = 2;
- constexpr uint32_t max_cic = 128;
- constexpr size_t num_chans = 4;
- constexpr noc_id_t mock_noc_id = 0x7E57D0C0;
- constexpr int TEST_INTERP = 20; // 2 halfbands, CIC==5
+ constexpr uint32_t num_hb = 2;
+ constexpr uint32_t max_cic = 128;
+ constexpr size_t num_chans = 4;
+ constexpr noc_id_t noc_id = DUC_BLOCK;
+ constexpr int TEST_INTERP = 20; // 2 halfbands, CIC==5
- auto duc_make_args = make_make_args(mock_noc_id, "0/DUC#0", num_chans, num_chans);
+ auto duc_make_args = make_make_args(noc_id, "0/DUC#0", num_chans, num_chans);
duc_make_args->args = uhd::device_addr_t();
auto duc_reg_iface =
std::dynamic_pointer_cast<mock_reg_iface_t>(duc_make_args->reg_iface);
@@ -256,7 +269,8 @@ BOOST_AUTO_TEST_CASE(test_duc_block)
(duc_block_control::MAJOR_COMPAT << 16) | duc_block_control::MINOR_COMPAT;
duc_reg_iface->read_memory[duc_block_control::RB_NUM_HB] = num_hb;
duc_reg_iface->read_memory[duc_block_control::RB_CIC_MAX_INTERP] = max_cic;
- auto test_duc = duc_block_control_make(std::move(duc_make_args));
+ auto test_duc = make_block(std::move(duc_make_args));
+ BOOST_REQUIRE(test_duc);
node_accessor.init_props(test_duc.get());
UHD_LOG_DEBUG("TEST", "Init done.");