Example #1
0
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
Example #2
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
Example #3
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)
Example #5
0
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))
Example #6
0
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)
Example #8
0
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