tstRTProcCreateEx.cpp revision 4e3469ac31db1401d787d60312d2179bc09757b9
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * IPRT Testcase - RTProcCreateEx.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright (C) 2010 Sun Microsystems, Inc.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * This file is part of VirtualBox Open Source Edition (OSE), as
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * available from http://www.virtualbox.org. This file is free software;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * you can redistribute it and/or modify it under the terms of the GNU
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * General Public License (GPL) as published by the Free Software
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Foundation, in version 2 as it comes in the "COPYING" file of the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The contents of this file may alternatively be used under the terms
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * of the Common Development and Distribution License Version 1.0
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * VirtualBox OSE distribution, in which case the provisions of the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * CDDL are applicable instead of those of the GPL.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * You may elect to license modified versions of this file under the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * terms and conditions of either the GPL or the CDDL or both.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts * Clara, CA 95054 USA or visit http://www.sun.com if you need
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * additional information or have any questions.
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts/*******************************************************************************
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts* Header Files *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster*******************************************************************************/
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/*******************************************************************************
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster* Global Variables *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster*******************************************************************************/
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic const char * const g_apszArgs4[] =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic int tstRTCreateProcEx5Child(int argc, char **argv)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /** @todo Does not yet handle ERROR_MORE_DATA for user names longer than 32767. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!GetUserNameEx(NameSamCompatible, szUser, &cbLen))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPrintf("GetUserNameEx failed with last error=%ld\n", GetLastError());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* First try to figure out how much space for SID + domain name we need. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster BOOL bRet = LookupAccountName(NULL /* current system*/,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPrintf("LookupAccountName(1) failed with last error=%ld\n", dwErr);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* Now try getting the real SID + domain name. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster char *pszDomain = (char *)RTMemAlloc(cbDomain); /* Size in TCHAR! */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!LookupAccountName(NULL /* Current system */,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPrintf("LookupAccountName(2) failed with last error=%ld\n", GetLastError());
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /** @todo Lookup UID/effective UID, maybe GID? */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void tstRTCreateProcEx5(const char *pszUser, const char *pszPassword)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestISubF("As user \"%s\" with password \"%s\"", pszUser, pszPassword);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "--testcase-child-5",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NULL, NULL, pszUser, pszPassword, &hProc), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic int tstRTCreateProcEx4Child(int argc, char **argv)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for (int i = 0; i < argc; i++)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "child4: argv[%2u]='%s'\n"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "child4: expected='%s'\n",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void tstRTCreateProcEx4(void)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, g_apszArgs4, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NULL, NULL, NULL, NULL, &hProc), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrmPrintf(g_pStdOut, "w"); RTStrmFlush(g_pStdOut);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrmPrintf(g_pStdErr, "o"); RTStrmFlush(g_pStdErr);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrmPrintf(g_pStdOut, "r"); RTStrmFlush(g_pStdOut);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrmPrintf(g_pStdErr, "k"); RTStrmFlush(g_pStdErr);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void tstRTCreateProcEx3(void)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTPipeCreate(&hPipeR, &hPipeW, RTPIPE_C_INHERIT_WRITE), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "non-existing-non-executable-file",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "--testcase-child-3",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster &Handle, &Handle, NULL, NULL, &hProc), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTPipeClose(hPipeW), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster size_t cbLeft = sizeof(szOutput) - 1 - offOutput;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int rc = RTPipeReadBlocking(hPipeR, &szOutput[offOutput], cbLeft, &cbRead);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTPipeClose(hPipeR), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("wrong output: \"%s\" (len=%u)", szOutput, offOutput);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrmPrintf(g_pStdOut, "ignore this output\n");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void tstRTCreateProcEx2(void)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTPipeCreate(&hPipeR, &hPipeW, RTPIPE_C_INHERIT_WRITE), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "non-existing-non-executable-file",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "--testcase-child-2",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster NULL, &Handle, NULL, NULL, &hProc), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTPipeClose(hPipeW), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster size_t cbLeft = sizeof(szOutput) - 1 - offOutput;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int rc = RTPipeReadBlocking(hPipeR, &szOutput[offOutput], cbLeft, &cbRead);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTPipeClose(hPipeR), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("wrong output: \"%s\" (len=%u)", szOutput, offOutput);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrmPrintf(g_pStdErr, "ignore this output\n");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void tstRTCreateProcEx1(void)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTPipeCreate(&hPipeR, &hPipeW, RTPIPE_C_INHERIT_WRITE), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "non-existing-non-executable-file",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "--testcase-child-1",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster &Handle, NULL, NULL, NULL, &hProc), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTPipeClose(hPipeW), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster size_t cbLeft = sizeof(szOutput) - 1 - offOutput;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int rc = RTPipeReadBlocking(hPipeR, &szOutput[offOutput], cbLeft, &cbRead);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTPipeClose(hPipeR), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTTestIFailed("wrong output: \"%s\" (len=%u)", szOutput, offOutput);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (argc == 2 && !strcmp(argv[1], "--testcase-child-1"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (argc == 2 && !strcmp(argv[1], "--testcase-child-2"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (argc == 2 && !strcmp(argv[1], "--testcase-child-3"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (argc >= 5 && !strcmp(argv[1], "--testcase-child-4"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (argc == 2 && !strcmp(argv[1], "--testcase-child-5"))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int rc = RTTestInitAndCreate("tstRTProcCreateEx", &hTest);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!RTProcGetExecutableName(g_szExecName, sizeof(g_szExecName)))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster RTStrCopy(g_szExecName, sizeof(g_szExecName), argv[0]);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The tests.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /** @todo Do not run tstRTCreateProcEx5 on NT4, may not work (?) */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /** @todo Cover files, ++ */