Esempio n. 1
0
    def test_uncompress_archives(self):
        temp_dir = tempfile.gettempdir()
        os.chdir(temp_dir)

        with tarfile.open("test.tar.gz", "w:gz") as tar:
            for name in ["1.complex", "2.complex", "3.complex"]:
                data = np.ndarray(10, dtype=np.complex64)
                data.tofile(name)
                tar.add(name)

        with ZipFile('test.zip', 'w') as zip:
            for name in ["4.complex", "5.complex"]:
                data = np.ndarray(10, dtype=np.complex64)
                data.tofile(name)
                zip.write(name)

        form = MainController()
        form.add_files(
            FileOperator.uncompress_archives(["test.tar.gz", "test.zip"],
                                             QDir.tempPath()))
        self.assertEqual(len(form.signal_tab_controller.signal_frames), 5)

        tar_md5 = hashlib.md5(
            open(os.path.join(temp_dir, "test.tar.gz"),
                 'rb').read()).hexdigest()
        form.signal_tab_controller.signal_frames[0].signal._fulldata = np.ones(
            5, dtype=np.complex64)
        form.signal_tab_controller.signal_frames[0].signal.changed = True
        form.signal_tab_controller.signal_frames[0].ui.btnSaveSignal.click()

        tar_md5_after_save = hashlib.md5(
            open(os.path.join(temp_dir, "test.tar.gz"),
                 'rb').read()).hexdigest()
        self.assertNotEqual(tar_md5, tar_md5_after_save)

        zip_md5 = hashlib.md5(
            open(os.path.join(temp_dir, "test.zip"), 'rb').read()).hexdigest()
        form.signal_tab_controller.signal_frames[4].signal._fulldata = np.ones(
            5, dtype=np.complex64)
        form.signal_tab_controller.signal_frames[4].signal.changed = True
        form.signal_tab_controller.signal_frames[4].ui.btnSaveSignal.click()

        zip_md5_after_save = hashlib.md5(
            open(os.path.join(temp_dir, "test.zip"), 'rb').read()).hexdigest()
        self.assertNotEqual(zip_md5, zip_md5_after_save)
