예제 #1
0
    def test_uid_hashing(self):
        uid1 = generateUID()
        uid2 = generateUID()
        # Usual checks for different UIDs
        # Checks that if hashes are different then elements are not equal
        self.assertNotEqual(hash(uid1), hash(uid2))
        self.assertNotEqual(uid1, uid2)

        # Checks lookup in set
        self.assertIn(uid1, (uid1, uid2))
        self.assertIn(uid2, {uid1, uid2})
        # Checks lookup in dictionary
        self.assertIn(uid1, {uid1: "1", uid2: "2"})
        self.assertNotIn(uid1, dict())
        self.assertNotIn(uid1, {uid2: "1"})
        self.assertEqual({uid1: "1", uid2: "2"}.get(uid1), "1")
        self.assertIsNone({uid2: "2"}.get(uid1))

        # Checks the situation where two UIDs are equal/corresponding to the same device but their fields are different.
        uid3 = WindowsUID(uid="uid12&223",
                          raw_uid="djfds;fj",
                          serial_number=None)
        uid4 = WindowsUID(uid="123412",
                          raw_uid="djfds;fjfsf&0&0000",
                          serial_number="uid12&223")
        # UIDs being equal => hashes are equal.
        self.assertEqual(uid3, uid4)
        self.assertEqual(uid4, uid3)
        self.assertEqual(hash(uid3), hash(uid4))
        self.assertEqual(hash(uid4), hash(uid3))
        # Checks lookup in set
        self.assertIn(uid3, (uid1, uid4))
        self.assertIn(uid4, (uid1, uid3))
    def parse_uid(self,
                  raw_id: str,
                  serial_number: Optional[str] = None) -> WindowsUID:
        """Parses the UID value.

        As described here:
        https://docs.microsoft.com/it-it/windows-hardware/drivers/install/device-instance-ids
        https://stackoverflow.com/questions/51513337/is-the-usb-instance-id-on-windows-unique-for-a-device
        https://docs.microsoft.com/it-it/windows-hardware/drivers/install/instance-ids
        the instance ID corresponds to the serial number information, if supported by the underlying bus, otherwise
        it is generated by Windows.

        For some boards (e.g. ST boards), the ID may contain other information that we are not interested in
        (e.g. MI value). This method tries to retrieve the actual ID.
        """
        id_elements = raw_id.split("&")
        if len(id_elements) <= 1:
            # The instance ID is the serial number.
            return WindowsUID(uid=raw_id.lower(),
                              raw_uid=raw_id,
                              serial_number=serial_number)
        # The instance ID is generated by Windows and hence might contain other element than the ParentPrefixID.
        # The following tries to only consider what may be the ParentPrefixID.
        return WindowsUID(uid="&".join(id_elements[:-1]).lower(),
                          raw_uid=raw_id,
                          serial_number=serial_number)
예제 #3
0
 def test_ordering(self):
     uid1 = WindowsUID(uid="123456789",
                       raw_uid="/uid1&002",
                       serial_number=None)
     uid2 = WindowsUID(uid="0&64FAFGG",
                       raw_uid="/0&64FAFGG&002",
                       serial_number="345240562")
     self.assertGreater(uid2, uid1)
     self.assertLess(uid1, uid2)
     self.assertListEqual(sorted([uid2, uid1]), [uid1, uid2])
