1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4
5/*=====================================================================
6**
7** Source: SetFilePointer.c (test 4)
8**
9** Purpose: Tests the PAL implementation of the SetFilePointer function.
10** Test the FILE_END option
11**
12** Assumes Successful:
13** CreateFile
14** ReadFile
15** WriteFile
16** strlen
17** CloseHandle
18** strcmp
19** GetFileSize
20**
21**
22**===================================================================*/
23
24#include <palsuite.h>
25
26const char* szText = "The quick brown fox jumped over the lazy dog's back.";
27const char* szTextFile = "text.txt";
28
29
30int __cdecl main(int argc, char *argv[])
31{
32 HANDLE hFile = NULL;
33 DWORD dwByteCount = 0;
34 DWORD dwOffset = 0;
35 DWORD dwRc = 0;
36 BOOL bRc = FALSE;
37
38 if (0 != PAL_Initialize(argc,argv))
39 {
40 return FAIL;
41 }
42
43 /* create a test file */
44 hFile = CreateFile(szTextFile,
45 GENERIC_READ | GENERIC_WRITE,
46 FILE_SHARE_READ | FILE_SHARE_WRITE,
47 NULL,
48 CREATE_ALWAYS,
49 FILE_ATTRIBUTE_NORMAL,
50 NULL);
51
52 if(hFile == INVALID_HANDLE_VALUE)
53 {
54 Fail("SetFilePointer: ERROR -> Unable to create file \"%s\".\n",
55 szTextFile);
56 }
57
58 bRc = WriteFile(hFile, szText, (DWORD)strlen(szText), &dwByteCount, NULL);
59 if (bRc == FALSE)
60 {
61 Trace("SetFilePointer: ERROR -> Unable to write to file \"%s\".\n",
62 szTextFile);
63 if (CloseHandle(hFile) != TRUE)
64 {
65 Trace("SetFilePointer: ERROR -> Unable to close file \"%s\".\n",
66 szTextFile);
67 }
68 if (!DeleteFileA(szTextFile))
69 {
70 Trace("SetFilePointer: ERROR -> Unable to delete file \"%s\".\n",
71 szTextFile);
72 }
73 PAL_TerminateEx(FAIL);
74 return FAIL;
75 }
76
77
78 /*
79 * move -1 from the end
80 */
81 dwRc = SetFilePointer(hFile, -1, NULL, FILE_END);
82 if (dwRc == INVALID_SET_FILE_POINTER)
83 {
84 if (GetLastError() != ERROR_SUCCESS)
85 {
86 Trace("SetFilePointer: ERROR -> Failed to move the pointer "
87 "back one character from EOF.\n");
88 if (CloseHandle(hFile) != TRUE)
89 {
90 Trace("SetFilePointer: ERROR -> Unable to close file"
91 " \"%s\".\n", szTextFile);
92 }
93 if (!DeleteFileA(szTextFile))
94 {
95 Trace("SetFilePointer: ERROR -> Unable to delete file"
96 " \"%s\".\n", szTextFile);
97 }
98 PAL_TerminateEx(FAIL);
99 return FAIL;
100 }
101 }
102 else
103 {
104 /* verify */
105 if ((dwRc != strlen(szText)-1))
106 {
107 Trace("SetFilePointer: ERROR -> Failed to move the pointer"
108 " -1 bytes from EOF\n");
109 if (CloseHandle(hFile) != TRUE)
110 {
111 Trace("SetFilePointer: ERROR -> Unable to close file"
112 " \"%s\".\n", szTextFile);
113 }
114 if (!DeleteFileA(szTextFile))
115 {
116 Trace("SetFilePointer: ERROR -> Unable to delete file"
117 " \"%s\".\n", szTextFile);
118 }
119 PAL_TerminateEx(FAIL);
120 return FAIL;
121 }
122 }
123
124 /*
125 * move the file pointer 0 bytes from the end and verify
126 */
127 dwRc = SetFilePointer(hFile, 0, NULL, FILE_END);
128 if (dwRc != strlen(szText))
129 {
130 Trace("SetFilePointer: ERROR -> Asked to move 0 bytes from the "
131 "end of the file. Function returned %ld instead of 52.\n", dwRc);
132 if (CloseHandle(hFile) != TRUE)
133 {
134 Trace("SetFilePointer: ERROR -> Unable to close file \"%s\".\n",
135 szTextFile);
136 }
137 if (!DeleteFileA(szTextFile))
138 {
139 Trace("SetFilePointer: ERROR -> Unable to delete file \"%s\".\n",
140 szTextFile);
141 }
142 PAL_TerminateEx(FAIL);
143 return FAIL;
144 }
145
146 /*
147 * move the pointer past the end of the file and verify
148 */
149 dwRc = SetFilePointer(hFile, 20, NULL, FILE_END);
150 if (dwRc != strlen(szText)+20)
151 {
152 Trace("SetFilePointer: ERROR -> Asked to move 20 bytes past the "
153 "end of the file. Function returned %ld instead of %d.\n",
154 dwRc,
155 strlen(szText)+20);
156 if (CloseHandle(hFile) != TRUE)
157 {
158 Trace("SetFilePointer: ERROR -> Unable to close file \"%s\".\n",
159 szTextFile);
160 }
161 if (!DeleteFileA(szTextFile))
162 {
163 Trace("SetFilePointer: ERROR -> Unable to delete file \"%s\".\n",
164 szTextFile);
165 }
166 PAL_TerminateEx(FAIL);
167 return FAIL;
168 }
169 else
170 {
171 /* verify results */
172 bRc = SetEndOfFile(hFile);
173 if ((dwRc = GetFileSize(hFile, NULL)) != strlen(szText)+20)
174 {
175 Trace("SetFilePointer: ERROR -> Asked to move back 20 bytes past"
176 " theend of the file. GetFileSize returned %ld whereas it "
177 "should have been %d.\n",
178 dwRc,
179 strlen(szText)+20);
180 if (CloseHandle(hFile) != TRUE)
181 {
182 Trace("SetFilePointer: ERROR -> Unable to close file"
183 " \"%s\".\n", szTextFile);
184 }
185 if (!DeleteFileA(szTextFile))
186 {
187 Trace("SetFilePointer: ERROR -> Unable to delete file"
188 " \"%s\".\n", szTextFile);
189 }
190 PAL_TerminateEx(FAIL);
191 return FAIL;
192 }
193 }
194
195
196 /*
197 * move the pointer backwards to before the start of the file and verify
198 */
199
200 dwOffset = (dwRc + 20) * -1;
201 dwRc = SetFilePointer(hFile, dwOffset, NULL, FILE_END);
202 if ((dwRc != INVALID_SET_FILE_POINTER) ||
203 (GetLastError() == ERROR_SUCCESS))
204 {
205 Trace("SetFilePointer: ERROR -> Was able to move the pointer "
206 "to before the beginning of the file.\n");
207 if (CloseHandle(hFile) != TRUE)
208 {
209 Trace("SetFilePointer: ERROR -> Unable to close file \"%s\".\n",
210 szTextFile);
211 }
212 if (!DeleteFileA(szTextFile))
213 {
214 Trace("SetFilePointer: ERROR -> Unable to delete file \"%s\".\n",
215 szTextFile);
216 }
217 PAL_TerminateEx(FAIL);
218 return FAIL;
219 }
220
221
222 if (CloseHandle(hFile) != TRUE)
223 {
224 Trace("SetFilePointer: ERROR -> Unable to close file \"%s\".\n",
225 szTextFile);
226 if (!DeleteFileA(szTextFile))
227 {
228 Trace("SetFilePointer: ERROR -> Unable to delete file \"%s\".\n",
229 szTextFile);
230 }
231 PAL_TerminateEx(FAIL);
232 return FAIL;
233 }
234
235 if (!DeleteFileA(szTextFile))
236 {
237 Fail("SetFilePointer: ERROR -> Unable to delete file \"%s\".\n",
238 szTextFile);
239 }
240 PAL_Terminate();
241 return PASS;
242}
243