Example #1
0
def test_check_invalid():
    image = mock.Mock()

    with mock.patch("zigpy.ota.validators.validate_ota_image") as m:
        m.side_effect = [ValidationResult.VALID]
        assert not validators.check_invalid(image)

    with mock.patch("zigpy.ota.validators.validate_ota_image") as m:
        m.side_effect = [ValidationResult.UNKNOWN]
        assert not validators.check_invalid(image)

    with mock.patch("zigpy.ota.validators.validate_ota_image") as m:
        m.side_effect = [ValidationError("error")]
        assert validators.check_invalid(image)
Example #2
0
    async def get_ota_image(self,
                            manufacturer_id,
                            image_type,
                            model=None) -> Optional[CachedImage]:
        if (manufacturer_id == zigpy.ota.provider.Salus.MANUFACTURER_ID
            ):  # Salus/computime does not pass a useful image_type
            # in the message from the device. So construct key based on model name.
            key = ImageKey(manufacturer_id, model)
        else:
            key = ImageKey(manufacturer_id, image_type)
        if key in self._image_cache and not self._image_cache[key].expired:
            return self._image_cache[key]

        images = await self.async_event("get_image", key)
        valid_images = []

        for image in images:
            if image is None or check_invalid(image):
                continue

            valid_images.append(image)

        if not valid_images:
            return None

        cached = CachedImage.new(
            max(valid_images, key=lambda img: img.header.file_version))
        self._image_cache[key] = cached
        return cached
Example #3
0
def test_check_invalid_special():
    image = mock.Mock()

    # Unknown OTA image containers are not checked
    with mock.patch("zigpy.ota.validators.validate_ota_image") as m:
        assert not validators.check_invalid(image)
        assert m.call_count == 0
Example #4
0
    async def get_ota_image(self, manufacturer_id,
                            image_type) -> Optional[OTAImage]:
        key = ImageKey(manufacturer_id, image_type)
        if key in self._image_cache and not self._image_cache[key].expired:
            return self._image_cache[key]

        images = await self.async_event("get_image", key)
        valid_images = []

        for image in images:
            if image is None or check_invalid(image):
                continue

            valid_images.append(image)

        if not valid_images:
            return None

        cached = CachedImage.new(max(valid_images,
                                     key=lambda img: img.version))
        self._image_cache[key] = cached
        return cached