xref: /aosp_15_r20/external/libusb/tests/stress.c (revision 86b64dcb59b3a0b37502ecd56e119234366a6f7e)
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