VirtualBox

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

Last change on this file since 95841 was 93115, checked in by vboxsync, 3 years ago

scm --update-copyright-year

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