예제 #4
0
    def test_single_interface_usb_device(self):
        from mbed_tools.devices._internal.windows.usb_device_identifier import parse_device_id

        self.assertTrue(parse_device_id("").is_undefined)
        self.assertTrue(parse_device_id(None).is_undefined)
        self.assertTrue(parse_device_id("4&38EF038C&0&0").is_undefined)
        self.assertFalse(parse_device_id("USB\\4&38EF038C&0&0").is_undefined)
        self.assertEqual(
            parse_device_id("USB\\4&38EF038C&0&0").uid,
            WindowsUID(uid="4&38ef038c&0",
                       raw_uid="4&38EF038C&0&0",
                       serial_number=None),
        )
        self.assertEqual(
            parse_device_id("USB\\ROOT_HUB30\\4&38EF038C&0&0").uid.raw_uid,
            "4&38EF038C&0&0")
        self.assertEqual(
            parse_device_id("USB\\VID_2109&PID_2812\\6&38E4CCB6&0&4").uid,
            WindowsUID(uid="6&38e4ccb6&0",
                       raw_uid="6&38E4CCB6&0&4",
                       serial_number=None),
        )
        self.assertEqual(
            parse_device_id("USB\\VID_2109&PID_2812\\6&38E4CCB6&0&4").PID,
            "2812")
        self.assertEqual(
            parse_device_id("USB\\VID_2109&PID_2812\\6&38E4CCB6&0&4").VID,
            "2109")
        self.assertEqual(
            parse_device_id(
                "USB\\VID_2109&PID_2812&REV_1100\\6&38E4CCB6&0&4").REV, "1100")

        self.assertGreaterEqual(
            data_object_to_dict(
                parse_device_id(
                    "USB\\VID_2109&PID_2812&REV_1100\\6&38E4CCB6&0&4")).items(
                    ),
            {
                "VID":
                "2109",
                "PID":
                "2812",
                "REV":
                "1100",
                "UID":
                WindowsUID(uid="6&38e4ccb6&0",
                           raw_uid="6&38E4CCB6&0&4",
                           serial_number=None),
            }.items(),
        )
        self.assertEqual(parse_device_id("USB\\4&38EF038C&0&0").product_id, "")
        self.assertEqual(parse_device_id("USB\\4&38EF038C&0&0").vendor_id, "")
예제 #5
0
 def test_instanceid(self):
     # Tests trying to determine the most plausible instance IDs from a set of values.
     uid1 = generateUID()
     self.assertEqual(uid1.instance_id, uid1.serial_number)
     uid2 = WindowsUID(uid="uid12&223",
                       raw_uid="djfds;fj",
                       serial_number=None)
     self.assertEqual(uid2.instance_id, uid2.uid)
     uid3 = WindowsUID(uid="uid12&223",
                       raw_uid="djfds;fj",
                       serial_number="12345679")
     self.assertEqual(uid3.instance_id, uid3.uid)
     uid4 = WindowsUID(uid="12345687",
                       raw_uid="djfds;fj",
                       serial_number="12&3456&79")
     self.assertEqual(uid4.instance_id, uid4.serial_number)
예제 #6
0
    def parse(self, pnpid: str, serial_number: Optional[str]) -> WindowsUID:
        """Parses the UID value based on multiple fields.

        For different boards, the ID is stored in different fields.
        e.g. JLink serial number is irrelevant whereas it is the correct field for Daplink boards.
        For others, the PNPDeviceID should be used instead.
        """
        (uid, raw_uid) = self._parse_pnpid(pnpid)
        return WindowsUID(uid=uid, raw_uid=raw_uid, serial_number=serial_number)
    def test_get_usb_interfaces(self):
        from mbed_tools.devices._internal.windows.usb_hub_data_loader import UsbIdentifier

        known_usb = UsbIdentifier(
            UID=WindowsUID(
                uid="0670ff303931594e43184021", raw_uid="0670FF303931594E43184021", serial_number="8&2ae96f5b&0"
            ),
            VID="0483",
            PID="374B",
            REV=None,
            MI=None,
        )
        expected_related_interfaces = [
            "USB\\VID_0483&PID_374B\\0670FF303931594E43184021",
            "USB\\VID_0483&PID_374B&MI_01\\8&2AE96F5B&0&0001",
        ]
        mock = generate_mocked_system_usb_device_information()
        self.assertIsNotNone(mock.get_usb_devices(known_usb))
        self.assertListEqual([h.component_id for h in mock.get_usb_devices(known_usb)], expected_related_interfaces)
예제 #8
0
 def test_serial_number(self):
     # Tests trying to determine the most plausible serial number from a set of values.
     uid1 = generateUID()
     self.assertEqual(uid1.presumed_serial_number, uid1.uid)
     self.assertNotEqual(uid1.presumed_serial_number, uid1.serial_number)
     uid2 = WindowsUID(uid="uid12&223",
                       raw_uid="djfds;fj",
                       serial_number=None)
     self.assertEqual(uid2.presumed_serial_number, uid2.uid)
     self.assertNotEqual(uid2.presumed_serial_number, uid2.serial_number)
     self.assertFalse(uid2.contains_genuine_serial_number())
     uid3 = WindowsUID(uid="uid12&223",
                       raw_uid="djfds;fj",
                       serial_number="12345679")
     self.assertNotEqual(uid3.presumed_serial_number, uid3.uid)
     self.assertEqual(uid3.presumed_serial_number, uid3.serial_number)
     self.assertTrue(uid3.contains_genuine_serial_number())
