def _setup(self): try: self.controller.configure( 'ftdi://ftdi:ft232h/1', frequency=100, direction=0xFFFF, initial=0x0000, ) self.gpio = self.controller.get_gpio() valid_pins = self.gpio.all_pins used_pins = self.output_pins | self.input_pins invalid_pins = ((valid_pins | used_pins) & ~valid_pins) & used_pins if invalid_pins != 0: formatted = \ [i for i in range(0, 16) if invalid_pins & 1 << i != 0] raise HardwareError( "Cannot use pin(s) {} as GPIO.".format(formatted)) # A low bit (equal to 0) indicates an input pin. # A high bit (equal to 1) indicates an output pin. new_direction = self.output_pins & ~self.input_pins self.gpio.set_direction(used_pins, new_direction) except UsbToolsError as error: self.gpio = None raise HardwareError(error) from None except USBError as error: self.gpio = None raise HardwareError(error) from None
def test_set_hardware_error_is_passed_up(mocker): (model_mock, desk_controller_stub, service) = create_service(mocker, TIME_ALLOWED, ACTIVE, Timedelta(0), DOWN) desk_controller_stub.move.side_effect = HardwareError(RuntimeError()) with pytest.raises(HardwareError): service.set(UP)
def test_set_session_hardware_error_timer_cancelled(mocker): (timer_mock, session_service_stub, _, service) = create_service( mocker, TIME_ALLOWED, INACTIVE, Timedelta(0), DOWN) session_service_stub.set.side_effect = HardwareError(RuntimeError()) service.set_session(ACTIVE) timer_mock.cancel.assert_called_once()
def test_set_desk_hardware_error_timer_cancelled(mocker, desk): (timer_mock, _, desk_service_stub, service) = create_service(mocker, TIME_ALLOWED, ACTIVE, Timedelta(0), desk.next()) desk_service_stub.set.side_effect = HardwareError(RuntimeError()) service.set_desk(desk) timer_mock.cancel.assert_called_once()
async def test_button_press_after_hardware_error(client, button_pin_stub, service_mock): button_pin_stub.read.side_effect = HardwareError( 'Stubbed error for unit testing.') await asyncio.sleep(0.1) button_pin_stub.read.side_effect = None button_pin_stub.read.return_value = 1 await asyncio.sleep(5) service_mock.toggle_session.assert_called_once()
def _reconnect_and_try_again(self, action): self._connect() try: return action() except FtdiError as error1: try: self.disconnect() self._connect() return action() except FtdiError: raise HardwareError(error1)
def test_set_hardware_error_model_not_updated(mocker): (model_mock, desk_controller_stub, service) = create_service(mocker, TIME_ALLOWED, ACTIVE, Timedelta(0), DOWN) desk_controller_stub.move.side_effect = HardwareError(RuntimeError()) try: service.set(UP) except HardwareError: pass model_mock.set_desk.assert_not_called()
def test_set_hardware_error_model_still_called(mocker): now = Timestamp(2019, 8, 1, 13, 0) (model_mock, light_controller_stub, service) = create_service(mocker, INACTIVE, now) light_controller_stub.set.side_effect = HardwareError(RuntimeError()) try: service.set(ACTIVE) except HardwareError: pass model_mock.set_session.assert_called_with(now, ACTIVE)
def test_set_hardware_error_is_passed_up(mocker): (_, light_controller_stub, service) = create_service(mocker, INACTIVE) light_controller_stub.set.side_effect = HardwareError(RuntimeError()) with pytest.raises(HardwareError): service.set(ACTIVE)