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 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)); }
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)); }