summaryrefslogtreecommitdiff
path: root/mblock/src/lib/qa_mblock_prims.cc
diff options
context:
space:
mode:
Diffstat (limited to 'mblock/src/lib/qa_mblock_prims.cc')
-rw-r--r--mblock/src/lib/qa_mblock_prims.cc448
1 files changed, 0 insertions, 448 deletions
diff --git a/mblock/src/lib/qa_mblock_prims.cc b/mblock/src/lib/qa_mblock_prims.cc
deleted file mode 100644
index e49bd60d4d..0000000000
--- a/mblock/src/lib/qa_mblock_prims.cc
+++ /dev/null
@@ -1,448 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2006,2007,2008 Free Software Foundation, Inc.
- *
- * This file is part of GNU Radio
- *
- * GNU Radio 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, or (at your option)
- * any later version.
- *
- * GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <qa_mblock_prims.h>
-#include <cppunit/TestAssert.h>
-#include <mblock/mblock.h>
-#include <mblock/runtime.h>
-#include <mblock/protocol_class.h>
-#include <mblock/exception.h>
-#include <mblock/msg_queue.h>
-#include <mblock/message.h>
-#include <mb_mblock_impl.h>
-#include <mblock/msg_accepter.h>
-#include <mblock/class_registry.h>
-#include <stdio.h>
-
-using namespace pmt;
-
-static pmt_t s_cs = pmt_intern("cs");
-static pmt_t s_debug = pmt_intern("debug");
-static pmt_t s_in = pmt_intern("in");
-static pmt_t s_out = pmt_intern("out");
-
-
-// ================================================================
-
-class dp_1 : public mb_mblock
-{
-public:
- dp_1(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg);
- ~dp_1();
-};
-
-dp_1::dp_1(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg)
- : mb_mblock(runtime, instance_name, user_arg)
-{
-}
-
-dp_1::~dp_1(){}
-
-REGISTER_MBLOCK_CLASS(dp_1);
-
-// ----------------------------------------------------------------
-
-class dp_2 : public mb_mblock
-{
-public:
- dp_2(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg);
- ~dp_2();
-};
-
-dp_2::dp_2(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg)
- : mb_mblock(runtime, instance_name, user_arg)
-{
- define_port("cs", "cs-protocol", false, mb_port::EXTERNAL);
-}
-
-dp_2::~dp_2(){}
-
-REGISTER_MBLOCK_CLASS(dp_2);
-
-// ----------------------------------------------------------------
-
-class dp_3 : public mb_mblock
-{
-public:
- dp_3(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg);
- ~dp_3();
-};
-
-dp_3::dp_3(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg)
- : mb_mblock(runtime, instance_name, user_arg)
-{
- define_port("cs", "cs-protocol", false, mb_port::EXTERNAL);
- define_port("cs", "cs-protocol", false, mb_port::EXTERNAL); // duplicate def
-}
-
-dp_3::~dp_3(){}
-
-REGISTER_MBLOCK_CLASS(dp_3);
-
-// ----------------------------------------------------------------
-
-void
-qa_mblock_prims::test_define_ports()
-{
-
- mb_runtime_sptr rts = mb_make_runtime();
- mb_runtime *rt = rts.get();
-
- // Should work
- mb_mblock_sptr mb1 = mb_mblock_sptr(new dp_1(rt, "top", PMT_F));
-
- // raises runtime_error because of unknown protocol "cs-protocol"
- CPPUNIT_ASSERT_THROW(mb_mblock_sptr(new dp_2(rt, "top", PMT_F)),
- std::runtime_error);
-
- // define the protocol class
- pmt_t pc = mb_make_protocol_class(pmt_intern("cs-protocol"),
- pmt_list2(pmt_intern("start"),
- pmt_intern("stop")),
- PMT_NIL);
-
- // std::cout << "pc = " << pc << '\n';
-
- mb_mblock_sptr mb2 = mb_mblock_sptr(new dp_2(rt, "top", PMT_F));
-
- // raises pmt_exception because of duplicate port definition of "cs"
- CPPUNIT_ASSERT_THROW(mb_mblock_sptr(new dp_3(rt, "top", PMT_F)),
- mbe_duplicate_port);
-}
-
-// ================================================================
-
-class dc_0 : public mb_mblock
-{
-public:
- dc_0(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg);
- ~dc_0();
-};
-
-dc_0::dc_0(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg)
- : mb_mblock(runtime, instance_name, user_arg)
-{
-}
-
-dc_0::~dc_0() {}
-
-REGISTER_MBLOCK_CLASS(dc_0);
-
-// ----------------------------------------------------------------
-
-class dc_ok : public mb_mblock
-{
-public:
- dc_ok(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg);
- ~dc_ok();
-};
-
-dc_ok::dc_ok(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg)
- : mb_mblock(runtime, instance_name, user_arg)
-{
- define_component("c0", "dc_0");
- define_component("c1", "dc_0");
- define_component("c2", "dc_0");
-}
-
-dc_ok::~dc_ok(){}
-
-REGISTER_MBLOCK_CLASS(dc_ok);
-
-// ----------------------------------------------------------------
-
-class dc_not_ok : public mb_mblock
-{
-public:
- dc_not_ok(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg);
- ~dc_not_ok();
-};
-
-dc_not_ok::dc_not_ok(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg)
- : mb_mblock(runtime, instance_name, user_arg)
-{
- define_component("c0", "dc_0");
- define_component("c0", "dc_0"); // duplicate name
-}
-
-dc_not_ok::~dc_not_ok(){}
-
-REGISTER_MBLOCK_CLASS(dc_not_ok);
-
-// ----------------------------------------------------------------
-
-void
-qa_mblock_prims::test_define_components()
-{
- mb_runtime_sptr rts = mb_make_runtime();
- mb_runtime *rt = rts.get();
-
- // Should work
- mb_mblock_sptr mb1 = mb_mblock_sptr(new dc_ok(rt, "top", PMT_F));
-
- // raises pmt_exception because of duplicate component definition of "c0"
- CPPUNIT_ASSERT_THROW(mb_mblock_sptr(new dc_not_ok(rt, "top", PMT_F)),
- mbe_duplicate_component);
-}
-
-// ================================================================
-
-class tc_norm : public mb_mblock
-{
-public:
- tc_norm(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg)
- : mb_mblock(runtime, instance_name, user_arg)
- {
- define_port("data", "i/o", false, mb_port::EXTERNAL);
- define_port("norm", "i/o", false, mb_port::EXTERNAL);
- define_port("conj", "i/o", true, mb_port::EXTERNAL);
- define_port("int", "i/o", false, mb_port::INTERNAL);
- }
-
- ~tc_norm();
-};
-
-tc_norm::~tc_norm(){}
-
-REGISTER_MBLOCK_CLASS(tc_norm);
-
-////////////////////////////////////////////////////////////////
-
-class tc_0 : public mb_mblock
-{
-public:
- tc_0(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg)
- : mb_mblock(runtime, instance_name, user_arg)
- {
- define_port("norm", "i/o", false, mb_port::EXTERNAL);
- define_port("conj", "i/o", true, mb_port::EXTERNAL);
- define_port("int", "i/o", false, mb_port::INTERNAL);
-
- define_component("c0", "tc_norm");
- define_component("c1", "tc_norm");
- define_component("c2", "tc_norm");
- define_component("c3", "tc_norm");
- define_component("c4", "tc_norm");
- define_component("c5", "tc_norm");
-
- // OK
- connect("c0", "norm", "c1", "conj");
-
- // No: No such component name
- CPPUNIT_ASSERT_THROW(connect("foo", "data", "c1", "norm"), mbe_no_such_component);
-
- // No: No such port name
- CPPUNIT_ASSERT_THROW(connect("c0", "data", "c1", "foo"), mbe_no_such_port);
-
- // No: already connected
- CPPUNIT_ASSERT_THROW(connect("c0", "norm", "c2", "data"), mbe_already_connected);
-
- // No: already connected
- CPPUNIT_ASSERT_THROW(connect("c2", "data", "c0", "norm"), mbe_already_connected);
-
- // No: incompatible ports
- CPPUNIT_ASSERT_THROW(connect("c1", "norm", "c2", "norm"), mbe_incompatible_ports);
-
- // OK
- connect("c1", "norm", "c2", "conj");
-
- // No: No such port name
- CPPUNIT_ASSERT_THROW(connect("c2", "norm", "self", "foo"), mbe_no_such_port);
-
- // No: can't connect to child's internal port
- CPPUNIT_ASSERT_THROW(connect("c0", "conj", "c2", "int"), mbe_no_such_port);
-
- // No: can't connect to our own external port
- CPPUNIT_ASSERT_THROW(connect("self", "norm", "c0", "conj"), mbe_invalid_port_type);
-
- // OK: connecting to one of our internal ports
- connect("self", "int", "c3", "conj");
-
- // ===== Now test disconnecting some stuff =====
-
- // Confirm we're already connected
- CPPUNIT_ASSERT_THROW(connect("self", "int", "c3", "conj"), mbe_already_connected);
-
- int nc = nconnections();
- disconnect("self", "int", "c3", "conj"); // disconnect
- CPPUNIT_ASSERT_EQUAL(nc-1, nconnections());
-
- connect("self", "int", "c3", "conj"); // reconnect
- CPPUNIT_ASSERT_EQUAL(nc, nconnections());
-
- // confirm we're already connected
- CPPUNIT_ASSERT_THROW(connect("self", "int", "c3", "conj"), mbe_already_connected);
-
-
- connect("c0", "conj", "c5", "data");
- connect("c4", "norm", "c5", "conj");
- connect("c4", "conj", "c5", "norm");
-
- nc = nconnections();
- disconnect_component("c4");
- CPPUNIT_ASSERT_EQUAL(nc-2, nconnections());
-
- disconnect_component("c5");
- CPPUNIT_ASSERT_EQUAL(nc-3, nconnections());
-
- disconnect_all();
- CPPUNIT_ASSERT_EQUAL(0, nconnections());
-
- }
-
- ~tc_0();
-};
-
-tc_0::~tc_0(){}
-
-REGISTER_MBLOCK_CLASS(tc_0);
-
-////////////////////////////////////////////////////////////////
-
-class tc_1 : public mb_mblock
-{
-public:
- tc_1(mb_runtime *runtime, const std::string &instance_name, pmt_t user_arg)
- : mb_mblock(runtime, instance_name, user_arg)
- {
- define_component("c0", "tc_norm");
- define_component("c1", "tc_norm");
-
- connect("c0", "norm", "c1", "conj");
- }
-
- ~tc_1();
-};
-
-tc_1::~tc_1(){}
-
-REGISTER_MBLOCK_CLASS(tc_1);
-
-////////////////////////////////////////////////////////////////
-
-void
-qa_mblock_prims::test_connect()
-{
- // define the protocol class
- mb_make_protocol_class(pmt_intern("data"), // name of class
- pmt_list1(pmt_intern("data")), // in
- PMT_NIL); // out
-
- mb_make_protocol_class(pmt_intern("i/o"), // name of class
- pmt_list1(pmt_intern("in")), // in
- pmt_list1(pmt_intern("out"))); // out
-
- mb_runtime_sptr rts = mb_make_runtime();
- mb_runtime *rt = rts.get();
-
- mb_mblock_sptr mb0 = mb_mblock_sptr(new tc_0(rt, "top", PMT_F));
-}
-
-////////////////////////////////////////////////////////////////
-
-void
-qa_mblock_prims::test_msg_queue()
-{
- mb_msg_queue q;
-
- // check initial state
- CPPUNIT_ASSERT(q.get_highest_pri_msg_nowait() == 0);
-
- CPPUNIT_ASSERT(MB_NPRI >= 5); // sanity check for this test
-
- // insert three messages at the same pri and ensure that they come out in order
- // signal data metadata pri
- q.insert(mb_make_message(PMT_NIL, pmt_from_long(0), PMT_NIL, MB_PRI_BEST + 2));
- q.insert(mb_make_message(PMT_NIL, pmt_from_long(1), PMT_NIL, MB_PRI_BEST + 2));
- q.insert(mb_make_message(PMT_NIL, pmt_from_long(2), PMT_NIL, MB_PRI_BEST + 2));
-
- CPPUNIT_ASSERT_EQUAL(0L, pmt_to_long(q.get_highest_pri_msg_nowait()->data()));
- CPPUNIT_ASSERT_EQUAL(1L, pmt_to_long(q.get_highest_pri_msg_nowait()->data()));
- CPPUNIT_ASSERT_EQUAL(2L, pmt_to_long(q.get_highest_pri_msg_nowait()->data()));
-
- CPPUNIT_ASSERT(q.get_highest_pri_msg_nowait() == 0);
-
-
- // insert messages of different priorities in pseudo-random order
- // signal data metadata pri
- q.insert(mb_make_message(PMT_NIL, PMT_NIL, PMT_NIL, MB_PRI_BEST + 3));
- q.insert(mb_make_message(PMT_NIL, PMT_NIL, PMT_NIL, MB_PRI_BEST + 2));
- q.insert(mb_make_message(PMT_NIL, PMT_NIL, PMT_NIL, MB_PRI_BEST + 4));
- q.insert(mb_make_message(PMT_NIL, PMT_NIL, PMT_NIL, MB_PRI_BEST + 0));
- q.insert(mb_make_message(PMT_NIL, PMT_NIL, PMT_NIL, MB_PRI_BEST + 1));
- q.insert(mb_make_message(PMT_NIL, PMT_NIL, PMT_NIL, MB_PRI_BEST + 3));
- q.insert(mb_make_message(PMT_NIL, PMT_NIL, PMT_NIL, MB_PRI_BEST + 2));
- q.insert(mb_make_message(PMT_NIL, PMT_NIL, PMT_NIL, MB_PRI_BEST + 4));
- q.insert(mb_make_message(PMT_NIL, PMT_NIL, PMT_NIL, MB_PRI_BEST + 0));
- q.insert(mb_make_message(PMT_NIL, PMT_NIL, PMT_NIL, MB_PRI_BEST + 1));
-
- // confirm that they come out in order
- CPPUNIT_ASSERT_EQUAL(MB_PRI_BEST + 0, q.get_highest_pri_msg_nowait()->priority());
- CPPUNIT_ASSERT_EQUAL(MB_PRI_BEST + 0, q.get_highest_pri_msg_nowait()->priority());
- CPPUNIT_ASSERT_EQUAL(MB_PRI_BEST + 1, q.get_highest_pri_msg_nowait()->priority());
- CPPUNIT_ASSERT_EQUAL(MB_PRI_BEST + 1, q.get_highest_pri_msg_nowait()->priority());
- CPPUNIT_ASSERT_EQUAL(MB_PRI_BEST + 2, q.get_highest_pri_msg_nowait()->priority());
- CPPUNIT_ASSERT_EQUAL(MB_PRI_BEST + 2, q.get_highest_pri_msg_nowait()->priority());
- CPPUNIT_ASSERT_EQUAL(MB_PRI_BEST + 3, q.get_highest_pri_msg_nowait()->priority());
- CPPUNIT_ASSERT_EQUAL(MB_PRI_BEST + 3, q.get_highest_pri_msg_nowait()->priority());
- CPPUNIT_ASSERT_EQUAL(MB_PRI_BEST + 4, q.get_highest_pri_msg_nowait()->priority());
- CPPUNIT_ASSERT_EQUAL(MB_PRI_BEST + 4, q.get_highest_pri_msg_nowait()->priority());
-
- // check final state
- CPPUNIT_ASSERT(q.get_highest_pri_msg_nowait() == 0);
-}
-
-////////////////////////////////////////////////////////////////
-
-void
-qa_mblock_prims::test_make_accepter()
-{
- mb_runtime_sptr rts = mb_make_runtime();
- mb_runtime *rt = rts.get();
-
- // create a block
- mb_mblock_sptr mb = mb_mblock_sptr(new dp_2(rt, "top", PMT_F));
-
- // use "internal use only" method...
- mb_msg_accepter_sptr accepter = mb->impl()->make_accepter(pmt_intern("cs"));
-
- // Now push a few messages into it...
- // signal data metadata pri
- (*accepter)(PMT_NIL, pmt_from_long(0), PMT_NIL, MB_PRI_BEST + 2);
- (*accepter)(PMT_NIL, pmt_from_long(1), PMT_NIL, MB_PRI_BEST + 2);
- (*accepter)(PMT_NIL, pmt_from_long(2), PMT_NIL, MB_PRI_BEST + 2);
-
- // try to pull them out
-
- pmt_t cs = pmt_intern("cs");
-
- mb_message_sptr msg = mb->impl()->msgq().get_highest_pri_msg_nowait();
- CPPUNIT_ASSERT(pmt_eq(cs, msg->port_id())); // confirm that port_id is set
- CPPUNIT_ASSERT_EQUAL(0L, pmt_to_long(msg->data())); // and that data is correct
-
- CPPUNIT_ASSERT_EQUAL(1L, pmt_to_long(mb->impl()->msgq().get_highest_pri_msg_nowait()->data()));
- CPPUNIT_ASSERT_EQUAL(2L, pmt_to_long(mb->impl()->msgq().get_highest_pri_msg_nowait()->data()));
-}