static void test4(void) { RTTestISub("GET_PROP_HOST buffer handling"); VBOXHGCMSVCFNTABLE svcTable; VBOXHGCMSVCHELPERS svcHelpers; initTable(&svcTable, &svcHelpers); RTTESTI_CHECK_RC_OK_RETV(VBoxHGCMSvcLoad(&svcTable)); /* Insert a property that we can mess around with. */ static char const s_szProp[] = "/MyProperties/Sub/Sub/Sub/Sub/Sub/Sub/Sub/Property"; static char const s_szValue[] = "Property Value"; RTTESTI_CHECK_RC_OK(doSetProperty(&svcTable, s_szProp, s_szValue, "", true, true)); /* Get the value with buffer sizes up to 1K. */ for (unsigned iVariation = 0; iVariation < 2; iVariation++) { for (uint32_t cbBuf = 0; cbBuf < _1K; cbBuf++) { void *pvBuf; RTTESTI_CHECK_RC_BREAK(RTTestGuardedAlloc(g_hTest, cbBuf, 1, iVariation == 0, &pvBuf), VINF_SUCCESS); VBOXHGCMSVCPARM aParms[4]; aParms[0].setString(s_szProp); aParms[1].setPointer(pvBuf, cbBuf); int rc = svcTable.pfnHostCall(svcTable.pvService, GET_PROP_HOST, RT_ELEMENTS(aParms), aParms); RTTestGuardedFree(g_hTest, pvBuf); } } /* Done. */ RTTESTI_CHECK_RC_OK(svcTable.pfnUnload(svcTable.pvService)); }
static void test2(void) { VBOXHGCMSVCFNTABLE svcTable; VBOXHGCMSVCHELPERS svcHelpers; initTable(&svcTable, &svcHelpers); /* The function is inside the service, not HGCM. */ RTTESTI_CHECK_RC_OK_RETV(VBoxHGCMSvcLoad(&svcTable)); testSetPropsHost(&svcTable); testEnumPropsHost(&svcTable); /* Set up the asynchronous notification test */ setupAsyncNotification(&svcTable); testSetProp(&svcTable); RTTestISub("Async notification call data"); testAsyncNotification(&svcTable); /* Our previous notification call should have completed by now. */ testDelProp(&svcTable); testGetProp(&svcTable); testGetNotification(&svcTable); /* Cleanup */ RTTESTI_CHECK_RC_OK(svcTable.pfnUnload(svcTable.pvService)); }
static void test5(void) { RTTestISub("ENUM_PROPS_HOST buffer handling"); VBOXHGCMSVCFNTABLE svcTable; VBOXHGCMSVCHELPERS svcHelpers; initTable(&svcTable, &svcHelpers); RTTESTI_CHECK_RC_OK_RETV(VBoxHGCMSvcLoad(&svcTable)); /* Insert a few property that we can mess around with. */ RTTESTI_CHECK_RC_OK(doSetProperty(&svcTable, "/MyProperties/Sub/Sub/Sub/Sub/Sub/Sub/Sub/Property", "Property Value", "", true, true)); RTTESTI_CHECK_RC_OK(doSetProperty(&svcTable, "/MyProperties/12357", "83848569", "", true, true)); RTTESTI_CHECK_RC_OK(doSetProperty(&svcTable, "/MyProperties/56678", "abcdefghijklm", "", true, true)); RTTESTI_CHECK_RC_OK(doSetProperty(&svcTable, "/MyProperties/932769", "n", "", true, true)); /* Get the value with buffer sizes up to 1K. */ for (unsigned iVariation = 0; iVariation < 2; iVariation++) { for (uint32_t cbBuf = 0; cbBuf < _1K; cbBuf++) { void *pvBuf; RTTESTI_CHECK_RC_BREAK(RTTestGuardedAlloc(g_hTest, cbBuf, 1, iVariation == 0, &pvBuf), VINF_SUCCESS); VBOXHGCMSVCPARM aParms[3]; aParms[0].setString("*"); aParms[1].setPointer(pvBuf, cbBuf); int rc2 = svcTable.pfnHostCall(svcTable.pvService, ENUM_PROPS_HOST, RT_ELEMENTS(aParms), aParms); RTTestGuardedFree(g_hTest, pvBuf); } } /* Done. */ RTTESTI_CHECK_RC_OK(svcTable.pfnUnload(svcTable.pvService)); }
int main(int argc, char **argv) { VBOXHGCMSVCFNTABLE svcTable; VBOXHGCMSVCHELPERS svcHelpers; RTEXITCODE rcExit; rcExit = RTTestInitAndCreate("tstGuestPropSvc", &g_hTest); if (rcExit != RTEXITCODE_SUCCESS) return rcExit; RTTestBanner(g_hTest); /** @todo convert the rest of this testcase. */ initTable(&svcTable, &svcHelpers); if (RT_FAILURE(testConvertFlags())) return 1; /* The function is inside the service, not HGCM. */ if (RT_FAILURE(VBoxHGCMSvcLoad(&svcTable))) { RTPrintf("Failed to start the HGCM service.\n"); return 1; } if (RT_FAILURE(testSetPropsHost(&svcTable))) return 1; if (RT_FAILURE(testEnumPropsHost(&svcTable))) return 1; /* Set up the asynchronous notification test */ if (RT_FAILURE(setupAsyncNotification(&svcTable))) return 1; if (RT_FAILURE(testSetProp(&svcTable))) return 1; RTPrintf("Checking the data returned by the asynchronous notification call.\n"); /* Our previous notification call should have completed by now. */ if (RT_FAILURE(testAsyncNotification(&svcTable))) return 1; if (RT_FAILURE(testDelProp(&svcTable))) return 1; if (RT_FAILURE(testGetProp(&svcTable))) return 1; if (RT_FAILURE(testGetNotification(&svcTable))) return 1; if (RT_FAILURE(svcTable.pfnUnload(svcTable.pvService))) { RTPrintf("Failed to unload the HGCM service.\n"); return 1; } if (RT_FAILURE(testSetPropROGuest(&svcTable))) return 1; if (RT_FAILURE(testDelPropROGuest(&svcTable))) return 1; return RTTestSummaryAndDestroy(g_hTest); }
static void test6(void) { RTTestISub("Max properties"); VBOXHGCMSVCFNTABLE svcTable; VBOXHGCMSVCHELPERS svcHelpers; initTable(&svcTable, &svcHelpers); RTTESTI_CHECK_RC_OK_RETV(VBoxHGCMSvcLoad(&svcTable)); /* Insert the max number of properties. */ static char const s_szPropFmt[] = "/MyProperties/Sub/Sub/Sub/Sub/Sub/Sub/Sub/PropertyNo#%u"; char szProp[80]; unsigned cProps = 0; for (;;) { RTStrPrintf(szProp, sizeof(szProp), s_szPropFmt, cProps); int rc = doSetProperty(&svcTable, szProp, "myvalue", "", true, true); if (rc == VERR_TOO_MUCH_DATA) break; if (RT_FAILURE(rc)) { RTTestIFailed("Unexpected error %Rrc setting property number %u", rc, cProps); break; } cProps++; } RTTestIValue("Max Properties", cProps, RTTESTUNIT_OCCURRENCES); /* Touch them all again. */ for (unsigned iProp = 0; iProp < cProps; iProp++) { RTStrPrintf(szProp, sizeof(szProp), s_szPropFmt, iProp); int rc; RTTESTI_CHECK_MSG((rc = doSetProperty(&svcTable, szProp, "myvalue", "", true, true)) == VINF_SUCCESS, ("%Rrc - #%u\n", rc, iProp)); RTTESTI_CHECK_MSG((rc = doSetProperty(&svcTable, szProp, "myvalue", "", true, false)) == VINF_SUCCESS, ("%Rrc - #%u\n", rc, iProp)); RTTESTI_CHECK_MSG((rc = doSetProperty(&svcTable, szProp, "myvalue", "", false, true)) == VINF_SUCCESS, ("%Rrc - #%u\n", rc, iProp)); RTTESTI_CHECK_MSG((rc = doSetProperty(&svcTable, szProp, "myvalue", "", false, false)) == VINF_SUCCESS, ("%Rrc - #%u\n", rc, iProp)); } /* Benchmark. */ uint64_t cNsMax = 0; uint64_t cNsMin = UINT64_MAX; uint64_t cNsAvg = 0; for (unsigned iProp = 0; iProp < cProps; iProp++) { size_t cchProp = RTStrPrintf(szProp, sizeof(szProp), s_szPropFmt, iProp); uint64_t cNsElapsed = RTTimeNanoTS(); unsigned iCall; for (iCall = 0; iCall < 1000; iCall++) { VBOXHGCMSVCPARM aParms[4]; char szBuffer[256]; aParms[0].setPointer(szProp, cchProp + 1); aParms[1].setPointer(szBuffer, sizeof(szBuffer)); RTTESTI_CHECK_RC_BREAK(svcTable.pfnHostCall(svcTable.pvService, GET_PROP_HOST, 4, aParms), VINF_SUCCESS); } cNsElapsed = RTTimeNanoTS() - cNsElapsed; if (iCall) { uint64_t cNsPerCall = cNsElapsed / iCall; cNsAvg += cNsPerCall; if (cNsPerCall < cNsMin) cNsMin = cNsPerCall; if (cNsPerCall > cNsMax) cNsMax = cNsPerCall; } } if (cProps) cNsAvg /= cProps; RTTestIValue("GET_PROP_HOST Min", cNsMin, RTTESTUNIT_NS_PER_CALL); RTTestIValue("GET_PROP_HOST Avg", cNsAvg, RTTESTUNIT_NS_PER_CALL); RTTestIValue("GET_PROP_HOST Max", cNsMax, RTTESTUNIT_NS_PER_CALL); /* Done. */ RTTESTI_CHECK_RC_OK(svcTable.pfnUnload(svcTable.pvService)); }