shell32: tests/shellord.c[new]: Add tests for SHGetNewLinkInfo[AW]
Zac Brown
zac at zacbrown.org
Wed Jul 2 14:20:20 CDT 2008
Zac Brown wrote:
> Add tests for SHGetNewLinkInfo[AW]
>
> Tests pass on Windows 2000, Windows XP and Windows Server 2003.
>
> Changes:
> * Add initial tests for SHGetNewLinkInfo[AW] to shell32/tests/shellord.c
> * Add shell32/tests/shellord.c
> * Update shell32/tests/Makefile.in
>
>
> ------------------------------------------------------------------------
>
> ---
> dlls/shell32/tests/Makefile.in | 1 +
> dlls/shell32/tests/shellord.c | 379 ++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 380 insertions(+), 0 deletions(-)
> create mode 100644 dlls/shell32/tests/shellord.c
>
> diff --git a/dlls/shell32/tests/Makefile.in b/dlls/shell32/tests/Makefile.in
> index 088499f..316dd72 100644
> --- a/dlls/shell32/tests/Makefile.in
> +++ b/dlls/shell32/tests/Makefile.in
> @@ -8,6 +8,7 @@ IMPORTS = uuid shell32 ole32 oleaut32 user32 advapi32 kernel32
> CTESTS = \
> generated.c \
> shelllink.c \
> + shellord.c \
> shellpath.c \
> shfldr_special.c \
> shlexec.c \
> diff --git a/dlls/shell32/tests/shellord.c b/dlls/shell32/tests/shellord.c
> new file mode 100644
> index 0000000..f5ae1bd
> --- /dev/null
> +++ b/dlls/shell32/tests/shellord.c
> @@ -0,0 +1,379 @@
> +/*
> + * Unit tests for shellord.c
> + *
> + * Copyright 2008 Google (Zac Brown)
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
> + *
> + */
> +
> +#define COBJMACROS
> +
> +#include <stdio.h>
> +
> +#include <windows.h>
> +#include "shlguid.h"
> +#include "shobjidl.h"
> +#include "shlobj.h"
> +#include "wine/test.h"
> +
> +#include "shell32_test.h"
> +
> +static BOOL (WINAPI *pSHGetNewLinkInfoA) (LPCSTR pszLinkTo,
> + LPCSTR pszDir,
> + LPSTR pszName,
> + BOOL *pfMustCopy,
> + UINT uFlags);
> +static LPITEMIDLIST (WINAPI *pSHSimpleIDListFromPath) (LPCSTR lpszPath);
> +
> +typedef struct
> +{
> + UINT flags;
> + const char* expected_str_1;
> + const char* expected_str_2;
> + const char* expected_str_3;
> + BOOL use_full_path;
> + BOOL todo_str_check;
> + BOOL skip_crash;
> +} getlink_test_t, *lp_getlink_test_t;
> +
> +
> +static const getlink_test_t getlink_tests[] = {
> + {
> + 0,
> + "testfile.lnk",
> + "testfile.lnk",
> + "testfile.txt.lnk",
> + TRUE,
> + TRUE,
> + FALSE
> + },
> + {
> + SHGNLI_PIDL,
> + "testfile.lnk",
> + "testfile.lnk",
> + "testfile.txt.lnk",
> + TRUE,
> + TRUE,
> + FALSE
> + },
> + {
> + SHGNLI_NOUNIQUE,
> + "testfile.lnk",
> + "testfile.lnk",
> + "testfile.txt.lnk",
> + FALSE,
> + TRUE,
> + FALSE
> + },
> + {
> + SHGNLI_PREFIXNAME,
> + "Shortcut to testfile.lnk",
> + "Shortcut to testfile.lnk",
> + "Shortcut to testfile.txt.lnk",
> + TRUE,
> + TRUE,
> + TRUE
> + },
> + {
> + SHGNLI_NOLNK,
> + "testfile",
> + "testfile.lnk",
> + "testfile.txt (2)",
> + TRUE,
> + TRUE,
> + FALSE
> + },
> + {
> + SHGNLI_PIDL | SHGNLI_NOUNIQUE,
> + "testfile.lnk",
> + "testfile.lnk",
> + "testfile.txt.lnk",
> + FALSE,
> + TRUE,
> + FALSE
> + },
> + {
> + SHGNLI_PIDL | SHGNLI_PREFIXNAME,
> + "Shortcut to testfile.lnk",
> + "Shortcut to testfile.lnk",
> + "Shortcut to testfile.txt.lnk",
> + TRUE,
> + TRUE,
> + TRUE
> + },
> + {
> + SHGNLI_PIDL | SHGNLI_NOLNK,
> + "testfile",
> + "testfile.lnk",
> + "testfile.txt (2)",
> + TRUE,
> + TRUE,
> + TRUE
> + },
> + {
> + SHGNLI_NOUNIQUE | SHGNLI_PREFIXNAME,
> + "Shortcut () to testfile.lnk",
> + "Shortcut () to testfile.lnk",
> + "Shortcut () to testfile.txt.lnk",
> + FALSE,
> + TRUE,
> + FALSE
> + },
> + {
> + SHGNLI_NOUNIQUE | SHGNLI_NOLNK,
> + "testfile",
> + "testfile.lnk",
> + "testfile.txt",
> + FALSE,
> + TRUE,
> + FALSE
> + },
> + {
> + SHGNLI_PREFIXNAME | SHGNLI_NOLNK,
> + "Shortcut to testfile",
> + "Shortcut to testfile.lnk",
> + "Shortcut to testfile.txt",
> + TRUE,
> + TRUE,
> + TRUE
> + },
> + {
> + SHGNLI_PIDL | SHGNLI_NOUNIQUE | SHGNLI_PREFIXNAME,
> + "Shortcut () to testfile.lnk",
> + "Shortcut () to testfile.lnk",
> + "Shortcut () to testfile.txt.lnk",
> + FALSE,
> + TRUE,
> + FALSE
> + },
> + {
> + SHGNLI_PIDL | SHGNLI_PREFIXNAME | SHGNLI_NOLNK,
> + "Shortcut to testfile",
> + "Shortcut to testfile.lnk",
> + "Shortcut to testfile.txt",
> + TRUE,
> + TRUE,
> + TRUE
> + },
> + {
> + SHGNLI_NOUNIQUE | SHGNLI_PREFIXNAME | SHGNLI_NOLNK,
> + "Shortcut () to testfile",
> + "Shortcut () to testfile.lnk",
> + "Shortcut () to testfile.txt",
> + FALSE,
> + TRUE,
> + FALSE
> + },
> + {
> + SHGNLI_PIDL | SHGNLI_NOUNIQUE | SHGNLI_PREFIXNAME | SHGNLI_NOLNK,
> + "Shortcut () to testfile",
> + "Shortcut () to testfile.lnk",
> + "Shortcut () to testfile.txt",
> + FALSE,
> + TRUE,
> + FALSE
> + }
> +};
> +
> +static void test_SHGetNewLinkInfo (void)
> +{
> + FILE *testfile_handle;
> + LPCSTR testfile_name = "testfile.txt";
> + LPSTR shortcut_pidl, shortcut_ptr;
> + CHAR shortcut_target[MAX_PATH];
> + CHAR shortcut_dir[MAX_PATH];
> + CHAR shortcut_name[MAX_PATH];
> + WCHAR shortcut_targetW[MAX_PATH];
> + UINT flags;
> + BOOL ret;
> + unsigned int index;
> + BOOL pfMustCopy;
> +
> + lp_getlink_test_t test_ptr;
> + CHAR tmp_buf1[MAX_PATH];
> + CHAR tmp_buf2[MAX_PATH];
> + CHAR tmp_buf3[MAX_PATH];
> +
> + testfile_handle = fopen (testfile_name, "w");
> + if (!testfile_handle || !GetCurrentDirectory (sizeof(shortcut_dir), shortcut_dir) ||
> + !GetFullPathName (testfile_name, sizeof(shortcut_target), shortcut_target, NULL))
> + {
> + skip ("Failed to create a test file or get the current working directory.\n");
> + goto cleanup;
> + }
> + ok (fclose(testfile_handle) == 0, "Could not close testfile.txt.\n");
> +
> + MultiByteToWideChar(CP_ACP, 0, shortcut_target, -1, shortcut_targetW, MAX_PATH);
> +
> + /* Get the PIDL of the path */
> + shortcut_pidl = (LPSTR)pSHSimpleIDListFromPath ((LPCVOID)shortcut_targetW);
> + ok (shortcut_pidl != NULL, "SHSimpleIDListFromPath failed.\n");
> + if (shortcut_pidl == NULL)
> + goto cleanup;
> +
> + for (index = 0; index < sizeof(getlink_tests)/sizeof(getlink_tests[0]); index++)
> + {
> + test_ptr = &getlink_tests[index];
> + flags = getlink_tests[index].flags;
> +
> + if (flags & SHGNLI_PIDL)
> + shortcut_ptr = shortcut_pidl;
> + else
> + shortcut_ptr = shortcut_target;
> +
> + /* Test with all NULL/0 values except for pfMustCopy */
> + ret = SHGetNewLinkInfoA (NULL, NULL, NULL, &pfMustCopy, flags);
> + ok (ret == FALSE, "Expected return value of FALSE.\n");
> + todo_wine ok(pfMustCopy == FALSE, "Expected pfMustCopy to be FALSE.\n");
> +
> + /* Test with valid target, NULL shortcut directory and name buffers */
> + if (test_ptr->skip_crash == FALSE)
> + {
> + ret = SHGetNewLinkInfoA (shortcut_ptr, NULL, NULL, &pfMustCopy, flags);
> + ok (ret == FALSE, "Expected return value of FALSE.\n");
> + todo_wine ok (pfMustCopy == FALSE, "Expected pfMustCopy to be FALSE.\n");
> + }
> +
> + /* Test with valid shortcut directory, NULL target and name buffers */
> + ret = SHGetNewLinkInfoA (NULL, shortcut_dir, NULL, &pfMustCopy, flags);
> + ok (ret == FALSE, "Expected return value of FALSE.\n");
> + todo_wine ok (pfMustCopy == FALSE, "Expected pfMustCopy to be FALSE.\n");
> +
> + /* Test with valid shortcut name and NULL target, shortcut directory buffers */
> + ret = SHGetNewLinkInfoA (NULL, NULL, shortcut_name, &pfMustCopy, flags);
> + ok (ret == FALSE, "Expected return value of FALSE.\n");
> + todo_wine ok (pfMustCopy == FALSE, "Expected pfMustCopy to be FALSE.\n");
> +
> + /* Test with valid shortcut directory and name, NULL shortcut target buffer */
> + ret = SHGetNewLinkInfoA (NULL, shortcut_dir, shortcut_name, &pfMustCopy, flags);
> + ok (ret == FALSE, "Expected return value of FALSE.\n");
> + todo_wine ok (pfMustCopy == FALSE, "Expected pfMustCopy to be FALSE.\n");
> +
> + /* Test with valid shortcut target and name, NULL shortcut directory buffer */
> + if (test_ptr->skip_crash == FALSE)
> + {
> + memset (shortcut_name, 0, MAX_PATH);
> + ret = SHGetNewLinkInfoA (shortcut_ptr, NULL, shortcut_name, &pfMustCopy, flags);
> + todo_wine
> + {
> + ok (ret == TRUE, "Expected return value of TRUE.\n");
> + ok (pfMustCopy == FALSE, "Expected pfMustCopy to be FALSE.\n");
> + }
> +
> + lstrcpyA (tmp_buf1, test_ptr->expected_str_1);
> + lstrcpyA (tmp_buf2, test_ptr->expected_str_2);
> + lstrcpyA (tmp_buf3, test_ptr->expected_str_3);
> +
> + if (test_ptr->todo_str_check)
> + {
> + todo_wine
> + ok (lstrcmpA (shortcut_name, tmp_buf1) == 0 ||
> + lstrcmpA (shortcut_name, tmp_buf2) == 0 ||
> + lstrcmpA (shortcut_name, tmp_buf3) == 0,
> + "Returned shortcut did not match expected, got: %s\n",
> + shortcut_name);
> + }
> + else
> + {
> + ok (lstrcmpA (shortcut_name, tmp_buf1) == 0 ||
> + lstrcmpA (shortcut_name, tmp_buf2) == 0 ||
> + lstrcmpA (shortcut_name, tmp_buf3) == 0,
> + "Returned shortcut did not match expected, got: %s\n",
> + shortcut_name);
> + }
> + }
> +
> + /* Test with valid shortcut directory, target, name buffers */
> + memset (shortcut_name, 0, MAX_PATH);
> + ret = SHGetNewLinkInfoA (shortcut_ptr, shortcut_dir, shortcut_name, &pfMustCopy, flags);
> + todo_wine
> + {
> + ok (ret == TRUE, "Expected return value of TRUE.\n");
> + ok (pfMustCopy == FALSE, "Expected pfMustCopy to be FALSE.\n");
> + }
> +
> + if (test_ptr->use_full_path == TRUE && shortcut_dir != NULL)
> + {
> + lstrcpyA (tmp_buf1, shortcut_dir);
> + lstrcatA (tmp_buf1, "\\");
> + lstrcpyA (tmp_buf2, tmp_buf1);
> + lstrcpyA (tmp_buf3, tmp_buf1);
> +
> + lstrcatA (tmp_buf1, test_ptr->expected_str_1);
> + lstrcatA (tmp_buf2, test_ptr->expected_str_2);
> + lstrcatA (tmp_buf3, test_ptr->expected_str_3);
> + }
> + else
> + {
> + lstrcpyA (tmp_buf1, test_ptr->expected_str_1);
> + lstrcpyA (tmp_buf2, test_ptr->expected_str_2);
> + lstrcpyA (tmp_buf3, test_ptr->expected_str_3);
> + }
> +
> + if (test_ptr->todo_str_check)
> + {
> + todo_wine
> + ok (lstrcmpA (shortcut_name, tmp_buf1) == 0 ||
> + lstrcmpA (shortcut_name, tmp_buf2) == 0 ||
> + lstrcmpA (shortcut_name, tmp_buf3) == 0,
> + "Returned shortcut did not match expected, got: %s\n",
> + shortcut_name);
> + }
> + else
> + {
> + ok (lstrcmpA (shortcut_name, tmp_buf1) == 0 ||
> + lstrcmpA (shortcut_name, tmp_buf2) == 0 ||
> + lstrcmpA (shortcut_name, tmp_buf3) == 0,
> + "Returned shortcut did not match expected, got: %s\n",
> + shortcut_name);
> + }
> + }
> +
> + cleanup:
> + ret = DeleteFileA (shortcut_target);
> + ok (ret == TRUE, "Failed to delete %s\n", shortcut_target);
> +}
> +
> +
> +START_TEST(shellord)
> +{
> + HRESULT r;
> + HMODULE hmod = GetModuleHandleA("shell32.dll");
> +
> + pSHGetNewLinkInfoA = (void *) GetProcAddress(hmod, (LPSTR)179);
> + pSHSimpleIDListFromPath = (void *) GetProcAddress(hmod, (LPSTR)162);
> +
> + if (!pSHSimpleIDListFromPath)
> + {
> + skip("Unable to get process address for SHSimpleIDListFromPath.\n");
> + return;
> + }
> + if (!pSHGetNewLinkInfoA)
> + {
> + skip("Unable to get process address for SHGetNewLinkInfoA.\n");
> + return;
> + }
> +
> +
> + r = CoInitialize(NULL);
> + ok (SUCCEEDED(r), "CoInitialize failed (0x%08x)\n", r);
> + if (!SUCCEEDED(r))
> + return;
> +
> + test_SHGetNewLinkInfo();
> +
> + CoUninitialize();
> +}
>
>
> ------------------------------------------------------------------------
>
>
Ignore this patch, will resend a fixed one later.
More information about the wine-devel
mailing list