Esempio n. 2
0
class TestSignalTabGUI(unittest.TestCase):
    def setUp(self):
        constants.SETTINGS.setValue("not_show_save_dialog", True)
        self.form = MainController()
        self.form.add_signalfile(get_path_for_data_file("esaver.complex"))
        self.frame = self.form.signal_tab_controller.signal_frames[0]

    def test_close_all(self):
        self.form.close_all()
        QTest.qWait(250)
        self.assertEqual(self.form.signal_tab_controller.num_signals, 0)

        # Add a bunch of signals
        num_signals = 10
        for _ in range(num_signals):
            self.form.add_signalfile(get_path_for_data_file("esaver.complex"))

        self.assertEqual(self.form.signal_tab_controller.num_signals, num_signals)

        self.form.close_all()
        QTest.qWait(250)

        self.form.add_signalfile(get_path_for_data_file("ask.complex"))
        self.assertEqual(self.form.signal_tab_controller.num_signals, 1)

    def test_zoom(self):
        x_zoom = self.frame.ui.spinBoxXZoom.value()
        self.assertEqual(x_zoom, 100)

        for _ in range(10):
            self.frame.ui.gvSignal.zoom(1.01)
            self.assertGreater(self.frame.ui.spinBoxXZoom.value(), x_zoom)
            x_zoom = self.frame.ui.spinBoxXZoom.value()

        for _ in range(10):
            self.frame.ui.gvSignal.zoom(0.99)
            self.assertLess(self.frame.ui.spinBoxXZoom.value(), x_zoom)
            x_zoom = self.frame.ui.spinBoxXZoom.value()

        samples_in_view = self.frame.ui.lSamplesInView.text()
        self.frame.ui.spinBoxXZoom.setValue(self.frame.ui.spinBoxXZoom.value() + 400)
        self.assertNotEqual(samples_in_view, self.frame.ui.lSamplesInView.text())

    def test_load_proto(self):
        self.form.add_files([get_path_for_data_file("protocol.proto")])
        self.assertEqual(self.form.signal_tab_controller.signal_frames[1].ui.lSignalTyp.text(), "Protocol (*.proto)")

    def test_graphic_view_selection(self):
        self.frame.ui.gvSignal.selection_area.start = 0
        self.frame.ui.gvSignal.selection_area.end = 4000
        self.frame.ui.gvSignal.sel_area_start_end_changed.emit(0, 4000)

        self.assertEqual(self.frame.ui.lNumSelectedSamples.text(), "4000")

        noise_val = self.frame.ui.spinBoxNoiseTreshold.value()
        self.frame.ui.gvSignal.set_noise_clicked.emit()
        self.assertNotEqual(noise_val, self.frame.ui.spinBoxNoiseTreshold.value())

        self.frame.ui.spinBoxSelectionStart.setValue(300)
        self.assertEqual(self.frame.ui.gvSignal.selection_area.start, 300)
        self.frame.ui.spinBoxSelectionEnd.setValue(6000)
        self.assertEqual(self.frame.ui.gvSignal.selection_area.end, 6000)

    def test_graphic_view_zoom_to_selection(self):
        self.frame.ui.gvSignal.context_menu_position = QPoint(0, 0)
        menu = self.frame.ui.gvSignal.create_context_menu()
        self.assertTrue(self.frame.ui.gvSignal.selection_area.is_empty)
        self.assertIsNone(next((action for action in menu.actions() if action.text() == "Zoom selection"), None))

        self.frame.ui.gvSignal.selection_area.start = 1337
        self.frame.ui.gvSignal.selection_area.end = 4711
        self.frame.ui.gvSignal.sel_area_start_end_changed.emit(1337, 4711)

        menu = self.frame.ui.gvSignal.create_context_menu()
        self.assertFalse(self.frame.ui.gvSignal.selection_area.is_empty)
        zoom_action = next(action for action in menu.actions() if action.text() == "Zoom selection")
        zoom_action.trigger()
        self.assertEqual(self.frame.ui.spinBoxSelectionStart.value(), 1337)
        self.assertEqual(self.frame.ui.spinBoxSelectionEnd.value(), 4711)

    def test_show_hide_start_end(self):
        self.assertEqual(self.frame.ui.btnShowHideStartEnd.text(), "+")
        self.frame.ui.btnShowHideStartEnd.click()
        self.assertEqual(self.frame.ui.btnShowHideStartEnd.text(), "-")

    def test_apply_to_all(self):
        self.form.add_signalfile(get_path_for_data_file("ask.complex"))
        frame2 = self.form.signal_tab_controller.signal_frames[1]

        self.frame.ui.spinBoxInfoLen.setValue(42)
        self.frame.ui.spinBoxInfoLen.editingFinished.emit()

        self.frame.ui.spinBoxCenterOffset.setValue(0.1)
        self.frame.ui.spinBoxCenterOffset.editingFinished.emit()

        self.frame.ui.spinBoxNoiseTreshold.setValue(0.5)
        self.frame.ui.spinBoxNoiseTreshold.editingFinished.emit()

        self.frame.ui.spinBoxTolerance.setValue(10)
        self.frame.ui.spinBoxTolerance.editingFinished.emit()

        self.frame.apply_to_all_clicked.emit(self.frame.signal)

        self.assertEqual(42, frame2.ui.spinBoxInfoLen.value())
        self.assertEqual(0.1, frame2.ui.spinBoxCenterOffset.value())
        self.assertEqual(0.5, frame2.ui.spinBoxNoiseTreshold.value())
        self.assertEqual(10, frame2.ui.spinBoxTolerance.value())

    def test_save_all(self):
        self.form.add_signalfile(get_path_for_data_file("ask.complex"))
        frame2 = self.form.signal_tab_controller.signal_frames[1]

        self.frame.signal.changed = True
        self.frame.signal.filename = os.path.join(QDir.tempPath(), "sig1.complex")

        frame2.signal.changed = True
        frame2.signal.filename = os.path.join(QDir.tempPath(), "sig2.complex")

        self.assertFalse(os.path.isfile(self.frame.signal.filename))
        self.assertFalse(os.path.isfile(frame2.signal.filename))

        self.form.signal_tab_controller.save_all()

        self.assertTrue(os.path.isfile(self.frame.signal.filename))
        self.assertTrue(os.path.isfile(frame2.signal.filename))

        os.remove(self.frame.signal.filename)
        os.remove(frame2.signal.filename)

    def test_crop_and_save_signal(self):
        self.frame.ui.gvSignal.selection_area.end = 4000
        self.frame.ui.gvSignal.selection_area.start = 1000

        self.assertEqual(self.frame.ui.gvSignal.selection_area.end, 4000)
        self.assertEqual(self.frame.ui.gvSignal.selection_area.width, 3000)
        self.frame.ui.gvSignal.sel_area_start_end_changed.emit(1000, 4000)

        self.frame.ui.gvSignal.on_crop_action_triggered()
        self.assertEqual(self.frame.signal.num_samples, 3000)
        self.assertTrue(self.frame.signal.changed)

        self.frame.signal.filename = os.path.join(QDir.tempPath(), "sig.complex")
        self.assertFalse(os.path.isfile(self.frame.signal.filename))
        self.frame.ui.btnSaveSignal.click()
        self.form.close_signal_frame(self.frame)
        QTest.qWait(50)
        self.form.add_signalfile(os.path.join(QDir.tempPath(), "sig.complex"))
        self.assertEqual(self.form.signal_tab_controller.signal_frames[0].signal.num_samples, 3000)
        os.remove(os.path.join(QDir.tempPath(), "sig.complex"))
