diff options
-rw-r--r-- | tests/init_shutdown.c | 95 | ||||
-rw-r--r-- | tests/io_mock.h | 21 | ||||
-rw-r--r-- | tests/libusb_wraps.c | 83 | ||||
-rw-r--r-- | tests/meson.build | 12 | ||||
-rw-r--r-- | tests/tests.c | 1 | ||||
-rw-r--r-- | tests/tests.h | 1 |
6 files changed, 208 insertions, 5 deletions
diff --git a/tests/init_shutdown.c b/tests/init_shutdown.c index e64e58cb..2a8d6f5e 100644 --- a/tests/init_shutdown.c +++ b/tests/init_shutdown.c @@ -54,6 +54,101 @@ void nicrealtek_init_and_shutdown_test_success(void **state) #endif } +static ssize_t raiden_debug_libusb_get_device_list(void *state, libusb_context *ctx, libusb_device ***list) +{ + *list = calloc(1, sizeof(**list)); + + /* + * libusb_device is opaque type, it is tossed around between libusb functions but always + * stays opaque to the caller. + * Given that all libusb functions are mocked in tests, and raiden_debug test is mocking + * only one device, we don't need to initialise libusb_device. + */ + return 1; +} + +static void raiden_debug_libusb_free_device_list(void *state, libusb_device **list, int unref_devices) +{ + free(list); +} + +static int raiden_debug_libusb_get_device_descriptor( + void *state, libusb_device *dev, struct libusb_device_descriptor *desc) +{ + desc->idVendor = 0x18D1; /* GOOGLE_VID */ + desc->idProduct = 0; + desc->bNumConfigurations = 1; + + return 0; +} + +static int raiden_debug_libusb_get_config_descriptor( + void *state, libusb_device *dev, uint8_t config_index, struct libusb_config_descriptor **config) +{ + *config = calloc(1, sizeof(**config)); + + struct libusb_endpoint_descriptor *tmp_endpoint = calloc(2, sizeof(*tmp_endpoint)); + struct libusb_interface_descriptor *tmp_interface_desc = calloc(1, sizeof(*tmp_interface_desc)); + struct libusb_interface *tmp_interface = calloc(1, sizeof(*tmp_interface)); + + /* in endpoint */ + tmp_endpoint[0].bEndpointAddress = 0x80; + tmp_endpoint[0].bmAttributes = 0x2; + /* out endpoint */ + tmp_endpoint[1].bEndpointAddress = 0x0; + tmp_endpoint[1].bmAttributes = 0x2; + + tmp_interface_desc->bInterfaceClass = 0xff; /* LIBUSB_CLASS_VENDOR_SPEC */ + tmp_interface_desc->bInterfaceSubClass = 0x51; /* GOOGLE_RAIDEN_SPI_SUBCLASS */ + tmp_interface_desc->bInterfaceProtocol = 0x01; /* GOOGLE_RAIDEN_SPI_PROTOCOL_V1 */ + tmp_interface_desc->bNumEndpoints = 2; /* in_endpoint and out_endpoint */ + tmp_interface_desc->endpoint = tmp_endpoint; + + tmp_interface->num_altsetting = 1; + tmp_interface->altsetting = tmp_interface_desc; + + (*config)->bConfigurationValue = 0; + (*config)->bNumInterfaces = 1; + (*config)->interface = tmp_interface; + + return 0; +} + +static void raiden_debug_libusb_free_config_descriptor(void *state, struct libusb_config_descriptor *config) +{ + free((void *)config->interface->altsetting->endpoint); + free((void *)config->interface->altsetting); + free((void *)config->interface); + free(config); +} + +void raiden_debug_init_and_shutdown_test_success(void **state) +{ +#if CONFIG_RAIDEN_DEBUG_SPI == 1 + const struct io_mock raiden_debug_io = { + .libusb_get_device_list = raiden_debug_libusb_get_device_list, + .libusb_free_device_list = raiden_debug_libusb_free_device_list, + .libusb_get_device_descriptor = raiden_debug_libusb_get_device_descriptor, + .libusb_get_config_descriptor = raiden_debug_libusb_get_config_descriptor, + .libusb_free_config_descriptor = raiden_debug_libusb_free_config_descriptor, + }; + + /* + * 12 is the length of programmer param string for 3-digit address. + * Address can be max 3-digit because it needs to fit into uint8_t. + */ + char raiden_debug_param[12]; + snprintf(raiden_debug_param, 12, "address=%d", USB_DEVICE_ADDRESS); + + io_mock_register(&raiden_debug_io); + + run_lifecycle(state, &programmer_raiden_debug_spi, raiden_debug_param); + + io_mock_register(NULL); +#else + skip(); +#endif +} int dediprog_libusb_init(void *state, libusb_context **ctx) { diff --git a/tests/io_mock.h b/tests/io_mock.h index 0bee6cab..854ddd94 100644 --- a/tests/io_mock.h +++ b/tests/io_mock.h @@ -34,11 +34,14 @@ /* Required for `FILE *` */ #include <stdio.h> -/* Define libusb symbols to avoid dependency on libusb.h */ -struct libusb_device_handle; -typedef struct libusb_device_handle libusb_device_handle; -struct libusb_context; -typedef struct libusb_context libusb_context; +/* + * Explicitly including the header because some tests are using libusb structs + * in depth, opaque symbols are not sufficient. + */ +#include <libusb.h> + +/* Address value needs fit into uint8_t. */ +#define USB_DEVICE_ADDRESS 19 /* Define struct pci_dev to avoid dependency on pci.h */ struct pci_dev { @@ -80,6 +83,14 @@ struct io_mock { unsigned char *data, uint16_t wLength, unsigned int timeout); + ssize_t (*libusb_get_device_list)(void *state, libusb_context *, libusb_device ***list); + void (*libusb_free_device_list)(void *state, libusb_device **list, int unref_devices); + int (*libusb_get_device_descriptor)(void *state, libusb_device *, struct libusb_device_descriptor *); + int (*libusb_get_config_descriptor)(void *state, + libusb_device *, + uint8_t config_index, + struct libusb_config_descriptor **); + void (*libusb_free_config_descriptor)(void *state, struct libusb_config_descriptor *); /* POSIX File I/O */ int (*open)(void *state, const char *pathname, int flags); diff --git a/tests/libusb_wraps.c b/tests/libusb_wraps.c index 978108e6..8f9e243f 100644 --- a/tests/libusb_wraps.c +++ b/tests/libusb_wraps.c @@ -13,6 +13,8 @@ * GNU General Public License for more details. */ +#include <stdlib.h> + #include <include/test.h> #include "io_mock.h" @@ -31,6 +33,76 @@ int __wrap_libusb_init(libusb_context **ctx) return 0; } +int __wrap_libusb_open(libusb_device *dev, libusb_device_handle **devh) +{ + LOG_ME; + return 0; +} + +int __wrap_libusb_set_auto_detach_kernel_driver(libusb_device_handle *devh, int enable) +{ + LOG_ME; + return 0; +} + +ssize_t __wrap_libusb_get_device_list(libusb_context *ctx, libusb_device ***list) +{ + LOG_ME; + if (get_io() && get_io()->libusb_get_device_list) + return get_io()->libusb_get_device_list(get_io()->state, ctx, list); + return 0; +} + +void __wrap_libusb_free_device_list(libusb_device **list, int unref_devices) +{ + LOG_ME; + if (get_io() && get_io()->libusb_free_device_list) + get_io()->libusb_free_device_list(get_io()->state, list, unref_devices); +} + +uint8_t __wrap_libusb_get_bus_number(libusb_device *dev) +{ + LOG_ME; + return 0; +} + +uint8_t __wrap_libusb_get_device_address(libusb_device *dev) +{ + LOG_ME; + return USB_DEVICE_ADDRESS; +} + +int __wrap_libusb_get_device_descriptor(libusb_device *dev, struct libusb_device_descriptor *desc) +{ + LOG_ME; + if (get_io() && get_io()->libusb_get_device_descriptor) + return get_io()->libusb_get_device_descriptor(get_io()->state, dev, desc); + return 0; +} + +int __wrap_libusb_get_config_descriptor( + libusb_device *dev, uint8_t config_index, struct libusb_config_descriptor **config) +{ + LOG_ME; + if (get_io() && get_io()->libusb_get_config_descriptor) + return get_io()->libusb_get_config_descriptor(get_io()->state, dev, config_index, config); + return 0; +} + +void __wrap_libusb_free_config_descriptor(struct libusb_config_descriptor *config) +{ + LOG_ME; + if (get_io() && get_io()->libusb_free_config_descriptor) + return get_io()->libusb_free_config_descriptor(get_io()->state, config); + return; +} + +int __wrap_libusb_get_configuration(libusb_device_handle *devh, int *config) +{ + LOG_ME; + return 0; +} + int __wrap_libusb_set_configuration(libusb_device_handle *devh, int config) { LOG_ME; @@ -65,6 +137,17 @@ void __wrap_libusb_close(libusb_device_handle *devh) LOG_ME; } +libusb_device *__wrap_libusb_ref_device(libusb_device *dev) +{ + LOG_ME; + return NULL; +} + +void __wrap_libusb_unref_device(libusb_device *dev) +{ + LOG_ME; +} + void __wrap_libusb_exit(libusb_context *ctx) { LOG_ME; diff --git a/tests/meson.build b/tests/meson.build index 415ce132..5bb6ac99 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -70,10 +70,22 @@ mocks = [ '-Wl,--wrap=test_inl', '-Wl,--wrap=usb_dev_get_by_vid_pid_number', '-Wl,--wrap=libusb_init', + '-Wl,--wrap=libusb_open', + '-Wl,--wrap=libusb_set_auto_detach_kernel_driver', + '-Wl,--wrap=libusb_get_device_list', + '-Wl,--wrap=libusb_free_device_list', + '-Wl,--wrap=libusb_get_bus_number', + '-Wl,--wrap=libusb_get_device_address', + '-Wl,--wrap=libusb_get_device_descriptor', + '-Wl,--wrap=libusb_get_config_descriptor', + '-Wl,--wrap=libusb_free_config_descriptor', + '-Wl,--wrap=libusb_get_configuration', '-Wl,--wrap=libusb_set_configuration', '-Wl,--wrap=libusb_claim_interface', '-Wl,--wrap=libusb_control_transfer', '-Wl,--wrap=libusb_release_interface', + '-Wl,--wrap=libusb_ref_device', + '-Wl,--wrap=libusb_unref_device', '-Wl,--wrap=libusb_close', '-Wl,--wrap=libusb_exit', '-Wl,--gc-sections', diff --git a/tests/tests.c b/tests/tests.c index f2547ffb..a4a312e2 100644 --- a/tests/tests.c +++ b/tests/tests.c @@ -351,6 +351,7 @@ int main(void) const struct CMUnitTest init_shutdown_tests[] = { cmocka_unit_test(dummy_init_and_shutdown_test_success), cmocka_unit_test(nicrealtek_init_and_shutdown_test_success), + cmocka_unit_test(raiden_debug_init_and_shutdown_test_success), cmocka_unit_test(dediprog_init_and_shutdown_test_success), cmocka_unit_test(linux_mtd_init_and_shutdown_test_success), cmocka_unit_test(linux_spi_init_and_shutdown_test_success), diff --git a/tests/tests.h b/tests/tests.h index 732920a9..16974af2 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -43,6 +43,7 @@ void probe_spi_st95_test_success(void **state); /* spi95.c */ /* init_shutdown.c */ void dummy_init_and_shutdown_test_success(void **state); void nicrealtek_init_and_shutdown_test_success(void **state); +void raiden_debug_init_and_shutdown_test_success(void **state); void dediprog_init_and_shutdown_test_success(void **state); void linux_mtd_init_and_shutdown_test_success(void **state); void linux_spi_init_and_shutdown_test_success(void **state); |