# -*- coding: utf-8 -*- # SPDX-FileCopyrightText: 2025 KUNBUS GmbH # SPDX-License-Identifier: GPL-2.0-or-later from ctypes import c_int from queue import Queue from tempfile import NamedTemporaryFile from unittest import TestCase IOCTL_QUEUE = Queue() class FakePiControlDevice: IOCTL_RESET_DRIVER = 19212 def __init__(self, picontrol_device: str): self._fh = NamedTemporaryFile("wb+", 0, prefix="fake_device_") self.name = self._fh.name def __del__(self): self._fh.close() def reset_process_image(self): self._fh.write(b"\x00" * 4096) self._fh.seek(0) def ioctl(self, request, arg=0) -> int: if type(arg) is c_int: arg = arg.value if request == self.IOCTL_RESET_DRIVER: pass else: raise NotImplementedError(f"Unknown IOCTL request: {request}") IOCTL_QUEUE.put_nowait((request, arg)) return arg def close(self): self._fh.close() def read(self, size): return self._fh.read(size) def seek(self, offset, whence): self._fh.seek(offset, whence) def write(self, buffer): return self._fh.write(buffer) class PiControlDeviceMockup(TestCase): def setUp(self): super().setUp() # Replace classes with mockup classes import revpi_middleware.dbus_middleware1.process_image.interface_picontrol as test_helpers test_helpers.PiControlIoctl = FakePiControlDevice # Create a fake picontrol0 device self.picontrol = FakePiControlDevice(picontrol_device="/dev/fake_device_0") def tearDown(self): self.picontrol.close() super().tearDown()