Skip to content

Commit

Permalink
Fix the USB Mass Storage Device test so it can run as a CI user witho…
Browse files Browse the repository at this point in the history
…ut root (ARMmbed#65)
  • Loading branch information
multiplemonomials committed Oct 3, 2022
1 parent ffc3367 commit 555345c
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 16 deletions.
28 changes: 23 additions & 5 deletions drivers/usb/tests/TESTS/host_tests/pyusb_msd.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,12 +196,30 @@ def _disk_path_windows(serial):

@staticmethod
def _disk_path_linux(serial):
output = subprocess.check_output(['lsblk', '-dnoserial,mountpoint']).split(b'\n')

# This generates a table of serial number, mount point (e.g. /media/foo/DISK), and path (e.g. /dev/sdd)
output = subprocess.check_output(['lsblk', '-dnoserial,mountpoint,path']).decode("UTF-8").split('\n')
for line in output:
serial_and_mount_point = line.split()
if len(serial_and_mount_point) == 2:
if serial_and_mount_point[0] == str(serial):
return serial_and_mount_point[1]
fields = line.split()

if len(fields) >= 2 and fields[0] == str(serial):
# Found the correct device

if len(fields) == 2:
# "mountpoint" column (idx 1) is empty, meaning the device is not mounted.
# Ask the OS to mount it under our user account.
# Note: This requires that no other processes are trying to automount disks at the same
# time -- this often requires changing file manager settings.
subprocess.check_call(['udisksctl', 'mount', '-b', fields[1]])

# The OS will now mount the disk. Return so that the query can be run again and we'll get it
# next time.
return None

else:
# Disk has a mount point, return it
return fields[1]

return None

@staticmethod
Expand Down
25 changes: 14 additions & 11 deletions drivers/usb/tests/TESTS/usb_device/README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
# Testing the Mbed OS USB device

## Setup
Before running tests, please make sure to use a
[top-level requirements.txt][LN-requirements] file to install all the
Before running tests, please make sure to install all the
required Python modules.

```
pip install -r requirements.txt
pip install -r mbed-os/tools/requirements-ci-build.txt
```

Additional, platform-specific setup is described below.
Expand All @@ -29,7 +28,7 @@ See also [Known issues](#known-issues).
1. Plug both USB interfaces (*DAPLink* and *USB device*).

### Linux
1. Install the `hidapi` Python module, otherwise some USB HID test cases will
1. Install the `hidapi` Python module, otherwise some USB HID test cases will
be skipped. This module is not installed during the initial setup due to
external dependencies for Linux.

Expand All @@ -47,21 +46,26 @@ See also [Known issues](#known-issues).
```bash
pip install -r TESTS/usb_device/hid/requirements.txt
```

1. Update the `udev` rules for Mbed USB CDC device as follows
([source][LN-udev_rules]):
2. Add your user to the `plugdev` group with `sudo usermod -G plugdev <your username>`
3. Update the `udev` rules for the USB VIDs/PIDs used in the test as follows:

```bash
sudo tee /etc/udev/rules.d/99-ttyacms.rules >/dev/null <<EOF
ATTRS{idVendor}=="1f00" ATTRS{idProduct}=="2013", ENV{ID_MM_DEVICE_IGNORE}="1"
ATTRS{idVendor}=="1f00" ATTRS{idProduct}=="2012", ENV{ID_MM_DEVICE_IGNORE}="1"
# Mbed OS USB Device test suite
ATTRS{idVendor}=="0d28", ATTRS{idProduct}=="0007", MODE="660", GROUP="plugdev", TAG+="uaccess"
ATTRS{idVendor}=="0d28", ATTRS{idProduct}=="0205", MODE="660", GROUP="plugdev", TAG+="uaccess"
ATTRS{idVendor}=="0d28", ATTRS{idProduct}=="0206", MODE="660", GROUP="plugdev", TAG+="uaccess"
ATTRS{idVendor}=="1f00" ATTRS{idProduct}=="2013", ENV{ID_MM_DEVICE_IGNORE}="1", MODE="660", GROUP="plugdev"
ATTRS{idVendor}=="1f00" ATTRS{idProduct}=="2012", ENV{ID_MM_DEVICE_IGNORE}="1", MODE="660", GROUP="plugdev"
EOF
sudo udevadm control --reload-rules
sudo udevadm trigger
```
This will prevent the `ModemManager` daemon from automatically opening the
Among other things, this will [prevent][LN-udev_rules] the `ModemManager` daemon from automatically opening the
port and sending the `AT commands`, which it does for every new
`/dev/ttyACM` device registered in system.
4. Install the `udisks2` package, which the test script uses to mount USB disks. Additionally, you may need to disable any automounting of disks provided by your file manager / distro.
### Mac
No setup method has been verified for this platform.
Expand Down Expand Up @@ -152,7 +156,6 @@ To prevent Windows from writing to removable drives on connect drive indexing ca
You may want to connect the device directly to the host machine with no hubs on the way.
<!-- LINKS -->
[LN-requirements]: ../../requirements.txt
[LN-zadig]: https://zadig.akeo.ie/
[LN-zadig_conf1]: basic/zadig_conf/mbed_os-usb_test_device1.cfg
[LN-zadig_conf2]: basic/zadig_conf/mbed_os-usb_test_device2.cfg
Expand Down

0 comments on commit 555345c

Please sign in to comment.