* The Shell.. for a long time we dreamed of having a compatible, properly working...
[reactos.git] / rostests / winetests / fusion / asmname.c
1 /*
2 * Copyright 2008 James Hawkins
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 #define WIN32_NO_STATUS
20 #define _INC_WINDOWS
21 #define COM_NO_WINDOWS_H
22
23 #define COBJMACROS
24
25 //#include <stdio.h>
26 #include <stdarg.h>
27
28 //#include <windows.h>
29 #include <windef.h>
30 #include <winbase.h>
31 #include <winnls.h>
32 #include <objbase.h>
33 //#include <mscoree.h>
34 #include <fusion.h>
35 #include <corerror.h>
36
37 #include <wine/test.h>
38
39 /* ok-like statement which takes two unicode strings or one unicode and one ANSI string as arguments */
40 static CHAR string1[MAX_PATH];
41
42 #define ok_aw(aString, wString) \
43 WideCharToMultiByte(CP_ACP, 0, wString, -1, string1, MAX_PATH, NULL, NULL); \
44 if (lstrcmpA(string1, aString) != 0) \
45 ok(0, "Expected \"%s\", got \"%s\"\n", aString, string1);
46
47 static HRESULT (WINAPI *pCreateAssemblyNameObject)(LPASSEMBLYNAME *ppAssemblyNameObj,
48 LPCWSTR szAssemblyName, DWORD dwFlags,
49 LPVOID pvReserved);
50 static HRESULT (WINAPI *pLoadLibraryShim)(LPCWSTR szDllName, LPCWSTR szVersion,
51 LPVOID pvReserved, HMODULE *phModDll);
52
53 static BOOL init_functionpointers(void)
54 {
55 HRESULT hr;
56 HMODULE hfusion;
57 HMODULE hmscoree;
58
59 static const WCHAR szFusion[] = {'f','u','s','i','o','n','.','d','l','l',0};
60
61 hmscoree = LoadLibraryA("mscoree.dll");
62 if (!hmscoree)
63 return FALSE;
64
65 pLoadLibraryShim = (void *)GetProcAddress(hmscoree, "LoadLibraryShim");
66 if (!pLoadLibraryShim)
67 {
68 FreeLibrary(hmscoree);
69 return FALSE;
70 }
71
72 hr = pLoadLibraryShim(szFusion, NULL, NULL, &hfusion);
73 if (FAILED(hr))
74 return FALSE;
75
76 pCreateAssemblyNameObject = (void *)GetProcAddress(hfusion, "CreateAssemblyNameObject");
77 if (!pCreateAssemblyNameObject)
78 return FALSE;
79
80 return TRUE;
81 }
82
83 typedef struct _tagASMPROP_RES
84 {
85 HRESULT hr;
86 CHAR val[MAX_PATH];
87 DWORD size;
88 } ASMPROP_RES;
89
90 static const ASMPROP_RES defaults[ASM_NAME_MAX_PARAMS] =
91 {
92 {S_OK, "", 0},
93 {S_OK, "", 0},
94 {S_OK, "", 0},
95 {S_OK, "", 0},
96 {S_OK, "", 0},
97 {S_OK, "", 0},
98 {S_OK, "", 0},
99 {S_OK, "", 0},
100 {S_OK, "", 0},
101 {S_OK, "", 0},
102 {S_OK, "", 0},
103 {S_OK, "", 0},
104 {S_OK, "", 0},
105 {S_OK, "", 0},
106 {S_OK, "", 0},
107 {S_FALSE, "", MAX_PATH},
108 {S_FALSE, "", MAX_PATH},
109 {S_OK, "", 0},
110 {S_OK, "", MAX_PATH},
111 {S_OK, "", 0},
112 {S_OK, "", 0},
113 {S_OK, "", 0},
114 {S_OK, "", 0},
115 {S_OK, "", 0},
116 {S_OK, "", 0},
117 {S_OK, "", 0},
118 {S_OK, "", 0},
119 {S_OK, "", 0}
120 };
121
122 static const ASMPROP_RES emptyname[ASM_NAME_MAX_PARAMS] =
123 {
124 {S_OK, "", 0},
125 {S_OK, "", 0},
126 {S_OK, "", 0},
127 {S_OK, "", 2},
128 {S_OK, "", 0},
129 {S_OK, "", 0},
130 {S_OK, "", 0},
131 {S_OK, "", 0},
132 {S_OK, "", 0},
133 {S_OK, "", 0},
134 {S_OK, "", 0},
135 {S_OK, "", 0},
136 {S_OK, "", 0},
137 {S_OK, "", 0},
138 {S_OK, "", 0},
139 {S_FALSE, "", MAX_PATH},
140 {S_FALSE, "", MAX_PATH},
141 {S_OK, "", 0},
142 {S_OK, "", MAX_PATH},
143 {S_OK, "", 0},
144 {S_OK, "", 0},
145 {S_OK, "", 0},
146 {S_OK, "", 0},
147 {S_OK, "", 0},
148 {S_OK, "", 0},
149 {S_OK, "", 0},
150 {S_OK, "", 0},
151 {S_OK, "", 0}
152 };
153
154 static const ASMPROP_RES winename[ASM_NAME_MAX_PARAMS] =
155 {
156 {S_OK, "", 0},
157 {S_OK, "", 0},
158 {S_OK, "", 0},
159 {S_OK, "wine", 10},
160 {S_OK, "", 0},
161 {S_OK, "", 0},
162 {S_OK, "", 0},
163 {S_OK, "", 0},
164 {S_OK, "", 0},
165 {S_OK, "", 0},
166 {S_OK, "", 0},
167 {S_OK, "", 0},
168 {S_OK, "", 0},
169 {S_OK, "", 0},
170 {S_OK, "", 0},
171 {S_FALSE, "", MAX_PATH},
172 {S_FALSE, "", MAX_PATH},
173 {S_OK, "", 0},
174 {S_OK, "", MAX_PATH},
175 {S_OK, "", 0},
176 {S_OK, "", 0},
177 {S_OK, "", 0},
178 {S_OK, "", 0},
179 {S_OK, "", 0},
180 {S_OK, "", 0},
181 {S_OK, "", 0},
182 {S_OK, "", 0},
183 {S_OK, "", 0}
184 };
185
186 static const ASMPROP_RES vername[ASM_NAME_MAX_PARAMS] =
187 {
188 {S_OK, "", 0},
189 {S_OK, "", 0},
190 {S_OK, "", 0},
191 {S_OK, "wine", 10},
192 {S_OK, "\x01", 2},
193 {S_OK, "\x02", 2},
194 {S_OK, "\x03", 2},
195 {S_OK, "\x04", 2},
196 {S_OK, "", 0},
197 {S_OK, "", 0},
198 {S_OK, "", 0},
199 {S_OK, "", 0},
200 {S_OK, "", 0},
201 {S_OK, "", 0},
202 {S_OK, "", 0},
203 {S_FALSE, "", MAX_PATH},
204 {S_FALSE, "", MAX_PATH},
205 {S_OK, "", 0},
206 {S_OK, "", MAX_PATH},
207 {S_OK, "", 0},
208 {S_OK, "", 0},
209 {S_OK, "", 0},
210 {S_OK, "", 0},
211 {S_OK, "", 0},
212 {S_OK, "", 0},
213 {S_OK, "", 0},
214 {S_OK, "", 0},
215 {S_OK, "", 0}
216 };
217
218 static const ASMPROP_RES badvername[ASM_NAME_MAX_PARAMS] =
219 {
220 {S_OK, "", 0},
221 {S_OK, "", 0},
222 {S_OK, "", 0},
223 {S_OK, "wine", 10},
224 {S_OK, "\x01", 2},
225 {S_OK, "\x05", 2},
226 {S_OK, "", 0},
227 {S_OK, "", 0},
228 {S_OK, "", 0},
229 {S_OK, "", 0},
230 {S_OK, "", 0},
231 {S_OK, "", 0},
232 {S_OK, "", 0},
233 {S_OK, "", 0},
234 {S_OK, "", 0},
235 {S_FALSE, "", MAX_PATH},
236 {S_FALSE, "", MAX_PATH},
237 {S_OK, "", 0},
238 {S_OK, "", MAX_PATH},
239 {S_OK, "", 0},
240 {S_OK, "", 0},
241 {S_OK, "", 0},
242 {S_OK, "", 0},
243 {S_OK, "", 0},
244 {S_OK, "", 0},
245 {S_OK, "", 0},
246 {S_OK, "", 0},
247 {S_OK, "", 0}
248 };
249
250 static const ASMPROP_RES neutralname[ASM_NAME_MAX_PARAMS] =
251 {
252 {S_OK, "", 0},
253 {S_OK, "", 0},
254 {S_OK, "", 0},
255 {S_OK, "wine", 10},
256 {S_OK, "", 0},
257 {S_OK, "", 0},
258 {S_OK, "", 0},
259 {S_OK, "", 0},
260 {S_OK, "", 2},
261 {S_OK, "", 0},
262 {S_OK, "", 0},
263 {S_OK, "", 0},
264 {S_OK, "", 0},
265 {S_OK, "", 0},
266 {S_OK, "", 0},
267 {S_FALSE, "", MAX_PATH},
268 {S_FALSE, "", MAX_PATH},
269 {S_OK, "", 0},
270 {S_OK, "", MAX_PATH},
271 {S_OK, "", 0},
272 {S_OK, "", 0},
273 {S_OK, "", 0},
274 {S_OK, "", 0},
275 {S_OK, "", 0},
276 {S_OK, "", 0},
277 {S_OK, "", 0},
278 {S_OK, "", 0},
279 {S_OK, "", 0}
280 };
281
282 static const ASMPROP_RES enname[ASM_NAME_MAX_PARAMS] =
283 {
284 {S_OK, "", 0},
285 {S_OK, "", 0},
286 {S_OK, "", 0},
287 {S_OK, "wine", 10},
288 {S_OK, "", 0},
289 {S_OK, "", 0},
290 {S_OK, "", 0},
291 {S_OK, "", 0},
292 {S_OK, "en", 6},
293 {S_OK, "", 0},
294 {S_OK, "", 0},
295 {S_OK, "", 0},
296 {S_OK, "", 0},
297 {S_OK, "", 0},
298 {S_OK, "", 0},
299 {S_FALSE, "", MAX_PATH},
300 {S_FALSE, "", MAX_PATH},
301 {S_OK, "", 0},
302 {S_OK, "", MAX_PATH},
303 {S_OK, "", 0},
304 {S_OK, "", 0},
305 {S_OK, "", 0},
306 {S_OK, "", 0},
307 {S_OK, "", 0},
308 {S_OK, "", 0},
309 {S_OK, "", 0},
310 {S_OK, "", 0},
311 {S_OK, "", 0}
312 };
313
314 static const ASMPROP_RES pubkeyname[ASM_NAME_MAX_PARAMS] =
315 {
316 {S_OK, "", 0},
317 {S_OK, "\x12\x34\x56\x78\x90\xab\xcd\xef", 8},
318 {S_OK, "", 0},
319 {S_OK, "wine", 10},
320 {S_OK, "", 0},
321 {S_OK, "", 0},
322 {S_OK, "", 0},
323 {S_OK, "", 0},
324 {S_OK, "", 0},
325 {S_OK, "", 0},
326 {S_OK, "", 0},
327 {S_OK, "", 0},
328 {S_OK, "", 0},
329 {S_OK, "", 0},
330 {S_OK, "", 0},
331 {S_OK, "", MAX_PATH},
332 {S_OK, "", MAX_PATH},
333 {S_OK, "", 0},
334 {S_OK, "", MAX_PATH},
335 {S_OK, "", 0},
336 {S_OK, "", 0},
337 {S_OK, "", 0},
338 {S_OK, "", 0},
339 {S_OK, "", 0},
340 {S_OK, "", 0},
341 {S_OK, "", 0},
342 {S_OK, "", 0},
343 {S_OK, "", 0}
344 };
345
346 static inline void to_widechar(LPWSTR dest, LPCSTR src)
347 {
348 MultiByteToWideChar(CP_ACP, 0, src, -1, dest, MAX_PATH);
349 }
350
351 static inline void to_multibyte(LPSTR dest, LPWSTR src)
352 {
353 WideCharToMultiByte(CP_ACP, 0, src, -1, dest, MAX_PATH, NULL, NULL);
354 }
355
356 static void test_assembly_name_props_line(IAssemblyName *name,
357 const ASMPROP_RES *vals, int line)
358 {
359 HRESULT hr;
360 DWORD i, size;
361 WCHAR expect[MAX_PATH];
362 WCHAR str[MAX_PATH];
363 CHAR val[MAX_PATH];
364
365 for (i = 0; i < ASM_NAME_MAX_PARAMS; i++)
366 {
367 to_widechar(expect, vals[i].val);
368
369 size = MAX_PATH;
370 ZeroMemory(str, MAX_PATH);
371 hr = IAssemblyName_GetProperty(name, i, str, &size);
372 to_multibyte(val, str);
373
374 ok(hr == vals[i].hr ||
375 broken(i >= ASM_NAME_CONFIG_MASK && hr == E_INVALIDARG) || /* .NET 1.1 */
376 broken(i >= ASM_NAME_FILE_MAJOR_VERSION && hr == E_INVALIDARG), /* .NET 1.0 */
377 "%d: prop %d: Expected %08x, got %08x\n", line, i, vals[i].hr, hr);
378 if (hr != E_INVALIDARG)
379 {
380 if (i == ASM_NAME_PUBLIC_KEY_TOKEN)
381 ok(!memcmp(vals[i].val, str, size), "Expected a correct ASM_NAME_PUBLIC_KEY_TOKEN\n");
382 else
383 ok(!lstrcmpA(vals[i].val, val), "%d: prop %d: Expected \"%s\", got \"%s\"\n", line, i, vals[i].val, val);
384 ok(size == vals[i].size, "%d: prop %d: Expected %d, got %d\n", line, i, vals[i].size, size);
385 }
386 }
387 }
388
389 #define test_assembly_name_props(name, vals) \
390 test_assembly_name_props_line(name, vals, __LINE__);
391
392 static void test_CreateAssemblyNameObject(void)
393 {
394 IAssemblyName *name;
395 WCHAR str[MAX_PATH];
396 WCHAR namestr[MAX_PATH];
397 DWORD size, hi, lo;
398 HRESULT hr;
399
400 static const WCHAR empty[] = {0};
401
402 /* NULL ppAssemblyNameObj */
403 to_widechar(namestr, "wine.dll");
404 hr = pCreateAssemblyNameObject(NULL, namestr, 0, NULL);
405 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
406
407 /* NULL szAssemblyName, CANOF_PARSE_DISPLAY_NAME */
408 name = (IAssemblyName *)0xdeadbeef;
409 hr = pCreateAssemblyNameObject(&name, NULL, CANOF_PARSE_DISPLAY_NAME, NULL);
410 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
411 ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name);
412
413 /* empty szAssemblyName, CANOF_PARSE_DISPLAY_NAME */
414 name = (IAssemblyName *)0xdeadbeef;
415 hr = pCreateAssemblyNameObject(&name, empty, CANOF_PARSE_DISPLAY_NAME, NULL);
416 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
417 ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name);
418
419 /* check the contents of the AssemblyName for default values */
420
421 /* NULL szAssemblyName */
422 name = NULL;
423 hr = pCreateAssemblyNameObject(&name, NULL, CANOF_SET_DEFAULT_VALUES, NULL);
424 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
425 ok(name != NULL, "Expected non-NULL name\n");
426
427 size = MAX_PATH;
428 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL);
429 ok(hr == FUSION_E_INVALID_NAME ||
430 broken(hr == E_INVALIDARG), /* .NET 1.x */
431 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
432
433 size = MAX_PATH;
434 str[0] = '\0';
435 hr = IAssemblyName_GetName(name, &size, str);
436 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
437 ok(lstrlenW(str) == 0, "Expected empty name\n");
438 ok(size == 0, "Expected 0, got %d\n", size);
439
440 hi = 0xbeefcace;
441 lo = 0xcafebabe;
442 hr = IAssemblyName_GetVersion(name, &hi, &lo);
443 ok(hr == FUSION_E_INVALID_NAME ||
444 broken(hr == S_OK), /* .NET 1.x */
445 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
446 ok(hi == 0, "Expected 0, got %08x\n", hi);
447 ok(lo == 0, "Expected 0, got %08x\n", lo);
448
449 if (hr == S_OK)
450 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
451 " and ASM_NAME_OSINFO_ARRAY correctly\n");
452 else
453 test_assembly_name_props(name, defaults);
454
455 IAssemblyName_Release(name);
456
457 /* empty szAssemblyName */
458 name = NULL;
459 hr = pCreateAssemblyNameObject(&name, empty, CANOF_SET_DEFAULT_VALUES, NULL);
460 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
461 ok(name != NULL, "Expected non-NULL name\n");
462
463 size = MAX_PATH;
464 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL);
465 ok(hr == FUSION_E_INVALID_NAME ||
466 broken(hr == S_OK), /* .NET 1.x */
467 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
468
469 size = MAX_PATH;
470 str[0] = '\0';
471 hr = IAssemblyName_GetName(name, &size, str);
472 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
473 ok(lstrlenW(str) == 0, "Expected empty name\n");
474 ok(size == 1, "Expected 1, got %d\n", size);
475
476 hi = 0xbeefcace;
477 lo = 0xcafebabe;
478 hr = IAssemblyName_GetVersion(name, &hi, &lo);
479 ok(hr == FUSION_E_INVALID_NAME ||
480 broken(hr == S_OK), /* .NET 1.x */
481 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
482 ok(hi == 0, "Expected 0, got %08x\n", hi);
483 ok(lo == 0, "Expected 0, got %08x\n", lo);
484
485 if (hr == S_OK)
486 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
487 " and ASM_NAME_OSINFO_ARRAY correctly\n");
488 else
489 test_assembly_name_props(name, emptyname);
490
491 IAssemblyName_Release(name);
492
493 /* 'wine' */
494 to_widechar(namestr, "wine");
495 name = NULL;
496 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_SET_DEFAULT_VALUES, NULL);
497 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
498 ok(name != NULL, "Expected non-NULL name\n");
499
500 size = MAX_PATH;
501 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL);
502 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
503 ok_aw("wine", str);
504 ok(size == 5, "Expected 5, got %d\n", size);
505
506 size = MAX_PATH;
507 str[0] = '\0';
508 hr = IAssemblyName_GetName(name, &size, str);
509 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
510 ok_aw("wine", str);
511 ok(size == 5, "Expected 5, got %d\n", size);
512
513 hi = 0xbeefcace;
514 lo = 0xcafebabe;
515 hr = IAssemblyName_GetVersion(name, &hi, &lo);
516 ok(hr == FUSION_E_INVALID_NAME ||
517 broken(hr == S_OK), /* .NET 1.x */
518 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
519 ok(hi == 0, "Expected 0, got %08x\n", hi);
520 ok(lo == 0, "Expected 0, got %08x\n", lo);
521
522 if (hr == S_OK)
523 win_skip(".NET 1.x doesn't handle ASM_NAME_PROCESSOR_ID_ARRAY"
524 " and ASM_NAME_OSINFO_ARRAY correctly\n");
525 else
526 test_assembly_name_props(name, winename);
527
528 IAssemblyName_Release(name);
529
530 /* check the contents of the AssemblyName with parsing */
531
532 /* 'wine' */
533 to_widechar(namestr, "wine");
534 name = NULL;
535 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
536 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
537 ok(name != NULL, "Expected non-NULL name\n");
538
539 size = MAX_PATH;
540 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL);
541 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
542 ok_aw("wine", str);
543 ok(size == 5, "Expected 5, got %d\n", size);
544
545 size = MAX_PATH;
546 str[0] = '\0';
547 hr = IAssemblyName_GetName(name, &size, str);
548 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
549 ok_aw("wine", str);
550 ok(size == 5, "Expected 5, got %d\n", size);
551
552 hi = 0xbeefcace;
553 lo = 0xcafebabe;
554 hr = IAssemblyName_GetVersion(name, &hi, &lo);
555 ok(hr == FUSION_E_INVALID_NAME ||
556 broken(hr == S_OK), /* .NET 1.x */
557 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
558 ok(hi == 0, "Expected 0, got %08x\n", hi);
559 ok(lo == 0, "Expected 0, got %08x\n", lo);
560
561 test_assembly_name_props(name, winename);
562
563 IAssemblyName_Release(name);
564
565 /* 'wine, Version=1.2.3.4' */
566 to_widechar(namestr, "wine, Version=1.2.3.4");
567 name = NULL;
568 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
569 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
570 ok(name != NULL, "Expected non-NULL name\n");
571
572 size = MAX_PATH;
573 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL);
574 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
575 ok_aw("wine, Version=1.2.3.4", str);
576 ok(size == 22, "Expected 22, got %d\n", size);
577
578 size = MAX_PATH;
579 str[0] = '\0';
580 hr = IAssemblyName_GetName(name, &size, str);
581 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
582 ok_aw("wine", str);
583 ok(size == 5, "Expected 5, got %d\n", size);
584
585 hi = 0xbeefcace;
586 lo = 0xcafebabe;
587 hr = IAssemblyName_GetVersion(name, &hi, &lo);
588 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
589 ok(hi == 0x00010002, "Expected 0x00010002, got %08x\n", hi);
590 ok(lo == 0x00030004, "Expected 0x00030004, got %08x\n", lo);
591
592 test_assembly_name_props(name, vername);
593
594 IAssemblyName_Release(name);
595
596 /* Version isn't of the form 1.x.x.x */
597 to_widechar(namestr, "wine, Version=1.5");
598 name = NULL;
599 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
600 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
601 ok(name != NULL, "Expected non-NULL name\n");
602
603 size = MAX_PATH;
604 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL);
605 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
606 ok_aw("wine, Version=1.5", str);
607 ok(size == 18, "Expected 18, got %d\n", size);
608
609 size = MAX_PATH;
610 str[0] = '\0';
611 hr = IAssemblyName_GetName(name, &size, str);
612 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
613 ok_aw("wine", str);
614 ok(size == 5, "Expected 5, got %d\n", size);
615
616 hi = 0xbeefcace;
617 lo = 0xcafebabe;
618 hr = IAssemblyName_GetVersion(name, &hi, &lo);
619 ok(hr == FUSION_E_INVALID_NAME ||
620 broken(hr == S_OK), /* .NET 1.x */
621 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
622 ok(hi == 0 ||
623 broken(hi == 0x10005), /* .NET 1.x */
624 "Expected 0, got %08x\n", hi);
625 ok(lo == 0, "Expected 0, got %08x\n", lo);
626
627 test_assembly_name_props(name, badvername);
628
629 IAssemblyName_Release(name);
630
631 /* 'wine, Culture=neutral' */
632 to_widechar(namestr, "wine, Culture=neutral");
633 name = NULL;
634 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
635 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
636 ok(name != NULL, "Expected non-NULL name\n");
637
638 size = MAX_PATH;
639 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL);
640 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
641 ok_aw("wine, Culture=neutral", str);
642 ok(size == 22, "Expected 22, got %d\n", size);
643
644 size = MAX_PATH;
645 str[0] = '\0';
646 hr = IAssemblyName_GetName(name, &size, str);
647 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
648 ok_aw("wine", str);
649 ok(size == 5, "Expected 5, got %d\n", size);
650
651 hi = 0xbeefcace;
652 lo = 0xcafebabe;
653 hr = IAssemblyName_GetVersion(name, &hi, &lo);
654 ok(hr == FUSION_E_INVALID_NAME ||
655 broken(hr == S_OK), /* .NET 1.x */
656 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
657 ok(hi == 0, "Expected 0, got %08x\n", hi);
658 ok(lo == 0, "Expected 0, got %08x\n", lo);
659
660 test_assembly_name_props(name, neutralname);
661
662 IAssemblyName_Release(name);
663
664 /* 'wine, Culture=en' */
665 to_widechar(namestr, "wine, Culture=en");
666 name = NULL;
667 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
668 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
669 ok(name != NULL, "Expected non-NULL name\n");
670
671 size = MAX_PATH;
672 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL);
673 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
674 ok_aw("wine, Culture=en", str);
675 ok(size == 17, "Expected 17, got %d\n", size);
676
677 size = MAX_PATH;
678 str[0] = '\0';
679 hr = IAssemblyName_GetName(name, &size, str);
680 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
681 ok_aw("wine", str);
682 ok(size == 5, "Expected 5, got %d\n", size);
683
684 hi = 0xbeefcace;
685 lo = 0xcafebabe;
686 hr = IAssemblyName_GetVersion(name, &hi, &lo);
687 ok(hr == FUSION_E_INVALID_NAME ||
688 broken(hr == S_OK), /* .NET 1.x */
689 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
690 ok(hi == 0, "Expected 0, got %08x\n", hi);
691 ok(lo == 0, "Expected 0, got %08x\n", lo);
692
693 test_assembly_name_props(name, enname);
694
695 IAssemblyName_Release(name);
696
697 /* 'wine, PublicKeyToken=1234567890abcdef' */
698 to_widechar(namestr, "wine, PublicKeyToken=1234567890abcdef");
699 name = NULL;
700 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
701 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
702 ok(name != NULL, "Expected non-NULL name\n");
703
704 size = MAX_PATH;
705 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL);
706 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
707 ok_aw("wine, PublicKeyToken=1234567890abcdef", str);
708 ok(size == 38, "Expected 38, got %d\n", size);
709
710 size = MAX_PATH;
711 str[0] = '\0';
712 hr = IAssemblyName_GetName(name, &size, str);
713 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
714 ok_aw("wine", str);
715 ok(size == 5, "Expected 5, got %d\n", size);
716
717 hi = 0xbeefcace;
718 lo = 0xcafebabe;
719 hr = IAssemblyName_GetVersion(name, &hi, &lo);
720 ok(hr == FUSION_E_INVALID_NAME ||
721 broken(hr == S_OK), /* .NET 1.x */
722 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
723 ok(hi == 0, "Expected 0, got %08x\n", hi);
724 ok(lo == 0, "Expected 0, got %08x\n", lo);
725
726 test_assembly_name_props(name, pubkeyname);
727
728 IAssemblyName_Release(name);
729
730 /* Processor architecture tests */
731 to_widechar(namestr, "wine, processorArchitecture=x86");
732 name = NULL;
733 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
734 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
735
736 ok(name != NULL, "Expected non-NULL name\n");
737
738 size = MAX_PATH;
739 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_PROCESSORARCHITECTURE);
740 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
741
742 WideCharToMultiByte(CP_ACP, 0, str, -1, string1, MAX_PATH, NULL, NULL);
743
744 if (lstrcmpA(string1, "wine") == 0)
745 win_skip("processorArchitecture not supported on .NET 1.x\n");
746 else
747 {
748 ok_aw("wine, processorArchitecture=x86", str);
749 ok(size == 32, "Expected 32, got %d\n", size);
750
751 IAssemblyName_Release(name);
752
753 /* amd64 */
754 to_widechar(namestr, "wine, processorArchitecture=AMD64");
755 name = NULL;
756 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
757 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
758
759 size = MAX_PATH;
760 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_PROCESSORARCHITECTURE);
761 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
762 ok_aw("wine, processorArchitecture=AMD64", str);
763 ok(size == 34, "Expected 34, got %d\n", size);
764
765 IAssemblyName_Release(name);
766
767 /* ia64 */
768 to_widechar(namestr, "wine, processorArchitecture=IA64");
769 name = NULL;
770 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
771 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
772
773 size = MAX_PATH;
774 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_PROCESSORARCHITECTURE);
775 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
776 ok_aw("wine, processorArchitecture=IA64", str);
777 ok(size == 33, "Expected 33, got %d\n", size);
778
779 IAssemblyName_Release(name);
780
781 /* msil */
782 to_widechar(namestr, "wine, processorArchitecture=MSIL");
783 name = NULL;
784 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
785 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
786
787 size = MAX_PATH;
788 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_PROCESSORARCHITECTURE);
789 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
790 ok_aw("wine, processorArchitecture=MSIL", str);
791 ok(size == 33, "Expected 33, got %d\n", size);
792
793 IAssemblyName_Release(name);
794 }
795
796 /* Pulling out various different values */
797 to_widechar(namestr, "wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef");
798 name = NULL;
799 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
800 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
801 ok(name != NULL, "Expected non-NULL name\n");
802
803 size = MAX_PATH;
804 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_VERSION | ASM_DISPLAYF_CULTURE);
805 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
806 ok_aw("wine, Version=1.2.3.4, Culture=en", str);
807 ok(size == 34, "Expected 34, got %d\n", size);
808
809 size = MAX_PATH;
810 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_CULTURE | ASM_DISPLAYF_PUBLIC_KEY_TOKEN);
811 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
812 ok_aw("wine, Culture=en, PublicKeyToken=1234567890abcdef", str);
813 ok(size == 50, "Expected 50, got %d\n", size);
814
815 size = MAX_PATH;
816 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL);
817 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
818 ok_aw("wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef", str);
819 ok(size == 67, "Expected 67, got %d\n", size);
820
821 IAssemblyName_Release(name);
822
823 /* invalid property */
824 to_widechar(namestr, "wine, BadProp=42");
825 name = NULL;
826 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
827 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
828 ok(name != NULL, "Expected non-NULL name\n");
829
830 size = MAX_PATH;
831 str[0] = '\0';
832 hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL);
833 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
834 ok_aw("wine", str);
835 ok(size == 5, "Expected 5, got %d\n", size);
836
837 size = MAX_PATH;
838 str[0] = '\0';
839 hr = IAssemblyName_GetName(name, &size, str);
840 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
841 ok_aw("wine", str);
842 ok(size == 5, "Expected 5, got %d\n", size);
843
844 hi = 0xbeefcace;
845 lo = 0xcafebabe;
846 hr = IAssemblyName_GetVersion(name, &hi, &lo);
847 ok(hr == FUSION_E_INVALID_NAME ||
848 broken(hr == S_OK), /* .NET 1.x */
849 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
850 ok(hi == 0, "Expected 0, got %08x\n", hi);
851 ok(lo == 0, "Expected 0, got %08x\n", lo);
852
853 test_assembly_name_props(name, winename);
854
855 IAssemblyName_Release(name);
856
857 /* PublicKeyToken is not 16 chars long */
858 to_widechar(namestr, "wine, PublicKeyToken=567890abcdef");
859 name = (IAssemblyName *)0xdeadbeef;
860 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
861 if (hr == S_OK && name != (IAssemblyName *)0xdeadbeef)
862 {
863 win_skip(".NET 1.x doesn't check PublicKeyToken correctly\n");
864 IAssemblyName_Release(name);
865 return;
866 }
867 ok(hr == FUSION_E_INVALID_NAME,
868 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
869 ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name);
870
871 /* PublicKeyToken contains invalid chars */
872 to_widechar(namestr, "wine, PublicKeyToken=1234567890ghijkl");
873 name = (IAssemblyName *)0xdeadbeef;
874 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
875 ok(hr == FUSION_E_INVALID_NAME,
876 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
877 ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name);
878
879 /* no comma separator */
880 to_widechar(namestr, "wine PublicKeyToken=1234567890abcdef");
881 name = (IAssemblyName *)0xdeadbeef;
882 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
883 ok(hr == FUSION_E_INVALID_NAME,
884 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
885 ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name);
886 if(SUCCEEDED(hr)) IAssemblyName_Release(name);
887
888 /* no '=' */
889 to_widechar(namestr, "wine, PublicKeyToken");
890 name = (IAssemblyName *)0xdeadbeef;
891 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
892 ok(hr == FUSION_E_INVALID_NAME,
893 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
894 ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name);
895
896 /* no value */
897 to_widechar(namestr, "wine, PublicKeyToken=");
898 name = (IAssemblyName *)0xdeadbeef;
899 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
900 ok(hr == FUSION_E_INVALID_NAME,
901 "Expected FUSION_E_INVALID_NAME, got %08x\n", hr);
902 ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name);
903
904 /* no spaces */
905 to_widechar(namestr, "wine,version=1.0.0.0");
906 name = (IAssemblyName *)0xdeadbeef;
907 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
908 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
909 ok(name != NULL, "Expected non-NULL name\n");
910 hi = lo = 0xdeadbeef;
911 hr = IAssemblyName_GetVersion(name, &hi, &lo);
912 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
913 ok(hi == 65536, "Expected 536, got %u\n", hi);
914 ok(lo == 0, "Expected 0, got %u\n", lo);
915 IAssemblyName_Release(name);
916
917 /* quoted values */
918 to_widechar(namestr, "wine, version=\"1.0.0.0\",culture=\"en\"");
919 name = (IAssemblyName *)0xdeadbeef;
920 hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL);
921 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
922 ok(name != NULL, "Expected non-NULL name\n");
923 hi = lo = 0xdeadbeef;
924 hr = IAssemblyName_GetVersion(name, &hi, &lo);
925 ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
926 ok(hi == 65536, "Expected 65536, got %u\n", hi);
927 ok(lo == 0, "Expected 0, got %u\n", lo);
928 IAssemblyName_Release(name);
929 }
930
931 static void test_IAssemblyName_IsEqual(void)
932 {
933 static const WCHAR wine1[] =
934 {'w','i','n','e',0};
935 static const WCHAR wine2[] =
936 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',0};
937 static const WCHAR wine3[] =
938 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
939 'c','u','l','t','u','r','e','=','n','e','u','t','r','a','l',0};
940 static const WCHAR wine4[] =
941 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
942 'c','u','l','t','u','r','e','=','e','n',0};
943 static const WCHAR wine5[] =
944 {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','0','.','0','.','0',',',
945 'p','u','b','l','i','c','K','e','y','T','o','k','e','n','=','1','2','3','4','5','6',
946 '7','8','9','0','a','b','c','d','e','f',0};
947 HRESULT hr;
948 IAssemblyName *name1, *name2;
949
950 hr = pCreateAssemblyNameObject( &name1, wine1, CANOF_PARSE_DISPLAY_NAME, NULL );
951 ok( hr == S_OK, "got %08x\n", hr );
952
953 hr = pCreateAssemblyNameObject( &name2, wine1, CANOF_PARSE_DISPLAY_NAME, NULL );
954 ok( hr == S_OK, "got %08x\n", hr );
955
956 if (0) { /* crashes on some old version */
957 hr = IAssemblyName_IsEqual( name1, NULL, 0 );
958 ok( hr == S_FALSE, "got %08x\n", hr );
959
960 hr = IAssemblyName_IsEqual( name1, NULL, ASM_CMPF_IL_ALL );
961 ok( hr == S_FALSE, "got %08x\n", hr );
962 }
963
964 hr = IAssemblyName_IsEqual( name1, name1, ASM_CMPF_IL_ALL );
965 ok( hr == S_OK, "got %08x\n", hr );
966
967 hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL );
968 ok( hr == S_OK, "got %08x\n", hr );
969
970 IAssemblyName_Release( name2 );
971 hr = pCreateAssemblyNameObject( &name2, wine2, CANOF_PARSE_DISPLAY_NAME, NULL );
972 ok( hr == S_OK, "got %08x\n", hr );
973
974 hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL );
975 ok( hr == S_OK, "got %08x\n", hr );
976
977 IAssemblyName_Release( name2 );
978 hr = pCreateAssemblyNameObject( &name2, wine3, CANOF_PARSE_DISPLAY_NAME, NULL );
979 ok( hr == S_OK, "got %08x\n", hr );
980
981 hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL );
982 ok( hr == S_OK, "got %08x\n", hr );
983
984 IAssemblyName_Release( name1 );
985 hr = pCreateAssemblyNameObject( &name1, wine4, CANOF_PARSE_DISPLAY_NAME, NULL );
986 ok( hr == S_OK, "got %08x\n", hr );
987
988 hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL );
989 ok( hr == S_FALSE, "got %08x\n", hr );
990
991 IAssemblyName_Release( name1 );
992 hr = pCreateAssemblyNameObject( &name1, wine1, CANOF_PARSE_DISPLAY_NAME, NULL );
993 ok( hr == S_OK, "got %08x\n", hr );
994
995 IAssemblyName_Release( name2 );
996 hr = pCreateAssemblyNameObject( &name2, wine5, CANOF_PARSE_DISPLAY_NAME, NULL );
997 ok( hr == S_OK, "got %08x\n", hr );
998
999 hr = IAssemblyName_IsEqual( name1, name2, ASM_CMPF_IL_ALL );
1000 ok( hr == S_OK, "got %08x\n", hr );
1001
1002 IAssemblyName_Release( name1 );
1003 IAssemblyName_Release( name2 );
1004 }
1005
1006 START_TEST(asmname)
1007 {
1008 if (!init_functionpointers())
1009 {
1010 win_skip("fusion.dll not available\n");
1011 return;
1012 }
1013
1014 test_CreateAssemblyNameObject();
1015 test_IAssemblyName_IsEqual();
1016 }