VirtualBox

source: vbox/trunk/src/VBox/Main/testcase/tstMediumLock.cpp@ 56301

Last change on this file since 56301 was 55969, checked in by vboxsync, 10 years ago

Removed unnecessary LOG_INSTANCE definitions.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.2 KB
Line 
1/* $Id: tstMediumLock.cpp 55969 2015-05-20 14:50:23Z vboxsync $ */
2/** @file
3 * Medium lock test cases.
4 */
5
6/*
7 * Copyright (C) 2013-2015 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
18#define LOG_ENABLED
19#define LOG_GROUP LOG_GROUP_MAIN
20#include <VBox/log.h>
21
22#include <VBox/com/com.h>
23#include <VBox/com/ptr.h>
24#include <VBox/com/defs.h>
25#include <VBox/com/array.h>
26#include <VBox/com/string.h>
27#include <VBox/com/VirtualBox.h>
28
29#include <iprt/assert.h>
30#include <iprt/uuid.h>
31#include <iprt/path.h>
32#include <iprt/string.h>
33#include <iprt/initterm.h>
34#include <iprt/test.h>
35
36using namespace com;
37
38
39#define TEST_RT_SUCCESS(x,y,z) \
40 do \
41 { \
42 int rc = (y); \
43 if (RT_FAILURE(rc)) \
44 RTTestFailed((x), "%s %Rrc", (z), rc); \
45 } while (0)
46
47#define TEST_COM_SUCCESS(x,y,z) \
48 do \
49 { \
50 HRESULT hrc = (y); \
51 if (FAILED(hrc)) \
52 RTTestFailed((x), "%s %Rhrc", (z), hrc); \
53 } while (0)
54
55#define TEST_COM_FAILURE(x,y,z) \
56 do \
57 { \
58 HRESULT hrc = (y); \
59 if (SUCCEEDED(hrc)) \
60 RTTestFailed((x), "%s", (z)); \
61 } while (0)
62
63int main(int argc, char *argv[])
64{
65 /* Init the runtime without loading the support driver. */
66 RTR3InitExe(argc, &argv, 0);
67
68 RTTEST hTest;
69 RTEXITCODE rcExit = RTTestInitAndCreate("tstMediumLock", &hTest);
70 if (rcExit)
71 return rcExit;
72 RTTestBanner(hTest);
73
74 bool fComInit = false;
75 ComPtr<IVirtualBox> pVirtualBox;
76 char szPathTemp[RTPATH_MAX] = "";
77 ComPtr<IMedium> pMedium;
78
79 if (!RTTestSubErrorCount(hTest))
80 {
81 RTTestSub(hTest, "Constructing temp image name");
82 TEST_RT_SUCCESS(hTest, RTPathTemp(szPathTemp, sizeof(szPathTemp)), "temp directory");
83 RTUUID uuid;
84 RTUuidCreate(&uuid);
85 char szFile[50];
86 RTStrPrintf(szFile, sizeof(szFile), "%RTuuid.vdi", &uuid);
87 TEST_RT_SUCCESS(hTest, RTPathAppend(szPathTemp, sizeof(szPathTemp), szFile), "concatenate image name");
88 }
89
90 if (!RTTestSubErrorCount(hTest))
91 {
92 RTTestSub(hTest, "Initializing COM");
93 TEST_COM_SUCCESS(hTest, Initialize(), "init");
94 }
95
96 if (!RTTestSubErrorCount(hTest))
97 {
98 fComInit = true;
99
100 RTTestSub(hTest, "Getting VirtualBox reference");
101 TEST_COM_SUCCESS(hTest, pVirtualBox.createLocalObject(CLSID_VirtualBox), "vbox reference");
102 }
103
104 if (!RTTestSubErrorCount(hTest))
105 {
106 RTTestSub(hTest, "Creating temp hard disk medium");
107 TEST_COM_SUCCESS(hTest, pVirtualBox->CreateMedium(Bstr("VDI").raw(), Bstr(szPathTemp).raw(), AccessMode_ReadWrite, DeviceType_HardDisk, pMedium.asOutParam()), "create medium");
108 if (!pMedium.isNull())
109 {
110 ComPtr<IProgress> pProgress;
111 SafeArray<MediumVariant_T> variant;
112 variant.push_back(MediumVariant_Standard);
113 TEST_COM_SUCCESS(hTest, pMedium->CreateBaseStorage(_1M, ComSafeArrayAsInParam(variant), pProgress.asOutParam()), "create base storage");
114 if (!pProgress.isNull())
115 TEST_COM_SUCCESS(hTest, pProgress->WaitForCompletion(30000), "waiting for completion of create");
116 }
117 }
118
119 if (!RTTestSubErrorCount(hTest))
120 {
121 RTTestSub(hTest, "Write locks");
122 ComPtr<IToken> pToken1, pToken2;
123
124 MediumState_T mediumState = MediumState_NotCreated;
125 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting state");
126 if (mediumState != MediumState_Created)
127 RTTestFailed(hTest, "wrong medium state %d", mediumState);
128
129 TEST_COM_SUCCESS(hTest, pMedium->LockWrite(pToken1.asOutParam()), "write lock");
130
131 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting lock write state");
132 if (mediumState != MediumState_LockedWrite)
133 RTTestFailed(hTest, "wrong lock write medium state %d", mediumState);
134
135 TEST_COM_FAILURE(hTest, pMedium->LockWrite(pToken2.asOutParam()), "nested write lock succeeded");
136 if (!pToken2.isNull())
137 RTTestFailed(hTest, "pToken2 is not null");
138
139 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting after nested lock write state");
140 if (mediumState != MediumState_LockedWrite)
141 RTTestFailed(hTest, "wrong after nested lock write medium state %d", mediumState);
142
143 if (!pToken1.isNull())
144 TEST_COM_SUCCESS(hTest, pToken1->Abandon(), "write unlock");
145 else
146 RTTestFailed(hTest, "pToken1 is null");
147
148 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting unlock write state");
149 if (mediumState != MediumState_Created)
150 RTTestFailed(hTest, "wrong unlock write medium state %d", mediumState);
151 }
152
153 if (!RTTestSubErrorCount(hTest))
154 {
155 RTTestSub(hTest, "Read locks");
156 ComPtr<IToken> pToken1, pToken2;
157
158 MediumState_T mediumState = MediumState_NotCreated;
159 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting state");
160 if (mediumState != MediumState_Created)
161 RTTestFailed(hTest, "wrong medium state %d", mediumState);
162
163 TEST_COM_SUCCESS(hTest, pMedium->LockRead(pToken1.asOutParam()), "read lock");
164
165 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting lock read state");
166 if (mediumState != MediumState_LockedRead)
167 RTTestFailed(hTest, "wrong lock read medium state %d", mediumState);
168
169 TEST_COM_SUCCESS(hTest, pMedium->LockRead(pToken2.asOutParam()), "nested read lock failed");
170
171 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting after nested lock read state");
172 if (mediumState != MediumState_LockedRead)
173 RTTestFailed(hTest, "wrong after nested lock read medium state %d", mediumState);
174
175 if (!pToken2.isNull())
176 TEST_COM_SUCCESS(hTest, pToken2->Abandon(), "read nested unlock");
177 else
178 RTTestFailed(hTest, "pToken2 is null");
179
180 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting after nested lock read state");
181 if (mediumState != MediumState_LockedRead)
182 RTTestFailed(hTest, "wrong after nested lock read medium state %d", mediumState);
183
184 if (!pToken1.isNull())
185 TEST_COM_SUCCESS(hTest, pToken1->Abandon(), "read nested unlock");
186 else
187 RTTestFailed(hTest, "pToken1 is null");
188
189 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting unlock read state");
190 if (mediumState != MediumState_Created)
191 RTTestFailed(hTest, "wrong unlock read medium state %d", mediumState);
192 }
193
194 if (!RTTestSubErrorCount(hTest))
195 {
196 RTTestSub(hTest, "Mixing write and read locks");
197 ComPtr<IToken> pToken1, pToken2;
198
199 MediumState_T mediumState = MediumState_NotCreated;
200 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting state");
201 if (mediumState != MediumState_Created)
202 RTTestFailed(hTest, "wrong medium state %d", mediumState);
203
204 TEST_COM_SUCCESS(hTest, pMedium->LockWrite(pToken1.asOutParam()), "write lock");
205
206 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting lock write state");
207 if (mediumState != MediumState_LockedWrite)
208 RTTestFailed(hTest, "wrong lock write medium state %d", mediumState);
209
210 TEST_COM_FAILURE(hTest, pMedium->LockRead(pToken2.asOutParam()), "write+read lock succeeded");
211 if (!pToken2.isNull())
212 RTTestFailed(hTest, "pToken2 is not null");
213
214 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting after nested lock write state");
215 if (mediumState != MediumState_LockedWrite)
216 RTTestFailed(hTest, "wrong after nested lock write medium state %d", mediumState);
217
218 if (!pToken1.isNull())
219 TEST_COM_SUCCESS(hTest, pToken1->Abandon(), "write unlock");
220 else
221 RTTestFailed(hTest, "pToken1 is null");
222
223 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting unlock write state");
224 if (mediumState != MediumState_Created)
225 RTTestFailed(hTest, "wrong unlock write medium state %d", mediumState);
226 }
227
228 if (!RTTestSubErrorCount(hTest))
229 {
230 RTTestSub(hTest, "Mixing read and write locks");
231 ComPtr<IToken> pToken1, pToken2;
232
233 MediumState_T mediumState = MediumState_NotCreated;
234 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting state");
235 if (mediumState != MediumState_Created)
236 RTTestFailed(hTest, "wrong medium state %d", mediumState);
237
238 TEST_COM_SUCCESS(hTest, pMedium->LockRead(pToken1.asOutParam()), "read lock");
239
240 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting lock read state");
241 if (mediumState != MediumState_LockedRead)
242 RTTestFailed(hTest, "wrong lock read medium state %d", mediumState);
243
244 TEST_COM_FAILURE(hTest, pMedium->LockWrite(pToken2.asOutParam()), "read+write lock succeeded");
245 if (!pToken2.isNull())
246 RTTestFailed(hTest, "pToken2 is not null");
247
248 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting after nested lock read state");
249 if (mediumState != MediumState_LockedRead)
250 RTTestFailed(hTest, "wrong after nested lock read medium state %d", mediumState);
251
252 if (!pToken1.isNull())
253 TEST_COM_SUCCESS(hTest, pToken1->Abandon(), "read unlock");
254 else
255 RTTestFailed(hTest, "pToken1 is null");
256
257 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting unlock read state");
258 if (mediumState != MediumState_Created)
259 RTTestFailed(hTest, "wrong unlock read medium state %d", mediumState);
260 }
261
262 /* Cleanup, also part of the testcase */
263
264 if (!pMedium.isNull())
265 {
266 RTTestSub(hTest, "Closing medium");
267 MediumState_T mediumState = MediumState_NotCreated;
268 TEST_COM_SUCCESS(hTest, pMedium->COMGETTER(State)(&mediumState), "getting state");
269 if (mediumState == MediumState_Created)
270 {
271 ComPtr<IProgress> pProgress;
272 TEST_COM_SUCCESS(hTest, pMedium->DeleteStorage(pProgress.asOutParam()), "deleting storage");
273 if (!pProgress.isNull())
274 TEST_COM_SUCCESS(hTest, pProgress->WaitForCompletion(30000), "waiting for completion of delete");
275 }
276 TEST_COM_SUCCESS(hTest, pMedium->Close(), "closing");
277 pMedium.setNull();
278 }
279
280 pVirtualBox.setNull();
281
282 /* Make sure that there are no object references alive here, XPCOM does
283 * a very bad job at cleaning up such leftovers, spitting out warning
284 * messages in a debug build. */
285
286 if (fComInit)
287 {
288 RTTestIPrintf(RTTESTLVL_DEBUG, "Shutting down COM...\n");
289 Shutdown();
290 }
291
292 /*
293 * Summary.
294 */
295 return RTTestSummaryAndDestroy(hTest);
296}
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