tstRTProcCreateEx.cpp revision 8e03ddcc7e406ba01ce5adb465bc1bb034681b40
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * IPRT Testcase - RTProcCreateEx.
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * Copyright (C) 2010 Sun Microsystems, Inc.
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * This file is part of VirtualBox Open Source Edition (OSE), as
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * available from http://www.virtualbox.org. This file is free software;
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * you can redistribute it and/or modify it under the terms of the GNU
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * General Public License (GPL) as published by the Free Software
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * Foundation, in version 2 as it comes in the "COPYING" file of the
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * The contents of this file may alternatively be used under the terms
53d53f147b9727979582b74891195772df932d1aMichael Graff * of the Common Development and Distribution License Version 1.0
53d53f147b9727979582b74891195772df932d1aMichael Graff * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * VirtualBox OSE distribution, in which case the provisions of the
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * CDDL are applicable instead of those of the GPL.
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * You may elect to license modified versions of this file under the
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * terms and conditions of either the GPL or the CDDL or both.
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley * Clara, CA 95054 USA or visit http://www.sun.com if you need
f058f9648463dcd77bdb74df14e9e53bad56518bBob Halley * additional information or have any questions.
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley/*******************************************************************************
f058f9648463dcd77bdb74df14e9e53bad56518bBob Halley* Header Files *
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley*******************************************************************************/
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley/*******************************************************************************
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley* Global Variables *
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley*******************************************************************************/
7c9b885120f02ac6af10853684a2e8350d224639Bob Halleystatic const char * const g_apszArgs4[] =
f058f9648463dcd77bdb74df14e9e53bad56518bBob Halleystatic int tstRTCreateProcEx5Child(int argc, char **argv)
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley /** @todo Does not yet handle ERROR_MORE_DATA for user names longer than 32767. */
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley RTPrintf("GetUserName failed with last error=%ld\n", GetLastError());
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley/* Does not work on NT4 (yet). */
f058f9648463dcd77bdb74df14e9e53bad56518bBob Halley /* First try to figure out how much space for SID + domain name we need. */
f058f9648463dcd77bdb74df14e9e53bad56518bBob Halley BOOL bRet = LookupAccountName(NULL /* current system*/,
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley RTPrintf("LookupAccountName(1) failed with last error=%ld\n", dwErr);
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley /* Now try getting the real SID + domain name. */
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley char *pszDomain = (char *)RTMemAlloc(cbDomain); /* Size in TCHAR! */
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley if (!LookupAccountName(NULL /* Current system */,
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley RTPrintf("LookupAccountName(2) failed with last error=%ld\n", GetLastError());
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley /** @todo Lookup UID/effective UID, maybe GID? */
7c9b885120f02ac6af10853684a2e8350d224639Bob Halleystatic void tstRTCreateProcEx5(const char *pszUser, const char *pszPassword)
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley RTTestISubF("As user \"%s\" with password \"%s\"", pszUser, pszPassword);
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley "--testcase-child-5",
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley /* Test for invalid logons. */
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley NULL, NULL, "non-existing-user", "wrong-password", &hProc), VERR_LOGON_FAILURE);
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley /* Test for invalid application. */
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley RTTESTI_CHECK_RC_RETV(RTProcCreateEx("non-existing-app", apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley NULL, NULL, NULL, NULL, &hProc), VERR_PATH_NOT_FOUND);
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley /* Test a (hopefully) valid user/password logon (given by parameters of this function). */
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley NULL, NULL, pszUser, pszPassword, &hProc), VINF_SUCCESS);
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
f058f9648463dcd77bdb74df14e9e53bad56518bBob Halleystatic int tstRTCreateProcEx4Child(int argc, char **argv)
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley for (int i = 0; i < argc; i++)
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley "child4: argv[%2u]='%s'\n"
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley "child4: expected='%s'\n",
7c9b885120f02ac6af10853684a2e8350d224639Bob Halleystatic void tstRTCreateProcEx4(void)
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley RTTESTI_CHECK_RC_RETV(RTProcCreateEx(g_szExecName, g_apszArgs4, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
f058f9648463dcd77bdb74df14e9e53bad56518bBob Halley RTPROCSTATUS ProcStatus = { -1, RTPROCEXITREASON_ABEND };
f058f9648463dcd77bdb74df14e9e53bad56518bBob Halley RTTESTI_CHECK_RC(RTProcWait(hProc, RTPROCWAIT_FLAGS_BLOCK, &ProcStatus), VINF_SUCCESS);
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley if (ProcStatus.enmReason != RTPROCEXITREASON_NORMAL || ProcStatus.iStatus != 0)
7c9b885120f02ac6af10853684a2e8350d224639Bob Halley RTTestIFailed("enmReason=%d iStatus=%d", ProcStatus.enmReason, ProcStatus.iStatus);
static void tstRTCreateProcEx3(void)
if (cbLeft == 0)
static int tstRTCreateProcEx2Child(void)
if (rc)
static void tstRTCreateProcEx2(void)
if (cbLeft == 0)
static int tstRTCreateProcEx1Child(void)
if (rc)
static void tstRTCreateProcEx1(void)
if (cbLeft == 0)
return tstRTCreateProcEx1Child();
return tstRTCreateProcEx2Child();
return tstRTCreateProcEx3Child();
if (rc)
return rc;
if (pszAsUser)