tstVD.cpp revision 2f0d866e126dd288169fed591c259c1c6b4016e5
4c221b0da1816acf2ca302b10092df059484468dvboxsync * Simple VBox HDD container test utility.
4c221b0da1816acf2ca302b10092df059484468dvboxsync * Copyright (C) 2006-2007 Oracle Corporation
4c221b0da1816acf2ca302b10092df059484468dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
4c221b0da1816acf2ca302b10092df059484468dvboxsync * available from http://www.virtualbox.org. This file is free software;
4c221b0da1816acf2ca302b10092df059484468dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
4c221b0da1816acf2ca302b10092df059484468dvboxsync * General Public License (GPL) as published by the Free Software
4c221b0da1816acf2ca302b10092df059484468dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
4c221b0da1816acf2ca302b10092df059484468dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4c221b0da1816acf2ca302b10092df059484468dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4c221b0da1816acf2ca302b10092df059484468dvboxsync/*******************************************************************************
4c221b0da1816acf2ca302b10092df059484468dvboxsync* Header Files *
4c221b0da1816acf2ca302b10092df059484468dvboxsync*******************************************************************************/
4c221b0da1816acf2ca302b10092df059484468dvboxsync/*******************************************************************************
4c221b0da1816acf2ca302b10092df059484468dvboxsync* Global Variables *
4c221b0da1816acf2ca302b10092df059484468dvboxsync*******************************************************************************/
4c221b0da1816acf2ca302b10092df059484468dvboxsync/** The error count. */
4c221b0da1816acf2ca302b10092df059484468dvboxsyncstatic void tstVDError(void *pvUser, int rc, RT_SRC_POS_DECL,
4c221b0da1816acf2ca302b10092df059484468dvboxsync RTPrintf("tstVD: Error %Rrc at %s:%u (%s): ", rc, RT_SRC_POS_ARGS);
4c221b0da1816acf2ca302b10092df059484468dvboxsyncstatic int tstVDMessage(void *pvUser, const char *pszFormat, ...)
4c221b0da1816acf2ca302b10092df059484468dvboxsyncstatic int tstVDCreateDelete(const char *pszBackend, const char *pszFilename,
4c221b0da1816acf2ca302b10092df059484468dvboxsync } while (0)
if (fDelete)
return VERR_INTERNAL_ERROR;
int rc;
return rc; \
return VERR_INTERNAL_ERROR;
#define RTDECL(x) static x
struct RndCtx
uint64_t x;
uint64_t y;
uint64_t z;
uint64_t w;
uint64_t c;
if (u32Seed == 0)
if (u32Seed == 0)
return VINF_SUCCESS;
uint64_t t;
struct Segment
static void generateRandomSegments(PRNDCTX pCtx, PSEGMENT pSegment, uint32_t nSegments, uint32_t u32MaxSegmentSize, uint64_t u64DiskSize, uint32_t u32SectorSize, uint8_t u8ValueLow, uint8_t u8ValueHigh)
uint32_t i;
for (i = 0; i < nSegments; i++)
bool fDuplicateFound;
fDuplicateFound = false;
for (uint32_t j = 0; j < i; j++)
fDuplicateFound = true;
} while (fDuplicateFound);
for (i = 0; i < nSegments; i++)
pSegment[i].u32Length = RTPRandU32Ex(pCtx, 1, RT_MIN(pSegment[i+1].u64Offset - pSegment[i].u64Offset,
static void mergeSegments(PSEGMENT pBaseSegment, PSEGMENT pDiffSegment, PSEGMENT pMergeSegment, uint32_t u32MaxLength)
pBaseSegment++;
pBaseSegment->u32Length -= pDiffSegment->u64Offset + pDiffSegment->u32Length - pBaseSegment->u64Offset;
pBaseSegment++;
pDiffSegment++;
if (pBaseSegment->u64Offset + pBaseSegment->u32Length > pDiffSegment->u64Offset + pDiffSegment->u32Length)
pBaseSegment->u32Length -= pDiffSegment->u64Offset + pDiffSegment->u32Length - pBaseSegment->u64Offset;
pDiffSegment++;
pBaseSegment++;
pSegment++;
return rc;
return VERR_INTERNAL_ERROR;
pSegment++;
return VINF_SUCCESS;
const char *pszBaseFilename,
const char *pszDiffFilename,
int rc;
char *pszFormat;
if (pvBuf) \
return rc; \
NULL);
generateRandomSegments(&ctx, paDiffSegments, nSegments, _1M, u64DiskSize, u32SectorSize, 128u, 255u);
RTPrintf("off: %08Lx len: %05x val: %02x\n", pSegment->u64Offset, pSegment->u32Length, pSegment->u8Value);*/
RTPrintf("off: %08Lx len: %05x val: %02x\n", pSegment->u64Offset, pSegment->u32Length, pSegment->u8Value);*/
RTPrintf("off: %08Lx len: %05x val: %02x\n", pSegment->u64Offset, pSegment->u32Length, pSegment->u8Value);*/
if (pvBuf)
const char *pszFilename,
int rc;
if (pvBuf) \
return rc; \
RTPrintf("off: %08Lx len: %05x val: %02x\n", pSegment->u64Offset, pSegment->u32Length, pSegment->u8Value);*/
if (pvBuf)
int rc;
return rc; \
return rc;
return rc;
return rc; \
return rc;
static void tstVmdk()
RTPrintf("tstVD: VMDK rename (single extent, embedded descriptor, same dir) test failed! rc=%Rrc\n", rc);
g_cErrors++;
RTPrintf("tstVD: VMDK rename (multiple extent, separate descriptor, same dir) test failed! rc=%Rrc\n", rc);
g_cErrors++;
RTPrintf("tstVD: VMDK rename (single extent, embedded descriptor, another dir) test failed! rc=%Rrc\n", rc);
g_cErrors++;
RTPrintf("tstVD: VMDK rename (multiple extent, separate descriptor, another dir) test failed! rc=%Rrc\n", rc);
g_cErrors++;
RTPrintf("tstVD: VMDK rename (multiple extent, separate descriptor, another dir, already exists) test failed!\n");
g_cErrors++;
RTR3Init();
int rc;
g_cErrors++;
#ifdef VMDK_TEST
VD_IMAGE_FLAGS_NONE, true);
g_cErrors++;
VD_IMAGE_FLAGS_NONE, false);
g_cErrors++;
g_cErrors++;
tstVmdk();
#ifdef VDI_TEST
VD_IMAGE_FLAGS_NONE, true);
g_cErrors++;
VD_IMAGE_FLAGS_NONE, true);
g_cErrors++;
#ifdef VMDK_TEST
VD_IMAGE_FLAGS_NONE, true);
g_cErrors++;
VD_VMDK_IMAGE_FLAGS_SPLIT_2G, true);
g_cErrors++;
VD_IMAGE_FLAGS_FIXED, true);
g_cErrors++;
g_cErrors++;
#ifdef VHD_TEST
VD_IMAGE_FLAGS_NONE, true);
g_cErrors++;
VD_IMAGE_FLAGS_FIXED, true);
g_cErrors++;
#ifdef VDI_TEST
g_cErrors++;
g_cErrors++;
#ifdef VMDK_TEST
g_cErrors++;
g_cErrors++;
#ifdef VHD_TEST
g_cErrors++;
g_cErrors++;
g_cErrors++;
if (!g_cErrors)
return !!g_cErrors;