From ef619bdd974fb9f89def50874673b7dcc50968cc Mon Sep 17 00:00:00 2001
From: Brian Orr <brian.orr@gmail.com>
Date: Tue, 25 Apr 2017 10:03:04 -0700
Subject: Add one-way scrambler test to show incorrect tag reset

Add a test test that compares the additive scrambler operation with a
reference implementation to highlight the incorrect behavior when
reset is tag triggered.
---
 gr-digital/python/digital/qa_scrambler.py | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

(limited to 'gr-digital/python/digital')

diff --git a/gr-digital/python/digital/qa_scrambler.py b/gr-digital/python/digital/qa_scrambler.py
index 4d35879b1f..522b23245f 100755
--- a/gr-digital/python/digital/qa_scrambler.py
+++ b/gr-digital/python/digital/qa_scrambler.py
@@ -23,6 +23,17 @@
 from gnuradio import gr, gr_unittest, digital, blocks
 import pmt
 
+# See gr-digital/lib/additive_scrambler_bb_impl.cc for reference.
+def additive_scramble_lfsr(mask, seed, reglen, bpb, data):
+    l = digital.lfsr(mask, seed, reglen)
+    out = []
+    for d in data:
+        scramble_word = 0
+        for i in xrange(0,bpb):
+            scramble_word ^= l.next_bit() << i
+        out.append(d ^ scramble_word)
+    return tuple(out)
+
 class test_scrambler(gr_unittest.TestCase):
 
     def setUp(self):
@@ -98,5 +109,25 @@ class test_scrambler(gr_unittest.TestCase):
         self.tb.run()
         self.assertEqual(src_data, dst.data())
 
+    def test_additive_scrambler_tags_oneway(self):
+        src_data = range(0, 10)
+        reset_tag_key = 'reset_lfsr'
+        reset_tag1 = gr.tag_t()
+        reset_tag1.key = pmt.string_to_symbol(reset_tag_key)
+        reset_tag1.offset = 0
+        reset_tag2 = gr.tag_t()
+        reset_tag2.key = pmt.string_to_symbol(reset_tag_key)
+        reset_tag2.offset = 10
+        reset_tag3 = gr.tag_t()
+        reset_tag3.key = pmt.string_to_symbol(reset_tag_key)
+        reset_tag3.offset = 20
+        src = blocks.vector_source_b(src_data * 3, False, 1, (reset_tag1, reset_tag2, reset_tag3))
+        scrambler = digital.additive_scrambler_bb(0x8a, 0x7f, 7, 0, 8, reset_tag_key)
+        dst = blocks.vector_sink_b()
+        self.tb.connect(src, scrambler, dst)
+        self.tb.run()
+        expected_data = additive_scramble_lfsr(0x8a, 0x7f, 7, 8, src_data)
+        self.assertEqual(expected_data * 3, dst.data())
+
 if __name__ == '__main__':
     gr_unittest.run(test_scrambler, "test_scrambler.xml")
-- 
cgit v1.2.3