Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/dlls/activeds/tests/activeds.c
4391 views
1
/*
2
* Copyright 2020 Dmitry Timoshkov
3
*
4
* This library is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU Lesser General Public
6
* License as published by the Free Software Foundation; either
7
* version 2.1 of the License, or (at your option) any later version.
8
*
9
* This library is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* Lesser General Public License for more details.
13
*
14
* You should have received a copy of the GNU Lesser General Public
15
* License along with this library; if not, write to the Free Software
16
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17
*/
18
19
#include <stdarg.h>
20
#include <stdio.h>
21
22
#define COBJMACROS
23
24
#include "windef.h"
25
#include "winbase.h"
26
#include "objbase.h"
27
#include "initguid.h"
28
#include "iads.h"
29
#include "adshlp.h"
30
#include "adserr.h"
31
32
#include "wine/test.h"
33
34
DEFINE_GUID(CLSID_Pathname,0x080d0d78,0xf421,0x11d0,0xa3,0x6e,0x00,0xc0,0x4f,0xb9,0x50,0xdc);
35
36
static void test_ADsBuildVarArrayStr(void)
37
{
38
const WCHAR *props[] = { L"prop1", L"prop2" };
39
HRESULT hr;
40
VARIANT var, item, *data;
41
LONG start, end, idx;
42
43
hr = ADsBuildVarArrayStr(NULL, 0, NULL);
44
ok(hr == E_ADS_BAD_PARAMETER || hr == E_FAIL /* XP */, "got %#lx\n", hr);
45
46
hr = ADsBuildVarArrayStr(NULL, 0, &var);
47
ok(hr == S_OK, "got %#lx\n", hr);
48
ok(V_VT(&var) == (VT_ARRAY | VT_VARIANT), "got %d\n", V_VT(&var));
49
start = 0xdeadbeef;
50
hr = SafeArrayGetLBound(V_ARRAY(&var), 1, &start);
51
ok(hr == S_OK, "got %#lx\n", hr);
52
ok(start == 0, "got %ld\n", start);
53
end = 0xdeadbeef;
54
hr = SafeArrayGetUBound(V_ARRAY(&var), 1, &end);
55
ok(hr == S_OK, "got %#lx\n", hr);
56
ok(end == -1, "got %ld\n", end);
57
VariantClear(&var);
58
59
hr = ADsBuildVarArrayStr((LPWSTR *)props, ARRAY_SIZE(props), &var);
60
ok(hr == S_OK, "got %#lx\n", hr);
61
ok(V_VT(&var) == (VT_ARRAY | VT_VARIANT), "got %d\n", V_VT(&var));
62
start = 0xdeadbeef;
63
hr = SafeArrayGetLBound(V_ARRAY(&var), 1, &start);
64
ok(hr == S_OK, "got %#lx\n", hr);
65
ok(start == 0, "got %ld\n", start);
66
end = 0xdeadbeef;
67
hr = SafeArrayGetUBound(V_ARRAY(&var), 1, &end);
68
ok(hr == S_OK, "got %#lx\n", hr);
69
ok(end == 1, "got %ld\n", end);
70
idx = 0;
71
hr = SafeArrayGetElement(V_ARRAY(&var), &idx, &item);
72
ok(hr == S_OK, "got %#lx\n", hr);
73
ok(V_VT(&item) == VT_BSTR, "got %d\n", V_VT(&item));
74
ok(!lstrcmpW(V_BSTR(&item), L"prop1"), "got %s\n", wine_dbgstr_w(V_BSTR(&item)));
75
VariantClear(&item);
76
hr = SafeArrayAccessData(V_ARRAY(&var), (void *)&data);
77
ok(hr == S_OK, "got %#lx\n", hr);
78
ok(V_VT(&data[0]) == VT_BSTR, "got %d\n", V_VT(&data[0]));
79
ok(!lstrcmpW(V_BSTR(&data[0]), L"prop1"), "got %s\n", wine_dbgstr_w(V_BSTR(&data[0])));
80
ok(V_VT(&data[0]) == VT_BSTR, "got %d\n", V_VT(&data[0]));
81
ok(!lstrcmpW(V_BSTR(&data[1]), L"prop2"), "got %s\n", wine_dbgstr_w(V_BSTR(&data[1])));
82
hr = SafeArrayUnaccessData(V_ARRAY(&var));
83
ok(hr == S_OK, "got %#lx\n", hr);
84
VariantClear(&var);
85
}
86
87
static void test_ADsBuildVarArrayInt(void)
88
{
89
const DWORD props[] = { 1, 2, 3, 4 };
90
HRESULT hr;
91
VARIANT var, item;
92
LONG start, end, idx;
93
94
hr = ADsBuildVarArrayInt(NULL, 0, NULL);
95
ok(hr == E_ADS_BAD_PARAMETER || hr == E_FAIL /* XP */, "got %#lx\n", hr);
96
97
hr = ADsBuildVarArrayInt(NULL, 0, &var);
98
ok(hr == S_OK, "got %#lx\n", hr);
99
ok(V_VT(&var) == (VT_ARRAY | VT_VARIANT), "got %d\n", V_VT(&var));
100
start = 0xdeadbeef;
101
hr = SafeArrayGetLBound(V_ARRAY(&var), 1, &start);
102
ok(hr == S_OK, "got %#lx\n", hr);
103
ok(start == 0, "got %ld\n", start);
104
end = 0xdeadbeef;
105
hr = SafeArrayGetUBound(V_ARRAY(&var), 1, &end);
106
ok(hr == S_OK, "got %#lx\n", hr);
107
ok(end == -1, "got %ld\n", end);
108
VariantClear(&var);
109
110
hr = ADsBuildVarArrayInt((LPDWORD)props, ARRAY_SIZE(props), &var);
111
ok(hr == S_OK, "got %#lx\n", hr);
112
ok(V_VT(&var) == (VT_ARRAY | VT_VARIANT), "got %d\n", V_VT(&var));
113
start = 0xdeadbeef;
114
hr = SafeArrayGetLBound(V_ARRAY(&var), 1, &start);
115
ok(hr == S_OK, "got %#lx\n", hr);
116
ok(start == 0, "got %ld\n", start);
117
end = 0xdeadbeef;
118
hr = SafeArrayGetUBound(V_ARRAY(&var), 1, &end);
119
ok(hr == S_OK, "got %#lx\n", hr);
120
ok(end == 3, "got %ld\n", end);
121
122
for (idx = 0; idx < ARRAY_SIZE(props); idx++)
123
{
124
hr = SafeArrayGetElement(V_ARRAY(&var), &idx, &item);
125
ok(hr == S_OK, "got %#lx\n", hr);
126
ok(V_VT(&item) == VT_I4, "got %d\n", V_VT(&item));
127
ok(V_UI4(&item) == props[idx], "got %lu\n", V_UI4(&item));
128
VariantClear(&item);
129
}
130
131
VariantClear(&var);
132
}
133
134
static void test_Pathname(void)
135
{
136
static const WCHAR * const elem[3] = { L"a=b",L"c=d",L"e=f" };
137
HRESULT hr;
138
IADsPathname *path;
139
BSTR bstr;
140
LONG count, i;
141
142
hr = CoCreateInstance(&CLSID_Pathname, 0, CLSCTX_INPROC_SERVER, &IID_IADsPathname, (void **)&path);
143
ok(hr == S_OK, "got %#lx\n", hr);
144
145
count = 0xdeadbeef;
146
hr = IADsPathname_GetNumElements(path, &count);
147
ok(hr == S_OK, "got %#lx\n", hr);
148
ok(count == 0, "got %ld\n", count);
149
150
bstr = NULL;
151
hr = IADsPathname_Retrieve(path, ADS_FORMAT_X500, &bstr);
152
ok(hr == S_OK, "got %#lx\n", hr);
153
ok(bstr && !wcscmp(bstr, L"LDAP://"), "got %s\n", wine_dbgstr_w(bstr));
154
SysFreeString(bstr);
155
156
bstr = SysAllocString(L"LDAP://sample");
157
hr = IADsPathname_Set(path, bstr, ADS_SETTYPE_FULL);
158
ok(hr == S_OK, "got %#lx\n", hr);
159
SysFreeString(bstr);
160
161
count = 0xdeadbeef;
162
hr = IADsPathname_GetNumElements(path, &count);
163
ok(hr == S_OK, "got %#lx\n", hr);
164
ok(count == 0, "got %ld\n", count);
165
166
hr = IADsPathname_GetElement(path, 0, &bstr);
167
ok(hr == HRESULT_FROM_WIN32(ERROR_INVALID_INDEX), "got %#lx\n", hr);
168
SysFreeString(bstr);
169
170
bstr = SysAllocString(L"LDAP://sample:123/a=b,c=d,e=f");
171
hr = IADsPathname_Set(path, bstr, ADS_SETTYPE_FULL);
172
ok(hr == S_OK, "got %#lx\n", hr);
173
SysFreeString(bstr);
174
175
count = 0xdeadbeef;
176
hr = IADsPathname_GetNumElements(path, &count);
177
ok(hr == S_OK, "got %#lx\n", hr);
178
ok(count == 3, "got %ld\n", count);
179
180
for (i = 0; i < count; i++)
181
{
182
hr = IADsPathname_GetElement(path, i, &bstr);
183
ok(hr == S_OK, "got %#lx\n", hr);
184
ok(!wcscmp(bstr, elem[i]), "%lu: %s\n", i, wine_dbgstr_w(bstr));
185
SysFreeString(bstr);
186
}
187
188
hr = IADsPathname_Retrieve(path, ADS_FORMAT_X500, &bstr);
189
ok(hr == S_OK, "got %#lx\n", hr);
190
ok(!wcscmp(bstr, L"LDAP://sample:123/a=b,c=d,e=f"), "got %s\n", wine_dbgstr_w(bstr));
191
SysFreeString(bstr);
192
193
hr = IADsPathname_Retrieve(path, ADS_FORMAT_PROVIDER, &bstr);
194
ok(hr == S_OK, "got %#lx\n", hr);
195
ok(!wcscmp(bstr, L"LDAP"), "got %s\n", wine_dbgstr_w(bstr));
196
SysFreeString(bstr);
197
198
hr = IADsPathname_Retrieve(path, ADS_FORMAT_SERVER, &bstr);
199
ok(hr == S_OK, "got %#lx\n", hr);
200
ok(!wcscmp(bstr, L"sample:123"), "got %s\n", wine_dbgstr_w(bstr));
201
SysFreeString(bstr);
202
203
hr = IADsPathname_Retrieve(path, ADS_FORMAT_LEAF, &bstr);
204
ok(hr == S_OK, "got %#lx\n", hr);
205
ok(!wcscmp(bstr, L"a=b"), "got %s\n", wine_dbgstr_w(bstr));
206
SysFreeString(bstr);
207
208
IADsPathname_Release(path);
209
}
210
211
START_TEST(activeds)
212
{
213
CoInitialize(NULL);
214
215
test_Pathname();
216
test_ADsBuildVarArrayStr();
217
test_ADsBuildVarArrayInt();
218
219
CoUninitialize();
220
}
221
222