From 301b7839229a61cdcfc742e73153f0d99b17210e Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 26 Apr 2026 15:10:53 +0300 Subject: [PATCH] [ACTIVEDS_WINETEST] Import from wine-10.0 --- dll/win32/activeds/CMakeLists.txt | 2 +- modules/rostests/winetests/CMakeLists.txt | 1 + .../winetests/activeds/CMakeLists.txt | 16 ++ .../rostests/winetests/activeds/activeds.c | 172 ++++++++++++++++++ 4 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 modules/rostests/winetests/activeds/CMakeLists.txt create mode 100644 modules/rostests/winetests/activeds/activeds.c diff --git a/dll/win32/activeds/CMakeLists.txt b/dll/win32/activeds/CMakeLists.txt index 137f5212875..566a3b271c6 100644 --- a/dll/win32/activeds/CMakeLists.txt +++ b/dll/win32/activeds/CMakeLists.txt @@ -1,5 +1,5 @@ -spec2def(activeds.dll activeds.spec) +spec2def(activeds.dll activeds.spec ADD_IMPORTLIB) list(APPEND SOURCE activeds_main.c diff --git a/modules/rostests/winetests/CMakeLists.txt b/modules/rostests/winetests/CMakeLists.txt index aa2e23692cc..4f4aa905fa7 100644 --- a/modules/rostests/winetests/CMakeLists.txt +++ b/modules/rostests/winetests/CMakeLists.txt @@ -13,6 +13,7 @@ if(MSVC) endif() endif() +add_subdirectory(activeds) add_subdirectory(advapi32) add_subdirectory(advpack) add_subdirectory(amstream) diff --git a/modules/rostests/winetests/activeds/CMakeLists.txt b/modules/rostests/winetests/activeds/CMakeLists.txt new file mode 100644 index 00000000000..e3b02d70042 --- /dev/null +++ b/modules/rostests/winetests/activeds/CMakeLists.txt @@ -0,0 +1,16 @@ + +list(APPEND SOURCE + activeds.c +) + +add_executable(activeds_winetest ${SOURCE}) + +target_compile_definitions(activeds_winetest PRIVATE STANDALONE USE_WINE_TODOS) + +#if(CMAKE_C_COMPILER_ID STREQUAL "GNU") +# target_compile_options(activeds_winetest PRIVATE -Wno-format-overflow) +#endif() + +set_module_type(activeds_winetest win32cui) +add_importlibs(activeds_winetest activeds ole32 oleaut32 msvcrt kernel32) +add_rostests_file(TARGET activeds_winetest) diff --git a/modules/rostests/winetests/activeds/activeds.c b/modules/rostests/winetests/activeds/activeds.c new file mode 100644 index 00000000000..bc6a6bfc568 --- /dev/null +++ b/modules/rostests/winetests/activeds/activeds.c @@ -0,0 +1,172 @@ +/* + * Copyright 2020 Dmitry Timoshkov + * + * 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 + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "objbase.h" +#include "initguid.h" +#include "iads.h" +#include "adshlp.h" +#include "adserr.h" + +#include "wine/test.h" + +DEFINE_GUID(CLSID_Pathname,0x080d0d78,0xf421,0x11d0,0xa3,0x6e,0x00,0xc0,0x4f,0xb9,0x50,0xdc); + +static void test_ADsBuildVarArrayStr(void) +{ + const WCHAR *props[] = { L"prop1", L"prop2" }; + HRESULT hr; + VARIANT var, item, *data; + LONG start, end, idx; + + hr = ADsBuildVarArrayStr(NULL, 0, NULL); + ok(hr == E_ADS_BAD_PARAMETER || hr == E_FAIL /* XP */, "got %#lx\n", hr); + + hr = ADsBuildVarArrayStr(NULL, 0, &var); + ok(hr == S_OK, "got %#lx\n", hr); + ok(V_VT(&var) == (VT_ARRAY | VT_VARIANT), "got %d\n", V_VT(&var)); + start = 0xdeadbeef; + hr = SafeArrayGetLBound(V_ARRAY(&var), 1, &start); + ok(hr == S_OK, "got %#lx\n", hr); + ok(start == 0, "got %ld\n", start); + end = 0xdeadbeef; + hr = SafeArrayGetUBound(V_ARRAY(&var), 1, &end); + ok(hr == S_OK, "got %#lx\n", hr); + ok(end == -1, "got %ld\n", end); + VariantClear(&var); + + hr = ADsBuildVarArrayStr((LPWSTR *)props, ARRAY_SIZE(props), &var); + ok(hr == S_OK, "got %#lx\n", hr); + ok(V_VT(&var) == (VT_ARRAY | VT_VARIANT), "got %d\n", V_VT(&var)); + start = 0xdeadbeef; + hr = SafeArrayGetLBound(V_ARRAY(&var), 1, &start); + ok(hr == S_OK, "got %#lx\n", hr); + ok(start == 0, "got %ld\n", start); + end = 0xdeadbeef; + hr = SafeArrayGetUBound(V_ARRAY(&var), 1, &end); + ok(hr == S_OK, "got %#lx\n", hr); + ok(end == 1, "got %ld\n", end); + idx = 0; + hr = SafeArrayGetElement(V_ARRAY(&var), &idx, &item); + ok(hr == S_OK, "got %#lx\n", hr); + ok(V_VT(&item) == VT_BSTR, "got %d\n", V_VT(&item)); + ok(!lstrcmpW(V_BSTR(&item), L"prop1"), "got %s\n", wine_dbgstr_w(V_BSTR(&item))); + VariantClear(&item); + hr = SafeArrayAccessData(V_ARRAY(&var), (void *)&data); + ok(hr == S_OK, "got %#lx\n", hr); + ok(V_VT(&data[0]) == VT_BSTR, "got %d\n", V_VT(&data[0])); + ok(!lstrcmpW(V_BSTR(&data[0]), L"prop1"), "got %s\n", wine_dbgstr_w(V_BSTR(&data[0]))); + ok(V_VT(&data[0]) == VT_BSTR, "got %d\n", V_VT(&data[0])); + ok(!lstrcmpW(V_BSTR(&data[1]), L"prop2"), "got %s\n", wine_dbgstr_w(V_BSTR(&data[1]))); + hr = SafeArrayUnaccessData(V_ARRAY(&var)); + ok(hr == S_OK, "got %#lx\n", hr); + VariantClear(&var); +} + +static void test_Pathname(void) +{ + static const WCHAR * const elem[3] = { L"a=b",L"c=d",L"e=f" }; + HRESULT hr; + IADsPathname *path; + BSTR bstr; + LONG count, i; + + hr = CoCreateInstance(&CLSID_Pathname, 0, CLSCTX_INPROC_SERVER, &IID_IADsPathname, (void **)&path); + ok(hr == S_OK, "got %#lx\n", hr); + + count = 0xdeadbeef; + hr = IADsPathname_GetNumElements(path, &count); + ok(hr == S_OK, "got %#lx\n", hr); + ok(count == 0, "got %ld\n", count); + + bstr = NULL; + hr = IADsPathname_Retrieve(path, ADS_FORMAT_X500, &bstr); + ok(hr == S_OK, "got %#lx\n", hr); + ok(bstr && !wcscmp(bstr, L"LDAP://"), "got %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + bstr = SysAllocString(L"LDAP://sample"); + hr = IADsPathname_Set(path, bstr, ADS_SETTYPE_FULL); + ok(hr == S_OK, "got %#lx\n", hr); + SysFreeString(bstr); + + count = 0xdeadbeef; + hr = IADsPathname_GetNumElements(path, &count); + ok(hr == S_OK, "got %#lx\n", hr); + ok(count == 0, "got %ld\n", count); + + hr = IADsPathname_GetElement(path, 0, &bstr); + ok(hr == HRESULT_FROM_WIN32(ERROR_INVALID_INDEX), "got %#lx\n", hr); + SysFreeString(bstr); + + bstr = SysAllocString(L"LDAP://sample:123/a=b,c=d,e=f"); + hr = IADsPathname_Set(path, bstr, ADS_SETTYPE_FULL); + ok(hr == S_OK, "got %#lx\n", hr); + SysFreeString(bstr); + + count = 0xdeadbeef; + hr = IADsPathname_GetNumElements(path, &count); + ok(hr == S_OK, "got %#lx\n", hr); + ok(count == 3, "got %ld\n", count); + + for (i = 0; i < count; i++) + { + hr = IADsPathname_GetElement(path, i, &bstr); + ok(hr == S_OK, "got %#lx\n", hr); + ok(!wcscmp(bstr, elem[i]), "%lu: %s\n", i, wine_dbgstr_w(bstr)); + SysFreeString(bstr); + } + + hr = IADsPathname_Retrieve(path, ADS_FORMAT_X500, &bstr); + ok(hr == S_OK, "got %#lx\n", hr); + ok(!wcscmp(bstr, L"LDAP://sample:123/a=b,c=d,e=f"), "got %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + hr = IADsPathname_Retrieve(path, ADS_FORMAT_PROVIDER, &bstr); + ok(hr == S_OK, "got %#lx\n", hr); + ok(!wcscmp(bstr, L"LDAP"), "got %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + hr = IADsPathname_Retrieve(path, ADS_FORMAT_SERVER, &bstr); + ok(hr == S_OK, "got %#lx\n", hr); + ok(!wcscmp(bstr, L"sample:123"), "got %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + hr = IADsPathname_Retrieve(path, ADS_FORMAT_LEAF, &bstr); + ok(hr == S_OK, "got %#lx\n", hr); + ok(!wcscmp(bstr, L"a=b"), "got %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + + IADsPathname_Release(path); +} + +START_TEST(activeds) +{ + CoInitialize(NULL); + + test_Pathname(); + test_ADsBuildVarArrayStr(); + + CoUninitialize(); +}