VirtualBox

source: vbox/trunk/src/VBox/HostServices/SharedClipboard/testcase/tstClipboardTransfers.cpp@ 99534

Last change on this file since 99534 was 98103, checked in by vboxsync, 2 years ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.3 KB
Line 
1/* $Id: tstClipboardTransfers.cpp 98103 2023-01-17 14:15:46Z vboxsync $ */
2/** @file
3 * Shared Clipboard transfers test case.
4 */
5
6/*
7 * Copyright (C) 2019-2023 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#include "../VBoxSharedClipboardSvc-internal.h"
29
30#include <VBox/HostServices/VBoxClipboardSvc.h>
31
32#include <iprt/assert.h>
33#include <iprt/dir.h>
34#include <iprt/file.h>
35#include <iprt/path.h>
36#include <iprt/string.h>
37#include <iprt/test.h>
38
39
40static int testCreateTempDir(RTTEST hTest, const char *pszTestcase, char *pszTempDir, size_t cbTempDir)
41{
42 char szTempDir[RTPATH_MAX];
43 int rc = RTPathTemp(szTempDir, sizeof(szTempDir));
44 RTTESTI_CHECK_RC_RET(rc, VINF_SUCCESS, rc);
45
46 rc = RTPathAppend(szTempDir, sizeof(szTempDir), "tstClipboardTransfers");
47 RTTESTI_CHECK_RC_RET(rc, VINF_SUCCESS, rc);
48
49 rc = RTDirCreate(szTempDir, 0700, 0);
50 if (rc == VERR_ALREADY_EXISTS)
51 rc = VINF_SUCCESS;
52 RTTESTI_CHECK_RC_RET(rc, VINF_SUCCESS, rc);
53
54 rc = RTPathAppend(szTempDir, sizeof(szTempDir), "XXXXX");
55 RTTESTI_CHECK_RC_RET(rc, VINF_SUCCESS, rc);
56
57 rc = RTDirCreateTemp(szTempDir, 0700);
58 RTTESTI_CHECK_RC_RET(rc, VINF_SUCCESS, rc);
59
60 rc = RTPathJoin(pszTempDir, cbTempDir, szTempDir, pszTestcase);
61 RTTESTI_CHECK_RC_RET(rc, VINF_SUCCESS, rc);
62
63 RTTestPrintf(hTest, RTTESTLVL_DEBUG, "Created temporary directory: %s\n", pszTempDir);
64
65 return rc;
66}
67
68static int testRemoveTempDir(RTTEST hTest)
69{
70 char szTempDir[RTPATH_MAX];
71 int rc = RTPathTemp(szTempDir, sizeof(szTempDir));
72 RTTESTI_CHECK_RC_RET(rc, VINF_SUCCESS, rc);
73
74 rc = RTPathAppend(szTempDir, sizeof(szTempDir), "tstClipboardTransfers");
75 RTTESTI_CHECK_RC_RET(rc, VINF_SUCCESS, rc);
76
77 rc = RTDirRemoveRecursive(szTempDir, RTDIRRMREC_F_CONTENT_AND_DIR);
78 RTTESTI_CHECK_RC_RET(rc, VINF_SUCCESS, rc);
79
80 RTTestPrintf(hTest, RTTESTLVL_DEBUG, "Removed temporary directory: %s\n", szTempDir);
81
82 return rc;
83}
84
85static int testCreateDir(RTTEST hTest, const char *pszPathToCreate)
86{
87 RTTestPrintf(hTest, RTTESTLVL_DEBUG, "Creating directory: %s\n", pszPathToCreate);
88
89 int rc = RTDirCreateFullPath(pszPathToCreate, 0700);
90 if (rc == VERR_ALREADY_EXISTS)
91 rc = VINF_SUCCESS;
92 RTTESTI_CHECK_RC_RET(rc, VINF_SUCCESS, rc);
93
94 return rc;
95}
96
97static int testCreateFile(RTTEST hTest, const char *pszTempDir, const char *pszFileName, uint32_t fOpen, size_t cbSize,
98 char **ppszFilePathAbs)
99{
100 char szFilePath[RTPATH_MAX];
101
102 int rc = RTStrCopy(szFilePath, sizeof(szFilePath), pszTempDir);
103 RTTESTI_CHECK_RC_OK_RET(rc, rc);
104
105 rc = RTPathAppend(szFilePath, sizeof(szFilePath), pszFileName);
106 RTTESTI_CHECK_RC_OK_RET(rc, rc);
107
108 char *pszDirToCreate = RTStrDup(szFilePath);
109 RTTESTI_CHECK_RET(pszDirToCreate, VERR_NO_MEMORY);
110
111 RTPathStripFilename(pszDirToCreate);
112
113 rc = testCreateDir(hTest, pszDirToCreate);
114 RTTESTI_CHECK_RC_OK_RET(rc, rc);
115
116 RTStrFree(pszDirToCreate);
117 pszDirToCreate = NULL;
118
119 if (!fOpen)
120 fOpen = RTFILE_O_OPEN_CREATE | RTFILE_O_WRITE | RTFILE_O_DENY_NONE;
121
122 RTTestPrintf(hTest, RTTESTLVL_DEBUG, "Creating file: %s\n", szFilePath);
123
124 RTFILE hFile;
125 rc = RTFileOpen(&hFile, szFilePath, fOpen);
126 if (RT_SUCCESS(rc))
127 {
128 if (cbSize)
129 {
130 /** @todo Fill in some random stuff. */
131 }
132
133 rc = RTFileClose(hFile);
134 RTTESTI_CHECK_RC_RET(rc, VINF_SUCCESS, rc);
135 }
136
137 if (ppszFilePathAbs)
138 *ppszFilePathAbs = RTStrDup(szFilePath);
139
140 return rc;
141}
142
143typedef struct TESTTRANSFERROOTENTRY
144{
145 TESTTRANSFERROOTENTRY(const RTCString &a_strPath)
146 : strPath(a_strPath) { }
147
148 RTCString strPath;
149} TESTTRANSFERROOTENTRY;
150
151static int testAddRootEntry(RTTEST hTest, const char *pszTempDir,
152 const TESTTRANSFERROOTENTRY &rootEntry, char **ppszRoots)
153{
154 char *pszRoots = NULL;
155
156 const char *pszPath = rootEntry.strPath.c_str();
157
158 char *pszPathAbs;
159 int rc = testCreateFile(hTest, pszTempDir, pszPath, 0, 0, &pszPathAbs);
160 RTTESTI_CHECK_RC_OK_RET(rc, rc);
161
162 rc = RTStrAAppend(&pszRoots, pszPathAbs);
163 RTTESTI_CHECK_RC_OK(rc);
164
165 rc = RTStrAAppend(&pszRoots, "\r\n");
166 RTTESTI_CHECK_RC_OK(rc);
167
168 RTStrFree(pszPathAbs);
169
170 *ppszRoots = pszRoots;
171
172 return rc;
173}
174
175static int testAddRootEntries(RTTEST hTest, const char *pszTempDir,
176 RTCList<TESTTRANSFERROOTENTRY> &lstBase, RTCList<TESTTRANSFERROOTENTRY> lstToExtend,
177 char **ppszRoots)
178{
179 int rc = VINF_SUCCESS;
180
181 char *pszRoots = NULL;
182
183 for (size_t i = 0; i < lstBase.size(); ++i)
184 {
185 char *pszEntry = NULL;
186 rc = testAddRootEntry(hTest, pszTempDir, lstBase.at(i), &pszEntry);
187 RTTESTI_CHECK_RC_OK_BREAK(rc);
188 rc = RTStrAAppend(&pszRoots, pszEntry);
189 RTTESTI_CHECK_RC_OK_BREAK(rc);
190 RTStrFree(pszEntry);
191 }
192
193 for (size_t i = 0; i < lstToExtend.size(); ++i)
194 {
195 char *pszEntry = NULL;
196 rc = testAddRootEntry(hTest, pszTempDir, lstToExtend.at(i), &pszEntry);
197 RTTESTI_CHECK_RC_OK_BREAK(rc);
198 rc = RTStrAAppend(&pszRoots, pszEntry);
199 RTTESTI_CHECK_RC_OK_BREAK(rc);
200 RTStrFree(pszEntry);
201 }
202
203 if (RT_SUCCESS(rc))
204 *ppszRoots = pszRoots;
205
206 return rc;
207}
208
209static void testTransferRootsSetSingle(RTTEST hTest,
210 RTCList<TESTTRANSFERROOTENTRY> &lstBase, RTCList<TESTTRANSFERROOTENTRY> lstToExtend,
211 int rcExpected)
212{
213 PSHCLTRANSFER pTransfer;
214 int rc = ShClTransferCreate(&pTransfer);
215 RTTESTI_CHECK_RC_OK(rc);
216
217 char szTestTransferRootsSetDir[RTPATH_MAX];
218 rc = testCreateTempDir(hTest, "testTransferRootsSet", szTestTransferRootsSetDir, sizeof(szTestTransferRootsSetDir));
219 RTTESTI_CHECK_RC_OK_RETV(rc);
220
221 /* This is the file we're trying to access (but not supposed to). */
222 rc = testCreateFile(hTest, szTestTransferRootsSetDir, "must-not-access-this", 0, 0, NULL);
223 RTTESTI_CHECK_RC_OK(rc);
224
225 char *pszRoots;
226 rc = testAddRootEntries(hTest, szTestTransferRootsSetDir, lstBase, lstToExtend, &pszRoots);
227 RTTESTI_CHECK_RC_OK_RETV(rc);
228
229 rc = ShClTransferRootsSet(pTransfer, pszRoots, strlen(pszRoots) + 1);
230 RTTESTI_CHECK_RC(rc, rcExpected);
231
232 RTStrFree(pszRoots);
233
234 rc = ShClTransferDestroy(pTransfer);
235 RTTESTI_CHECK_RC_OK(rc);
236}
237
238static void testTransferObjOpenSingle(RTTEST hTest,
239 RTCList<TESTTRANSFERROOTENTRY> &lstRoots, const char *pszObjPath, int rcExpected)
240{
241 RT_NOREF(hTest);
242
243 PSHCLTRANSFER pTransfer;
244 int rc = ShClTransferCreate(&pTransfer);
245 RTTESTI_CHECK_RC_OK(rc);
246
247 rc = ShClTransferInit(pTransfer, SHCLTRANSFERDIR_FROM_REMOTE, SHCLSOURCE_LOCAL);
248 RTTESTI_CHECK_RC_OK(rc);
249
250 char szTestTransferObjOpenDir[RTPATH_MAX];
251 rc = testCreateTempDir(hTest, "testTransferObjOpen", szTestTransferObjOpenDir, sizeof(szTestTransferObjOpenDir));
252 RTTESTI_CHECK_RC_OK_RETV(rc);
253
254 /* This is the file we're trying to access (but not supposed to). */
255 rc = testCreateFile(hTest, szTestTransferObjOpenDir, "file1.txt", 0, 0, NULL);
256 RTTESTI_CHECK_RC_OK(rc);
257
258 RTCList<TESTTRANSFERROOTENTRY> lstToExtendEmpty;
259
260 char *pszRoots;
261 rc = testAddRootEntries(hTest, szTestTransferObjOpenDir, lstRoots, lstToExtendEmpty, &pszRoots);
262 RTTESTI_CHECK_RC_OK_RETV(rc);
263
264 rc = ShClTransferRootsSet(pTransfer, pszRoots, strlen(pszRoots) + 1);
265 RTTESTI_CHECK_RC_OK(rc);
266
267 RTStrFree(pszRoots);
268
269 SHCLOBJOPENCREATEPARMS openCreateParms;
270 rc = ShClTransferObjOpenParmsInit(&openCreateParms);
271 RTTESTI_CHECK_RC_OK(rc);
272
273 rc = RTStrCopy(openCreateParms.pszPath, openCreateParms.cbPath, pszObjPath);
274 RTTESTI_CHECK_RC_OK(rc);
275
276 SHCLOBJHANDLE hObj;
277 rc = ShClTransferObjOpen(pTransfer, &openCreateParms, &hObj);
278 RTTESTI_CHECK_RC(rc, rcExpected);
279 if (RT_SUCCESS(rc))
280 {
281 rc = ShClTransferObjClose(pTransfer, hObj);
282 RTTESTI_CHECK_RC_OK(rc);
283 }
284
285 rc = ShClTransferDestroy(pTransfer);
286 RTTESTI_CHECK_RC_OK(rc);
287}
288
289static void testTransferBasics(RTTEST hTest)
290{
291 RT_NOREF(hTest);
292
293 RTTestISub("Testing transfer basics");
294
295 SHCLEVENTSOURCE Source;
296 int rc = ShClEventSourceCreate(&Source, 0);
297 RTTESTI_CHECK_RC_OK(rc);
298 rc = ShClEventSourceDestroy(&Source);
299 RTTESTI_CHECK_RC_OK(rc);
300 PSHCLTRANSFER pTransfer;
301 rc = ShClTransferCreate(&pTransfer);
302 RTTESTI_CHECK_RC_OK(rc);
303 rc = ShClTransferDestroy(pTransfer);
304 RTTESTI_CHECK_RC_OK(rc);
305}
306
307static void testTransferRootsSet(RTTEST hTest)
308{
309 RTTestISub("Testing setting transfer roots");
310
311 /* Define the (valid) transfer root set. */
312 RTCList<TESTTRANSFERROOTENTRY> lstBase;
313 lstBase.append(TESTTRANSFERROOTENTRY("my-transfer-1/file1.txt"));
314 lstBase.append(TESTTRANSFERROOTENTRY("my-transfer-1/dir1/file1.txt"));
315 lstBase.append(TESTTRANSFERROOTENTRY("my-transfer-1/dir1/sub1/file1.txt"));
316 lstBase.append(TESTTRANSFERROOTENTRY("my-transfer-1/dir2/file1.txt"));
317 lstBase.append(TESTTRANSFERROOTENTRY("my-transfer-1/dir2/sub1/file1.txt"));
318
319 RTCList<TESTTRANSFERROOTENTRY> lstBreakout;
320 testTransferRootsSetSingle(hTest, lstBase, lstBreakout, VINF_SUCCESS);
321
322 lstBreakout.clear();
323 lstBase.append(TESTTRANSFERROOTENTRY("../must-not-access-this"));
324 testTransferRootsSetSingle(hTest, lstBase, lstBreakout, VERR_INVALID_PARAMETER);
325
326 lstBreakout.clear();
327 lstBase.append(TESTTRANSFERROOTENTRY("does-not-exist/file1.txt"));
328 testTransferRootsSetSingle(hTest, lstBase, lstBreakout, VERR_INVALID_PARAMETER);
329
330 lstBreakout.clear();
331 lstBase.append(TESTTRANSFERROOTENTRY("my-transfer-1/../must-not-access-this"));
332 testTransferRootsSetSingle(hTest, lstBase, lstBreakout, VERR_INVALID_PARAMETER);
333
334 lstBreakout.clear();
335 lstBase.append(TESTTRANSFERROOTENTRY("my-transfer-1/./../must-not-access-this"));
336 testTransferRootsSetSingle(hTest, lstBase, lstBreakout, VERR_INVALID_PARAMETER);
337
338 lstBreakout.clear();
339 lstBase.append(TESTTRANSFERROOTENTRY("../does-not-exist"));
340 testTransferRootsSetSingle(hTest, lstBase, lstBreakout, VERR_INVALID_PARAMETER);
341}
342
343static void testTransferObjOpen(RTTEST hTest)
344{
345 RTTestISub("Testing setting transfer object open");
346
347 /* Define the (valid) transfer root set. */
348 RTCList<TESTTRANSFERROOTENTRY> lstRoots;
349 lstRoots.append(TESTTRANSFERROOTENTRY("my-transfer-1/file1.txt"));
350 lstRoots.append(TESTTRANSFERROOTENTRY("my-transfer-1/dir1/file1.txt"));
351 lstRoots.append(TESTTRANSFERROOTENTRY("my-transfer-1/dir1/sub1/file1.txt"));
352 lstRoots.append(TESTTRANSFERROOTENTRY("my-transfer-1/dir2/file1.txt"));
353 lstRoots.append(TESTTRANSFERROOTENTRY("my-transfer-1/dir2/sub1/file1.txt"));
354
355 testTransferObjOpenSingle(hTest, lstRoots, "file1.txt", VINF_SUCCESS);
356 testTransferObjOpenSingle(hTest, lstRoots, "does-not-exist.txt", VERR_PATH_NOT_FOUND);
357 testTransferObjOpenSingle(hTest, lstRoots, "dir1/does-not-exist.txt", VERR_PATH_NOT_FOUND);
358 testTransferObjOpenSingle(hTest, lstRoots, "../must-not-access-this.txt", VERR_INVALID_PARAMETER);
359 testTransferObjOpenSingle(hTest, lstRoots, "dir1/../../must-not-access-this.txt", VERR_INVALID_PARAMETER);
360}
361
362int main(int argc, char *argv[])
363{
364 /*
365 * Init the runtime, test and say hello.
366 */
367 const char *pcszExecName;
368 NOREF(argc);
369 pcszExecName = strrchr(argv[0], '/');
370 pcszExecName = pcszExecName ? pcszExecName + 1 : argv[0];
371 RTTEST hTest;
372 RTEXITCODE rcExit = RTTestInitAndCreate(pcszExecName, &hTest);
373 if (rcExit != RTEXITCODE_SUCCESS)
374 return rcExit;
375 RTTestBanner(hTest);
376
377 testTransferBasics(hTest);
378 testTransferRootsSet(hTest);
379 testTransferObjOpen(hTest);
380
381 int rc = testRemoveTempDir(hTest);
382 RTTESTI_CHECK_RC(rc, VINF_SUCCESS);
383
384 /*
385 * Summary
386 */
387 return RTTestSummaryAndDestroy(hTest);
388}
389
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