mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-12-24 12:29:08 +00:00
Next generation hardware handling (#2429)
* Next generation hardware handling * need daemon for some details * fix tests * fix wrong coresys lookup * test initial import * test device lookup * validate if device exists * Add cgroups rules manager * mapping udev from host * Modify validation/options handling * lookup devices * add support for host udev mapping * next * Add policy support to add-ons * Depricate hardware trigger call * next cleanup round * detect USB linking * optimize * readd udev utils for backwards compatibility * fix tests * Add more tests * fix tests * Make device explicit * Add filter * work on tests * Add migration step * clean out auto_uart * Fix all tests * Expose all device information * small improvment * Fix loop over right devices * Use migration for new device format * Update rootfs/etc/cont-init.d/udev.sh Co-authored-by: Franck Nijhof <git@frenck.dev> * Fix old helper * Fix API * add helper for by-id * fix tests * Fix serial helper * Fix hardware API schema * Hide some virtual devices from tracking * Apply suggestions from code review Co-authored-by: Stefan Agner <stefan@agner.ch> * Update supervisor/addons/validate.py Co-authored-by: Stefan Agner <stefan@agner.ch> * Update supervisor/addons/validate.py Co-authored-by: Stefan Agner <stefan@agner.ch> * fix lint * Apply suggestions from code review Co-authored-by: Joakim Sørensen <joasoe@gmail.com> * Apply suggestions from code review Co-authored-by: Joakim Sørensen <joasoe@gmail.com> * fix black * fix lint Co-authored-by: Franck Nijhof <git@frenck.dev> Co-authored-by: Stefan Agner <stefan@agner.ch> Co-authored-by: Joakim Sørensen <joasoe@gmail.com>
This commit is contained in:
203
tests/addons/test_options.py
Normal file
203
tests/addons/test_options.py
Normal file
@@ -0,0 +1,203 @@
|
||||
"""Test add-ons schema to UI schema convertion."""
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
import voluptuous as vol
|
||||
|
||||
from supervisor.addons.options import AddonOptions, UiOptions
|
||||
from supervisor.hardware.data import Device
|
||||
|
||||
|
||||
def test_simple_schema(coresys):
|
||||
"""Test with simple schema."""
|
||||
assert AddonOptions(
|
||||
coresys,
|
||||
{"name": "str", "password": "password", "fires": "bool", "alias": "str?"},
|
||||
)({"name": "Pascal", "password": "1234", "fires": True, "alias": "test"})
|
||||
|
||||
assert AddonOptions(
|
||||
coresys,
|
||||
{"name": "str", "password": "password", "fires": "bool", "alias": "str?"},
|
||||
)({"name": "Pascal", "password": "1234", "fires": True})
|
||||
|
||||
with pytest.raises(vol.error.Invalid):
|
||||
AddonOptions(
|
||||
coresys,
|
||||
{"name": "str", "password": "password", "fires": "bool", "alias": "str?"},
|
||||
)({"name": "Pascal", "password": "1234", "fires": "hah"})
|
||||
|
||||
with pytest.raises(vol.error.Invalid):
|
||||
AddonOptions(
|
||||
coresys,
|
||||
{"name": "str", "password": "password", "fires": "bool", "alias": "str?"},
|
||||
)({"name": "Pascal", "fires": True})
|
||||
|
||||
|
||||
def test_complex_schema_list(coresys):
|
||||
"""Test with complex list schema."""
|
||||
assert AddonOptions(
|
||||
coresys,
|
||||
{"name": "str", "password": "password", "extend": ["str"]},
|
||||
)({"name": "Pascal", "password": "1234", "extend": ["test", "blu"]})
|
||||
|
||||
with pytest.raises(vol.error.Invalid):
|
||||
AddonOptions(
|
||||
coresys,
|
||||
{"name": "str", "password": "password", "extend": ["str"]},
|
||||
)({"name": "Pascal", "password": "1234", "extend": ["test", 1]})
|
||||
|
||||
with pytest.raises(vol.error.Invalid):
|
||||
AddonOptions(
|
||||
coresys,
|
||||
{"name": "str", "password": "password", "extend": ["str"]},
|
||||
)({"name": "Pascal", "password": "1234", "extend": "test"})
|
||||
|
||||
|
||||
def test_complex_schema_dict(coresys):
|
||||
"""Test with complex dict schema."""
|
||||
assert AddonOptions(
|
||||
coresys,
|
||||
{"name": "str", "password": "password", "extend": {"test": "int"}},
|
||||
)({"name": "Pascal", "password": "1234", "extend": {"test": 1}})
|
||||
|
||||
with pytest.raises(vol.error.Invalid):
|
||||
AddonOptions(
|
||||
coresys,
|
||||
{"name": "str", "password": "password", "extend": {"test": "int"}},
|
||||
)({"name": "Pascal", "password": "1234", "extend": {"wrong": 1}})
|
||||
|
||||
with pytest.raises(vol.error.Invalid):
|
||||
AddonOptions(
|
||||
coresys,
|
||||
{"name": "str", "password": "password", "extend": ["str"]},
|
||||
)({"name": "Pascal", "password": "1234", "extend": "test"})
|
||||
|
||||
|
||||
def test_simple_device_schema(coresys):
|
||||
"""Test with simple schema."""
|
||||
for device in (
|
||||
Device(
|
||||
"ttyACM0",
|
||||
Path("/dev/ttyACM0"),
|
||||
Path("/sys/bus/usb/002"),
|
||||
"tty",
|
||||
[],
|
||||
{"ID_VENDOR": "xy"},
|
||||
),
|
||||
Device(
|
||||
"ttyUSB0",
|
||||
Path("/dev/ttyUSB0"),
|
||||
Path("/sys/bus/usb/001"),
|
||||
"tty",
|
||||
[Path("/dev/ttyS1"), Path("/dev/serial/by-id/xyx")],
|
||||
{"ID_VENDOR": "xy"},
|
||||
),
|
||||
Device("ttyS0", Path("/dev/ttyS0"), Path("/sys/bus/usb/003"), "tty", [], {}),
|
||||
Device(
|
||||
"video1",
|
||||
Path("/dev/video1"),
|
||||
Path("/sys/bus/usb/004"),
|
||||
"misc",
|
||||
[],
|
||||
{"ID_VENDOR": "xy"},
|
||||
),
|
||||
):
|
||||
coresys.hardware.update_device(device)
|
||||
|
||||
assert AddonOptions(
|
||||
coresys,
|
||||
{"name": "str", "password": "password", "input": "device"},
|
||||
)({"name": "Pascal", "password": "1234", "input": "/dev/ttyUSB0"})
|
||||
|
||||
data = AddonOptions(
|
||||
coresys,
|
||||
{"name": "str", "password": "password", "input": "device"},
|
||||
)({"name": "Pascal", "password": "1234", "input": "/dev/serial/by-id/xyx"})
|
||||
assert data["input"] == "/dev/ttyUSB0"
|
||||
|
||||
assert AddonOptions(
|
||||
coresys,
|
||||
{"name": "str", "password": "password", "input": "device(subsystem=tty)"},
|
||||
)({"name": "Pascal", "password": "1234", "input": "/dev/ttyACM0"})
|
||||
|
||||
with pytest.raises(vol.error.Invalid):
|
||||
assert AddonOptions(
|
||||
coresys,
|
||||
{"name": "str", "password": "password", "input": "device"},
|
||||
)({"name": "Pascal", "password": "1234", "input": "/dev/not_exists"})
|
||||
|
||||
with pytest.raises(vol.error.Invalid):
|
||||
assert AddonOptions(
|
||||
coresys,
|
||||
{"name": "str", "password": "password", "input": "device(subsystem=tty)"},
|
||||
)({"name": "Pascal", "password": "1234", "input": "/dev/video1"})
|
||||
|
||||
|
||||
def test_ui_simple_schema(coresys):
|
||||
"""Test with simple schema."""
|
||||
assert UiOptions(coresys)(
|
||||
{"name": "str", "password": "password", "fires": "bool", "alias": "str?"},
|
||||
) == [
|
||||
{"name": "name", "required": True, "type": "string"},
|
||||
{"format": "password", "name": "password", "required": True, "type": "string"},
|
||||
{"name": "fires", "required": True, "type": "boolean"},
|
||||
{"name": "alias", "optional": True, "type": "string"},
|
||||
]
|
||||
|
||||
|
||||
def test_ui_group_schema(coresys):
|
||||
"""Test with group schema."""
|
||||
assert UiOptions(coresys)(
|
||||
{
|
||||
"name": "str",
|
||||
"password": "password",
|
||||
"fires": "bool",
|
||||
"alias": "str?",
|
||||
"extended": {"name": "str", "data": ["str"], "path": "str?"},
|
||||
},
|
||||
) == [
|
||||
{"name": "name", "required": True, "type": "string"},
|
||||
{"format": "password", "name": "password", "required": True, "type": "string"},
|
||||
{"name": "fires", "required": True, "type": "boolean"},
|
||||
{"name": "alias", "optional": True, "type": "string"},
|
||||
{
|
||||
"multiple": False,
|
||||
"name": "extended",
|
||||
"optional": True,
|
||||
"schema": [
|
||||
{"name": "name", "required": True, "type": "string"},
|
||||
{"multiple": True, "name": "data", "required": True, "type": "string"},
|
||||
{"name": "path", "optional": True, "type": "string"},
|
||||
],
|
||||
"type": "schema",
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
def test_ui_group_list(coresys):
|
||||
"""Test with group schema."""
|
||||
assert UiOptions(coresys)(
|
||||
{
|
||||
"name": "str",
|
||||
"password": "password",
|
||||
"fires": "bool",
|
||||
"alias": "str?",
|
||||
"extended": [{"name": "str", "data": ["str?"], "path": "str?"}],
|
||||
},
|
||||
) == [
|
||||
{"name": "name", "required": True, "type": "string"},
|
||||
{"format": "password", "name": "password", "required": True, "type": "string"},
|
||||
{"name": "fires", "required": True, "type": "boolean"},
|
||||
{"name": "alias", "optional": True, "type": "string"},
|
||||
{
|
||||
"multiple": True,
|
||||
"name": "extended",
|
||||
"optional": True,
|
||||
"schema": [
|
||||
{"name": "name", "required": True, "type": "string"},
|
||||
{"multiple": True, "name": "data", "optional": True, "type": "string"},
|
||||
{"name": "path", "optional": True, "type": "string"},
|
||||
],
|
||||
"type": "schema",
|
||||
},
|
||||
]
|
||||
Reference in New Issue
Block a user