From b94cc81aae00b140ac72fb6341598893fe93bb6d Mon Sep 17 00:00:00 2001 From: Roman Khassraf Date: Sat, 25 Jul 2015 14:30:28 +0200 Subject: [PATCH] Added QA/unit tests for burst printer. --- python/qa_burst_printer.py | 297 +++++++++++++++++++++++++++++++++++++ 1 file changed, 297 insertions(+) create mode 100755 python/qa_burst_printer.py diff --git a/python/qa_burst_printer.py b/python/qa_burst_printer.py new file mode 100755 index 0000000..c7f2769 --- /dev/null +++ b/python/qa_burst_printer.py @@ -0,0 +1,297 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# @file +# @author Roman Khassraf +# @section LICENSE +# +# Gr-gsm 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. +# +# Gr-gsm 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 gr-gsm; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# +# + +from gnuradio import gr, gr_unittest, blocks +import grgsm +import os +import pmt +import sys +import tempfile + +class qa_burst_printer (gr_unittest.TestCase): + + def setUp (self): + self.tb = gr.top_block() + self.tmpfile = tempfile.NamedTemporaryFile() + self.prevfd = os.dup(sys.stdout.fileno()) + os.dup2(self.tmpfile.fileno(), sys.stdout.fileno()) + self.prev = sys.stdout + sys.stdout = os.fdopen(self.prevfd, "w") + + def tearDown (self): + self.tb = None + os.dup2(self.prevfd, self.prev.fileno()) + sys.stdout = self.prev + self.tmpfile.close() + + def getOutput(self): + self.tmpfile.seek(0) + return self.tmpfile.read() + + def getOutputExpected(self, expected_lines): + out = "" + for l in expected_lines: + out = out + l + "\n" + return out + + def test_001_complete_bursts_prefix (self): + """ + Complete bursts, without any prefix + """ + framenumbers_input = [2569043, 2569044, 2569045, 2569046] + timeslots_input = [2, 2, 2, 2] + bursts_input = [ + "0001100000010010011110111110011111000000001010001111000000001000110101110010000011010111100101101010000001111010100010110111101011101011100000101000", + "0001000101111101111110000010100001011011111010111110101011101000110101110010000011010111110110111101101111110000011011010111011111001011101000011000", + "0000001000011110111110101011001000110000000000110110101100011000110101110010000011010111001010100101011111001000111100000100000111111000000101110000", + "0001101010111110010001010110101100000011101100011111110100101000110101110010000011010111111000000001010010111001111111011001000000001001000011101000" + ] + + expected_lines = [ + "0001100000010010011110111110011111000000001010001111000000001000110101110010000011010111100101101010000001111010100010110111101011101011100000101000", + "0001000101111101111110000010100001011011111010111110101011101000110101110010000011010111110110111101101111110000011011010111011111001011101000011000", + "0000001000011110111110101011001000110000000000110110101100011000110101110010000011010111001010100101011111001000111100000100000111111000000101110000", + "0001101010111110010001010110101100000011101100011111110100101000110101110010000011010111111000000001010010111001111111011001000000001001000011101000" + ] + + src = grgsm.burst_source_qa(framenumbers_input, timeslots_input, bursts_input) + printer = grgsm.bursts_printer(pmt.intern(""), False, False, False, False) + self.tb.msg_connect(src, "out", printer, "bursts") + self.tb.run() + + self.assertEqual(self.getOutput(), self.getOutputExpected(expected_lines)) + + def test_002_complete_bursts_prefix (self): + """ + Complete bursts, with a string prefix + """ + framenumbers_input = [2569043, 2569044, 2569045, 2569046] + timeslots_input = [2, 2, 2, 2] + bursts_input = [ + "0001100000010010011110111110011111000000001010001111000000001000110101110010000011010111100101101010000001111010100010110111101011101011100000101000", + "0001000101111101111110000010100001011011111010111110101011101000110101110010000011010111110110111101101111110000011011010111011111001011101000011000", + "0000001000011110111110101011001000110000000000110110101100011000110101110010000011010111001010100101011111001000111100000100000111111000000101110000", + "0001101010111110010001010110101100000011101100011111110100101000110101110010000011010111111000000001010010111001111111011001000000001001000011101000" + ] + + expected_lines = [ + "Test 0001100000010010011110111110011111000000001010001111000000001000110101110010000011010111100101101010000001111010100010110111101011101011100000101000", + "Test 0001000101111101111110000010100001011011111010111110101011101000110101110010000011010111110110111101101111110000011011010111011111001011101000011000", + "Test 0000001000011110111110101011001000110000000000110110101100011000110101110010000011010111001010100101011111001000111100000100000111111000000101110000", + "Test 0001101010111110010001010110101100000011101100011111110100101000110101110010000011010111111000000001010010111001111111011001000000001001000011101000" + ] + + src = grgsm.burst_source_qa(framenumbers_input, timeslots_input, bursts_input) + printer = grgsm.bursts_printer(pmt.intern("Test "), False, False, False, False) + self.tb.msg_connect(src, "out", printer, "bursts") + self.tb.run() + + self.assertEqual(self.getOutput(), self.getOutputExpected(expected_lines)) + + def test_003_complete_bursts_fnr (self): + """ + Complete bursts, no prefix, with frame number + """ + framenumbers_input = [2569043, 2569044, 2569045, 2569046] + timeslots_input = [2, 2, 2, 2] + bursts_input = [ + "0001100000010010011110111110011111000000001010001111000000001000110101110010000011010111100101101010000001111010100010110111101011101011100000101000", + "0001000101111101111110000010100001011011111010111110101011101000110101110010000011010111110110111101101111110000011011010111011111001011101000011000", + "0000001000011110111110101011001000110000000000110110101100011000110101110010000011010111001010100101011111001000111100000100000111111000000101110000", + "0001101010111110010001010110101100000011101100011111110100101000110101110010000011010111111000000001010010111001111111011001000000001001000011101000" + ] + + expected_lines = [ + "2569043: 0001100000010010011110111110011111000000001010001111000000001000110101110010000011010111100101101010000001111010100010110111101011101011100000101000", + "2569044: 0001000101111101111110000010100001011011111010111110101011101000110101110010000011010111110110111101101111110000011011010111011111001011101000011000", + "2569045: 0000001000011110111110101011001000110000000000110110101100011000110101110010000011010111001010100101011111001000111100000100000111111000000101110000", + "2569046: 0001101010111110010001010110101100000011101100011111110100101000110101110010000011010111111000000001010010111001111111011001000000001001000011101000" + ] + + src = grgsm.burst_source_qa(framenumbers_input, timeslots_input, bursts_input) + printer = grgsm.bursts_printer(pmt.intern(""), True, False, False, False) + self.tb.msg_connect(src, "out", printer, "bursts") + self.tb.run() + + self.assertEqual(self.getOutput(), self.getOutputExpected(expected_lines)) + + def test_004_complete_bursts_fcount (self): + """ + Complete bursts, no prefix, with frame count + """ + framenumbers_input = [2569043, 2569044, 2569045, 2569046] + timeslots_input = [2, 2, 2, 2] + bursts_input = [ + "0001100000010010011110111110011111000000001010001111000000001000110101110010000011010111100101101010000001111010100010110111101011101011100000101000", + "0001000101111101111110000010100001011011111010111110101011101000110101110010000011010111110110111101101111110000011011010111011111001011101000011000", + "0000001000011110111110101011001000110000000000110110101100011000110101110010000011010111001010100101011111001000111100000100000111111000000101110000", + "0001101010111110010001010110101100000011101100011111110100101000110101110010000011010111111000000001010010111001111111011001000000001001000011101000" + ] + + expected_lines = [ + "3967625: 0001100000010010011110111110011111000000001010001111000000001000110101110010000011010111100101101010000001111010100010110111101011101011100000101000", + "3967658: 0001000101111101111110000010100001011011111010111110101011101000110101110010000011010111110110111101101111110000011011010111011111001011101000011000", + "3967691: 0000001000011110111110101011001000110000000000110110101100011000110101110010000011010111001010100101011111001000111100000100000111111000000101110000", + "3967724: 0001101010111110010001010110101100000011101100011111110100101000110101110010000011010111111000000001010010111001111111011001000000001001000011101000" + ] + + src = grgsm.burst_source_qa(framenumbers_input, timeslots_input, bursts_input) + printer = grgsm.bursts_printer(pmt.intern(""), False, True, False, False) + self.tb.msg_connect(src, "out", printer, "bursts") + self.tb.run() + + self.assertEqual(self.getOutput(), self.getOutputExpected(expected_lines)) + + def test_005_complete_bursts_fnr_fcount (self): + """ + Complete bursts, no prefix, with frame number and frame count + """ + framenumbers_input = [2569043, 2569044, 2569045, 2569046] + timeslots_input = [2, 2, 2, 2] + bursts_input = [ + "0001100000010010011110111110011111000000001010001111000000001000110101110010000011010111100101101010000001111010100010110111101011101011100000101000", + "0001000101111101111110000010100001011011111010111110101011101000110101110010000011010111110110111101101111110000011011010111011111001011101000011000", + "0000001000011110111110101011001000110000000000110110101100011000110101110010000011010111001010100101011111001000111100000100000111111000000101110000", + "0001101010111110010001010110101100000011101100011111110100101000110101110010000011010111111000000001010010111001111111011001000000001001000011101000" + ] + + expected_lines = [ + "2569043 3967625: 0001100000010010011110111110011111000000001010001111000000001000110101110010000011010111100101101010000001111010100010110111101011101011100000101000", + "2569044 3967658: 0001000101111101111110000010100001011011111010111110101011101000110101110010000011010111110110111101101111110000011011010111011111001011101000011000", + "2569045 3967691: 0000001000011110111110101011001000110000000000110110101100011000110101110010000011010111001010100101011111001000111100000100000111111000000101110000", + "2569046 3967724: 0001101010111110010001010110101100000011101100011111110100101000110101110010000011010111111000000001010010111001111111011001000000001001000011101000" + ] + + src = grgsm.burst_source_qa(framenumbers_input, timeslots_input, bursts_input) + printer = grgsm.bursts_printer(pmt.intern(""), True, True, False, False) + self.tb.msg_connect(src, "out", printer, "bursts") + self.tb.run() + + self.assertEqual(self.getOutput(), self.getOutputExpected(expected_lines)) + + def test_006_payload_prefix_fnr_fcount (self): + """ + Payload only, no prefix, with frame number and frame count + Bursts 4-7 are dummy bursts + """ + framenumbers_input = [2569043, 2569044, 2569045, 2569046, 1099602, 1099603, 1099604, 1099605] + timeslots_input = [2, 2, 2, 2, 4, 4, 4, 4] + bursts_input = [ + "0001100000010010011110111110011111000000001010001111000000001000110101110010000011010111100101101010000001111010100010110111101011101011100000101000", + "0001000101111101111110000010100001011011111010111110101011101000110101110010000011010111110110111101101111110000011011010111011111001011101000011000", + "0000001000011110111110101011001000110000000000110110101100011000110101110010000011010111001010100101011111001000111100000100000111111000000101110000", + "0001101010111110010001010110101100000011101100011111110100101000110101110010000011010111111000000001010010111001111111011001000000001001000011101000", + "0001111101101110110000010100100111000001001000100000001111100011100010111000101110001010111010010100011001100111001111010011111000100101111101010000", + "0001111101101110110000010100100111000001001000100000001111100011100010111000101110001010111010010100011001100111001111010011111000100101111101010000", + "0001111101101110110000010100100111000001001000100000001111100011100010111000101110001010111010010100011001100111001111010011111000100101111101010000", + "0001111101101110110000010100100111000001001000100000001111100011100010111000101110001010111010010100011001100111001111010011111000100101111101010000" + + ] + + expected_lines = [ + "test_006: 2569043 3967625: 110000001001001111011111001111100000000101000111100000000100101101010000001111010100010110111101011101011100000101", + "test_006: 2569044 3967658: 100010111110111111000001010000101101111101011111010101110110110111101101111110000011011010111011111001011101000011", + "test_006: 2569045 3967691: 000100001111011111010101100100011000000000011011010110001001010100101011111001000111100000100000111111000000101110", + "test_006: 2569046 3967724: 110101011111001000101011010110000001110110001111111010010111000000001010010111001111111011001000000001001000011101", + "test_006: 1099602 1699146: 111110110111011000001010010011100000100100010000000111110111010010100011001100111001111010011111000100101111101010", + "test_006: 1099603 1699179: 111110110111011000001010010011100000100100010000000111110111010010100011001100111001111010011111000100101111101010", + "test_006: 1099604 1699212: 111110110111011000001010010011100000100100010000000111110111010010100011001100111001111010011111000100101111101010", + "test_006: 1099605 1699245: 111110110111011000001010010011100000100100010000000111110111010010100011001100111001111010011111000100101111101010" + ] + + src = grgsm.burst_source_qa(framenumbers_input, timeslots_input, bursts_input) + printer = grgsm.bursts_printer(pmt.intern("test_006: "), True, True, True, False) + self.tb.msg_connect(src, "out", printer, "bursts") + self.tb.run() + + self.assertEqual(self.getOutput(), self.getOutputExpected(expected_lines)) + + def test_007_payload_prefix_fnr_fcount (self): + """ + Payload only, no prefix, with frame number, frame count, and ignoring dummy bursts + Bursts 4-7 are dummy bursts + """ + framenumbers_input = [2569043, 2569044, 2569045, 2569046, 1099602, 1099603, 1099604, 1099605] + timeslots_input = [2, 2, 2, 2, 4, 4, 4, 4] + bursts_input = [ + "0001100000010010011110111110011111000000001010001111000000001000110101110010000011010111100101101010000001111010100010110111101011101011100000101000", + "0001000101111101111110000010100001011011111010111110101011101000110101110010000011010111110110111101101111110000011011010111011111001011101000011000", + "0000001000011110111110101011001000110000000000110110101100011000110101110010000011010111001010100101011111001000111100000100000111111000000101110000", + "0001101010111110010001010110101100000011101100011111110100101000110101110010000011010111111000000001010010111001111111011001000000001001000011101000", + "0001111101101110110000010100100111000001001000100000001111100011100010111000101110001010111010010100011001100111001111010011111000100101111101010000", + "0001111101101110110000010100100111000001001000100000001111100011100010111000101110001010111010010100011001100111001111010011111000100101111101010000", + "0001111101101110110000010100100111000001001000100000001111100011100010111000101110001010111010010100011001100111001111010011111000100101111101010000", + "0001111101101110110000010100100111000001001000100000001111100011100010111000101110001010111010010100011001100111001111010011111000100101111101010000" + + ] + + expected_lines = [ + "test_007: 2569043 3967625: 110000001001001111011111001111100000000101000111100000000100101101010000001111010100010110111101011101011100000101", + "test_007: 2569044 3967658: 100010111110111111000001010000101101111101011111010101110110110111101101111110000011011010111011111001011101000011", + "test_007: 2569045 3967691: 000100001111011111010101100100011000000000011011010110001001010100101011111001000111100000100000111111000000101110", + "test_007: 2569046 3967724: 110101011111001000101011010110000001110110001111111010010111000000001010010111001111111011001000000001001000011101" + ] + + src = grgsm.burst_source_qa(framenumbers_input, timeslots_input, bursts_input) + printer = grgsm.bursts_printer(pmt.intern("test_007: "), True, True, True, True) + self.tb.msg_connect(src, "out", printer, "bursts") + self.tb.run() + + self.assertEqual(self.getOutput(), self.getOutputExpected(expected_lines)) + + def test_008_complete_prefix_fnr_fcount (self): + """ + Complete bursts, no prefix, with frame number, frame count, and ignoring dummy bursts + Bursts 4-7 are dummy bursts + """ + framenumbers_input = [2569043, 2569044, 2569045, 2569046, 1099602, 1099603, 1099604, 1099605] + timeslots_input = [2, 2, 2, 2, 4, 4, 4, 4] + bursts_input = [ + "0001100000010010011110111110011111000000001010001111000000001000110101110010000011010111100101101010000001111010100010110111101011101011100000101000", + "0001000101111101111110000010100001011011111010111110101011101000110101110010000011010111110110111101101111110000011011010111011111001011101000011000", + "0000001000011110111110101011001000110000000000110110101100011000110101110010000011010111001010100101011111001000111100000100000111111000000101110000", + "0001101010111110010001010110101100000011101100011111110100101000110101110010000011010111111000000001010010111001111111011001000000001001000011101000", + "0001111101101110110000010100100111000001001000100000001111100011100010111000101110001010111010010100011001100111001111010011111000100101111101010000", + "0001111101101110110000010100100111000001001000100000001111100011100010111000101110001010111010010100011001100111001111010011111000100101111101010000", + "0001111101101110110000010100100111000001001000100000001111100011100010111000101110001010111010010100011001100111001111010011111000100101111101010000", + "0001111101101110110000010100100111000001001000100000001111100011100010111000101110001010111010010100011001100111001111010011111000100101111101010000" + + ] + + expected_lines = [ + "test_008: 2569043 3967625: 0001100000010010011110111110011111000000001010001111000000001000110101110010000011010111100101101010000001111010100010110111101011101011100000101000", + "test_008: 2569044 3967658: 0001000101111101111110000010100001011011111010111110101011101000110101110010000011010111110110111101101111110000011011010111011111001011101000011000", + "test_008: 2569045 3967691: 0000001000011110111110101011001000110000000000110110101100011000110101110010000011010111001010100101011111001000111100000100000111111000000101110000", + "test_008: 2569046 3967724: 0001101010111110010001010110101100000011101100011111110100101000110101110010000011010111111000000001010010111001111111011001000000001001000011101000" + ] + + src = grgsm.burst_source_qa(framenumbers_input, timeslots_input, bursts_input) + printer = grgsm.bursts_printer(pmt.intern("test_008: "), True, True, False, True) + self.tb.msg_connect(src, "out", printer, "bursts") + self.tb.run() + + self.assertEqual(self.getOutput(), self.getOutputExpected(expected_lines)) + + +if __name__ == '__main__': + gr_unittest.run(qa_burst_printer, "qa_burst_printer.xml")