summaryrefslogtreecommitdiff
path: root/src/VBox/Storage/testcase/tstVDIo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/Storage/testcase/tstVDIo.cpp')
-rw-r--r--src/VBox/Storage/testcase/tstVDIo.cpp1860
1 files changed, 456 insertions, 1404 deletions
diff --git a/src/VBox/Storage/testcase/tstVDIo.cpp b/src/VBox/Storage/testcase/tstVDIo.cpp
index d492c50a..9422f477 100644
--- a/src/VBox/Storage/testcase/tstVDIo.cpp
+++ b/src/VBox/Storage/testcase/tstVDIo.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (C) 2011 Oracle Corporation
+ * Copyright (C) 2011-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -34,9 +34,11 @@
#include <iprt/critsect.h>
#include "VDMemDisk.h"
-#include "VDIoBackendMem.h"
+#include "VDIoBackend.h"
#include "VDIoRnd.h"
+#include "VDScript.h"
+
/**
* A virtual file backed by memory.
*/
@@ -46,8 +48,8 @@ typedef struct VDFILE
RTLISTNODE Node;
/** Name of the file. */
char *pszName;
- /** Memory file baking the file. */
- PVDMEMDISK pMemDisk;
+ /** Storage backing the file. */
+ PVDIOSTORAGE pIoStorage;
/** Flag whether the file is read locked. */
bool fReadLock;
/** Flag whether the file is write locked. */
@@ -124,8 +126,8 @@ typedef struct VDTESTGLOB
RTLISTNODE ListFiles;
/** Head of the pattern list. */
RTLISTNODE ListPatterns;
- /** Memory I/O backend. */
- PVDIOBACKENDMEM pIoBackend;
+ /** I/O backend, common data. */
+ PVDIOBACKEND pIoBackend;
/** Error interface. */
VDINTERFACEERROR VDIfError;
/** Pointer to the per disk interface list. */
@@ -136,6 +138,8 @@ typedef struct VDTESTGLOB
PVDINTERFACE pInterfacesImages;
/** I/O RNG handle. */
PVDIORND pIoRnd;
+ /** Current storage backend to use. */
+ char *pszIoBackend;
} VDTESTGLOB, *PVDTESTGLOB;
/**
@@ -213,369 +217,279 @@ typedef struct VDIOTEST
} u;
} VDIOTEST, *PVDIOTEST;
-/**
- * Argument types.
- */
-typedef enum VDSCRIPTARGTYPE
-{
- /** Argument is a string. */
- VDSCRIPTARGTYPE_STRING = 0,
- /** Argument is a 64bit unsigned number. */
- VDSCRIPTARGTYPE_UNSIGNED_NUMBER,
- /** Argument is a 64bit signed number. */
- VDSCRIPTARGTYPE_SIGNED_NUMBER,
- /** Arugment is a unsigned 64bit range */
- VDSCRIPTARGTYPE_UNSIGNED_RANGE,
- /** Arugment is a boolean. */
- VDSCRIPTARGTYPE_BOOL
-} VDSCRIPTARGTYPE;
-
-/**
- * Script argument.
- */
-typedef struct VDSCRIPTARG
-{
- /** Argument identifier. */
- char chId;
- /** Type of the argument. */
- VDSCRIPTARGTYPE enmType;
- /** Type depndent data. */
- union
- {
- /** String. */
- const char *pcszString;
- /** Bool. */
- bool fFlag;
- /** unsigned number. */
- uint64_t u64;
- /** Signed number. */
- int64_t i64;
- /** Unsigned range. */
- struct
- {
- uint64_t Start;
- uint64_t End;
- } Range;
- } u;
-} VDSCRIPTARG, *PVDSCRIPTARG;
-
-/** Script action handler. */
-typedef DECLCALLBACK(int) FNVDSCRIPTACTION(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-/** Pointer to a script action handler. */
-typedef FNVDSCRIPTACTION *PFNVDSCRIPTACTION;
-
-/**
- * Script argument descriptor.
- */
-typedef struct VDSCRIPTARGDESC
-{
- /** Name of the arugment. */
- const char *pcszName;
- /** Identifier for the argument. */
- char chId;
- /** Type of the argument. */
- VDSCRIPTARGTYPE enmType;
- /** Flags */
- uint32_t fFlags;
-} VDSCRIPTARGDESC, *PVDSCRIPTARGDESC;
-/** Pointer to a const script argument descriptor. */
-typedef const VDSCRIPTARGDESC *PCVDSCRIPTARGDESC;
-
-/** Flag whether the argument is mandatory. */
-#define VDSCRIPTARGDESC_FLAG_MANDATORY RT_BIT(0)
-/** Flag whether the number can have a size suffix (K|M|G) */
-#define VDSCRIPTARGDESC_FLAG_SIZE_SUFFIX RT_BIT(1)
-
-/**
- * Script action.
- */
-typedef struct VDSCRIPTACTION
-{
- /** Action name. */
- const char *pcszAction;
- /** Pointer to the arguments. */
- const PCVDSCRIPTARGDESC paArgDesc;
- /** Number of arugments in the array. */
- unsigned cArgDescs;
- /** Pointer to the action handler. */
- PFNVDSCRIPTACTION pfnHandler;
-} VDSCRIPTACTION, *PVDSCRIPTACTION;
-
-typedef const VDSCRIPTACTION *PCVDSCRIPTACTION;
-
-static DECLCALLBACK(int) vdScriptHandlerCreate(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerOpen(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerIo(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerFlush(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerMerge(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerCompact(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerDiscard(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerCopy(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerClose(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerPrintFileSize(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerIoLogReplay(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerIoRngCreate(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerIoRngDestroy(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerIoPatternCreateFromNumber(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerIoPatternCreateFromFile(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerIoPatternDestroy(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerSleep(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerDumpFile(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerCreateDisk(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerDestroyDisk(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerCompareDisks(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerDumpDiskInfo(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerPrintMsg(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerShowStatistics(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
-static DECLCALLBACK(int) vdScriptHandlerResetStatistics(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs);
+static DECLCALLBACK(int) vdScriptHandlerCreate(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerOpen(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerIo(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerFlush(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerMerge(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerCompact(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerDiscard(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerCopy(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerClose(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerPrintFileSize(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerIoLogReplay(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerIoRngCreate(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerIoRngDestroy(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerIoPatternCreateFromNumber(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerIoPatternCreateFromFile(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerIoPatternDestroy(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerSleep(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerDumpFile(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerCreateDisk(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerDestroyDisk(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerCompareDisks(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerDumpDiskInfo(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerPrintMsg(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerShowStatistics(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerResetStatistics(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerResize(PVDSCRIPTARG paScriptArgs, void *pvUser);
+static DECLCALLBACK(int) vdScriptHandlerSetFileBackend(PVDSCRIPTARG paScriptArgs, void *pvUser);
/* create action */
-const VDSCRIPTARGDESC g_aArgCreate[] =
-{
- /* pcszName chId enmType fFlags */
- {"disk", 'd', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"mode", 'm', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"name", 'n', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"type", 't', VDSCRIPTARGTYPE_STRING, 0},
- {"backend", 'b', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"size", 's', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, VDSCRIPTARGDESC_FLAG_MANDATORY | VDSCRIPTARGDESC_FLAG_SIZE_SUFFIX},
- {"ignoreflush", 'f', VDSCRIPTARGTYPE_BOOL, 0}
+const VDSCRIPTTYPE g_aArgCreate[] =
+{
+ VDSCRIPTTYPE_STRING,
+ VDSCRIPTTYPE_STRING,
+ VDSCRIPTTYPE_STRING,
+ VDSCRIPTTYPE_STRING,
+ VDSCRIPTTYPE_STRING,
+ VDSCRIPTTYPE_UINT64,
+ VDSCRIPTTYPE_BOOL
};
/* open action */
-const VDSCRIPTARGDESC g_aArgOpen[] =
-{
- /* pcszName chId enmType fFlags */
- {"disk", 'd', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"name", 'n', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"backend", 'b', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"async", 'a', VDSCRIPTARGTYPE_BOOL, 0},
- {"shareable", 's', VDSCRIPTARGTYPE_BOOL, 0},
- {"readonly", 'r', VDSCRIPTARGTYPE_BOOL, 0},
- {"discard", 'i', VDSCRIPTARGTYPE_BOOL, 0},
- {"ignoreflush", 'f', VDSCRIPTARGTYPE_BOOL, 0},
+const VDSCRIPTTYPE g_aArgOpen[] =
+{
+ VDSCRIPTTYPE_STRING, /* disk */
+ VDSCRIPTTYPE_STRING, /* name */
+ VDSCRIPTTYPE_STRING, /* backend */
+ VDSCRIPTTYPE_BOOL, /* async */
+ VDSCRIPTTYPE_BOOL, /* shareable */
+ VDSCRIPTTYPE_BOOL, /* readonly */
+ VDSCRIPTTYPE_BOOL, /* discard */
+ VDSCRIPTTYPE_BOOL /* ignoreflush */
};
/* I/O action */
-const VDSCRIPTARGDESC g_aArgIo[] =
-{
- /* pcszName chId enmType fFlags */
- {"disk", 'd', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"async", 'a', VDSCRIPTARGTYPE_BOOL, 0},
- {"max-reqs", 'l', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, 0},
- {"mode", 'm', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"size", 's', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, VDSCRIPTARGDESC_FLAG_SIZE_SUFFIX},
- {"blocksize", 'b', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, VDSCRIPTARGDESC_FLAG_MANDATORY | VDSCRIPTARGDESC_FLAG_SIZE_SUFFIX},
- {"off", 'o', VDSCRIPTARGTYPE_UNSIGNED_RANGE, VDSCRIPTARGDESC_FLAG_SIZE_SUFFIX},
- {"writes", 'w', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"pattern", 'p', VDSCRIPTARGTYPE_STRING, 0},
+const VDSCRIPTTYPE g_aArgIo[] =
+{
+ VDSCRIPTTYPE_STRING, /* disk */
+ VDSCRIPTTYPE_BOOL, /* async */
+ VDSCRIPTTYPE_UINT32, /* max-reqs */
+ VDSCRIPTTYPE_STRING, /* mode */
+ VDSCRIPTTYPE_UINT64, /* size */
+ VDSCRIPTTYPE_UINT64, /* blocksize */
+ VDSCRIPTTYPE_UINT64, /* offStart */
+ VDSCRIPTTYPE_UINT64, /* offEnd */
+ VDSCRIPTTYPE_UINT32, /* writes */
+ VDSCRIPTTYPE_STRING /* pattern */
};
/* flush action */
-const VDSCRIPTARGDESC g_aArgFlush[] =
+const VDSCRIPTTYPE g_aArgFlush[] =
{
- /* pcszName chId enmType fFlags */
- {"disk", 'd', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"async", 'a', VDSCRIPTARGTYPE_BOOL, 0}
+ VDSCRIPTTYPE_STRING, /* disk */
+ VDSCRIPTTYPE_BOOL /* async */
};
/* merge action */
-const VDSCRIPTARGDESC g_aArgMerge[] =
+const VDSCRIPTTYPE g_aArgMerge[] =
{
- /* pcszName chId enmType fFlags */
- {"disk", 'd', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"from", 'f', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"to", 't', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, VDSCRIPTARGDESC_FLAG_MANDATORY},
+ VDSCRIPTTYPE_STRING, /* disk */
+ VDSCRIPTTYPE_UINT32, /* from */
+ VDSCRIPTTYPE_UINT32 /* to */
};
/* Compact a disk */
-const VDSCRIPTARGDESC g_aArgCompact[] =
+const VDSCRIPTTYPE g_aArgCompact[] =
{
- /* pcszName chId enmType fFlags */
- {"disk", 'd', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"image", 'i', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, VDSCRIPTARGDESC_FLAG_MANDATORY},
+ VDSCRIPTTYPE_STRING, /* disk */
+ VDSCRIPTTYPE_UINT32 /* image */
};
/* Discard a part of a disk */
-const VDSCRIPTARGDESC g_aArgDiscard[] =
+const VDSCRIPTTYPE g_aArgDiscard[] =
{
- /* pcszName chId enmType fFlags */
- {"disk", 'd', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"async", 'a', VDSCRIPTARGTYPE_BOOL, 0},
- {"ranges", 'r', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY}
+ VDSCRIPTTYPE_STRING, /* disk */
+ VDSCRIPTTYPE_BOOL, /* async */
+ VDSCRIPTTYPE_STRING /* ranges */
};
/* Compact a disk */
-const VDSCRIPTARGDESC g_aArgCopy[] =
-{
- /* pcszName chId enmType fFlags */
- {"diskfrom", 's', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"diskto", 'd', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"imagefrom", 'i', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"backend", 'b', VDSCRIPTARGTYPE_STRING, 0},
- {"filename", 'f', VDSCRIPTARGTYPE_STRING, 0},
- {"movebyrename", 'm', VDSCRIPTARGTYPE_BOOL, 0},
- {"size", 'z', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, 0},
- {"fromsame", 'o', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, 0},
- {"tosame", 't', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, 0}
+const VDSCRIPTTYPE g_aArgCopy[] =
+{
+ VDSCRIPTTYPE_STRING, /* diskfrom */
+ VDSCRIPTTYPE_STRING, /* diskto */
+ VDSCRIPTTYPE_UINT32, /* imagefrom */
+ VDSCRIPTTYPE_STRING, /* backend */
+ VDSCRIPTTYPE_STRING, /* filename */
+ VDSCRIPTTYPE_BOOL, /* movebyrename */
+ VDSCRIPTTYPE_UINT64, /* size */
+ VDSCRIPTTYPE_UINT32, /* fromsame */
+ VDSCRIPTTYPE_UINT32 /* tosame */
};
/* close action */
-const VDSCRIPTARGDESC g_aArgClose[] =
+const VDSCRIPTTYPE g_aArgClose[] =
{
- /* pcszName chId enmType fFlags */
- {"disk", 'd', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"mode", 'm', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"delete", 'r', VDSCRIPTARGTYPE_BOOL, VDSCRIPTARGDESC_FLAG_MANDATORY}
+ VDSCRIPTTYPE_STRING, /* disk */
+ VDSCRIPTTYPE_STRING, /* mode */
+ VDSCRIPTTYPE_BOOL /* delete */
};
/* print file size action */
-const VDSCRIPTARGDESC g_aArgPrintFileSize[] =
+const VDSCRIPTTYPE g_aArgPrintFileSize[] =
{
- /* pcszName chId enmType fFlags */
- {"disk", 'd', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"image", 'i', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, VDSCRIPTARGDESC_FLAG_MANDATORY}
+ VDSCRIPTTYPE_STRING, /* disk */
+ VDSCRIPTTYPE_UINT32 /* image */
};
/* print file size action */
-const VDSCRIPTARGDESC g_aArgIoLogReplay[] =
+const VDSCRIPTTYPE g_aArgIoLogReplay[] =
{
- /* pcszName chId enmType fFlags */
- {"disk", 'd', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"iolog", 'i', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY}
+ VDSCRIPTTYPE_STRING, /* disk */
+ VDSCRIPTTYPE_STRING /* iolog */
};
/* I/O RNG create action */
-const VDSCRIPTARGDESC g_aArgIoRngCreate[] =
+const VDSCRIPTTYPE g_aArgIoRngCreate[] =
{
- /* pcszName chId enmType fFlags */
- {"size", 'd', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, VDSCRIPTARGDESC_FLAG_MANDATORY | VDSCRIPTARGDESC_FLAG_SIZE_SUFFIX},
- {"mode", 'm', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"seed", 's', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, 0}
+ VDSCRIPTTYPE_UINT32, /* size */
+ VDSCRIPTTYPE_STRING, /* mode */
+ VDSCRIPTTYPE_UINT32, /* seed */
};
/* I/O pattern create action */
-const VDSCRIPTARGDESC g_aArgIoPatternCreateFromNumber[] =
+const VDSCRIPTTYPE g_aArgIoPatternCreateFromNumber[] =
{
- /* pcszName chId enmType fFlags */
- {"name", 'n', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"size", 's', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, VDSCRIPTARGDESC_FLAG_MANDATORY | VDSCRIPTARGDESC_FLAG_SIZE_SUFFIX},
- {"pattern", 'p', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, VDSCRIPTARGDESC_FLAG_MANDATORY},
+ VDSCRIPTTYPE_STRING, /* name */
+ VDSCRIPTTYPE_UINT32, /* size */
+ VDSCRIPTTYPE_UINT32 /* pattern */
};
/* I/O pattern create action */
-const VDSCRIPTARGDESC g_aArgIoPatternCreateFromFile[] =
+const VDSCRIPTTYPE g_aArgIoPatternCreateFromFile[] =
{
- /* pcszName chId enmType fFlags */
- {"name", 'n', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"file", 'f', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
+ VDSCRIPTTYPE_STRING, /* name */
+ VDSCRIPTTYPE_STRING /* file */
};
/* I/O pattern destroy action */
-const VDSCRIPTARGDESC g_aArgIoPatternDestroy[] =
+const VDSCRIPTTYPE g_aArgIoPatternDestroy[] =
{
- /* pcszName chId enmType fFlags */
- {"name", 'n', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY}
+ VDSCRIPTTYPE_STRING /* name */
};
/* Sleep */
-const VDSCRIPTARGDESC g_aArgSleep[] =
+const VDSCRIPTTYPE g_aArgSleep[] =
{
- /* pcszName chId enmType fFlags */
- {"time", 't', VDSCRIPTARGTYPE_UNSIGNED_NUMBER, VDSCRIPTARGDESC_FLAG_MANDATORY}
+ VDSCRIPTTYPE_UINT32 /* time */
};
/* Dump memory file */
-const VDSCRIPTARGDESC g_aArgDumpFile[] =
+const VDSCRIPTTYPE g_aArgDumpFile[] =
{
- /* pcszName chId enmType fFlags */
- {"file", 'f', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"path", 'p', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY}
+ VDSCRIPTTYPE_STRING, /* file */
+ VDSCRIPTTYPE_STRING /* path */
};
/* Create virtual disk handle */
-const VDSCRIPTARGDESC g_aArgCreateDisk[] =
+const VDSCRIPTTYPE g_aArgCreateDisk[] =
{
- /* pcszName chId enmType fFlags */
- {"name", 'n', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"verify", 'v', VDSCRIPTARGTYPE_BOOL, 0}
+ VDSCRIPTTYPE_STRING, /* name */
+ VDSCRIPTTYPE_BOOL /* verify */
};
/* Create virtual disk handle */
-const VDSCRIPTARGDESC g_aArgDestroyDisk[] =
+const VDSCRIPTTYPE g_aArgDestroyDisk[] =
{
- /* pcszName chId enmType fFlags */
- {"name", 'n', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY}
+ VDSCRIPTTYPE_STRING /* name */
};
/* Compare virtual disks */
-const VDSCRIPTARGDESC g_aArgCompareDisks[] =
+const VDSCRIPTTYPE g_aArgCompareDisks[] =
{
- /* pcszName chId enmType fFlags */
- {"disk1", '1', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
- {"disk2", '2', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY}
+ VDSCRIPTTYPE_STRING, /* disk1 */
+ VDSCRIPTTYPE_STRING /* disk2 */
};
/* Dump disk info */
-const VDSCRIPTARGDESC g_aArgDumpDiskInfo[] =
+const VDSCRIPTTYPE g_aArgDumpDiskInfo[] =
{
- /* pcszName chId enmType fFlags */
- {"disk", 'd', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
+ VDSCRIPTTYPE_STRING /* disk */
};
/* Print message */
-const VDSCRIPTARGDESC g_aArgPrintMsg[] =
+const VDSCRIPTTYPE g_aArgPrintMsg[] =
{
- /* pcszName chId enmType fFlags */
- {"msg", 'm', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
+ VDSCRIPTTYPE_STRING /* msg */
};
/* Show statistics */
-const VDSCRIPTARGDESC g_aArgShowStatistics[] =
+const VDSCRIPTTYPE g_aArgShowStatistics[] =
{
- /* pcszName chId enmType fFlags */
- {"file", 'f', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
+ VDSCRIPTTYPE_STRING /* file */
};
/* Reset statistics */
-const VDSCRIPTARGDESC g_aArgResetStatistics[] =
+const VDSCRIPTTYPE g_aArgResetStatistics[] =
{
- /* pcszName chId enmType fFlags */
- {"file", 'f', VDSCRIPTARGTYPE_STRING, VDSCRIPTARGDESC_FLAG_MANDATORY},
+ VDSCRIPTTYPE_STRING /* file */
};
-const VDSCRIPTACTION g_aScriptActions[] =
-{
- /* pcszAction paArgDesc cArgDescs pfnHandler */
- {"create", g_aArgCreate, RT_ELEMENTS(g_aArgCreate), vdScriptHandlerCreate},
- {"open", g_aArgOpen, RT_ELEMENTS(g_aArgOpen), vdScriptHandlerOpen},
- {"io", g_aArgIo, RT_ELEMENTS(g_aArgIo), vdScriptHandlerIo},
- {"flush", g_aArgFlush, RT_ELEMENTS(g_aArgFlush), vdScriptHandlerFlush},
- {"close", g_aArgClose, RT_ELEMENTS(g_aArgClose), vdScriptHandlerClose},
- {"printfilesize", g_aArgPrintFileSize, RT_ELEMENTS(g_aArgPrintFileSize), vdScriptHandlerPrintFileSize},
- {"ioreplay", g_aArgIoLogReplay, RT_ELEMENTS(g_aArgIoLogReplay), vdScriptHandlerIoLogReplay},
- {"merge", g_aArgMerge, RT_ELEMENTS(g_aArgMerge), vdScriptHandlerMerge},
- {"compact", g_aArgCompact, RT_ELEMENTS(g_aArgCompact), vdScriptHandlerCompact},
- {"discard", g_aArgDiscard, RT_ELEMENTS(g_aArgDiscard), vdScriptHandlerDiscard},
- {"copy", g_aArgCopy, RT_ELEMENTS(g_aArgCopy), vdScriptHandlerCopy},
- {"iorngcreate", g_aArgIoRngCreate, RT_ELEMENTS(g_aArgIoRngCreate), vdScriptHandlerIoRngCreate},
- {"iorngdestroy", NULL, 0, vdScriptHandlerIoRngDestroy},
- {"iopatterncreatefromnumber", g_aArgIoPatternCreateFromNumber, RT_ELEMENTS(g_aArgIoPatternCreateFromNumber), vdScriptHandlerIoPatternCreateFromNumber},
- {"iopatterncreatefromfile", g_aArgIoPatternCreateFromFile, RT_ELEMENTS(g_aArgIoPatternCreateFromFile), vdScriptHandlerIoPatternCreateFromFile},
- {"iopatterndestroy", g_aArgIoPatternDestroy, RT_ELEMENTS(g_aArgIoPatternDestroy), vdScriptHandlerIoPatternDestroy},
- {"sleep", g_aArgSleep, RT_ELEMENTS(g_aArgSleep), vdScriptHandlerSleep},
- {"dumpfile", g_aArgDumpFile, RT_ELEMENTS(g_aArgDumpFile), vdScriptHandlerDumpFile},
- {"createdisk", g_aArgCreateDisk, RT_ELEMENTS(g_aArgCreateDisk), vdScriptHandlerCreateDisk},
- {"destroydisk", g_aArgDestroyDisk, RT_ELEMENTS(g_aArgDestroyDisk), vdScriptHandlerDestroyDisk},
- {"comparedisks", g_aArgCompareDisks, RT_ELEMENTS(g_aArgCompareDisks), vdScriptHandlerCompareDisks},
- {"dumpdiskinfo", g_aArgDumpDiskInfo, RT_ELEMENTS(g_aArgDumpDiskInfo), vdScriptHandlerDumpDiskInfo},
- {"print", g_aArgPrintMsg, RT_ELEMENTS(g_aArgPrintMsg), vdScriptHandlerPrintMsg},
- {"showstatistics", g_aArgShowStatistics, RT_ELEMENTS(g_aArgShowStatistics), vdScriptHandlerShowStatistics},
- {"resetstatistics", g_aArgResetStatistics, RT_ELEMENTS(g_aArgResetStatistics), vdScriptHandlerResetStatistics}
+/* Resize disk. */
+const VDSCRIPTTYPE g_aArgResize[] =
+{
+ VDSCRIPTTYPE_STRING, /* disk */
+ VDSCRIPTTYPE_UINT64 /* size */
+};
+
+/* Set file backend. */
+const VDSCRIPTTYPE g_aArgSetFileBackend[] =
+{
+ VDSCRIPTTYPE_STRING /* new file backend */
+};
+
+const VDSCRIPTCALLBACK g_aScriptActions[] =
+{
+ /* pcszFnName enmTypeReturn paArgDesc cArgDescs pfnHandler */
+ {"create", VDSCRIPTTYPE_VOID, g_aArgCreate, RT_ELEMENTS(g_aArgCreate), vdScriptHandlerCreate},
+ {"open", VDSCRIPTTYPE_VOID, g_aArgOpen, RT_ELEMENTS(g_aArgOpen), vdScriptHandlerOpen},
+ {"io", VDSCRIPTTYPE_VOID, g_aArgIo, RT_ELEMENTS(g_aArgIo), vdScriptHandlerIo},
+ {"flush", VDSCRIPTTYPE_VOID, g_aArgFlush, RT_ELEMENTS(g_aArgFlush), vdScriptHandlerFlush},
+ {"close", VDSCRIPTTYPE_VOID, g_aArgClose, RT_ELEMENTS(g_aArgClose), vdScriptHandlerClose},
+ {"printfilesize", VDSCRIPTTYPE_VOID, g_aArgPrintFileSize, RT_ELEMENTS(g_aArgPrintFileSize), vdScriptHandlerPrintFileSize},
+ {"ioreplay", VDSCRIPTTYPE_VOID, g_aArgIoLogReplay, RT_ELEMENTS(g_aArgIoLogReplay), vdScriptHandlerIoLogReplay},
+ {"merge", VDSCRIPTTYPE_VOID, g_aArgMerge, RT_ELEMENTS(g_aArgMerge), vdScriptHandlerMerge},
+ {"compact", VDSCRIPTTYPE_VOID, g_aArgCompact, RT_ELEMENTS(g_aArgCompact), vdScriptHandlerCompact},
+ {"discard", VDSCRIPTTYPE_VOID, g_aArgDiscard, RT_ELEMENTS(g_aArgDiscard), vdScriptHandlerDiscard},
+ {"copy", VDSCRIPTTYPE_VOID, g_aArgCopy, RT_ELEMENTS(g_aArgCopy), vdScriptHandlerCopy},
+ {"iorngcreate", VDSCRIPTTYPE_VOID, g_aArgIoRngCreate, RT_ELEMENTS(g_aArgIoRngCreate), vdScriptHandlerIoRngCreate},
+ {"iorngdestroy", VDSCRIPTTYPE_VOID, NULL, 0, vdScriptHandlerIoRngDestroy},
+ {"iopatterncreatefromnumber", VDSCRIPTTYPE_VOID, g_aArgIoPatternCreateFromNumber, RT_ELEMENTS(g_aArgIoPatternCreateFromNumber), vdScriptHandlerIoPatternCreateFromNumber},
+ {"iopatterncreatefromfile", VDSCRIPTTYPE_VOID, g_aArgIoPatternCreateFromFile, RT_ELEMENTS(g_aArgIoPatternCreateFromFile), vdScriptHandlerIoPatternCreateFromFile},
+ {"iopatterndestroy", VDSCRIPTTYPE_VOID, g_aArgIoPatternDestroy, RT_ELEMENTS(g_aArgIoPatternDestroy), vdScriptHandlerIoPatternDestroy},
+ {"sleep", VDSCRIPTTYPE_VOID, g_aArgSleep, RT_ELEMENTS(g_aArgSleep), vdScriptHandlerSleep},
+ {"dumpfile", VDSCRIPTTYPE_VOID, g_aArgDumpFile, RT_ELEMENTS(g_aArgDumpFile), vdScriptHandlerDumpFile},
+ {"createdisk", VDSCRIPTTYPE_VOID, g_aArgCreateDisk, RT_ELEMENTS(g_aArgCreateDisk), vdScriptHandlerCreateDisk},
+ {"destroydisk", VDSCRIPTTYPE_VOID, g_aArgDestroyDisk, RT_ELEMENTS(g_aArgDestroyDisk), vdScriptHandlerDestroyDisk},
+ {"comparedisks", VDSCRIPTTYPE_VOID, g_aArgCompareDisks, RT_ELEMENTS(g_aArgCompareDisks), vdScriptHandlerCompareDisks},
+ {"dumpdiskinfo", VDSCRIPTTYPE_VOID, g_aArgDumpDiskInfo, RT_ELEMENTS(g_aArgDumpDiskInfo), vdScriptHandlerDumpDiskInfo},
+ {"print", VDSCRIPTTYPE_VOID, g_aArgPrintMsg, RT_ELEMENTS(g_aArgPrintMsg), vdScriptHandlerPrintMsg},
+ {"showstatistics", VDSCRIPTTYPE_VOID, g_aArgShowStatistics, RT_ELEMENTS(g_aArgShowStatistics), vdScriptHandlerShowStatistics},
+ {"resetstatistics", VDSCRIPTTYPE_VOID, g_aArgResetStatistics, RT_ELEMENTS(g_aArgResetStatistics), vdScriptHandlerResetStatistics},
+ {"resize", VDSCRIPTTYPE_VOID, g_aArgResize, RT_ELEMENTS(g_aArgResize), vdScriptHandlerResize},
+ {"setfilebackend", VDSCRIPTTYPE_VOID, g_aArgSetFileBackend, RT_ELEMENTS(g_aArgSetFileBackend), vdScriptHandlerSetFileBackend},
};
const unsigned g_cScriptActions = RT_ELEMENTS(g_aScriptActions);
+static DECLCALLBACK(int) vdScriptCallbackPrint(PVDSCRIPTARG paScriptArgs, void *pvUser)
+{
+ RTPrintf(paScriptArgs[0].psz);
+ return VINF_SUCCESS;
+}
+
static void tstVDError(void *pvUser, int rc, RT_SRC_POS_DECL,
const char *pszFormat, va_list va)
{
@@ -605,9 +519,10 @@ static PVDPATTERN tstVDIoGetPatternByName(PVDTESTGLOB pGlob, const char *pcszNam
static PVDPATTERN tstVDIoPatternCreate(const char *pcszName, size_t cbPattern);
static int tstVDIoPatternGetBuffer(PVDPATTERN pPattern, void **ppv, size_t cb);
-static DECLCALLBACK(int) vdScriptHandlerCreate(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerCreate(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
uint64_t cbSize = 0;
const char *pcszBackend = NULL;
const char *pcszImage = NULL;
@@ -616,69 +531,31 @@ static DECLCALLBACK(int) vdScriptHandlerCreate(PVDTESTGLOB pGlob, PVDSCRIPTARG p
bool fBase = false;
bool fDynamic = true;
bool fIgnoreFlush = false;
+ PVDIOBACKEND pIoBackend = NULL;
- for (unsigned i = 0; i < cScriptArgs; i++)
+ pcszDisk = paScriptArgs[0].psz;
+ if (!RTStrICmp(paScriptArgs[1].psz, "base"))
+ fBase = true;
+ else if (!RTStrICmp(paScriptArgs[1].psz, "diff"))
+ fBase = false;
+ else
{
- switch (paScriptArgs[i].chId)
- {
- case 'd':
- {
- pcszDisk = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'm':
- {
- if (!RTStrICmp(paScriptArgs[i].u.pcszString, "base"))
- fBase = true;
- else if (!RTStrICmp(paScriptArgs[i].u.pcszString, "diff"))
- fBase = false;
- else
- {
- RTPrintf("Invalid image mode '%s' given\n", paScriptArgs[i].u.pcszString);
- rc = VERR_INVALID_PARAMETER;
- }
- break;
- }
- case 'n':
- {
- pcszImage = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'b':
- {
- pcszBackend = paScriptArgs[i].u.pcszString;
- break;
- }
- case 's':
- {
- cbSize = paScriptArgs[i].u.u64;
- break;
- }
- case 't':
- {
- if (!RTStrICmp(paScriptArgs[i].u.pcszString, "fixed"))
- fDynamic = false;
- else if (!RTStrICmp(paScriptArgs[i].u.pcszString, "dynamic"))
- fDynamic = true;
- else
- {
- RTPrintf("Invalid image type '%s' given\n", paScriptArgs[i].u.pcszString);
- rc = VERR_INVALID_PARAMETER;
- }
- break;
- }
- case 'f':
- {
- fIgnoreFlush = paScriptArgs[i].u.fFlag;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
-
- if (RT_FAILURE(rc))
- break;
+ RTPrintf("Invalid image mode '%s' given\n", paScriptArgs[1].psz);
+ rc = VERR_INVALID_PARAMETER;
}
+ pcszImage = paScriptArgs[2].psz;
+ if (!RTStrICmp(paScriptArgs[3].psz, "fixed"))
+ fDynamic = false;
+ else if (!RTStrICmp(paScriptArgs[3].psz, "dynamic"))
+ fDynamic = true;
+ else
+ {
+ RTPrintf("Invalid image type '%s' given\n", paScriptArgs[3].psz);
+ rc = VERR_INVALID_PARAMETER;
+ }
+ pcszBackend = paScriptArgs[4].psz;
+ cbSize = paScriptArgs[5].u64;
+ fIgnoreFlush = paScriptArgs[6].f;
if (RT_SUCCESS(rc))
{
@@ -709,9 +586,10 @@ static DECLCALLBACK(int) vdScriptHandlerCreate(PVDTESTGLOB pGlob, PVDSCRIPTARG p
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerOpen(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerOpen(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
const char *pcszBackend = NULL;
const char *pcszImage = NULL;
const char *pcszDisk = NULL;
@@ -722,52 +600,13 @@ static DECLCALLBACK(int) vdScriptHandlerOpen(PVDTESTGLOB pGlob, PVDSCRIPTARG paS
bool fDiscard = false;
bool fIgnoreFlush = false;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'd':
- {
- pcszDisk = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'n':
- {
- pcszImage = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'b':
- {
- pcszBackend = paScriptArgs[i].u.pcszString;
- break;
- }
- case 's':
- {
- fShareable = paScriptArgs[i].u.fFlag;
- break;
- }
- case 'r':
- {
- fReadonly = paScriptArgs[i].u.fFlag;
- break;
- }
- case 'a':
- {
- fAsyncIo = paScriptArgs[i].u.fFlag;
- break;
- }
- case 'i':
- {
- fDiscard = paScriptArgs[i].u.fFlag;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
-
- if (RT_FAILURE(rc))
- break;
- }
+ pcszDisk = paScriptArgs[0].psz;
+ pcszImage = paScriptArgs[1].psz;
+ pcszBackend = paScriptArgs[2].psz;
+ fShareable = paScriptArgs[3].f;
+ fReadonly = paScriptArgs[4].f;
+ fAsyncIo = paScriptArgs[5].f;
+ fDiscard = paScriptArgs[6].f;
if (RT_SUCCESS(rc))
{
@@ -796,9 +635,10 @@ static DECLCALLBACK(int) vdScriptHandlerOpen(PVDTESTGLOB pGlob, PVDSCRIPTARG paS
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerIo(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerIo(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
bool fAsync = false;
bool fRandomAcc = false;
uint64_t cbIo = 0;
@@ -814,71 +654,24 @@ static DECLCALLBACK(int) vdScriptHandlerIo(PVDTESTGLOB pGlob, PVDSCRIPTARG paScr
PVDDISK pDisk = NULL;
PVDPATTERN pPattern = NULL;
- for (unsigned i = 0; i < cScriptArgs; i++)
+ pcszDisk = paScriptArgs[0].psz;
+ fAsync = paScriptArgs[1].f;
+ cMaxReqs = paScriptArgs[2].u64;
+ if (!RTStrICmp(paScriptArgs[3].psz, "seq"))
+ fRandomAcc = false;
+ else if (!RTStrICmp(paScriptArgs[3].psz, "rnd"))
+ fRandomAcc = true;
+ else
{
- switch (paScriptArgs[i].chId)
- {
- case 'd':
- {
- pcszDisk = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'a':
- {
- fAsync = paScriptArgs[i].u.fFlag;
- break;
- }
- case 'l':
- {
- cMaxReqs = paScriptArgs[i].u.u64;
- break;
- }
- case 'm':
- {
- if (!RTStrICmp(paScriptArgs[i].u.pcszString, "seq"))
- fRandomAcc = false;
- else if (!RTStrICmp(paScriptArgs[i].u.pcszString, "rnd"))
- fRandomAcc = true;
- else
- {
- RTPrintf("Invalid access mode '%s'\n", paScriptArgs[i].u.pcszString);
- rc = VERR_INVALID_PARAMETER;
- }
- break;
- }
- case 's':
- {
- cbIo = paScriptArgs[i].u.u64;
- break;
- }
- case 'b':
- {
- cbBlkSize = paScriptArgs[i].u.u64;
- break;
- }
- case 'o':
- {
- offStart = paScriptArgs[i].u.Range.Start;
- offEnd = paScriptArgs[i].u.Range.End;
- break;
- }
- case 'w':
- {
- uWriteChance = (uint8_t)paScriptArgs[i].u.u64;
- break;
- }
- case 'p':
- {
- pcszPattern = paScriptArgs[i].u.pcszString;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
-
- if (RT_FAILURE(rc))
- break;
+ RTPrintf("Invalid access mode '%s'\n", paScriptArgs[3].psz);
+ rc = VERR_INVALID_PARAMETER;
}
+ cbBlkSize = paScriptArgs[4].u64;
+ offStart = paScriptArgs[5].u64;
+ offEnd = paScriptArgs[6].u64;
+ cbIo = paScriptArgs[7].u64;
+ uWriteChance = (uint8_t)paScriptArgs[8].u64;
+ pcszPattern = paScriptArgs[9].psz;
if ( RT_SUCCESS(rc)
&& fAsync
@@ -907,7 +700,7 @@ static DECLCALLBACK(int) vdScriptHandlerIo(PVDTESTGLOB pGlob, PVDSCRIPTARG paScr
}
if ( RT_SUCCESS(rc)
- && pcszPattern)
+ && RTStrCmp(pcszPattern, "none"))
{
pPattern = tstVDIoGetPatternByName(pGlob, pcszPattern);
if (!pPattern)
@@ -1144,35 +937,16 @@ static DECLCALLBACK(int) vdScriptHandlerIo(PVDTESTGLOB pGlob, PVDSCRIPTARG paScr
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerFlush(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerFlush(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
bool fAsync = false;
const char *pcszDisk = NULL;
PVDDISK pDisk = NULL;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'd':
- {
- pcszDisk = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'a':
- {
- fAsync = paScriptArgs[i].u.fFlag;
- break;
- }
-
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
-
- if (RT_FAILURE(rc))
- break;
- }
+ pcszDisk = paScriptArgs[0].psz;
+ fAsync = paScriptArgs[1].f;
if (RT_SUCCESS(rc))
{
@@ -1210,137 +984,70 @@ static DECLCALLBACK(int) vdScriptHandlerFlush(PVDTESTGLOB pGlob, PVDSCRIPTARG pa
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerMerge(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerMerge(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
const char *pcszDisk = NULL;
PVDDISK pDisk = NULL;
unsigned nImageFrom = 0;
unsigned nImageTo = 0;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'd':
- {
- pcszDisk = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'f':
- {
- nImageFrom = (unsigned)paScriptArgs[i].u.u64;
- break;
- }
- case 't':
- {
- nImageTo = (unsigned)paScriptArgs[i].u.u64;
- break;
- }
-
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
+ pcszDisk = paScriptArgs[0].psz;
+ nImageFrom = paScriptArgs[1].u32;
+ nImageTo = paScriptArgs[2].u32;
- if (RT_FAILURE(rc))
- break;
- }
-
- if (RT_SUCCESS(rc))
+ pDisk = tstVDIoGetDiskByName(pGlob, pcszDisk);
+ if (!pDisk)
+ rc = VERR_NOT_FOUND;
+ else
{
- pDisk = tstVDIoGetDiskByName(pGlob, pcszDisk);
- if (!pDisk)
- rc = VERR_NOT_FOUND;
- else
- {
- /** @todo: Provide progress interface to test that cancelation
- * doesn't corrupt the data.
- */
- rc = VDMerge(pDisk->pVD, nImageFrom, nImageTo, NULL);
- }
+ /** @todo: Provide progress interface to test that cancelation
+ * doesn't corrupt the data.
+ */
+ rc = VDMerge(pDisk->pVD, nImageFrom, nImageTo, NULL);
}
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerCompact(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerCompact(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
const char *pcszDisk = NULL;
PVDDISK pDisk = NULL;
unsigned nImage = 0;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'd':
- {
- pcszDisk = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'i':
- {
- nImage = (unsigned)paScriptArgs[i].u.u64;
- break;
- }
-
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
-
- if (RT_FAILURE(rc))
- break;
- }
+ pcszDisk = paScriptArgs[0].psz;
+ nImage = paScriptArgs[1].u32;
- if (RT_SUCCESS(rc))
+ pDisk = tstVDIoGetDiskByName(pGlob, pcszDisk);
+ if (!pDisk)
+ rc = VERR_NOT_FOUND;
+ else
{
- pDisk = tstVDIoGetDiskByName(pGlob, pcszDisk);
- if (!pDisk)
- rc = VERR_NOT_FOUND;
- else
- {
- /** @todo: Provide progress interface to test that cancelation
- * doesn't corrupt the data.
- */
- rc = VDCompact(pDisk->pVD, nImage, NULL);
- }
+ /** @todo: Provide progress interface to test that cancelation
+ * doesn't corrupt the data.
+ */
+ rc = VDCompact(pDisk->pVD, nImage, NULL);
}
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerDiscard(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerDiscard(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
const char *pcszDisk = NULL;
PVDDISK pDisk = NULL;
bool fAsync = false;
const char *pcszRanges = NULL;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'd':
- {
- pcszDisk = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'a':
- {
- fAsync = paScriptArgs[i].u.fFlag;
- break;
- }
- case 'r':
- {
- pcszRanges = paScriptArgs[i].u.pcszString;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
- }
+ pcszDisk = paScriptArgs[0].psz;
+ fAsync = paScriptArgs[1].f;
+ pcszRanges = paScriptArgs[2].psz;
pDisk = tstVDIoGetDiskByName(pGlob, pcszDisk);
if (!pDisk)
@@ -1546,9 +1253,10 @@ static DECLCALLBACK(int) vdScriptHandlerDiscard(PVDTESTGLOB pGlob, PVDSCRIPTARG
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerCopy(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerCopy(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
const char *pcszDiskFrom = NULL;
const char *pcszDiskTo = NULL;
PVDDISK pDiskFrom = NULL;
@@ -1561,130 +1269,56 @@ static DECLCALLBACK(int) vdScriptHandlerCopy(PVDTESTGLOB pGlob, PVDSCRIPTARG paS
unsigned nImageFromSame = VD_IMAGE_CONTENT_UNKNOWN;
unsigned nImageToSame = VD_IMAGE_CONTENT_UNKNOWN;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 's':
- {
- pcszDiskFrom = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'd':
- {
- pcszDiskTo = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'i':
- {
- nImageFrom = (unsigned)paScriptArgs[i].u.u64;
- break;
- }
- case 'b':
- {
- pcszBackend = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'f':
- {
- pcszFilename = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'm':
- {
- fMoveByRename = paScriptArgs[i].u.fFlag;
- break;
- }
- case 'z':
- {
- cbSize = paScriptArgs[i].u.u64;
- break;
- }
- case 'o':
- {
- nImageFromSame = (unsigned)paScriptArgs[i].u.u64;
- break;
- }
- case 't':
- {
- nImageToSame = (unsigned)paScriptArgs[i].u.u64;
- break;
- }
-
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
-
- if (RT_FAILURE(rc))
- break;
- }
-
- if (RT_SUCCESS(rc))
+ pcszDiskFrom = paScriptArgs[0].psz;
+ pcszDiskTo = paScriptArgs[1].psz;
+ nImageFrom = paScriptArgs[2].u32;
+ pcszBackend = paScriptArgs[3].psz;
+ pcszFilename = paScriptArgs[4].psz;
+ fMoveByRename = paScriptArgs[5].f;
+ cbSize = paScriptArgs[6].u64;
+ nImageFromSame = paScriptArgs[7].u32;
+ nImageToSame = paScriptArgs[8].u32;
+
+ pDiskFrom = tstVDIoGetDiskByName(pGlob, pcszDiskFrom);
+ pDiskTo = tstVDIoGetDiskByName(pGlob, pcszDiskTo);
+ if (!pDiskFrom || !pDiskTo)
+ rc = VERR_NOT_FOUND;
+ else
{
- pDiskFrom = tstVDIoGetDiskByName(pGlob, pcszDiskFrom);
- pDiskTo = tstVDIoGetDiskByName(pGlob, pcszDiskTo);
- if (!pDiskFrom || !pDiskTo)
- rc = VERR_NOT_FOUND;
- else
- {
- /** @todo: Provide progress interface to test that cancelation
- * works as intended.
- */
- rc = VDCopyEx(pDiskFrom->pVD, nImageFrom, pDiskTo->pVD, pcszBackend, pcszFilename,
- fMoveByRename, cbSize, nImageFromSame, nImageToSame,
- VD_IMAGE_FLAGS_NONE, NULL, VD_OPEN_FLAGS_ASYNC_IO,
- NULL, pGlob->pInterfacesImages, NULL);
- }
+ /** @todo: Provide progress interface to test that cancelation
+ * works as intended.
+ */
+ rc = VDCopyEx(pDiskFrom->pVD, nImageFrom, pDiskTo->pVD, pcszBackend, pcszFilename,
+ fMoveByRename, cbSize, nImageFromSame, nImageToSame,
+ VD_IMAGE_FLAGS_NONE, NULL, VD_OPEN_FLAGS_ASYNC_IO,
+ NULL, pGlob->pInterfacesImages, NULL);
}
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerClose(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerClose(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
bool fAll = false;
bool fDelete = false;
const char *pcszDisk = NULL;
PVDDISK pDisk = NULL;
- for (unsigned i = 0; i < cScriptArgs; i++)
+ pcszDisk = paScriptArgs[0].psz;
+ if (!RTStrICmp(paScriptArgs[1].psz, "all"))
+ fAll = true;
+ else if (!RTStrICmp(paScriptArgs[1].psz, "single"))
+ fAll = false;
+ else
{
- switch (paScriptArgs[i].chId)
- {
- case 'd':
- {
- pcszDisk = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'm':
- {
- if (!RTStrICmp(paScriptArgs[i].u.pcszString, "all"))
- fAll = true;
- else if (!RTStrICmp(paScriptArgs[i].u.pcszString, "single"))
- fAll = false;
- else
- {
- RTPrintf("Invalid mode '%s' given\n", paScriptArgs[i].u.pcszString);
- rc = VERR_INVALID_PARAMETER;
- }
- break;
- }
- case 'r':
- {
- fDelete = paScriptArgs[i].u.fFlag;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
-
- if (RT_FAILURE(rc))
- break;
+ RTPrintf("Invalid mode '%s' given\n", paScriptArgs[1].psz);
+ rc = VERR_INVALID_PARAMETER;
}
+ fDelete = paScriptArgs[2].f;
- if ( RT_SUCCESS(rc)
- && fAll
+ if ( fAll
&& fDelete)
{
RTPrintf("mode=all doesn't work with delete=yes\n");
@@ -1708,31 +1342,16 @@ static DECLCALLBACK(int) vdScriptHandlerClose(PVDTESTGLOB pGlob, PVDSCRIPTARG pa
}
-static DECLCALLBACK(int) vdScriptHandlerPrintFileSize(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerPrintFileSize(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
const char *pcszDisk = NULL;
PVDDISK pDisk = NULL;
unsigned nImage = 0;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'd':
- {
- pcszDisk = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'i':
- {
- nImage = (unsigned)paScriptArgs[i].u.u64;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
- }
+ pcszDisk = paScriptArgs[0].psz;
+ nImage = paScriptArgs[1].u32;
pDisk = tstVDIoGetDiskByName(pGlob, pcszDisk);
if (pDisk)
@@ -1744,31 +1363,16 @@ static DECLCALLBACK(int) vdScriptHandlerPrintFileSize(PVDTESTGLOB pGlob, PVDSCRI
}
-static DECLCALLBACK(int) vdScriptHandlerIoLogReplay(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerIoLogReplay(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
const char *pcszDisk = NULL;
PVDDISK pDisk = NULL;
const char *pcszIoLog = NULL;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'd':
- {
- pcszDisk = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'i':
- {
- pcszIoLog = paScriptArgs[i].u.pcszString;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
- }
+ pcszDisk = paScriptArgs[0].psz;
+ pcszIoLog = paScriptArgs[1].psz;
pDisk = tstVDIoGetDiskByName(pGlob, pcszDisk);
if (pDisk)
@@ -1911,36 +1515,17 @@ static DECLCALLBACK(int) vdScriptHandlerIoLogReplay(PVDTESTGLOB pGlob, PVDSCRIPT
}
-static DECLCALLBACK(int) vdScriptHandlerIoRngCreate(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerIoRngCreate(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
size_t cbPattern = 0;
uint64_t uSeed = 0;
const char *pcszSeeder = NULL;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'd':
- {
- cbPattern = paScriptArgs[i].u.u64;
- break;
- }
- case 's':
- {
- uSeed = paScriptArgs[i].u.u64;
- break;
- }
- case 'm':
- {
- pcszSeeder = paScriptArgs[i].u.pcszString;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
- }
+ cbPattern = paScriptArgs[0].u64;
+ pcszSeeder = paScriptArgs[1].psz;
+ uSeed = paScriptArgs[2].u64;
if (pGlob->pIoRnd)
{
@@ -1973,8 +1558,10 @@ static DECLCALLBACK(int) vdScriptHandlerIoRngCreate(PVDTESTGLOB pGlob, PVDSCRIPT
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerIoRngDestroy(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerIoRngDestroy(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
+
if (pGlob->pIoRnd)
{
VDIoRndDestroy(pGlob->pIoRnd);
@@ -1986,36 +1573,17 @@ static DECLCALLBACK(int) vdScriptHandlerIoRngDestroy(PVDTESTGLOB pGlob, PVDSCRIP
return VINF_SUCCESS;
}
-static DECLCALLBACK(int) vdScriptHandlerIoPatternCreateFromNumber(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerIoPatternCreateFromNumber(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
size_t cbPattern = 0;
const char *pcszName = NULL;
uint64_t u64Pattern = 0;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'n':
- {
- pcszName = paScriptArgs[i].u.pcszString;
- break;
- }
- case 's':
- {
- cbPattern = paScriptArgs[i].u.u64;
- break;
- }
- case 'p':
- {
- u64Pattern = paScriptArgs[i].u.u64;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
- }
+ pcszName = paScriptArgs[0].psz;
+ cbPattern = paScriptArgs[1].u64;
+ u64Pattern = paScriptArgs[2].u64;
PVDPATTERN pPattern = tstVDIoGetPatternByName(pGlob, pcszName);
if (!pPattern)
@@ -2045,30 +1613,15 @@ static DECLCALLBACK(int) vdScriptHandlerIoPatternCreateFromNumber(PVDTESTGLOB pG
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerIoPatternCreateFromFile(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerIoPatternCreateFromFile(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
const char *pcszName = NULL;
const char *pcszFile = NULL;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'n':
- {
- pcszName = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'f':
- {
- pcszFile = paScriptArgs[i].u.pcszString;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
- }
+ pcszName = paScriptArgs[0].psz;
+ pcszFile = paScriptArgs[1].psz;
PVDPATTERN pPattern = tstVDIoGetPatternByName(pGlob, pcszName);
if (!pPattern)
@@ -2107,24 +1660,13 @@ static DECLCALLBACK(int) vdScriptHandlerIoPatternCreateFromFile(PVDTESTGLOB pGlo
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerIoPatternDestroy(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerIoPatternDestroy(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
const char *pcszName = NULL;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'n':
- {
- pcszName = paScriptArgs[i].u.pcszString;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
- }
+ pcszName = paScriptArgs[0].psz;
PVDPATTERN pPattern = tstVDIoGetPatternByName(pGlob, pcszName);
if (pPattern)
@@ -2140,53 +1682,24 @@ static DECLCALLBACK(int) vdScriptHandlerIoPatternDestroy(PVDTESTGLOB pGlob, PVDS
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerSleep(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerSleep(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
- uint64_t cMillies = 0;
-
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 't':
- {
- cMillies = paScriptArgs[i].u.u64;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
- }
+ uint64_t cMillies = paScriptArgs[0].u64;
rc = RTThreadSleep(cMillies);
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerDumpFile(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerDumpFile(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
const char *pcszFile = NULL;
const char *pcszPathToDump = NULL;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'f':
- {
- pcszFile = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'p':
- {
- pcszPathToDump = paScriptArgs[i].u.pcszString;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
- }
+ pcszFile = paScriptArgs[0].psz;
+ pcszPathToDump = paScriptArgs[1].psz;
/* Check for the file. */
PVDFILE pIt = NULL;
@@ -2203,7 +1716,8 @@ static DECLCALLBACK(int) vdScriptHandlerDumpFile(PVDTESTGLOB pGlob, PVDSCRIPTARG
if (fFound)
{
RTPrintf("Dumping memory file %s to %s, this might take some time\n", pcszFile, pcszPathToDump);
- rc = VDMemDiskWriteToFile(pIt->pMemDisk, pcszPathToDump);
+ //rc = VDMemDiskWriteToFile(pIt->pIo, pcszPathToDump);
+ rc = VERR_NOT_IMPLEMENTED;
}
else
rc = VERR_FILE_NOT_FOUND;
@@ -2211,31 +1725,16 @@ static DECLCALLBACK(int) vdScriptHandlerDumpFile(PVDTESTGLOB pGlob, PVDSCRIPTARG
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerCreateDisk(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerCreateDisk(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
const char *pcszDisk = NULL;
PVDDISK pDisk = NULL;
bool fVerify = false;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'n':
- {
- pcszDisk = paScriptArgs[i].u.pcszString;
- break;
- }
- case 'v':
- {
- fVerify = paScriptArgs[i].u.fFlag;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
- }
+ pcszDisk = paScriptArgs[0].psz;
+ fVerify = paScriptArgs[1].f;
pDisk = tstVDIoGetDiskByName(pGlob, pcszDisk);
if (pDisk)
@@ -2290,25 +1789,14 @@ static DECLCALLBACK(int) vdScriptHandlerCreateDisk(PVDTESTGLOB pGlob, PVDSCRIPTA
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerDestroyDisk(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerDestroyDisk(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
const char *pcszDisk = NULL;
PVDDISK pDisk = NULL;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'n':
- {
- pcszDisk = paScriptArgs[i].u.pcszString;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
- }
+ pcszDisk = paScriptArgs[0].psz;
pDisk = tstVDIoGetDiskByName(pGlob, pcszDisk);
if (pDisk)
@@ -2329,32 +1817,17 @@ static DECLCALLBACK(int) vdScriptHandlerDestroyDisk(PVDTESTGLOB pGlob, PVDSCRIPT
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerCompareDisks(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerCompareDisks(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
const char *pcszDisk1 = NULL;
PVDDISK pDisk1 = NULL;
const char *pcszDisk2 = NULL;
PVDDISK pDisk2 = NULL;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case '1':
- {
- pcszDisk1 = paScriptArgs[i].u.pcszString;
- break;
- }
- case '2':
- {
- pcszDisk2 = paScriptArgs[i].u.pcszString;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
- }
+ pcszDisk1 = paScriptArgs[0].psz;
+ pcszDisk2 = paScriptArgs[1].psz;
pDisk1 = tstVDIoGetDiskByName(pGlob, pcszDisk1);
pDisk2 = tstVDIoGetDiskByName(pGlob, pcszDisk2);
@@ -2420,25 +1893,14 @@ static DECLCALLBACK(int) vdScriptHandlerCompareDisks(PVDTESTGLOB pGlob, PVDSCRIP
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerDumpDiskInfo(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerDumpDiskInfo(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
const char *pcszDisk = NULL;
PVDDISK pDisk = NULL;
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'd':
- {
- pcszDisk = paScriptArgs[i].u.pcszString;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
- }
+ pcszDisk = paScriptArgs[0].psz;
pDisk = tstVDIoGetDiskByName(pGlob, pcszDisk);
@@ -2450,30 +1912,17 @@ static DECLCALLBACK(int) vdScriptHandlerDumpDiskInfo(PVDTESTGLOB pGlob, PVDSCRIP
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerPrintMsg(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerPrintMsg(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
- RTPrintf("%s\n", paScriptArgs[0].u.pcszString);
+ RTPrintf("%s\n", paScriptArgs[0].psz);
return VINF_SUCCESS;
}
-static DECLCALLBACK(int) vdScriptHandlerShowStatistics(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerShowStatistics(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
- const char *pcszFile = NULL;
-
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'f':
- {
- pcszFile = paScriptArgs[i].u.pcszString;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
- }
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
+ const char *pcszFile = paScriptArgs[0].psz;
/* Check for the file. */
PVDFILE pIt = NULL;
@@ -2502,24 +1951,11 @@ static DECLCALLBACK(int) vdScriptHandlerShowStatistics(PVDTESTGLOB pGlob, PVDSCR
return rc;
}
-static DECLCALLBACK(int) vdScriptHandlerResetStatistics(PVDTESTGLOB pGlob, PVDSCRIPTARG paScriptArgs, unsigned cScriptArgs)
+static DECLCALLBACK(int) vdScriptHandlerResetStatistics(PVDSCRIPTARG paScriptArgs, void *pvUser)
{
int rc = VINF_SUCCESS;
- const char *pcszFile = NULL;
-
- for (unsigned i = 0; i < cScriptArgs; i++)
- {
- switch (paScriptArgs[i].chId)
- {
- case 'f':
- {
- pcszFile = paScriptArgs[i].u.pcszString;
- break;
- }
- default:
- AssertMsgFailed(("Invalid argument given!\n"));
- }
- }
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
+ const char *pcszFile = paScriptArgs[0].psz;
/* Check for the file. */
PVDFILE pIt = NULL;
@@ -2549,6 +1985,39 @@ static DECLCALLBACK(int) vdScriptHandlerResetStatistics(PVDTESTGLOB pGlob, PVDSC
return rc;
}
+static DECLCALLBACK(int) vdScriptHandlerResize(PVDSCRIPTARG paScriptArgs, void *pvUser)
+{
+ int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
+ const char *pcszDisk = paScriptArgs[0].psz;
+ uint64_t cbDiskNew = 0;
+ PVDDISK pDisk = NULL;
+
+ pDisk = tstVDIoGetDiskByName(pGlob, pcszDisk);
+ if (pDisk)
+ {
+ rc = VDResize(pDisk->pVD, cbDiskNew, &pDisk->PhysGeom, &pDisk->LogicalGeom, NULL);
+ }
+ else
+ rc = VERR_NOT_FOUND;
+
+ return rc;
+}
+
+static DECLCALLBACK(int) vdScriptHandlerSetFileBackend(PVDSCRIPTARG paScriptArgs, void *pvUser)
+{
+ int rc = VINF_SUCCESS;
+ PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
+ const char *pcszBackend = paScriptArgs[0].psz;
+
+ RTStrFree(pGlob->pszIoBackend);
+ pGlob->pszIoBackend = RTStrDup(pcszBackend);
+ if (!pGlob->pszIoBackend)
+ rc = VERR_NO_MEMORY;
+
+ return rc;
+}
+
static DECLCALLBACK(int) tstVDIoFileOpen(void *pvUser, const char *pszLocation,
uint32_t fOpen,
PFNVDCOMPLETED pfnCompleted,
@@ -2583,7 +2052,7 @@ static DECLCALLBACK(int) tstVDIoFileOpen(void *pvUser, const char *pszLocation,
{
/* If the file exists delete the memory disk. */
if (fFound)
- rc = VDMemDiskSetSize(pIt->pMemDisk, 0);
+ rc = VDIoBackendStorageSetSize(pIt->pIoStorage, 0);
else
{
/* Create completey new. */
@@ -2594,7 +2063,8 @@ static DECLCALLBACK(int) tstVDIoFileOpen(void *pvUser, const char *pszLocation,
if (pIt->pszName)
{
- rc = VDMemDiskCreate(&pIt->pMemDisk, 0);
+ rc = VDIoBackendStorageCreate(pGlob->pIoBackend, pGlob->pszIoBackend,
+ pszLocation, pfnCompleted, &pIt->pIoStorage);
}
else
rc = VERR_NO_MEMORY;
@@ -2605,11 +2075,11 @@ static DECLCALLBACK(int) tstVDIoFileOpen(void *pvUser, const char *pszLocation,
RTStrFree(pIt->pszName);
RTMemFree(pIt);
}
+ else
+ RTListAppend(&pGlob->ListFiles, &pIt->Node);
}
else
rc = VERR_NO_MEMORY;
-
- RTListAppend(&pGlob->ListFiles, &pIt->Node);
}
}
else if ((fOpen & RTFILE_O_ACTION_MASK) == RTFILE_O_OPEN)
@@ -2673,7 +2143,7 @@ static DECLCALLBACK(int) tstVDIoFileDelete(void *pvUser, const char *pcszFilenam
if (fFound)
{
RTListNodeRemove(&pIt->Node);
- VDMemDiskDestroy(pIt->pMemDisk);
+ VDIoBackendStorageDestroy(pIt->pIoStorage);
RTStrFree(pIt->pszName);
RTMemFree(pIt);
}
@@ -2737,14 +2207,14 @@ static DECLCALLBACK(int) tstVDIoFileGetSize(void *pvUser, void *pStorage, uint64
{
PVDSTORAGE pIoStorage = (PVDSTORAGE)pStorage;
- return VDMemDiskGetSize(pIoStorage->pFile->pMemDisk, pcbSize);
+ return VDIoBackendStorageGetSize(pIoStorage->pFile->pIoStorage, pcbSize);
}
static DECLCALLBACK(int) tstVDIoFileSetSize(void *pvUser, void *pStorage, uint64_t cbSize)
{
PVDSTORAGE pIoStorage = (PVDSTORAGE)pStorage;
- return VDMemDiskSetSize(pIoStorage->pFile->pMemDisk, cbSize);
+ return VDIoBackendStorageSetSize(pIoStorage->pFile->pIoStorage, cbSize);
}
static DECLCALLBACK(int) tstVDIoFileWriteSync(void *pvUser, void *pStorage, uint64_t uOffset,
@@ -2759,7 +2229,8 @@ static DECLCALLBACK(int) tstVDIoFileWriteSync(void *pvUser, void *pStorage, uint
Seg.pvSeg = (void *)pvBuffer;
Seg.cbSeg = cbBuffer;
RTSgBufInit(&SgBuf, &Seg, 1);
- rc = VDMemDiskWrite(pIoStorage->pFile->pMemDisk, uOffset, cbBuffer, &SgBuf);
+ rc = VDIoBackendTransfer(pIoStorage->pFile->pIoStorage, VDIOTXDIR_WRITE, uOffset,
+ cbBuffer, &SgBuf, NULL, true /* fSync */);
if (RT_SUCCESS(rc))
{
pIoStorage->pFile->cWrites++;
@@ -2782,7 +2253,8 @@ static DECLCALLBACK(int) tstVDIoFileReadSync(void *pvUser, void *pStorage, uint6
Seg.pvSeg = pvBuffer;
Seg.cbSeg = cbBuffer;
RTSgBufInit(&SgBuf, &Seg, 1);
- rc = VDMemDiskRead(pIoStorage->pFile->pMemDisk, uOffset, cbBuffer, &SgBuf);
+ rc = VDIoBackendTransfer(pIoStorage->pFile->pIoStorage, VDIOTXDIR_READ, uOffset,
+ cbBuffer, &SgBuf, NULL, true /* fSync */);
if (RT_SUCCESS(rc))
{
pIoStorage->pFile->cReads++;
@@ -2796,8 +2268,10 @@ static DECLCALLBACK(int) tstVDIoFileReadSync(void *pvUser, void *pStorage, uint6
static DECLCALLBACK(int) tstVDIoFileFlushSync(void *pvUser, void *pStorage)
{
PVDSTORAGE pIoStorage = (PVDSTORAGE)pStorage;
+ int rc = VDIoBackendTransfer(pIoStorage->pFile->pIoStorage, VDIOTXDIR_FLUSH, 0,
+ 0, NULL, NULL, true /* fSync */);
pIoStorage->pFile->cFlushes++;
- return VINF_SUCCESS;
+ return rc;
}
static DECLCALLBACK(int) tstVDIoFileReadAsync(void *pvUser, void *pStorage, uint64_t uOffset,
@@ -2808,9 +2282,11 @@ static DECLCALLBACK(int) tstVDIoFileReadAsync(void *pvUser, void *pStorage, uint
int rc = VINF_SUCCESS;
PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
PVDSTORAGE pIoStorage = (PVDSTORAGE)pStorage;
+ RTSGBUF SgBuf;
- rc = VDIoBackendMemTransfer(pGlob->pIoBackend, pIoStorage->pFile->pMemDisk, VDIOTXDIR_READ, uOffset,
- cbRead, paSegments, cSegments, pIoStorage->pfnComplete, pvCompletion);
+ RTSgBufInit(&SgBuf, paSegments, cSegments);
+ rc = VDIoBackendTransfer(pIoStorage->pFile->pIoStorage, VDIOTXDIR_READ, uOffset,
+ cbRead, &SgBuf, pvCompletion, false /* fSync */);
if (RT_SUCCESS(rc))
{
pIoStorage->pFile->cAsyncReads++;
@@ -2828,9 +2304,11 @@ static DECLCALLBACK(int) tstVDIoFileWriteAsync(void *pvUser, void *pStorage, uin
int rc = VINF_SUCCESS;
PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
PVDSTORAGE pIoStorage = (PVDSTORAGE)pStorage;
+ RTSGBUF SgBuf;
- rc = VDIoBackendMemTransfer(pGlob->pIoBackend, pIoStorage->pFile->pMemDisk, VDIOTXDIR_WRITE, uOffset,
- cbWrite, paSegments, cSegments, pIoStorage->pfnComplete, pvCompletion);
+ RTSgBufInit(&SgBuf, paSegments, cSegments);
+ rc = VDIoBackendTransfer(pIoStorage->pFile->pIoStorage, VDIOTXDIR_WRITE, uOffset,
+ cbWrite, &SgBuf, pvCompletion, false /* fSync */);
if (RT_SUCCESS(rc))
{
pIoStorage->pFile->cAsyncWrites++;
@@ -2847,8 +2325,8 @@ static DECLCALLBACK(int) tstVDIoFileFlushAsync(void *pvUser, void *pStorage, voi
PVDTESTGLOB pGlob = (PVDTESTGLOB)pvUser;
PVDSTORAGE pIoStorage = (PVDSTORAGE)pStorage;
- rc = VDIoBackendMemTransfer(pGlob->pIoBackend, pIoStorage->pFile->pMemDisk, VDIOTXDIR_FLUSH, 0,
- 0, NULL, 0, pIoStorage->pfnComplete, pvCompletion);
+ rc = VDIoBackendTransfer(pIoStorage->pFile->pIoStorage, VDIOTXDIR_FLUSH, 0,
+ 0, NULL, pvCompletion, false /* fSync */);
if (RT_SUCCESS(rc))
{
pIoStorage->pFile->cAsyncFlushes++;
@@ -3169,454 +2647,7 @@ static int tstVDIoPatternGetBuffer(PVDPATTERN pPattern, void **ppv, size_t cb)
}
/**
- * Skips the characters until the given character is reached.
- *
- * @returns Start of the string with the given character
- * or NULL if the string ended before.
- *
- * @param psz The string to skip.
- * @param ch The character.
- */
-static char *tstVDIoScriptSkipUntil(char *psz, char ch)
-{
- while ( *psz != '\0'
- && *psz != ch)
- psz++;
-
- return psz;
-}
-
-/**
- * Skips the spaces of the current string.
- *
- * @returns Start of the string with a non space character
- * or NULL if the string ended before.
- *
- * @param psz The string to skip.
- */
-static char *tstVDIoScriptSkipSpace(char *psz)
-{
- while ( *psz != '\0'
- && RT_C_IS_SPACE(*psz))
- psz++;
-
- return psz;
-}
-
-/**
- * Skips all characters until a space is reached of the current
- * string.
- *
- * @returns Start of the string with a space character
- * or NULL if the string ended before.
- *
- * @param psz The string to skip.
- */
-static char *tstVDIoScriptSkipNonSpace(char *psz)
-{
- while ( *psz != '\0'
- && !RT_C_IS_SPACE(*psz))
- psz++;
-
- return psz;
-}
-
-/**
- * Returns true if the first character of the given string
- * contains a character marking a line end (comment or \0
- * terminator).
- *
- * @returns true if the line contains no more characters of
- * interest and false otherwise.
- *
- * @param psz The string to check for.
- */
-static bool tstVDIoIsLineEnd(const char *psz)
-{
- return *psz == '\0' || *psz == '#';
-}
-
-/**
- * Parses one argument name, value pair.
- *
- * @returns IPRT status code.
- *
- * @param pVDScriptAction Script action.
- * @param pcszName Argument name.
- * @param pcszValue Argument value.
- * @param pScriptArg Where to fill in the parsed
- * argument.
- * @param pfMandatory Where to store whether the argument
- * is mandatory.
- */
-static int tstVDIoScriptArgumentParse(PCVDSCRIPTACTION pVDScriptAction, const char *pcszName,
- const char *pcszValue, PVDSCRIPTARG pScriptArg, bool *pfMandatory)
-{
- int rc = VERR_NOT_FOUND;
-
- for (unsigned i = 0; i < pVDScriptAction->cArgDescs; i++)
- {
- if (!RTStrCmp(pVDScriptAction->paArgDesc[i].pcszName, pcszName))
- {
- rc = VINF_SUCCESS;
-
- switch (pVDScriptAction->paArgDesc[i].enmType)
- {
- case VDSCRIPTARGTYPE_BOOL:
- {
- pScriptArg->enmType = VDSCRIPTARGTYPE_BOOL;
- if (!RTStrICmp(pcszValue, "yes") || !RTStrICmp(pcszValue, "on"))
- pScriptArg->u.fFlag = true;
- else if (!RTStrICmp(pcszValue, "no") || !RTStrICmp(pcszValue, "off"))
- pScriptArg->u.fFlag = false;
- else
- {
- RTPrintf("Boolean argument malformed '%s'\n", pcszValue);
- rc = VERR_INVALID_PARAMETER;
- }
- break;
- }
- case VDSCRIPTARGTYPE_SIGNED_NUMBER:
- {
- pScriptArg->enmType = VDSCRIPTARGTYPE_SIGNED_NUMBER;
- AssertMsgFailed(("todo\n"));
- break;
- }
- case VDSCRIPTARGTYPE_STRING:
- {
- pScriptArg->enmType = VDSCRIPTARGTYPE_STRING;
- pScriptArg->u.pcszString = pcszValue;
- break;
- }
- case VDSCRIPTARGTYPE_UNSIGNED_NUMBER:
- {
- char *pszSuffix = NULL;
-
- pScriptArg->enmType = VDSCRIPTARGTYPE_UNSIGNED_NUMBER;
- rc = RTStrToUInt64Ex(pcszValue, &pszSuffix, 10, &pScriptArg->u.u64);
- if (rc == VWRN_TRAILING_CHARS)
- {
- switch (*pszSuffix)
- {
- case 'k':
- case 'K':
- {
- pScriptArg->u.u64 *= _1K;
- break;
- }
- case 'm':
- case 'M':
- {
- pScriptArg->u.u64 *= _1M;
- break;
- }
- case 'g':
- case 'G':
- {
- pScriptArg->u.u64 *= _1G;
- break;
- }
- default:
- {
- RTPrintf("Invalid size suffix '%s'\n", pszSuffix);
- rc = VERR_INVALID_PARAMETER;
- }
- }
- if (rc != VERR_INVALID_PARAMETER)
- rc = VINF_SUCCESS;
- }
-
- break;
- }
- case VDSCRIPTARGTYPE_UNSIGNED_RANGE:
- {
- char *pszSuffix = NULL;
-
- pScriptArg->enmType = VDSCRIPTARGTYPE_UNSIGNED_RANGE;
- rc = RTStrToUInt64Ex(pcszValue, &pszSuffix, 10, &pScriptArg->u.Range.Start);
- if (rc == VWRN_TRAILING_CHARS)
- {
- if (*pszSuffix != '-')
- {
- switch (*pszSuffix)
- {
- case 'k':
- case 'K':
- {
- pScriptArg->u.u64 *= _1K;
- break;
- }
- case 'm':
- case 'M':
- {
- pScriptArg->u.u64 *= _1M;
- break;
- }
- case 'g':
- case 'G':
- {
- pScriptArg->u.u64 *= _1G;
- break;
- }
- default:
- {
- RTPrintf("Invalid size suffix '%s'\n", pszSuffix);
- rc = VERR_INVALID_PARAMETER;
- }
- }
- if (RT_SUCCESS(rc))
- pszSuffix++;
- }
-
- if (*pszSuffix == '-')
- {
- pszSuffix++;
- rc = RTStrToUInt64Ex(pszSuffix, &pszSuffix, 10, &pScriptArg->u.Range.End);
- if (rc == VWRN_TRAILING_CHARS)
- {
- switch (*pszSuffix)
- {
- case 'k':
- case 'K':
- {
- pScriptArg->u.Range.End *= _1K;
- break;
- }
- case 'm':
- case 'M':
- {
- pScriptArg->u.Range.End *= _1M;
- break;
- }
- case 'g':
- case 'G':
- {
- pScriptArg->u.Range.End *= _1G;
- break;
- }
- default:
- {
- RTPrintf("Invalid size suffix '%s'\n", pszSuffix);
- rc = VERR_INVALID_PARAMETER;
- }
- }
- }
- }
- else
- rc = VERR_INVALID_PARAMETER;
- }
- else
- rc = VERR_INVALID_PARAMETER;
-
- if (rc == VERR_INVALID_PARAMETER)
- RTPrintf("Invalid range format\n");
- break;
- }
- default:
- AssertMsgFailed(("Invalid script argument type\n"));
- }
-
- if (RT_SUCCESS(rc))
- {
- pScriptArg->chId = pVDScriptAction->paArgDesc[i].chId;
- *pfMandatory = !!(pVDScriptAction->paArgDesc[i].fFlags & VDSCRIPTARGDESC_FLAG_MANDATORY);
- }
- break;
- }
- }
-
- if (rc == VERR_NOT_FOUND)
- RTPrintf("Argument '%s' not found\n", pcszName);
-
- return rc;
-}
-
-/**
- * Parses the arguments of a action in the script.
- *
- * @returns IPRT status code.
- *
- * @param psz Argument string.
- * @param pVDScriptAction The script action to parses
- * arguments for.
- * @param paScriptArgs Where to store the arguments.
- * @param pcScriptArgs Where to store the actual number of
- * arguments parsed.
- */
-static int tstVDIoScriptArgumentListParse(char *psz, PCVDSCRIPTACTION pVDScriptAction, PVDSCRIPTARG paScriptArgs, unsigned *pcScriptArgs)
-{
- int rc = VINF_SUCCESS;
- unsigned cMandatoryArgsReq = 0;
- unsigned cScriptArgs = 0;
-
- /* Count the number of mandatory arguments first. */
- for (unsigned i = 0; i < pVDScriptAction->cArgDescs; i++)
- if (pVDScriptAction->paArgDesc[i].fFlags & VDSCRIPTARGDESC_FLAG_MANDATORY)
- cMandatoryArgsReq++;
-
- /* One argument is given in the form name=value. */
- *pcScriptArgs = 0;
-
- while ( psz
- && !tstVDIoIsLineEnd(psz))
- {
- const char *pcszName = psz;
-
- psz = tstVDIoScriptSkipUntil(psz, '=');
- if (!tstVDIoIsLineEnd(psz))
- {
- *psz = '\0'; /* Overwrite */
- psz++;
- const char *pcszValue = psz;
-
- psz = tstVDIoScriptSkipNonSpace(psz);
- if (!tstVDIoIsLineEnd(psz))
- {
- *psz = '\0'; /* Overwrite */
- psz++;
- psz = tstVDIoScriptSkipSpace(psz);
- }
-
- pcszValue = tstVDIoScriptSkipSpace((char *)pcszValue);
- if (*pcszValue == '\0')
- {
- RTPrintf("Value missing for argument '%s'\n", pcszName);
- rc = VERR_INVALID_STATE;
- break;
- }
-
- /* We have the name and value pair now. */
- bool fMandatory = false; /* Shut up gcc */
- rc = tstVDIoScriptArgumentParse(pVDScriptAction, pcszName, pcszValue, &paScriptArgs[cScriptArgs], &fMandatory);
- if (RT_SUCCESS(rc))
- {
- if (fMandatory)
- cMandatoryArgsReq--;
- cScriptArgs++;
- }
- }
- else
- {
- RTPrintf("Argument in invalid form\n");
- rc = VERR_INVALID_STATE;
- break;
- }
- }
-
- if ( RT_SUCCESS(rc)
- && cMandatoryArgsReq)
- {
- /* No arguments anymore but there are still mandatory arguments left. */
- RTPrintf("There are %u arguments missing for script action '%s\n", pVDScriptAction->pcszAction);
- rc = VERR_INVALID_STATE;
- }
-
- if (RT_SUCCESS(rc))
- *pcScriptArgs = cScriptArgs;
-
- return rc;
-}
-
-/**
- * Executes the script pointed to by the given stream.
- *
- * @returns IPRT status code.
- *
- * @param pStrm The stream handle of the script.
- * @param pGlob Global test data.
- */
-static int tstVDIoScriptExecute(PRTSTREAM pStrm, PVDTESTGLOB pGlob)
-{
- int rc = VINF_SUCCESS;
- char abBuffer[0x1000]; /* Current assumption that a line is never longer than 4096 bytes. */
- PVDSCRIPTARG paScriptArgs = NULL;
- unsigned cScriptArgsMax = 0;
-
- do
- {
- memset(abBuffer, 0, sizeof(abBuffer));
- rc = RTStrmGetLine(pStrm, abBuffer, sizeof(abBuffer));
- if (RT_SUCCESS(rc))
- {
- const char *pcszAction = NULL;
- char *psz = abBuffer;
-
- /* Skip space */
- psz = tstVDIoScriptSkipSpace(psz);
- if (!tstVDIoIsLineEnd(psz))
- {
- PCVDSCRIPTACTION pVDScriptAction = NULL;
-
- /* Get the action name. */
- pcszAction = psz;
-
- psz = tstVDIoScriptSkipNonSpace(psz);
- if (!tstVDIoIsLineEnd(psz))
- {
- Assert(RT_C_IS_SPACE(*psz));
- *psz++ = '\0';
- }
-
- /* Find the action. */
- for (unsigned i = 0; i < g_cScriptActions; i++)
- {
- if (!RTStrCmp(pcszAction, g_aScriptActions[i].pcszAction))
- {
- pVDScriptAction = &g_aScriptActions[i];
- break;
- }
- }
-
- if (pVDScriptAction)
- {
- /* Parse arguments. */
- if (cScriptArgsMax < pVDScriptAction->cArgDescs)
- {
- /* Increase arguments array. */
- if (paScriptArgs)
- RTMemFree(paScriptArgs);
-
- cScriptArgsMax = pVDScriptAction->cArgDescs;
- paScriptArgs = (PVDSCRIPTARG)RTMemAllocZ(cScriptArgsMax * sizeof(VDSCRIPTARG));
- }
-
- if (paScriptArgs)
- {
- unsigned cScriptArgs;
-
- rc = tstVDIoScriptArgumentListParse(psz, pVDScriptAction, paScriptArgs, &cScriptArgs);
- if (RT_SUCCESS(rc))
- {
- /* Execute the handler. */
- rc = pVDScriptAction->pfnHandler(pGlob, paScriptArgs, cScriptArgs);
- }
- }
- else
- {
- RTPrintf("Out of memory while allocating argument array for script action %s\n", pcszAction);
- rc = VERR_NO_MEMORY;
- }
- }
- else
- {
- RTPrintf("Script action %s is not known\n", pcszAction);
- rc = VERR_NOT_FOUND;
- }
- }
- /* else empty line, just continue */
- }
- } while(RT_SUCCESS(rc));
-
- if (rc == VERR_EOF)
- {
- RTPrintf("Successfully executed I/O script\n");
- rc = VINF_SUCCESS;
- }
- return rc;
-}
-
-/**
- * Executes the given I/O script.
+ * Executes the given I/O script using the new scripting engine.
*
* @returns nothing.
*
@@ -3625,17 +2656,28 @@ static int tstVDIoScriptExecute(PRTSTREAM pStrm, PVDTESTGLOB pGlob)
static void tstVDIoScriptRun(const char *pcszFilename)
{
int rc = VINF_SUCCESS;
- PRTSTREAM pScriptStrm; /**< Stream of the script file. */
VDTESTGLOB GlobTest; /**< Global test data. */
+ void *pvFile = NULL;
+ size_t cbFile = 0;
memset(&GlobTest, 0, sizeof(VDTESTGLOB));
RTListInit(&GlobTest.ListFiles);
RTListInit(&GlobTest.ListDisks);
RTListInit(&GlobTest.ListPatterns);
+ GlobTest.pszIoBackend = RTStrDup("memory");
+ if (!GlobTest.pszIoBackend)
+ {
+ RTPrintf("Out of memory allocating I/O backend string\n");
+ return;
+ }
- rc = RTStrmOpen(pcszFilename, "r", &pScriptStrm);
+ rc = RTFileReadAll(pcszFilename, &pvFile, &cbFile);
if (RT_SUCCESS(rc))
{
+ char *pszScript = RTStrDupN((char *)pvFile, cbFile);
+ RTFileReadAllFree(pvFile, cbFile);
+
+ AssertPtr(pszScript);
/* Init global test data. */
GlobTest.VDIfError.pfnError = tstVDError;
GlobTest.VDIfError.pfnMessage = tstVDMessage;
@@ -3664,24 +2706,34 @@ static void tstVDIoScriptRun(const char *pcszFilename)
AssertRC(rc);
/* Init I/O backend. */
- rc = VDIoBackendMemCreate(&GlobTest.pIoBackend);
+ rc = VDIoBackendCreate(&GlobTest.pIoBackend);
if (RT_SUCCESS(rc))
{
- /* Execute the script. */
- rc = tstVDIoScriptExecute(pScriptStrm, &GlobTest);
- if (RT_FAILURE(rc))
+ VDSCRIPTCTX hScriptCtx = NULL;
+ rc = VDScriptCtxCreate(&hScriptCtx);
+ if (RT_SUCCESS(rc))
{
- RTPrintf("Executing the script stream failed rc=%Rrc\n", rc);
+ rc = VDScriptCtxCallbacksRegister(hScriptCtx, g_aScriptActions, g_cScriptActions, &GlobTest);
+ AssertRC(rc);
+
+ rc = VDScriptCtxLoadScript(hScriptCtx, pszScript);
+ if (RT_FAILURE(rc))
+ {
+ RTPrintf("Loading the script failed rc=%Rrc\n", rc);
+ }
+ else
+ rc = VDScriptCtxCallFn(hScriptCtx, "main", NULL, 0);
+ VDScriptCtxDestroy(hScriptCtx);
}
- VDIoBackendMemDestroy(GlobTest.pIoBackend);
+ VDIoBackendDestroy(GlobTest.pIoBackend);
}
else
RTPrintf("Creating the I/O backend failed rc=%Rrc\n");
-
- RTStrmClose(pScriptStrm);
}
else
RTPrintf("Opening script failed rc=%Rrc\n", rc);
+
+ RTStrFree(GlobTest.pszIoBackend);
}
/**