summaryrefslogtreecommitdiffstats
path: root/host/tests
diff options
context:
space:
mode:
Diffstat (limited to 'host/tests')
-rw-r--r--host/tests/CMakeLists.txt2
-rw-r--r--host/tests/property_test.cpp175
-rw-r--r--host/tests/sph_recv_test.cpp3
-rw-r--r--host/tests/tune_helper_test.cpp251
4 files changed, 177 insertions, 254 deletions
diff --git a/host/tests/CMakeLists.txt b/host/tests/CMakeLists.txt
index b7bcfb7d5..c97116233 100644
--- a/host/tests/CMakeLists.txt
+++ b/host/tests/CMakeLists.txt
@@ -27,12 +27,12 @@ SET(test_sources
error_test.cpp
gain_group_test.cpp
msg_test.cpp
+ property_test.cpp
ranges_test.cpp
sph_recv_test.cpp
sph_send_test.cpp
subdev_spec_test.cpp
time_spec_test.cpp
- tune_helper_test.cpp
vrt_test.cpp
wax_test.cpp
)
diff --git a/host/tests/property_test.cpp b/host/tests/property_test.cpp
new file mode 100644
index 000000000..04d3a831c
--- /dev/null
+++ b/host/tests/property_test.cpp
@@ -0,0 +1,175 @@
+//
+// Copyright 2011 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 <uhd/property_tree.hpp>
+#include <boost/bind.hpp>
+#include <exception>
+#include <iostream>
+
+struct coercer_type{
+ int doit(int x){
+ return x & ~0x3;
+ }
+};
+
+struct setter_type{
+ void doit(int x){
+ _x = x;
+ }
+
+ int _x;
+};
+
+struct getter_type{
+ int doit(void){
+ return _x;
+ }
+
+ int _x;
+};
+
+BOOST_AUTO_TEST_CASE(test_prop_simple){
+ uhd::property_tree::sptr tree = uhd::property_tree::make();
+ uhd::property<int> &prop = tree->create<int>("/");
+
+ BOOST_CHECK(prop.empty());
+ prop.set(0);
+ BOOST_CHECK(not prop.empty());
+
+ prop.set(42);
+ BOOST_CHECK_EQUAL(prop.get(), 42);
+ prop.set(34);
+ BOOST_CHECK_EQUAL(prop.get(), 34);
+}
+
+BOOST_AUTO_TEST_CASE(test_prop_with_subscriber){
+ uhd::property_tree::sptr tree = uhd::property_tree::make();
+ uhd::property<int> &prop = tree->create<int>("/");
+
+ setter_type setter;
+ prop.subscribe(boost::bind(&setter_type::doit, &setter, _1));
+
+ prop.set(42);
+ BOOST_CHECK_EQUAL(prop.get(), 42);
+ BOOST_CHECK_EQUAL(setter._x, 42);
+
+ prop.set(34);
+ BOOST_CHECK_EQUAL(prop.get(), 34);
+ BOOST_CHECK_EQUAL(setter._x, 34);
+}
+
+BOOST_AUTO_TEST_CASE(test_prop_with_publisher){
+ uhd::property_tree::sptr tree = uhd::property_tree::make();
+ uhd::property<int> &prop = tree->create<int>("/");
+
+ BOOST_CHECK(prop.empty());
+ getter_type getter;
+ prop.publish(boost::bind(&getter_type::doit, &getter));
+ BOOST_CHECK(not prop.empty());
+
+ getter._x = 42;
+ prop.set(0); //should not change
+ BOOST_CHECK_EQUAL(prop.get(), 42);
+
+ getter._x = 34;
+ prop.set(0); //should not change
+ BOOST_CHECK_EQUAL(prop.get(), 34);
+}
+
+BOOST_AUTO_TEST_CASE(test_prop_with_publisher_and_subscriber){
+ uhd::property_tree::sptr tree = uhd::property_tree::make();
+ uhd::property<int> &prop = tree->create<int>("/");
+
+ getter_type getter;
+ prop.publish(boost::bind(&getter_type::doit, &getter));
+
+ setter_type setter;
+ prop.subscribe(boost::bind(&setter_type::doit, &setter, _1));
+
+ getter._x = 42;
+ prop.set(0);
+ BOOST_CHECK_EQUAL(prop.get(), 42);
+ BOOST_CHECK_EQUAL(setter._x, 0);
+
+ getter._x = 34;
+ prop.set(1);
+ BOOST_CHECK_EQUAL(prop.get(), 34);
+ BOOST_CHECK_EQUAL(setter._x, 1);
+}
+
+BOOST_AUTO_TEST_CASE(test_prop_with_coercion){
+ uhd::property_tree::sptr tree = uhd::property_tree::make();
+ uhd::property<int> &prop = tree->create<int>("/");
+
+ setter_type setter;
+ prop.subscribe(boost::bind(&setter_type::doit, &setter, _1));
+
+ coercer_type coercer;
+ prop.coerce(boost::bind(&coercer_type::doit, &coercer, _1));
+
+ prop.set(42);
+ BOOST_CHECK_EQUAL(prop.get(), 40);
+ BOOST_CHECK_EQUAL(setter._x, 40);
+
+ prop.set(34);
+ BOOST_CHECK_EQUAL(prop.get(), 32);
+ BOOST_CHECK_EQUAL(setter._x, 32);
+}
+
+BOOST_AUTO_TEST_CASE(test_prop_tree){
+ uhd::property_tree::sptr tree = uhd::property_tree::make();
+
+ tree->create<int>("/test/prop0");
+ tree->create<int>("/test/prop1");
+
+ BOOST_CHECK(tree->exists("/test"));
+ BOOST_CHECK_THROW(tree->access<int>("/test"), std::exception);
+ BOOST_CHECK(tree->exists("/test/prop0"));
+ BOOST_CHECK(tree->exists("/test/prop1"));
+
+ tree->access<int>("/test/prop0").set(42);
+ tree->access<int>("/test/prop1").set(34);
+
+ BOOST_CHECK_EQUAL(tree->access<int>("/test/prop0").get(), 42);
+ BOOST_CHECK_EQUAL(tree->access<int>("/test/prop1").get(), 34);
+
+ tree->remove("/test/prop0");
+ BOOST_CHECK(not tree->exists("/test/prop0"));
+ BOOST_CHECK(tree->exists("/test/prop1"));
+
+ tree->remove("/test");
+ BOOST_CHECK(not tree->exists("/test/prop0"));
+ BOOST_CHECK(not tree->exists("/test/prop1"));
+
+}
+
+BOOST_AUTO_TEST_CASE(test_prop_subtree){
+ uhd::property_tree::sptr tree = uhd::property_tree::make();
+ tree->create<int>("/subdir1/subdir2");
+
+ uhd::property_tree::sptr subtree1 = tree->subtree("/");
+ const std::vector<std::string> tree_dirs1 = tree->list("/");
+ const std::vector<std::string> subtree1_dirs = subtree1->list("");
+ BOOST_CHECK_EQUAL_COLLECTIONS(tree_dirs1.begin(), tree_dirs1.end(), subtree1_dirs.begin(), subtree1_dirs.end());
+
+ uhd::property_tree::sptr subtree2 = subtree1->subtree("subdir1");
+ const std::vector<std::string> tree_dirs2 = tree->list("/subdir1");
+ const std::vector<std::string> subtree2_dirs = subtree2->list("");
+ BOOST_CHECK_EQUAL_COLLECTIONS(tree_dirs2.begin(), tree_dirs2.end(), subtree2_dirs.begin(), subtree2_dirs.end());
+
+}
diff --git a/host/tests/sph_recv_test.cpp b/host/tests/sph_recv_test.cpp
index cd33452c6..1387e3b66 100644
--- a/host/tests/sph_recv_test.cpp
+++ b/host/tests/sph_recv_test.cpp
@@ -290,6 +290,7 @@ BOOST_AUTO_TEST_CASE(test_sph_recv_one_channel_inline_message){
//generate a bunch of packets
for (size_t i = 0; i < NUM_PKTS_TO_TEST; i++){
+ ifpi.packet_type = uhd::transport::vrt::if_packet_info_t::PACKET_TYPE_DATA;
ifpi.num_payload_words32 = 10 + i%10;
dummy_recv_xport.push_back_packet(ifpi);
ifpi.packet_count++;
@@ -300,8 +301,6 @@ BOOST_AUTO_TEST_CASE(test_sph_recv_one_channel_inline_message){
ifpi.packet_type = uhd::transport::vrt::if_packet_info_t::PACKET_TYPE_EXTENSION;
ifpi.num_payload_words32 = 1;
dummy_recv_xport.push_back_packet(ifpi, uhd::rx_metadata_t::ERROR_CODE_OVERFLOW);
- ifpi.packet_count++;
- ifpi.packet_type = uhd::transport::vrt::if_packet_info_t::PACKET_TYPE_DATA;
}
}
diff --git a/host/tests/tune_helper_test.cpp b/host/tests/tune_helper_test.cpp
deleted file mode 100644
index 9147cd310..000000000
--- a/host/tests/tune_helper_test.cpp
+++ /dev/null
@@ -1,251 +0,0 @@
-//
-// Copyright 2010-2011 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 <uhd/usrp/tune_helper.hpp>
-#include <uhd/usrp/subdev_props.hpp>
-#include <uhd/usrp/dsp_props.hpp>
-#include <uhd/usrp/dsp_utils.hpp>
-#include <iostream>
-
-using namespace uhd;
-using namespace uhd::usrp;
-
-/***********************************************************************
- * Dummy properties objects
- **********************************************************************/
-class dummy_subdev : public wax::obj{
-public:
- dummy_subdev(double resolution):
- _resolution(resolution)
- {
- /* NOP */
- }
-private:
- void get(const wax::obj &key, wax::obj &val){
- switch(key.as<subdev_prop_t>()){
-
- case SUBDEV_PROP_FREQ:
- val = _freq;
- return;
-
- case SUBDEV_PROP_USE_LO_OFFSET:
- val = false;
- return;
-
- default: UHD_THROW_PROP_GET_ERROR();
- }
- }
-
- void set(const wax::obj &key, const wax::obj &val){
- switch(key.as<subdev_prop_t>()){
- case SUBDEV_PROP_FREQ:
- _freq = _resolution*int(val.as<double>()/_resolution);
- return;
-
- default: UHD_THROW_PROP_SET_ERROR();
- }
- }
-
- double _freq, _resolution;
-};
-
-class dummy_subdev_basic : public wax::obj{
-private:
- void get(const wax::obj &key, wax::obj &val){
- switch(key.as<subdev_prop_t>()){
-
- case SUBDEV_PROP_FREQ:
- val = double(0.0); //always zero
- return;
-
- case SUBDEV_PROP_USE_LO_OFFSET:
- val = false;
- return;
-
- default: UHD_THROW_PROP_GET_ERROR();
- }
- }
-
- void set(const wax::obj &key, const wax::obj &){
- switch(key.as<subdev_prop_t>()){
- case SUBDEV_PROP_FREQ:
- // do nothing
- return;
-
- default: UHD_THROW_PROP_SET_ERROR();
- }
- }
-};
-
-class dummy_subdev_bw : public wax::obj{
-private:
- void get(const wax::obj &key, wax::obj &val){
- switch(key.as<subdev_prop_t>()){
-
- case SUBDEV_PROP_FREQ:
- val = _freq;
- return;
-
- case SUBDEV_PROP_USE_LO_OFFSET:
- val = true;
- return;
-
- case SUBDEV_PROP_BANDWIDTH:
- val = _bandwidth;
- return;
-
- default: UHD_THROW_PROP_GET_ERROR();
- }
- }
-
- void set(const wax::obj &key, const wax::obj &val){
- switch(key.as<subdev_prop_t>()){
- case SUBDEV_PROP_FREQ:
- _freq = val.as<double>();
- return;
-
- case SUBDEV_PROP_BANDWIDTH:
- _bandwidth = val.as<double>();
- return;
-
- default: UHD_THROW_PROP_SET_ERROR();
- }
- }
-
- double _freq, _bandwidth;
-};
-
-class dummy_dsp : public wax::obj{
-public:
- dummy_dsp(double codec_rate):
- _codec_rate(codec_rate)
- {
- /* NOP */
- }
-private:
- void get(const wax::obj &key_, wax::obj &val){
- named_prop_t key = named_prop_t::extract(key_);
- switch(key.as<dsp_prop_t>()){
- case DSP_PROP_CODEC_RATE:
- val = _codec_rate;
- return;
-
- case DSP_PROP_HOST_RATE:
- val = _host_rate;
- return;
-
- case DSP_PROP_FREQ_SHIFT:
- val = _freq_shift;
- return;
-
- default: UHD_THROW_PROP_GET_ERROR();
- }
- }
-
- void set(const wax::obj &key_, const wax::obj &val){
- named_prop_t key = named_prop_t::extract(key_);
- switch(key.as<dsp_prop_t>()){
- case DSP_PROP_FREQ_SHIFT:
- _freq_shift = val.as<double>();
- dsp_type1::calc_cordic_word_and_update(_freq_shift, _codec_rate);
- return;
-
- case DSP_PROP_HOST_RATE:
- _host_rate = val.as<double>();
- return;
-
- default: UHD_THROW_PROP_SET_ERROR();
- }
- }
-
- double _codec_rate, _freq_shift, _host_rate;
-};
-
-/***********************************************************************
- * Test cases
- **********************************************************************/
-static const double tolerance = 0.001;
-
-BOOST_AUTO_TEST_CASE(test_tune_helper_rx){
- dummy_subdev subdev(1e6);
- dummy_dsp dsp(100e6);
-
- std::cout << "Testing tune helper RX automatic IF offset" << std::endl;
- tune_result_t tr = tune_rx_subdev_and_dsp(subdev.get_link(), dsp.get_link(), 2.3451e9);
- std::cout << tr.to_pp_string() << std::endl;
- BOOST_CHECK_CLOSE(tr.actual_rf_freq, 2.345e9, tolerance);
- BOOST_CHECK_CLOSE(tr.actual_dsp_freq, -100e3, tolerance);
-
- double freq_derived = derive_freq_from_rx_subdev_and_dsp(subdev.get_link(), dsp.get_link());
- BOOST_CHECK_CLOSE(freq_derived, 2.3451e9, tolerance);
-}
-
-BOOST_AUTO_TEST_CASE(test_tune_helper_tx){
- dummy_subdev subdev(1e6);
- dummy_dsp dsp(100e6);
-
- std::cout << "Testing tune helper TX automatic IF offset" << std::endl;
- tune_result_t tr = tune_tx_subdev_and_dsp(subdev.get_link(), dsp.get_link(), 2.3451e9);
- std::cout << tr.to_pp_string() << std::endl;
- BOOST_CHECK_CLOSE(tr.actual_rf_freq, 2.345e9, tolerance);
- BOOST_CHECK_CLOSE(tr.actual_dsp_freq, 100e3, tolerance);
-
- double freq_derived = derive_freq_from_tx_subdev_and_dsp(subdev.get_link(), dsp.get_link());
- BOOST_CHECK_CLOSE(freq_derived, 2.3451e9, tolerance);
-}
-
-BOOST_AUTO_TEST_CASE(test_tune_helper_rx_nyquist){
- dummy_subdev_basic subdev;
- dummy_dsp dsp(100e6);
-
- std::cout << "Testing tune helper RX dummy basic board" << std::endl;
- tune_result_t tr = tune_rx_subdev_and_dsp(subdev.get_link(), dsp.get_link(), 55e6);
- std::cout << tr.to_pp_string() << std::endl;
- BOOST_CHECK_CLOSE(tr.actual_rf_freq, 0.0, tolerance);
- BOOST_CHECK_CLOSE(tr.actual_dsp_freq, 45e6, tolerance);
-
- double freq_derived = derive_freq_from_rx_subdev_and_dsp(subdev.get_link(), dsp.get_link());
- BOOST_CHECK_CLOSE(freq_derived, -45e6, tolerance);
-}
-
-BOOST_AUTO_TEST_CASE(test_tune_helper_rx_lo_off){
- dummy_subdev_bw subdev;
- dummy_dsp dsp(100e6);
- tune_result_t tr;
-
- std::cout << "Testing tune helper RX automatic LO offset B >> fs" << std::endl;
- subdev[SUBDEV_PROP_BANDWIDTH] = double(40e6);
- dsp[DSP_PROP_HOST_RATE] = double(4e6);
- tr = tune_rx_subdev_and_dsp(subdev.get_link(), dsp.get_link(), 2.45e9);
- std::cout << tr.to_pp_string() << std::endl;
- BOOST_CHECK_CLOSE(tr.actual_rf_freq, 2.45e9+4e6/2, tolerance);
-
- std::cout << "Testing tune helper RX automatic LO offset B > fs" << std::endl;
- subdev[SUBDEV_PROP_BANDWIDTH] = double(40e6);
- dsp[DSP_PROP_HOST_RATE] = double(25e6);
- tr = tune_rx_subdev_and_dsp(subdev.get_link(), dsp.get_link(), 2.45e9);
- std::cout << tr.to_pp_string() << std::endl;
- BOOST_CHECK_CLOSE(tr.actual_rf_freq, 2.45e9+(40e6-25e6)/2, tolerance);
-
- std::cout << "Testing tune helper RX automatic LO offset B < fs" << std::endl;
- subdev[SUBDEV_PROP_BANDWIDTH] = double(20e6);
- dsp[DSP_PROP_HOST_RATE] = double(25e6);
- tr = tune_rx_subdev_and_dsp(subdev.get_link(), dsp.get_link(), 2.45e9);
- std::cout << tr.to_pp_string() << std::endl;
- BOOST_CHECK_CLOSE(tr.actual_rf_freq, 2.45e9, tolerance);
-}