def test_upload_is_only_valid_if_chunk_count_matches_expected(self):
        storage = LongMessageStorage(MemoryStorage(), MemoryStorage())
        chunks = [b'12345', b'1234568', b'98765432']

        checksum = hashlib.md5()
        for chunk in chunks:
            checksum.update(chunk)

        expected_md5 = checksum.hexdigest()

        handler = LongMessageHandler(storage)
        handler.select_long_message_type(LongMessageType.FIRMWARE_DATA)

        expectations = ((len(chunks), LongMessageStatus.READY),
                        (0, LongMessageStatus.READY),
                        (len(chunks) - 1, LongMessageStatus.VALIDATION_ERROR),
                        (len(chunks) + 1, LongMessageStatus.VALIDATION_ERROR))

        for length, expected_status in expectations:
            handler.init_transfer(expected_md5, length)
            for chunk in chunks:
                handler.upload_message(chunk)
            handler.finalize_message()

            status = handler.read_status()
            self.assertEqual(expected_status, status.status)
    def test_upload_message_with_one_byte_is_accepted(self):
        persistent = MemoryStorage()
        temp = MemoryStorage()

        storage = LongMessageStorage(persistent, temp)
        handler = LongMessageHandler(storage)
        ble = LongMessageProtocol(handler)

        ble.handle_write(0, [2])  # select long message 2
        ble.handle_write(1, bytes([0] * 16))  # init
        self.assertEqual(
            LongMessageProtocol.RESULT_SUCCESS,
            ble.handle_write(MessageType.UPLOAD_MESSAGE, bytes([2])))
    def test_reading_unused_message_returns_zero(self):
        persistent = MemoryStorage()
        temp = MemoryStorage()

        storage = LongMessageStorage(persistent, temp)
        handler = LongMessageHandler(storage)
        ble = LongMessageProtocol(handler)

        ble.handle_write(0, [2])  # select long message 2
        result = ble.handle_read()

        # unused long message response is a 0 byte
        self.assertEqual(b'\x00', result)
    def test_read_returns_hash(self):
        persistent = MemoryStorage()
        persistent.write(2, b'abcd')

        md5_hash = hashlib.md5(b'abcd').hexdigest()

        temp = MemoryStorage()

        storage = LongMessageStorage(persistent, temp)
        handler = LongMessageHandler(storage)
        ble = LongMessageProtocol(handler)

        ble.handle_write(0, [2])  # select long message 2 (persistent)
        result = ble.handle_read()

        # reading a valid message returns its status, md5 hash and length
        self.assertEqual("03" + md5_hash + "00000004", bytes2hexdigest(result))
Exemplo n.º 5
0
    # noinspection PyBroadException
    try:
        device_name = device_storage.read('device-name').decode("ascii")

        if 0 == len(device_name) or len(device_name) > 15:
            device_name = f'Revvy_{serial}'
    except Exception:
        device_name = f'Revvy_{serial}'

    print(f'Device name: {device_name}')

    device_name = Observable(device_name)
    device_name.subscribe(
        lambda v: device_storage.write('device-name', v.encode("utf-8")))

    long_message_storage = LongMessageStorage(ble_storage, MemoryStorage())
    extract_asset_longmessage(long_message_storage, writeable_assets_dir)

    with Robot() as robot:
        robot.assets.add_source(writeable_assets_dir)

        long_message_handler = LongMessageHandler(long_message_storage)
        robot_manager = RobotBLEController(
            robot, sw_version,
            RevvyBLE(device_name, serial, long_message_handler))

        lmi = LongMessageImplementation(robot_manager, long_message_storage,
                                        writeable_assets_dir, False)
        long_message_handler.on_upload_started(lmi.on_upload_started)
        long_message_handler.on_upload_progress(lmi.on_upload_progress)
        long_message_handler.on_upload_finished(lmi.on_transmission_finished)
    def test_stored_data_integrity_is_checked_on_read(self):
        storage = MemoryStorage()

        storage.write('foo', b'data', md5='foobar')
        self.assertRaises(IntegrityError, lambda: storage.read('foo'))
    def test_stored_data_can_be_read(self):
        storage = MemoryStorage()

        storage.write('foo', b'data')
        self.assertEqual(b'data', storage.read('foo'))
    def test_md5_is_calculated_if_not_provided(self):
        storage = MemoryStorage()

        storage.write('foo', b'data', md5='some_md5')
        self.assertEqual('some_md5', storage.read_metadata('foo')['md5'])
    def test_md5_is_stored_if_provided(self):
        storage = MemoryStorage()

        storage.write('foo', b'data')
        self.assertNotEqual('', storage.read_metadata('foo')['md5'])
        self.assertNotEqual(None, storage.read_metadata('foo')['md5'])
    def test_reading_missing_item_raises_error(self):
        storage = MemoryStorage()

        self.assertRaises(StorageElementNotFoundError, lambda: storage.read_metadata('foo'))
        self.assertRaises(StorageElementNotFoundError, lambda: storage.read('foo'))