static void TestNegative(void) { RTTestSub(g_hTest, "Negative"); bool fSavedAssertQuiet = RTAssertSetQuiet(true); bool fSavedAssertMayPanic = RTAssertSetMayPanic(false); bool fSavedLckValEnabled = RTLockValidatorSetEnabled(false); RTCRITSECTRW CritSectRw; RTTEST_CHECK_RC_RETV(g_hTest, RTCritSectRwInit(&CritSectRw), VINF_SUCCESS); RTTEST_CHECK_RC(g_hTest, RTCritSectRwLeaveShared(&CritSectRw), VERR_NOT_OWNER); RTTEST_CHECK_RC(g_hTest, RTCritSectRwLeaveExcl(&CritSectRw), VERR_NOT_OWNER); RTTEST_CHECK_RC(g_hTest, RTCritSectRwEnterExcl(&CritSectRw), VINF_SUCCESS); RTTEST_CHECK_RC(g_hTest, RTCritSectRwLeaveShared(&CritSectRw), VERR_NOT_OWNER); RTTEST_CHECK_RC(g_hTest, RTCritSectRwEnterShared(&CritSectRw), VINF_SUCCESS); RTTEST_CHECK_RC(g_hTest, RTCritSectRwLeaveExcl(&CritSectRw), VERR_WRONG_ORDER); /* cannot release the final write before the reads. */ RTTEST_CHECK_RC(g_hTest, RTCritSectRwLeaveShared(&CritSectRw), VINF_SUCCESS); RTTEST_CHECK_RC(g_hTest, RTCritSectRwLeaveExcl(&CritSectRw), VINF_SUCCESS); RTTEST_CHECK_RC(g_hTest, RTCritSectRwDelete(&CritSectRw), VINF_SUCCESS); RTLockValidatorSetEnabled(fSavedLckValEnabled); RTAssertSetMayPanic(fSavedAssertMayPanic); RTAssertSetQuiet(fSavedAssertQuiet); }
int main() { RTTEST hTest; int rc = RTTestInitAndCreate("tstRTPoll", &hTest); if (rc) return rc; RTTestBanner(hTest); /* * The tests. */ tstRTPoll1(); if (RTTestErrorCount(hTest) == 0) { bool fMayPanic = RTAssertMayPanic(); bool fQuiet = RTAssertAreQuiet(); RTAssertSetMayPanic(false); RTAssertSetQuiet(true); tstRTPoll2(); RTAssertSetQuiet(fQuiet); RTAssertSetMayPanic(fMayPanic); } /* * Summary. */ return RTTestSummaryAndDestroy(hTest); }
static void tstRTProcQueryUsername(void) { RTTestISub("Basics"); size_t cbUser; char szUser[1024]; memset(szUser, '-', sizeof(szUser)); /* negative stuff that may assert: */ bool fMayPanic = RTAssertSetMayPanic(false); bool fQuiet = RTAssertSetQuiet(true); RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), NULL, 8, &cbUser), VERR_INVALID_PARAMETER); RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), szUser, 0, &cbUser), VERR_INVALID_PARAMETER); RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), NULL, 0, NULL), VERR_INVALID_PARAMETER); RTTESTI_CHECK_RC(RTProcQueryUsernameA(RTProcSelf(), NULL), VERR_INVALID_POINTER); RTAssertSetMayPanic(fMayPanic); RTAssertSetQuiet(fQuiet); RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), NULL, 0, &cbUser), VERR_BUFFER_OVERFLOW); memset(szUser, '-', sizeof(szUser)); RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), szUser, cbUser - 1, &cbUser), VERR_BUFFER_OVERFLOW); memset(szUser, '-', sizeof(szUser)); RTTESTI_CHECK_RC(RTProcQueryUsername(RTProcSelf(), szUser, sizeof(szUser), &cbUser), VINF_SUCCESS); RTTestPrintf(NULL, RTTESTLVL_ALWAYS, "Username: %s\n", szUser); /* */ char *pszUser = NULL; RTTESTI_CHECK_RC(RTProcQueryUsernameA(RTProcSelf(), &pszUser), VINF_SUCCESS); RTTestPrintf(NULL, RTTESTLVL_ALWAYS, "Username: %s\n", pszUser); RTTESTI_CHECK(strcmp(pszUser, szUser) == 0); RTStrFree(pszUser); }
static void Test3(void) { RTTestSub(g_hTest, "Negative"); bool fSavedAssertQuiet = RTAssertSetQuiet(true); bool fSavedAssertMayPanic = RTAssertSetMayPanic(false); bool fSavedLckValEnabled = RTLockValidatorSetEnabled(false); RTSEMRW hSemRW; RTTEST_CHECK_RC_RETV(g_hTest, RTSemRWCreate(&hSemRW), VINF_SUCCESS); RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead(hSemRW), VERR_NOT_OWNER); RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(hSemRW), VERR_NOT_OWNER); RTTEST_CHECK_RC(g_hTest, RTSemRWRequestWrite(hSemRW, RT_INDEFINITE_WAIT), VINF_SUCCESS); RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead(hSemRW), VERR_NOT_OWNER); RTTEST_CHECK_RC(g_hTest, RTSemRWRequestRead(hSemRW, RT_INDEFINITE_WAIT), VINF_SUCCESS); RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(hSemRW), VERR_WRONG_ORDER); /* cannot release the final write before the reads. */ RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead(hSemRW), VINF_SUCCESS); RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(hSemRW), VINF_SUCCESS); RTTEST_CHECK_RC(g_hTest, RTSemRWDestroy(hSemRW), VINF_SUCCESS); RTLockValidatorSetEnabled(fSavedLckValEnabled); RTAssertSetMayPanic(fSavedAssertMayPanic); RTAssertSetQuiet(fSavedAssertQuiet); }
static RTEXITCODE mainChild(int argc, char **argv) { if (argc < 3) /* Safety first. */ return RTEXITCODE_FAILURE; /* Note: We assume argv[2] always contains the actual test type to perform. */ RTTEST hTest; RTEXITCODE rcExit = RTTestInitAndCreate(argv[2], &hTest); if (rcExit) return rcExit; RTTestBanner(hTest); RTAssertSetMayPanic(false); #ifdef DEBUG_andy RTAssertSetQuiet(false); #endif if (!RTStrICmp(argv[2], "tstRTLocalIpcSessionConnectionFork")) rcExit = testSessionConnectionChild(argc, argv, hTest); else if (!RTStrICmp(argv[2], "tstRTLocalIpcSessionWaitFork")) rcExit = testSessionWaitChild(argc, argv, hTest); else if (!RTStrICmp(argv[2], "tstRTLocalIpcSessionDataFork")) rcExit = testSessionDataChild(argc, argv, hTest); return RTTestSummaryAndDestroy(hTest); }
int main(int argc, char **argv) { if (argc == 3 && !strcmp(argv[1], "--child-4")) return tstRTPipe4Child(argv[2]); if (argc == 3 && !strcmp(argv[1], "--child-5")) return tstRTPipe5Child(argv[2]); RTTEST hTest; int rc = RTTestInitAndCreate("tstRTPipe", &hTest); if (rc) return rc; RTTestBanner(hTest); /* * The tests. */ tstRTPipe1(); if (RTTestErrorCount(hTest) == 0) { bool fMayPanic = RTAssertMayPanic(); bool fQuiet = RTAssertAreQuiet(); RTAssertSetMayPanic(false); RTAssertSetQuiet(true); tstRTPipe2(); RTAssertSetQuiet(fQuiet); RTAssertSetMayPanic(fMayPanic); tstRTPipe3(); tstRTPipe4(); tstRTPipe5(); } /* * Summary. */ return RTTestSummaryAndDestroy(hTest); }
int main(int argc, char **argv) { if ( argc > 2 && !RTStrICmp(argv[1], "child")) return mainChild(argc, argv); RTTEST hTest; RTEXITCODE rcExit = RTTestInitAndCreate("tstRTLocalIpc", &hTest); if (rcExit) return rcExit; RTTestBanner(hTest); char szExecPath[RTPATH_MAX]; if (!RTProcGetExecutablePath(szExecPath, sizeof(szExecPath))) RTStrCopy(szExecPath, sizeof(szExecPath), argv[0]); RTTestISub("Basics"); RTAssertSetMayPanic(false); #ifdef DEBUG_andy RTAssertSetQuiet(false); #endif /* Server-side. */ RTTESTI_CHECK_RC_RET(RTLocalIpcServerCreate(NULL, NULL, 0), VERR_INVALID_POINTER, 1); RTLOCALIPCSERVER ipcServer; RTTESTI_CHECK_RC_RET(RTLocalIpcServerCreate(&ipcServer, NULL, 0), VERR_INVALID_POINTER, 1); RTTESTI_CHECK_RC_RET(RTLocalIpcServerCreate(&ipcServer, "", 0), VERR_INVALID_PARAMETER, 1); RTTESTI_CHECK_RC_RET(RTLocalIpcServerCreate(&ipcServer, "BasicTest", 0 /* Invalid flags */), VERR_INVALID_PARAMETER, 1); RTTESTI_CHECK_RC_RET(RTLocalIpcServerCreate(&ipcServer, "BasicTest", 1234 /* Invalid flags */), VERR_INVALID_PARAMETER, 1); RTTESTI_CHECK_RC_RET(RTLocalIpcServerCancel(NULL), VERR_INVALID_HANDLE, 1); RTTESTI_CHECK_RC_RET(RTLocalIpcServerDestroy(NULL), VINF_SUCCESS, 1); /* Basic server creation / destruction. */ RTTESTI_CHECK_RC_RET(RTLocalIpcServerCreate(&ipcServer, "BasicTest", RTLOCALIPC_FLAGS_MULTI_SESSION), VINF_SUCCESS, 1); RTTESTI_CHECK_RC_RET(RTLocalIpcServerCancel(ipcServer), VINF_SUCCESS, 1); RTTESTI_CHECK_RC_RET(RTLocalIpcServerDestroy(ipcServer), VINF_SUCCESS, 1); /* Client-side (per session). */ RTTESTI_CHECK_RC_RET(RTLocalIpcSessionConnect(NULL, NULL, 0), VERR_INVALID_POINTER, 1); RTLOCALIPCSESSION ipcSession; RTTESTI_CHECK_RC_RET(RTLocalIpcSessionConnect(&ipcSession, NULL, 0), VERR_INVALID_POINTER, 1); RTTESTI_CHECK_RC_RET(RTLocalIpcSessionConnect(&ipcSession, "", 0), VERR_INVALID_PARAMETER, 1); RTTESTI_CHECK_RC_RET(RTLocalIpcSessionConnect(&ipcSession, "BasicTest", 1234 /* Invalid flags */), VERR_INVALID_PARAMETER, 1); RTTESTI_CHECK_RC_RET(RTLocalIpcSessionCancel(NULL), VERR_INVALID_HANDLE, 1); RTTESTI_CHECK_RC_RET(RTLocalIpcSessionClose(NULL), VINF_SUCCESS, 1); /* Basic client creation / destruction. */ RTTESTI_CHECK_RC_RET(RTLocalIpcSessionConnect(&ipcSession, "BasicTest", 0), VERR_FILE_NOT_FOUND, 1); RTTESTI_CHECK_RC_RET(RTLocalIpcServerCancel(ipcServer), VERR_INVALID_MAGIC, 1); RTTESTI_CHECK_RC_RET(RTLocalIpcServerDestroy(ipcServer), VERR_INVALID_MAGIC, 1); if (RTTestErrorCount(hTest) == 0) { RTTESTI_CHECK_RC_RET(testServerListenAndCancel(hTest, szExecPath), VINF_SUCCESS, 1); RTTESTI_CHECK_RC_RET(testSessionConnection(hTest, szExecPath), VINF_SUCCESS, 1); RTTESTI_CHECK_RC_RET(testSessionWait(hTest, szExecPath), VINF_SUCCESS, 1); RTTESTI_CHECK_RC_RET(testSessionData(hTest, szExecPath), VINF_SUCCESS, 1); } /* * Summary. */ return RTTestSummaryAndDestroy(hTest); }
int main() { RTTEST hTest; int rc = RTTestInitAndCreate("tstRTSystemQueryOsInfo", &hTest); if (rc) return rc; RTTestBanner(hTest); /* * Simple stuff. */ char szInfo[_4K]; rc = RTSystemQueryOSInfo(RTSYSOSINFO_PRODUCT, szInfo, sizeof(szInfo)); RTTestIPrintf(RTTESTLVL_ALWAYS, "PRODUCT: \"%s\", rc=%Rrc\n", szInfo, rc); rc = RTSystemQueryOSInfo(RTSYSOSINFO_RELEASE, szInfo, sizeof(szInfo)); RTTestIPrintf(RTTESTLVL_ALWAYS, "RELEASE: \"%s\", rc=%Rrc\n", szInfo, rc); rc = RTSystemQueryOSInfo(RTSYSOSINFO_VERSION, szInfo, sizeof(szInfo)); RTTestIPrintf(RTTESTLVL_ALWAYS, "VERSION: \"%s\", rc=%Rrc\n", szInfo, rc); rc = RTSystemQueryOSInfo(RTSYSOSINFO_SERVICE_PACK, szInfo, sizeof(szInfo)); RTTestIPrintf(RTTESTLVL_ALWAYS, "SERVICE_PACK: \"%s\", rc=%Rrc\n", szInfo, rc); uint64_t cbTotal; rc = RTSystemQueryTotalRam(&cbTotal); RTTestIPrintf(RTTESTLVL_ALWAYS, "Total RAM: %'RU64 Bytes (%RU64 KB, %RU64 MB)\n", cbTotal, cbTotal / _1K, cbTotal / _1M); uint64_t cbAvailable; rc = RTSystemQueryAvailableRam(&cbAvailable); RTTestIPrintf(RTTESTLVL_ALWAYS, "Available RAM: %'RU64 Bytes (%RU64 KB, %RU64 MB)\n", cbAvailable, cbAvailable / _1K, cbAvailable / _1M); /* * Check that unsupported stuff is terminated correctly. */ for (int i = RTSYSOSINFO_INVALID + 1; i < RTSYSOSINFO_END; i++) { memset(szInfo, ' ', sizeof(szInfo)); rc = RTSystemQueryOSInfo((RTSYSOSINFO)i, szInfo, sizeof(szInfo)); if ( rc == VERR_NOT_SUPPORTED && szInfo[0] != '\0') RTTestIFailed("level=%d; unterminated buffer on VERR_NOT_SUPPORTED\n", i); else if (RT_SUCCESS(rc) || rc == VERR_BUFFER_OVERFLOW) RTTESTI_CHECK(RTStrEnd(szInfo, sizeof(szInfo)) != NULL); else if (rc != VERR_NOT_SUPPORTED) RTTestIFailed("level=%d unexpected rc=%Rrc\n", i, rc); } /* * Check buffer overflow */ RTAssertSetQuiet(true); RTAssertSetMayPanic(false); for (int i = RTSYSDMISTR_INVALID + 1; i < RTSYSDMISTR_END; i++) { RTTESTI_CHECK_RC(RTSystemQueryDmiString((RTSYSDMISTR)i, szInfo, 0), VERR_INVALID_PARAMETER); /* Get the length of the info and check that we get overflow errors for everything less that it. */ rc = RTSystemQueryOSInfo((RTSYSOSINFO)i, szInfo, sizeof(szInfo)); if (RT_FAILURE(rc)) continue; size_t const cchInfo = strlen(szInfo); for (size_t cch = 1; cch < sizeof(szInfo) && cch < cchInfo; cch++) { memset(szInfo, 0x7f, sizeof(szInfo)); RTTESTI_CHECK_RC(RTSystemQueryOSInfo((RTSYSOSINFO)i, szInfo, cch), VERR_BUFFER_OVERFLOW); /* check the padding. */ for (size_t off = cch; off < sizeof(szInfo); off++) if (szInfo[off] != 0x7f) { RTTestIFailed("level=%d, rc=%Rrc, cch=%zu, off=%zu: Wrote too much!\n", i, rc, cch, off); break; } /* check for zero terminator. */ if (!RTStrEnd(szInfo, cch)) RTTestIFailed("level=%d, rc=%Rrc, cch=%zu: Buffer not terminated!\n", i, rc, cch); } /* Check that the exact length works. */ rc = RTSystemQueryOSInfo((RTSYSOSINFO)i, szInfo, cchInfo + 1); if (rc != VINF_SUCCESS) RTTestIFailed("level=%d: rc=%Rrc when specifying exactly right buffer length (%zu)\n", i, rc, cchInfo + 1); } return RTTestSummaryAndDestroy(hTest); }
static void test1(const char *pcszDesc, T3 paTestData[], size_t cTestItems) { RTTestISubF("%s with size of %u (items=%u)", pcszDesc, sizeof(T1), cTestItems); /* * Construction */ /* Create a test list */ L<T1, T2> testList; const size_t defCap = L<T1, T2>::kDefaultCapacity; RTTESTI_CHECK(testList.isEmpty()); RTTESTI_CHECK(testList.size() == 0); RTTESTI_CHECK(testList.capacity() == defCap); /* * Adding */ /* Add the second half of the test data */ size_t cAdded = 1; /* Start adding the second half of our test list */ for (size_t i = cTestItems / 2; i < cTestItems; ++i, ++cAdded) { testList.append(paTestData[i]); RTTESTI_CHECK_RETV(testList.size() == cAdded); RTTESTI_CHECK(testList.at(0) == paTestData[cTestItems / 2]); RTTESTI_CHECK(testList[0] == paTestData[cTestItems / 2]); RTTESTI_CHECK(testList.first() == paTestData[cTestItems / 2]); RTTESTI_CHECK(testList.at(cAdded - 1) == paTestData[i]); RTTESTI_CHECK(testList[cAdded - 1] == paTestData[i]); RTTESTI_CHECK(testList.last() == paTestData[i]); } /* Check that all is correctly appended. */ RTTESTI_CHECK_RETV(testList.size() == cTestItems / 2); RTTESTI_CHECK_RETV(testList.isEmpty() == false); for (size_t i = 0; i < testList.size(); ++i) RTTESTI_CHECK(testList.at(i) == paTestData[cTestItems / 2 + i]); /* Start prepending the first half of our test list. Iterate reverse to get * the correct sorting back. */ for (size_t i = cTestItems / 2; i > 0; --i, ++cAdded) { testList.prepend(paTestData[i - 1]); RTTESTI_CHECK_RETV(testList.size() == cAdded); RTTESTI_CHECK(testList.at(0) == paTestData[i - 1]); RTTESTI_CHECK(testList[0] == paTestData[i - 1]); RTTESTI_CHECK(testList.first() == paTestData[i - 1]); RTTESTI_CHECK(testList.at(cAdded - 1) == paTestData[cTestItems - 1]); RTTESTI_CHECK(testList[cAdded - 1] == paTestData[cTestItems - 1]); RTTESTI_CHECK(testList.last() == paTestData[cTestItems - 1]); } /* Check that all is correctly prepended. */ RTTESTI_CHECK_RETV(testList.size() == cTestItems); RTTESTI_CHECK_RETV(testList.isEmpty() == false); for (size_t i = 0; i < testList.size(); ++i) RTTESTI_CHECK(testList.at(i) == paTestData[i]); /* * Contains */ L<T1, T2> testList2; /* Check full list. */ RTTESTI_CHECK( testList.contains(paTestData[0])); RTTESTI_CHECK( testList.contains(paTestData[cTestItems / 2])); RTTESTI_CHECK( testList.contains(paTestData[cTestItems - 1])); RTTESTI_CHECK(!testList.contains(T1())); /* Check empty list. */ RTTESTI_CHECK(!testList2.contains(paTestData[0])); RTTESTI_CHECK(!testList2.contains(paTestData[cTestItems / 2])); RTTESTI_CHECK(!testList2.contains(paTestData[cTestItems - 1])); RTTESTI_CHECK(!testList2.contains(T1())); /* * Copy operator */ L<T1, T2> testList3(testList); /* Check that all is correctly appended. */ RTTESTI_CHECK_RETV(testList3.size() == cTestItems); for (size_t i = 0; i < testList3.size(); ++i) RTTESTI_CHECK(testList3.at(i) == paTestData[i]); /* * "=" operator */ L<T1, T2> testList4; testList4 = testList; /* Check that all is correctly appended. */ RTTESTI_CHECK_RETV(testList4.size() == cTestItems); for (size_t i = 0; i < testList4.size(); ++i) RTTESTI_CHECK(testList4.at(i) == paTestData[i]); /* * Append list */ testList3.append(testList4); /* Check that all is correctly appended. */ RTTESTI_CHECK_RETV(testList3.size() == cTestItems * 2); for (size_t i = 0; i < testList3.size(); ++i) RTTESTI_CHECK(testList3.at(i) == paTestData[i % cTestItems]); /* * Prepend list */ testList3.prepend(testList4); /* Check that all is correctly appended. */ RTTESTI_CHECK_RETV(testList3.size() == cTestItems * 3); for (size_t i = 0; i < testList3.size(); ++i) RTTESTI_CHECK(testList3.at(i) == paTestData[i % cTestItems]); /* * "value" method */ for (size_t i = 0; i < testList3.size(); ++i) RTTESTI_CHECK(testList3.value(i) == paTestData[i % cTestItems]); for (size_t i = 0; i < testList3.size(); ++i) RTTESTI_CHECK(testList3.value(i, T1()) == paTestData[i % cTestItems]); RTTESTI_CHECK(testList3.value(testList3.size() + 1) == T1()); /* Invalid index */ RTTESTI_CHECK(testList3.value(testList3.size() + 1, T1()) == T1()); /* Invalid index */ /* * operator[] (reading) */ for (size_t i = 0; i < testList.size(); ++i) RTTESTI_CHECK(testList[i] == paTestData[i]); /* * operator[] (writing) * * Replace with inverted array. */ for (size_t i = 0; i < cTestItems; ++i) testList[i] = paTestData[cTestItems - i - 1]; RTTESTI_CHECK_RETV(testList.size() == cTestItems); for (size_t i = 0; i < testList.size(); ++i) RTTESTI_CHECK(testList[i] == paTestData[cTestItems - i - 1]); /* * Replace * * Replace with inverted array (Must be original array when finished). */ for (size_t i = 0; i < cTestItems; ++i) testList.replace(i, paTestData[i]); RTTESTI_CHECK_RETV(testList.size() == cTestItems); for (size_t i = 0; i < testList.size(); ++i) RTTESTI_CHECK(testList[i] == paTestData[i]); /* * Removing */ /* Remove Range */ testList3.removeRange(cTestItems, cTestItems * 2); RTTESTI_CHECK_RETV(testList3.size() == cTestItems * 2); for (size_t i = 0; i < testList3.size(); ++i) RTTESTI_CHECK(testList3.at(i) == paTestData[i % cTestItems]); /* Remove the first half (reverse) */ size_t cRemoved = 1; for (size_t i = cTestItems / 2; i > 0; --i, ++cRemoved) { testList.removeAt(i - 1); RTTESTI_CHECK_RETV(testList.size() == cTestItems - cRemoved); } RTTESTI_CHECK_RETV(testList.size() == cTestItems / 2); /* Check that all is correctly removed and only the second part of the list * is still there. */ for (size_t i = 0; i < testList.size(); ++i) RTTESTI_CHECK(testList.at(i) == paTestData[cTestItems / 2 + i]); /* * setCapacitiy */ testList.setCapacity(cTestItems * 5); RTTESTI_CHECK(testList.capacity() == cTestItems * 5); RTTESTI_CHECK_RETV(testList.size() == cTestItems / 2); /* As the capacity just increased, we should still have all entries from * the previous list. */ for (size_t i = 0; i < testList.size(); ++i) RTTESTI_CHECK(testList.at(i) == paTestData[cTestItems / 2 + i]); /* Decrease the capacity so it will be smaller than the count of items in * the list. The list should be shrink automatically, but the remaining * items should be still valid. */ testList.setCapacity(cTestItems / 4); RTTESTI_CHECK_RETV(testList.size() == cTestItems / 4); RTTESTI_CHECK(testList.capacity() == cTestItems / 4); for (size_t i = 0; i < testList.size(); ++i) RTTESTI_CHECK(testList.at(i) == paTestData[cTestItems / 2 + i]); /* Clear all */ testList.clear(); RTTESTI_CHECK_RETV(testList.isEmpty()); RTTESTI_CHECK_RETV(testList.size() == 0); RTTESTI_CHECK(testList.capacity() == defCap); /* Copy empty lists. */ L<T1, T2> testList5(testList); RTTESTI_CHECK_RETV(testList5.isEmpty()); RTTESTI_CHECK_RETV(testList5.size() == 0); RTTESTI_CHECK(testList5.capacity() == 0); testList5.append(paTestData[0]); testList5 = testList; RTTESTI_CHECK_RETV(testList5.isEmpty()); RTTESTI_CHECK_RETV(testList5.size() == 0); RTTESTI_CHECK(testList5.capacity() == 0); /* * Negative testing. */ bool fMayPanic = RTAssertMayPanic(); bool fQuiet = RTAssertAreQuiet(); RTAssertSetMayPanic(false); RTAssertSetQuiet(true); L<T1, T2> testList6; for (size_t i = 0; i < cTestItems; ++i) testList6.insert(i, paTestData[i]); RTTESTI_CHECK(testList6.size() == cTestItems); /* Insertion beyond the end of the array ends up at the end. */ size_t cBefore = testList6.size(); testList6.insert(cBefore + 3, paTestData[0]); RTTESTI_CHECK(testList6.size() == cBefore + 1); RTTESTI_CHECK(testList6.at(cBefore) == paTestData[0]); cBefore = testList6.size(); L<T1, T2> testList7(testList6); testList6.insert(testList6.size() + 42, testList7); RTTESTI_CHECK(testList6.size() == cBefore + testList7.size()); /* Inserting, appending or prepending a list to itself is not supported. */ cBefore = testList6.size(); testList6.insert(3, testList6); RTTESTI_CHECK(testList6.size() == cBefore); cBefore = testList6.size(); testList6.append(testList6); RTTESTI_CHECK(testList6.size() == cBefore); cBefore = testList6.size(); testList6.prepend(testList6); RTTESTI_CHECK(testList6.size() == cBefore); /* Replace does nothing if the index is bad. */ cBefore = testList6.size(); testList6.replace(cBefore, testList6[6]); RTTESTI_CHECK(testList6.size() == cBefore); cBefore = testList6.size(); testList6.replace(cBefore + 64, testList6[6]); RTTESTI_CHECK(testList6.size() == cBefore); /* Indexing beyond the array returns the last element. */ cBefore = testList6.size(); RTTESTI_CHECK(testList6[cBefore] == testList6.last()); RTTESTI_CHECK(testList6[cBefore + 42] == testList6.last()); RTTESTI_CHECK(&testList6[cBefore] == &testList6[cBefore - 1]); RTTESTI_CHECK(&testList6[cBefore + 42] == &testList6[cBefore - 1]); /* removeAt does nothing if the index is bad. */ cBefore = testList6.size(); testList6.removeAt(cBefore); RTTESTI_CHECK(testList6.size() == cBefore); cBefore = testList6.size(); testList6.removeAt(cBefore + 42); RTTESTI_CHECK(testList6.size() == cBefore); L<T1, T2> testListEmpty1; RTTESTI_CHECK(!testListEmpty1.size()); testListEmpty1.removeFirst(); RTTESTI_CHECK(!testListEmpty1.size()); testListEmpty1.removeLast(); RTTESTI_CHECK(!testListEmpty1.size()); testListEmpty1.removeAt(128); RTTESTI_CHECK(!testListEmpty1.size()); /* removeRange interprets indexes beyond the end as the end of array (asserted). */ testListEmpty1.removeRange(42, 128); RTTESTI_CHECK(!testListEmpty1.size()); cBefore = testList6.size(); testList6.removeRange(cBefore, cBefore); RTTESTI_CHECK(testList6.size() == cBefore); cBefore = testList6.size(); testList6.removeRange(cBefore + 12, cBefore + 128); RTTESTI_CHECK(testList6.size() == cBefore); /* If end is less or equal to the start, nothing is done. */ testListEmpty1.removeRange(128, 0); RTTESTI_CHECK(!testListEmpty1.size()); cBefore = testList6.size(); testList6.removeRange(cBefore, 0); RTTESTI_CHECK(testList6.size() == cBefore); cBefore = testList6.size(); testList6.removeRange(0, 0); RTTESTI_CHECK(testList6.size() == cBefore); cBefore = testList6.size(); testList6.removeRange(0, 0); RTTESTI_CHECK(testList6.size() == cBefore); RTAssertSetQuiet(fQuiet); RTAssertSetMayPanic(fMayPanic); }
/** * Initializes pam_vbox. * * @return IPRT status code. * @param hPAM PAM handle. */ static int pam_vbox_init(pam_handle_t *hPAM) { #ifdef DEBUG g_pam_handle = hPAM; /* hack for getting assertion text */ #endif /* Don't make assertions panic because the PAM stack + * the current logon module won't work anymore (or just restart). * This could result in not able to log into the system anymore. */ RTAssertSetMayPanic(false); pam_vbox_log(hPAM, "pam_vbox: %sr%s, running on %s\n", RTBldCfgVersion(), RTBldCfgRevisionStr(), RTBldCfgTargetArch()); int rc = RTR3InitDll(0); if (RT_FAILURE(rc)) { pam_vbox_error(hPAM, "pam_vbox_init: could not init runtime! rc=%Rrc. Aborting\n", rc); return PAM_SUCCESS; /* Jump out as early as we can to not mess around. */ } pam_vbox_log(hPAM, "pam_vbox_init: runtime initialized\n"); if (RT_SUCCESS(rc)) { rc = VbglR3InitUser(); if (RT_FAILURE(rc)) { switch(rc) { case VERR_ACCESS_DENIED: pam_vbox_error(hPAM, "pam_vbox_init: access is denied to guest driver! Please make sure you run with sufficient rights. Aborting\n"); break; case VERR_FILE_NOT_FOUND: pam_vbox_error(hPAM, "pam_vbox_init: guest driver not found! Guest Additions installed? Aborting\n"); break; default: pam_vbox_error(hPAM, "pam_vbox_init: could not init VbglR3 library! rc=%Rrc. Aborting\n", rc); break; } } pam_vbox_log(hPAM, "pam_vbox_init: guest lib initialized\n"); } if (RT_SUCCESS(rc)) { char *rhost = NULL; char *tty = NULL; char *prompt = NULL; #ifdef RT_OS_SOLARIS pam_get_item(hPAM, PAM_RHOST, (void**) &rhost); pam_get_item(hPAM, PAM_TTY, (void**) &tty); pam_get_item(hPAM, PAM_USER_PROMPT, (void**) &prompt); #else pam_get_item(hPAM, PAM_RHOST, (const void**) &rhost); pam_get_item(hPAM, PAM_TTY, (const void**) &tty); pam_get_item(hPAM, PAM_USER_PROMPT, (const void**) &prompt); #endif pam_vbox_log(hPAM, "pam_vbox_init: rhost=%s, tty=%s, prompt=%s\n", rhost ? rhost : "<none>", tty ? tty : "<none>", prompt ? prompt : "<none>"); } return rc; }