Ejemplo n.º 1
0
def test_model_manuf_device_sig(real_device):
    class TestDevice:
        signature = {}

        def __init__(*args, **kwargs):
            pass

        def get_signature(self):
            pass

    registry = DeviceRegistry()
    registry.add_to_registry(TestDevice)

    assert registry.get_device(real_device) is real_device

    TestDevice.signature["endpoints"] = {
        1: {
            "profile_id": 255,
            "device_type": 255,
            "input_clusters": [3],
            "output_clusters": [6],
        }
    }

    TestDevice.signature["model"] = "x"
    assert registry.get_device(real_device) is real_device

    TestDevice.signature["model"] = "model"
    TestDevice.signature["manufacturer"] = "x"
    assert registry.get_device(real_device) is real_device

    TestDevice.signature["manufacturer"] = "manufacturer"
    assert isinstance(registry.get_device(real_device), TestDevice)
Ejemplo n.º 2
0
def test_model_manuf_device_sig(real_device):
    class TestDevice:
        signature = {}

        def __init__(*args, **kwargs):
            pass

        def get_signature(self):
            pass

    registry = DeviceRegistry()
    registry.add_to_registry(TestDevice)

    assert registry.get_device(real_device) is real_device

    TestDevice.signature['endpoints'] = {
        1: {
            'profile_id': 255,
            'device_type': 255,
            'input_clusters': [3],
            'output_clusters': [6],
        }
    }

    TestDevice.signature['model'] = 'x'
    assert registry.get_device(real_device) is real_device

    TestDevice.signature['model'] = 'model'
    TestDevice.signature['manufacturer'] = 'x'
    assert registry.get_device(real_device) is real_device

    TestDevice.signature['manufacturer'] = 'manufacturer'
    assert isinstance(registry.get_device(real_device), TestDevice)
Ejemplo n.º 3
0
def test_model_manuf_device_sig(real_device):
    class TestDevice:
        signature = {}

        def __init__(*args, **kwargs):
            pass

        def get_signature(self):
            pass

    registry = DeviceRegistry()
    registry.add_to_registry(TestDevice)

    assert registry.get_device(real_device) is real_device

    TestDevice.signature[SIG_ENDPOINTS] = {
        1: {
            SIG_EP_PROFILE: 255,
            SIG_EP_TYPE: 255,
            SIG_EP_INPUT: [3],
            SIG_EP_OUTPUT: [6],
        }
    }

    TestDevice.signature[SIG_MODEL] = "x"
    assert registry.get_device(real_device) is real_device

    TestDevice.signature[SIG_MODEL] = "model"
    TestDevice.signature[SIG_MANUFACTURER] = "x"
    assert registry.get_device(real_device) is real_device

    TestDevice.signature[SIG_MANUFACTURER] = "manufacturer"
    assert isinstance(registry.get_device(real_device), TestDevice)
Ejemplo n.º 4
0
def test_quirk_match_order(real_device, real_device_2):
    """Test quirk matching order to allow user overrides via custom quirks."""

    class BuiltInQuirk(zigpy.quirks.CustomDevice):
        signature = {
            SIG_MODELS_INFO: (("manufacturer", "model"),),
            SIG_ENDPOINTS: {
                1: {
                    SIG_EP_PROFILE: 255,
                    SIG_EP_TYPE: 255,
                    SIG_EP_INPUT: [3],
                    SIG_EP_OUTPUT: [6],
                }
            },
        }

        def get_signature(self):
            pass

    class CustomQuirk(BuiltInQuirk):
        pass

    registry = DeviceRegistry()
    registry.add_to_registry(BuiltInQuirk)
    # With only a single matching quirk there is no choice but to use the first one
    assert type(registry.get_device(real_device)) is BuiltInQuirk

    registry.add_to_registry(CustomQuirk)
    # A quirk registered later that also matches the device will be preferred
    assert type(registry.get_device(real_device)) is CustomQuirk
