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: test4.c
8**
9** Purpose: Tests the PAL implementation of the GetFullPathNameW API.
10** GetFullPathNameW will be passed a directory that begins with '..'.
11** Example: ..\test_directory\testing.tmp.
12** To add to this test, we will also call SetCurrentDirectory to
13** ensure this is handled properly.
14** The test will create a file with in the parent directory
15** to verify that the returned directory is valid.
16**
17** Depends: SetCurrentDirectory,
18** CreateDirectory,
19** strcat,
20** memset,
21** CreateFile,
22** CloseHandle,
23** strcmp,
24** DeleteFileW,
25** RemoveDirectory.
26**
27
28**
29**===================================================================*/
30#define UNICODE
31#include <palsuite.h>
32
33#ifdef WIN32
34 const WCHAR szSeperator[] = {'\\','\\','\0'};
35#else
36 const WCHAR szSeperator[] = {'/','/','\0'};
37#endif
38
39const WCHAR szDotDot[] = {'.','.','\0'};
40const WCHAR szFileName[] = {'t','e','s','t','i','n','g','.','t','m','p','\0'};
41
42int __cdecl main(int argc, char *argv[])
43{
44 DWORD dwRc = 0;
45
46 WCHAR szReturnedPath[_MAX_DIR+1];
47 WCHAR szFullFileName[_MAX_DIR+1];
48 WCHAR szDirectory[256];
49 WCHAR szCreatedDir[] = {'t','e','s','t','_','d','i','r','\0'};
50
51 LPWSTR pPathPtr;
52 HANDLE hFile = NULL;
53 BOOL bRetVal = FAIL;
54
55 /* Initialize the PAL.
56 */
57 if (0 != PAL_Initialize(argc,argv))
58 {
59 return (FAIL);
60 }
61
62 /* Initialize the buffer.
63 */
64 memset(szDirectory, '\0', 256);
65
66 /* Create the path to the next level of directory to create.
67 */
68 wcscat(szDirectory, szDotDot); /* .. */
69 wcscat(szDirectory, szSeperator); /* ../ */
70 wcscat(szDirectory, szCreatedDir); /* ../test_directory */
71
72 /* Create a test directory.
73 */
74 if (!CreateDirectoryW(szDirectory, NULL))
75 {
76 Fail("ERROR:%u: Unable to create directories \"%S\".\n",
77 GetLastError(),
78 szDirectory);
79 }
80
81 /* Initialize the receiving char buffers.
82 */
83 memset(szReturnedPath, 0, _MAX_DIR+1);
84 memset(szFullFileName, 0, _MAX_DIR+1);
85
86 /* Create Full filename to pass, will include '..\'
87 * in the middle of the path.
88 */
89 wcscat( szFullFileName, szDotDot ); /* .. */
90 wcscat( szFullFileName, szSeperator ); /* ../ */
91 wcscat( szFullFileName, szCreatedDir ); /* ../test_directory */
92 wcscat( szFullFileName, szSeperator ); /* ../test_directory/ */
93 wcscat( szFullFileName, szFileName ); /* ../test_directory/testing.tmp */
94
95 /* Get the full path to the filename.
96 */
97 dwRc = GetFullPathNameW(szFullFileName,
98 _MAX_DIR,
99 szReturnedPath,
100 &pPathPtr);
101 if (dwRc == 0)
102 {
103 Trace("ERROR :%ld: GetFullPathName failed to "
104 "retrieve the path of \"%S\".\n",
105 GetLastError(),
106 szFileName);
107 bRetVal = FAIL;
108 goto cleanUpOne;
109 }
110
111 /* The returned value should be the parent directory with the
112 * file name appended. */
113 hFile = CreateFileW(szReturnedPath,
114 GENERIC_READ,
115 FILE_SHARE_READ,
116 NULL,
117 CREATE_ALWAYS,
118 FILE_ATTRIBUTE_NORMAL,
119 NULL);
120
121 if (hFile == INVALID_HANDLE_VALUE)
122 {
123 Trace("ERROR :%ld: CreateFileA failed to create \"%S\".\n",
124 GetLastError(),
125 szReturnedPath);
126 bRetVal = FAIL;
127 goto cleanUpOne;
128 }
129
130 /* Close the handle to the created file.
131 */
132 if (CloseHandle(hFile) != TRUE)
133 {
134 Trace("ERROR :%ld: CloseHandle failed close hFile=0x%lx.\n",
135 GetLastError());
136 bRetVal = FAIL;
137 goto cleanUpTwo;
138 }
139
140 /* Verify that the file was created, attempt to create
141 * the file again. */
142 hFile = CreateFileW(szReturnedPath,
143 GENERIC_READ,
144 FILE_SHARE_READ,
145 NULL,
146 CREATE_NEW,
147 FILE_ATTRIBUTE_NORMAL,
148 NULL);
149 if ((hFile != INVALID_HANDLE_VALUE) &&
150 (GetLastError() != ERROR_ALREADY_EXISTS))
151 {
152 Trace("ERROR :%ld: CreateFileA succeeded to create file "
153 "\"%S\", that already existed.\n",
154 GetLastError(),
155 szFullFileName);
156 bRetVal = FAIL;
157 goto cleanUpTwo;
158 }
159
160 /* Verify that the returned filename is the same as the supplied.
161 */
162 if (wcscmp(pPathPtr, szFileName) != 0)
163 {
164 Trace("ERROR : Returned filename \"%S\" is not equal to "
165 "supplied filename \"%S\".\n",
166 pPathPtr,
167 szFileName);
168 bRetVal = FAIL;
169 goto cleanUpTwo;
170 }
171
172 /* Successful test.
173 */
174 bRetVal = PASS;
175
176cleanUpTwo:
177
178 /* Delete the create file.
179 */
180 if (DeleteFileW(szReturnedPath) != TRUE)
181 {
182 Fail("ERROR :%ld: DeleteFileA failed to delete \"%S\".\n",
183 GetLastError(),
184 szFileName);
185 }
186
187cleanUpOne:
188
189 /* Remove the empty directory.
190 */
191 if (!RemoveDirectoryW(szDirectory))
192 {
193 Fail("ERROR:%u: Unable to remove directory \"%s\".\n",
194 GetLastError(),
195 szCreatedDir);
196 }
197
198 /* Terminate the PAL.*/
199 PAL_TerminateEx(bRetVal);
200 return bRetVal;
201}
202