예제 #9
0
 def test_related_uid_lookup(self):
     # Tests dictionary lookup using real data.
     # UIDs are corresponding to Disk UIDs and related USB HUB UIDs.
     # Daplink
     uid11 = WindowsUID(
         uid="0240000034544e45001a00018aa900292011000097969900&0",
         raw_uid="0240000034544E45001A00018AA900292011000097969900&0",
         serial_number="0240000034544e45001a00018aa900292011000097969900",
     )
     uid12 = WindowsUID(
         uid="0240000034544e45001a00018aa900292011000097969900",
         raw_uid="0240000034544E45001A00018AA900292011000097969900",
         serial_number=None,
     )
     self.assertIn(uid12.presumed_serial_number,
                   {uid11.presumed_serial_number: ""})
     # JLink
     uid21 = WindowsUID(uid="000440112138",
                        raw_uid="9&DBDECF6&0&000440112138&0",
                        serial_number="                       134657890")
     uid22 = WindowsUID(uid="000440112138",
                        raw_uid="000440112138",
                        serial_number="8&2f125ec6&0")
     self.assertIn(uid21.presumed_serial_number,
                   {uid22.presumed_serial_number: ""})
     # STLink
     uid31 = WindowsUID(
         uid="0672ff574953867567051035",
         raw_uid="9&3849C7A8&0&0672FF574953867567051035&0",
         serial_number="0672FF574953867567051035",
     )
     uid32 = WindowsUID(uid="0672ff574953867567051035",
                        raw_uid="0672FF574953867567051035",
                        serial_number="8&254f12cf&0")
     self.assertIn(uid31.presumed_serial_number,
                   {uid32.presumed_serial_number: ""})
