1*86b64dcbSAndroid Build Coastguard Worker /*
2*86b64dcbSAndroid Build Coastguard Worker * libusb stress test program to perform simple stress tests
3*86b64dcbSAndroid Build Coastguard Worker * Copyright © 2012 Toby Gray <[email protected]>
4*86b64dcbSAndroid Build Coastguard Worker *
5*86b64dcbSAndroid Build Coastguard Worker * This library is free software; you can redistribute it and/or
6*86b64dcbSAndroid Build Coastguard Worker * modify it under the terms of the GNU Lesser General Public
7*86b64dcbSAndroid Build Coastguard Worker * License as published by the Free Software Foundation; either
8*86b64dcbSAndroid Build Coastguard Worker * version 2.1 of the License, or (at your option) any later version.
9*86b64dcbSAndroid Build Coastguard Worker *
10*86b64dcbSAndroid Build Coastguard Worker * This library is distributed in the hope that it will be useful,
11*86b64dcbSAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*86b64dcbSAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13*86b64dcbSAndroid Build Coastguard Worker * Lesser General Public License for more details.
14*86b64dcbSAndroid Build Coastguard Worker *
15*86b64dcbSAndroid Build Coastguard Worker * You should have received a copy of the GNU Lesser General Public
16*86b64dcbSAndroid Build Coastguard Worker * License along with this library; if not, write to the Free Software
17*86b64dcbSAndroid Build Coastguard Worker * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18*86b64dcbSAndroid Build Coastguard Worker */
19*86b64dcbSAndroid Build Coastguard Worker
20*86b64dcbSAndroid Build Coastguard Worker #include <config.h>
21*86b64dcbSAndroid Build Coastguard Worker
22*86b64dcbSAndroid Build Coastguard Worker #include <string.h>
23*86b64dcbSAndroid Build Coastguard Worker
24*86b64dcbSAndroid Build Coastguard Worker #include "libusb.h"
25*86b64dcbSAndroid Build Coastguard Worker #include "libusb_testlib.h"
26*86b64dcbSAndroid Build Coastguard Worker
27*86b64dcbSAndroid Build Coastguard Worker /** Test that creates and destroys a single concurrent context
28*86b64dcbSAndroid Build Coastguard Worker * 10000 times. */
test_init_and_exit(void)29*86b64dcbSAndroid Build Coastguard Worker static libusb_testlib_result test_init_and_exit(void)
30*86b64dcbSAndroid Build Coastguard Worker {
31*86b64dcbSAndroid Build Coastguard Worker for (int i = 0; i < 10000; ++i) {
32*86b64dcbSAndroid Build Coastguard Worker libusb_context *ctx = NULL;
33*86b64dcbSAndroid Build Coastguard Worker int r;
34*86b64dcbSAndroid Build Coastguard Worker
35*86b64dcbSAndroid Build Coastguard Worker r = libusb_init_context(&ctx, /*options=*/NULL, /*num_options=*/0);
36*86b64dcbSAndroid Build Coastguard Worker if (r != LIBUSB_SUCCESS) {
37*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf(
38*86b64dcbSAndroid Build Coastguard Worker "Failed to init libusb on iteration %d: %d",
39*86b64dcbSAndroid Build Coastguard Worker i, r);
40*86b64dcbSAndroid Build Coastguard Worker return TEST_STATUS_FAILURE;
41*86b64dcbSAndroid Build Coastguard Worker }
42*86b64dcbSAndroid Build Coastguard Worker libusb_exit(ctx);
43*86b64dcbSAndroid Build Coastguard Worker }
44*86b64dcbSAndroid Build Coastguard Worker
45*86b64dcbSAndroid Build Coastguard Worker return TEST_STATUS_SUCCESS;
46*86b64dcbSAndroid Build Coastguard Worker }
47*86b64dcbSAndroid Build Coastguard Worker
48*86b64dcbSAndroid Build Coastguard Worker /** Tests that devices can be listed 1000 times. */
test_get_device_list(void)49*86b64dcbSAndroid Build Coastguard Worker static libusb_testlib_result test_get_device_list(void)
50*86b64dcbSAndroid Build Coastguard Worker {
51*86b64dcbSAndroid Build Coastguard Worker libusb_context *ctx;
52*86b64dcbSAndroid Build Coastguard Worker int r;
53*86b64dcbSAndroid Build Coastguard Worker
54*86b64dcbSAndroid Build Coastguard Worker r = libusb_init_context(&ctx, /*options=*/NULL, /*num_options=*/0);
55*86b64dcbSAndroid Build Coastguard Worker if (r != LIBUSB_SUCCESS) {
56*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf("Failed to init libusb: %d", r);
57*86b64dcbSAndroid Build Coastguard Worker return TEST_STATUS_FAILURE;
58*86b64dcbSAndroid Build Coastguard Worker }
59*86b64dcbSAndroid Build Coastguard Worker
60*86b64dcbSAndroid Build Coastguard Worker for (int i = 0; i < 1000; ++i) {
61*86b64dcbSAndroid Build Coastguard Worker libusb_device **device_list = NULL;
62*86b64dcbSAndroid Build Coastguard Worker ssize_t list_size = libusb_get_device_list(ctx, &device_list);
63*86b64dcbSAndroid Build Coastguard Worker if (list_size < 0 || !device_list) {
64*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf(
65*86b64dcbSAndroid Build Coastguard Worker "Failed to get device list on iteration %d: %ld (%p)",
66*86b64dcbSAndroid Build Coastguard Worker i, (long) -list_size, (void *) device_list);
67*86b64dcbSAndroid Build Coastguard Worker libusb_exit(ctx);
68*86b64dcbSAndroid Build Coastguard Worker return TEST_STATUS_FAILURE;
69*86b64dcbSAndroid Build Coastguard Worker }
70*86b64dcbSAndroid Build Coastguard Worker libusb_free_device_list(device_list, 1);
71*86b64dcbSAndroid Build Coastguard Worker }
72*86b64dcbSAndroid Build Coastguard Worker
73*86b64dcbSAndroid Build Coastguard Worker libusb_exit(ctx);
74*86b64dcbSAndroid Build Coastguard Worker return TEST_STATUS_SUCCESS;
75*86b64dcbSAndroid Build Coastguard Worker }
76*86b64dcbSAndroid Build Coastguard Worker
77*86b64dcbSAndroid Build Coastguard Worker /** Tests that 100 concurrent device lists can be open at a time. */
test_many_device_lists(void)78*86b64dcbSAndroid Build Coastguard Worker static libusb_testlib_result test_many_device_lists(void)
79*86b64dcbSAndroid Build Coastguard Worker {
80*86b64dcbSAndroid Build Coastguard Worker #define LIST_COUNT 100
81*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_result result = TEST_STATUS_SUCCESS;
82*86b64dcbSAndroid Build Coastguard Worker libusb_context *ctx = NULL;
83*86b64dcbSAndroid Build Coastguard Worker libusb_device **device_lists[LIST_COUNT];
84*86b64dcbSAndroid Build Coastguard Worker int r;
85*86b64dcbSAndroid Build Coastguard Worker
86*86b64dcbSAndroid Build Coastguard Worker r = libusb_init_context(&ctx, /*options=*/NULL, /*num_options=*/0);
87*86b64dcbSAndroid Build Coastguard Worker if (r != LIBUSB_SUCCESS) {
88*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf("Failed to init libusb: %d", r);
89*86b64dcbSAndroid Build Coastguard Worker return TEST_STATUS_FAILURE;
90*86b64dcbSAndroid Build Coastguard Worker }
91*86b64dcbSAndroid Build Coastguard Worker
92*86b64dcbSAndroid Build Coastguard Worker memset(device_lists, 0, sizeof(device_lists));
93*86b64dcbSAndroid Build Coastguard Worker
94*86b64dcbSAndroid Build Coastguard Worker /* Create the 100 device lists. */
95*86b64dcbSAndroid Build Coastguard Worker for (int i = 0; i < LIST_COUNT; ++i) {
96*86b64dcbSAndroid Build Coastguard Worker ssize_t list_size = libusb_get_device_list(ctx, &device_lists[i]);
97*86b64dcbSAndroid Build Coastguard Worker if (list_size < 0 || !device_lists[i]) {
98*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf(
99*86b64dcbSAndroid Build Coastguard Worker "Failed to get device list on iteration %d: %ld (%p)",
100*86b64dcbSAndroid Build Coastguard Worker i, (long) -list_size, (void *) device_lists[i]);
101*86b64dcbSAndroid Build Coastguard Worker result = TEST_STATUS_FAILURE;
102*86b64dcbSAndroid Build Coastguard Worker break;
103*86b64dcbSAndroid Build Coastguard Worker }
104*86b64dcbSAndroid Build Coastguard Worker }
105*86b64dcbSAndroid Build Coastguard Worker
106*86b64dcbSAndroid Build Coastguard Worker /* Destroy the 100 device lists. */
107*86b64dcbSAndroid Build Coastguard Worker for (int i = 0; i < LIST_COUNT; ++i) {
108*86b64dcbSAndroid Build Coastguard Worker if (device_lists[i])
109*86b64dcbSAndroid Build Coastguard Worker libusb_free_device_list(device_lists[i], 1);
110*86b64dcbSAndroid Build Coastguard Worker }
111*86b64dcbSAndroid Build Coastguard Worker
112*86b64dcbSAndroid Build Coastguard Worker libusb_exit(ctx);
113*86b64dcbSAndroid Build Coastguard Worker return result;
114*86b64dcbSAndroid Build Coastguard Worker #undef LIST_COUNT
115*86b64dcbSAndroid Build Coastguard Worker }
116*86b64dcbSAndroid Build Coastguard Worker
117*86b64dcbSAndroid Build Coastguard Worker /** Tests that the default context (used for various things including
118*86b64dcbSAndroid Build Coastguard Worker * logging) works correctly when the first context created in a
119*86b64dcbSAndroid Build Coastguard Worker * process is destroyed. */
test_default_context_change(void)120*86b64dcbSAndroid Build Coastguard Worker static libusb_testlib_result test_default_context_change(void)
121*86b64dcbSAndroid Build Coastguard Worker {
122*86b64dcbSAndroid Build Coastguard Worker for (int i = 0; i < 100; ++i) {
123*86b64dcbSAndroid Build Coastguard Worker libusb_context *ctx = NULL;
124*86b64dcbSAndroid Build Coastguard Worker int r;
125*86b64dcbSAndroid Build Coastguard Worker
126*86b64dcbSAndroid Build Coastguard Worker
127*86b64dcbSAndroid Build Coastguard Worker /* Enable debug output on new context, to be sure to use the context */
128*86b64dcbSAndroid Build Coastguard Worker struct libusb_init_option options[] = {
129*86b64dcbSAndroid Build Coastguard Worker {
130*86b64dcbSAndroid Build Coastguard Worker .option = LIBUSB_OPTION_LOG_LEVEL,
131*86b64dcbSAndroid Build Coastguard Worker .value = {.ival = LIBUSB_LOG_LEVEL_DEBUG},
132*86b64dcbSAndroid Build Coastguard Worker },
133*86b64dcbSAndroid Build Coastguard Worker };
134*86b64dcbSAndroid Build Coastguard Worker int num_options = 1;
135*86b64dcbSAndroid Build Coastguard Worker
136*86b64dcbSAndroid Build Coastguard Worker /* First create a new context */
137*86b64dcbSAndroid Build Coastguard Worker r = libusb_init_context(&ctx, options, num_options);
138*86b64dcbSAndroid Build Coastguard Worker if (r != LIBUSB_SUCCESS) {
139*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf("Failed to init libusb: %d", r);
140*86b64dcbSAndroid Build Coastguard Worker return TEST_STATUS_FAILURE;
141*86b64dcbSAndroid Build Coastguard Worker }
142*86b64dcbSAndroid Build Coastguard Worker
143*86b64dcbSAndroid Build Coastguard Worker /* Now create a reference to the default context */
144*86b64dcbSAndroid Build Coastguard Worker r = libusb_init_context(/*ctx=*/NULL, options, num_options);
145*86b64dcbSAndroid Build Coastguard Worker if (r != LIBUSB_SUCCESS) {
146*86b64dcbSAndroid Build Coastguard Worker libusb_testlib_logf("Failed to init libusb: %d", r);
147*86b64dcbSAndroid Build Coastguard Worker libusb_exit(ctx);
148*86b64dcbSAndroid Build Coastguard Worker return TEST_STATUS_FAILURE;
149*86b64dcbSAndroid Build Coastguard Worker }
150*86b64dcbSAndroid Build Coastguard Worker
151*86b64dcbSAndroid Build Coastguard Worker /* Destroy the first context */
152*86b64dcbSAndroid Build Coastguard Worker libusb_exit(ctx);
153*86b64dcbSAndroid Build Coastguard Worker /* Destroy the default context */
154*86b64dcbSAndroid Build Coastguard Worker libusb_exit(NULL);
155*86b64dcbSAndroid Build Coastguard Worker }
156*86b64dcbSAndroid Build Coastguard Worker
157*86b64dcbSAndroid Build Coastguard Worker return TEST_STATUS_SUCCESS;
158*86b64dcbSAndroid Build Coastguard Worker }
159*86b64dcbSAndroid Build Coastguard Worker
160*86b64dcbSAndroid Build Coastguard Worker /* Fill in the list of tests. */
161*86b64dcbSAndroid Build Coastguard Worker static const libusb_testlib_test tests[] = {
162*86b64dcbSAndroid Build Coastguard Worker { "init_and_exit", &test_init_and_exit },
163*86b64dcbSAndroid Build Coastguard Worker { "get_device_list", &test_get_device_list },
164*86b64dcbSAndroid Build Coastguard Worker { "many_device_lists", &test_many_device_lists },
165*86b64dcbSAndroid Build Coastguard Worker { "default_context_change", &test_default_context_change },
166*86b64dcbSAndroid Build Coastguard Worker LIBUSB_NULL_TEST
167*86b64dcbSAndroid Build Coastguard Worker };
168*86b64dcbSAndroid Build Coastguard Worker
main(int argc,char * argv[])169*86b64dcbSAndroid Build Coastguard Worker int main(int argc, char *argv[])
170*86b64dcbSAndroid Build Coastguard Worker {
171*86b64dcbSAndroid Build Coastguard Worker return libusb_testlib_run_tests(argc, argv, tests);
172*86b64dcbSAndroid Build Coastguard Worker }
173