[PATCH v2 2/2] shell32/tests: Add PathResolve tests.
Gijs Vermeulen
gijsvrm at codeweavers.com
Wed Dec 11 04:16:18 CST 2019
Signed-off-by: Gijs Vermeulen <gijsvrm at codeweavers.com>
---
dlls/shell32/tests/shellpath.c | 119 +++++++++++++++++++++++++++++++++
1 file changed, 119 insertions(+)
diff --git a/dlls/shell32/tests/shellpath.c b/dlls/shell32/tests/shellpath.c
index 262714a9f3..4ea2ef14cd 100644
--- a/dlls/shell32/tests/shellpath.c
+++ b/dlls/shell32/tests/shellpath.c
@@ -99,6 +99,7 @@ static HRESULT (WINAPI *pSHSetKnownFolderPath)(REFKNOWNFOLDERID, DWORD, HANDLE,
static HRESULT (WINAPI *pSHGetFolderPathEx)(REFKNOWNFOLDERID, DWORD, HANDLE, LPWSTR, DWORD);
static BOOL (WINAPI *pPathYetAnotherMakeUniqueName)(PWSTR, PCWSTR, PCWSTR, PCWSTR);
static HRESULT (WINAPI *pSHGetKnownFolderIDList)(REFKNOWNFOLDERID, DWORD, HANDLE, PIDLIST_ABSOLUTE*);
+static BOOL (WINAPI *pPathResolve)(PWSTR, PZPCWSTR, UINT);
static DLLVERSIONINFO shellVersion = { 0 };
static LPMALLOC pMalloc;
@@ -207,6 +208,7 @@ static void loadShell32(void)
GET_PROC(SHGetMalloc)
GET_PROC(PathYetAnotherMakeUniqueName)
GET_PROC(SHGetKnownFolderIDList)
+ GET_PROC(PathResolve);
ok(pSHGetMalloc != NULL, "shell32 is missing SHGetMalloc\n");
if (pSHGetMalloc)
@@ -2864,6 +2866,122 @@ if (0) { /* crashes on native */
ILFree(pidl);
}
+static void test_PathResolve(void)
+{
+ WCHAR testfile[MAX_PATH], testfile_lnk[MAX_PATH], regedit_in_testdir[MAX_PATH], regedit_cmd[MAX_PATH];
+ WCHAR tempdir[MAX_PATH], path[MAX_PATH];
+ const WCHAR *dirs[2] = { tempdir, NULL };
+ HANDLE file, file2;
+ BOOL ret;
+ int i;
+ struct {
+ const WCHAR *path;
+ UINT flags;
+ BOOL expected;
+ const WCHAR *expected_path;
+ } tests[] = {
+ /* no flags */
+ { L"test", 0, FALSE, L"test" },
+ { L"C:\\test", 0, TRUE, L"C:\\test" },
+ { L"regedit", 0, FALSE, L"regedit" },
+ { testfile, 0, TRUE, testfile },
+
+ /* PRF_VERIFYEXISTS */
+ { L"test", PRF_VERIFYEXISTS, TRUE, testfile_lnk },
+ { L"C:\\test", PRF_VERIFYEXISTS, FALSE, L"C:\\test" },
+ /* common extensions are tried even if PRF_TRYPROGRAMEXTENSIONS isn't passed */
+ /* directories in dirs parameter are always searched first even if PRF_FIRSTDIRDEF isn't passed */
+ { L"regedit", PRF_VERIFYEXISTS, TRUE, regedit_cmd },
+ /* .dll is not tried */
+ { L"bcrypt", PRF_VERIFYEXISTS, FALSE, L"bcrypt" },
+ { testfile, PRF_VERIFYEXISTS, TRUE, testfile_lnk },
+ { regedit_in_testdir, PRF_VERIFYEXISTS, TRUE, regedit_cmd },
+
+ /* PRF_FIRSTDIRDEF */
+ { L"regedit", PRF_FIRSTDIRDEF, FALSE, L"regedit" },
+
+ /* RF_VERIFYEXISTS | PRF_FIRSTDIRDEF */
+ { L"regedit", PRF_VERIFYEXISTS | PRF_FIRSTDIRDEF, TRUE, regedit_cmd },
+
+ /* PRF_DONTFINDLNK */
+ { testfile, PRF_DONTFINDLNK, TRUE, testfile },
+ { regedit_in_testdir, PRF_DONTFINDLNK, TRUE, regedit_in_testdir },
+
+ /* RF_VERIFYEXISTS | PRF_DONTFINDLNK */
+ { testfile, PRF_VERIFYEXISTS | PRF_DONTFINDLNK, FALSE, testfile },
+ /* cmd is also ignored when passing PRF_VERIFYEXISTS | PRF_DONTFINDLNK */
+ { regedit_in_testdir, PRF_VERIFYEXISTS | PRF_DONTFINDLNK, FALSE, regedit_in_testdir },
+
+ /* PRF_VERIFYEXISTS | PRF_REQUIREABSOLUTE */
+ /* only PRF_VERIFYEXISTS matters*/
+ { L"test", PRF_VERIFYEXISTS | PRF_REQUIREABSOLUTE, TRUE, testfile_lnk },
+ { L"C:\\test", PRF_VERIFYEXISTS | PRF_REQUIREABSOLUTE, FALSE, L"C:\\test" },
+ { L"regedit", PRF_VERIFYEXISTS | PRF_REQUIREABSOLUTE, TRUE, regedit_cmd },
+ { testfile, PRF_VERIFYEXISTS | PRF_REQUIREABSOLUTE, TRUE, testfile_lnk },
+
+ /* PRF_TRYPROGRAMEXTENSIONS */
+ { L"test", PRF_TRYPROGRAMEXTENSIONS, TRUE, testfile_lnk},
+ { L"C:\\test", PRF_TRYPROGRAMEXTENSIONS, FALSE, L"C:\\test" },
+ { L"regedit", PRF_TRYPROGRAMEXTENSIONS, TRUE, regedit_cmd },
+ /* .dll is not tried */
+ { L"bcrypt", PRF_TRYPROGRAMEXTENSIONS, FALSE, L"bcrypt" },
+ { testfile, PRF_TRYPROGRAMEXTENSIONS, TRUE, testfile_lnk },
+ { regedit_in_testdir, PRF_TRYPROGRAMEXTENSIONS, TRUE, regedit_cmd },
+
+ /* PRF_TRYPROGRAMEXTENSIONS | PRF_DONTFINDLNK */
+ { testfile, PRF_TRYPROGRAMEXTENSIONS | PRF_DONTFINDLNK, FALSE, testfile },
+ /* cmd is also ignored when passing PRF_TRYPROGRAMEXTENSIONS | PRF_DONTFINDLNK */
+ { regedit_in_testdir, PRF_TRYPROGRAMEXTENSIONS | PRF_DONTFINDLNK, FALSE, regedit_in_testdir }
+ };
+
+ if (!pPathResolve)
+ {
+ win_skip("PathResolve not available\n");
+ return;
+ }
+
+ GetTempPathW(MAX_PATH, tempdir);
+
+ lstrcpyW(testfile, tempdir);
+ lstrcatW(testfile, L"test");
+ lstrcpyW(testfile_lnk, testfile);
+ lstrcatW(testfile_lnk, L".lnk");
+
+ file = CreateFileW(testfile_lnk, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, NULL);
+ ok(file != INVALID_HANDLE_VALUE, "got %p\n", file);
+
+ lstrcpyW(regedit_in_testdir, tempdir);
+ lstrcatW(regedit_in_testdir, L"regedit");
+ lstrcpyW(regedit_cmd, regedit_in_testdir);
+ lstrcatW(regedit_cmd, L".cmd");
+
+ file2 = CreateFileW(regedit_cmd, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, NULL);
+ ok(file2 != INVALID_HANDLE_VALUE, "got %p\n", file);
+
+ /* show that resolving regedit with NULL dirs returns regedit.exe */
+ lstrcpyW(path, L"regedit");
+ ret = pPathResolve(path, NULL, PRF_VERIFYEXISTS);
+ ok(ret, "resolving regedit failed unexpectedly\n");
+ ok(!lstrcmpiW(path, L"C:\\windows\\regedit.exe") || !lstrcmpiW(path, L"C:\\windows\\system32\\regedit.exe"),
+ "unexpected path %s\n", wine_dbgstr_w(path));
+
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
+ {
+ lstrcpyW(path, tests[i].path);
+
+ if (!tests[i].expected) SetLastError(0xdeadbeef);
+ ret = pPathResolve(path, dirs, tests[i].flags);
+ ok(ret == tests[i].expected, "test %d: expected %d, got %d\n", i, tests[i].expected, ret);
+ ok(!lstrcmpiW(path, tests[i].expected_path),
+ "test %d: expected %s, got %s\n", i, wine_dbgstr_w(tests[i].expected_path), wine_dbgstr_w(path));
+ if (!tests[i].expected)
+ ok(GetLastError() == ERROR_FILE_NOT_FOUND, "expected ERROR_ALREADY_EXISTS, got %d\n", GetLastError());
+ }
+
+ CloseHandle(file);
+ CloseHandle(file2);
+}
+
START_TEST(shellpath)
{
if (!init()) return;
@@ -2894,5 +3012,6 @@ START_TEST(shellpath)
test_DoEnvironmentSubst();
test_PathYetAnotherMakeUniqueName();
test_SHGetKnownFolderIDList();
+ test_PathResolve();
}
}
--
2.24.0
More information about the wine-devel
mailing list