def generate_mocked_system_usb_device_information():
    from mbed_tools.devices._internal.windows.usb_hub_data_loader import (
        SystemUsbDeviceInformation,
        UsbHub,
        UsbIdentifier,
    )
    from mbed_tools.devices._internal.windows.system_data_loader import SystemDataLoader

    controllers = [
        UsbIdentifier(
            UID=WindowsUID(uid="3&33fd14ca&0", raw_uid="3&33FD14CA&0&A0", serial_number=None),
            VID="0483",
            PID="ABDB",
            REV="21",
            MI=None,
        )
    ]

    genuine_usb_hubs = [
        {"DeviceID": "USB\\VID_04CA&PID_7058\\5&31AC2C0B&0&8", "PNPDeviceID": "USB\\VID_04CA&PID_7058\\5&31AC2C0B&0&8"},
        {
            "DeviceID": "USB\\VID_0D28&PID_0204&MI_00\\0240000034544E45001A00018AA900292011000097969900",
            "PNPDeviceID": "USB\\VID_0D28&PID_0204&MI_00\\0240000034544E45001A00018AA900292011000097969900",
        },
        {
            "DeviceID": "USB\\VID_1FD2&PID_5003\\5&31AC2C0B&0&10",
            "PNPDeviceID": "USB\\VID_1FD2&PID_5003\\5&31AC2C0B&0&10",
        },
        {
            "DeviceID": "USB\\VID_0D28&PID_0204\\0240000034544E45001A00018AA900292011000097969900",
            "PNPDeviceID": "USB\\VID_0D28&PID_0204\\0240000034544E45001A00018AA900292011000097969900",
        },
        {"DeviceID": "USB\\VID_2109&PID_2812\\6&38E4CCB6&0&3", "PNPDeviceID": "USB\\VID_2109&PID_2812\\6&38E4CCB6&0&3"},
        {"DeviceID": "USB\\VID_2109&PID_2812\\6&38E4CCB6&0&4", "PNPDeviceID": "USB\\VID_2109&PID_2812\\6&38E4CCB6&0&4"},
        {"DeviceID": "USB\\ROOT_HUB30\\4&38EF038C&0&0", "PNPDeviceID": "USB\\ROOT_HUB30\\4&38EF038C&0&0"},
        {"DeviceID": "USB\\VID_2109&PID_2812\\5&31AC2C0B&0&1", "PNPDeviceID": "USB\\VID_2109&PID_2812\\5&31AC2C0B&0&1"},
        {"DeviceID": "USB\\VID_1366&PID_1015\\000440112138", "PNPDeviceID": "USB\\VID_1366&PID_1015\\000440112138"},
        {
            "DeviceID": "USB\\VID_1366&PID_1015&MI_02\\8&2F125EC6&0&0002",
            "PNPDeviceID": "USB\\VID_1366&PID_1015&MI_02\\8&2F125EC6&0&0002",
        },
        {
            "DeviceID": "USB\\VID_1366&PID_1015&MI_03\\8&2F125EC6&0&0003",
            "PNPDeviceID": "USB\\VID_1366&PID_1015&MI_03\\8&2F125EC6&0&0003",
        },
        {"DeviceID": "USB\\VID_1366&PID_1015\\000440109371", "PNPDeviceID": "USB\\VID_1366&PID_1015\\000440109371"},
        {
            "DeviceID": "USB\\VID_1366&PID_1015&MI_02\\8&37E0B92A&0&0002",
            "PNPDeviceID": "USB\\VID_1366&PID_1015&MI_02\\8&37E0B92A&0&0002",
        },
        {
            "DeviceID": "USB\\VID_1366&PID_1015&MI_03\\8&37E0B92A&0&0003",
            "PNPDeviceID": "USB\\VID_1366&PID_1015&MI_03\\8&37E0B92A&0&0003",
        },
        {
            "DeviceID": "USB\\VID_0483&PID_374B\\0670FF303931594E43184021",
            "PNPDeviceID": "USB\\VID_0483&PID_374B\\0670FF303931594E43184021",
        },
        {
            "DeviceID": "USB\\VID_0483&PID_374B&MI_01\\8&2AE96F5B&0&0001",
            "PNPDeviceID": "USB\\VID_0483&PID_374B&MI_01\\8&2AE96F5B&0&0001",
        },
    ]
    usb_hubs = genuine_usb_hubs + [
        dict(
            DeviceID=f"USB\\VID_{uid.vendor_id}&PID_{uid.product_id}&MI_01\\{uid.uid.raw_uid}",
            PNPDeviceID=f"USB\\VID_{uid.vendor_id}&PID_{uid.product_id}&MI_01\\{uid.uid.raw_uid}",
        )
        for uid in controllers
    ]

    class MockedDataLoader(SystemDataLoader):
        def _load(self):
            pass

    class MockedSystemUsbDeviceInformation(SystemUsbDeviceInformation):
        def __init__(self):
            super().__init__(MockedDataLoader())

        def _list_usb_controller_ids(self):
            return controllers

        def _iterate_over_hubs(self):
            hubs = [UsbHub() for _ in range(0, len(usb_hubs))]
            for i, hub in enumerate(usb_hubs):
                hubs[i].set_data_values(hub)
            for h in hubs:
                yield h

        def _determine_potential_serial_number(self, usb_device):
            return MOCKED_SERIAL_NUMBER_DATA.get(usb_device.pnp_id)

    return MockedSystemUsbDeviceInformation()
    def test_system_usb_ids_list(self):
        from mbed_tools.devices._internal.windows.usb_hub_data_loader import UsbIdentifier

        mock = generate_mocked_system_usb_device_information()
        expected_values = {
            UsbIdentifier(
                UID=WindowsUID(
                    uid="0240000034544e45001a00018aa900292011000097969900",
                    raw_uid="0240000034544E45001A00018AA900292011000097969900",
                    serial_number=None,
                ),
                VID="0D28",
                PID="0204",
                REV=None,
                MI="00",
            ),
            UsbIdentifier(
                UID=WindowsUID(uid="5&31ac2c0b&0", raw_uid="5&31AC2C0B&0&1", serial_number="6&38e4ccb6&0"),
                VID="2109",
                PID="2812",
                REV=None,
                MI=None,
            ),
            UsbIdentifier(
                UID=WindowsUID(uid="000440112138", raw_uid="000440112138", serial_number="8&2f125ec6&0"),
                VID="1366",
                PID="1015",
                REV=None,
                MI=None,
            ),
            UsbIdentifier(
                UID=WindowsUID(uid="4&38ef038c&0", raw_uid="4&38EF038C&0&0", serial_number="5&31ac2c0b&0"),
                VID=None,
                PID=None,
                REV=None,
                MI=None,
            ),
            UsbIdentifier(
                UID=WindowsUID(uid="5&31ac2c0b&0", raw_uid="5&31AC2C0B&0&10", serial_number="6&1f9e0013&0"),
                VID="1FD2",
                PID="5003",
                REV=None,
                MI=None,
            ),
            UsbIdentifier(
                UID=WindowsUID(uid="000440109371", raw_uid="000440109371", serial_number="8&37e0b92a&0"),
                VID="1366",
                PID="1015",
                REV=None,
                MI=None,
            ),
            UsbIdentifier(
                UID=WindowsUID(uid="5&31ac2c0b&0", raw_uid="5&31AC2C0B&0&8", serial_number="6&212cca94&0"),
                VID="04CA",
                PID="7058",
                REV=None,
                MI=None,
            ),
            UsbIdentifier(
                UID=WindowsUID(
                    uid="0670ff303931594e43184021", raw_uid="0670FF303931594E43184021", serial_number="8&2ae96f5b&0"
                ),
                VID="0483",
                PID="374B",
                REV=None,
                MI=None,
            ),
            UsbIdentifier(
                UID=WindowsUID(uid="6&38e4ccb6&0", raw_uid="6&38E4CCB6&0&3", serial_number="7&3885ae75&0"),
                VID="2109",
                PID="2812",
                REV=None,
                MI=None,
            ),
        }
        self.assertSetEqual(mock.usb_device_ids(), expected_values)
