a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/* $Id$ */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/** @file
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * IPRT Testcase - Profile IPRT I/O APIs.
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/*
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * Copyright (C) 2010 Oracle Corporation
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync *
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * available from http://www.virtualbox.org. This file is free software;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * General Public License (GPL) as published by the Free Software
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync *
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * The contents of this file may alternatively be used under the terms
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * of the Common Development and Distribution License Version 1.0
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * VirtualBox OSE distribution, in which case the provisions of the
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * CDDL are applicable instead of those of the GPL.
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync *
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * You may elect to license modified versions of this file under the
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * terms and conditions of either the GPL or the CDDL or both.
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/*******************************************************************************
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync* Header Files *
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync*******************************************************************************/
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync#include <iprt/file.h>
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync#include <iprt/dir.h>
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync#include <iprt/fs.h>
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync#include <iprt/getopt.h>
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync#include <iprt/param.h>
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync#include <iprt/path.h>
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync#include <iprt/string.h>
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync#include <iprt/test.h>
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync#include <iprt/time.h>
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/*******************************************************************************
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync* Global Variables *
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync*******************************************************************************/
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/** The test instance handle. */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsyncstatic RTTEST g_hTest;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/** The max number of nanoseconds to benchmark an operation. */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsyncstatic uint64_t g_cNsPerOperation = 1000*1000*1000;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/** The max operation count. */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsyncstatic uint32_t g_cMaxOperations = 1000000;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/** The path to the test directory. */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsyncstatic const char *g_pszTestDir = ".";
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/** The path to the primary test file. */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsyncstatic char g_szTestFile1[RTPATH_MAX];
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/** The path to the primary test directory. */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsyncstatic char g_szTestDir1[RTPATH_MAX];
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/** The path to a nonexistent file in an existing directory. */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsyncstatic char g_szNotExitingFile[RTPATH_MAX];
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/** The path to a nonexistent directory. */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsyncstatic char g_szNotExitingDir[RTPATH_MAX];
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/** The path to a nonexistent file in a nonexistent directory. */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsyncstatic char g_szNotExitingDirFile[RTPATH_MAX];
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/*******************************************************************************
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync* Defined Constants And Macros *
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync*******************************************************************************/
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync/**
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * Benchmark an operation.
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * @param stmt Statement to benchmark.
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * @param what String literal describing what's being benchmarked..
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync#define TIME_OP(stmt, what) \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync do \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync { \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync /* warm-up */ \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync stmt; \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync stmt; \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync /* the real thing */ \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync uint32_t cOps = 0; \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync uint64_t cNsElapsed = 0; \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync uint64_t u64StartTS = RTTimeNanoTS(); \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync for (;;) \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync { \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync stmt; \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync cOps++; \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync if ((cOps & 127) == 127) \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync { \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync cNsElapsed = RTTimeNanoTS() - u64StartTS; \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync if (cNsElapsed >= g_cNsPerOperation || cOps >= g_cMaxOperations) \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync break; \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync } \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync } \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTestValue(g_hTest, what, cNsElapsed / cOps, RTTESTUNIT_NS_PER_CALL); \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTestValue(g_hTest, what " cps", UINT64_C(10000000000) / (cNsElapsed * 10 / cOps), RTTESTUNIT_CALLS_PER_SEC); \
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync } while (0)
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsyncstatic void benchmarkPathQueryInfo(void)
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync{
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTestSub(g_hTest, "RTPathQueryInfo");
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTFSOBJINFO ObjInfo;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK_RC_RETV(RTPathQueryInfo(g_szNotExitingFile, &ObjInfo, RTFSOBJATTRADD_NOTHING), VERR_FILE_NOT_FOUND);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync TIME_OP(RTPathQueryInfo(g_szNotExitingFile, &ObjInfo, RTFSOBJATTRADD_NOTHING), "RTPathQueryInfo(g_szNotExitingFile)");
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync int rc = RTPathQueryInfo(g_szNotExitingDirFile, &ObjInfo, RTFSOBJATTRADD_NOTHING);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK_RETV(rc == VERR_PATH_NOT_FOUND || VERR_FILE_NOT_FOUND);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync TIME_OP(RTPathQueryInfo(g_szNotExitingDirFile, &ObjInfo, RTFSOBJATTRADD_NOTHING), "RTPathQueryInfo(g_szNotExitingDirFile)");
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK_RC_RETV(RTPathQueryInfo(g_pszTestDir, &ObjInfo, RTFSOBJATTRADD_NOTHING), VINF_SUCCESS);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync TIME_OP(RTPathQueryInfo(g_pszTestDir, &ObjInfo, RTFSOBJATTRADD_NOTHING), "RTPathQueryInfo(g_pszTestDir)");
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK_RC_RETV(RTPathQueryInfo(g_pszTestDir, &ObjInfo, RTFSOBJATTRADD_UNIX), VINF_SUCCESS);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync TIME_OP(RTPathQueryInfo(g_pszTestDir, &ObjInfo, RTFSOBJATTRADD_UNIX), "RTPathQueryInfo(g_pszTestDir,UNIX)");
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTestSubDone(g_hTest);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync}
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsyncDECL_FORCE_INLINE(int) benchmarkFileOpenCloseOp(const char *pszFilename)
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync{
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTFILE hFile;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync int rc = RTFileOpen(&hFile, pszFilename, RTFILE_O_READ | RTFILE_O_DENY_NONE | RTFILE_O_OPEN);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync if (RT_SUCCESS(rc))
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync rc = RTFileClose(hFile);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync return rc;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync}
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsyncstatic void benchmarkFileOpenClose(void)
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync{
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTestSub(g_hTest, "RTFileOpen + RTFileClose");
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK_RC_RETV(benchmarkFileOpenCloseOp(g_szNotExitingFile), VERR_FILE_NOT_FOUND);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync TIME_OP(benchmarkFileOpenCloseOp(g_szNotExitingFile), "RTFileOpen(g_szNotExitingFile)");
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK_RC_RETV(benchmarkFileOpenCloseOp(g_szNotExitingFile), VERR_FILE_NOT_FOUND);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync TIME_OP(benchmarkFileOpenCloseOp(g_szNotExitingFile), "RTFileOpen(g_szNotExitingFile)");
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync int rc = benchmarkFileOpenCloseOp(g_szNotExitingDirFile);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK_RETV(rc == VERR_PATH_NOT_FOUND || VERR_FILE_NOT_FOUND);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync TIME_OP(benchmarkFileOpenCloseOp(g_szNotExitingDirFile), "RTFileOpen(g_szNotExitingDirFile)");
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTestSubDone(g_hTest);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync}
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsyncstatic void benchmarkFileWriteByte(void)
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync{
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync RTTestSub(g_hTest, "RTFileWrite(byte)");
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync RTFILE hFile;
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync RTTESTI_CHECK_RC_RETV(RTFileOpen(&hFile, g_szTestFile1,
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync RTFILE_O_WRITE | RTFILE_O_DENY_NONE | RTFILE_O_CREATE_REPLACE
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync | (0655 << RTFILE_O_CREATE_MODE_SHIFT)),
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync VINF_SUCCESS);
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync static const char s_szContent[] = "0123456789abcdef";
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync uint32_t offContent = 0;
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync int rc;;
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync RTTESTI_CHECK_RC(rc = RTFileWrite(hFile, &s_szContent[offContent++ % RT_ELEMENTS(s_szContent)], 1, NULL), VINF_SUCCESS);
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync if (RT_SUCCESS(rc))
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync {
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync TIME_OP(RTFileWrite(hFile, &s_szContent[offContent++ % RT_ELEMENTS(s_szContent)], 1, NULL), "RTFileWrite(byte)");
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync }
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync RTTESTI_CHECK_RC(RTFileClose(hFile), VINF_SUCCESS);
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync RTTestSubDone(g_hTest);
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync}
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsyncint main(int argc, char **argv)
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync{
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTEXITCODE rcExit = RTTestInitAndCreate("tstRTPrfIO", &g_hTest);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync if (rcExit != RTEXITCODE_SUCCESS)
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync return rcExit;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTestBanner(g_hTest);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync /*
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * Parse arguments
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync static const RTGETOPTDEF s_aOptions[] =
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync {
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync { "--test-dir", 'd', RTGETOPT_REQ_STRING },
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync };
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync bool fFileOpenCloseTest = true;
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync bool fFileWriteByteTest = true;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync bool fPathQueryInfoTest = true;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync //bool fFileTests = true;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync //bool fDirTests = true;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync int ch;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTGETOPTUNION ValueUnion;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTGETOPTSTATE GetState;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, 0);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync while ((ch = RTGetOpt(&GetState, &ValueUnion)))
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync {
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync switch (ch)
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync {
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync case 'd':
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync g_pszTestDir = ValueUnion.psz;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync break;
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync case 'V':
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "$Revision$\n");
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync return RTTestSummaryAndDestroy(g_hTest);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync case 'h':
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "usage: testname [-d <testdir>]\n");
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync return RTTestSummaryAndDestroy(g_hTest);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync default:
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTestFailed(g_hTest, "invalid argument");
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTGetOptPrintError(ch, &ValueUnion);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync return RTTestSummaryAndDestroy(g_hTest);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync }
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync }
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync /*
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * Set up and check the prerequisites.
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK_RC(RTPathJoin(g_szTestFile1, sizeof(g_szTestFile1), g_pszTestDir, "tstRTPrfIO-TestFile1"), VINF_SUCCESS);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK_RC(RTPathJoin(g_szTestDir1, sizeof(g_szTestDir1), g_pszTestDir, "tstRTPrfIO-TestDir1"), VINF_SUCCESS);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK_RC(RTPathJoin(g_szNotExitingFile, sizeof(g_szNotExitingFile), g_pszTestDir, "tstRTPrfIO-nonexistent-file"), VINF_SUCCESS);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK_RC(RTPathJoin(g_szNotExitingDir, sizeof(g_szNotExitingDir), g_pszTestDir, "tstRTPrfIO-nonexistent-dir"), VINF_SUCCESS);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK_RC(RTPathJoin(g_szNotExitingDirFile, sizeof(g_szNotExitingDirFile), g_szNotExitingDir, "nonexistent-file"), VINF_SUCCESS);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK(RTDirExists(g_pszTestDir));
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync if (RTPathExists(g_szTestDir1))
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTestFailed(g_hTest, "The primary test directory (%s) already exist, please remove it", g_szTestDir1);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync if (RTPathExists(g_szTestFile1))
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTestFailed(g_hTest, "The primary test file (%s) already exist, please remove it", g_szTestFile1);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync if (RTPathExists(g_szNotExitingFile))
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTestFailed(g_hTest, "'%s' exists, remove it", g_szNotExitingFile);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync if (RTPathExists(g_szNotExitingDir))
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTestFailed(g_hTest, "'%s' exists, remove it", g_szNotExitingDir);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync if (RTPathExists(g_szNotExitingDirFile))
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTestFailed(g_hTest, "'%s' exists, remove it", g_szNotExitingDirFile);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync /*
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * Do the testing.
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync if (RTTestIErrorCount() == 0)
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync {
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync#if 1
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync if (fPathQueryInfoTest)
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync benchmarkPathQueryInfo();
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync if (fFileOpenCloseTest)
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync benchmarkFileOpenClose();
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync#endif
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync if (fFileWriteByteTest)
577af8ad2e80ab546ca4efcf024ed53e5155a73dvboxsync benchmarkFileWriteByte();
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync //if (fFileTests)
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync // benchmarkFile();
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync //if (fDirTests)
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync // benchmarkDir();
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync /*
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync * Cleanup.
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync */
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTFileDelete(g_szTestFile1);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTDirRemoveRecursive(g_szTestDir1, 0);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK(RTDirExists(g_pszTestDir));
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK(!RTPathExists(g_szTestDir1));
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync RTTESTI_CHECK(!RTPathExists(g_szTestFile1));
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync }
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync return RTTestSummaryAndDestroy(g_hTest);
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync}
a1d51fdf51d2e97672303b6bb0bcba738feb9780vboxsync