VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTDvm.cpp@ 76905

Last change on this file since 76905 was 76905, checked in by vboxsync, 6 years ago

Runtime/testcase/tstRTDvm: Resurrect testcase as an example on how to use the current API

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.2 KB
Line 
1/* $Id: tstRTDvm.cpp 76905 2019-01-20 19:49:15Z vboxsync $ */
2/** @file
3 * IPRT Testcase - IPRT Disk Volume Management (DVM)
4 */
5
6/*
7 * Copyright (C) 2009-2019 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28/*********************************************************************************************************************************
29* Header Files *
30*********************************************************************************************************************************/
31#include <iprt/dvm.h>
32
33#include <iprt/err.h>
34#include <iprt/test.h>
35#include <iprt/file.h>
36#include <iprt/string.h>
37#include <iprt/vfs.h>
38
39
40/*********************************************************************************************************************************
41* Structures and Typedefs *
42*********************************************************************************************************************************/
43
44
45static int tstRTDvmVolume(RTTEST hTest, RTVFSFILE hVfsDisk, unsigned cNesting)
46{
47 char szPrefix[100];
48 int rc = VINF_SUCCESS;
49
50 RT_ZERO(szPrefix);
51
52 if (cNesting < sizeof(szPrefix) - 1)
53 {
54 for (unsigned i = 0; i < cNesting; i++)
55 szPrefix[i] = '\t';
56 }
57
58 RTTestSubF(hTest, "Create DVM");
59 RTDVM hVolMgr;
60 rc = RTDvmCreate(&hVolMgr, hVfsDisk, 512, 0 /*fFlags*/);
61 if (RT_FAILURE(rc))
62 {
63 RTTestIFailed("RTDvmCreate -> %Rrc", rc);
64 return RTTestSummaryAndDestroy(hTest);
65 }
66
67 RTTestSubF(hTest, "Open volume map");
68 rc = RTDvmMapOpen(hVolMgr);
69 if ( RT_FAILURE(rc)
70 && rc != VERR_NOT_SUPPORTED)
71 {
72 RTTestIFailed("RTDvmOpen -> %Rrc", rc);
73 return RTTestSummaryAndDestroy(hTest);
74 }
75 if (rc == VERR_NOT_SUPPORTED)
76 return VINF_SUCCESS;
77
78 RTTestIPrintf(RTTESTLVL_ALWAYS, "%s Successfully opened map with format: %s.\n", szPrefix, RTDvmMapGetFormatName(hVolMgr));
79
80 /* Dump all volumes. */
81 RTTestSubF(hTest, "Dump volumes");
82 uint32_t cVolume = 0;
83 RTDVMVOLUME hVol;
84
85 rc = RTDvmMapQueryFirstVolume(hVolMgr, &hVol);
86
87 while (RT_SUCCESS(rc))
88 {
89 char *pszVolName = NULL;
90 RTDVMVOLTYPE enmVolType = RTDvmVolumeGetType(hVol);
91 uint64_t fVolFlags = RTDvmVolumeGetFlags(hVol);
92
93 RTTestIPrintf(RTTESTLVL_ALWAYS, "%s Volume %u:\n", szPrefix, cVolume);
94 RTTestIPrintf(RTTESTLVL_ALWAYS, "%s Volume type %s\n", szPrefix, RTDvmVolumeTypeGetDescr(enmVolType));
95 RTTestIPrintf(RTTESTLVL_ALWAYS, "%s Volume size %llu\n", szPrefix, RTDvmVolumeGetSize(hVol));
96 RTTestIPrintf(RTTESTLVL_ALWAYS, "%s Volume flags %s %s\n\n", szPrefix,
97 fVolFlags & DVMVOLUME_FLAGS_BOOTABLE ? "Bootable" : "",
98 fVolFlags & DVMVOLUME_FLAGS_ACTIVE ? "Active" : "");
99
100 rc = RTDvmVolumeQueryName(hVol, &pszVolName);
101 if (RT_SUCCESS(rc))
102 {
103 RTTestIPrintf(RTTESTLVL_ALWAYS, "%s Volume name %s.\n", szPrefix, pszVolName);
104 RTStrFree(pszVolName);
105 }
106 else if (rc != VERR_NOT_SUPPORTED)
107 RTTestIFailed("RTDvmVolumeQueryName -> %Rrc", rc);
108 else
109 rc = VINF_SUCCESS;
110
111 /*
112 * Query all volumes which might be inside this.
113 * (think of MBR partitions with a bsdlabel inside)
114 */
115 RTVFSFILE hVfsVol;
116 rc = RTDvmVolumeCreateVfsFile(hVol, RTFILE_O_OPEN | RTFILE_O_DENY_NONE | RTFILE_O_READWRITE, &hVfsVol);
117 if (RT_SUCCESS(rc))
118 {
119 rc = tstRTDvmVolume(hTest, hVfsVol, cNesting + 1);
120 RTVfsFileRelease(hVfsVol);
121 }
122 else
123 RTTestIFailed("RTDvmVolumeCreateVfsFile -> %Rrc", rc);
124
125 RTDVMVOLUME hVolNext;
126 rc = RTDvmMapQueryNextVolume(hVolMgr, hVol, &hVolNext);
127 RTDvmVolumeRelease(hVol);
128 hVol = hVolNext;
129 cVolume++;
130 }
131
132 RTTestIPrintf(RTTESTLVL_ALWAYS, "%s Dumped %u volumes\n", szPrefix, cVolume);
133
134 if ( rc == VERR_DVM_MAP_EMPTY
135 || rc == VERR_DVM_MAP_NO_VOLUME)
136 rc = VINF_SUCCESS;
137
138 RTTESTI_CHECK(rc == VINF_SUCCESS);
139
140 RTDvmRelease(hVolMgr);
141
142 return rc;
143}
144
145
146int main(int argc, char **argv)
147{
148 /*
149 * Initialize IPRT and create the test.
150 */
151 RTTEST hTest;
152 int rc = RTTestInitAndCreate("tstRTDvm", &hTest);
153 if (rc)
154 return rc;
155 RTTestBanner(hTest);
156
157 /*
158 * If no args, display usage.
159 */
160 if (argc < 2)
161 {
162 RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "Syntax: %s <image>\n", argv[0]);
163 return RTTestSkipAndDestroy(hTest, "Missing required arguments\n");
164 }
165
166 RTVFSFILE hVfsDisk;
167 rc = RTVfsFileOpenNormal(argv[1], RTFILE_O_OPEN | RTFILE_O_DENY_NONE | RTFILE_O_READWRITE, &hVfsDisk);
168 if (RT_FAILURE(rc))
169 {
170 RTTestIFailed("RTVfsFileOpenNormal -> %Rrc", rc);
171 return RTTestSummaryAndDestroy(hTest);
172 }
173
174 uint64_t cb = 0;
175 rc = RTVfsFileGetSize(hVfsDisk, &cb);
176 if ( RT_FAILURE(rc)
177 || cb % 512 != 0) /* Assume 512 byte sector size. */
178 {
179 RTTestIFailed("RTVfsFileGetSize -> %Rrc", rc);
180 return RTTestSummaryAndDestroy(hTest);
181 }
182
183 rc = tstRTDvmVolume(hTest, hVfsDisk, 0);
184
185 RTTESTI_CHECK(rc == VINF_SUCCESS);
186
187 /*
188 * Summary
189 */
190 return RTTestSummaryAndDestroy(hTest);
191}
192
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette