urlmon: Moved FindMimeFromData to mimefilter.c.
[wine/multimedia.git] / dlls / mscoree / tests / debugging.c
blobbd961edc5d4c590cbdc38604b28f881fe5f05819
1 /*
2 * Copyright 2011 Alistair Leslie-Hughes
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
20 #include <stdio.h>
22 #include "windows.h"
23 #include "ole2.h"
24 #include "corerror.h"
25 #include "mscoree.h"
26 #include "corhdr.h"
28 #include "wine/test.h"
30 #include "initguid.h"
31 #include "cordebug.h"
33 static HMODULE hmscoree;
35 static HRESULT (WINAPI *pCreateDebuggingInterfaceFromVersion)(int, LPCWSTR, IUnknown **);
37 const WCHAR v2_0[] = {'v','2','.','0','.','5','0','7','2','7',0};
39 static const char *debugstr_guid(REFIID riid)
41 static char buf[50];
43 if(!riid)
44 return "(null)";
46 sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
47 riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
48 riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
49 riid->Data4[5], riid->Data4[6], riid->Data4[7]);
51 return buf;
54 static HRESULT WINAPI ManagedCallback2_QueryInterface(ICorDebugManagedCallback2 *iface, REFIID riid, void **ppv)
56 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_ICorDebugManagedCallback2, riid))
58 *ppv = iface;
59 return S_OK;
62 ok(0, "unexpected riid (%s)\n", debugstr_guid(riid));
64 *ppv = NULL;
65 return E_NOINTERFACE;
68 static ULONG WINAPI ManagedCallback2_AddRef(ICorDebugManagedCallback2 *iface)
70 return 2;
73 static ULONG WINAPI ManagedCallback2_Release(ICorDebugManagedCallback2 *iface)
75 return 1;
78 static HRESULT WINAPI ManagedCallback2_FunctionRemapOpportunity(ICorDebugManagedCallback2 *iface,
79 ICorDebugAppDomain *pAppDomain, ICorDebugThread *pThread,
80 ICorDebugFunction *pOldFunction, ICorDebugFunction *pNewFunction,
81 ULONG32 oldILOffset)
83 ok(0, "unexpected call\n");
84 return E_NOTIMPL;
87 static HRESULT WINAPI ManagedCallback2_CreateConnection(ICorDebugManagedCallback2 *iface,
88 ICorDebugProcess *pProcess, CONNID dwConnectionId, WCHAR *pConnName)
90 ok(0, "unexpected call\n");
91 return E_NOTIMPL;
94 static HRESULT WINAPI ManagedCallback2_ChangeConnection(ICorDebugManagedCallback2 *iface,
95 ICorDebugProcess *pProcess, CONNID dwConnectionId)
97 ok(0, "unexpected call\n");
98 return E_NOTIMPL;
101 static HRESULT WINAPI ManagedCallback2_DestroyConnection(ICorDebugManagedCallback2 *iface,
102 ICorDebugProcess *pProcess, CONNID dwConnectionId)
104 ok(0, "unexpected call\n");
105 return E_NOTIMPL;
108 static HRESULT WINAPI ManagedCallback2_Exception(ICorDebugManagedCallback2 *iface,
109 ICorDebugAppDomain *pAppDomain, ICorDebugThread *pThread,
110 ICorDebugFrame *pFrame, ULONG32 nOffset,
111 CorDebugExceptionCallbackType dwEventType, DWORD dwFlags)
113 ok(0, "unexpected call\n");
114 return E_NOTIMPL;
117 static HRESULT WINAPI ManagedCallback2_ExceptionUnwind(ICorDebugManagedCallback2 *iface,
118 ICorDebugAppDomain *pAppDomain, ICorDebugThread *pThread,
119 CorDebugExceptionUnwindCallbackType dwEventType, DWORD dwFlags)
121 ok(0, "unexpected call\n");
122 return E_NOTIMPL;
125 static HRESULT WINAPI ManagedCallback2_FunctionRemapComplete(ICorDebugManagedCallback2 *iface,
126 ICorDebugAppDomain *pAppDomain, ICorDebugThread *pThread,
127 ICorDebugFunction *pFunction)
129 ok(0, "unexpected call\n");
130 return E_NOTIMPL;
133 static HRESULT WINAPI ManagedCallback2_MDANotification(ICorDebugManagedCallback2 *iface,
134 ICorDebugController *pController, ICorDebugThread *pThread,
135 ICorDebugMDA *pMDA)
137 ok(0, "unexpected call\n");
138 return E_NOTIMPL;
141 static struct ICorDebugManagedCallback2Vtbl managedCallback2Vtbl = {
142 ManagedCallback2_QueryInterface,
143 ManagedCallback2_AddRef,
144 ManagedCallback2_Release,
145 ManagedCallback2_FunctionRemapOpportunity,
146 ManagedCallback2_CreateConnection,
147 ManagedCallback2_ChangeConnection,
148 ManagedCallback2_DestroyConnection,
149 ManagedCallback2_Exception,
150 ManagedCallback2_ExceptionUnwind,
151 ManagedCallback2_FunctionRemapComplete,
152 ManagedCallback2_MDANotification
155 static ICorDebugManagedCallback2 ManagedCallback2 = { &managedCallback2Vtbl };
157 static HRESULT WINAPI ManagedCallback_QueryInterface(ICorDebugManagedCallback *iface, REFIID riid, void **ppv)
159 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_ICorDebugManagedCallback, riid))
161 *ppv = iface;
162 return S_OK;
164 else if(IsEqualGUID(&IID_ICorDebugManagedCallback2, riid))
166 *ppv = (void**)&ManagedCallback2;
167 return S_OK;
170 ok(0, "unexpected riid (%s)\n", debugstr_guid(riid));
171 *ppv = NULL;
172 return E_NOINTERFACE;
175 static ULONG WINAPI ManagedCallback_AddRef(ICorDebugManagedCallback *iface)
177 return 2;
180 static ULONG WINAPI ManagedCallback_Release(ICorDebugManagedCallback *iface)
182 return 1;
185 static HRESULT WINAPI ManagedCallback_Breakpoint(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
186 ICorDebugThread *pThread, ICorDebugBreakpoint *pBreakpoint)
188 ok(0, "unexpected call\n");
189 return E_NOTIMPL;
192 static HRESULT WINAPI ManagedCallback_StepComplete(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
193 ICorDebugThread *pThread, ICorDebugStepper *pStepper, CorDebugStepReason reason)
195 ok(0, "unexpected call\n");
196 return E_NOTIMPL;
199 static HRESULT WINAPI ManagedCallback_Break(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
200 ICorDebugThread *thread)
202 ok(0, "unexpected call\n");
203 return E_NOTIMPL;
206 static HRESULT WINAPI ManagedCallback_Exception(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
207 ICorDebugThread *pThread, BOOL unhandled)
209 ok(0, "unexpected call\n");
210 return E_NOTIMPL;
213 static HRESULT WINAPI ManagedCallback_EvalComplete(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
214 ICorDebugThread *pThread, ICorDebugEval *pEval)
216 ok(0, "unexpected call\n");
217 return E_NOTIMPL;
220 static HRESULT WINAPI ManagedCallback_EvalException(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
221 ICorDebugThread *pThread, ICorDebugEval *pEval)
223 ok(0, "unexpected call\n");
224 return E_NOTIMPL;
227 static HRESULT WINAPI ManagedCallback_CreateProcess(ICorDebugManagedCallback *iface, ICorDebugProcess *pProcess)
229 ok(0, "unexpected call\n");
230 return E_NOTIMPL;
233 static HRESULT WINAPI ManagedCallback_ExitProcess(ICorDebugManagedCallback *iface, ICorDebugProcess *pProcess)
235 ok(0, "unexpected call\n");
236 return E_NOTIMPL;
239 static HRESULT WINAPI ManagedCallback_CreateThread(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
240 ICorDebugThread *thread)
242 ok(0, "unexpected call\n");
243 return E_NOTIMPL;
246 static HRESULT WINAPI ManagedCallback_ExitThread(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
247 ICorDebugThread *thread)
249 ok(0, "unexpected call\n");
250 return E_NOTIMPL;
253 static HRESULT WINAPI ManagedCallback_LoadModule(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
254 ICorDebugModule *pModule)
256 ok(0, "unexpected call\n");
257 return E_NOTIMPL;
260 static HRESULT WINAPI ManagedCallback_UnloadModule(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
261 ICorDebugModule *pModule)
263 ok(0, "unexpected call\n");
264 return E_NOTIMPL;
267 static HRESULT WINAPI ManagedCallback_LoadClass(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
268 ICorDebugClass *c)
270 ok(0, "unexpected call\n");
271 return E_NOTIMPL;
274 static HRESULT WINAPI ManagedCallback_UnloadClass(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
275 ICorDebugClass *c)
277 ok(0, "unexpected call\n");
278 return E_NOTIMPL;
281 static HRESULT WINAPI ManagedCallback_DebuggerError(ICorDebugManagedCallback *iface, ICorDebugProcess *pProcess,
282 HRESULT errorHR, DWORD errorCode)
284 ok(0, "unexpected call\n");
285 return E_NOTIMPL;
288 static HRESULT WINAPI ManagedCallback_LogMessage(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
289 ICorDebugThread *pThread, LONG lLevel, WCHAR *pLogSwitchName, WCHAR *pMessage)
291 ok(0, "unexpected call\n");
292 return E_NOTIMPL;
295 static HRESULT WINAPI ManagedCallback_LogSwitch(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
296 ICorDebugThread *pThread, LONG lLevel, ULONG ulReason,
297 WCHAR *pLogSwitchName, WCHAR *pParentName)
299 ok(0, "unexpected call\n");
300 return E_NOTIMPL;
303 static HRESULT WINAPI ManagedCallback_CreateAppDomain(ICorDebugManagedCallback *iface, ICorDebugProcess *pProcess,
304 ICorDebugAppDomain *pAppDomain)
306 ok(0, "unexpected call\n");
307 return E_NOTIMPL;
310 static HRESULT WINAPI ManagedCallback_ExitAppDomain(ICorDebugManagedCallback *iface, ICorDebugProcess *pProcess,
311 ICorDebugAppDomain *pAppDomain)
313 ok(0, "unexpected call\n");
314 return E_NOTIMPL;
317 static HRESULT WINAPI ManagedCallback_LoadAssembly(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
318 ICorDebugAssembly *pAssembly)
320 ok(0, "unexpected call\n");
321 return E_NOTIMPL;
324 static HRESULT WINAPI ManagedCallback_UnloadAssembly(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
325 ICorDebugAssembly *pAssembly)
327 ok(0, "unexpected call\n");
328 return E_NOTIMPL;
331 static HRESULT WINAPI ManagedCallback_ControlCTrap(ICorDebugManagedCallback *iface, ICorDebugProcess *pProcess)
333 ok(0, "unexpected call\n");
334 return E_NOTIMPL;
337 static HRESULT WINAPI ManagedCallback_NameChange(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
338 ICorDebugThread *pThread)
340 ok(0, "unexpected call\n");
341 return E_NOTIMPL;
344 static HRESULT WINAPI ManagedCallback_UpdateModuleSymbols(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
345 ICorDebugModule *pModule, IStream *pSymbolStream)
347 ok(0, "unexpected call\n");
348 return E_NOTIMPL;
351 static HRESULT WINAPI ManagedCallback_EditAndContinueRemap(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
352 ICorDebugThread *pThread, ICorDebugFunction *pFunction, BOOL fAccurate)
354 ok(0, "unexpected call\n");
355 return E_NOTIMPL;
358 static HRESULT WINAPI ManagedCallback_BreakpointSetError(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain,
359 ICorDebugThread *pThread, ICorDebugBreakpoint *pBreakpoint, DWORD dwError)
361 ok(0, "unexpected call\n");
362 return E_NOTIMPL;
365 static ICorDebugManagedCallbackVtbl managedCallbackVtbl = {
366 ManagedCallback_QueryInterface,
367 ManagedCallback_AddRef,
368 ManagedCallback_Release,
369 ManagedCallback_Breakpoint,
370 ManagedCallback_StepComplete,
371 ManagedCallback_Break,
372 ManagedCallback_Exception,
373 ManagedCallback_EvalComplete,
374 ManagedCallback_EvalException,
375 ManagedCallback_CreateProcess,
376 ManagedCallback_ExitProcess,
377 ManagedCallback_CreateThread,
378 ManagedCallback_ExitThread,
379 ManagedCallback_LoadModule,
380 ManagedCallback_UnloadModule,
381 ManagedCallback_LoadClass,
382 ManagedCallback_UnloadClass,
383 ManagedCallback_DebuggerError,
384 ManagedCallback_LogMessage,
385 ManagedCallback_LogSwitch,
386 ManagedCallback_CreateAppDomain,
387 ManagedCallback_ExitAppDomain,
388 ManagedCallback_LoadAssembly,
389 ManagedCallback_UnloadAssembly,
390 ManagedCallback_ControlCTrap,
391 ManagedCallback_NameChange,
392 ManagedCallback_UpdateModuleSymbols,
393 ManagedCallback_EditAndContinueRemap,
394 ManagedCallback_BreakpointSetError
397 static ICorDebugManagedCallback ManagedCallback = { &managedCallbackVtbl };
399 static BOOL init_functionpointers(void)
401 hmscoree = LoadLibraryA("mscoree.dll");
403 if (!hmscoree)
405 win_skip("mscoree.dll not available\n");
406 return FALSE;
409 pCreateDebuggingInterfaceFromVersion = (void *)GetProcAddress(hmscoree, "CreateDebuggingInterfaceFromVersion");
411 if (!pCreateDebuggingInterfaceFromVersion)
413 win_skip("functions not available\n");
414 FreeLibrary(hmscoree);
415 return FALSE;
418 return TRUE;
421 #define check_process_enum(core, e) _check_process_enum(__LINE__, core, e)
422 static void _check_process_enum(unsigned line, ICorDebug *pCorDebug, ULONG nExpected)
424 HRESULT hr;
425 ICorDebugProcessEnum *pProcessEnum = NULL;
427 hr = ICorDebug_EnumerateProcesses(pCorDebug, NULL);
428 ok_(__FILE__,line) (hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr);
430 hr = ICorDebug_EnumerateProcesses(pCorDebug, &pProcessEnum);
431 ok_(__FILE__,line) (hr == S_OK, "expected S_OK got %08x\n", hr);
432 if(hr == S_OK)
434 ULONG cnt;
436 hr = ICorDebugProcessEnum_GetCount(pProcessEnum, &cnt);
437 ok_(__FILE__,line) (hr == S_OK, "expected S_OK got %08x\n", hr);
438 ok_(__FILE__,line) (cnt == nExpected, "expected %d got %d\n", nExpected, cnt);
440 ICorDebugProcessEnum_Release(pProcessEnum);
444 static void test_createDebugger(void)
446 HRESULT hr;
447 IUnknown *pUnk;
448 ICorDebug *pCorDebug;
450 hr = pCreateDebuggingInterfaceFromVersion(0, v2_0, &pUnk);
451 ok(hr == E_INVALIDARG, "CreateDebuggingInterfaceFromVersion returned %08x\n", hr);
453 hr = pCreateDebuggingInterfaceFromVersion(1, v2_0, &pUnk);
454 ok(hr == E_INVALIDARG, "CreateDebuggingInterfaceFromVersion returned %08x\n", hr);
456 hr = pCreateDebuggingInterfaceFromVersion(2, v2_0, &pUnk);
457 ok(hr == E_INVALIDARG, "CreateDebuggingInterfaceFromVersion returned %08x\n", hr);
459 hr = pCreateDebuggingInterfaceFromVersion(4, v2_0, &pUnk);
460 ok(hr == E_INVALIDARG, "CreateDebuggingInterfaceFromVersion returned %08x\n", hr);
462 hr = pCreateDebuggingInterfaceFromVersion(3, v2_0, NULL);
463 ok(hr == E_INVALIDARG, "CreateDebuggingInterfaceFromVersion returned %08x\n", hr);
465 hr = pCreateDebuggingInterfaceFromVersion(3, v2_0, &pUnk);
466 if(hr == S_OK)
468 hr = IUnknown_QueryInterface(pUnk, &IID_ICorDebug, (void**)&pCorDebug);
469 ok(hr == S_OK, "expected S_OK got %08x\n", hr);
470 if(hr == S_OK)
472 hr = ICorDebug_Initialize(pCorDebug);
473 ok(hr == S_OK, "expected S_OK got %08x\n", hr);
474 if(hr == S_OK)
476 hr = ICorDebug_SetManagedHandler(pCorDebug, NULL);
477 ok(hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr);
479 hr = ICorDebug_SetManagedHandler(pCorDebug, &ManagedCallback);
480 ok(hr == S_OK, "expected S_OK got %08x\n", hr);
482 /* We should have no processes */
483 check_process_enum(pCorDebug, 0);
486 ICorDebug_Release(pCorDebug);
488 IUnknown_Release(pUnk);
490 else
492 skip(".NET 2.0 or mono not installed.\n");
496 START_TEST(debugging)
498 CoInitialize(NULL);
500 if (!init_functionpointers())
501 return;
503 test_createDebugger();
505 FreeLibrary(hmscoree);
506 CoUninitialize();