Ejemplo n.º 5
0
def test_get_device_old_signature(real_device):
    class TestDevice:
        signature = {}

        def __init__(*args, **kwargs):
            pass

        def get_signature(self):
            pass

    registry = DeviceRegistry()
    registry.add_to_registry(TestDevice)

    assert registry.get_device(real_device) is real_device

    TestDevice.signature[1] = {'profile_id': 1}
    assert registry.get_device(real_device) is real_device

    TestDevice.signature[1]['profile_id'] = 255
    TestDevice.signature[1]['device_type'] = 1
    assert registry.get_device(real_device) is real_device

    TestDevice.signature[1]['device_type'] = 255
    TestDevice.signature[1]['input_clusters'] = [1]
    assert registry.get_device(real_device) is real_device

    TestDevice.signature[1]['input_clusters'] = [3]
    TestDevice.signature[1]['output_clusters'] = [1]
    assert registry.get_device(real_device) is real_device

    TestDevice.signature[1]['output_clusters'] = [6]
    TestDevice.signature[1]['model'] = 'x'
    assert registry.get_device(real_device) is real_device

    TestDevice.signature[1]['model'] = 'model'
    TestDevice.signature[1]['manufacturer'] = 'x'
    assert registry.get_device(real_device) is real_device

    TestDevice.signature[1]['manufacturer'] = 'manufacturer'
    assert isinstance(registry.get_device(real_device), TestDevice)
Ejemplo n.º 6
0
def test_get_device_old_signature(real_device):
    class TestDevice:
        signature = {}

        def __init__(*args, **kwargs):
            pass

        def get_signature(self):
            pass

    registry = DeviceRegistry()
    registry.add_to_registry(TestDevice)

    assert registry.get_device(real_device) is real_device

    TestDevice.signature[1] = {"profile_id": 1}
    assert registry.get_device(real_device) is real_device

    TestDevice.signature[1]["profile_id"] = 255
    TestDevice.signature[1]["device_type"] = 1
    assert registry.get_device(real_device) is real_device

    TestDevice.signature[1]["device_type"] = 255
    TestDevice.signature[1]["input_clusters"] = [1]
    assert registry.get_device(real_device) is real_device

    TestDevice.signature[1]["input_clusters"] = [3]
    TestDevice.signature[1]["output_clusters"] = [1]
    assert registry.get_device(real_device) is real_device

    TestDevice.signature[1]["output_clusters"] = [6]
    TestDevice.signature[1]["model"] = "x"
    assert registry.get_device(real_device) is real_device

    TestDevice.signature[1]["model"] = "model"
    TestDevice.signature[1]["manufacturer"] = "x"
    assert registry.get_device(real_device) is real_device

    TestDevice.signature[1]["manufacturer"] = "manufacturer"
    assert isinstance(registry.get_device(real_device), TestDevice)
