tests: Add tests of asynchronous API 17/62117/1
authorPaweł Szewczyk <p.szewczyk@samsung.com>
Thu, 10 Mar 2016 11:06:37 +0000 (12:06 +0100)
committerPaweł Szewczyk <p.szewczyk@samsung.com>
Mon, 14 Mar 2016 10:31:27 +0000 (11:31 +0100)
Change-Id: Ia090f9817c222df4c88f5dcebc81982ff7ee7679
Signed-off-by: Paweł Szewczyk <p.szewczyk@samsung.com>
tests/libhusb-test.c
tests/libusb-wrap.c

index 7abf9defd602d403f49126e36ba1bc212081b9ab..19a1ed10e7a0fd2998ed858aab6bde32c262055f 100644 (file)
@@ -743,6 +743,188 @@ static void test_config_descriptor(void **state)
        libhusb_free_config_descriptor(config);
 }
 
+static void transfer_cb(int status, unsigned char *buffer, int len, void *user_data)
+{
+       fail_msg("This function should never be called directly, libusb does it for us");
+}
+
+static void init_transfer(struct libusb_transfer *lusb_transfer,
+               struct libhusb_transfer **transfer, libusb_device_handle *handle)
+{
+       int ret;
+       struct libusb_transfer *ret_transfer;
+
+       ret_transfer = malloc(sizeof(struct libusb_transfer));
+
+       expect_value(libusb_alloc_transfer, iso_packets, 0);
+       will_return(libusb_alloc_transfer, ret_transfer);
+       ret = libhusb_create_transfer(transfer, 0);
+       assert_return_code(ret, 0);
+
+       lusb_transfer->endpoint = rand();
+       lusb_transfer->length = rand();
+       lusb_transfer->timeout = rand();
+       lusb_transfer->dev_handle = handle;
+       lusb_transfer->status = 0;
+       lusb_transfer->actual_length = rand();
+       lusb_transfer->num_iso_packets = 0;
+}
+
+static void test_fill_interrupt_transfer(void **state)
+{
+       struct libusb_transfer lusb_transfer;
+       libhusb_transfer *transfer;
+       libhusb_device_handle *dev_handle;
+
+       dev_handle = (libhusb_device_handle *)(*state);
+
+       init_transfer(&lusb_transfer, &transfer, dev_handle->lusb_dev_handle);
+
+       /* libusb fill functions are inline, we don't mock them, just check the result */
+       libhusb_fill_interrupt_transfer(transfer, dev_handle, transfer_cb, lusb_transfer.endpoint,
+               lusb_transfer.buffer, lusb_transfer.length, NULL, lusb_transfer.timeout);
+       assert_ptr_equal(transfer->lusb_transfer->dev_handle, dev_handle->lusb_dev_handle);
+       assert_int_equal(transfer->lusb_transfer->endpoint, lusb_transfer.endpoint);
+       assert_int_equal(transfer->lusb_transfer->length, lusb_transfer.length);
+       assert_int_equal(transfer->lusb_transfer->timeout, lusb_transfer.timeout);
+       assert_int_equal(transfer->lusb_transfer->type, LIBUSB_TRANSFER_TYPE_INTERRUPT);
+}
+
+static void test_fill_bulk_transfer(void **state)
+{
+       struct libusb_transfer lusb_transfer;
+       libhusb_transfer *transfer;
+       libhusb_device_handle *dev_handle;
+
+       dev_handle = (libhusb_device_handle *)(*state);
+
+       init_transfer(&lusb_transfer, &transfer, dev_handle->lusb_dev_handle);
+
+       /* libusb fill functions are inline, we don't mock them, just check the result */
+       libhusb_fill_bulk_transfer(transfer, dev_handle, transfer_cb, lusb_transfer.endpoint,
+                       lusb_transfer.buffer, lusb_transfer.length, NULL, lusb_transfer.timeout);
+       assert_ptr_equal(transfer->lusb_transfer->dev_handle, dev_handle->lusb_dev_handle);
+       assert_int_equal(transfer->lusb_transfer->endpoint, lusb_transfer.endpoint);
+       assert_int_equal(transfer->lusb_transfer->length, lusb_transfer.length);
+       assert_int_equal(transfer->lusb_transfer->timeout, lusb_transfer.timeout);
+       assert_int_equal(transfer->lusb_transfer->type, LIBUSB_TRANSFER_TYPE_BULK);
+}
+
+static void test_fill_control_transfer(void **state)
+{
+       libhusb_transfer *transfer;
+       libhusb_device_handle *dev_handle;
+       struct libusb_transfer lusb_transfer;
+       int timeout;
+       uint8_t bmRequestType, bRequest;
+       uint16_t wValue, wIndex, wLength;
+       char buffer[16];
+       int ret;
+
+       dev_handle = (libhusb_device_handle *)(*state);
+
+       expect_value(libusb_alloc_transfer, iso_packets, 0);
+       will_return(libusb_alloc_transfer, &lusb_transfer);
+       ret = libhusb_create_transfer(&transfer, 0);
+       assert_return_code(ret, 0);
+
+       timeout = rand();
+       bmRequestType = rand();
+       bRequest = rand();
+       wValue = rand();
+       wIndex = rand();
+       wLength = rand();
+
+       libhusb_fill_control_setup(buffer, bmRequestType, bRequest, wValue, wIndex, wLength);
+       libhusb_fill_control_transfer(transfer, dev_handle, transfer_cb, buffer, NULL, timeout);
+
+       assert_ptr_equal(transfer->lusb_transfer->dev_handle, dev_handle->lusb_dev_handle);
+       assert_ptr_equal(transfer->lusb_transfer->buffer, buffer);
+       assert_int_equal(transfer->lusb_transfer->length, wLength + 8);
+       assert_int_equal(transfer->lusb_transfer->timeout, timeout);
+       assert_int_equal(transfer->lusb_transfer->type, LIBUSB_TRANSFER_TYPE_CONTROL);
+}
+
+static void test_destroy_transfer(void **state)
+{
+       libhusb_device_handle *dev_handle;
+       libhusb_transfer *transfer = NULL;
+       struct libusb_transfer lusb_transfer;
+       int ret;
+
+       dev_handle = (libhusb_device_handle *)(*state);
+
+       expect_value(libusb_alloc_transfer, iso_packets, 0);
+       will_return(libusb_alloc_transfer, &lusb_transfer);
+       ret = libhusb_create_transfer(&transfer, 0);
+
+       expect_value(libusb_free_transfer, transfer, &lusb_transfer);
+       libhusb_destroy_transfer(transfer);
+}
+
+static void test_submit_transfer(void **state)
+{
+       libhusb_device_handle *dev_handle = NULL;
+       libhusb_transfer *transfer= NULL;
+       struct libusb_transfer lusb_transfer;
+       int ret;
+
+       dev_handle = (libhusb_device_handle *)(*state);
+
+       expect_any(libusb_alloc_transfer, iso_packets);
+       will_return(libusb_alloc_transfer, &lusb_transfer);
+       ret = libhusb_create_transfer(&transfer, 0);
+
+       expect_value(libusb_submit_transfer, transfer, &lusb_transfer);
+       will_return(libusb_submit_transfer, 0);
+       ret = libhusb_submit_transfer(transfer);
+       assert_return_code(ret, 0);
+
+       expect_any(libusb_free_transfer, transfer);
+       libhusb_destroy_transfer(transfer);
+}
+
+static void test_cancel_transfer(void **state)
+{
+       libhusb_device_handle *dev_handle = NULL;
+       libhusb_transfer *transfer= NULL;
+       struct libusb_transfer lusb_transfer;
+       int ret;
+
+       dev_handle = (libhusb_device_handle *)(*state);
+
+       expect_any(libusb_alloc_transfer, iso_packets);
+       will_return(libusb_alloc_transfer, &lusb_transfer);
+       ret = libhusb_create_transfer(&transfer, 0);
+
+       expect_any(libusb_submit_transfer, transfer);
+       will_return(libusb_submit_transfer, 0);
+       ret = libhusb_submit_transfer(transfer);
+
+       expect_value(libusb_cancel_transfer, transfer, &lusb_transfer);
+       will_return(libusb_cancel_transfer, 0);
+       ret = libhusb_cancel_transfer(transfer);
+       assert_return_code(ret, 0);
+
+       expect_any(libusb_free_transfer, transfer);
+       libhusb_destroy_transfer(transfer);
+}
+
+static void test_handle_events(void **state)
+{
+       libhusb_context *ctx;
+       int completed;
+       int ret;
+
+       ctx = (libhusb_device_handle *)(*state);
+
+       expect_value(libusb_handle_events_completed, ctx, ctx->lusb_ctx);
+       expect_value(libusb_handle_events_completed, completed, &completed);
+       will_return(libusb_handle_events_completed, 0);
+       ret = libhusb_handle_events(ctx, &completed);
+       assert_return_code(ret, 0);
+}
+
 /* Custom macro for defining test with given name and fixed teardown function */
 #define HUSB_TEST(func, setup, teardown) \
        cmocka_unit_test_setup_teardown(func, setup, teardown)
