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
28 #include "wine/test.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
)
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]);
54 static HRESULT WINAPI
ManagedCallback2_QueryInterface(ICorDebugManagedCallback2
*iface
, REFIID riid
, void **ppv
)
56 if(IsEqualGUID(&IID_IUnknown
, riid
) || IsEqualGUID(&IID_ICorDebugManagedCallback2
, riid
))
62 ok(0, "unexpected riid (%s)\n", debugstr_guid(riid
));
68 static ULONG WINAPI
ManagedCallback2_AddRef(ICorDebugManagedCallback2
*iface
)
73 static ULONG WINAPI
ManagedCallback2_Release(ICorDebugManagedCallback2
*iface
)
78 static HRESULT WINAPI
ManagedCallback2_FunctionRemapOpportunity(ICorDebugManagedCallback2
*iface
,
79 ICorDebugAppDomain
*pAppDomain
, ICorDebugThread
*pThread
,
80 ICorDebugFunction
*pOldFunction
, ICorDebugFunction
*pNewFunction
,
83 ok(0, "unexpected call\n");
87 static HRESULT WINAPI
ManagedCallback2_CreateConnection(ICorDebugManagedCallback2
*iface
,
88 ICorDebugProcess
*pProcess
, CONNID dwConnectionId
, WCHAR
*pConnName
)
90 ok(0, "unexpected call\n");
94 static HRESULT WINAPI
ManagedCallback2_ChangeConnection(ICorDebugManagedCallback2
*iface
,
95 ICorDebugProcess
*pProcess
, CONNID dwConnectionId
)
97 ok(0, "unexpected call\n");
101 static HRESULT WINAPI
ManagedCallback2_DestroyConnection(ICorDebugManagedCallback2
*iface
,
102 ICorDebugProcess
*pProcess
, CONNID dwConnectionId
)
104 ok(0, "unexpected call\n");
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");
117 static HRESULT WINAPI
ManagedCallback2_ExceptionUnwind(ICorDebugManagedCallback2
*iface
,
118 ICorDebugAppDomain
*pAppDomain
, ICorDebugThread
*pThread
,
119 CorDebugExceptionUnwindCallbackType dwEventType
, DWORD dwFlags
)
121 ok(0, "unexpected call\n");
125 static HRESULT WINAPI
ManagedCallback2_FunctionRemapComplete(ICorDebugManagedCallback2
*iface
,
126 ICorDebugAppDomain
*pAppDomain
, ICorDebugThread
*pThread
,
127 ICorDebugFunction
*pFunction
)
129 ok(0, "unexpected call\n");
133 static HRESULT WINAPI
ManagedCallback2_MDANotification(ICorDebugManagedCallback2
*iface
,
134 ICorDebugController
*pController
, ICorDebugThread
*pThread
,
137 ok(0, "unexpected call\n");
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
))
164 else if(IsEqualGUID(&IID_ICorDebugManagedCallback2
, riid
))
166 *ppv
= (void**)&ManagedCallback2
;
170 ok(0, "unexpected riid (%s)\n", debugstr_guid(riid
));
172 return E_NOINTERFACE
;
175 static ULONG WINAPI
ManagedCallback_AddRef(ICorDebugManagedCallback
*iface
)
180 static ULONG WINAPI
ManagedCallback_Release(ICorDebugManagedCallback
*iface
)
185 static HRESULT WINAPI
ManagedCallback_Breakpoint(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
186 ICorDebugThread
*pThread
, ICorDebugBreakpoint
*pBreakpoint
)
188 ok(0, "unexpected call\n");
192 static HRESULT WINAPI
ManagedCallback_StepComplete(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
193 ICorDebugThread
*pThread
, ICorDebugStepper
*pStepper
, CorDebugStepReason reason
)
195 ok(0, "unexpected call\n");
199 static HRESULT WINAPI
ManagedCallback_Break(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
200 ICorDebugThread
*thread
)
202 ok(0, "unexpected call\n");
206 static HRESULT WINAPI
ManagedCallback_Exception(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
207 ICorDebugThread
*pThread
, BOOL unhandled
)
209 ok(0, "unexpected call\n");
213 static HRESULT WINAPI
ManagedCallback_EvalComplete(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
214 ICorDebugThread
*pThread
, ICorDebugEval
*pEval
)
216 ok(0, "unexpected call\n");
220 static HRESULT WINAPI
ManagedCallback_EvalException(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
221 ICorDebugThread
*pThread
, ICorDebugEval
*pEval
)
223 ok(0, "unexpected call\n");
227 static HRESULT WINAPI
ManagedCallback_CreateProcess(ICorDebugManagedCallback
*iface
, ICorDebugProcess
*pProcess
)
229 ok(0, "unexpected call\n");
233 static HRESULT WINAPI
ManagedCallback_ExitProcess(ICorDebugManagedCallback
*iface
, ICorDebugProcess
*pProcess
)
235 ok(0, "unexpected call\n");
239 static HRESULT WINAPI
ManagedCallback_CreateThread(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
240 ICorDebugThread
*thread
)
242 ok(0, "unexpected call\n");
246 static HRESULT WINAPI
ManagedCallback_ExitThread(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
247 ICorDebugThread
*thread
)
249 ok(0, "unexpected call\n");
253 static HRESULT WINAPI
ManagedCallback_LoadModule(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
254 ICorDebugModule
*pModule
)
256 ok(0, "unexpected call\n");
260 static HRESULT WINAPI
ManagedCallback_UnloadModule(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
261 ICorDebugModule
*pModule
)
263 ok(0, "unexpected call\n");
267 static HRESULT WINAPI
ManagedCallback_LoadClass(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
270 ok(0, "unexpected call\n");
274 static HRESULT WINAPI
ManagedCallback_UnloadClass(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
277 ok(0, "unexpected call\n");
281 static HRESULT WINAPI
ManagedCallback_DebuggerError(ICorDebugManagedCallback
*iface
, ICorDebugProcess
*pProcess
,
282 HRESULT errorHR
, DWORD errorCode
)
284 ok(0, "unexpected call\n");
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");
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");
303 static HRESULT WINAPI
ManagedCallback_CreateAppDomain(ICorDebugManagedCallback
*iface
, ICorDebugProcess
*pProcess
,
304 ICorDebugAppDomain
*pAppDomain
)
306 ok(0, "unexpected call\n");
310 static HRESULT WINAPI
ManagedCallback_ExitAppDomain(ICorDebugManagedCallback
*iface
, ICorDebugProcess
*pProcess
,
311 ICorDebugAppDomain
*pAppDomain
)
313 ok(0, "unexpected call\n");
317 static HRESULT WINAPI
ManagedCallback_LoadAssembly(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
318 ICorDebugAssembly
*pAssembly
)
320 ok(0, "unexpected call\n");
324 static HRESULT WINAPI
ManagedCallback_UnloadAssembly(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
325 ICorDebugAssembly
*pAssembly
)
327 ok(0, "unexpected call\n");
331 static HRESULT WINAPI
ManagedCallback_ControlCTrap(ICorDebugManagedCallback
*iface
, ICorDebugProcess
*pProcess
)
333 ok(0, "unexpected call\n");
337 static HRESULT WINAPI
ManagedCallback_NameChange(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
338 ICorDebugThread
*pThread
)
340 ok(0, "unexpected call\n");
344 static HRESULT WINAPI
ManagedCallback_UpdateModuleSymbols(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
345 ICorDebugModule
*pModule
, IStream
*pSymbolStream
)
347 ok(0, "unexpected call\n");
351 static HRESULT WINAPI
ManagedCallback_EditAndContinueRemap(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
352 ICorDebugThread
*pThread
, ICorDebugFunction
*pFunction
, BOOL fAccurate
)
354 ok(0, "unexpected call\n");
358 static HRESULT WINAPI
ManagedCallback_BreakpointSetError(ICorDebugManagedCallback
*iface
, ICorDebugAppDomain
*pAppDomain
,
359 ICorDebugThread
*pThread
, ICorDebugBreakpoint
*pBreakpoint
, DWORD dwError
)
361 ok(0, "unexpected call\n");
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");
405 win_skip("mscoree.dll not available\n");
409 pCreateDebuggingInterfaceFromVersion
= (void *)GetProcAddress(hmscoree
, "CreateDebuggingInterfaceFromVersion");
411 if (!pCreateDebuggingInterfaceFromVersion
)
413 win_skip("functions not available\n");
414 FreeLibrary(hmscoree
);
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
)
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
);
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)
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
);
468 hr
= IUnknown_QueryInterface(pUnk
, &IID_ICorDebug
, (void**)&pCorDebug
);
469 ok(hr
== S_OK
, "expected S_OK got %08x\n", hr
);
472 hr
= ICorDebug_Initialize(pCorDebug
);
473 ok(hr
== S_OK
, "expected S_OK got %08x\n", hr
);
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
);
492 skip(".NET 2.0 or mono not installed.\n");
496 START_TEST(debugging
)
500 if (!init_functionpointers())
503 test_createDebugger();
505 FreeLibrary(hmscoree
);