/* $Id$ */
/** @file
* IPRT Testcase - RTProcCreateEx.
*/
/*
* Copyright (C) 2010-2012 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* The contents of this file may alternatively be used under the terms
* of the Common Development and Distribution License Version 1.0
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the
* VirtualBox OSE distribution, in which case the provisions of the
* CDDL are applicable instead of those of the GPL.
*
* You may elect to license modified versions of this file under the
* terms and conditions of either the GPL or the CDDL or both.
*/
/*******************************************************************************
* Header Files *
*******************************************************************************/
#include <iprt/initterm.h>
#ifdef RT_OS_WINDOWS
# define SECURITY_WIN32
# include <windows.h>
# include <Security.h>
#endif
/*******************************************************************************
* Global Variables *
*******************************************************************************/
static const char * const g_apszArgs4[] =
{
/* 0 */ "non existing non executable file",
/* 1 */ "--testcase-child-4",
/* 2 */ "a b",
/* 3 */ " cdef",
/* 4 */ "ghijkl ",
/* 5 */ "\"",
/* 6 */ "\\",
/* 7 */ "\\\"",
/* 8 */ "\\\"\\",
/* 9 */ "\\\\\"\\",
/*10 */ "%TEMP%",
/*11 */ "%TEMP%\filename",
/*12 */ "%TEMP%postfix",
/*13 */ "Prefix%TEMP%postfix",
/*14 */ "%",
/*15 */ "%%",
/*16 */ "%%%",
/*17 */ "%X",
/*18 */ "%%X",
};
{
if (RT_FAILURE(rc))
return RTMsgInitFailure(rc);
#ifdef RT_OS_WINDOWS
/** @todo Does not yet handle ERROR_MORE_DATA for user names longer than 32767. */
{
return RTEXITCODE_FAILURE;
}
# if 0 /* Does not work on NT4 (yet). */
/* First try to figure out how much space for SID + domain name we need. */
NULL,
&cbSid,
NULL,
&cbDomain,
&sidUse);
if (!bRet)
{
if (dwErr != ERROR_INSUFFICIENT_BUFFER)
{
return RTEXITCODE_FAILURE;
}
}
/* Now try getting the real SID + domain name. */
pSid,
&cbSid,
&cbDomain,
&sidUse))
{
return RTEXITCODE_FAILURE;
}
# endif
#else
#endif
return RTEXITCODE_SUCCESS;
}
{
{
"test", /* user name */
"--testcase-child-5",
};
/* Test for invalid logons. */
/* Test for invalid application. */
RTTESTI_CHECK_RC_RETV(RTProcCreateEx("non-existing-app", apszArgs, RTENV_DEFAULT, 0 /*fFlags*/, NULL,
}
{
if (RT_FAILURE(rc))
return RTMsgInitFailure(rc);
int cErrors = 0;
for (int i = 0; i < argc; i++)
{
"child4: argv[%2u]='%s'\n"
"child4: expected='%s'\n",
i, argv[i], g_apszArgs4[i]);
cErrors++;
}
}
{
RTTestISub("Argument with spaces and stuff");
}
static int tstRTCreateProcEx3Child(void)
{
if (RT_FAILURE(rc))
return RTMsgInitFailure(rc);
return RTEXITCODE_SUCCESS;
}
{
RTTestISub("Standard Out+Err");
{
"non-existing-non-executable-file",
"--testcase-child-3",
};
for (;;)
{
RTTESTI_CHECK(cbLeft > 0);
if (cbLeft == 0)
break;
if (RT_FAILURE(rc))
{
break;
}
}
RTThreadSleep(10);
}
static int tstRTCreateProcEx2Child(void)
{
if (RT_FAILURE(rc))
return RTMsgInitFailure(rc);
return RTEXITCODE_SUCCESS;
}
{
RTTestISub("Standard Err");
{
"non-existing-non-executable-file",
"--testcase-child-2",
};
for (;;)
{
RTTESTI_CHECK(cbLeft > 0);
if (cbLeft == 0)
break;
if (RT_FAILURE(rc))
{
break;
}
}
RTThreadSleep(10);
}
static int tstRTCreateProcEx1Child(void)
{
if (RT_FAILURE(rc))
return RTMsgInitFailure(rc);
RTPrintf("it works");
return RTEXITCODE_SUCCESS;
}
{
RTTestISub("Standard Out");
{
"non-existing-non-executable-file",
"--testcase-child-1",
};
for (;;)
{
RTTESTI_CHECK(cbLeft > 0);
if (cbLeft == 0)
break;
if (RT_FAILURE(rc))
{
break;
}
}
}
{
return tstRTCreateProcEx1Child();
return tstRTCreateProcEx2Child();
return tstRTCreateProcEx3Child();
if (argc != 1)
{
return 99;
}
if (rc)
return rc;
/*
* The tests.
*/
if (pszAsUser)
/** @todo Cover files, ++ */
/*
* Summary.
*/
return RTTestSummaryAndDestroy(hTest);
}