mirror of
https://github.com/jopohl/urh.git
synced 2026-03-03 15:04:01 +01:00
* add argument parser for CLI * add pause to cli * parse messages to send * add send function * use while loop instead of hard sleep * use logger for error msg * use tabulator for progress bar * prepare rx mode * use Thread for Protocol Sniffer instead of qt signals * adapt tests * fix thread can only be started once error * enable receiving from command line * support send from file * save gain correctly * enable rx into file * remove unused signal * enable raw rx and file mode * add support for device identifier * add support for default pause * enable abort sending witt ctrl c * support encodings * make logging multiprocessing aware and add autobuild extensions to cli * move place * fix sniffer when receiving multiple messages at once * add test for modulator cli parsing and fix some bugs * extend modulator test and fix another bug * add unittests and reorder urh_cli structure * add tests * adapt CI to CLI tests * force osx * fix osx * adapt close dialog method * remove close dialog method * test read messages to send * centralize read messages method * increase timeout for ci * support loading of project files to load cli values * add sleep for ci * add cli to deployment * replace static calls with ProjectManager Class * use time sleep instead of qwait * disable gc collect call * disable gc collect for python 3.4 only * gc collect only for osx * simplify cleanup * simplify cleanup * advanced cleanup only for windows * cleanup also for osx * gc collect for osx * add unittests * consider frozen app path * init multiprocessing first * enable logging on cli for windows * use log file handler for log * add missing import
109 lines
3.7 KiB
Python
109 lines
3.7 KiB
Python
import faulthandler
|
|
import os
|
|
import sip
|
|
import sys
|
|
import time
|
|
import unittest
|
|
import gc
|
|
|
|
from PyQt5.QtCore import Qt
|
|
from PyQt5.QtGui import QDropEvent
|
|
from PyQt5.QtTest import QTest
|
|
from PyQt5.QtWidgets import QApplication
|
|
|
|
from tests.utils_testing import write_settings, get_path_for_data_file
|
|
from urh.controller.MainController import MainController
|
|
from urh.util.Logger import logger
|
|
|
|
faulthandler.enable()
|
|
|
|
|
|
class QtTestCase(unittest.TestCase):
|
|
CLOSE_TIMEOUT = 10
|
|
WAIT_TIMEOUT_BEFORE_NEW = 10
|
|
SHOW = os.path.exists(os.path.join(os.path.dirname(os.path.realpath(__file__)), "show_gui"))
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
import multiprocessing as mp
|
|
try:
|
|
mp.set_start_method("spawn")
|
|
except RuntimeError:
|
|
pass
|
|
assert mp.get_start_method() == "spawn"
|
|
|
|
write_settings()
|
|
cls.app = QApplication([cls.__name__])
|
|
logger.debug("Start new app with name {}".format(cls.app.applicationName()))
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
cls.app.quit()
|
|
if sys.platform == "win32" or sys.platform == "darwin":
|
|
sip.delete(cls.app)
|
|
cls.app = None
|
|
QTest.qWait(10)
|
|
time.sleep(0.1)
|
|
|
|
def setUp(self):
|
|
self.form = MainController()
|
|
if self.SHOW:
|
|
self.form.show()
|
|
|
|
def tearDown(self):
|
|
if hasattr(self, "dialog"):
|
|
self.dialog.close()
|
|
|
|
if sys.platform == "win32" or sys.platform == "darwin":
|
|
sip.delete(self.dialog)
|
|
self.dialog = None
|
|
|
|
if hasattr(self, "form"):
|
|
self.form.close_all()
|
|
self.form.close()
|
|
|
|
if sys.platform == "win32" or sys.platform == "darwin":
|
|
sip.delete(self.form)
|
|
self.form = None
|
|
if sys.platform == "darwin":
|
|
gc.collect()
|
|
def wait_before_new_file(self):
|
|
QApplication.instance().processEvents()
|
|
QTest.qWait(self.WAIT_TIMEOUT_BEFORE_NEW)
|
|
|
|
def add_signal_to_form(self, filename: str):
|
|
self.wait_before_new_file()
|
|
self.form.add_signalfile(get_path_for_data_file(filename))
|
|
|
|
def get_path_for_filename(self, filename) -> str:
|
|
return get_path_for_data_file(filename)
|
|
|
|
def add_signal_to_generator(self, signal_index: int):
|
|
gframe = self.form.generator_tab_controller
|
|
item = gframe.tree_model.rootItem.children[0].children[signal_index]
|
|
index = gframe.tree_model.createIndex(signal_index, 0, item)
|
|
rect = gframe.ui.treeProtocols.visualRect(index)
|
|
QTest.mousePress(gframe.ui.treeProtocols.viewport(), Qt.LeftButton, pos=rect.center())
|
|
self.assertEqual(gframe.ui.treeProtocols.selectedIndexes()[0], index)
|
|
mimedata = gframe.tree_model.mimeData(gframe.ui.treeProtocols.selectedIndexes())
|
|
gframe.table_model.dropMimeData(mimedata, 1, -1, -1, gframe.table_model.createIndex(0, 0))
|
|
|
|
def add_all_signals_to_simulator(self):
|
|
assert isinstance(self.form, MainController)
|
|
sim_frame = self.form.simulator_tab_controller
|
|
sim_frame.ui.treeProtocols.selectAll()
|
|
self.assertGreater(len(sim_frame.ui.treeProtocols.selectedIndexes()), 0)
|
|
mimedata = sim_frame.tree_model.mimeData(sim_frame.ui.treeProtocols.selectedIndexes())
|
|
drop_event = QDropEvent(sim_frame.ui.gvSimulator.rect().center(), Qt.CopyAction | Qt.MoveAction,
|
|
mimedata, Qt.LeftButton, Qt.NoModifier)
|
|
drop_event.acceptProposedAction()
|
|
sim_frame.ui.gvSimulator.dropEvent(drop_event)
|
|
|
|
def get_free_port(self):
|
|
import socket
|
|
s = socket.socket()
|
|
s.bind(("", 0))
|
|
port = s.getsockname()[1]
|
|
s.close()
|
|
return port
|