VirtualBox

source: vbox/trunk/src/VBox/Main/testcase/tstUSBProxyLinux.cpp

Last change on this file was 106061, checked in by vboxsync, 3 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.9 KB
Line 
1/* $Id: tstUSBProxyLinux.cpp 106061 2024-09-16 14:03:52Z vboxsync $ */
2/** @file
3 * USBProxyBackendLinux test case.
4 */
5
6/*
7 * Copyright (C) 2011-2024 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * SPDX-License-Identifier: GPL-3.0-only
26 */
27
28
29/*********************************************************************************************************************************
30* Header Files *
31*********************************************************************************************************************************/
32
33#include "USBGetDevices.h"
34
35#include <VBox/err.h>
36#include <iprt/assert.h>
37#include <iprt/env.h>
38#include <iprt/string.h>
39#include <iprt/test.h>
40
41/*** BEGIN STUBS ***/
42
43static struct
44{
45 const char *pcszEnvUsb;
46 const char *pcszEnvUsbRoot;
47 const char *pcszDevicesRoot;
48 bool fDevicesAccessible;
49 const char *pcszUsbfsRoot;
50 bool fUsbfsAccessible;
51 int rcMethodInit;
52 const char *pcszDevicesRootExpected;
53 bool fUsingUsbfsExpected;
54 int rcExpected;
55} s_testEnvironment[] =
56{
57 /* "sysfs" and valid root in the environment */
58 { "sysfs", "/dev/bus/usb", "/dev/bus/usb", true, NULL, false, VINF_SUCCESS, "/dev/bus/usb", false, VINF_SUCCESS },
59 /* "sysfs" and bad root in the environment */
60 { "sysfs", "/dev/bus/usb", "/dev/vboxusb", false, "/proc/usb/bus", false, VINF_SUCCESS, "", true, VERR_NOT_FOUND },
61 /* "sysfs" and no root in the environment */
62 { "sysfs", NULL, "/dev/vboxusb", true, NULL, false, VINF_SUCCESS, "/dev/vboxusb", false, VINF_SUCCESS },
63 /* "usbfs" and valid root in the environment */
64 { "usbfs", "/dev/bus/usb", NULL, false, "/dev/bus/usb", true, VINF_SUCCESS, "/dev/bus/usb", true, VINF_SUCCESS },
65 /* "usbfs" and bad root in the environment */
66 { "usbfs", "/dev/bus/usb", "/dev/vboxusb", false, "/proc/usb/bus", false, VINF_SUCCESS, "", true, VERR_NOT_FOUND },
67 /* "usbfs" and no root in the environment */
68 { "usbfs", NULL, NULL, false, "/proc/bus/usb", true, VINF_SUCCESS, "/proc/bus/usb", true, VINF_SUCCESS },
69 /* invalid method in the environment, sysfs available */
70 { "invalid", "/dev/bus/usb", "/dev/vboxusb", true, NULL, false, VINF_SUCCESS, "/dev/vboxusb", false, VINF_SUCCESS },
71 /* invalid method in the environment, usbfs available */
72 { "invalid", "/dev/bus/usb", NULL, true, "/proc/bus/usb", true, VINF_SUCCESS, "/proc/bus/usb", true, VINF_SUCCESS },
73 /* invalid method in the environment, sysfs inaccessible */
74 { "invalid", "/dev/bus/usb", "/dev/vboxusb", false, NULL, false, VINF_SUCCESS, "", true, VERR_VUSB_USB_DEVICE_PERMISSION },
75 /* invalid method in the environment, usbfs inaccessible */
76 { "invalid", "/dev/bus/usb", NULL, false, "/proc/bus/usb", false, VINF_SUCCESS, "", true, VERR_VUSB_USBFS_PERMISSION },
77 /* No environment, sysfs and usbfs available but without access permissions. */
78 { NULL, NULL, "/dev/vboxusb", false, "/proc/bus/usb", false, VERR_NO_MEMORY, "", true, VERR_VUSB_USB_DEVICE_PERMISSION },
79 /* No environment, sysfs and usbfs available, access permissions for sysfs. */
80 { NULL, NULL, "/dev/vboxusb", true, "/proc/bus/usb", false, VINF_SUCCESS, "/dev/vboxusb", false, VINF_SUCCESS },
81 /* No environment, sysfs and usbfs available, access permissions for usbfs. */
82 { NULL, NULL, "/dev/vboxusb", false, "/proc/bus/usb", true, VINF_SUCCESS, "/proc/bus/usb", true, VINF_SUCCESS },
83 /* No environment, sysfs available but without access permissions. */
84 { NULL, NULL, "/dev/vboxusb", false, NULL, false, VERR_NO_MEMORY, "", true, VERR_VUSB_USB_DEVICE_PERMISSION },
85 /* No environment, usbfs available but without access permissions. */
86 { NULL, NULL, NULL, false, "/proc/bus/usb", false, VERR_NO_MEMORY, "", true, VERR_VUSB_USBFS_PERMISSION },
87};
88
89static void testInit(RTTEST hTest)
90{
91 RTTestSub(hTest, "Testing USBProxyLinuxChooseMethod");
92 for (unsigned i = 0; i < RT_ELEMENTS(s_testEnvironment); ++i)
93 {
94 bool fUsingUsbfs = true;
95 const char *pcszDevicesRoot = "";
96
97 TestUSBSetEnv(s_testEnvironment[i].pcszEnvUsb,
98 s_testEnvironment[i].pcszEnvUsbRoot);
99 TestUSBSetupInit(s_testEnvironment[i].pcszUsbfsRoot,
100 s_testEnvironment[i].fUsbfsAccessible,
101 s_testEnvironment[i].pcszDevicesRoot,
102 s_testEnvironment[i].fDevicesAccessible,
103 s_testEnvironment[i].rcMethodInit);
104 int rc = USBProxyLinuxChooseMethod(&fUsingUsbfs, &pcszDevicesRoot);
105 RTTESTI_CHECK_MSG(rc == s_testEnvironment[i].rcExpected,
106 ("rc=%Rrc (test index %i) instead of %Rrc!\n",
107 rc, i, s_testEnvironment[i].rcExpected));
108 RTTESTI_CHECK_MSG(!RTStrCmp(pcszDevicesRoot,
109 s_testEnvironment[i].pcszDevicesRootExpected),
110 ("testGetDevicesRoot() returned %s (test index %i) instead of %s!\n",
111 pcszDevicesRoot, i,
112 s_testEnvironment[i].pcszDevicesRootExpected));
113 RTTESTI_CHECK_MSG( fUsingUsbfs
114 == s_testEnvironment[i].fUsingUsbfsExpected,
115 ("testGetUsingUsbfs() returned %RTbool (test index %i) instead of %RTbool!\n",
116 fUsingUsbfs, i,
117 s_testEnvironment[i].fUsingUsbfsExpected));
118 }
119}
120
121static struct
122{
123 const char *pacszDeviceAddresses[16];
124 const char *pacszAccessibleFiles[16];
125 const char *pcszRoot;
126 bool fIsDeviceNodes;
127 bool fAvailableExpected;
128} s_testCheckDeviceRoot[] =
129{
130 /* /dev/vboxusb accessible -> device nodes method available */
131 { { NULL }, { "/dev/vboxusb" }, "/dev/vboxusb", true, true },
132 /* /dev/vboxusb present but not accessible -> device nodes method not
133 * available */
134 { { NULL }, { NULL }, "/dev/vboxusb", true, false },
135 /* /proc/bus/usb available but empty -> usbfs method available (we can't
136 * really check in this case) */
137 { { NULL }, { "/proc/bus/usb" }, "/proc/bus/usb", false, true },
138 /* /proc/bus/usb not available or not accessible -> usbfs method not available */
139 { { NULL }, { NULL }, "/proc/bus/usb", false, false },
140 /* /proc/bus/usb available, one inaccessible device -> usbfs method not
141 * available */
142 { { "/proc/bus/usb/001/001" }, { "/proc/bus/usb" }, "/proc/bus/usb", false, false },
143 /* /proc/bus/usb available, one device of two inaccessible -> usbfs method
144 * not available */
145 { { "/proc/bus/usb/001/001", "/proc/bus/usb/002/002" },
146 { "/proc/bus/usb", "/proc/bus/usb/001/001" }, "/proc/bus/usb", false, false },
147 /* /proc/bus/usb available, two accessible devices -> usbfs method
148 * available */
149 { { "/proc/bus/usb/001/001", "/proc/bus/usb/002/002" },
150 { "/proc/bus/usb", "/proc/bus/usb/001/001", "/proc/bus/usb/002/002" },
151 "/proc/bus/usb", false, true }
152};
153
154static void testCheckDeviceRoot(RTTEST hTest)
155{
156 RTTestSub(hTest, "Testing the USBProxyLinuxCheckDeviceRoot API");
157 for (unsigned i = 0; i < RT_ELEMENTS(s_testCheckDeviceRoot); ++i)
158 {
159 TestUSBSetAvailableUsbfsDevices(s_testCheckDeviceRoot[i]
160 .pacszDeviceAddresses);
161 TestUSBSetAccessibleFiles(s_testCheckDeviceRoot[i]
162 .pacszAccessibleFiles);
163 bool fAvailable = USBProxyLinuxCheckDeviceRoot
164 (s_testCheckDeviceRoot[i].pcszRoot,
165 s_testCheckDeviceRoot[i].fIsDeviceNodes);
166 RTTESTI_CHECK_MSG( fAvailable
167 == s_testCheckDeviceRoot[i].fAvailableExpected,
168 ("USBProxyLinuxCheckDeviceRoot() returned %RTbool (test index %i) instead of %RTbool!\n",
169 fAvailable, i,
170 s_testCheckDeviceRoot[i].fAvailableExpected));
171 }
172}
173
174int main(void)
175{
176 /*
177 * Init the runtime, test and say hello.
178 */
179 RTTEST hTest;
180 RTEXITCODE rcExit = RTTestInitAndCreate("tstUSBProxyLinux", &hTest);
181 if (rcExit != RTEXITCODE_SUCCESS)
182 return rcExit;
183 RTTestBanner(hTest);
184
185 /*
186 * Run the tests.
187 */
188 testInit(hTest);
189 testCheckDeviceRoot(hTest);
190
191 /*
192 * Summary
193 */
194 return RTTestSummaryAndDestroy(hTest);
195}
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette