aboutsummaryrefslogtreecommitdiffstats
path: root/host/tests/discoverable_feature_test.cpp
diff options
context:
space:
mode:
authorLane Kolbly <lane.kolbly@ni.com>2020-06-22 17:22:56 -0500
committerAaron Rossetto <aaron.rossetto@ni.com>2020-06-25 13:36:08 -0500
commite9ae5fb949903cce1720b75b894401930cce1ebe (patch)
tree218233fd572d6318fcdfb6e661eae74fe88e485a /host/tests/discoverable_feature_test.cpp
parente08830cbe5609645462190aa0c1a9e234353f38a (diff)
downloaduhd-e9ae5fb949903cce1720b75b894401930cce1ebe.tar.gz
uhd-e9ae5fb949903cce1720b75b894401930cce1ebe.tar.bz2
uhd-e9ae5fb949903cce1720b75b894401930cce1ebe.zip
uhd: Add discoverable_features API
The "discoverable features" API handles how clients access the myriad features we offer, without simply adding a million has_FOO and do_FOO methods to radio_control and multi_usrp. discoverable_features allows clients to query the existance of, enumerate, and ultimately they get (by enum or by type) an object which implements their wanted feature.
Diffstat (limited to 'host/tests/discoverable_feature_test.cpp')
-rw-r--r--host/tests/discoverable_feature_test.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/host/tests/discoverable_feature_test.cpp b/host/tests/discoverable_feature_test.cpp
new file mode 100644
index 000000000..b75cb76f3
--- /dev/null
+++ b/host/tests/discoverable_feature_test.cpp
@@ -0,0 +1,111 @@
+//
+// Copyright 2020 Ettus Research, a National Instruments Brand
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+
+#include <uhd/features/discoverable_feature_getter_iface.hpp>
+#include <boost/test/unit_test.hpp>
+#include <iostream>
+
+using namespace uhd::features;
+
+class test_feature0 : public discoverable_feature
+{
+public:
+ static discoverable_feature::feature_id_t get_feature_id()
+ {
+ return discoverable_feature::RESERVED0;
+ }
+
+ std::string get_feature_name() const override
+ {
+ return "test_feature0";
+ }
+};
+
+class test_feature1 : public discoverable_feature
+{
+public:
+ static discoverable_feature::feature_id_t get_feature_id()
+ {
+ return discoverable_feature::RESERVED1;
+ }
+
+ std::string get_feature_name() const override
+ {
+ return "test_feature1";
+ }
+};
+
+class test_feature_getter : public discoverable_feature_getter_iface
+{
+public:
+ test_feature_getter(bool feature0_enabled, bool feature1_enabled)
+ {
+ if (feature0_enabled)
+ _test_feature0.reset(new test_feature0());
+ if (feature1_enabled)
+ _test_feature1.reset(new test_feature1);
+ }
+
+ std::vector<std::string> enumerate_features() override
+ {
+ std::vector<std::string> features;
+ if (_test_feature0)
+ features.push_back(_test_feature0->get_feature_name());
+ if (_test_feature1)
+ features.push_back(_test_feature1->get_feature_name());
+ return features;
+ }
+
+private:
+ discoverable_feature::sptr get_feature_ptr(
+ discoverable_feature::feature_id_t feature_id) override
+ {
+ switch (feature_id) {
+ case discoverable_feature::RESERVED0:
+ return _test_feature0;
+ case discoverable_feature::RESERVED1:
+ return _test_feature1;
+ default:
+ return discoverable_feature::sptr();
+ };
+ }
+
+ discoverable_feature::sptr _test_feature0;
+ discoverable_feature::sptr _test_feature1;
+};
+
+BOOST_AUTO_TEST_CASE(test_has_feature_works)
+{
+ test_feature_getter feature_getter(true, false);
+ BOOST_CHECK_EQUAL(feature_getter.has_feature<test_feature0>(), true);
+ BOOST_CHECK_EQUAL(feature_getter.has_feature<test_feature1>(), false);
+}
+
+BOOST_AUTO_TEST_CASE(test_enumerate_feature_works)
+{
+ test_feature_getter feature_getter(true, true);
+ const auto features = feature_getter.enumerate_features();
+
+ // Note that ordering isn't strictly a requirement of the interface,
+ // we just leverage that here to demonstrate API usage concisely.
+ BOOST_CHECK_EQUAL(features[0], "test_feature0");
+ BOOST_CHECK_EQUAL(features[1], "test_feature1");
+}
+
+BOOST_AUTO_TEST_CASE(test_get_feature_works)
+{
+ test_feature_getter feature_getter(true, true);
+ const auto f0 = feature_getter.get_feature<test_feature0>();
+ const auto f1 = feature_getter.get_feature<test_feature1>();
+ BOOST_CHECK_EQUAL(f0.get_feature_name(), "test_feature0");
+ BOOST_CHECK_EQUAL(f1.get_feature_name(), "test_feature1");
+}
+
+BOOST_AUTO_TEST_CASE(test_get_feature_throws)
+{
+ test_feature_getter feature_getter(false, true);
+ BOOST_CHECK_THROW(feature_getter.get_feature<test_feature0>(), std::exception);
+}