makefiles: Explicitly create destination dirs when installing symlinks.
[wine/zf.git] / dlls / wbemdisp / tests / wbemdisp.c
blob2bca6f9da67753f5fcffaefff1866a6d309b3364
1 /*
2 * Copyright 2015 Hans Leidekker for CodeWeavers
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.
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.
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
19 #define COBJMACROS
21 #include <stdio.h>
22 #include "windows.h"
23 #include "initguid.h"
24 #include "objidl.h"
25 #include "wbemdisp.h"
26 #include "wbemcli.h"
27 #include "wine/test.h"
29 DEFINE_GUID(CLSID_WINMGMTS,0x172bddf8,0xceea,0x11d1,0x8b,0x05,0x00,0x60,0x08,0x06,0xd9,0xb6);
30 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
31 DEFINE_OLEGUID(CLSID_PointerMoniker,0x306,0,0);
33 static const LCID english = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
35 static void test_ParseDisplayName(void)
37 static const WCHAR biosW[] = {'W','i','n','3','2','_','B','i','o','s',0};
38 static const WCHAR manufacturerW[] = {'M','a','n','u','f','a','c','t','u','r','e','r',0};
39 static const WCHAR versionW[] = {'v','e','r','s','i','o','n',0};
40 static const WCHAR nosuchW[] = {'N','o','S','u','c','h',0};
41 static const WCHAR name1[] =
42 {'w','i','n','m','g','m','t','s',':',0};
43 static const WCHAR name2[] =
44 {'w','i','n','m','g','m','t','s',':','\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',0};
45 static const WCHAR name3[] =
46 {'w','i','n','m','g','m','t','s',':','\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',':',
47 'W','i','n','3','2','_','L','o','g','i','c','a','l','D','i','s','k','.',
48 'D','e','v','i','c','e','I','D','=','\'','C',':','\'',0};
49 static const WCHAR name4[] =
50 {'w','i','n','m','g','m','t','s',':','\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',':',
51 'W','i','n','3','2','_','S','e','r','v','i','c','e',0};
52 static const WCHAR stdregprovW[] =
53 {'w','i','n','m','g','m','t','s',':','\\','\\','.','\\','r','o','o','t','\\','d','e','f','a','u','l','t',':',
54 'S','t','d','R','e','g','P','r','o','v',0};
55 static const WCHAR getstringvalueW[] =
56 {'G','e','t','S','t','r','i','n','g','V','a','l','u','e',0};
57 static const struct
59 const WCHAR *name;
60 HRESULT hr;
61 REFIID iid;
62 ULONG eaten;
63 } tests[] =
65 { name1, S_OK, &IID_ISWbemServices, ARRAY_SIZE( name1 ) - 1 },
66 { name2, S_OK, &IID_ISWbemServices, ARRAY_SIZE( name2 ) - 1 },
67 { name3, S_OK, &IID_ISWbemObject, ARRAY_SIZE( name3 ) - 1 },
68 { name4, S_OK, &IID_ISWbemObject, ARRAY_SIZE( name4 ) - 1 }
70 IParseDisplayName *displayname;
71 IBindCtx *ctx;
72 IMoniker *moniker;
73 IUnknown *obj;
74 BSTR str;
75 ULONG i, eaten, count;
76 HRESULT hr;
77 CLSID clsid;
79 hr = CoCreateInstance( &CLSID_WINMGMTS, NULL, CLSCTX_INPROC_SERVER, &IID_IParseDisplayName, (void **)&displayname );
80 if (hr != S_OK)
82 win_skip( "can't create instance of WINMGMTS\n" );
83 return;
86 hr = CreateBindCtx( 0, &ctx );
87 ok( hr == S_OK, "got %x\n", hr );
89 for (i =0; i < ARRAY_SIZE( tests ); i++)
91 str = SysAllocString( tests[i].name );
92 eaten = 0xdeadbeef;
93 moniker = NULL;
94 hr = IParseDisplayName_ParseDisplayName( displayname, NULL, str, &eaten, &moniker );
95 SysFreeString( str );
96 ok( hr == tests[i].hr, "%u: got %x\n", i, hr );
97 ok( eaten == tests[i].eaten, "%u: got %u\n", i, eaten );
98 if (moniker)
100 hr = IMoniker_GetClassID( moniker, &clsid );
101 ok( hr == S_OK, "%u: got %x\n", i, hr );
102 ok( IsEqualCLSID( &clsid, &CLSID_PointerMoniker ), "%u: got %s\n", i, wine_dbgstr_guid( &clsid ) );
104 obj = NULL;
105 hr = IMoniker_BindToObject( moniker, ctx, NULL, tests[i].iid, (void **)&obj );
106 ok( hr == S_OK, "%u: got %x\n", i, hr );
107 if (obj) IUnknown_Release( obj );
108 IMoniker_Release( moniker );
112 str = SysAllocString( name1 );
113 eaten = 0xdeadbeef;
114 moniker = NULL;
115 hr = IParseDisplayName_ParseDisplayName( displayname, NULL, str, &eaten, &moniker );
116 SysFreeString( str );
117 ok( hr == S_OK, "got %x\n", hr );
118 ok( eaten == lstrlenW(name1), "got %u\n", eaten );
119 if (moniker)
121 ISWbemServices *services = NULL;
123 hr = IMoniker_GetClassID( moniker, &clsid );
124 ok( hr == S_OK, "%u: got %x\n", i, hr );
125 ok( IsEqualCLSID( &clsid, &CLSID_PointerMoniker ), "got %s\n", wine_dbgstr_guid( &clsid ) );
127 hr = IMoniker_BindToObject( moniker, ctx, NULL, &IID_IUnknown, (void **)&services );
128 ok( hr == S_OK, "got %x\n", hr );
129 if (services)
131 ISWbemObjectSet *objectset = NULL;
133 str = SysAllocString( biosW );
134 hr = ISWbemServices_InstancesOf( services, str, 0, NULL, &objectset );
135 SysFreeString( str );
136 ok( hr == S_OK, "got %x\n", hr );
137 if (objectset)
139 hr = ISWbemObjectSet_get__NewEnum( objectset, &obj );
140 ok( hr == S_OK, "got %x\n", hr );
141 if (obj)
143 IEnumVARIANT *enumvar = NULL;
145 hr = IUnknown_QueryInterface( obj, &IID_IEnumVARIANT, (void **)&enumvar );
146 ok( hr == S_OK, "got %x\n", hr );
148 if (enumvar)
150 VARIANT var, res;
151 ULONG fetched;
152 IDispatch *dispatch = NULL;
153 DISPID dispid;
154 DISPPARAMS params;
155 UINT arg_err;
157 fetched = 0xdeadbeef;
158 hr = IEnumVARIANT_Next( enumvar, 0, &var, &fetched );
159 ok( hr == S_OK, "got %x\n", hr );
160 ok( !fetched, "got %u\n", fetched );
162 fetched = 0xdeadbeef;
163 V_VT( &var ) = VT_ERROR;
164 V_ERROR( &var ) = 0xdeadbeef;
165 hr = IEnumVARIANT_Next( enumvar, 1, &var, &fetched );
166 ok( hr == S_OK, "got %x\n", hr );
167 ok( fetched == 1, "got %u\n", fetched );
168 ok( V_VT( &var ) == VT_DISPATCH, "got %u\n", V_VT( &var ) );
169 ok( V_DISPATCH( &var ) != (IDispatch *)0xdeadbeef, "got %u\n", V_VT( &var ) );
171 dispatch = V_DISPATCH( &var );
172 count = 0;
173 hr = IDispatch_GetTypeInfoCount( dispatch, &count );
174 ok( hr == S_OK, "got %x\n", hr );
175 ok( count == 1, "got %u\n", count );
177 str = SysAllocString( manufacturerW );
178 dispid = 0xdeadbeef;
179 hr = IDispatch_GetIDsOfNames( dispatch, &IID_NULL, &str, 1, english, &dispid );
180 SysFreeString( str );
181 ok( hr == S_OK, "got %x\n", hr );
182 ok( dispid == 0x1800001 || dispid == 0x10b /* win2k */, "got %x\n", dispid );
184 str = SysAllocString( versionW );
185 dispid = 0xdeadbeef;
186 hr = IDispatch_GetIDsOfNames( dispatch, &IID_NULL, &str, 1, english, &dispid );
187 SysFreeString( str );
188 ok( hr == S_OK, "got %x\n", hr );
189 ok( dispid == 0x1800002 || dispid == 0x119 /* win2k */, "got %x\n", dispid );
191 str = SysAllocString( nosuchW );
192 dispid = 0xdeadbeef;
193 hr = IDispatch_GetIDsOfNames( dispatch, &IID_NULL, &str, 1, english, &dispid );
194 SysFreeString( str );
195 ok( hr == DISP_E_UNKNOWNNAME, "got %x\n", hr );
196 ok( dispid == DISPID_UNKNOWN, "got %x\n", dispid );
198 str = SysAllocString( manufacturerW );
199 dispid = 0xdeadbeef;
200 hr = IDispatch_GetIDsOfNames( dispatch, &IID_NULL, &str, 1, english, &dispid );
201 SysFreeString( str );
202 ok( hr == S_OK, "got %x\n", hr );
203 ok( dispid == 0x1800001 || dispid == 0x10b /* win2k */, "got %x\n", dispid );
205 if (dispid == 0x1800001) /* crashes on win2k */
207 V_VT( &res ) = VT_ERROR;
208 V_BSTR( &res ) = (BSTR)0xdeadbeef;
209 params.rgvarg = (VARIANTARG *)0xdeadbeef;
210 params.rgdispidNamedArgs = (DISPID *)0xdeadbeef;
211 params.cArgs = params.cNamedArgs = 0xdeadbeef;
212 arg_err = 0xdeadbeef;
213 hr = IDispatch_Invoke( dispatch, DISPID_UNKNOWN, &IID_NULL, english,
214 DISPATCH_METHOD|DISPATCH_PROPERTYGET,
215 &params, &res, NULL, &arg_err );
216 ok( hr == DISP_E_MEMBERNOTFOUND || hr == S_OK /* winxp */, "got %x\n", hr );
217 ok( params.rgvarg == (VARIANTARG *)0xdeadbeef, "got %p\n", params.rgvarg );
218 ok( params.rgdispidNamedArgs == (DISPID *)0xdeadbeef, "got %p\n", params.rgdispidNamedArgs );
219 ok( params.cArgs == 0xdeadbeef, "got %u\n", params.cArgs );
220 ok( params.cNamedArgs == 0xdeadbeef, "got %u\n", params.cNamedArgs );
221 ok( V_VT( &res ) == VT_ERROR, "got %u\n", V_VT( &res ) );
222 ok( V_ERROR( &res ) == 0xdeadbeef, "got %u\n", V_VT( &res ) );
223 ok( arg_err == 0xdeadbeef, "got %u\n", arg_err );
224 if (hr == S_OK) VariantClear( &res );
227 V_VT( &res ) = VT_ERROR;
228 V_BSTR( &res ) = (BSTR)0xdeadbeef;
229 memset( &params, 0, sizeof(params) );
230 hr = IDispatch_Invoke( dispatch, dispid, &IID_NULL, english,
231 DISPATCH_METHOD|DISPATCH_PROPERTYGET,
232 &params, &res, NULL, NULL );
233 ok( hr == S_OK, "got %x\n", hr );
234 ok( params.rgvarg == NULL, "got %p\n", params.rgvarg );
235 ok( params.rgdispidNamedArgs == NULL, "got %p\n", params.rgdispidNamedArgs );
236 ok( !params.cArgs, "got %u\n", params.cArgs );
237 ok( !params.cNamedArgs, "got %u\n", params.cNamedArgs );
238 ok( V_VT( &res ) == VT_BSTR, "got %u\n", V_VT( &res ) );
239 ok( V_BSTR( &res ) != (BSTR)0xdeadbeef, "got %u\n", V_VT( &res ) );
240 VariantClear( &res );
241 VariantClear( &var );
243 fetched = 0xdeadbeef;
244 hr = IEnumVARIANT_Next( enumvar, 1, &var, &fetched );
245 ok( hr == S_FALSE, "got %x\n", hr );
246 ok( !fetched, "got %u\n", fetched );
248 IEnumVARIANT_Release( enumvar );
250 IUnknown_Release( obj );
252 ISWbemObjectSet_Release( objectset );
254 IUnknown_Release( services );
256 IMoniker_Release( moniker );
259 IBindCtx_Release( ctx );
261 hr = CreateBindCtx( 0, &ctx );
262 ok( hr == S_OK, "got %x\n", hr );
264 str = SysAllocString( stdregprovW );
265 hr = IParseDisplayName_ParseDisplayName( displayname, NULL, str, &eaten, &moniker );
266 ok( hr == S_OK, "got %x\n", hr );
267 SysFreeString( str );
269 if (moniker)
271 ISWbemObject *sobj = NULL;
273 hr = IMoniker_GetClassID( moniker, &clsid );
274 ok( hr == S_OK, "%u: got %x\n", i, hr );
275 ok( IsEqualCLSID( &clsid, &CLSID_PointerMoniker ), "got %s\n", wine_dbgstr_guid( &clsid ) );
277 hr = IMoniker_BindToObject( moniker, ctx, NULL, &IID_ISWbemObject, (void **)&sobj );
278 ok( hr == S_OK, "got %x\n",hr );
279 if (sobj)
281 DISPID dispid = 0xdeadbeef;
283 str = SysAllocString( getstringvalueW );
284 hr = ISWbemObject_GetIDsOfNames( sobj, &IID_NULL, &str, 1, english, &dispid );
285 ok( hr == S_OK, "got %x\n", hr );
286 ok( dispid == 0x1000001, "got %x\n", dispid );
288 ISWbemObject_Release( sobj );
289 SysFreeString( str );
291 IMoniker_Release( moniker );
294 IBindCtx_Release(ctx);
295 IParseDisplayName_Release( displayname );
298 static const WCHAR localhost[] = {'l','o','c','a','l','h','o','s','t',0};
299 static const WCHAR root[] = {'r','o','o','t','\\','C','I','M','V','2',0};
300 static const WCHAR query[] = {'S','e','l','e','c','t',' ','P','r','o','c','e','s','s','o','r','I','d',' ','f','r','o','m',
301 ' ','W','i','n','3','2','_','P','r','o','c','e','s','s','o','r',0};
302 static const WCHAR lang[] = {'W','Q','L',0};
303 static const WCHAR props[] = {'P','r','o','p','e','r','t','i','e','s','_',0};
304 static const WCHAR procid[] = {'P','r','o','c','e','s','s','o','r','I','d',0};
306 static void test_locator(void)
308 HRESULT hr;
309 DISPID id;
310 BSTR host_bstr, root_bstr, query_bstr, lang_bstr, props_bstr, procid_bstr;
311 ISWbemLocator *locator;
312 ISWbemServices *services;
313 ISWbemObjectSet *object_set;
314 IEnumVARIANT *enum_var;
315 ISWbemObject *object;
316 ISWbemPropertySet *prop_set;
317 ISWbemProperty *prop;
318 ISWbemSecurity *security;
319 VARIANT var;
320 LONG count;
321 WbemImpersonationLevelEnum imp_level;
322 WbemAuthenticationLevelEnum auth_level;
324 hr = CoCreateInstance( &CLSID_SWbemLocator, NULL, CLSCTX_INPROC_SERVER, &IID_ISWbemLocator, (void **)&locator );
325 ok( hr == S_OK, "got %x\n", hr );
327 host_bstr = SysAllocString(localhost);
328 root_bstr = SysAllocString(root);
329 hr = ISWbemLocator_ConnectServer( locator, host_bstr, root_bstr, NULL, NULL, NULL, NULL, 0, NULL, &services);
330 ok( hr == S_OK, "got %x\n", hr );
331 SysFreeString( root_bstr );
332 SysFreeString( host_bstr );
334 query_bstr = SysAllocString(query);
335 lang_bstr = SysAllocString(lang);
336 hr = ISWbemServices_ExecQuery( services, query_bstr, lang_bstr, wbemFlagForwardOnly, NULL, &object_set);
337 ok( hr == S_OK, "got %x\n", hr );
338 SysFreeString( lang_bstr );
339 SysFreeString( query_bstr );
341 hr = ISWbemLocator_get_Security_( locator, &security );
342 ok( hr == S_OK, "got %x\n", hr );
343 imp_level = 0xdeadbeef;
344 hr = ISWbemSecurity_get_ImpersonationLevel( security, &imp_level );
345 ok( hr == S_OK, "got %x\n", hr );
346 ok( imp_level == wbemImpersonationLevelImpersonate, "got %u\n", imp_level );
347 hr = ISWbemSecurity_put_ImpersonationLevel( security, wbemImpersonationLevelAnonymous );
348 ok( hr == S_OK, "got %x\n", hr );
349 imp_level = 0xdeadbeef;
350 hr = ISWbemSecurity_get_ImpersonationLevel( security, &imp_level );
351 ok( hr == S_OK, "got %x\n", hr );
352 ok( imp_level == wbemImpersonationLevelAnonymous, "got %u\n", imp_level );
354 auth_level = 0xdeadbeef;
355 hr = ISWbemSecurity_get_AuthenticationLevel( security, &auth_level );
356 todo_wine {
357 ok( hr == WBEM_E_FAILED, "got %x\n", hr );
358 ok( auth_level == 0xdeadbeef, "got %u\n", auth_level );
360 hr = ISWbemSecurity_put_AuthenticationLevel( security, wbemAuthenticationLevelNone );
361 ok( hr == S_OK, "got %x\n", hr );
362 auth_level = 0xdeadbeef;
363 hr = ISWbemSecurity_get_AuthenticationLevel( security, &auth_level );
364 ok( hr == S_OK, "got %x\n", hr );
365 ok( auth_level == wbemAuthenticationLevelNone, "got %u\n", auth_level );
366 ISWbemSecurity_Release( security );
367 security = NULL;
369 hr = ISWbemObjectSet_get__NewEnum( object_set, (IUnknown**)&enum_var );
370 ok( hr == S_OK, "got %x\n", hr );
372 VariantInit( &var );
373 hr = IEnumVARIANT_Next( enum_var, 1, &var, NULL );
374 ok( hr == S_OK, "got %x\n", hr );
375 ok( V_VT(&var) == VT_DISPATCH, "got %x\n", V_VT(&var));
377 props_bstr = SysAllocString( props );
378 hr = IDispatch_GetIDsOfNames( V_DISPATCH(&var), &IID_NULL, &props_bstr, 1, english, &id );
379 ok( hr == S_OK, "got %x\n", hr );
380 ok( id == 21, "got %d\n", id );
382 hr = IDispatch_QueryInterface( V_DISPATCH(&var), &IID_ISWbemObject, (void**)&object );
383 ok( hr == S_OK, "got %x\n", hr );
384 VariantClear( &var );
386 hr = ISWbemObject_get_Properties_( object, &prop_set );
387 ok( hr == S_OK, "got %x\n", hr );
389 hr = ISWbemPropertySet_Item( prop_set, props_bstr, 0, &prop );
390 ok( hr == WBEM_E_NOT_FOUND, "got %x\n", hr );
391 SysFreeString( props_bstr );
393 procid_bstr = SysAllocString( procid );
394 hr = ISWbemPropertySet_Item( prop_set, procid_bstr, 0, &prop );
395 ok( hr == S_OK, "got %x\n", hr );
396 SysFreeString( procid_bstr );
398 count = 0;
399 hr = ISWbemPropertySet_get_Count( prop_set, &count );
400 ok( hr == S_OK, "got %x\n", hr );
401 ok( count > 0, "got %d\n", count );
403 hr = ISWbemProperty_get_Value( prop, &var );
404 ok( hr == S_OK, "got %x\n", hr );
405 ok( V_VT(&var) == VT_BSTR, "got %x\n", V_VT(&var) );
406 VariantClear( &var );
408 hr = ISWbemServices_get_Security_( services, &security );
409 ok( hr == S_OK, "got %x\n", hr );
410 imp_level = 0xdeadbeef;
411 hr = ISWbemSecurity_get_ImpersonationLevel( security, &imp_level );
412 ok( hr == S_OK, "got %x\n", hr );
413 ok( imp_level == wbemImpersonationLevelImpersonate, "got %u\n", imp_level );
414 auth_level = 0xdeadbeef;
415 hr = ISWbemSecurity_get_AuthenticationLevel( security, &auth_level );
416 ok( hr == S_OK, "got %x\n", hr );
417 ok( auth_level == wbemAuthenticationLevelPktPrivacy, "got %u\n", auth_level );
419 ISWbemSecurity_Release(security);
420 ISWbemProperty_Release( prop );
421 ISWbemPropertySet_Release( prop_set );
422 ISWbemObject_Release( object );
423 IEnumVARIANT_Release( enum_var );
424 ISWbemObjectSet_Release( object_set );
425 ISWbemServices_Release( services );
426 ISWbemLocator_Release( locator );
429 START_TEST(wbemdisp)
431 CoInitialize( NULL );
433 test_ParseDisplayName();
434 test_locator();
436 CoUninitialize();