From e9b3ccaca36c06966e860f1fa84dbdebb0d6c7ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Wed, 28 Feb 2018 13:54:17 +0300 Subject: [PATCH] kernelbase/tests: Add some tests for PathCchCombineEx(). Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- configure | 1 + configure.ac | 1 + dlls/kernelbase/tests/Makefile.in | 4 + dlls/kernelbase/tests/path.c | 123 ++++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+) create mode 100644 dlls/kernelbase/tests/Makefile.in create mode 100644 dlls/kernelbase/tests/path.c diff --git a/configure b/configure index 28e678e6b88..d8d123fa446 100755 --- a/configure +++ b/configure @@ -18729,6 +18729,7 @@ wine_fn_config_dll kerberos enable_kerberos wine_fn_config_dll kernel32 enable_kernel32 wine_fn_config_test dlls/kernel32/tests kernel32_test wine_fn_config_dll kernelbase enable_kernelbase +wine_fn_config_test dlls/kernelbase/tests kernelbase_test wine_fn_config_dll keyboard.drv16 enable_win16 wine_fn_config_dll krnl386.exe16 enable_win16 wine_fn_config_dll ksuser enable_ksuser diff --git a/configure.ac b/configure.ac index 2695c67f05e..2e99320371d 100644 --- a/configure.ac +++ b/configure.ac @@ -3317,6 +3317,7 @@ WINE_CONFIG_DLL(kerberos) WINE_CONFIG_DLL(kernel32) WINE_CONFIG_TEST(dlls/kernel32/tests) WINE_CONFIG_DLL(kernelbase) +WINE_CONFIG_TEST(dlls/kernelbase/tests) WINE_CONFIG_DLL(keyboard.drv16,enable_win16) WINE_CONFIG_DLL(krnl386.exe16,enable_win16) WINE_CONFIG_DLL(ksuser) diff --git a/dlls/kernelbase/tests/Makefile.in b/dlls/kernelbase/tests/Makefile.in new file mode 100644 index 00000000000..ac8e1fcaa65 --- /dev/null +++ b/dlls/kernelbase/tests/Makefile.in @@ -0,0 +1,4 @@ +TESTDLL = kernelbase.dll + +C_SRCS = \ + path.c diff --git a/dlls/kernelbase/tests/path.c b/dlls/kernelbase/tests/path.c new file mode 100644 index 00000000000..fbe1d3be2f5 --- /dev/null +++ b/dlls/kernelbase/tests/path.c @@ -0,0 +1,123 @@ +/* + * Path tests for kernelbase.dll + * + * Copyright 2017 Michael Müller + * + * 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 + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wine/test.h" + +HRESULT (WINAPI *pPathCchCombineEx)(WCHAR *out, SIZE_T size, const WCHAR *path1, const WCHAR *path2, DWORD flags); + +static const struct +{ + const char *path1; + const char *path2; + const char *result; +} +combine_test[] = +{ + /* normal paths */ + {"C:\\", "a", "C:\\a" }, + {"C:\\b", "..\\a", "C:\\a" }, + {"C:", "a", "C:\\a" }, + {"C:\\", ".", "C:\\" }, + {"C:\\", "..", "C:\\" }, + {"\\a", "b", "\\a\\b" }, + + /* normal UNC paths */ + {"\\\\192.168.1.1\\test", "a", "\\\\192.168.1.1\\test\\a" }, + {"\\\\192.168.1.1\\test", "..", "\\\\192.168.1.1" }, + + /* NT paths */ + {"\\\\?\\C:\\", "a", "C:\\a" }, + {"\\\\?\\C:\\", "..", "C:\\" }, + + /* NT UNC path */ + {"\\\\?\\UNC\\192.168.1.1\\test", "a", "\\\\192.168.1.1\\test\\a" }, + {"\\\\?\\UNC\\192.168.1.1\\test", "..", "\\\\192.168.1.1" }, +}; + +static void test_PathCchCombineEx(void) +{ + WCHAR expected[MAX_PATH] = {'C',':','\\','a',0}; + WCHAR p1[MAX_PATH] = {'C',':','\\',0}; + WCHAR p2[MAX_PATH] = {'a',0}; + WCHAR output[MAX_PATH]; + HRESULT hr; + int i; + + if (!pPathCchCombineEx) + { + skip("PathCchCombineEx() is not available.\n"); + return; + } + + hr = pPathCchCombineEx(NULL, 2, p1, p2, 0); + ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); + + memset(output, 0xff, sizeof(output)); + hr = pPathCchCombineEx(output, 0, p1, p2, 0); + ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); + ok(output[0] == 0xffff, "Expected output buffer to be unchanged\n"); + + memset(output, 0xff, sizeof(output)); + hr = pPathCchCombineEx(output, 1, p1, p2, 0); + ok(hr == STRSAFE_E_INSUFFICIENT_BUFFER, "Expected STRSAFE_E_INSUFFICIENT_BUFFER, got %08x\n", hr); + ok(output[0] == 0, "Expected output buffer to contain NULL string\n"); + + memset(output, 0xff, sizeof(output)); + hr = pPathCchCombineEx(output, 4, p1, p2, 0); + ok(hr == STRSAFE_E_INSUFFICIENT_BUFFER, "Expected STRSAFE_E_INSUFFICIENT_BUFFER, got %08x\n", hr); + ok(output[0] == 0x0, "Expected output buffer to contain NULL string\n"); + + memset(output, 0xff, sizeof(output)); + hr = pPathCchCombineEx(output, 5, p1, p2, 0); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(!lstrcmpW(output, expected), + "Combination of %s + %s returned %s, expected %s\n", + wine_dbgstr_w(p1), wine_dbgstr_w(p2), wine_dbgstr_w(output), wine_dbgstr_w(expected)); + + for (i = 0; i < sizeof(combine_test)/sizeof(combine_test[0]); i++) + { + MultiByteToWideChar(CP_ACP, 0, combine_test[i].path1, -1, p1, MAX_PATH); + MultiByteToWideChar(CP_ACP, 0, combine_test[i].path2, -1, p2, MAX_PATH); + MultiByteToWideChar(CP_ACP, 0, combine_test[i].result, -1, expected, MAX_PATH); + + hr = pPathCchCombineEx(output, MAX_PATH, p1, p2, 0); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(!lstrcmpW(output, expected), "Combining %s with %s returned %s, expected %s\n", + wine_dbgstr_w(p1), wine_dbgstr_w(p2), wine_dbgstr_w(output), wine_dbgstr_w(expected)); + } +} + +START_TEST(path) +{ + HMODULE hmod = LoadLibraryA("kernelbase.dll"); + + pPathCchCombineEx = (void *)GetProcAddress(hmod, "PathCchCombineEx"); + + test_PathCchCombineEx(); +}