tstRTFilesystem.cpp revision 16d88d830ef752a36859782df24431321e0b882b
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd/* $Id$ */
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd/** @file
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * IPRT Testcase - IPRT Filesystem API (Fileystem)
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd */
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd/*
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * Copyright (C) 2012 Oracle Corporation
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd *
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * This file is part of VirtualBox Open Source Edition (OSE), as
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * available from http://www.virtualbox.org. This file is free software;
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * you can redistribute it and/or modify it under the terms of the GNU
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * General Public License (GPL) as published by the Free Software
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * Foundation, in version 2 as it comes in the "COPYING" file of the
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd *
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * The contents of this file may alternatively be used under the terms
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * of the Common Development and Distribution License Version 1.0
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * VirtualBox OSE distribution, in which case the provisions of the
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * CDDL are applicable instead of those of the GPL.
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd *
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * You may elect to license modified versions of this file under the
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd * terms and conditions of either the GPL or the CDDL or both.
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd */
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd/*******************************************************************************
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd* Header Files *
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd*******************************************************************************/
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd#include <iprt/filesystem.h>
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd#include <iprt/err.h>
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd#include <iprt/test.h>
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd#include <iprt/file.h>
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd#include <iprt/string.h>
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd/*******************************************************************************
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd* Structures and Typedefs *
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd*******************************************************************************/
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5ndstatic int filesystemDiskRead(void *pvUser, uint64_t off, void *pvBuf, size_t cbRead)
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd{
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd RTFILE hFile = (RTFILE)pvUser;
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd return RTFileReadAt(hFile, off, pvBuf, cbRead, NULL);
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd}
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5ndstatic int filesystemDiskWrite(void *pvUser, uint64_t off, const void *pvBuf, size_t cbWrite)
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd{
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd RTFILE hFile = (RTFILE)pvUser;
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd return RTFileWriteAt(hFile, off, pvBuf, cbWrite, NULL);
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd}
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5ndstatic int tstRTFilesystem(RTTEST hTest, RTFILE hFile, uint64_t cb)
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd{
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd int rc = VINF_SUCCESS;
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd RTTestSubF(hTest, "Create filesystem object");
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd RTFILESYSTEM hFs;
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd rc = RTFilesystemOpen(&hFs, filesystemDiskRead, filesystemDiskWrite, cb, 512, hFile, 0 /* fFlags */);
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd if (RT_FAILURE(rc))
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd {
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd RTTestIFailed("RTFilesystemOpen -> %Rrc", rc);
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd return rc;
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd }
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd RTTestIPrintf(RTTESTLVL_ALWAYS, "Successfully opened filesystem with format: %s.\n",
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd RTFilesystemGetFormat(hFs));
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd RTTestIPrintf(RTTESTLVL_ALWAYS, "Block size is: %llu.\n",
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd RTFilesystemGetBlockSize(hFs));
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd /* Check all blocks. */
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd uint64_t off = 0;
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd uint32_t cBlocksUsed = 0;
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd uint32_t cBlocksUnused = 0;
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd while (off < cb)
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd {
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd bool fUsed = false;
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd rc = RTFilesystemQueryRangeUse(hFs, off, 1024, &fUsed);
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd if (RT_FAILURE(rc))
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd {
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd RTTestIFailed("RTFileSysQueryRangeUse -> %Rrc", rc);
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd break;
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd }
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd if (fUsed)
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd cBlocksUsed++;
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd else
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd cBlocksUnused++;
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd
6116c12fdd3ed06d388fe6572e50a22e9320dfa5nd off += 1024;
}
if (RT_SUCCESS(rc))
RTTestIPrintf(RTTESTLVL_ALWAYS, "%u blocks used and %u blocks unused\n",
cBlocksUsed, cBlocksUnused);
RTFilesystemRelease(hFs);
return rc;
}
int main(int argc, char **argv)
{
/*
* Initialize IPRT and create the test.
*/
RTTEST hTest;
int rc = RTTestInitAndCreate("tstRTFilesystem", &hTest);
if (rc)
return rc;
RTTestBanner(hTest);
/*
* If no args, display usage.
*/
if (argc < 2)
{
RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "Syntax: %s <image>\n", argv[0]);
return RTTestSkipAndDestroy(hTest, "Missing required arguments\n");
}
/* Open image. */
RTFILE hFile;
uint64_t cb = 0;
rc = RTFileOpen(&hFile, argv[1], RTFILE_O_OPEN | RTFILE_O_DENY_NONE | RTFILE_O_READ);
if (RT_FAILURE(rc))
{
RTTestIFailed("RTFileOpen -> %Rrc", rc);
return RTTestSummaryAndDestroy(hTest);
}
rc = RTFileGetSize(hFile, &cb);
if ( RT_FAILURE(rc)
|| cb % 512 != 0) /* Assume 512 byte sector size. */
{
RTTestIFailed("RTFileGetSize -> %Rrc", rc);
return RTTestSummaryAndDestroy(hTest);
}
rc = tstRTFilesystem(hTest, hFile, cb);
RTTESTI_CHECK(rc == VINF_SUCCESS);
/*
* Summary
*/
return RTTestSummaryAndDestroy(hTest);
}