@@ -793,6 +975,13 @@ static struct CMUnitTest tests[] = {
                HUSB_TEST_DEV_HANDLE(test_attach_kernel_driver),
                HUSB_TEST_DEV_HANDLE(test_get_string_descriptor_ascii),
                HUSB_TEST_DEVICE(test_config_descriptor),
+               HUSB_TEST_DEV_HANDLE(test_submit_transfer),
+               HUSB_TEST_DEV_HANDLE(test_destroy_transfer),
+               HUSB_TEST_DEV_HANDLE(test_cancel_transfer),
+               HUSB_TEST_DEV_HANDLE(test_fill_bulk_transfer),
+               HUSB_TEST_DEV_HANDLE(test_fill_interrupt_transfer),
+               HUSB_TEST_DEV_HANDLE(test_fill_control_transfer),
+               HUSB_TEST_CTX(test_handle_events),
 };
 
 
index 79e602632502bf34935fd188847c3f63a6986a7b..615a0e71f9ec17456a6420b9f9bcc9ffae20e54a 100644 (file)
@@ -387,3 +387,33 @@ int libusb_get_string_descriptor_ascii(libusb_device_handle *dev,
        strcpy (data, mock_ptr_type(unsigned char *));
        return mock_type(int);
 }
+
+struct libusb_transfer *libusb_alloc_transfer(int iso_packets)
+{
+       check_expected(iso_packets);
+       return mock_ptr_type(struct libusb_transfer *);
+}
+
+void libusb_free_transfer(struct libusb_transfer *transfer)
+{
+       check_expected(transfer);
+}
+
+int libusb_submit_transfer(struct libusb_transfer *transfer)
+{
+       check_expected(transfer);
+       return mock_type(int);
+}
+
+int libusb_cancel_transfer(struct libusb_transfer *transfer)
+{
+       check_expected(transfer);
+       return mock_type(int);
+}
+
+int libusb_handle_events_completed(libusb_context *ctx, int *completed)
+{
+       check_expected(ctx);
+       check_expected(completed);
+       return mock_type(int);
+}