test.cpp revision 9cabb72c6d6feb65e839ce50765643b98bb9a301
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * IPRT - Test Support
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Copyright (C) 2009 Sun Microsystems, Inc.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * available from http://www.virtualbox.org. This file is free software;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * you can redistribute it and/or modify it under the terms of the GNU
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * General Public License (GPL) as published by the Free Software
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * The contents of this file may alternatively be used under the terms
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * of the Common Development and Distribution License Version 1.0
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * VirtualBox OSE distribution, in which case the provisions of the
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * CDDL are applicable instead of those of the GPL.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * You may elect to license modified versions of this file under the
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * terms and conditions of either the GPL or the CDDL or both.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * additional information or have any questions.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/*******************************************************************************
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync* Header Files *
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync*******************************************************************************/
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/*******************************************************************************
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync* Structures and Typedefs *
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync*******************************************************************************/
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Guarded memory allocation record.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Pointer to the next record. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The address we return to the user. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The base address of the allocation. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The size of the allocation. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Guards. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The guard address. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The guard size. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** Pointer to an guarded memory allocation. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Test instance structure.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsynctypedef struct RTTESTINT
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Magic. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The number of errors. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The test name. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync const char *pszTest;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The length of the test name. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The size of a guard. Multiple of PAGE_SIZE. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Critical section seralizing access to the members following it. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The list of guarded memory allocations. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Critical section seralizing output. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** The output stream. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /** Whether we're currently at a newline. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** Pointer to a test instance. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/*******************************************************************************
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync* Defined Constants And Macros *
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync*******************************************************************************/
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** Validate a test instance. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync AssertReturn(pTest->u32Magic == RTTESTINT_MAGIC, VERR_INVALID_HANDLE); \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync } while (0)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** Gets and validates a test instance.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * If the handle is nil, we will try retrive it from the test TLS entry.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync AssertReturn(pTest->u32Magic == RTTESTINT_MAGIC, VERR_INVALID_MAGIC); \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync } while (0)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** Gets and validates a test instance.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * If the handle is nil, we will try retrive it from the test TLS entry.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync AssertReturn(pTest->u32Magic == RTTESTINT_MAGIC, (rc)); \
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync } while (0)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/*******************************************************************************
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync* Internal Functions *
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync*******************************************************************************/
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncstatic void rtTestGuardedFreeOne(PRTTESTGUARDEDMEM pMem);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/*******************************************************************************
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync* Global Variables *
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync*******************************************************************************/
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** For serializing TLS init. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync/** Our TLS entry. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Init TLS index once.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns IPRT status code.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pvUser1 Ignored.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pvUser2 Ignored.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncstatic DECLCALLBACK(int32_t) rtTestInitOnce(void *pvUser1, void *pvUser2)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Creates a test instance.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns IPRT status code.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pszTest The test name.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param phTest Where to store the test instance handle.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncRTR3DECL(int) RTTestCreate(const char *pszTest, PRTTEST phTest)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Global init.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync int rc = RTOnce(&g_TestInitOnce, rtTestInitOnce, NULL, NULL);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Create the instance.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync PRTTESTINT pTest = (PRTTESTINT)RTMemAllocZ(sizeof(*pTest));
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Associate it with our TLS entry unless there is already
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * an instance there.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /* bail out. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Destroys a test instance previously created by RTTestCreate.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns IPRT status code.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param hTest The test handle. NIL_RTTEST is ignored.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Clean up.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync ASMAtomicWriteU32(&pTest->u32Magic, ~RTTESTINT_MAGIC);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /* free guarded memory. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Allocate a block of guarded memory.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns IPRT status code.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param hTest The test handle. If NIL_RTTEST we'll use the one
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * associated with the calling thread.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param cb The amount of memory to allocate.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param cbAlign The alignment of the returned block.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param fHead Head or tail optimized guard.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param ppvUser Where to return the pointer to the block.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncRTR3DECL(int) RTTestGuardedAlloc(RTTEST hTest, size_t cb, uint32_t cbAlign, bool fHead, void **ppvUser)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync AssertReturn(cbAlign <= PAGE_SIZE, VERR_INVALID_PARAMETER);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync AssertReturn(cbAlign == (UINT32_C(1) << (ASMBitFirstSetU32(cbAlign) - 1)), VERR_INVALID_PARAMETER);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Allocate the record and block and initialize them.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync PRTTESTGUARDEDMEM pMem = (PRTTESTGUARDEDMEM)RTMemAlloc(sizeof(*pMem));
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync uint32_t const cbAligned = RT_ALIGN_Z(cb, PAGE_SIZE);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync pMem->aGuards[0].cb = pMem->aGuards[1].cb = pTest->cbGuard;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync pMem->cbAlloc = pMem->aGuards[0].cb + pMem->aGuards[1].cb + cbAligned;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync pMem->pvUser = (uint8_t *)pMem->pvAlloc + pMem->aGuards[0].cb;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync pMem->aGuards[1].pv = (uint8_t *)pMem->pvUser + cbAligned;
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Set up the guards and link the record.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync ASMMemFill32(pMem->aGuards[0].pv, pMem->aGuards[0].cb, 0xdeadbeef);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync ASMMemFill32(pMem->aGuards[1].pv, pMem->aGuards[1].cb, 0xdeadbeef);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync rc = RTMemProtect(pMem->aGuards[0].pv, pMem->aGuards[0].cb, RTMEM_PROT_NONE);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync rc = RTMemProtect(pMem->aGuards[1].pv, pMem->aGuards[1].cb, RTMEM_PROT_NONE);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTMemProtect(pMem->aGuards[0].pv, pMem->aGuards[0].cb, RTMEM_PROT_WRITE | RTMEM_PROT_READ);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Allocates a block of guarded memory where the guarded is immediately after
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * the user memory.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns Pointer to the allocated memory. NULL on failure.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param hTest The test handle. If NIL_RTTEST we'll use the one
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * associated with the calling thread.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param cb The amount of memory to allocate.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncRTR3DECL(void *) RTTestGuardedAllocTail(RTTEST hTest, size_t cb)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync int rc = RTTestGuardedAlloc(hTest, cb, 1, false /*fHead*/, &pvUser);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Allocates a block of guarded memory where the guarded is right in front of
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * the user memory.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns Pointer to the allocated memory. NULL on failure.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param hTest The test handle. If NIL_RTTEST we'll use the one
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * associated with the calling thread.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param cb The amount of memory to allocate.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncRTR3DECL(void *) RTTestGuardedAllocHead(RTTEST hTest, size_t cb)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync int rc = RTTestGuardedAlloc(hTest, cb, 1, true /*fHead*/, &pvUser);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Frees one block of guarded memory.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * The caller is responsible for unlinking it.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pMem The memory record.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncstatic void rtTestGuardedFreeOne(PRTTESTGUARDEDMEM pMem)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync rc = RTMemProtect(pMem->aGuards[0].pv, pMem->aGuards[0].cb, RTMEM_PROT_WRITE | RTMEM_PROT_READ); AssertRC(rc);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync rc = RTMemProtect(pMem->aGuards[1].pv, pMem->aGuards[1].cb, RTMEM_PROT_WRITE | RTMEM_PROT_READ); AssertRC(rc);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Frees a block of guarded memory.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns IPRT status code.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param hTest The test handle. If NIL_RTTEST we'll use the one
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * associated with the calling thread.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pv The memory. NULL is ignored.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncRTR3DECL(int) RTTestGuardedFree(RTTEST hTest, void *pv)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync for (PRTTESTGUARDEDMEM pMem = pTest->pGuardedMem; pMem; pMem = pMem->pNext)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Output callback.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns number of bytes written.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pvArg User argument.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pachChars Pointer to an array of utf-8 characters.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param cbChars Number of bytes in the character array pointed to by pachChars.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncstatic DECLCALLBACK(size_t) rtTestPrintfOutput(void *pvArg, const char *pachChars, size_t cbChars)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /* insert prefix if at a newline. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTStrmWrite(pTest->pOutStrm, pTest->pszTest, pTest->cchTest);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync /* look for newline and write the stuff. */
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync const char *pchEnd = (const char *)memchr(pachChars, '\n', cbChars);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Internal output worker.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Caller takes the lock.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns Number of chars printed.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pTest The test instance.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pszFormat The message.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param va The arguments.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncstatic int rtTestPrintfV(PRTTESTINT pTest, const char *pszFormat, va_list va)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync return RTStrFormatV(rtTestPrintfOutput, pTest, NULL, NULL, pszFormat, va);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Internal output worker.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Caller takes the lock.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns Number of chars printed.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pTest The test instance.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pszFormat The message.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param ... The arguments.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncstatic int rtTestPrintf(PRTTESTINT pTest, const char *pszFormat, ...)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Test vprintf making sure the output starts on a new line.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns Number of chars printed.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param hTest The test handle. If NIL_RTTEST we'll use the one
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * associated with the calling thread.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pszFormat The message.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param va Arguments.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncRTR3DECL(int) RTTestPrintfNlV(RTTEST hTest, const char *pszFormat, va_list va)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Test printf making sure the output starts on a new line.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns Number of chars printed.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param hTest The test handle. If NIL_RTTEST we'll use the one
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * associated with the calling thread.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pszFormat The message.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param ... Arguments.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncRTR3DECL(int) RTTestPrintfNl(RTTEST hTest, const char *pszFormat, ...)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Test vprintf, makes sure lines are prefixed and so forth.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns Number of chars printed.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param hTest The test handle. If NIL_RTTEST we'll use the one
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * associated with the calling thread.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pszFormat The message.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param va Arguments.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncRTR3DECL(int) RTTestPrintfV(RTTEST hTest, const char *pszFormat, va_list va)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Test printf, makes sure lines are prefixed and so forth.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns Number of chars printed.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param hTest The test handle. If NIL_RTTEST we'll use the one
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * associated with the calling thread.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pszFormat The message.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param ... Arguments.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncRTR3DECL(int) RTTestPrintf(RTTEST hTest, const char *pszFormat, ...)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Prints the test banner.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns Number of chars printed.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param hTest The test handle. If NIL_RTTEST we'll use the one
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * associated with the calling thread.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Summaries the test, destroys the test instance and return an exit code.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns Test program exit code.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param hTest The test handle. If NIL_RTTEST we'll use the one
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * associated with the calling thread.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTTestPrintfNl(hTest, "SUCCESS\n", pTest->cErrors);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync RTTestPrintfNl(hTest, "FAILURE - %u errors\n", pTest->cErrors);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Increments the error counter.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns IPRT status code.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param hTest The test handle. If NIL_RTTEST we'll use the one
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * associated with the calling thread.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Increments the error counter and prints a failure message.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns IPRT status code.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param hTest The test handle. If NIL_RTTEST we'll use the one
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * associated with the calling thread.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pszFormat The message. No trailing newline.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param va The arguments.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncRTR3DECL(int) RTTestFailedV(RTTEST hTest, const char *pszFormat, va_list va)
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync int cch = rtTestPrintf(pTest, "FAILED - %N\n", pszFormat, &va2);
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * Increments the error counter and prints a failure message.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @returns IPRT status code.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param hTest The test handle. If NIL_RTTEST we'll use the one
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * associated with the calling thread.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param pszFormat The message. No trailing newline.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsync * @param ... The arguments.
9cabb72c6d6feb65e839ce50765643b98bb9a301vboxsyncRTR3DECL(int) RTTestFailed(RTTEST hTest, const char *pszFormat, ...)