diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/dm/usb.c | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/test/dm/usb.c b/test/dm/usb.c index ccc07d5..721d3ad 100644 --- a/test/dm/usb.c +++ b/test/dm/usb.c @@ -12,8 +12,11 @@ #include <asm/state.h> #include <dm/device-internal.h> #include <dm/test.h> +#include <dm/uclass-internal.h> #include <test/ut.h> +DECLARE_GLOBAL_DATA_PTR; + /* Test that sandbox USB works correctly */ static int dm_test_usb_base(struct unit_test_state *uts) { @@ -52,3 +55,156 @@ static int dm_test_usb_flash(struct unit_test_state *uts) return 0; } DM_TEST(dm_test_usb_flash, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); + +/* test that we can handle multiple storage devices */ +static int dm_test_usb_multi(struct unit_test_state *uts) +{ + struct udevice *dev; + + state_set_skip_delays(true); + ut_assertok(usb_init()); + ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 0, &dev)); + ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 1, &dev)); + ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 2, &dev)); + + return 0; +} +DM_TEST(dm_test_usb_multi, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); + +static int count_usb_devices(void) +{ + struct udevice *hub; + struct uclass *uc; + int count = 0; + int ret; + + ret = uclass_get(UCLASS_USB_HUB, &uc); + if (ret) + return ret; + + uclass_foreach_dev(hub, uc) { + struct udevice *dev; + + count++; + for (device_find_first_child(hub, &dev); + dev; + device_find_next_child(&dev)) { + count++; + } + } + + return count; +} + +/* test that we can remove an emulated device and it is then not found */ +static int dm_test_usb_remove(struct unit_test_state *uts) +{ + struct udevice *dev, *emul; + + /* Scan and check that all devices are present */ + state_set_skip_delays(true); + ut_assertok(usb_init()); + ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 0, &dev)); + ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 1, &dev)); + ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 2, &dev)); + ut_asserteq(5, count_usb_devices()); + ut_assertok(usb_stop()); + ut_asserteq(5, count_usb_devices()); + + /* Remove the second emulation device */ + ut_assertok(uclass_find_device_by_name(UCLASS_USB_EMUL, "flash-stick@1", + &dev)); + ut_assertok(device_unbind(dev)); + + /* Rescan - only the first and third should be present */ + ut_assertok(usb_init()); + ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 0, &dev)); + ut_assertok(usb_emul_find_for_dev(dev, &emul)); + ut_asserteq_str("flash-stick@0", emul->name); + ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 1, &dev)); + ut_assertok(usb_emul_find_for_dev(dev, &emul)); + ut_asserteq_str("flash-stick@2", emul->name); + + ut_asserteq(-ENODEV, uclass_get_device(UCLASS_MASS_STORAGE, 2, &dev)); + + ut_asserteq(4, count_usb_devices()); + ut_assertok(usb_stop()); + ut_asserteq(4, count_usb_devices()); + + return 0; +} +DM_TEST(dm_test_usb_remove, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); + +const char usb_tree_base[] = +" 1 Hub (12 Mb/s, 100mA)\n" +" | sandbox hub 2345\n" +" |\n" +" |\b+-2 Mass Storage (12 Mb/s, 100mA)\n" +" | sandbox flash flash-stick@0\n" +" | \n" +" |\b+-3 Mass Storage (12 Mb/s, 100mA)\n" +" | sandbox flash flash-stick@1\n" +" | \n" +" |\b+-4 Mass Storage (12 Mb/s, 100mA)\n" +" sandbox flash flash-stick@2\n" +" \n"; + +/* test that the 'usb tree' command output looks correct */ +static int dm_test_usb_tree(struct unit_test_state *uts) +{ + char *data; + int len; + + state_set_skip_delays(true); + ut_assertok(usb_init()); + console_record_reset_enable(); + usb_show_tree(); + len = membuff_getraw(&gd->console_out, -1, true, &data); + if (len) + data[len] = '\0'; + ut_asserteq_str(usb_tree_base, data); + ut_assertok(usb_stop()); + + return 0; +} +DM_TEST(dm_test_usb_tree, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); + +const char usb_tree_remove[] = +" 1 Hub (12 Mb/s, 100mA)\n" +" | sandbox hub 2345\n" +" |\n" +" |\b+-2 Mass Storage (12 Mb/s, 100mA)\n" +" | sandbox flash flash-stick@0\n" +" | \n" +" |\b+-3 Mass Storage (12 Mb/s, 100mA)\n" +" sandbox flash flash-stick@2\n" +" \n"; + +/* + * test that the 'usb tree' command output looks correct when we remove a + * device + */ +static int dm_test_usb_tree_remove(struct unit_test_state *uts) +{ + struct udevice *dev; + char *data; + int len; + + /* Remove the second emulation device */ + ut_assertok(uclass_find_device_by_name(UCLASS_USB_EMUL, "flash-stick@1", + &dev)); + ut_assertok(device_unbind(dev)); + + state_set_skip_delays(true); + ut_assertok(usb_init()); + console_record_reset_enable(); + usb_show_tree(); + len = membuff_getraw(&gd->console_out, -1, true, &data); + if (len) + data[len] = '\0'; + ut_asserteq_str(usb_tree_remove, data); + ut_assertok(usb_stop()); + + return 0; +} +DM_TEST(dm_test_usb_tree_remove, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); |