Esempio n. 3
0
class TestSignalTabGUI(unittest.TestCase):
    def setUp(self):
        self.form = MainController()

    def test_close_all(self):
        # Add a bunch of signals
        NUM_SIGNALS = 10
        for _ in range(NUM_SIGNALS):
            self.form.add_signalfile(get_path_for_data_file("esaver.complex"))

        self.assertEqual(self.form.signal_tab_controller.num_signals,
                         NUM_SIGNALS)

        self.form.close_all()
        QTest.qWait(100)
        self.assertEqual(self.form.signal_tab_controller.num_signals, 0)

        self.form.add_signalfile(get_path_for_data_file("ask.complex"))
        self.assertEqual(self.form.signal_tab_controller.num_signals, 1)

    def test_zoom(self):
        self.form.add_signalfile(get_path_for_data_file("esaver.complex"))
        frame = self.form.signal_tab_controller.signal_frames[0]
        x_zoom = frame.ui.spinBoxXZoom.value()
        self.assertEqual(x_zoom, 100)

        for _ in range(10):
            frame.ui.gvSignal.zoom(1.01)
            self.assertGreater(frame.ui.spinBoxXZoom.value(), x_zoom)
            x_zoom = frame.ui.spinBoxXZoom.value()

        for _ in range(10):
            frame.ui.gvSignal.zoom(0.99)
            self.assertLess(frame.ui.spinBoxXZoom.value(), x_zoom)
            x_zoom = frame.ui.spinBoxXZoom.value()

        samples_in_view = frame.ui.lSamplesInView.text()
        frame.ui.spinBoxXZoom.setValue(frame.ui.spinBoxXZoom.value() + 400)
        self.assertNotEqual(samples_in_view, frame.ui.lSamplesInView.text())

    def test_load_proto(self):
        self.form.add_files([get_path_for_data_file("protocol.proto")])
        self.assertEqual(
            self.form.signal_tab_controller.signal_frames[0].ui.lSignalTyp.
            text(), "Protocol (*.proto)")

    def test_graphic_view_selection(self):
        self.form.add_signalfile(get_path_for_data_file("esaver.complex"))
        frame = self.form.signal_tab_controller.signal_frames[0]

        frame.ui.gvSignal.selection_area.start = 0
        frame.ui.gvSignal.selection_area.end = 4000
        frame.ui.gvSignal.sel_area_start_end_changed.emit(0, 4000)

        self.assertEqual(frame.ui.lNumSelectedSamples.text(), "4000")

        noise_val = frame.ui.spinBoxNoiseTreshold.value()
        frame.ui.gvSignal.set_noise_clicked.emit()
        self.assertNotEqual(noise_val, frame.ui.spinBoxNoiseTreshold.value())

        frame.ui.spinBoxSelectionStart.setValue(300)
        self.assertEqual(frame.ui.gvSignal.selection_area.start, 300)
        frame.ui.spinBoxSelectionEnd.setValue(6000)
        self.assertEqual(frame.ui.gvSignal.selection_area.end, 6000)

    def test_show_hide_start_end(self):
        self.form.add_signalfile(get_path_for_data_file("esaver.complex"))
        frame = self.form.signal_tab_controller.signal_frames[0]

        self.assertEqual(frame.ui.btnShowHideStartEnd.text(), "+")
        frame.ui.btnShowHideStartEnd.click()
        self.assertEqual(frame.ui.btnShowHideStartEnd.text(), "-")
