- Timestamp:
- Apr 12, 2024 10:07:34 AM (10 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/GuestHost/SharedClipboard/testcase/tstClipboardHttpServer.cpp
r102917 r104309 66 66 static struct 67 67 { 68 /** File name to serve via HTTP server. */ 69 const char *pszFileName; 70 /** URL to use for downloading the file via RTHttp APIs. */ 68 /** File mode. Used for RTFS_TYPE_XXX only. */ 69 RTFMODE fMode; 70 /** Local path to serve via HTTP server. */ 71 const char *pszPath; 72 /** URL to use for downloading the file via RTHttp APIs. Has to be fully escaped. */ 71 73 const char *pszUrl; 72 74 /** File allocation size. … … 77 79 } g_aTests[] = 78 80 { 79 "file1.txt", "file1.txt", _64K, VINF_SUCCESS, 81 /* 82 * Files. 83 */ 84 RTFS_TYPE_FILE, "file1.txt", "file1.txt", _64K, VINF_SUCCESS, 80 85 /* Note: For RTHttpGetFile() the URL needs to be percent-encoded. */ 81 "file2 with spaces.txt", "file2%20with%20spaces.txt", _64K, VINF_SUCCESS,82 "bigfile.bin", "bigfile.bin", _512M, VINF_SUCCESS,83 "zerobytes", "zerobytes", 0, VINF_SUCCESS,84 "file\\with\\slashes", "file%5Cwith%5Cslashes", 42, VINF_SUCCESS,86 RTFS_TYPE_FILE, "file2 with spaces.txt", "file2%20with%20spaces.txt", _64K, VINF_SUCCESS, 87 RTFS_TYPE_FILE, "bigfile.bin", "bigfile.bin", _512M, VINF_SUCCESS, 88 RTFS_TYPE_FILE, "zerobytes", "zerobytes", 0, VINF_SUCCESS, 89 RTFS_TYPE_FILE, "file\\with\\slashes", "file%5Cwith%5Cslashes", 42, VINF_SUCCESS, 85 90 /* Korean encoding. */ 86 "VirtualBox가 크게 성공했습니다!", "VirtualBox%EA%B0%80%20%ED%81%AC%EA%B2%8C%20%EC%84%B1%EA%B3%B5%ED%96%88%EC%8A%B5%EB%8B%88%EB%8B%A4%21", 42, VINF_SUCCESS 91 RTFS_TYPE_FILE, "VirtualBox가 크게 성공했습니다!", "VirtualBox%EA%B0%80%20%ED%81%AC%EA%B2%8C%20%EC%84%B1%EA%B3%B5%ED%96%88%EC%8A%B5%EB%8B%88%EB%8B%A4%21", 42, VINF_SUCCESS, 92 /* 93 * Other stuff (not supported). 94 */ 95 RTFS_TYPE_DIRECTORY, "test-directory", "test-directory", 0, VERR_HTTP_NOT_SUPPORTED, 96 RTFS_TYPE_SYMLINK, "test-symlink", "test-symlink", 0, VERR_HTTP_NOT_SUPPORTED 87 97 }; 88 98 89 99 90 100 static void tstCreateTransferSingle(RTTEST hTest, PSHCLTRANSFERCTX pTransferCtx, PSHCLHTTPSERVER pSrv, 91 const char *psz File, PSHCLTXPROVIDER pProvider)101 const char *pszPath, PSHCLTXPROVIDER pProvider) 92 102 { 103 RTTestPrintf(hTest, RTTESTLVL_DEBUG, "tstCreateTransferSingle: pszPath=%s\n", pszPath); 104 93 105 PSHCLTRANSFER pTx; 94 106 RTTEST_CHECK_RC_OK(hTest, ShClTransferCreate(SHCLTRANSFERDIR_TO_REMOTE, SHCLSOURCE_LOCAL, NULL /* Callbacks */, &pTx)); 95 107 RTTEST_CHECK_RC_OK(hTest, ShClTransferSetProvider(pTx, pProvider)); 108 RTTEST_CHECK_RC_OK(hTest, ShClTransferRootsInitFromPath(pTx, pszPath)); 96 109 RTTEST_CHECK_RC_OK(hTest, ShClTransferInit(pTx)); 97 RTTEST_CHECK_RC_OK(hTest, ShClTransferRootsInitFromFile(pTx, pszFile));98 110 RTTEST_CHECK_RC_OK(hTest, ShClTransferCtxRegister(pTransferCtx, pTx, NULL)); 99 111 RTTEST_CHECK_RC_OK(hTest, ShClTransferHttpServerRegisterTransfer(pSrv, pTx)); … … 362 374 if (!g_fManual) 363 375 { 364 char sz FilePath[RTPATH_MAX];376 char szPath[RTPATH_MAX]; 365 377 for (size_t i = 0; i < RT_ELEMENTS(g_aTests); i++) 366 378 { 367 RTTEST_CHECK (hTest, RTStrPrintf(sz FilePath, sizeof(szFilePath), szTempDir));368 RTTEST_CHECK_RC_OK(hTest, RTPathAppend(sz FilePath, sizeof(szFilePath), g_aTests[i].pszFileName));379 RTTEST_CHECK (hTest, RTStrPrintf(szPath, sizeof(szPath), szTempDir)); 380 RTTEST_CHECK_RC_OK(hTest, RTPathAppend(szPath, sizeof(szPath), g_aTests[i].pszPath)); 369 381 370 382 size_t cbSize = g_aTests[i].cbSize == UINT64_MAX ? RTRandU32Ex(0, _256M) : g_aTests[i].cbSize; 371 383 372 RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "Random test file (%zu bytes): %s\n", cbSize, szFilePath); 373 374 RTFILE hFile; 375 rc = RTFileOpen(&hFile, szFilePath, RTFILE_O_WRITE | RTFILE_O_CREATE_REPLACE | RTFILE_O_DENY_NONE); 384 switch (g_aTests[i].fMode & RTFS_TYPE_MASK) 385 { 386 case RTFS_TYPE_FILE: 387 { 388 RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "Random test file (%zu bytes): %s\n", cbSize, szPath); 389 390 RTFILE hFile; 391 rc = RTFileOpen(&hFile, szPath, RTFILE_O_WRITE | RTFILE_O_CREATE_REPLACE | RTFILE_O_DENY_NONE); 392 if (RT_SUCCESS(rc)) 393 { 394 uint8_t abBuf[_64K]; RTRandBytes(abBuf, sizeof(abBuf)); 395 396 while (cbSize > 0) 397 { 398 size_t cbToWrite = sizeof(abBuf); 399 if (cbToWrite > cbSize) 400 cbToWrite = cbSize; 401 rc = RTFileWrite(hFile, abBuf, cbToWrite, NULL); 402 if (RT_FAILURE(rc)) 403 { 404 RTTestIFailed("RTFileWrite(%#x) -> %Rrc\n", cbToWrite, rc); 405 break; 406 } 407 cbSize -= cbToWrite; 408 } 409 410 RTTESTI_CHECK_RC(RTFileClose(hFile), VINF_SUCCESS); 411 } 412 else 413 RTTestIFailed("RTFileOpen(%s) -> %Rrc\n", szPath, rc); 414 break; 415 } 416 417 case RTFS_TYPE_DIRECTORY: 418 RTTESTI_CHECK_RC_OK(RTDirCreate(szPath, 0755 /* fMode */, 0 /* fCreate */)); 419 break; 420 421 case RTFS_TYPE_SYMLINK: 422 RTTESTI_CHECK_RC_OK(RTSymlinkCreate(szPath, szTempDir, RTSYMLINKTYPE_UNKNOWN, 0 /* fCreate */)); 423 break; 424 425 default: 426 break; 427 } 428 376 429 if (RT_SUCCESS(rc)) 377 { 378 uint8_t abBuf[_64K]; RTRandBytes(abBuf, sizeof(abBuf)); 379 380 while (cbSize > 0) 381 { 382 size_t cbToWrite = sizeof(abBuf); 383 if (cbToWrite > cbSize) 384 cbToWrite = cbSize; 385 rc = RTFileWrite(hFile, abBuf, cbToWrite, NULL); 386 if (RT_FAILURE(rc)) 387 { 388 RTTestIFailed("RTFileWrite(%#x) -> %Rrc\n", cbToWrite, rc); 389 break; 390 } 391 cbSize -= cbToWrite; 392 } 393 394 RTTESTI_CHECK_RC(RTFileClose(hFile), VINF_SUCCESS); 395 396 if (RT_SUCCESS(rc)) 397 tstCreateTransferSingle(hTest, &TxCtx, &HttpSrv, szFilePath, &Provider); 398 } 399 else 400 RTTestIFailed("RTFileOpen(%s) -> %Rrc\n", szFilePath, rc); 430 tstCreateTransferSingle(hTest, &TxCtx, &HttpSrv, szPath, &Provider); 401 431 } 402 432 } … … 428 458 PSHCLTRANSFER pTx = ShClTransferCtxGetTransferByIndex(&TxCtx, i); 429 459 char *pszUrlBase = ShClTransferHttpServerGetUrlA(&HttpSrv, ShClTransferGetID(pTx), UINT64_MAX); 430 431 460 RTTEST_CHECK(hTest, RTStrPrintf2(szURL, sizeof(szURL), "%s/%s", pszUrlBase, g_aTests[i].pszUrl)); 432 433 461 RTStrFree(pszUrlBase); 434 462 435 /* Download to destination file. */ 436 char szDstFile[RTPATH_MAX]; 437 RTTEST_CHECK_RC_OK(hTest, RTPathTemp(szDstFile, sizeof(szDstFile))); 438 RTTEST_CHECK_RC_OK(hTest, RTPathAppend(szDstFile, sizeof(szDstFile), "tstClipboardHttpServer-XXXXXX")); 439 RTTEST_CHECK_RC_OK(hTest, RTFileCreateTemp(szDstFile, 0600)); 440 RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "Downloading '%s' -> '%s'\n", szURL, szDstFile); 441 RTTEST_CHECK_RC_OK(hTest, RTHttpGetFile(hClient, szURL, szDstFile)); 442 443 /* Compare files. */ 444 char szSrcFile[RTPATH_MAX]; 445 RTTEST_CHECK (hTest, RTStrPrintf(szSrcFile, sizeof(szSrcFile), szTempDir)); 446 RTTEST_CHECK_RC_OK(hTest, RTPathAppend(szSrcFile, sizeof(szSrcFile), g_aTests[i].pszFileName)); 447 RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "Comparing files '%s' vs. '%s'\n", szSrcFile, szDstFile); 448 RTTEST_CHECK_RC_OK(hTest, RTFileCompare(szSrcFile, szDstFile)); 449 450 RTTEST_CHECK_RC_OK(hTest, RTFileDelete(szDstFile)); 463 switch (g_aTests[i].fMode & RTFS_TYPE_MASK) 464 { 465 case RTFS_TYPE_FILE: 466 { 467 /* Download to destination file. */ 468 char szDstFile[RTPATH_MAX]; 469 RTTEST_CHECK_RC_OK(hTest, RTPathTemp(szDstFile, sizeof(szDstFile))); 470 RTTEST_CHECK_RC_OK(hTest, RTPathAppend(szDstFile, sizeof(szDstFile), "tstClipboardHttpServer-XXXXXX")); 471 RTTEST_CHECK_RC_OK(hTest, RTFileCreateTemp(szDstFile, 0600)); 472 RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "Downloading file '%s' -> '%s'\n", szURL, szDstFile); 473 RTTEST_CHECK_RC_OK(hTest, RTHttpGetFile(hClient, szURL, szDstFile)); 474 475 /* Compare files. */ 476 char szSrcFile[RTPATH_MAX]; 477 RTTEST_CHECK (hTest, RTStrPrintf(szSrcFile, sizeof(szSrcFile), szTempDir)); 478 RTTEST_CHECK_RC_OK(hTest, RTPathAppend(szSrcFile, sizeof(szSrcFile), g_aTests[i].pszPath)); 479 RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "Comparing files '%s' vs. '%s'\n", szSrcFile, szDstFile); 480 RTTEST_CHECK_RC_OK(hTest, RTFileCompare(szSrcFile, szDstFile)); 481 482 RTTEST_CHECK_RC_OK(hTest, RTFileDelete(szDstFile)); 483 break; 484 } 485 486 case RTFS_TYPE_DIRECTORY: 487 RT_FALL_THROUGH(); 488 case RTFS_TYPE_SYMLINK: 489 { 490 char szDstFile[RTPATH_MAX]; 491 RTTEST_CHECK_RC_OK(hTest, RTPathTemp(szDstFile, sizeof(szDstFile))); 492 RTTEST_CHECK_RC_OK(hTest, RTPathAppend(szDstFile, sizeof(szDstFile), "tstClipboardHttpServer-XXXXXX")); 493 RTTEST_CHECK_RC_OK(hTest, RTFileCreateTemp(szDstFile, 0600)); 494 RTTEST_CHECK_RC (hTest, RTHttpGetFile(hClient, szURL, szDstFile), g_aTests[i].rc); 495 RTTEST_CHECK_RC_OK(hTest, RTFileDelete(szDstFile)); 496 break; 497 } 498 499 default: 500 break; 501 } 451 502 } 452 503 … … 465 516 * Cleanup 466 517 */ 467 char sz FilePath[RTPATH_MAX];518 char szPath[RTPATH_MAX]; 468 519 for (size_t i = 0; i < RT_ELEMENTS(g_aTests); i++) 469 520 { 470 RTTEST_CHECK (hTest, RTStrPrintf(szFilePath, sizeof(szFilePath), szTempDir)); 471 RTTEST_CHECK_RC_OK(hTest, RTPathAppend(szFilePath, sizeof(szFilePath), g_aTests[i].pszFileName)); 472 RTTEST_CHECK_RC_OK(hTest, RTFileDelete(szFilePath)); 521 RTTEST_CHECK (hTest, RTStrPrintf(szPath, sizeof(szPath), szTempDir)); 522 RTTEST_CHECK_RC_OK(hTest, RTPathAppend(szPath, sizeof(szPath), g_aTests[i].pszPath)); 523 524 switch (g_aTests[i].fMode & RTFS_TYPE_MASK) 525 { 526 case RTFS_TYPE_FILE: 527 { 528 RTTEST_CHECK_RC_OK(hTest, RTFileDelete(szPath)); 529 break; 530 } 531 532 case RTFS_TYPE_DIRECTORY: 533 { 534 RTTEST_CHECK_RC_OK(hTest, RTDirRemove(szPath)); /* ASSUMES empty dir. */ 535 break; 536 } 537 538 case RTFS_TYPE_SYMLINK: 539 { 540 RTTEST_CHECK_RC_OK(hTest, RTSymlinkDelete(szPath, 0 /* fDelete */)); 541 break; 542 } 543 544 default: 545 break; 546 } 473 547 } 474 548 RTTEST_CHECK_RC_OK(hTest, RTDirRemove(szTempDir));
Note:
See TracChangeset
for help on using the changeset viewer.