>From eaedb3b5eaa2e1e512ece366a4b6982fca6093b6 Mon Sep 17 00:00:00 2001 From: Paul Vriens Date: Thu, 17 Dec 2009 10:44:38 +0100 Subject: [PATCH 3/3] Add some tests for GetLongPathNameW --- dlls/kernel32/tests/path.c | 82 +++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 78 insertions(+), 4 deletions(-) diff --git a/dlls/kernel32/tests/path.c b/dlls/kernel32/tests/path.c index 104a48c..aa5457a 100644 --- a/dlls/kernel32/tests/path.c +++ b/dlls/kernel32/tests/path.c @@ -1065,12 +1065,20 @@ static void test_GetLongPathNameA(void) static void test_GetLongPathNameW(void) { - DWORD length; + DWORD length, expanded; + BOOL ret; + HANDLE file; WCHAR empty[MAX_PATH]; + WCHAR tempdir[MAX_PATH], name[200]; + WCHAR dirpath[4 + MAX_PATH + 200]; /* To ease removal */ + WCHAR shortpath[4 + MAX_PATH + 200 + 1 + 200]; + static const WCHAR prefix[] = { '\\','\\','?','\\', 0}; + static const WCHAR backslash[] = { '\\', 0}; + static const WCHAR letterX[] = { 'X', 0}; + + if (!pGetLongPathNameW) + return; - /* Not present in all windows versions */ - if(pGetLongPathNameW) - { SetLastError(0xdeadbeef); length = pGetLongPathNameW(NULL,NULL,0); if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) @@ -1086,7 +1094,73 @@ static void test_GetLongPathNameW(void) length = pGetLongPathNameW(empty,NULL,0); ok(0==length,"GetLongPathNameW returned %d but expected 0\n",length); ok(GetLastError()==ERROR_PATH_NOT_FOUND,"GetLastError returned %d but expected ERROR_PATH_NOT_FOUND\n",GetLastError()); + + /* Create a long path name. The path needs to exist for these tests to + * succeed so we need the "\\?\" prefix when creating directories and + * files. + */ + name[0] = 0; + while (lstrlenW(name) < (sizeof(name)/sizeof(WCHAR) - 1)) + lstrcatW(name, letterX); + + GetTempPathW(MAX_PATH, tempdir); + + lstrcpyW(shortpath, prefix); + lstrcatW(shortpath, tempdir); + lstrcatW(shortpath, name); + lstrcpyW(dirpath, shortpath); + ret = CreateDirectoryW(shortpath, NULL); + ok(ret, "Could not create the temporary directory : %d\n", GetLastError()); + lstrcatW(shortpath, backslash); + lstrcatW(shortpath, name); + + /* Path does not exist yet and we know it overruns MAX_PATH */ + + /* No prefix */ + SetLastError(0xdeadbeef); + length = pGetLongPathNameW(shortpath + 4, NULL, 0); + ok(length == 0, "Expected 0, got %d\n", length); + todo_wine + ok(GetLastError() == ERROR_PATH_NOT_FOUND, + "Expected ERROR_PATH_NOT_FOUND, got %d\n", GetLastError()); + /* With prefix */ + SetLastError(0xdeadbeef); + length = pGetLongPathNameW(shortpath, NULL, 0); + todo_wine + { + ok(length == 0, "Expected 0, got %d\n", length); + ok(GetLastError() == ERROR_FILE_NOT_FOUND, + "Expected ERROR_PATH_NOT_FOUND, got %d\n", GetLastError()); } + + file = CreateFileW(shortpath, GENERIC_READ|GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + ok(file != INVALID_HANDLE_VALUE, + "Could not create the temporary file : %d.\n", GetLastError()); + CloseHandle(file); + + /* Path exists */ + + /* No prefix */ + SetLastError(0xdeadbeef); + length = pGetLongPathNameW(shortpath + 4, NULL, 0); + todo_wine + { + ok(length == 0, "Expected 0, got %d\n", length); + ok(GetLastError() == ERROR_PATH_NOT_FOUND, "Expected ERROR_PATH_NOT_FOUND, got %d\n", GetLastError()); + } + /* With prefix */ + expanded = 4 + (pGetLongPathNameW(tempdir, NULL, 0) - 1) + lstrlenW(name) + 1 + lstrlenW(name) + 1; + SetLastError(0xdeadbeef); + length = pGetLongPathNameW(shortpath, NULL, 0); + ok(length == expanded, "Expected %d, got %d\n", expanded, length); + + /* NULL buffer with length crashes on Windows */ + if (0) + length = pGetLongPathNameW(shortpath, NULL, 20); + + ok(DeleteFileW(shortpath), "Could not delete temporary file\n"); + ok(RemoveDirectoryW(dirpath), "Could not delete temporary directory\n"); } static void test_GetShortPathNameW(void) -- 1.6.2.5