liquidctl/tests/test_asetek.py

172 lines
5.6 KiB
Python

import pytest
from _testutils import MockPyusbDevice, MockRuntimeStorage
from collections import deque
from liquidctl.driver.asetek import Modern690Lc, Legacy690Lc, Hydro690Lc
@pytest.fixture
def mockModern690LcDevice():
device = MockPyusbDevice()
dev = Modern690Lc(device, 'Mock Modern 690LC')
dev.connect()
return dev
@pytest.fixture
def mockLegacy690LcDevice():
device = MockPyusbDevice(vendor_id=0xffff, product_id=0xb200, bus=1, port=(1,))
dev = Legacy690Lc(device, 'Mock Legacy 690LC')
runtime_storage = MockRuntimeStorage(key_prefixes=['testing'])
runtime_storage.store('leds_enabled', 0)
dev.connect(runtime_storage=runtime_storage)
return dev
def test_modern690Lc_device_not_totally_broken(mockModern690LcDevice):
"""A few reasonable example calls do not raise exceptions."""
dev = mockModern690LcDevice
dev.initialize()
dev.get_status()
dev.set_color(channel='led', mode='blinking', colors=iter([[3, 2, 1]]),
time_per_color=3, time_off=1, alert_threshold=42,
alert_color=[90, 80, 10])
dev.set_color(channel='led', mode='rainbow', colors=[], speed=5)
dev.set_speed_profile(channel='fan',
profile=iter([(20, 20), (30, 50), (40, 100)]))
dev.set_fixed_speed(channel='pump', duty=50)
def test_modern690Lc_device_connect(mockModern690LcDevice):
def mock_open():
nonlocal opened
opened = True
mockModern690LcDevice.device.open = mock_open
opened = False
with mockModern690LcDevice.connect() as cm:
assert cm == mockModern690LcDevice
assert opened
def test_modern690Lc_device_begin_transaction(mockModern690LcDevice):
mockModern690LcDevice.device._reset_sent()
mockModern690LcDevice.get_status()
(begin, _) = mockModern690LcDevice.device._sent_xfers
xfer_type, bmRequestType, bRequest, wValue, wIndex, datalen = begin
assert xfer_type == 'ctrl_transfer'
assert bRequest == 2
assert bmRequestType == 0x40
assert wValue == 1
assert wIndex == 0
assert datalen is None
def test_modern690Lc_initialize_can_persist_settings(mockModern690LcDevice):
dev = mockModern690LcDevice
dev.device._reset_sent()
dev.initialize(non_volatile=True)
_begin, (cmd_msgtype, cmd_ep, cmd_data) = dev.device._sent_xfers[-2:]
assert cmd_msgtype == 'write'
assert cmd_ep == 2
assert cmd_data == [0x21]
def test_modern690Lc_set_color_can_persist_settings(mockModern690LcDevice):
dev = mockModern690LcDevice
dev.device._reset_sent()
dev.set_color(channel='led', mode='rainbow', colors=[], non_volatile=True)
_begin, (cmd_msgtype, cmd_ep, cmd_data) = dev.device._sent_xfers[-2:]
assert cmd_msgtype == 'write'
assert cmd_ep == 2
assert cmd_data == [0x21]
def test_modern690Lc_set_speed_profile_can_persist_settings(mockModern690LcDevice):
dev = mockModern690LcDevice
dev.device._reset_sent()
dev.set_speed_profile(channel='fan', profile=[(20, 20), (30, 50), (40, 100)],
non_volatile=True)
_begin, (cmd_msgtype, cmd_ep, cmd_data) = dev.device._sent_xfers[-2:]
assert cmd_msgtype == 'write'
assert cmd_ep == 2
assert cmd_data == [0x21]
def test_modern690Lc_set_fixed_speed_can_persist_settings(mockModern690LcDevice):
dev = mockModern690LcDevice
dev.device._reset_sent()
dev.set_fixed_speed(channel='pump', duty=50, non_volatile=True)
_begin, (cmd_msgtype, cmd_ep, cmd_data) = dev.device._sent_xfers[-2:]
assert cmd_msgtype == 'write'
assert cmd_ep == 2
assert cmd_data == [0x21]
def test_legacy690Lc_device_not_totally_broken(mockLegacy690LcDevice):
"""A few reasonable example calls do not raise exceptions."""
dev = mockLegacy690LcDevice
dev.initialize()
status = dev.get_status()
dev.set_color(channel='led', mode='blinking', colors=iter([[3, 2, 1]]),
time_per_color=3, time_off=1, alert_threshold=42,
alert_color=[90, 80, 10])
dev.set_fixed_speed(channel='fan', duty=80)
dev.set_fixed_speed(channel='pump', duty=50)
def test_legacy690Lc_device_matches_leviathan_updates(mockLegacy690LcDevice):
dev = mockLegacy690LcDevice
dev.initialize()
dev.set_fixed_speed(channel='pump', duty=50)
dev.device._reset_sent()
dev.set_color(channel='led', mode='fading', colors=[[0, 0, 255], [0, 255, 0]],
time_per_color=1, alert_threshold=60, alert_color=[0, 0, 0])
_begin, (color_msgtype, color_ep, color_data) = dev.device._sent_xfers
assert color_msgtype == 'write'
assert color_ep == 2
assert color_data[0:12] == [0x10, 0, 0, 255, 0, 255, 0, 0, 0, 0, 0x3c, 1]
dev.device._reset_sent()
dev.set_fixed_speed(channel='fan', duty=50)
_begin, pump_message, fan_message = dev.device._sent_xfers
assert pump_message == ('write', 2, [0x13, 50])
assert fan_message == ('write', 2, [0x12, 50])
def test_legacy690Lc_device_initialize_warns_on_non_volatile(mockLegacy690LcDevice, caplog):
mockLegacy690LcDevice.initialize(non_volatile=True)
assert 'device does not support non-volatile' in caplog.text
def test_legacy690Lc_device_set_color_warns_on_non_volatile(mockLegacy690LcDevice, caplog):
mockLegacy690LcDevice.set_color(channel='led', mode='blinking',
colors=iter([[3, 2, 1]]), non_volatile=True)
assert 'device does not support non-volatile' in caplog.text
def test_legacy690Lc_device_set_fixed_speed_warns_on_non_volatile(mockLegacy690LcDevice, caplog):
mockLegacy690LcDevice.set_fixed_speed(channel='fan', duty=80, non_volatile=True)
assert 'device does not support non-volatile' in caplog.text