From 431cbd6d8243c2ebae473deabba788666d65c674 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Sun, 8 Nov 2015 23:48:01 -0700 Subject: [PATCH] dm: test: usb: Add tests for the 'usb tree' command Add tests that this command produces the right output, even when a rescan results in a device disappearing from the bus. Signed-off-by: Simon Glass --- arch/sandbox/dts/test.dts | 14 ++++- test/dm/usb.c | 156 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 169 insertions(+), 1 deletion(-) diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index e2c4971..52749c0 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -307,12 +307,24 @@ compatible = "sandbox,usb-hub"; #address-cells = <1>; #size-cells = <0>; - flash-stick { + flash-stick@0 { reg = <0>; compatible = "sandbox,usb-flash"; sandbox,filepath = "testflash.bin"; }; + flash-stick@1 { + reg = <1>; + compatible = "sandbox,usb-flash"; + sandbox,filepath = "testflash1.bin"; + }; + + flash-stick@2 { + reg = <2>; + compatible = "sandbox,usb-flash"; + sandbox,filepath = "testflash2.bin"; + }; + }; }; }; 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 #include #include +#include #include +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);