diff options
Diffstat (limited to 'gnuradio-core/src/python/gnuradio/gr')
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() |