Esempio n. 4
0
class TestSimulator(QtTestCase):
    def setUp(self):
        super().setUp()
        SettingsProxy.OVERWRITE_RECEIVE_BUFFER_SIZE = 10 * 10**6

        self.num_zeros_for_pause = 1000

    def test_performance(self):
        self.form = MainController()
        self.cfc = self.form.compare_frame_controller
        self.stc = self.form.simulator_tab_controller
        self.gtc = self.form.generator_tab_controller

        self.form.add_signalfile(get_path_for_data_file("esaver.complex"))
        self.sframe = self.form.signal_tab_controller.signal_frames[0]
        self.sim_frame = self.form.simulator_tab_controller
        self.form.ui.tabWidget.setCurrentIndex(3)
        self.cfc.proto_analyzer.auto_assign_labels()

        self.network_sdr_plugin_sender = NetworkSDRInterfacePlugin(
            raw_mode=True)

        part_a = Participant("Device A", shortname="A", color_index=0)
        part_b = Participant("Device B", shortname="B", color_index=1)
        part_b.simulate = True

        self.form.project_manager.participants.append(part_a)
        self.form.project_manager.participants.append(part_b)
        self.form.project_manager.project_updated.emit()

        sniffer = ProtocolSniffer(100,
                                  0.01,
                                  0.1,
                                  5,
                                  1,
                                  NetworkSDRInterfacePlugin.NETWORK_SDR_NAME,
                                  BackendHandler(),
                                  network_raw_mode=True)
        sender = EndlessSender(BackendHandler(),
                               NetworkSDRInterfacePlugin.NETWORK_SDR_NAME)

        simulator = Simulator(self.stc.simulator_config,
                              self.gtc.modulators,
                              self.stc.sim_expression_parser,
                              self.form.project_manager,
                              sniffer=sniffer,
                              sender=sender)

        pause = 100000
        msg_a = SimulatorMessage(
            part_b, [1, 0] * 16 + [1, 1, 0, 0] * 8 + [0, 0, 1, 1] * 8 +
            [1, 0, 1, 1, 1, 0, 0, 1, 1, 1] * 4,
            pause=pause,
            message_type=MessageType("empty_message_type"),
            source=part_a)

        msg_b = SimulatorMessage(
            part_a, [1, 0] * 16 + [1, 1, 0, 0] * 8 + [1, 1, 0, 0] * 8 +
            [1, 0, 1, 1, 1, 0, 0, 1, 1, 1] * 4,
            pause=pause,
            message_type=MessageType("empty_message_type"),
            source=part_b)

        self.stc.simulator_config.add_items([msg_a, msg_b], 0, None)
        self.stc.simulator_config.update_active_participants()

        port = self.get_free_port()
        sniffer = simulator.sniffer
        sniffer.rcv_device.set_server_port(port)

        self.network_sdr_plugin_sender.client_port = port

        sender = simulator.sender
        port = self.get_free_port()
        sender.device.set_client_port(port)
        sender.device._VirtualDevice__dev.name = "simulator_sender"

        current_index = Value("L")
        elapsed = Value("f")
        target_num_samples = 113600 - pause
        receive_process = Process(target=receive,
                                  args=(port, current_index,
                                        target_num_samples, elapsed))
        receive_process.daemon = True
        receive_process.start()

        # Ensure receiver is running
        time.sleep(2)

        # spy = QSignalSpy(self.network_sdr_plugin_receiver.rcv_index_changed)
        simulator.start()

        modulator = Modulator("test_modulator")
        modulator.samples_per_bit = 100
        modulator.carrier_freq_hz = 55e3

        # yappi.start()

        self.network_sdr_plugin_sender.send_raw_data(
            modulator.modulate(msg_a.encoded_bits), 1)
        QTest.qWait(10)
        # send some zeros to simulate the end of a message
        self.network_sdr_plugin_sender.send_raw_data(
            np.zeros(self.num_zeros_for_pause, dtype=np.complex64), 1)
        QTest.qWait(100)
        receive_process.join(10)

        logger.info("PROCESS TIME: {0:.2f}ms".format(elapsed.value))

        self.assertEqual(current_index.value, target_num_samples)
        self.assertLess(elapsed.value, 200)

        # timeout = spy.wait(2000)
        # yappi.get_func_stats().print_all()
        # yappi.get_thread_stats().print_all()

    def test_simulation_flow(self):
        """
        test a simulation flow with an increasing sequence number

        :return:
        """
        profile = self.get_path_for_filename("testprofile.sim.xml")
        self.form.add_files([profile])
        self.assertEqual(
            len(self.form.simulator_tab_controller.simulator_scene.
                get_all_message_items()), 6)

        port = self.get_free_port()
        self.alice = NetworkSDRInterfacePlugin(raw_mode=True)
        self.alice.client_port = port

        dialog = self.form.simulator_tab_controller.get_simulator_dialog()
        name = NetworkSDRInterfacePlugin.NETWORK_SDR_NAME
        dialog.device_settings_rx_widget.ui.cbDevice.setCurrentText(name)
        dialog.device_settings_tx_widget.ui.cbDevice.setCurrentText(name)
        QTest.qWait(10)
        simulator = dialog.simulator
        simulator.sniffer.rcv_device.set_server_port(port)

        port = self.get_free_port()
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
        s.bind(("", port))
        s.listen(1)
        QTest.qWait(10)

        simulator.sender.device.set_client_port(port)
        dialog.ui.btnStartStop.click()
        QTest.qWait(1500)

        conn, addr = s.accept()

        msg = next(msg for msg in dialog.simulator_config.get_all_messages()
                   if msg.source.name == "Alice")
        checksum_label = next(
            lbl for lbl in msg.message_type
            if lbl.is_checksum_label).label  # type: ChecksumLabel

        modulator = dialog.project_manager.modulators[0]  # type: Modulator
        preamble_str = "10101010"
        sync_str = "1001"
        preamble = list(map(int, preamble_str))
        sync = list(map(int, sync_str))
        seq = list(map(int, "00000010"))
        data = list(map(int, "11001101"))

        seq_num = int("".join(map(str, seq)), 2)

        checksum = list(checksum_label.calculate_checksum(seq + data))

        msg1 = preamble + sync + seq + data + checksum

        self.alice.send_raw_data(modulator.modulate(msg1), 1)
        self.alice.send_raw_data(
            np.zeros(self.num_zeros_for_pause, dtype=np.complex64), 1)

        bits = self.__demodulate(conn)
        self.assertEqual(len(bits), 1)
        bits = bits[0]
        self.assertTrue(bits.startswith(preamble_str + sync_str))
        bits = bits.replace(preamble_str + sync_str, "")
        self.assertEqual(int(bits, 2), seq_num + 1)

        seq = list(map(int, "{0:08b}".format(seq_num + 2)))
        checksum = list(checksum_label.calculate_checksum(seq + data))
        msg2 = preamble + sync + seq + data + checksum

        self.alice.send_raw_data(modulator.modulate(msg2), 1)
        self.alice.send_raw_data(
            np.zeros(self.num_zeros_for_pause, dtype=np.complex64), 1)

        bits = self.__demodulate(conn)
        self.assertEqual(len(bits), 1)
        bits = bits[0]
        self.assertTrue(bits.startswith(preamble_str + sync_str))
        bits = bits.replace(preamble_str + sync_str, "")
        self.assertEqual(int(bits, 2), seq_num + 3)

        seq = list(map(int, "{0:08b}".format(seq_num + 4)))
        checksum = list(checksum_label.calculate_checksum(seq + data))
        msg3 = preamble + sync + seq + data + checksum

        self.alice.send_raw_data(modulator.modulate(msg3), 1)
        self.alice.send_raw_data(
            np.zeros(self.num_zeros_for_pause, dtype=np.complex64), 1)

        bits = self.__demodulate(conn)
        self.assertEqual(len(bits), 1)
        bits = bits[0]
        self.assertTrue(bits.startswith(preamble_str + sync_str))
        bits = bits.replace(preamble_str + sync_str, "")
        self.assertEqual(int(bits, 2), seq_num + 5)

        QTest.qWait(50)
        self.assertTrue(simulator.simulation_is_finished())

        time.sleep(1)

        conn.close()
        s.close()

        QTest.qWait(100)

    def test_external_program_simulator(self):
        stc = self.form.simulator_tab_controller
        stc.ui.btnAddParticipant.click()
        stc.ui.btnAddParticipant.click()

        stc.simulator_scene.add_counter_action(None, 0)
        action = next(item for item in stc.simulator_scene.items()
                      if isinstance(item, CounterActionItem))
        action.model_item.start = 3
        action.model_item.step = 2
        counter_item_str = "item" + str(
            action.model_item.index()) + ".counter_value"

        stc.ui.gvSimulator.add_empty_message(42)
        stc.ui.gvSimulator.add_empty_message(42)

        stc.ui.cbViewType.setCurrentIndex(0)
        stc.create_simulator_label(0, 10, 20)
        stc.create_simulator_label(1, 10, 20)

        messages = stc.simulator_config.get_all_messages()
        messages[0].source = stc.project_manager.participants[0]
        messages[0].destination = stc.project_manager.participants[1]
        messages[0].destination.simulate = True
        messages[1].source = stc.project_manager.participants[1]
        messages[1].destination = stc.project_manager.participants[0]

        stc.simulator_scene.add_trigger_command_action(None, 200)
        stc.simulator_scene.add_sleep_action(None, 200)

        lbl1 = messages[0].message_type[0]  # type: SimulatorProtocolLabel
        lbl2 = messages[1].message_type[0]  # type: SimulatorProtocolLabel

        lbl1.value_type_index = 3
        lbl1.external_program = get_path_for_data_file(
            "external_program_simulator.py") + " " + counter_item_str
        lbl2.value_type_index = 3
        lbl2.external_program = get_path_for_data_file(
            "external_program_simulator.py") + " " + counter_item_str

        action = next(item for item in stc.simulator_scene.items()
                      if isinstance(item, SleepActionItem))
        action.model_item.sleep_time = 0.001
        stc.simulator_scene.clearSelection()
        action = next(item for item in stc.simulator_scene.items()
                      if isinstance(item, TriggerCommandActionItem))
        action.setSelected(True)
        self.assertEqual(stc.ui.detail_view_widget.currentIndex(), 4)
        fname = tempfile.mktemp()
        self.assertFalse(os.path.isfile(fname))
        external_command = "cmd.exe /C copy NUL {}".format(
            fname) if os.name == "nt" else "touch {}".format(fname)
        stc.ui.lineEditTriggerCommand.setText(external_command)
        self.assertEqual(action.model_item.command, external_command)

        port = self.get_free_port()
        self.alice = NetworkSDRInterfacePlugin(raw_mode=True)
        self.alice.client_port = port

        dialog = stc.get_simulator_dialog()
        name = NetworkSDRInterfacePlugin.NETWORK_SDR_NAME
        dialog.device_settings_rx_widget.ui.cbDevice.setCurrentText(name)
        dialog.device_settings_tx_widget.ui.cbDevice.setCurrentText(name)
        QTest.qWait(10)
        simulator = dialog.simulator
        simulator.sniffer.rcv_device.set_server_port(port)

        port = self.get_free_port()
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
        s.bind(("", port))
        s.listen(1)
        QTest.qWait(10)

        simulator.sender.device.set_client_port(port)
        dialog.ui.btnStartStop.click()
        QTest.qWait(1500)

        conn, addr = s.accept()

        modulator = dialog.project_manager.modulators[0]  # type: Modulator

        self.alice.send_raw_data(modulator.modulate("100" + "10101010" * 42),
                                 1)
        self.alice.send_raw_data(
            np.zeros(self.num_zeros_for_pause, dtype=np.complex64), 1)

        bits = self.__demodulate(conn)
        self.assertEqual(bits[0], "101010101")

        QTest.qWait(500)
        self.assertTrue(simulator.simulation_is_finished())

        conn.close()
        s.close()

        QTest.qWait(100)

        self.assertTrue(os.path.isfile(fname))

    def __demodulate(self, connection):
        QTest.qWait(100)
        data = connection.recv(65536)
        while len(data) % 8 != 0:
            data += connection.recv(65536)

        arr = np.array(np.frombuffer(data, dtype=np.complex64))
        signal = Signal("", "")
        signal._fulldata = arr
        pa = ProtocolAnalyzer(signal)
        pa.get_protocol_from_signal()
        return pa.plain_bits_str
