VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstFileAppendWin-1.cpp@ 19948

Last change on this file since 19948 was 9138, checked in by vboxsync, 16 years ago

tstFileAppendWin-1 for exploring FILE_APPEND_DATA.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 9.6 KB
Line 
1/* $Id: tstFileAppendWin-1.cpp 9138 2008-05-26 22:26:10Z vboxsync $ */
2/** @file
3 * IPRT Testcase - Exploration of File Appending on Windows.
4 */
5
6/*
7 * Copyright (C) 2008 Sun Microsystems, Inc.
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 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
27 * Clara, CA 95054 USA or visit http://www.sun.com if you need
28 * additional information or have any questions.
29 */
30
31
32/*******************************************************************************
33* Header Files *
34*******************************************************************************/
35#include <Windows.h>
36#include <stdio.h>
37#include <string.h>
38#include <stdarg.h>
39
40
41/*******************************************************************************
42* Global Variables *
43*******************************************************************************/
44static int g_cErrors = 0;
45
46
47static int MyFailure(const char *pszFormat, ...)
48{
49 va_list va;
50
51 printf("tstFileAppendWin-1: FATAL: ");
52 va_start(va, pszFormat);
53 vprintf(pszFormat, va);
54 va_end(va);
55 g_cErrors++;
56 return 1;
57}
58
59
60void MyError(const char *pszFormat, ...)
61{
62 va_list va;
63
64 printf("tstFileAppendWin-1: ERROR: ");
65 va_start(va, pszFormat);
66 vprintf(pszFormat, va);
67 va_end(va);
68 g_cErrors++;
69}
70
71
72int main()
73{
74 HANDLE hFile;
75 LARGE_INTEGER off;
76 DWORD cb;
77 char szBuf[256];
78
79
80 printf("tstFileAppendWin-1: TESTING...\n");
81
82 /*
83 * Open it write only and do some appending.
84 * Checking that read fails and that the file position changes after the read.
85 */
86 DeleteFile("tstFileAppendWin-1.tst");
87 hFile = CreateFile("tstFileAppendWin-1.tst",
88 (FILE_GENERIC_WRITE & ~FILE_WRITE_DATA),
89 FILE_SHARE_READ,
90 NULL,
91 CREATE_ALWAYS,
92 FILE_ATTRIBUTE_NORMAL,
93 NULL);
94 if (hFile == INVALID_HANDLE_VALUE)
95 return MyFailure("1st CreateFile: %d\n", GetLastError());
96
97 off.QuadPart = 0;
98 if (!SetFilePointerEx(hFile, off, &off, FILE_CURRENT))
99 MyError("1st SetFilePointerEx failed: %d\n", GetLastError());
100 else if (off.QuadPart != 0)
101 MyError("unexpected position on open: %ld - expected 0\n", (long)off.QuadPart);
102
103 if (!WriteFile(hFile, "0123456789", 10, &cb, NULL))
104 MyError("write fail: %d\n", GetLastError());
105
106 off.QuadPart = 0;
107 if (!SetFilePointerEx(hFile, off, &off, FILE_CURRENT))
108 MyError("2nd SetFilePointerEx failed: %d\n", GetLastError());
109 else if (off.QuadPart != 10)
110 MyError("unexpected position on write: %ld - expected 10\n", (long)off.QuadPart);
111 else
112 printf("tstFileAppendWin-1: off=%ld after first write\n", (long)off.QuadPart);
113
114 SetLastError(0);
115 if (ReadFile(hFile, szBuf, 1, &cb, NULL))
116 MyError("read didn't fail! cb=%#lx lasterr=%d\n", (long)cb, GetLastError());
117
118 off.QuadPart = 5;
119 if (!SetFilePointerEx(hFile, off, &off, FILE_BEGIN))
120 MyError("3rd SetFilePointerEx failed: %d\n", GetLastError());
121 else if (off.QuadPart != 5)
122 MyError("unexpected position after set file pointer: %ld - expected 5\n", (long)off.QuadPart);
123
124 CloseHandle(hFile);
125
126 /*
127 * Open it write only and do some more appending.
128 * Checking the initial position and that it changes after the write.
129 */
130 hFile = CreateFile("tstFileAppendWin-1.tst",
131 (FILE_GENERIC_WRITE & ~FILE_WRITE_DATA),
132 FILE_SHARE_READ,
133 NULL,
134 OPEN_EXISTING,
135 FILE_ATTRIBUTE_NORMAL,
136 NULL);
137 if (hFile == INVALID_HANDLE_VALUE)
138 return MyFailure("2nd CreateFile: %d\n", GetLastError());
139
140 off.QuadPart = 0;
141 if (!SetFilePointerEx(hFile, off, &off, FILE_CURRENT))
142 MyError("4th SetFilePointerEx failed: %d\n", GetLastError());
143 else if (off.QuadPart != 0)
144 MyError("unexpected position on open: %ld - expected 0\n", (long)off.QuadPart);
145 else
146 printf("tstFileAppendWin-1: off=%ld on 2nd open\n", (long)off.QuadPart);
147
148 if (!WriteFile(hFile, "abcdefghij", 10, &cb, NULL))
149 MyError("2nd write failed: %d\n", GetLastError());
150
151 off.QuadPart = 0;
152 if (!SetFilePointerEx(hFile, off, &off, FILE_CURRENT))
153 MyError("5th SetFilePointerEx failed: %d\n", GetLastError());
154 else if (off.QuadPart != 20)
155 MyError("unexpected position on 2nd write: %ld - expected 20\n", (long)off.QuadPart);
156 else
157 printf("tstFileAppendWin-1: off=%ld after 2nd write\n", (long)off.QuadPart);
158
159 CloseHandle(hFile);
160
161 /*
162 * Open it read/write.
163 * Check the initial position and read stuff. Then append some more and
164 * check the new position and see that read returns 0/EOF. Finally,
165 * do some seeking and read from a new position.
166 */
167 hFile = CreateFile("tstFileAppendWin-1.tst",
168 (FILE_GENERIC_WRITE & ~FILE_WRITE_DATA) | GENERIC_READ,
169 FILE_SHARE_READ,
170 NULL,
171 OPEN_EXISTING,
172 FILE_ATTRIBUTE_NORMAL,
173 NULL);
174 if (hFile == INVALID_HANDLE_VALUE)
175 return MyFailure("3rd CreateFile: %d\n", GetLastError());
176
177 off.QuadPart = 0;
178 if (!SetFilePointerEx(hFile, off, &off, FILE_CURRENT))
179 MyError("6th SetFilePointerEx failed: %d\n", GetLastError());
180 else if (off.QuadPart != 0)
181 MyError("unexpected position on open: %ld - expected 0\n", (long)off.QuadPart);
182 else
183 printf("tstFileAppendWin-1: off=%ld on 3rd open\n", (long)off.QuadPart);
184
185 if (!ReadFile(hFile, szBuf, 10, &cb, NULL) || cb != 10)
186 MyError("1st ReadFile failed: %d\n", GetLastError());
187 else if (memcmp(szBuf, "0123456789", 10))
188 MyError("read the wrong stuff: %.10s - expected 0123456789\n", szBuf);
189
190 off.QuadPart = 0;
191 if (!SetFilePointerEx(hFile, off, &off, FILE_CURRENT))
192 MyError("7th SetFilePointerEx failed: %d\n", GetLastError());
193 else if (off.QuadPart != 10)
194 MyError("unexpected position on 1st read: %ld - expected 0\n", (long)off.QuadPart);
195 else
196 printf("tstFileAppendWin-1: off=%ld on 1st read\n", (long)off.QuadPart);
197
198 if (!WriteFile(hFile, "klmnopqrst", 10, &cb, NULL))
199 MyError("3rd write failed: %d\n", GetLastError());
200
201 off.QuadPart = 0;
202 if (!SetFilePointerEx(hFile, off, &off, FILE_CURRENT))
203 MyError("8th SetFilePointerEx failed: %d\n", GetLastError());
204 else if (off.QuadPart != 30)
205 MyError("unexpected position on 3rd write: %ld - expected 30\n", (long)off.QuadPart);
206 else
207 printf("tstFileAppendWin-1: off=%ld after 3rd write\n", (long)off.QuadPart);
208
209 SetLastError(0);
210 if (ReadFile(hFile, szBuf, 1, &cb, NULL) && cb != 0)
211 MyError("read after write didn't fail! cb=%#lx lasterr=%d\n", (long)cb, GetLastError());
212
213 off.QuadPart = 15;
214 if (!SetFilePointerEx(hFile, off, &off, FILE_BEGIN))
215 MyError("9th SetFilePointerEx failed: %d\n", GetLastError());
216 else if (off.QuadPart != 15)
217 MyError("unexpected position on 3rd write: %ld - expected 15\n", (long)off.QuadPart);
218 else
219 {
220 if (!ReadFile(hFile, szBuf, 10, &cb, NULL) || cb != 10)
221 MyError("1st ReadFile failed: %d\n", GetLastError());
222 else if (memcmp(szBuf, "fghijklmno", 10))
223 MyError("read the wrong stuff: %.10s - expected fghijklmno\n", szBuf);
224
225 off.QuadPart = 0;
226 if (!SetFilePointerEx(hFile, off, &off, FILE_CURRENT))
227 MyError("10th SetFilePointerEx failed: %d\n", GetLastError());
228 else if (off.QuadPart != 25)
229 MyError("unexpected position on 2nd read: %ld - expected 25\n", (long)off.QuadPart);
230 else
231 printf("tstFileAppendWin-1: off=%ld after 2nd read\n", (long)off.QuadPart);
232 }
233
234 CloseHandle(hFile);
235
236 /*
237 * Open it read only + append and check that we cannot write to it.
238 */
239 hFile = CreateFile("tstFileAppendWin-1.tst",
240 FILE_APPEND_DATA | GENERIC_READ,
241 FILE_SHARE_READ,
242 NULL,
243 CREATE_ALWAYS,
244 FILE_ATTRIBUTE_NORMAL,
245 NULL);
246 if (hFile == INVALID_HANDLE_VALUE)
247 return MyFailure("4th CreateFile: %d\n", GetLastError());
248
249 SetLastError(0);
250 if (WriteFile(hFile, "pqrstuvwx", 10, &cb, NULL))
251 MyError("write didn't on read-only+append open: %d cb=%#lx\n", GetLastError(), (long)cb);
252
253 CloseHandle(hFile);
254 DeleteFile("tstfileAppendWin-1.tst");
255
256 if (g_cErrors)
257 printf("tstFileAppendWin-1: FAILED\n");
258 else
259 printf("tstFileAppendWin-1: SUCCESS\n");
260 return g_cErrors ? 1 : 0;
261}
262
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