HackRF-Treasure-Chest/Software/Universal Radio Hacker/tests/test_crc_gui_integration.py
2022-09-22 13:46:47 -07:00

210 lines
11 KiB
Python

from PyQt5.QtCore import Qt
from tests.QtTestCase import QtTestCase
from urh import settings
from urh.controller.widgets.ChecksumWidget import ChecksumWidget
from urh.signalprocessing.Encoding import Encoding
class TestCRCGUIIntegration(QtTestCase):
def test_wsp_crc(self):
self.__add_wsp_signal()
self.__set_wsp_encoding()
self.form.compare_frame_controller.add_protocol_label(14, 14, 0, 1, edit_label_name=False)
checksum_fieldtype = next(
ft for ft in self.form.compare_frame_controller.field_types if ft.function == ft.Function.CHECKSUM)
label_value_model = self.form.compare_frame_controller.label_value_model
# Configure Normal Checksum and verify its wrong
proto_label_dialog = self.form.compare_frame_controller.create_protocol_label_dialog()
self.assertEqual(proto_label_dialog.ui.tabWidgetAdvancedSettings.count(), 0)
proto_label_dialog.model.setData(proto_label_dialog.model.index(0, 0), checksum_fieldtype.caption)
self.assertEqual(proto_label_dialog.ui.tabWidgetAdvancedSettings.count(), 1)
checksum_tab = proto_label_dialog.ui.tabWidgetAdvancedSettings.widget(0) # type: ChecksumWidget
self.assertNotIn("WSP", checksum_tab.ui.comboBoxCategory.currentText())
checksum_tab.ui.radioButtonWSPAuto.click()
self.form.compare_frame_controller.ui.tblViewProtocol.clearSelection()
self.form.compare_frame_controller.ui.tblViewProtocol.selectRow(0)
self.assertEqual(label_value_model.data(label_value_model.index(0, 4), Qt.BackgroundColorRole),
settings.BG_COLOR_WRONG)
# Configure WSP and verify its correct
proto_label_dialog = self.form.compare_frame_controller.create_protocol_label_dialog()
self.assertEqual(proto_label_dialog.ui.tabWidgetAdvancedSettings.count(), 1)
checksum_tab = proto_label_dialog.ui.tabWidgetAdvancedSettings.widget(0) # type: ChecksumWidget
checksum_tab.ui.comboBoxCategory.setCurrentIndex(1)
self.assertIn("WSP", checksum_tab.ui.comboBoxCategory.currentText())
checksum_tab.ui.radioButtonWSPAuto.click()
self.assertTrue(checksum_tab.ui.radioButtonWSPAuto.isChecked())
proto_label_dialog.ui.btnConfirm.click()
self.form.compare_frame_controller.ui.tblViewProtocol.clearSelection()
self.form.compare_frame_controller.ui.tblViewProtocol.selectRow(0)
self.assertEqual(label_value_model.data(label_value_model.index(0, 4), Qt.BackgroundColorRole),
settings.BG_COLOR_CORRECT)
def test_cc1101_crc(self):
self.__add_cc1101_signal()
self.__set_cc1101_encoding()
self.form.compare_frame_controller.add_protocol_label(24, 27, 0, 1, edit_label_name=False)
checksum_fieldtype = next(
ft for ft in self.form.compare_frame_controller.field_types if ft.function == ft.Function.CHECKSUM)
label_value_model = self.form.compare_frame_controller.label_value_model
# Configure Normal Checksum and verify its wrong
proto_label_dialog = self.form.compare_frame_controller.create_protocol_label_dialog()
self.assertEqual(proto_label_dialog.ui.tabWidgetAdvancedSettings.count(), 0)
proto_label_dialog.model.setData(proto_label_dialog.model.index(0, 0), checksum_fieldtype.caption)
self.assertEqual(proto_label_dialog.ui.tabWidgetAdvancedSettings.count(), 1)
checksum_tab = proto_label_dialog.ui.tabWidgetAdvancedSettings.widget(0) # type: ChecksumWidget
self.assertEqual("generic", checksum_tab.ui.comboBoxCategory.currentText())
self.assertNotEqual("CC1101", checksum_tab.ui.comboBoxCRCFunction.currentText())
proto_label_dialog.ui.btnConfirm.click()
self.form.compare_frame_controller.ui.tblViewProtocol.clearSelection()
self.form.compare_frame_controller.ui.tblViewProtocol.selectRow(0)
self.assertEqual(label_value_model.data(label_value_model.index(0, 4), Qt.BackgroundColorRole),
settings.BG_COLOR_WRONG)
# Configure CC1101 and verify its correct
proto_label_dialog = self.form.compare_frame_controller.create_protocol_label_dialog()
self.assertEqual(proto_label_dialog.ui.tabWidgetAdvancedSettings.count(), 1)
checksum_tab = proto_label_dialog.ui.tabWidgetAdvancedSettings.widget(0) # type: ChecksumWidget
checksum_tab.ui.comboBoxCRCFunction.setCurrentText("CC1101")
self.assertEqual(checksum_tab.ui.lineEditCRCPolynomial.text(), "8005")
self.assertEqual(checksum_tab.ui.lineEditFinalXOR.text(), "0000")
self.assertEqual(checksum_tab.ui.lineEditStartValue.text(), "ffff")
model = checksum_tab.ui.tableViewDataRanges.model()
model.setData(model.index(0, 0), "17")
self.assertEqual(model.data(model.index(0, 0)), 17)
proto_label_dialog.ui.btnConfirm.click()
self.form.compare_frame_controller.ui.tblViewProtocol.clearSelection()
self.form.compare_frame_controller.ui.tblViewProtocol.selectRow(0)
self.assertEqual(label_value_model.data(label_value_model.index(0, 4), Qt.BackgroundColorRole),
settings.BG_COLOR_CORRECT)
def test_checksum_in_generation_tab(self):
self.add_signal_to_form("esaver.complex16s")
self.form.signal_tab_controller.signal_frames[0].ui.spinBoxCenterOffset.setValue(0.3692)
self.form.signal_tab_controller.signal_frames[0].ui.spinBoxCenterOffset.editingFinished.emit()
self.form.compare_frame_controller.add_protocol_label(4, 6, 0, 1, edit_label_name=False)
checksum_fieldtype = next(
ft for ft in self.form.compare_frame_controller.field_types if ft.function == ft.Function.CHECKSUM)
label_model = self.form.compare_frame_controller.label_value_model
label_model.setData(label_model.index(0, 0), checksum_fieldtype.caption, Qt.EditRole)
gframe = self.form.generator_tab_controller
gframe.ui.cbViewType.setCurrentIndex(1)
self.add_signal_to_generator(signal_index=0)
self.assertEqual(gframe.table_model.row_count, 3)
self.assertEqual(gframe.table_model.protocol.protocol_labels[0].field_type, checksum_fieldtype)
# check font is italic
for i in range(3):
for j in range(len(gframe.table_model.display_data[i])):
font = gframe.table_model.data(gframe.table_model.createIndex(i, j), Qt.FontRole)
if 4 <= j <= 6:
self.assertTrue(font.italic(), msg=str(j))
else:
self.assertFalse(font.italic(), msg=str(j))
# Now change something and verify CRC gets recalced
checksum_before = gframe.table_model.display_data[0][4:6]
self.assertNotEqual(gframe.table_model.data(gframe.table_model.index(0, 1)), "f")
gframe.table_model.setData(gframe.table_model.index(0, 1), "f", Qt.EditRole)
checksum_after = gframe.table_model.display_data[0][4:6]
self.assertNotEqual(checksum_before, checksum_after)
# change something behind data ranges, crc should stay the same
checksum_before = gframe.table_model.display_data[1][4:6]
self.assertNotEqual(gframe.table_model.data(gframe.table_model.index(1, 10)), "b")
gframe.table_model.setData(gframe.table_model.index(1, 10), "b", Qt.EditRole)
checksum_after = gframe.table_model.display_data[1][4:6]
self.assertNotEqual(checksum_before, checksum_after)
# edit checksum and verify its not italic anymore
gframe.table_model.setData(gframe.table_model.index(2, 5), "c", Qt.EditRole)
for i in range(3):
for j in range(len(gframe.table_model.display_data[i])):
font = gframe.table_model.data(gframe.table_model.createIndex(i, j), Qt.FontRole)
if 4 <= j <= 6 and i != 2:
self.assertTrue(font.italic(), msg=str(j))
else:
self.assertFalse(font.italic(), msg=str(j))
def __add_wsp_signal(self):
self.add_signal_to_form("wsp.complex")
signal_frame = self.form.signal_tab_controller.signal_frames[0]
signal_frame.ui.cbModulationType.setCurrentText("ASK")
signal_frame.ui.spinBoxNoiseTreshold.setValue(0.0500)
signal_frame.ui.spinBoxNoiseTreshold.editingFinished.emit()
signal_frame.ui.spinBoxCenterOffset.setValue(0.3480)
signal_frame.ui.spinBoxCenterOffset.editingFinished.emit()
signal_frame.ui.spinBoxSamplesPerSymbol.setValue(20)
signal_frame.ui.spinBoxSamplesPerSymbol.editingFinished.emit()
signal_frame.ui.spinBoxTolerance.setValue(2)
signal_frame.ui.spinBoxTolerance.editingFinished.emit()
self.assertEqual(len(signal_frame.proto_analyzer.plain_hex_str), 3)
for i in range(3):
self.assertEqual(signal_frame.proto_analyzer.plain_hex_str[i].strip("0"), "aad3d5ddddcc5d45ddbba")
def __add_cc1101_signal(self):
self.add_signal_to_form("cc1101.complex")
signal_frame = self.form.signal_tab_controller.signal_frames[0]
signal_frame.ui.cbModulationType.setCurrentText("FSK")
signal_frame.ui.spinBoxNoiseTreshold.setValue(0.0600)
signal_frame.ui.spinBoxNoiseTreshold.editingFinished.emit()
signal_frame.ui.spinBoxCenterOffset.setValue(0)
signal_frame.ui.spinBoxCenterOffset.editingFinished.emit()
signal_frame.ui.spinBoxSamplesPerSymbol.setValue(100)
signal_frame.ui.spinBoxSamplesPerSymbol.editingFinished.emit()
signal_frame.ui.spinBoxTolerance.setValue(5)
signal_frame.ui.spinBoxTolerance.editingFinished.emit()
self.assertEqual(len(signal_frame.proto_analyzer.plain_hex_str), 1)
self.assertEqual(signal_frame.proto_analyzer.plain_hex_str[0], "aaaaaaaa9a7d9a7dfc99ff1398fb8")
def __set_wsp_encoding(self):
self.form.compare_frame_controller.ui.cbProtoView.setCurrentText("Hex")
decoding = Encoding(["WSP", settings.DECODING_ENOCEAN])
self.form.compare_frame_controller.decodings.append(decoding)
self.form.compare_frame_controller.fill_decoding_combobox()
self.form.compare_frame_controller.ui.tblViewProtocol.selectAll()
self.form.compare_frame_controller.ui.cbDecoding.setCurrentText("WSP")
model = self.form.compare_frame_controller.protocol_model
self.assertEqual(len(model.display_data), 3)
msg = "aa9610002c1c024b"
for i in range(3):
for j, hex_char in enumerate(msg):
self.assertEqual(model.data(model.index(i, j)), hex_char)
def __set_cc1101_encoding(self):
self.form.compare_frame_controller.ui.cbProtoView.setCurrentText("Hex")
decoding = Encoding(["CC1101", settings.DECODING_DATAWHITENING, "0x9a7d9a7d;0x21"])
self.form.compare_frame_controller.decodings.append(decoding)
self.form.compare_frame_controller.fill_decoding_combobox()
self.form.compare_frame_controller.ui.tblViewProtocol.selectAll()
self.form.compare_frame_controller.ui.cbDecoding.setCurrentText("CC1101")
model = self.form.compare_frame_controller.protocol_model
self.assertEqual(len(model.display_data), 1)
msg = "aaaaaaaa9a7d9a7d0378e289757e"
for j, hex_char in enumerate(msg):
self.assertEqual(model.data(model.index(0, j)), hex_char, msg=str(j))