Ejemplo n.º 7
0
def test_quirk_wildcard_manufacturer(real_device, real_device_2):
    """Test quirk matching with a wildcard (None) manufacturer."""

    class BaseDev(zigpy.quirks.CustomDevice):
        def get_signature(self):
            pass

    class ModelsQuirk(BaseDev):
        signature = {
            SIG_MODELS_INFO: (("manufacturer", "model"),),
            SIG_ENDPOINTS: {
                1: {
                    SIG_EP_PROFILE: 255,
                    SIG_EP_TYPE: 255,
                    SIG_EP_INPUT: [3],
                    SIG_EP_OUTPUT: [6],
                }
            },
        }

    class ModelsQuirkNoMatch(BaseDev):
        # same model and manufacture, different endpoint signature
        signature = {
            SIG_MODELS_INFO: (("manufacturer", "model"),),
            SIG_ENDPOINTS: {
                1: {
                    SIG_EP_PROFILE: 260,
                    SIG_EP_TYPE: 255,
                    SIG_EP_INPUT: [3],
                    SIG_EP_OUTPUT: [6],
                }
            },
        }

    class ModelOnlyQuirk(BaseDev):
        # Wildcard Manufacturer
        signature = {
            SIG_MODEL: "model",
            SIG_ENDPOINTS: {
                1: {
                    SIG_EP_PROFILE: 255,
                    SIG_EP_TYPE: 255,
                    SIG_EP_INPUT: [3],
                    SIG_EP_OUTPUT: [6],
                }
            },
        }

    class ModelOnlyQuirkNoMatch(BaseDev):
        # Wildcard Manufacturer, none matching endpoint signature
        signature = {
            SIG_MODEL: "model",
            SIG_ENDPOINTS: {
                1: {
                    SIG_EP_PROFILE: 260,
                    SIG_EP_TYPE: 255,
                    SIG_EP_INPUT: [3],
                    SIG_EP_OUTPUT: [6],
                }
            },
        }

    registry = DeviceRegistry()
    for quirk in ModelsQuirk, ModelsQuirkNoMatch, ModelOnlyQuirk, ModelOnlyQuirkNoMatch:
        registry.add_to_registry(quirk)

    quirked = registry.get_device(real_device)
    assert isinstance(quirked, ModelsQuirk)

    quirked = registry.get_device(real_device_2)
    assert isinstance(quirked, ModelOnlyQuirk)

    real_device.manufacturer = (
        "We are expected to match a manufacturer wildcard quirk now"
    )
    quirked = registry.get_device(real_device)
    assert isinstance(quirked, ModelOnlyQuirk)

    real_device.model = "And now we should not match any quirk"
    quirked = registry.get_device(real_device)
    assert quirked is real_device
Ejemplo n.º 8
0
def test_different_manuf_same_model(real_device, real_device_2):
    """Test quirk matching for same model, but different manufacturers."""

    class TestDevice_1(zigpy.quirks.CustomDevice):
        signature = {
            SIG_MODELS_INFO: (("manufacturer", "model"),),
            SIG_ENDPOINTS: {
                1: {
                    SIG_EP_PROFILE: 255,
                    SIG_EP_TYPE: 255,
                    SIG_EP_INPUT: [3],
                    SIG_EP_OUTPUT: [6],
                }
            },
        }

        def get_signature(self):
            pass

    class TestDevice_2(zigpy.quirks.CustomDevice):
        signature = {
            SIG_MODELS_INFO: (("A different manufacturer", "model"),),
            SIG_ENDPOINTS: {
                1: {
                    SIG_EP_PROFILE: 255,
                    SIG_EP_TYPE: 255,
                    SIG_EP_INPUT: [3],
                    SIG_EP_OUTPUT: [6],
                }
            },
        }

        def get_signature(self):
            pass

    registry = DeviceRegistry()
    registry.add_to_registry(TestDevice_1)

    assert isinstance(registry.get_device(real_device), TestDevice_1)

    assert registry.get_device(real_device_2) is real_device_2
    registry.add_to_registry(TestDevice_2)
    assert isinstance(registry.get_device(real_device_2), TestDevice_2)

    assert not zigpy.quirks.get_quirk_list("manufacturer", "no such model")
    assert not zigpy.quirks.get_quirk_list("manufacturer", "no such model", registry)
    assert not zigpy.quirks.get_quirk_list("A different manufacturer", "no such model")
    assert not zigpy.quirks.get_quirk_list(
        "A different manufacturer", "no such model", registry
    )
    assert not zigpy.quirks.get_quirk_list("no such manufacturer", "model")
    assert not zigpy.quirks.get_quirk_list("no such manufacturer", "model", registry)

    manuf1_list = zigpy.quirks.get_quirk_list("manufacturer", "model", registry)
    assert len(manuf1_list) == 1
    assert manuf1_list[0] is TestDevice_1

    manuf2_list = zigpy.quirks.get_quirk_list(
        "A different manufacturer", "model", registry
    )
    assert len(manuf2_list) == 1
    assert manuf2_list[0] is TestDevice_2