tstSharedFolderService.cpp revision 920730ce664b646eea6da4219b93030b1ee32405
82391de567696f10b21a762fde6a06fe3c266d28vboxsync/* $Id$ */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync/** @file
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * Testcase for the shared folder service vbsf API.
82391de567696f10b21a762fde6a06fe3c266d28vboxsync *
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * Note that this is still very threadbare (there is an awful lot which should
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * really be tested, but it already took too long to produce this much). The
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * idea is that anyone who makes changes to the shared folders service and who
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * cares about unit testing them should add tests to the skeleton framework to
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * exercise the bits they change before and after changing them.
82391de567696f10b21a762fde6a06fe3c266d28vboxsync */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync/*
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * Copyright (C) 2011-2013 Oracle Corporation
82391de567696f10b21a762fde6a06fe3c266d28vboxsync *
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * available from http://www.virtualbox.org. This file is free software;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * you can redistribute it and/or modify it under the terms of the GNU
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * General Public License (GPL) as published by the Free Software
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
82391de567696f10b21a762fde6a06fe3c266d28vboxsync */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync/******************************************************************************
82391de567696f10b21a762fde6a06fe3c266d28vboxsync* Header Files *
82391de567696f10b21a762fde6a06fe3c266d28vboxsync******************************************************************************/
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#include "tstSharedFolderService.h"
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#include "vbsf.h"
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#include <iprt/fs.h>
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#include <iprt/dir.h>
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#include <iprt/file.h>
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#include <iprt/path.h>
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#include <iprt/symlink.h>
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync#include <iprt/stream.h>
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync#include <iprt/test.h>
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync#include "teststubs.h"
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/******************************************************************************
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync* Global Variables *
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync******************************************************************************/
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic RTTEST g_hTest = NIL_RTTEST;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/******************************************************************************
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync* Declarations *
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync******************************************************************************/
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern "C" DECLCALLBACK(DECLEXPORT(int)) VBoxHGCMSvcLoad (VBOXHGCMSVCFNTABLE *ptable);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/******************************************************************************
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync* Helpers *
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync******************************************************************************/
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/** Simple call handle structure for the guest call completion callback */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstruct VBOXHGCMCALLHANDLE_TYPEDEF
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync /** Where to store the result code */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync int32_t rc;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync};
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/** Call completion callback for guest calls. */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic void callComplete(VBOXHGCMCALLHANDLE callHandle, int32_t rc)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync callHandle->rc = rc;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/**
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync * Initialise the HGCM service table as much as we need to start the
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync * service
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync * @param pTable the table to initialise
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncvoid initTable(VBOXHGCMSVCFNTABLE *pTable, VBOXHGCMSVCHELPERS *pHelpers)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pTable->cbSize = sizeof (VBOXHGCMSVCFNTABLE);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pTable->u32Version = VBOX_HGCM_SVC_VERSION;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pHelpers->pfnCallComplete = callComplete;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pTable->pHelpers = pHelpers;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync#define LLUIFY(a) ((unsigned long long)(a))
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic void bufferFromString(void *pvDest, size_t cb, const char *pcszSrc)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync char *pchDest = (char *)pvDest;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync Assert((cb) > 0);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync strncpy((pchDest), (pcszSrc), (cb) - 1);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync (pchDest)[(cb) - 1] = 0;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic void bufferFromPath(void *pvDest, size_t cb, const char *pcszSrc)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync char *psz;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync bufferFromString(pvDest, cb, pcszSrc);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync for (psz = (char *)pvDest; psz && psz < (char *)pvDest + cb; ++psz)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (*psz == '\\')
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync *psz = '/';
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync#define ARRAY_FROM_PATH(a, b) \
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync do { \
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync Assert((a) == (a)); /* Constant parameter */ \
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync Assert(sizeof((a)) > 0); \
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync bufferFromPath(a, sizeof(a), b); \
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync } while (0)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/******************************************************************************
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync* Stub functions and data *
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync******************************************************************************/
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic PRTDIR testRTDirClosepDir;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTDirClose(PRTDIR pDir)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync /* RTPrintf("%s: pDir=%p\n", __PRETTY_FUNCTION__, pDir); */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync testRTDirClosepDir = pDir;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic char testRTDirCreatePath[256];
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic RTFMODE testRTDirCreateMode;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTDirCreate(const char *pszPath, RTFMODE fMode, uint32_t fCreate)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync /* RTPrintf("%s: pszPath=%s, fMode=0x%llx\n", __PRETTY_FUNCTION__, pszPath,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync LLUIFY(fMode)); */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync ARRAY_FROM_PATH(testRTDirCreatePath, pszPath);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return 0;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic char testRTDirOpenName[256];
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic PRTDIR testRTDirOpenpDir;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTDirOpen(PRTDIR *ppDir, const char *pszPath)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync /* RTPrintf("%s: pszPath=%s\n", __PRETTY_FUNCTION__, pszPath); */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync ARRAY_FROM_PATH(testRTDirOpenName, pszPath);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync *ppDir = testRTDirOpenpDir;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync testRTDirOpenpDir = 0;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/** @todo Do something useful with the last two arguments. */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTDirOpenFiltered(PRTDIR *ppDir, const char *pszPath, RTDIRFILTER, uint32_t)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync /* RTPrintf("%s: pszPath=%s\n", __PRETTY_FUNCTION__, pszPath); */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync ARRAY_FROM_PATH(testRTDirOpenName, pszPath);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync *ppDir = testRTDirOpenpDir;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync testRTDirOpenpDir = 0;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic PRTDIR testRTDirQueryInfoDir;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic RTTIMESPEC testRTDirQueryInfoATime;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTDirQueryInfo(PRTDIR pDir, PRTFSOBJINFO pObjInfo,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTFSOBJATTRADD enmAdditionalAttribs)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync /* RTPrintf("%s: pDir=%p, enmAdditionalAttribs=0x%llx\n", __PRETTY_FUNCTION__,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pDir, LLUIFY(enmAdditionalAttribs)); */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync testRTDirQueryInfoDir = pDir;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RT_ZERO(*pObjInfo);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pObjInfo->AccessTime = testRTDirQueryInfoATime;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RT_ZERO(testRTDirQueryInfoATime);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTDirRemove(const char *pszPath) { RTPrintf("%s\n", __PRETTY_FUNCTION__); return 0; }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic PRTDIR testRTDirReadExDir;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTDirReadEx(PRTDIR pDir, PRTDIRENTRYEX pDirEntry,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync size_t *pcbDirEntry,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTFSOBJATTRADD enmAdditionalAttribs,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync uint32_t fFlags)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync /* RTPrintf("%s: pDir=%p, pcbDirEntry=%d, enmAdditionalAttribs=%llu, fFlags=0x%llx\n",
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync __PRETTY_FUNCTION__, pDir, pcbDirEntry ? (int) *pcbDirEntry : -1,
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync LLUIFY(enmAdditionalAttribs), LLUIFY(fFlags)); */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync testRTDirReadExDir = pDir;
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync return VERR_NO_MORE_FILES;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic RTTIMESPEC testRTDirSetTimesATime;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTDirSetTimes(PRTDIR pDir, PCRTTIMESPEC pAccessTime,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync PCRTTIMESPEC pModificationTime,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync PCRTTIMESPEC pChangeTime,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync PCRTTIMESPEC pBirthTime)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync /* RTPrintf("%s: pDir=%p, *pAccessTime=%lli, *pModificationTime=%lli, *pChangeTime=%lli, *pBirthTime=%lli\n",
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync __PRETTY_FUNCTION__, pDir,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pAccessTime ? (long long)RTTimeSpecGetNano(pAccessTime) : -1,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pModificationTime
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync ? (long long)RTTimeSpecGetNano(pModificationTime) : -1,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pChangeTime ? (long long)RTTimeSpecGetNano(pChangeTime) : -1,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pBirthTime ? (long long)RTTimeSpecGetNano(pBirthTime) : -1); */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (pAccessTime)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync testRTDirSetTimesATime = *pAccessTime;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync else
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RT_ZERO(testRTDirSetTimesATime);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic RTFILE testRTFileCloseFile;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTFileClose(RTFILE File)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* RTPrintf("%s: File=%p\n", __PRETTY_FUNCTION__, File); */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync testRTFileCloseFile = File;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return 0;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncextern int testRTFileDelete(const char *pszFilename) { RTPrintf("%s\n", __PRETTY_FUNCTION__); return 0; }
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic RTFILE testRTFileFlushFile;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncextern int testRTFileFlush(RTFILE File)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* RTPrintf("%s: File=%p\n", __PRETTY_FUNCTION__, File); */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync testRTFileFlushFile = File;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return VINF_SUCCESS;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic RTFILE testRTFileLockFile;
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic unsigned testRTFileLockfLock;
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic int64_t testRTFileLockOffset;
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic uint64_t testRTFileLockSize;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncextern int testRTFileLock(RTFILE hFile, unsigned fLock, int64_t offLock,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync uint64_t cbLock)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* RTPrintf("%s: hFile=%p, fLock=%u, offLock=%lli, cbLock=%llu\n",
82391de567696f10b21a762fde6a06fe3c266d28vboxsync __PRETTY_FUNCTION__, hFile, fLock, (long long) offLock,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync LLUIFY(cbLock)); */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync testRTFileLockFile = hFile;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync testRTFileLockfLock = fLock;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync testRTFileLockOffset = offLock;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync testRTFileLockSize = cbLock;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return VINF_SUCCESS;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic char testRTFileOpenName[256];
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic uint64_t testRTFileOpenFlags;
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic RTFILE testRTFileOpenpFile;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTFileOpen(PRTFILE pFile, const char *pszFilename,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync uint64_t fOpen)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync /* RTPrintf("%s, pszFilename=%s, fOpen=0x%llx\n", __PRETTY_FUNCTION__,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pszFilename, LLUIFY(fOpen)); */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync ARRAY_FROM_PATH(testRTFileOpenName, pszFilename);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync testRTFileOpenFlags = fOpen;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync *pFile = testRTFileOpenpFile;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync testRTFileOpenpFile = 0;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return VINF_SUCCESS;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic RTFILE testRTFileQueryInfoFile;
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic RTTIMESPEC testRTFileQueryInfoATime;
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic uint32_t testRTFileQueryInfoFMode;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncextern int testRTFileQueryInfo(RTFILE hFile, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAdditionalAttribs)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* RTPrintf("%s, hFile=%p, enmAdditionalAttribs=0x%llx\n",
82391de567696f10b21a762fde6a06fe3c266d28vboxsync __PRETTY_FUNCTION__, hFile, LLUIFY(enmAdditionalAttribs)); */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync testRTFileQueryInfoFile = hFile;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync RT_ZERO(*pObjInfo);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync pObjInfo->AccessTime = testRTFileQueryInfoATime;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync RT_ZERO(testRTDirQueryInfoATime);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync pObjInfo->Attr.fMode = testRTFileQueryInfoFMode;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync testRTFileQueryInfoFMode = 0;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return VINF_SUCCESS;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic const char *testRTFileReadData;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncextern int testRTFileRead(RTFILE File, void *pvBuf, size_t cbToRead,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync size_t *pcbRead)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* RTPrintf("%s : File=%p, cbToRead=%llu\n", __PRETTY_FUNCTION__, File,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync LLUIFY(cbToRead)); */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync bufferFromPath(pvBuf, cbToRead, testRTFileReadData);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (pcbRead)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync *pcbRead = RT_MIN(cbToRead, strlen(testRTFileReadData) + 1);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync testRTFileReadData = 0;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return VINF_SUCCESS;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
401ce2099f0ede0091ea3f661331c6f1dd117d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncextern int testRTFileSeek(RTFILE hFile, int64_t offSeek, unsigned uMethod,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync uint64_t *poffActual)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* RTPrintf("%s : hFile=%p, offSeek=%llu, uMethod=%u\n", __PRETTY_FUNCTION__,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync hFile, LLUIFY(offSeek), uMethod); */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (poffActual)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync *poffActual = 0;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return VINF_SUCCESS;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic uint64_t testRTFileSetFMode;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
401ce2099f0ede0091ea3f661331c6f1dd117d28vboxsyncextern int testRTFileSetMode(RTFILE File, RTFMODE fMode)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* RTPrintf("%s: fMode=%llu\n", __PRETTY_FUNCTION__, LLUIFY(fMode)); */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync testRTFileSetFMode = fMode;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return VINF_SUCCESS;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic RTFILE testRTFileSetSizeFile;
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic RTFOFF testRTFileSetSizeSize;
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsyncextern int testRTFileSetSize(RTFILE File, uint64_t cbSize)
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* RTPrintf("%s: File=%llu, cbSize=%llu\n", __PRETTY_FUNCTION__, LLUIFY(File),
82391de567696f10b21a762fde6a06fe3c266d28vboxsync LLUIFY(cbSize)); */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync testRTFileSetSizeFile = File;
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync testRTFileSetSizeSize = (RTFOFF) cbSize; /* Why was this signed before? */
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync return VINF_SUCCESS;
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync}
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsyncstatic RTTIMESPEC testRTFileSetTimesATime;
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsyncextern int testRTFileSetTimes(RTFILE File, PCRTTIMESPEC pAccessTime,
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync PCRTTIMESPEC pModificationTime,
1eca9bc66f92b644829034ae391e6fc3591e93e0vboxsync PCRTTIMESPEC pChangeTime,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync PCRTTIMESPEC pBirthTime)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* RTPrintf("%s: pFile=%p, *pAccessTime=%lli, *pModificationTime=%lli, *pChangeTime=%lli, *pBirthTime=%lli\n",
82391de567696f10b21a762fde6a06fe3c266d28vboxsync __PRETTY_FUNCTION__,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync pAccessTime ? (long long)RTTimeSpecGetNano(pAccessTime) : -1,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync pModificationTime
82391de567696f10b21a762fde6a06fe3c266d28vboxsync ? (long long)RTTimeSpecGetNano(pModificationTime) : -1,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync pChangeTime ? (long long)RTTimeSpecGetNano(pChangeTime) : -1,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync pBirthTime ? (long long)RTTimeSpecGetNano(pBirthTime) : -1); */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync if (pAccessTime)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync testRTFileSetTimesATime = *pAccessTime;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync else
82391de567696f10b21a762fde6a06fe3c266d28vboxsync RT_ZERO(testRTFileSetTimesATime);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync return VINF_SUCCESS;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic RTFILE testRTFileUnlockFile;
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic int64_t testRTFileUnlockOffset;
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic uint64_t testRTFileUnlockSize;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTFileUnlock(RTFILE File, int64_t offLock, uint64_t cbLock)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* RTPrintf("%s: hFile=%p, ofLock=%lli, cbLock=%llu\n", __PRETTY_FUNCTION__,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync File, (long long) offLock, LLUIFY(cbLock)); */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync testRTFileUnlockFile = File;
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync testRTFileUnlockOffset = offLock;
5bc51087a0577d3f18701d7ff0fdc253cbd6bbf6vboxsync testRTFileUnlockSize = cbLock;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return VINF_SUCCESS;
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync}
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsyncstatic char testRTFileWriteData[256];
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsyncextern int testRTFileWrite(RTFILE File, const void *pvBuf, size_t cbToWrite,
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync size_t *pcbWritten)
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync{
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync /* RTPrintf("%s: File=%p, pvBuf=%.*s, cbToWrite=%llu\n", __PRETTY_FUNCTION__,
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync File, cbToWrite, (const char *)pvBuf, LLUIFY(cbToWrite)); */
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync ARRAY_FROM_PATH(testRTFileWriteData, (const char *)pvBuf);
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync if (pcbWritten)
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync *pcbWritten = strlen(testRTFileWriteData) + 1;
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsync return VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
ebcdaa5077bc9189c419330b1c84880018e3db99vboxsyncextern int testRTFsQueryProperties(const char *pszFsPath,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync PRTFSPROPERTIES pProperties)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync /* RTPrintf("%s, pszFsPath=%s\n", __PRETTY_FUNCTION__, pszFsPath);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RT_ZERO(*pProperties); */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pProperties->cbMaxComponent = 256;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync pProperties->fCaseSensitive = true;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTFsQuerySerial(const char *pszFsPath, uint32_t *pu32Serial)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{ RTPrintf("%s\n", __PRETTY_FUNCTION__); return 0; }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTFsQuerySizes(const char *pszFsPath, PRTFOFF pcbTotal,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTFOFF *pcbFree, uint32_t *pcbBlock,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync uint32_t *pcbSector) { RTPrintf("%s\n", __PRETTY_FUNCTION__); return 0; }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTPathQueryInfoEx(const char *pszPath,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync PRTFSOBJINFO pObjInfo,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RTFSOBJATTRADD enmAdditionalAttribs,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync uint32_t fFlags)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync /* RTPrintf("%s: pszPath=%s, enmAdditionalAttribs=0x%x, fFlags=0x%x\n",
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync __PRETTY_FUNCTION__, pszPath, (unsigned) enmAdditionalAttribs,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync (unsigned) fFlags); */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RT_ZERO(*pObjInfo);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTSymlinkDelete(const char *pszSymlink, uint32_t fDelete)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{ RTPrintf("%s\n", __PRETTY_FUNCTION__); return 0; }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncextern int testRTSymlinkRead(const char *pszSymlink, char *pszTarget,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync size_t cbTarget, uint32_t fRead)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{ RTPrintf("%s\n", __PRETTY_FUNCTION__); return 0; }
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/******************************************************************************
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync* Tests *
924c248d11ce3849739cc64791d34564d68869cevboxsync******************************************************************************/
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/* Sub-tests for testMappingsQuery(). */
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid testMappingsQuerySimple(RTTEST hTest) {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid testMappingsQueryTooFewBuffers(RTTEST hTest) {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid testMappingsQueryAutoMount(RTTEST hTest) {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid testMappingsQueryArrayWrongSize(RTTEST hTest) {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/* Sub-tests for testMappingsQueryName(). */
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid testMappingsQueryNameValid(RTTEST hTest) {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid testMappingsQueryNameInvalid(RTTEST hTest) {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid testMappingsQueryNameBadBuffer(RTTEST hTest) {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
924c248d11ce3849739cc64791d34564d68869cevboxsync/* Sub-tests for testMapFolder(). */
924c248d11ce3849739cc64791d34564d68869cevboxsyncvoid testMapFolderValid(RTTEST hTest) {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid testMapFolderInvalid(RTTEST hTest) {}
924c248d11ce3849739cc64791d34564d68869cevboxsyncvoid testMapFolderTwice(RTTEST hTest) {}
924c248d11ce3849739cc64791d34564d68869cevboxsyncvoid testMapFolderDelimiter(RTTEST hTest) {}
924c248d11ce3849739cc64791d34564d68869cevboxsyncvoid testMapFolderCaseSensitive(RTTEST hTest) {}
924c248d11ce3849739cc64791d34564d68869cevboxsyncvoid testMapFolderCaseInsensitive(RTTEST hTest) {}
924c248d11ce3849739cc64791d34564d68869cevboxsyncvoid testMapFolderBadParameters(RTTEST hTest) {}
924c248d11ce3849739cc64791d34564d68869cevboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/* Sub-tests for testUnmapFolder(). */
924c248d11ce3849739cc64791d34564d68869cevboxsyncvoid testUnmapFolderValid(RTTEST hTest) {}
924c248d11ce3849739cc64791d34564d68869cevboxsyncvoid testUnmapFolderInvalid(RTTEST hTest) {}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncvoid testUnmapFolderBadParameters(RTTEST hTest) {}
924c248d11ce3849739cc64791d34564d68869cevboxsync
924c248d11ce3849739cc64791d34564d68869cevboxsync/* Sub-tests for testCreate(). */
924c248d11ce3849739cc64791d34564d68869cevboxsyncvoid testCreateBadParameters(RTTEST hTest) {}
924c248d11ce3849739cc64791d34564d68869cevboxsync
924c248d11ce3849739cc64791d34564d68869cevboxsync/* Sub-tests for testClose(). */
924c248d11ce3849739cc64791d34564d68869cevboxsyncvoid testCloseBadParameters(RTTEST hTest) {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/* Sub-tests for testRead(). */
924c248d11ce3849739cc64791d34564d68869cevboxsyncvoid testReadBadParameters(RTTEST hTest) {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync/* Sub-tests for testWrite(). */
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid testWriteBadParameters(RTTEST hTest) {}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/* Sub-tests for testLock(). */
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid testLockBadParameters(RTTEST hTest) {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync/* Sub-tests for testFlush(). */
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid testFlushBadParameters(RTTEST hTest) {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/* Sub-tests for testDirList(). */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncvoid testDirListBadParameters(RTTEST hTest) {}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/* Sub-tests for testReadLink(). */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncvoid testReadLinkBadParameters(RTTEST hTest) {}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/* Sub-tests for testFSInfo(). */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncvoid testFSInfoBadParameters(RTTEST hTest) {}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/* Sub-tests for testRemove(). */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncvoid testRemoveBadParameters(RTTEST hTest) {}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/* Sub-tests for testRename(). */
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid testRenameBadParameters(RTTEST hTest) {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync/* Sub-tests for testSymlink(). */
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid testSymlinkBadParameters(RTTEST hTest) {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/* Sub-tests for testMappingsAdd(). */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncvoid testMappingsAddBadParameters(RTTEST hTest) {}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync/* Sub-tests for testMappingsRemove(). */
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncvoid testMappingsRemoveBadParameters(RTTEST hTest) {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstruct TESTSHFLSTRING
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync SHFLSTRING string;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync char acData[256];
82391de567696f10b21a762fde6a06fe3c266d28vboxsync};
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsyncstatic void fillTestShflString(struct TESTSHFLSTRING *pDest,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync const char *pcszSource)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync AssertRelease( strlen(pcszSource) * 2 + 2
82391de567696f10b21a762fde6a06fe3c266d28vboxsync < sizeof(*pDest) - RT_UOFFSETOF(SHFLSTRING, String));
82391de567696f10b21a762fde6a06fe3c266d28vboxsync pDest->string.u16Length = (uint16_t)(strlen(pcszSource) * sizeof(RTUTF16));
82391de567696f10b21a762fde6a06fe3c266d28vboxsync pDest->string.u16Size = pDest->string.u16Length + sizeof(RTUTF16);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync for (unsigned i = 0; i <= pDest->string.u16Length; ++i)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync pDest->string.String.ucs2[i] = (uint16_t)pcszSource[i];
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic SHFLROOT initWithWritableMapping(RTTEST hTest,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync VBOXHGCMSVCFNTABLE *psvcTable,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync VBOXHGCMSVCHELPERS *psvcHelpers,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync const char *pcszFolderName,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync const char *pcszMapping)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync{
82391de567696f10b21a762fde6a06fe3c266d28vboxsync VBOXHGCMSVCPARM aParms[RT_MAX(SHFL_CPARMS_ADD_MAPPING,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync SHFL_CPARMS_MAP_FOLDER)];
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync struct TESTSHFLSTRING FolderName;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync struct TESTSHFLSTRING Mapping;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync VBOXHGCMCALLHANDLE_TYPEDEF callHandle = { VINF_SUCCESS };
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync int rc;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync initTable(psvcTable, psvcHelpers);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync AssertReleaseRC(VBoxHGCMSvcLoad(psvcTable));
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync AssertRelease( psvcTable->pvService
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync = RTTestGuardedAllocTail(hTest, psvcTable->cbClient));
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync fillTestShflString(&FolderName, pcszFolderName);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync fillTestShflString(&Mapping, pcszMapping);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync aParms[0].setPointer(&FolderName, RT_UOFFSETOF(SHFLSTRING, String)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync + FolderName.string.u16Size);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync aParms[1].setPointer(&Mapping, RT_UOFFSETOF(SHFLSTRING, String)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync + Mapping.string.u16Size);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync aParms[2].setUInt32(1);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = psvcTable->pfnHostCall(psvcTable->pvService, SHFL_FN_ADD_MAPPING,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync SHFL_CPARMS_ADD_MAPPING, aParms);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync AssertReleaseRC(rc);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync aParms[0].setPointer(&Mapping, RT_UOFFSETOF(SHFLSTRING, String)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync + Mapping.string.u16Size);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync aParms[1].setUInt32(0); /* root */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync aParms[2].setUInt32('/'); /* delimiter */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync aParms[3].setUInt32(1); /* case sensitive */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync psvcTable->pfnCall(psvcTable->pvService, &callHandle, 0,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync psvcTable->pvService, SHFL_FN_MAP_FOLDER,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync SHFL_CPARMS_MAP_FOLDER, aParms);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync AssertReleaseRC(callHandle.rc);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return aParms[1].u.uint32;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync/** @todo Mappings should be automatically removed by unloading the service,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync * but unloading is currently a no-op! */
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic void unmapAndRemoveMapping(RTTEST hTest, VBOXHGCMSVCFNTABLE *psvcTable,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync SHFLROOT root, const char *pcszFolderName)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync VBOXHGCMSVCPARM aParms[RT_MAX(SHFL_CPARMS_UNMAP_FOLDER,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync SHFL_CPARMS_REMOVE_MAPPING)];
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync VBOXHGCMCALLHANDLE_TYPEDEF callHandle = { VINF_SUCCESS };
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync struct TESTSHFLSTRING FolderName;
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync int rc;
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync aParms[0].setUInt32(root);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync psvcTable->pfnCall(psvcTable->pvService, &callHandle, 0,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync psvcTable->pvService, SHFL_FN_UNMAP_FOLDER,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync SHFL_CPARMS_UNMAP_FOLDER, aParms);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync AssertReleaseRC(callHandle.rc);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync fillTestShflString(&FolderName, pcszFolderName);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync aParms[0].setPointer(&FolderName, RT_UOFFSETOF(SHFLSTRING, String)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync + FolderName.string.u16Size);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync rc = psvcTable->pfnHostCall(psvcTable->pvService, SHFL_FN_REMOVE_MAPPING,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync SHFL_CPARMS_REMOVE_MAPPING, aParms);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync AssertReleaseRC(rc);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsyncstatic int createFile(VBOXHGCMSVCFNTABLE *psvcTable, SHFLROOT Root,
7aa42d10cb8b82c5a71c7929d6ec98c6dda96410vboxsync const char *pcszFilename, uint32_t fCreateFlags,
7aa42d10cb8b82c5a71c7929d6ec98c6dda96410vboxsync SHFLHANDLE *pHandle, SHFLCREATERESULT *pResult)
7aa42d10cb8b82c5a71c7929d6ec98c6dda96410vboxsync{
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync VBOXHGCMSVCPARM aParms[SHFL_CPARMS_CREATE];
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync struct TESTSHFLSTRING Path;
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync SHFLCREATEPARMS CreateParms;
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync VBOXHGCMCALLHANDLE_TYPEDEF callHandle = { VINF_SUCCESS };
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync fillTestShflString(&Path, pcszFilename);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync RT_ZERO(CreateParms);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync CreateParms.CreateFlags = fCreateFlags;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync aParms[0].setUInt32(Root);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync aParms[1].setPointer(&Path, RT_UOFFSETOF(SHFLSTRING, String)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync + Path.string.u16Size);
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync aParms[2].setPointer(&CreateParms, sizeof(CreateParms));
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync psvcTable->pfnCall(psvcTable->pvService, &callHandle, 0,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync psvcTable->pvService, SHFL_FN_CREATE,
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync RT_ELEMENTS(aParms), aParms);
7aa42d10cb8b82c5a71c7929d6ec98c6dda96410vboxsync if (RT_FAILURE(callHandle.rc))
7aa42d10cb8b82c5a71c7929d6ec98c6dda96410vboxsync return callHandle.rc;
7aa42d10cb8b82c5a71c7929d6ec98c6dda96410vboxsync if (pHandle)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync *pHandle = CreateParms.Handle;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync if (pResult)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync *pResult = CreateParms.Result;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync return VINF_SUCCESS;
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync}
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsyncstatic int readFile(VBOXHGCMSVCFNTABLE *psvcTable, SHFLROOT Root,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync SHFLHANDLE hFile, uint64_t offSeek, uint32_t cbRead,
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync uint32_t *pcbRead, void *pvBuf, uint32_t cbBuf)
7b4c4bb29760b28b5727231ad446462a5b0cc01avboxsync{
VBOXHGCMSVCPARM aParms[SHFL_CPARMS_READ];
VBOXHGCMCALLHANDLE_TYPEDEF callHandle = { VINF_SUCCESS };
aParms[0].setUInt32(Root);
aParms[1].setUInt64((uint64_t) hFile);
aParms[2].setUInt64(offSeek);
aParms[3].setUInt32(cbRead);
aParms[4].setPointer(pvBuf, cbBuf);
psvcTable->pfnCall(psvcTable->pvService, &callHandle, 0,
psvcTable->pvService, SHFL_FN_READ,
RT_ELEMENTS(aParms), aParms);
if (pcbRead)
*pcbRead = aParms[3].u.uint32;
return callHandle.rc;
}
static int writeFile(VBOXHGCMSVCFNTABLE *psvcTable, SHFLROOT Root,
SHFLHANDLE hFile, uint64_t offSeek, uint32_t cbWrite,
uint32_t *pcbWritten, const void *pvBuf, uint32_t cbBuf)
{
VBOXHGCMSVCPARM aParms[SHFL_CPARMS_WRITE];
VBOXHGCMCALLHANDLE_TYPEDEF callHandle = { VINF_SUCCESS };
aParms[0].setUInt32(Root);
aParms[1].setUInt64((uint64_t) hFile);
aParms[2].setUInt64(offSeek);
aParms[3].setUInt32(cbWrite);
aParms[4].setPointer((void *)pvBuf, cbBuf);
psvcTable->pfnCall(psvcTable->pvService, &callHandle, 0,
psvcTable->pvService, SHFL_FN_WRITE,
RT_ELEMENTS(aParms), aParms);
if (pcbWritten)
*pcbWritten = aParms[3].u.uint32;
return callHandle.rc;
}
static int flushFile(VBOXHGCMSVCFNTABLE *psvcTable, SHFLROOT root,
SHFLHANDLE handle)
{
VBOXHGCMSVCPARM aParms[SHFL_CPARMS_FLUSH];
VBOXHGCMCALLHANDLE_TYPEDEF callHandle = { VINF_SUCCESS };
aParms[0].setUInt32(root);
aParms[1].setUInt64(handle);
psvcTable->pfnCall(psvcTable->pvService, &callHandle, 0,
psvcTable->pvService, SHFL_FN_FLUSH,
SHFL_CPARMS_FLUSH, aParms);
return callHandle.rc;
}
static int listDir(VBOXHGCMSVCFNTABLE *psvcTable, SHFLROOT root,
SHFLHANDLE handle, uint32_t fFlags, uint32_t cb,
const char *pcszPath, void *pvBuf, uint32_t cbBuf,
uint32_t resumePoint, uint32_t *pcFiles)
{
VBOXHGCMSVCPARM aParms[SHFL_CPARMS_LIST];
struct TESTSHFLSTRING Path;
VBOXHGCMCALLHANDLE_TYPEDEF callHandle = { VINF_SUCCESS };
aParms[0].setUInt32(root);
aParms[1].setUInt64(handle);
aParms[2].setUInt32(fFlags);
aParms[3].setUInt32(cb);
if (pcszPath)
{
fillTestShflString(&Path, pcszPath);
aParms[4].setPointer(&Path, RT_UOFFSETOF(SHFLSTRING, String)
+ Path.string.u16Size);
}
else
aParms[4].setPointer(NULL, 0);
aParms[5].setPointer(pvBuf, cbBuf);
aParms[6].setUInt32(resumePoint);
aParms[7].setUInt32(0);
psvcTable->pfnCall(psvcTable->pvService, &callHandle, 0,
psvcTable->pvService, SHFL_FN_LIST,
RT_ELEMENTS(aParms), aParms);
if (pcFiles)
*pcFiles = aParms[7].u.uint32;
return callHandle.rc;
}
static int sfInformation(VBOXHGCMSVCFNTABLE *psvcTable, SHFLROOT root,
SHFLHANDLE handle, uint32_t fFlags, uint32_t cb,
SHFLFSOBJINFO *pInfo)
{
VBOXHGCMSVCPARM aParms[SHFL_CPARMS_INFORMATION];
VBOXHGCMCALLHANDLE_TYPEDEF callHandle = { VINF_SUCCESS };
aParms[0].setUInt32(root);
aParms[1].setUInt64(handle);
aParms[2].setUInt32(fFlags);
aParms[3].setUInt32(cb);
aParms[4].setPointer(pInfo, cb);
psvcTable->pfnCall(psvcTable->pvService, &callHandle, 0,
psvcTable->pvService, SHFL_FN_INFORMATION,
RT_ELEMENTS(aParms), aParms);
return callHandle.rc;
}
static int lockFile(VBOXHGCMSVCFNTABLE *psvcTable, SHFLROOT root,
SHFLHANDLE handle, int64_t offLock, uint64_t cbLock,
uint32_t fFlags)
{
VBOXHGCMSVCPARM aParms[SHFL_CPARMS_LOCK];
VBOXHGCMCALLHANDLE_TYPEDEF callHandle = { VINF_SUCCESS };
aParms[0].setUInt32(root);
aParms[1].setUInt64(handle);
aParms[2].setUInt64(offLock);
aParms[3].setUInt64(cbLock);
aParms[4].setUInt32(fFlags);
psvcTable->pfnCall(psvcTable->pvService, &callHandle, 0,
psvcTable->pvService, SHFL_FN_LOCK,
RT_ELEMENTS(aParms), aParms);
return callHandle.rc;
}
void testCreateFileSimple(RTTEST hTest)
{
VBOXHGCMSVCFNTABLE svcTable;
VBOXHGCMSVCHELPERS svcHelpers;
SHFLROOT Root;
const RTFILE hcFile = (RTFILE) 0x10000;
SHFLCREATERESULT Result;
int rc;
RTTestSub(hTest, "Create file simple");
Root = initWithWritableMapping(hTest, &svcTable, &svcHelpers,
"/test/mapping", "testname");
testRTFileOpenpFile = hcFile;
rc = createFile(&svcTable, Root, "/test/file", SHFL_CF_ACCESS_READ, NULL,
&Result);
RTTEST_CHECK_RC_OK(hTest, rc);
RTTEST_CHECK_MSG(hTest,
!strcmp(testRTFileOpenName, "/test/mapping/test/file"),
(hTest, "pszFilename=%s\n", testRTFileOpenName));
RTTEST_CHECK_MSG(hTest, testRTFileOpenFlags == 0x181,
(hTest, "fOpen=%llu\n", LLUIFY(testRTFileOpenFlags)));
RTTEST_CHECK_MSG(hTest, Result == SHFL_FILE_CREATED,
(hTest, "Result=%d\n", (int) Result));
unmapAndRemoveMapping(hTest, &svcTable, Root, "testname");
AssertReleaseRC(svcTable.pfnDisconnect(NULL, 0, svcTable.pvService));
RTTestGuardedFree(hTest, svcTable.pvService);
RTTEST_CHECK_MSG(hTest, testRTFileCloseFile == hcFile,
(hTest, "File=%llu\n", LLUIFY(testRTFileCloseFile)));
}
void testCreateDirSimple(RTTEST hTest)
{
VBOXHGCMSVCFNTABLE svcTable;
VBOXHGCMSVCHELPERS svcHelpers;
SHFLROOT Root;
PRTDIR pcDir = (PRTDIR)0x10000;
SHFLCREATERESULT Result;
int rc;
RTTestSub(hTest, "Create directory simple");
Root = initWithWritableMapping(hTest, &svcTable, &svcHelpers,
"/test/mapping", "testname");
testRTDirOpenpDir = pcDir;
rc = createFile(&svcTable, Root, "test/dir",
SHFL_CF_DIRECTORY | SHFL_CF_ACCESS_READ, NULL, &Result);
RTTEST_CHECK_RC_OK(hTest, rc);
RTTEST_CHECK_MSG(hTest,
!strcmp(testRTDirCreatePath, "/test/mapping/test/dir"),
(hTest, "pszPath=%s\n", testRTDirCreatePath));
RTTEST_CHECK_MSG(hTest,
!strcmp(testRTDirOpenName, "/test/mapping/test/dir"),
(hTest, "pszFilename=%s\n", testRTDirOpenName));
RTTEST_CHECK_MSG(hTest, Result == SHFL_FILE_CREATED,
(hTest, "Result=%d\n", (int) Result));
unmapAndRemoveMapping(hTest, &svcTable, Root, "testname");
AssertReleaseRC(svcTable.pfnDisconnect(NULL, 0, svcTable.pvService));
RTTestGuardedFree(hTest, svcTable.pvService);
RTTEST_CHECK_MSG(hTest,
testRTDirClosepDir == pcDir,
(hTest, "pDir=%llu\n", LLUIFY(testRTDirClosepDir)));
}
void testReadFileSimple(RTTEST hTest)
{
VBOXHGCMSVCFNTABLE svcTable;
VBOXHGCMSVCHELPERS svcHelpers;
SHFLROOT Root;
const RTFILE hcFile = (RTFILE) 0x10000;
SHFLHANDLE Handle;
const char *pcszReadData = "Data to read";
char acBuf[sizeof(pcszReadData) + 10];
uint32_t cbRead;
int rc;
RTTestSub(hTest, "Read file simple");
Root = initWithWritableMapping(hTest, &svcTable, &svcHelpers,
"/test/mapping", "testname");
testRTFileOpenpFile = hcFile;
rc = createFile(&svcTable, Root, "/test/file", SHFL_CF_ACCESS_READ,
&Handle, NULL);
RTTEST_CHECK_RC_OK(hTest, rc);
testRTFileReadData = pcszReadData;
rc = readFile(&svcTable, Root, Handle, 0, strlen(pcszReadData) + 1,
&cbRead, acBuf, (uint32_t)sizeof(acBuf));
RTTEST_CHECK_RC_OK(hTest, rc);
RTTEST_CHECK_MSG(hTest,
!strncmp(acBuf, pcszReadData, sizeof(acBuf)),
(hTest, "pvBuf=%.*s\n", sizeof(acBuf), acBuf));
RTTEST_CHECK_MSG(hTest, cbRead == strlen(pcszReadData) + 1,
(hTest, "cbRead=%llu\n", LLUIFY(cbRead)));
unmapAndRemoveMapping(hTest, &svcTable, Root, "testname");
RTTEST_CHECK_MSG(hTest, testRTFileCloseFile == hcFile,
(hTest, "File=%llu\n", LLUIFY(testRTFileCloseFile)));
AssertReleaseRC(svcTable.pfnDisconnect(NULL, 0, svcTable.pvService));
RTTestGuardedFree(hTest, svcTable.pvService);
}
void testWriteFileSimple(RTTEST hTest)
{
VBOXHGCMSVCFNTABLE svcTable;
VBOXHGCMSVCHELPERS svcHelpers;
SHFLROOT Root;
const RTFILE hcFile = (RTFILE) 0x10000;
SHFLHANDLE Handle;
const char *pcszWrittenData = "Data to write";
uint32_t cbToWrite = (uint32_t)strlen(pcszWrittenData) + 1;
uint32_t cbWritten;
int rc;
RTTestSub(hTest, "Write file simple");
Root = initWithWritableMapping(hTest, &svcTable, &svcHelpers,
"/test/mapping", "testname");
testRTFileOpenpFile = hcFile;
rc = createFile(&svcTable, Root, "/test/file", SHFL_CF_ACCESS_READ,
&Handle, NULL);
RTTEST_CHECK_RC_OK(hTest, rc);
rc = writeFile(&svcTable, Root, Handle, 0, cbToWrite, &cbWritten,
pcszWrittenData, cbToWrite);
RTTEST_CHECK_RC_OK(hTest, rc);
RTTEST_CHECK_MSG(hTest,
!strcmp(testRTFileWriteData, pcszWrittenData),
(hTest, "pvBuf=%s\n", testRTFileWriteData));
RTTEST_CHECK_MSG(hTest, cbWritten == cbToWrite,
(hTest, "cbWritten=%llu\n", LLUIFY(cbWritten)));
unmapAndRemoveMapping(hTest, &svcTable, Root, "testname");
RTTEST_CHECK_MSG(hTest, testRTFileCloseFile == hcFile,
(hTest, "File=%llu\n", LLUIFY(testRTFileCloseFile)));
AssertReleaseRC(svcTable.pfnDisconnect(NULL, 0, svcTable.pvService));
RTTestGuardedFree(hTest, svcTable.pvService);
}
void testFlushFileSimple(RTTEST hTest)
{
VBOXHGCMSVCFNTABLE svcTable;
VBOXHGCMSVCHELPERS svcHelpers;
SHFLROOT Root;
const RTFILE hcFile = (RTFILE) 0x10000;
SHFLHANDLE Handle;
int rc;
RTTestSub(hTest, "Flush file simple");
Root = initWithWritableMapping(hTest, &svcTable, &svcHelpers,
"/test/mapping", "testname");
testRTFileOpenpFile = hcFile;
rc = createFile(&svcTable, Root, "/test/file", SHFL_CF_ACCESS_READ,
&Handle, NULL);
RTTEST_CHECK_RC_OK(hTest, rc);
rc = flushFile(&svcTable, Root, Handle);
RTTEST_CHECK_RC_OK(hTest, rc);
RTTEST_CHECK_MSG(hTest, testRTFileFlushFile == hcFile,
(hTest, "File=%llu\n", LLUIFY(testRTFileFlushFile)));
unmapAndRemoveMapping(hTest, &svcTable, Root, "testname");
AssertReleaseRC(svcTable.pfnDisconnect(NULL, 0, svcTable.pvService));
RTTestGuardedFree(hTest, svcTable.pvService);
RTTEST_CHECK_MSG(hTest, testRTFileCloseFile == hcFile,
(hTest, "File=%llu\n", LLUIFY(testRTFileCloseFile)));
}
void testDirListEmpty(RTTEST hTest)
{
VBOXHGCMSVCFNTABLE svcTable;
VBOXHGCMSVCHELPERS svcHelpers;
SHFLROOT Root;
PRTDIR pcDir = (PRTDIR)0x10000;
SHFLHANDLE Handle;
SHFLDIRINFO DirInfo;
uint32_t cFiles;
int rc;
RTTestSub(hTest, "List empty directory");
Root = initWithWritableMapping(hTest, &svcTable, &svcHelpers,
"/test/mapping", "testname");
testRTDirOpenpDir = pcDir;
rc = createFile(&svcTable, Root, "test/dir",
SHFL_CF_DIRECTORY | SHFL_CF_ACCESS_READ, &Handle, NULL);
RTTEST_CHECK_RC_OK(hTest, rc);
rc = listDir(&svcTable, Root, Handle, 0, sizeof (SHFLDIRINFO), NULL,
&DirInfo, sizeof(DirInfo), 0, &cFiles);
RTTEST_CHECK_RC(hTest, rc, VERR_NO_MORE_FILES);
RTTEST_CHECK_MSG(hTest, testRTDirReadExDir == pcDir,
(hTest, "Dir=%llu\n", LLUIFY(testRTDirReadExDir)));
RTTEST_CHECK_MSG(hTest, cFiles == 0,
(hTest, "cFiles=%llu\n", LLUIFY(cFiles)));
unmapAndRemoveMapping(hTest, &svcTable, Root, "testname");
AssertReleaseRC(svcTable.pfnDisconnect(NULL, 0, svcTable.pvService));
RTTestGuardedFree(hTest, svcTable.pvService);
RTTEST_CHECK_MSG(hTest,
testRTDirClosepDir == pcDir,
(hTest, "pDir=%llu\n", LLUIFY(testRTDirClosepDir)));
}
void testFSInfoQuerySetFMode(RTTEST hTest)
{
VBOXHGCMSVCFNTABLE svcTable;
VBOXHGCMSVCHELPERS svcHelpers;
SHFLROOT Root;
const RTFILE hcFile = (RTFILE) 0x10000;
const uint32_t fMode = 0660;
SHFLFSOBJINFO Info;
SHFLHANDLE Handle;
int rc;
RTTestSub(hTest, "Query and set file size");
Root = initWithWritableMapping(hTest, &svcTable, &svcHelpers,
"/test/mapping", "testname");
testRTFileOpenpFile = hcFile;
rc = createFile(&svcTable, Root, "/test/file", SHFL_CF_ACCESS_READ,
&Handle, NULL);
RTTEST_CHECK_RC_OK(hTest, rc);
RT_ZERO(Info);
testRTFileQueryInfoFMode = fMode;
rc = sfInformation(&svcTable, Root, Handle, SHFL_INFO_FILE, sizeof(Info),
&Info);
RTTEST_CHECK_RC_OK(hTest, rc);
RTTEST_CHECK_MSG(hTest, testRTFileQueryInfoFile == hcFile,
(hTest, "File=%llu\n", LLUIFY(testRTFileQueryInfoFile)));
RTTEST_CHECK_MSG(hTest, Info.Attr.fMode == fMode,
(hTest, "cbObject=%llu\n", LLUIFY(Info.cbObject)));
RT_ZERO(Info);
Info.Attr.fMode = fMode;
rc = sfInformation(&svcTable, Root, Handle, SHFL_INFO_SET | SHFL_INFO_FILE,
sizeof(Info), &Info);
RTTEST_CHECK_RC_OK(hTest, rc);
RTTEST_CHECK_MSG(hTest, testRTFileSetFMode == fMode,
(hTest, "Size=%llu\n", LLUIFY(testRTFileSetFMode)));
unmapAndRemoveMapping(hTest, &svcTable, Root, "testname");
AssertReleaseRC(svcTable.pfnDisconnect(NULL, 0, svcTable.pvService));
RTTestGuardedFree(hTest, svcTable.pvService);
RTTEST_CHECK_MSG(hTest, testRTFileCloseFile == hcFile,
(hTest, "File=%llu\n", LLUIFY(testRTFileCloseFile)));
}
void testFSInfoQuerySetDirATime(RTTEST hTest)
{
VBOXHGCMSVCFNTABLE svcTable;
VBOXHGCMSVCHELPERS svcHelpers;
SHFLROOT Root;
const PRTDIR pcDir = (PRTDIR) 0x10000;
const int64_t ccAtimeNano = 100000;
SHFLFSOBJINFO Info;
SHFLHANDLE Handle;
int rc;
RTTestSub(hTest, "Query and set directory atime");
Root = initWithWritableMapping(hTest, &svcTable, &svcHelpers,
"/test/mapping", "testname");
testRTDirOpenpDir = pcDir;
rc = createFile(&svcTable, Root, "test/dir",
SHFL_CF_DIRECTORY | SHFL_CF_ACCESS_READ, &Handle, NULL);
RTTEST_CHECK_RC_OK(hTest, rc);
RT_ZERO(Info);
RTTimeSpecSetNano(&testRTDirQueryInfoATime, ccAtimeNano);
rc = sfInformation(&svcTable, Root, Handle, SHFL_INFO_FILE, sizeof(Info),
&Info);
RTTEST_CHECK_RC_OK(hTest, rc);
RTTEST_CHECK_MSG(hTest, testRTDirQueryInfoDir == pcDir,
(hTest, "Dir=%llu\n", LLUIFY(testRTDirQueryInfoDir)));
RTTEST_CHECK_MSG(hTest, RTTimeSpecGetNano(&Info.AccessTime) == ccAtimeNano,
(hTest, "ATime=%llu\n",
LLUIFY(RTTimeSpecGetNano(&Info.AccessTime))));
RT_ZERO(Info);
RTTimeSpecSetNano(&Info.AccessTime, ccAtimeNano);
rc = sfInformation(&svcTable, Root, Handle, SHFL_INFO_SET | SHFL_INFO_FILE,
sizeof(Info), &Info);
RTTEST_CHECK_RC_OK(hTest, rc);
RTTEST_CHECK_MSG(hTest, RTTimeSpecGetNano(&testRTDirSetTimesATime)
== ccAtimeNano,
(hTest, "ATime=%llu\n",
LLUIFY(RTTimeSpecGetNano(&testRTDirSetTimesATime))));
unmapAndRemoveMapping(hTest, &svcTable, Root, "testname");
AssertReleaseRC(svcTable.pfnDisconnect(NULL, 0, svcTable.pvService));
RTTestGuardedFree(hTest, svcTable.pvService);
RTTEST_CHECK_MSG(hTest, testRTDirClosepDir == pcDir,
(hTest, "File=%llu\n", LLUIFY(testRTDirClosepDir)));
}
void testFSInfoQuerySetFileATime(RTTEST hTest)
{
VBOXHGCMSVCFNTABLE svcTable;
VBOXHGCMSVCHELPERS svcHelpers;
SHFLROOT Root;
const RTFILE hcFile = (RTFILE) 0x10000;
const int64_t ccAtimeNano = 100000;
SHFLFSOBJINFO Info;
SHFLHANDLE Handle;
int rc;
RTTestSub(hTest, "Query and set file atime");
Root = initWithWritableMapping(hTest, &svcTable, &svcHelpers,
"/test/mapping", "testname");
testRTFileOpenpFile = hcFile;
rc = createFile(&svcTable, Root, "/test/file", SHFL_CF_ACCESS_READ,
&Handle, NULL);
RTTEST_CHECK_RC_OK(hTest, rc);
RT_ZERO(Info);
RTTimeSpecSetNano(&testRTFileQueryInfoATime, ccAtimeNano);
rc = sfInformation(&svcTable, Root, Handle, SHFL_INFO_FILE, sizeof(Info),
&Info);
RTTEST_CHECK_RC_OK(hTest, rc);
RTTEST_CHECK_MSG(hTest, testRTFileQueryInfoFile == hcFile,
(hTest, "File=%llu\n", LLUIFY(testRTFileQueryInfoFile)));
RTTEST_CHECK_MSG(hTest, RTTimeSpecGetNano(&Info.AccessTime) == ccAtimeNano,
(hTest, "ATime=%llu\n",
LLUIFY(RTTimeSpecGetNano(&Info.AccessTime))));
RT_ZERO(Info);
RTTimeSpecSetNano(&Info.AccessTime, ccAtimeNano);
rc = sfInformation(&svcTable, Root, Handle, SHFL_INFO_SET | SHFL_INFO_FILE,
sizeof(Info), &Info);
RTTEST_CHECK_RC_OK(hTest, rc);
RTTEST_CHECK_MSG(hTest, RTTimeSpecGetNano(&testRTFileSetTimesATime)
== ccAtimeNano,
(hTest, "ATime=%llu\n",
LLUIFY(RTTimeSpecGetNano(&testRTFileSetTimesATime))));
unmapAndRemoveMapping(hTest, &svcTable, Root, "testname");
AssertReleaseRC(svcTable.pfnDisconnect(NULL, 0, svcTable.pvService));
RTTestGuardedFree(hTest, svcTable.pvService);
RTTEST_CHECK_MSG(hTest, testRTFileCloseFile == hcFile,
(hTest, "File=%llu\n", LLUIFY(testRTFileCloseFile)));
}
void testFSInfoQuerySetEndOfFile(RTTEST hTest)
{
VBOXHGCMSVCFNTABLE svcTable;
VBOXHGCMSVCHELPERS svcHelpers;
SHFLROOT Root;
const RTFILE hcFile = (RTFILE) 0x10000;
const RTFOFF cbNew = 50000;
SHFLFSOBJINFO Info;
SHFLHANDLE Handle;
int rc;
RTTestSub(hTest, "Set end of file position");
Root = initWithWritableMapping(hTest, &svcTable, &svcHelpers,
"/test/mapping", "testname");
testRTFileOpenpFile = hcFile;
rc = createFile(&svcTable, Root, "/test/file", SHFL_CF_ACCESS_READ,
&Handle, NULL);
RTTEST_CHECK_RC_OK(hTest, rc);
RT_ZERO(Info);
Info.cbObject = cbNew;
rc = sfInformation(&svcTable, Root, Handle, SHFL_INFO_SET | SHFL_INFO_SIZE,
sizeof(Info), &Info);
RTTEST_CHECK_RC_OK(hTest, rc);
RTTEST_CHECK_MSG(hTest, testRTFileSetSizeFile == hcFile,
(hTest, "File=%llu\n", LLUIFY(testRTFileSetSizeFile)));
RTTEST_CHECK_MSG(hTest, testRTFileSetSizeSize == cbNew,
(hTest, "Size=%llu\n", LLUIFY(testRTFileSetSizeSize)));
unmapAndRemoveMapping(hTest, &svcTable, Root, "testname");
AssertReleaseRC(svcTable.pfnDisconnect(NULL, 0, svcTable.pvService));
RTTestGuardedFree(hTest, svcTable.pvService);
RTTEST_CHECK_MSG(hTest, testRTFileCloseFile == hcFile,
(hTest, "File=%llu\n", LLUIFY(testRTFileCloseFile)));
}
void testLockFileSimple(RTTEST hTest)
{
VBOXHGCMSVCFNTABLE svcTable;
VBOXHGCMSVCHELPERS svcHelpers;
SHFLROOT Root;
const RTFILE hcFile = (RTFILE) 0x10000;
const int64_t offLock = 50000;
const uint64_t cbLock = 4000;
SHFLHANDLE Handle;
int rc;
RTTestSub(hTest, "Simple file lock and unlock");
Root = initWithWritableMapping(hTest, &svcTable, &svcHelpers,
"/test/mapping", "testname");
testRTFileOpenpFile = hcFile;
rc = createFile(&svcTable, Root, "/test/file", SHFL_CF_ACCESS_READ,
&Handle, NULL);
RTTEST_CHECK_RC_OK(hTest, rc);
rc = lockFile(&svcTable, Root, Handle, offLock, cbLock, SHFL_LOCK_SHARED);
RTTEST_CHECK_RC_OK(hTest, rc);
#ifdef RT_OS_WINDOWS /* Locking is a no-op elsewhere. */
RTTEST_CHECK_MSG(hTest, testRTFileLockFile == hcFile,
(hTest, "File=%llu\n", LLUIFY(testRTFileLockFile)));
RTTEST_CHECK_MSG(hTest, testRTFileLockfLock == 0,
(hTest, "fLock=%u\n", testRTFileLockfLock));
RTTEST_CHECK_MSG(hTest, testRTFileLockOffset == offLock,
(hTest, "Offs=%llu\n", (long long) testRTFileLockOffset));
RTTEST_CHECK_MSG(hTest, testRTFileLockSize == cbLock,
(hTest, "Size=%llu\n", LLUIFY(testRTFileLockSize)));
#endif
rc = lockFile(&svcTable, Root, Handle, offLock, cbLock, SHFL_LOCK_CANCEL);
RTTEST_CHECK_RC_OK(hTest, rc);
#ifdef RT_OS_WINDOWS
RTTEST_CHECK_MSG(hTest, testRTFileUnlockFile == hcFile,
(hTest, "File=%llu\n", LLUIFY(testRTFileUnlockFile)));
RTTEST_CHECK_MSG(hTest, testRTFileUnlockOffset == offLock,
(hTest, "Offs=%llu\n",
(long long) testRTFileUnlockOffset));
RTTEST_CHECK_MSG(hTest, testRTFileUnlockSize == cbLock,
(hTest, "Size=%llu\n", LLUIFY(testRTFileUnlockSize)));
#endif
unmapAndRemoveMapping(hTest, &svcTable, Root, "testname");
AssertReleaseRC(svcTable.pfnDisconnect(NULL, 0, svcTable.pvService));
RTTestGuardedFree(hTest, svcTable.pvService);
RTTEST_CHECK_MSG(hTest, testRTFileCloseFile == hcFile,
(hTest, "File=%llu\n", LLUIFY(testRTFileCloseFile)));
}
/******************************************************************************
* Main code *
******************************************************************************/
static void testAPI(RTTEST hTest)
{
testMappingsQuery(hTest);
testMappingsQueryName(hTest);
testMapFolder(hTest);
testUnmapFolder(hTest);
testCreate(hTest);
testClose(hTest);
testRead(hTest);
testWrite(hTest);
testLock(hTest);
testFlush(hTest);
testDirList(hTest);
testReadLink(hTest);
testFSInfo(hTest);
testRemove(hTest);
testRename(hTest);
testSymlink(hTest);
testMappingsAdd(hTest);
testMappingsRemove(hTest);
/* testSetStatusLed(hTest); */
}
int main(int argc, char **argv)
{
RTEXITCODE rcExit = RTTestInitAndCreate(RTPathFilename(argv[0]),
&g_hTest);
if (rcExit != RTEXITCODE_SUCCESS)
return rcExit;
RTTestBanner(g_hTest);
testAPI(g_hTest);
return RTTestSummaryAndDestroy(g_hTest);
}