예제 #12
0
    def test_uid_equality(self):
        uid1 = WindowsUID(uid="uid1",
                          raw_uid="/uid1&001",
                          serial_number=str(random.randint(1, 100)))
        # Equal testing with self and other types.
        self.assertNotEqual(uid1, None)
        self.assertIsNotNone(uid1)
        self.assertNotEqual(uid1, "")
        self.assertFalse(uid1 == "")
        self.assertFalse(uid1 == dict())
        self.assertEqual(uid1, uid1)
        self.assertTrue(uid1 == uid1)

        # Does not equal to completely different objects
        uid2 = WindowsUID(uid="uid2", raw_uid="/uid1&002", serial_number=None)
        self.assertNotEqual(uid1, uid2)

        # Equals other objects with same uid
        uid3 = WindowsUID(uid="uid1",
                          raw_uid="/uid1&003",
                          serial_number=str(random.randint(1, 100)))
        self.assertEqual(uid1, uid3)
        self.assertTrue(uid1 == uid3)

        # Equals other objects with similar uid (subset)
        uid5 = WindowsUID(uid="uid1&0114",
                          raw_uid="/uid1&0114",
                          serial_number=None)
        self.assertEqual(uid3, uid5)
        self.assertEqual(uid1, uid5)

        # Equals other objects with same serial number
        uid4 = WindowsUID(uid="uid4",
                          raw_uid="/uid4&004",
                          serial_number=uid1.serial_number)
        self.assertEqual(uid1, uid4)

        # Equals other objects with serial number same to uid
        uid6 = WindowsUID(uid="uid6454",
                          raw_uid="/uid6454&006",
                          serial_number="uid1")
        self.assertEqual(uid1, uid6)
        # Tests with real data examples: disk UIDs and equivalent USB hosts UIDs.
        # Daplink:
        uid7 = WindowsUID(
            uid="0240000034544e45001a00018aa900292011000097969900&0",
            raw_uid="0240000034544E45001A00018AA900292011000097969900&0",
            serial_number="0240000034544e45001a00018aa900292011000097969900",
        )
        uid8 = WindowsUID(
            uid="0240000034544e45001a00018aa900292011000097969900",
            raw_uid="0240000034544E45001A00018AA900292011000097969900",
            serial_number=None,
        )
        self.assertEqual(uid7, uid8)
        # JLink:
        uid9 = WindowsUID(uid="000440112138",
                          raw_uid="9&DBDECF6&0&000440112138&0",
                          serial_number="                       134657890")
        uid10 = WindowsUID(uid="000440112138",
                           raw_uid="000440112138",
                           serial_number="8&2f125ec6&0")
        self.assertEqual(uid9, uid10)
        # STLink
        uid11 = WindowsUID(
            uid="0672ff574953867567051035",
            raw_uid="9&3849C7A8&0&0672FF574953867567051035&0",
            serial_number="0672FF574953867567051035",
        )
        uid12 = WindowsUID(uid="0672ff574953867567051035",
                           raw_uid="0672FF574953867567051035",
                           serial_number="8&254f12cf&0")
        self.assertEqual(uid11, uid12)
예제 #13
0
def generateUID() -> WindowsUID:
    return WindowsUID(uid=str(uuid.uuid4()),
                      raw_uid=f"/{uuid.uuid4()}&001",
                      serial_number=f"SN{str(uuid.uuid4()).replace('-','')}")