2 * Copyright 2012 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
26 #include "wine/test.h"
28 static const WCHAR path1[] = {0};
29 static const WCHAR path2[] = {'\\',0};
30 static const WCHAR path3[] = {'\\','\\','s','e','r','v','e','r',0};
31 static const WCHAR path4[] = {'\\','\\','s','e','r','v','e','r','\\',0};
32 static const WCHAR path5[] = {'\\','\\','.','\\',0};
33 static const WCHAR path6[] = {'/','/','.','/','r','o','o','t','/','c','i','m','v','2',0};
34 static const WCHAR path7[] =
35 {'/','/','.','/','r','o','o','t','/','c','i','m','v','2',':','W','i','n','3','2','_',
36 'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
37 static const WCHAR path8[] =
38 {'/','r','o','o','t','/','c','i','m','v','2',':','W','i','n','3','2','_',
39 'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
40 static const WCHAR path9[] =
41 {'\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',':','W','i','n','3','2','_',
42 'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
43 static const WCHAR path10[] =
44 {'/','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',':','W','i','n','3','2','_',
45 'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
46 static const WCHAR path11[] =
47 {'/','/','.','\\','r','o','o','t','\\','c','i','m','v','2',':','W','i','n','3','2','_',
48 'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
49 static const WCHAR path12[] =
50 {'r','o','o','t','\\','c','i','m','v','2',':','W','i','n','3','2','_',
51 'O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
52 static const WCHAR path13[] =
53 {'\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',0};
54 static const WCHAR path14[] =
55 {'W','i','n','3','2','_','O','p','e','r','a','t','i','n','g','S','y','s','t','e','m',0};
56 static const WCHAR path15[] =
57 {'r','o','o','t','\\','c','i','m','v','2',0};
58 static const WCHAR path16[] =
59 {'\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',0};
60 static const WCHAR path17[] =
61 {'\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',':','W','i','n','3','2','_',
62 'L','o','g','i','c','a','l','D','i','s','k','.','D','e','v','i','c','e','I','d','=','"','C',':','"',0};
64 static IWbemPath *create_path(void)
69 hr = CoCreateInstance( &CLSID_WbemDefPath, NULL, CLSCTX_INPROC_SERVER, &IID_IWbemPath, (void **)&path );
72 win_skip( "can't create WbemDefPath instance, skipping tests\n" );
78 static void test_IWbemPath_SetText(void)
88 { path1, 0, WBEM_E_INVALID_PARAMETER },
89 { path1, WBEMPATH_CREATE_ACCEPT_ALL, S_OK },
90 { path2, 0, WBEM_E_INVALID_PARAMETER },
91 { path2, WBEMPATH_CREATE_ACCEPT_ALL, S_OK },
92 { path3, 0, WBEM_E_INVALID_PARAMETER },
93 { path3, WBEMPATH_CREATE_ACCEPT_ALL, S_OK },
94 { path4, 0, WBEM_E_INVALID_PARAMETER },
95 { path4, WBEMPATH_CREATE_ACCEPT_ALL, S_OK },
96 { path5, 0, WBEM_E_INVALID_PARAMETER },
97 { path5, WBEMPATH_CREATE_ACCEPT_ALL, S_OK },
98 { path6, 0, WBEM_E_INVALID_PARAMETER },
99 { path6, WBEMPATH_CREATE_ACCEPT_ALL, S_OK },
100 { path7, 0, WBEM_E_INVALID_PARAMETER },
101 { path7, WBEMPATH_CREATE_ACCEPT_RELATIVE, S_OK },
102 { path7, WBEMPATH_CREATE_ACCEPT_ABSOLUTE, S_OK },
103 { path7, WBEMPATH_CREATE_ACCEPT_ALL, S_OK },
104 { path7, WBEMPATH_TREAT_SINGLE_IDENT_AS_NS, WBEM_E_INVALID_PARAMETER, 1 },
105 { path7, WBEMPATH_TREAT_SINGLE_IDENT_AS_NS + 1, S_OK },
106 { path8, WBEMPATH_CREATE_ACCEPT_RELATIVE, S_OK },
107 { path8, WBEMPATH_CREATE_ACCEPT_ABSOLUTE, WBEM_E_INVALID_PARAMETER, 1 },
108 { path8, WBEMPATH_CREATE_ACCEPT_ALL, S_OK },
109 { path8, WBEMPATH_TREAT_SINGLE_IDENT_AS_NS, WBEM_E_INVALID_PARAMETER, 1 },
110 { path8, WBEMPATH_TREAT_SINGLE_IDENT_AS_NS + 1, S_OK },
111 { path9, WBEMPATH_CREATE_ACCEPT_ABSOLUTE, S_OK },
112 { path10, WBEMPATH_CREATE_ACCEPT_ABSOLUTE, WBEM_E_INVALID_PARAMETER, 1 },
113 { path11, WBEMPATH_CREATE_ACCEPT_ABSOLUTE, S_OK }
119 if (!(path = create_path())) return;
121 hr = IWbemPath_SetText( path, 0, NULL );
122 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
124 hr = IWbemPath_SetText( path, WBEMPATH_CREATE_ACCEPT_ALL, NULL );
125 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
127 for (i = 0; i < sizeof(test)/sizeof(test[0]); i++)
129 hr = IWbemPath_SetText( path, test[i].mode, test[i].path );
130 if (test[i].todo) todo_wine ok( hr == test[i].ret, "%u got %08x\n", i, hr );
131 else ok( hr == test[i].ret, "%u got %08x\n", i, hr );
133 if (test[i].ret == S_OK)
138 memset( buf, 0x55, sizeof(buf) );
139 len = sizeof(buf)/sizeof(buf[0]);
140 hr = IWbemPath_GetText( path, WBEMPATH_GET_ORIGINAL, &len, buf );
141 ok( hr == S_OK, "%u got %08x\n", i, hr );
142 ok( !lstrcmpW( buf, test[i].path ), "%u unexpected path %s\n", i, wine_dbgstr_w(buf) );
143 ok( len == lstrlenW( test[i].path ) + 1, "%u unexpected length %u\n", i, len );
146 IWbemPath_Release( path );
149 static void test_IWbemPath_GetText(void)
156 if (!(path = create_path())) return;
158 hr = IWbemPath_GetText( path, 0, NULL, NULL );
159 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
161 len = sizeof(buf)/sizeof(buf[0]);
162 hr = IWbemPath_GetText( path, 0, &len, NULL );
163 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
164 ok( len == sizeof(buf)/sizeof(buf[0]), "unexpected length %u\n", len );
166 len = sizeof(buf)/sizeof(buf[0]);
167 memset( buf, 0x55, sizeof(buf) );
168 hr = IWbemPath_GetText( path, 0, &len, buf );
169 ok( hr == S_OK, "got %08x\n", hr );
170 ok( !buf[0], "unexpected buffer contents %s\n", wine_dbgstr_w(buf) );
171 ok( len == 1, "unexpected length %u\n", len );
173 hr = IWbemPath_GetText( path, WBEMPATH_GET_ORIGINAL, NULL, NULL );
174 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
176 len = sizeof(buf)/sizeof(buf[0]);
177 hr = IWbemPath_GetText( path, WBEMPATH_GET_ORIGINAL, &len, NULL );
178 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
179 ok( len == sizeof(buf)/sizeof(buf[0]), "unexpected length %u\n", len );
181 len = sizeof(buf)/sizeof(buf[0]);
182 memset( buf, 0x55, sizeof(buf) );
183 hr = IWbemPath_GetText( path, WBEMPATH_GET_ORIGINAL, &len, buf );
184 ok( hr == S_OK, "got %08x\n", hr );
185 ok( !buf[0], "unexpected buffer contents %s\n", wine_dbgstr_w(buf) );
186 ok( len == 1, "unexpected length %u\n", len );
188 len = sizeof(buf)/sizeof(buf[0]);
189 memset( buf, 0x55, sizeof(buf) );
190 hr = IWbemPath_GetText( path, WBEMPATH_GET_SERVER_TOO, &len, buf );
191 ok( hr == S_OK, "got %08x\n", hr );
192 todo_wine ok( !buf[0], "unexpected buffer contents %s\n", wine_dbgstr_w(buf) );
193 todo_wine ok( len == 1, "unexpected length %u\n", len );
195 hr = IWbemPath_SetText( path, WBEMPATH_CREATE_ACCEPT_ALL, path8 );
196 ok( hr == S_OK, "got %08x\n", hr );
199 hr = IWbemPath_GetNamespaceCount( path, &count );
200 ok( hr == S_OK, "got %08x\n", hr );
201 ok( count == 2, "got %u\n", count );
203 len = sizeof(buf)/sizeof(buf[0]);
204 memset( buf, 0x55, sizeof(buf) );
205 hr = IWbemPath_GetText( path, WBEMPATH_GET_SERVER_TOO, &len, buf );
206 ok( hr == S_OK, "got %08x\n", hr );
207 ok( !lstrcmpW( buf, path9 ), "unexpected buffer contents %s\n", wine_dbgstr_w(buf) );
208 ok( len == lstrlenW( path9 ) + 1, "unexpected length %u\n", len );
210 len = sizeof(buf)/sizeof(buf[0]);
211 memset( buf, 0x55, sizeof(buf) );
212 hr = IWbemPath_GetText( path, WBEMPATH_GET_SERVER_AND_NAMESPACE_ONLY, &len, buf );
213 ok( hr == S_OK, "got %08x\n", hr );
214 ok( !lstrcmpW( buf, path13 ), "unexpected buffer contents %s\n", wine_dbgstr_w(buf) );
215 ok( len == lstrlenW( path13 ) + 1, "unexpected length %u\n", len );
217 len = sizeof(buf)/sizeof(buf[0]);
218 memset( buf, 0x55, sizeof(buf) );
219 hr = IWbemPath_GetText( path, WBEMPATH_GET_RELATIVE_ONLY, &len, buf );
220 ok( hr == S_OK, "got %08x\n", hr );
221 ok( !lstrcmpW( buf, path14 ), "unexpected buffer contents %s\n", wine_dbgstr_w(buf) );
222 ok( len == lstrlenW( path14 ) + 1, "unexpected length %u\n", len );
224 len = sizeof(buf)/sizeof(buf[0]);
225 memset( buf, 0x55, sizeof(buf) );
226 hr = IWbemPath_GetText( path, WBEMPATH_GET_NAMESPACE_ONLY, &len, buf );
227 ok( hr == S_OK, "got %08x\n", hr );
228 ok( !lstrcmpW( buf, path15 ), "unexpected buffer contents %s\n", wine_dbgstr_w(buf) );
229 ok( len == lstrlenW( path15 ) + 1, "unexpected length %u\n", len );
231 len = sizeof(buf)/sizeof(buf[0]);
232 memset( buf, 0x55, sizeof(buf) );
233 hr = IWbemPath_GetText( path, 0, &len, buf );
234 ok( hr == S_OK, "got %08x\n", hr );
235 ok( !lstrcmpW( buf, path12 ), "unexpected buffer contents %s\n", wine_dbgstr_w(buf) );
236 ok( len == lstrlenW( path12 ) + 1, "unexpected length %u\n", len );
238 hr = IWbemPath_SetText( path, WBEMPATH_CREATE_ACCEPT_ALL, path1 );
239 ok( hr == S_OK, "got %08x\n", hr );
242 hr = IWbemPath_GetNamespaceCount( path, &count );
243 ok( hr == S_OK, "got %08x\n", hr );
244 ok( !count, "got %u\n", count );
246 hr = IWbemPath_SetText( path, WBEMPATH_CREATE_ACCEPT_ALL, path6 );
247 ok( hr == S_OK, "got %08x\n", hr );
250 hr = IWbemPath_GetNamespaceCount( path, &count );
251 ok( hr == S_OK, "got %08x\n", hr );
252 ok( count == 2, "got %u\n", count );
255 hr = IWbemPath_GetText( path, WBEMPATH_GET_SERVER_TOO, &len, NULL );
256 ok( hr == S_OK, "got %08x\n", hr );
257 ok( len == lstrlenW( path16 ) + 1, "unexpected length %u\n", len );
259 len = sizeof(buf)/sizeof(buf[0]);
260 memset( buf, 0x55, sizeof(buf) );
261 hr = IWbemPath_GetText( path, WBEMPATH_GET_SERVER_TOO, &len, buf );
262 ok( hr == S_OK, "got %08x\n", hr );
263 ok( !lstrcmpW( buf, path16 ), "unexpected buffer contents %s\n", wine_dbgstr_w(buf) );
264 ok( len == lstrlenW( path16 ) + 1, "unexpected length %u\n", len );
266 hr = IWbemPath_SetText( path, WBEMPATH_CREATE_ACCEPT_ALL, path17 );
267 ok( hr == S_OK, "got %08x\n", hr );
269 len = sizeof(buf)/sizeof(buf[0]);
270 memset( buf, 0x55, sizeof(buf) );
271 hr = IWbemPath_GetText( path, WBEMPATH_GET_SERVER_TOO, &len, buf );
272 ok( hr == S_OK, "got %08x\n", hr );
273 todo_wine ok( !lstrcmpW( buf, path17 ), "unexpected buffer contents %s\n", wine_dbgstr_w(buf) );
274 todo_wine ok( len == lstrlenW( path17 ) + 1, "unexpected length %u\n", len );
276 IWbemPath_Release( path );
279 static void test_IWbemPath_GetClassName(void)
281 static const WCHAR classW[] = {'W','i','n','3','2','_','L','o','g','i','c','a','l','D','i','s','k',0};
287 if (!(path = create_path())) return;
289 hr = IWbemPath_GetClassName( path, NULL, NULL );
290 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
293 hr = IWbemPath_GetClassName( path, &len, NULL );
294 ok( hr == WBEM_E_INVALID_OBJECT_PATH, "got %08x\n", hr );
296 len = sizeof(buf) / sizeof(buf[0]);
297 hr = IWbemPath_GetClassName( path, &len, buf );
298 ok( hr == WBEM_E_INVALID_OBJECT_PATH, "got %08x\n", hr );
300 len = sizeof(buf) / sizeof(buf[0]);
301 hr = IWbemPath_GetClassName( path, &len, NULL );
302 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
303 ok( len == sizeof(buf) / sizeof(buf[0]), "unexpected length %u\n", len );
305 hr = IWbemPath_SetText( path, WBEMPATH_CREATE_ACCEPT_ALL, path17 );
306 ok( hr == S_OK, "got %08x\n", hr );
309 hr = IWbemPath_GetClassName( path, &len, NULL );
310 ok( hr == S_OK, "got %08x\n", hr );
312 len = sizeof(buf) / sizeof(buf[0]);
313 hr = IWbemPath_GetClassName( path, &len, NULL );
314 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
315 ok( len == sizeof(buf) / sizeof(buf[0]), "unexpected length %u\n", len );
317 len = sizeof(buf) / sizeof(buf[0]);
318 hr = IWbemPath_GetClassName( path, &len, buf );
319 ok( hr == S_OK, "got %08x\n", hr );
320 ok( !lstrcmpW( buf, classW ), "unexpected buffer contents %s\n", wine_dbgstr_w(buf) );
321 ok( len == lstrlenW( classW ) + 1, "unexpected length %u\n", len );
323 IWbemPath_Release( path );
326 static void test_IWbemPath_GetServer(void)
328 static const WCHAR dotW[] = {'.',0};
334 if (!(path = create_path())) return;
336 hr = IWbemPath_GetServer( path, NULL, NULL );
337 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
340 hr = IWbemPath_GetServer( path, &len, NULL );
341 ok( hr == WBEM_E_NOT_AVAILABLE, "got %08x\n", hr );
343 len = sizeof(buf) / sizeof(buf[0]);
344 hr = IWbemPath_GetServer( path, &len, buf );
345 ok( hr == WBEM_E_NOT_AVAILABLE, "got %08x\n", hr );
347 len = sizeof(buf) / sizeof(buf[0]);
348 hr = IWbemPath_GetServer( path, &len, NULL );
349 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
350 ok( len == sizeof(buf) / sizeof(buf[0]), "unexpected length %u\n", len );
352 hr = IWbemPath_SetText( path, WBEMPATH_CREATE_ACCEPT_ALL, path17 );
353 ok( hr == S_OK, "got %08x\n", hr );
356 hr = IWbemPath_GetServer( path, &len, NULL );
357 ok( hr == S_OK, "got %08x\n", hr );
359 len = sizeof(buf) / sizeof(buf[0]);
360 hr = IWbemPath_GetServer( path, &len, NULL );
361 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
362 ok( len == sizeof(buf) / sizeof(buf[0]), "unexpected length %u\n", len );
364 len = sizeof(buf) / sizeof(buf[0]);
365 hr = IWbemPath_GetServer( path, &len, buf );
366 ok( hr == S_OK, "got %08x\n", hr );
367 ok( !lstrcmpW( buf, dotW ), "unexpected buffer contents %s\n", wine_dbgstr_w(buf) );
368 ok( len == lstrlenW( dotW ) + 1, "unexpected length %u\n", len );
370 IWbemPath_Release( path );
373 static void test_IWbemPath_GetInfo(void)
379 if (!(path = create_path())) return;
381 hr = IWbemPath_GetInfo( path, 0, NULL );
382 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
384 hr = IWbemPath_GetInfo( path, 1, NULL );
385 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
388 hr = IWbemPath_GetInfo( path, 0, &resp );
389 ok( hr == S_OK, "got %08x\n", hr );
390 ok( resp == (WBEMPATH_INFO_ANON_LOCAL_MACHINE | WBEMPATH_INFO_SERVER_NAMESPACE_ONLY),
391 "got %lx%08lx\n", (unsigned long)(resp >> 32), (unsigned long)resp );
393 hr = IWbemPath_SetText( path, WBEMPATH_CREATE_ACCEPT_ALL, path17 );
394 ok( hr == S_OK, "got %08x\n", hr );
396 hr = IWbemPath_GetInfo( path, 0, NULL );
397 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
399 hr = IWbemPath_GetInfo( path, 1, NULL );
400 ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
403 hr = IWbemPath_GetInfo( path, 0, &resp );
404 ok( hr == S_OK, "got %08x\n", hr );
405 ok( resp == (WBEMPATH_INFO_ANON_LOCAL_MACHINE | WBEMPATH_INFO_IS_INST_REF |
406 WBEMPATH_INFO_HAS_SUBSCOPES | WBEMPATH_INFO_V2_COMPLIANT |
407 WBEMPATH_INFO_CIM_COMPLIANT | WBEMPATH_INFO_PATH_HAD_SERVER),
408 "got %lx%08lx\n", (unsigned long)(resp >> 32), (unsigned long)resp );
410 IWbemPath_Release( path );
411 if (!(path = create_path())) return;
413 hr = IWbemPath_SetText( path, WBEMPATH_CREATE_ACCEPT_ALL, path12 );
414 ok( hr == S_OK, "got %08x\n", hr );
417 hr = IWbemPath_GetInfo( path, 0, &resp );
418 ok( hr == S_OK, "got %08x\n", hr );
419 ok( resp == (WBEMPATH_INFO_ANON_LOCAL_MACHINE | WBEMPATH_INFO_IS_CLASS_REF |
420 WBEMPATH_INFO_HAS_SUBSCOPES | WBEMPATH_INFO_V2_COMPLIANT |
421 WBEMPATH_INFO_CIM_COMPLIANT),
422 "got %lx%08lx\n", (unsigned long)(resp >> 32), (unsigned long)resp );
424 hr = IWbemPath_SetText( path, WBEMPATH_CREATE_ACCEPT_ALL, path1 );
425 ok( hr == S_OK, "got %08x\n", hr );
428 hr = IWbemPath_GetInfo( path, 0, &resp );
429 ok( hr == S_OK, "got %08x\n", hr );
430 ok( resp == (WBEMPATH_INFO_ANON_LOCAL_MACHINE | WBEMPATH_INFO_SERVER_NAMESPACE_ONLY),
431 "got %lx%08lx\n", (unsigned long)(resp >> 32), (unsigned long)resp );
433 IWbemPath_Release( path );
438 CoInitialize( NULL );
440 test_IWbemPath_SetText();
441 test_IWbemPath_GetText();
442 test_IWbemPath_GetClassName();
443 test_IWbemPath_GetServer();
444 test_IWbemPath_GetInfo();