def test_load_by_file_path(): """ Test if the image can be loaded by passing a filepath as string. """ image = ShdlcFirmwareImage(EKS2.get('HEXFILE'), EKS2.get('BL_ADDR'), EKS2.get('APP_ADDR')) assert image.size > 0
def test_load_by_file_object(): """ Test if the image can be loaded by passing a file-like object. """ with open(EKS2.get('HEXFILE'), mode='r') as f: image = ShdlcFirmwareImage(f, EKS2.get('BL_ADDR'), EKS2.get('APP_ADDR')) assert image.size > 0
def fw(request): config = request.param image = ShdlcFirmwareImage(hexfile=config.get('HEXFILE'), bl_start_addr=config.get('BL_ADDR'), app_start_addr=config.get('APP_ADDR'), signature=config.get('SIGNATURE', b'\x4A\x47\x4F\x4B'), bl_version_offset=config.get( 'BL_VERSION_OFFSET', 0x1004)) config['IMAGE'] = image yield config
def test_timeout(): """ Test if execute() raises a timeout error if no device is connected. """ port = MagicMock() port.transceive.side_effect = ShdlcTimeoutError() device = ShdlcDevice(ShdlcConnection(port), 0) image = ShdlcFirmwareImage(EKS2_HEXFILE, EKS2_BL_ADDR, EKS2_APP_ADDR) update = ShdlcFirmwareUpdate(device, image) with pytest.raises(ShdlcTimeoutError): update.execute(emergency=False)
def test_invalid_signature_raises_exception(fw): """ Test if a hexfile with invalid signature raises the proper exception. The wrong signature is simulated by passing a wrong application start address. """ with pytest.raises(ShdlcFirmwareImageSignatureError): ShdlcFirmwareImage(hexfile=fw.get('HEXFILE'), bl_start_addr=fw.get('BL_ADDR'), app_start_addr=fw.get('APP_ADDR') + 1, signature=fw.get('SIGNATURE', b'\x4A\x47\x4F\x4B'), bl_version_offset=fw.get('BL_VERSION_OFFSET', 0x1004))
def test_load_by_file_object_with_all_parameters(config): """ Test if the image can be loaded by passing a file-like object. """ with open(config.get('HEXFILE'), mode='r') as f: image = ShdlcFirmwareImage( hexfile=f, bl_start_addr=config.get('BL_ADDR'), app_start_addr=config.get('APP_ADDR'), signature=config.get('SIGNATURE', b'\x4A\x47\x4F\x4B'), bl_version_offset=config.get('BL_VERSION_OFFSET', 0x1004)) assert image.size > 0
def test_wrong_device_type(): """ Test if execute() raises a ShdlcFirmwareImageIncompatibilityError if the wrong firmware image is loaded. """ connection = MagicMock() connection.execute.return_value = ("1234", False) device = ShdlcDevice(connection, 0) image = ShdlcFirmwareImage(EKS2_HEXFILE, EKS2_BL_ADDR, EKS2_APP_ADDR) update = ShdlcFirmwareUpdate(device, image) with pytest.raises(ShdlcFirmwareImageIncompatibilityError): update.execute(emergency=False)
def test_read_blocks(fw): """ Test reading data in multiple blocks. """ image = ShdlcFirmwareImage(hexfile=fw.get('HEXFILE'), bl_start_addr=fw.get('BL_ADDR'), app_start_addr=fw.get('APP_ADDR'), signature=fw.get('SIGNATURE', b'\x4A\x47\x4F\x4B'), bl_version_offset=fw.get( 'BL_VERSION_OFFSET', 0x1004)) data_read_all = image.read() image = ShdlcFirmwareImage(hexfile=fw.get('HEXFILE'), bl_start_addr=fw.get('BL_ADDR'), app_start_addr=fw.get('APP_ADDR'), signature=fw.get('SIGNATURE', b'\x4A\x47\x4F\x4B'), bl_version_offset=fw.get( 'BL_VERSION_OFFSET', 0x1004)) data_read_blocks = bytes() available_bytes = image.available_bytes while image.available_bytes > 0: block = image.read(42) data_read_blocks += block available_bytes -= len(block) assert type(block) is bytes assert 0 <= len(block) <= 42 assert image.available_bytes == available_bytes assert data_read_blocks == data_read_all
def test_execute_emergency(): """ Test if execute(emergency=True) skips the device check and enter bootloader command. """ connection = MagicMock() device = ShdlcDevice(connection, 0) image = ShdlcFirmwareImage(EKS2_HEXFILE, EKS2_BL_ADDR, EKS2_APP_ADDR) update = ShdlcFirmwareUpdate(device, image) update.execute(emergency=True) commands = [c[0][1] for c in device.connection.execute.call_args_list] assert type(commands[0]) is ShdlcCmdFirmwareUpdateStart for i in range(1, len(commands) - 1): assert type(commands[i]) is ShdlcCmdFirmwareUpdateData assert type(commands[-1]) is ShdlcCmdFirmwareUpdateStop
def test_execute_without_bitrate_getter(): """ Test if execute() fails before sending the "enter bootloader" command (to avoid bricking the device) if the underlying port has not implemented the bitrate getter property. """ connection = MagicMock() type(connection.port).bitrate = PropertyMock( side_effect=NotImplementedError) device = ShdlcDevice(connection, 0) image = ShdlcFirmwareImage(EKS2_HEXFILE, EKS2_BL_ADDR, EKS2_APP_ADDR) update = ShdlcFirmwareUpdate(device, image) with pytest.raises(NotImplementedError): update.execute(emergency=False) commands = [c[0][1] for c in device.connection.execute.call_args_list] assert len(commands) == 0 # no commands sent
def test_execute_normal(): """ Test if execute(emergency=False) sends the correct commands to the device. """ connection = MagicMock() connection.execute.return_value = (hex(EKS2_PRODUCTTYPE), False) device = ShdlcDevice(connection, 0) image = ShdlcFirmwareImage(EKS2_HEXFILE, EKS2_BL_ADDR, EKS2_APP_ADDR) update = ShdlcFirmwareUpdate(device, image) update.execute(emergency=False) commands = [c[0][1] for c in device.connection.execute.call_args_list] assert type(commands[0]) is ShdlcCmdGetProductType assert type(commands[1]) is ShdlcCmdEnterBootloader assert type(commands[2]) is ShdlcCmdFirmwareUpdateStart for i in range(3, len(commands) - 1): assert type(commands[i]) is ShdlcCmdFirmwareUpdateData assert type(commands[-1]) is ShdlcCmdFirmwareUpdateStop
def test_progress_callback(): """ Test if the progress callback is properly called. """ connection = MagicMock() connection.execute.return_value = (hex(EKS2_PRODUCTTYPE), False) device = ShdlcDevice(connection, 0) image = ShdlcFirmwareImage(EKS2_HEXFILE, EKS2_BL_ADDR, EKS2_APP_ADDR) callback = MagicMock().callback update = ShdlcFirmwareUpdate(device, image, progress_callback=callback) update.execute(emergency=False) assert callback.call_count > 0 for args, kwargs in callback.call_args_list: assert len(args) == 1 assert len(kwargs) == 0 progress = args[0] assert type(progress) is float assert 0.0 <= progress <= 100.0