summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/python/gnuradio/gr
diff options
context:
space:
mode:
Diffstat (limited to 'gnuradio-core/src/python/gnuradio/gr')
-rw-r--r--gnuradio-core/src/python/gnuradio/gr/Makefile.am2
-rw-r--r--gnuradio-core/src/python/gnuradio/gr/__init__.py2
-rw-r--r--gnuradio-core/src/python/gnuradio/gr/hier_block2.py40
-rwxr-xr-xgnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py238
-rwxr-xr-xgnuradio-core/src/python/gnuradio/gr/qa_runtime.py31
-rwxr-xr-xgnuradio-core/src/python/gnuradio/gr/qa_simple_flowgraph.py142
6 files changed, 454 insertions, 1 deletions
diff --git a/gnuradio-core/src/python/gnuradio/gr/Makefile.am b/gnuradio-core/src/python/gnuradio/gr/Makefile.am
index fcf0261468..6400b842f5 100644
--- a/gnuradio-core/src/python/gnuradio/gr/Makefile.am
+++ b/gnuradio-core/src/python/gnuradio/gr/Makefile.am
@@ -39,6 +39,7 @@ grgrpython_PYTHON = \
gr_threading_23.py \
gr_threading_24.py \
hier_block.py \
+ hier_block2.py \
prefs.py \
scheduler.py
@@ -63,6 +64,7 @@ noinst_PYTHON = \
qa_fsk_stuff.py \
qa_goertzel.py \
qa_head.py \
+ qa_hier_block2.py \
qa_hilbert.py \
qa_iir.py \
qa_interleave.py \
diff --git a/gnuradio-core/src/python/gnuradio/gr/__init__.py b/gnuradio-core/src/python/gnuradio/gr/__init__.py
index 8adf7e3086..d38804870d 100644
--- a/gnuradio-core/src/python/gnuradio/gr/__init__.py
+++ b/gnuradio-core/src/python/gnuradio/gr/__init__.py
@@ -29,7 +29,7 @@ from basic_flow_graph import *
from flow_graph import *
from exceptions import *
from hier_block import *
-
+from hier_block2 import *
# create a couple of aliases
serial_to_parallel = stream_to_vector
diff --git a/gnuradio-core/src/python/gnuradio/gr/hier_block2.py b/gnuradio-core/src/python/gnuradio/gr/hier_block2.py
new file mode 100644
index 0000000000..c44e6f0718
--- /dev/null
+++ b/gnuradio-core/src/python/gnuradio/gr/hier_block2.py
@@ -0,0 +1,40 @@
+#
+# Copyright 2006 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 2, 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., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+from gnuradio_swig_python import hier_block2_swig
+
+#
+# This hack forces a 'has-a' relationship to look like an 'is-a' one.
+#
+# It allows Python classes to subclass this one, while passing through
+# method calls to the C++ class shared pointer from SWIG.
+#
+# It also allows us to intercept method calls if needed
+#
+class hier_block2(object):
+ def __init__(self, name, input_signature, output_signature):
+ self._hb = hier_block2_swig(name, input_signature, output_signature)
+
+ def __getattr__(self, name):
+ return getattr(self._hb, name)
+
+ def define_component(self, name, comp):
+ return self._hb.define_component(name, comp.basic_block())
diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py b/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
new file mode 100755
index 0000000000..9253b892af
--- /dev/null
+++ b/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
@@ -0,0 +1,238 @@
+#!/usr/bin/env python
+
+from gnuradio import gr, gr_unittest
+
+class test_hier_block2(gr_unittest.TestCase):
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_001_make(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ self.assertEqual("test_block", hblock.name())
+ self.assertEqual(1, hblock.input_signature().max_streams())
+ self.assertEqual(1, hblock.output_signature().min_streams())
+ self.assertEqual(1, hblock.output_signature().max_streams())
+ self.assertEqual(gr.sizeof_int, hblock.output_signature().sizeof_stream_item(0))
+
+ def test_002_define_component(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ hblock.define_component("src", gr.null_source(gr.sizeof_int))
+ hblock.define_component("dst", gr.null_sink(gr.sizeof_int))
+
+ def test_003_define_component_reserved_input(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ self.assertRaises(ValueError,
+ lambda: hblock.define_component("self", gr.nop(gr.sizeof_int)))
+
+ def test_004_define_component_name_in_use(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ hblock.define_component("src", gr.null_source(gr.sizeof_int))
+ self.assertRaises(ValueError,
+ lambda: hblock.define_component("src", gr.null_sink(gr.sizeof_int)))
+
+ def test_006_connect_internal(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ hblock.define_component("nop1", gr.nop(gr.sizeof_int))
+ hblock.define_component("nop2", gr.nop(gr.sizeof_int))
+ hblock.connect("nop1", 0, "nop2", 0)
+
+ def test_007_connect_input(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ hblock.define_component("nop1", gr.nop(gr.sizeof_int))
+ hblock.connect("self", 0, "nop1", 0)
+
+ def test_008_connect_output(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ hblock.define_component("nop1", gr.nop(gr.sizeof_int))
+ hblock.connect("nop1", 0, "self", 0)
+
+ def test_009_connect_unknown_src(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ nop1 = gr.nop(gr.sizeof_int)
+ hblock.define_component("nop1", nop1)
+ self.assertRaises(ValueError,
+ lambda: hblock.connect("nop2", 0, "self", 0))
+
+ def test_010_connect_unknown_dst(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ hblock.define_component("nop1", gr.nop(gr.sizeof_int))
+ self.assertRaises(ValueError,
+ lambda: hblock.connect("self", 0, "nop2", 0))
+
+ def test_011_connect_invalid_src_port_neg(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ hblock.define_component("nop1", gr.nop(gr.sizeof_int))
+ self.assertRaises(ValueError,
+ lambda: hblock.connect("self", -1, "nop1", 0))
+
+ def test_012_connect_invalid_src_port_exceeds(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ hblock.define_component("nop1", gr.nop(gr.sizeof_int))
+ self.assertRaises(ValueError,
+ lambda: hblock.connect("self", 1, "nop1", 0))
+
+ def test_013_connect_invalid_dst_port_neg(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ hblock.define_component("nop1", gr.nop(gr.sizeof_int))
+ self.assertRaises(ValueError,
+ lambda: hblock.connect("self", -1, "nop1", 0))
+
+ def test_014_connect_invalid_dst_port_exceeds(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ hblock.define_component("nop1", gr.nop(gr.sizeof_int))
+ self.assertRaises(ValueError,
+ lambda: hblock.connect("self", 1, "nop1", 0))
+
+ def test_015_connect_dst_port_in_use(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ nop1 = gr.nop(gr.sizeof_int)
+ hblock.define_component("nop1", nop1)
+ hblock.connect("nop1", 0, "self", 0);
+ self.assertRaises(ValueError,
+ lambda: hblock.connect("nop1", 0, "self", 0))
+
+ def test_016_connect_one_src_two_dst(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ hblock.define_component("src", gr.null_source(gr.sizeof_int))
+ hblock.define_component("dst1", gr.null_sink(gr.sizeof_int))
+ hblock.define_component("dst2", gr.null_sink(gr.sizeof_int))
+ hblock.connect("src", 0, "dst1", 0)
+ hblock.connect("src", 0, "dst2", 0)
+
+ def test_017_connect_type_mismatch(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(1,1,gr.sizeof_int),
+ gr.io_signature(1,1,gr.sizeof_int))
+ hblock.define_component("nop1", gr.nop(gr.sizeof_char))
+ self.assertRaises(ValueError,
+ lambda: hblock.connect("nop1", 0, "self", 0))
+
+ def test_018_check_topology(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(0,0,gr.sizeof_int),
+ gr.io_signature(0,0,gr.sizeof_int))
+ hblock.check_topology(0, 0);
+ """
+ def test_019_validate(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(0,0,gr.sizeof_int),
+ gr.io_signature(0,0,gr.sizeof_int))
+ runtime = gr.runtime(hblock)
+ runtime.validate()
+
+ def test_020_validate_1(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(0,0,gr.sizeof_int),
+ gr.io_signature(0,0,gr.sizeof_int))
+ hblock.define_component("src", gr.null_source(gr.sizeof_int))
+ hblock.define_component("dst1", gr.null_sink(gr.sizeof_int))
+ hblock.define_component("dst2", gr.null_sink(gr.sizeof_int))
+ hblock.connect("src", 0, "dst1", 0)
+ hblock.connect("src", 0, "dst2", 0)
+ runtime = gr.runtime(hblock)
+ runtime.validate()
+
+ def test_021_validate_2(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(0,0,gr.sizeof_int),
+ gr.io_signature(0,0,gr.sizeof_int))
+ hblock.define_component("src1", gr.null_source(gr.sizeof_int))
+ hblock.define_component("nop1", gr.nop(gr.sizeof_int))
+ hblock.define_component("dst1", gr.null_sink(gr.sizeof_int))
+ hblock.define_component("dst2", gr.null_sink(gr.sizeof_int))
+ hblock.connect("src1", 0, "nop1", 0)
+ hblock.connect("src1", 0, "nop1", 1)
+ hblock.connect("nop1", 0, "dst1", 0)
+ hblock.connect("nop1", 1, "dst2", 0)
+ runtime = gr.runtime(hblock)
+ runtime.validate()
+
+ def test_022_validate_3(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(0,0,gr.sizeof_int),
+ gr.io_signature(0,0,gr.sizeof_int))
+ hblock.define_component("src1", gr.null_source(gr.sizeof_int))
+ hblock.define_component("nop1", gr.nop(gr.sizeof_int))
+ hblock.define_component("dst1", gr.null_sink(gr.sizeof_int))
+ hblock.define_component("dst2", gr.null_sink(gr.sizeof_int))
+ hblock.connect("src1", 0, "nop1", 0)
+ hblock.connect("src1", 0, "nop1", 2)
+ hblock.connect("nop1", 0, "dst1", 0)
+ hblock.connect("nop1", 1, "dst2", 0)
+ runtime = gr.runtime(hblock)
+ self.assertRaises(RuntimeError,
+ lambda: runtime.validate())
+
+ def test_023_validate_4(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(0,0,gr.sizeof_int),
+ gr.io_signature(0,0,gr.sizeof_int))
+ hblock.define_component("src1", gr.null_source(gr.sizeof_int))
+ hblock.define_component("nop1", gr.nop(gr.sizeof_int))
+ hblock.define_component("dst1", gr.null_sink(gr.sizeof_int))
+ hblock.define_component("dst2", gr.null_sink(gr.sizeof_int))
+ hblock.connect("src1", 0, "nop1", 0)
+ hblock.connect("src1", 0, "nop1", 1)
+ hblock.connect("nop1", 0, "dst1", 0)
+ hblock.connect("nop1", 2, "dst2", 0)
+ runtime = gr.runtime(hblock)
+ self.assertRaises(RuntimeError,
+ lambda: runtime.validate())
+
+ def test_024_validate_5(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(0,0,gr.sizeof_int),
+ gr.io_signature(0,0,gr.sizeof_int))
+ hblock.define_component("src1", gr.null_source(gr.sizeof_int))
+ hblock.define_component("nop1", gr.nop(gr.sizeof_int))
+ hblock.define_component("dst1", gr.null_sink(gr.sizeof_int))
+ hblock.define_component("dst2", gr.null_sink(gr.sizeof_int))
+ hblock.connect("src1", 0, "nop1", 0)
+ hblock.connect("src1", 0, "nop1", 1)
+ hblock.connect("nop1", 0, "dst1", 0)
+ hblock.connect("nop1", 1, "dst2", 0)
+ runtime = gr.runtime(hblock)
+ runtime.validate()
+ # Pending implementation of disconnect
+ # hblock.disconnect("src1", 0, "nop1", 1)
+ # runtime.validate()
+ # self.assertRaises(ValueError,
+ # lambda: hblock.disconnect("src1", 0, "nop1", 1))
+ """
+
+if __name__ == "__main__":
+ gr_unittest.main()
diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_runtime.py b/gnuradio-core/src/python/gnuradio/gr/qa_runtime.py
new file mode 100755
index 0000000000..3e7f4e5f9f
--- /dev/null
+++ b/gnuradio-core/src/python/gnuradio/gr/qa_runtime.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python
+
+from gnuradio import gr, gr_unittest
+
+class test_runtime(gr_unittest.TestCase):
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ """
+ def test_001_run(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(0,0,0),
+ gr.io_signature(0,0,0))
+ runtime = gr.runtime(hblock)
+ runtime.run()
+
+ def test_002_run_twice(self):
+ hblock = gr.hier_block2("test_block",
+ gr.io_signature(0,0,0),
+ gr.io_signature(0,0,0))
+ runtime = gr.runtime(hblock)
+ runtime.run()
+ self.assertRaises(RuntimeError, lambda: runtime.run())
+ """
+
+if __name__ == "__main__":
+ gr_unittest.main()
diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_simple_flowgraph.py b/gnuradio-core/src/python/gnuradio/gr/qa_simple_flowgraph.py
new file mode 100755
index 0000000000..939f5855fc
--- /dev/null
+++ b/gnuradio-core/src/python/gnuradio/gr/qa_simple_flowgraph.py
@@ -0,0 +1,142 @@
+#!/usr/bin/env python
+
+from gnuradio import gr, gr_unittest
+
+class test_simple_flowgraph(gr_unittest.TestCase):
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_001_define_component(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("src", gr.null_source(gr.sizeof_int))
+ sfg.define_component("dst", gr.null_sink(gr.sizeof_int))
+
+ def test_002_define_component_name_in_use(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("src", gr.null_source(gr.sizeof_int))
+ self.assertRaises(ValueError,
+ lambda: sfg.define_component("src", gr.null_sink(gr.sizeof_int)))
+
+ def test_003_connect(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("src", gr.null_source(gr.sizeof_int))
+ sfg.define_component("dst", gr.null_sink(gr.sizeof_int))
+ sfg.connect("src", 0, "dst", 0)
+
+ def test_004connect_unknown_src(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("dst", gr.null_sink(gr.sizeof_int))
+ self.assertRaises(ValueError,
+ lambda: sfg.connect("src", 0, "dst", 0))
+
+ def test_005_connect_unknown_dst(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("src", gr.null_source(gr.sizeof_int))
+ self.assertRaises(ValueError,
+ lambda: sfg.connect("src", 0, "dst", 0))
+
+ def test_006_connect_invalid_src_port_neg(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("src", gr.null_source(gr.sizeof_int))
+ sfg.define_component("dst", gr.null_sink(gr.sizeof_int))
+ self.assertRaises(ValueError,
+ lambda: sfg.connect("src", -1, "dst", 0))
+
+ def test_007_connect_invalid_src_port_exceeds(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("src", gr.null_source(gr.sizeof_int))
+ sfg.define_component("dst", gr.null_sink(gr.sizeof_int))
+ self.assertRaises(ValueError,
+ lambda: sfg.connect("src", 1, "dst", 0))
+
+ def test_008_connect_invalid_dst_port_neg(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("src", gr.null_source(gr.sizeof_int))
+ sfg.define_component("dst", gr.null_sink(gr.sizeof_int))
+ self.assertRaises(ValueError,
+ lambda: sfg.connect("src", 0, "dst", -1))
+
+ def test_009_connect_invalid_dst_port_exceeds(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("src", gr.null_source(gr.sizeof_int))
+ sfg.define_component("dst", gr.null_sink(gr.sizeof_int))
+ self.assertRaises(ValueError,
+ lambda: sfg.connect("src", 0, "dst", 1))
+
+ def test_010_connect_invalid_dst_port_in_use(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("src1", gr.null_source(gr.sizeof_int))
+ sfg.define_component("src2", gr.null_source(gr.sizeof_int))
+ sfg.define_component("dst", gr.null_sink(gr.sizeof_int))
+ sfg.connect("src1", 0, "dst", 0)
+ self.assertRaises(ValueError,
+ lambda: sfg.connect("src2", 0, "dst", 0))
+
+ def test_011_connect_one_src_two_dst(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("src", gr.null_source(gr.sizeof_int))
+ sfg.define_component("dst1", gr.null_sink(gr.sizeof_int))
+ sfg.define_component("dst2", gr.null_sink(gr.sizeof_int))
+ sfg.connect("src", 0, "dst1", 0)
+ sfg.connect("src", 0, "dst2", 0)
+
+ def test_012_connect_type_mismatch(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("src", gr.null_source(gr.sizeof_int))
+ sfg.define_component("dst", gr.null_sink(gr.sizeof_char))
+ self.assertRaises(ValueError,
+ lambda: sfg.connect("src", 0, "dst", 0))
+
+ def test_013_validate(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("src", gr.null_source(gr.sizeof_int))
+ sfg.define_component("dst1", gr.null_sink(gr.sizeof_int))
+ sfg.define_component("dst2", gr.null_sink(gr.sizeof_int))
+ sfg.connect("src", 0, "dst1", 0)
+ sfg.connect("src", 0, "dst2", 0)
+ sfg.validate()
+
+ def test_014_validate(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("src1", gr.null_source (gr.sizeof_int))
+ sfg.define_component("nop1", gr.nop (gr.sizeof_int))
+ sfg.define_component("dst1", gr.null_sink (gr.sizeof_int))
+ sfg.define_component("dst2", gr.null_sink (gr.sizeof_int))
+ sfg.connect("src1", 0, "nop1", 0)
+ sfg.connect("src1", 0, "nop1", 1)
+ sfg.connect("nop1", 0, "dst1", 0)
+ sfg.connect("nop1", 1, "dst2", 0)
+ sfg.validate ()
+
+ def test_015_validate(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("src1", gr.null_source (gr.sizeof_int))
+ sfg.define_component("nop1", gr.nop (gr.sizeof_int))
+ sfg.define_component("dst1", gr.null_sink (gr.sizeof_int))
+ sfg.define_component("dst2", gr.null_sink (gr.sizeof_int))
+ sfg.connect("src1", 0, "nop1", 0)
+ sfg.connect("src1", 0, "nop1", 2)
+ sfg.connect("nop1", 0, "dst1", 0)
+ sfg.connect("nop1", 1, "dst2", 0)
+ self.assertRaises(RuntimeError,
+ lambda: sfg.validate ())
+
+ def test_016_validate(self):
+ sfg = gr.simple_flowgraph()
+ sfg.define_component("src1", gr.null_source (gr.sizeof_int))
+ sfg.define_component("nop1", gr.nop (gr.sizeof_int))
+ sfg.define_component("dst1", gr.null_sink (gr.sizeof_int))
+ sfg.define_component("dst2", gr.null_sink (gr.sizeof_int))
+ sfg.connect("src1", 0, "nop1", 0)
+ sfg.connect("src1", 0, "nop1", 1)
+ sfg.connect("nop1", 0, "dst1", 0)
+ sfg.connect("nop1", 2, "dst2", 0)
+ self.assertRaises(RuntimeError,
+ lambda: sfg.validate ())
+
+if __name__ == "__main__":
+ gr_unittest.main()