Esempio n. 5
0
class TestSignalTabGUI(unittest.TestCase):
    def setUp(self):
        constants.SETTINGS.setValue("not_show_save_dialog", True)
        logger.debug("Init Form")
        tests.utils_testing.short_wait()
        self.form = MainController()
        tests.utils_testing.short_wait()
        logger.debug("Add Signal")
        self.form.add_signalfile(get_path_for_data_file("esaver.complex"))
        logger.debug("Added Signal")
        app.processEvents()
        self.frame = self.form.signal_tab_controller.signal_frames[0]
        self.frame.signal.noise_threshold = 0.0023
        self.frame.signal.qad_center = 0.3817
        self.frame.signal.bit_len = 84

    def tearDown(self):
        self.form.close_all()
        tests.utils_testing.short_wait()
        self.form.close()
        self.form.setParent(None)
        self.form.deleteLater()
        tests.utils_testing.short_wait()

    def test_close_all(self):
        logger.debug("Close all")
        self.form.close_all()
        tests.utils_testing.short_wait()
        logger.debug("Called close all")
        app.processEvents()
        self.assertEqual(self.form.signal_tab_controller.num_signals, 0)

        # Add a bunch of signals
        num_signals = 5
        for _ in range(num_signals):
            tests.utils_testing.short_wait()
            self.form.add_signalfile(get_path_for_data_file("esaver.complex"))

        self.assertEqual(self.form.signal_tab_controller.num_signals,
                         num_signals)

        self.form.close_all()
        tests.utils_testing.short_wait()

        self.form.add_signalfile(get_path_for_data_file("ask.complex"))
        self.assertEqual(self.form.signal_tab_controller.num_signals, 1)

    def test_zoom(self):
        tests.utils_testing.short_wait()
        x_zoom = self.frame.ui.spinBoxXZoom.value()
        self.assertEqual(x_zoom, 100)

        for _ in range(10):
            self.frame.ui.gvSignal.zoom(1.01)
            self.assertGreater(self.frame.ui.spinBoxXZoom.value(), x_zoom)
            x_zoom = self.frame.ui.spinBoxXZoom.value()

        for _ in range(10):
            self.frame.ui.gvSignal.zoom(0.99)
            self.assertLess(self.frame.ui.spinBoxXZoom.value(), x_zoom)
            x_zoom = self.frame.ui.spinBoxXZoom.value()

        samples_in_view = self.frame.ui.lSamplesInView.text()
        self.frame.ui.spinBoxXZoom.setValue(
            self.frame.ui.spinBoxXZoom.value() + 400)
        self.assertNotEqual(samples_in_view,
                            self.frame.ui.lSamplesInView.text())

    def test_load_proto(self):
        self.form.add_files([get_path_for_data_file("protocol.proto")])
        self.assertEqual(
            self.form.signal_tab_controller.signal_frames[1].ui.lSignalTyp.
            text(), "Protocol (*.proto)")

    def test_graphic_view_selection(self):
        self.frame.ui.gvSignal.selection_area.start = 0
        self.frame.ui.gvSignal.selection_area.end = 4000
        self.frame.ui.gvSignal.sel_area_start_end_changed.emit(0, 4000)

        self.assertEqual(self.frame.ui.lNumSelectedSamples.text(), "4000")

        noise_val = self.frame.ui.spinBoxNoiseTreshold.value()
        self.frame.ui.gvSignal.set_noise_clicked.emit()
        self.assertNotEqual(noise_val,
                            self.frame.ui.spinBoxNoiseTreshold.value())

        self.frame.ui.spinBoxSelectionStart.setValue(300)
        self.assertEqual(self.frame.ui.gvSignal.selection_area.start, 300)
        self.frame.ui.spinBoxSelectionEnd.setValue(6000)
        self.assertEqual(self.frame.ui.gvSignal.selection_area.end, 6000)

    def test_graphic_view_zoom_to_selection(self):
        self.frame.ui.gvSignal.context_menu_position = QPoint(0, 0)
        menu = self.frame.ui.gvSignal.create_context_menu()
        self.assertTrue(self.frame.ui.gvSignal.selection_area.is_empty)
        self.assertIsNone(
            next((action for action in menu.actions()
                  if action.text() == "Zoom selection"), None))

        self.frame.ui.gvSignal.selection_area.start = 1337
        self.frame.ui.gvSignal.selection_area.end = 4711
        self.frame.ui.gvSignal.sel_area_start_end_changed.emit(1337, 4711)

        menu = self.frame.ui.gvSignal.create_context_menu()
        self.assertFalse(self.frame.ui.gvSignal.selection_area.is_empty)
        zoom_action = next(action for action in menu.actions()
                           if action.text() == "Zoom selection")
        zoom_action.trigger()
        self.assertEqual(self.frame.ui.spinBoxSelectionStart.value(), 1337)
        self.assertEqual(self.frame.ui.spinBoxSelectionEnd.value(), 4711)

    def test_show_hide_start_end(self):
        self.assertEqual(self.frame.ui.btnShowHideStartEnd.text(), "+")
        self.frame.ui.btnShowHideStartEnd.click()
        self.assertEqual(self.frame.ui.btnShowHideStartEnd.text(), "-")

    def test_apply_to_all(self):
        logger.debug("Test apply to all")
        tests.utils_testing.short_wait()
        self.form.add_signalfile(get_path_for_data_file("ask.complex"))
        logger.debug("added new signal")
        frame2 = self.form.signal_tab_controller.signal_frames[1]

        self.frame.ui.spinBoxInfoLen.setValue(42)
        self.frame.ui.spinBoxInfoLen.editingFinished.emit()

        self.frame.ui.spinBoxCenterOffset.setValue(0.1)
        self.frame.ui.spinBoxCenterOffset.editingFinished.emit()

        self.frame.ui.spinBoxNoiseTreshold.setValue(0.5)
        self.frame.ui.spinBoxNoiseTreshold.editingFinished.emit()

        self.frame.ui.spinBoxTolerance.setValue(10)
        self.frame.ui.spinBoxTolerance.editingFinished.emit()

        self.frame.apply_to_all_clicked.emit(self.frame.signal)

        self.assertEqual(42, frame2.ui.spinBoxInfoLen.value())
        self.assertEqual(0.1, frame2.ui.spinBoxCenterOffset.value())
        self.assertEqual(0.5, frame2.ui.spinBoxNoiseTreshold.value())
        self.assertEqual(10, frame2.ui.spinBoxTolerance.value())

    def test_save_all(self):
        logger.debug("Test save all")
        tests.utils_testing.short_wait()
        self.form.add_signalfile(get_path_for_data_file("ask.complex"))
        frame2 = self.form.signal_tab_controller.signal_frames[1]

        self.frame.signal.changed = True
        self.frame.signal.filename = os.path.join(QDir.tempPath(),
                                                  "sig1.complex")

        frame2.signal.changed = True
        frame2.signal.filename = os.path.join(QDir.tempPath(), "sig2.complex")

        self.assertFalse(os.path.isfile(self.frame.signal.filename))
        self.assertFalse(os.path.isfile(frame2.signal.filename))

        self.form.signal_tab_controller.save_all()

        self.assertTrue(os.path.isfile(self.frame.signal.filename))
        self.assertTrue(os.path.isfile(frame2.signal.filename))

        os.remove(self.frame.signal.filename)
        os.remove(frame2.signal.filename)

    def test_crop_and_save_signal(self):
        self.frame.ui.gvSignal.selection_area.end = 4000
        self.frame.ui.gvSignal.selection_area.start = 1000

        self.assertEqual(self.frame.ui.gvSignal.selection_area.end, 4000)
        self.assertEqual(self.frame.ui.gvSignal.selection_area.width, 3000)
        self.frame.ui.gvSignal.sel_area_start_end_changed.emit(1000, 4000)

        self.frame.ui.gvSignal.on_crop_action_triggered()
        self.assertEqual(self.frame.signal.num_samples, 3000)
        self.assertTrue(self.frame.signal.changed)

        self.frame.signal.filename = os.path.join(QDir.tempPath(),
                                                  "sig.complex")
        if os.path.isfile(self.frame.signal.filename):
            os.remove(self.frame.signal.filename)

        self.assertFalse(os.path.isfile(self.frame.signal.filename))
        self.frame.ui.btnSaveSignal.click()
        self.form.close_signal_frame(self.frame)
        tests.utils_testing.short_wait()
        self.form.add_signalfile(os.path.join(QDir.tempPath(), "sig.complex"))
        self.assertEqual(
            self.form.signal_tab_controller.signal_frames[0].signal.
            num_samples, 3000)
        os.remove(os.path.join(QDir.tempPath(), "sig.complex"))

    def test_selection_sync(self):
        self.frame.ui.gvSignal.selection_area.end = 128440
        self.frame.ui.gvSignal.selection_area.start = 89383
        self.frame.ui.gvSignal.sel_area_start_end_changed.emit(89383, 128440)
        tests.utils_testing.short_wait()
        self.assertEqual(self.frame.proto_analyzer.messages[0].plain_bits_str,
                         self.frame.ui.txtEdProto.selected_text)
        self.frame.ui.txtEdProto.show_proto_clicked.emit()
        tests.utils_testing.short_wait()
        self.assertAlmostEqual(
            (128440 - 89383) / 1000000,
            (self.frame.ui.gvSignal.view_rect().width()) / 1000000,
            places=1)

    def test_show_demod_view(self):
        self.assertTrue(self.frame.ui.gvLegend.isHidden())
        self.frame.ui.cbSignalView.setCurrentIndex(1)
        self.assertFalse(self.frame.ui.gvLegend.isHidden())

    def test_auto_detect_button(self):
        self.assertTrue(self.frame.ui.btnAutoDetect.isChecked())
        self.frame.ui.btnAutoDetect.click()
        self.assertFalse(self.frame.ui.btnAutoDetect.isChecked())