Dmitry Timoshkov : ole32/tests: Add a test for local server interaction using an in-process handler.
Alexandre Julliard
julliard at winehq.org
Mon Jun 10 15:12:44 CDT 2013
Module: wine
Branch: master
Commit: 2daa5367f8654a2d4d889dd834cb73e04255c22b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2daa5367f8654a2d4d889dd834cb73e04255c22b
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Mon Jun 10 17:52:59 2013 +0900
ole32/tests: Add a test for local server interaction using an in-process handler.
---
dlls/ole32/tests/ole_server.c | 92 +++++++++++++++++++++++++++++++++++++---
1 files changed, 85 insertions(+), 7 deletions(-)
diff --git a/dlls/ole32/tests/ole_server.c b/dlls/ole32/tests/ole_server.c
index d6c5ccc..9cff693 100644
--- a/dlls/ole32/tests/ole_server.c
+++ b/dlls/ole32/tests/ole_server.c
@@ -55,6 +55,7 @@ static const struct
GUID_NAME(IStdMarshalInfo),
GUID_NAME(IExternalConnection),
GUID_NAME(IRunnableObject),
+ GUID_NAME(ICallFactory),
{ &CLSID_IdentityUnmarshal, "CLSID_IdentityUnmarshal" },
{ &CLSID_UnknownUnmarshal, "CLSID_UnknownUnmarshal" },
#undef GUID_NAME
@@ -276,7 +277,7 @@ static void ole_server(void)
}
/******************************* OLE client *******************************/
-static BOOL register_server(const char *server)
+static BOOL register_server(const char *server, BOOL inproc_handler)
{
static const WCHAR clsidW[] = {'C','L','S','I','D','\\',0};
DWORD ret;
@@ -296,6 +297,13 @@ static BOOL register_server(const char *server)
{
ret = RegSetValue(root, "LocalServer32", REG_SZ, server_path, strlen(server_path));
ok(ret == ERROR_SUCCESS, "RegSetValue error %u\n", ret);
+
+ if (inproc_handler)
+ {
+ ret = RegSetValue(root, "InprocHandler32", REG_SZ, "ole32.dll", 9);
+ ok(ret == ERROR_SUCCESS, "RegSetValue error %u\n", ret);
+ }
+
RegCloseKey(root);
}
@@ -316,6 +324,8 @@ static void unregister_server(void)
DELETE, NULL, &root, NULL);
if (ret == ERROR_SUCCESS)
{
+ ret = RegDeleteKey(root, "InprocHandler32");
+ ok(ret == ERROR_SUCCESS, "RegDeleteKey error %u\n", ret);
ret = RegDeleteKey(root, "LocalServer32");
ok(ret == ERROR_SUCCESS, "RegDeleteKey error %u\n", ret);
ret = RegDeleteKey(root, "");
@@ -359,6 +369,7 @@ START_TEST(ole_server)
IClassFactory *factory;
IUnknown *unknown;
IOleObject *oleobj;
+ IRunnableObject *runobj;
DWORD ret;
HANDLE mapping, done_event, init_done_event, process;
struct winetest_info *info;
@@ -396,7 +407,7 @@ START_TEST(ole_server)
return;
}
- if (!register_server(argv[0]))
+ if (!register_server(argv[0], FALSE))
{
win_skip("not enough permissions to create a server CLSID key\n");
return;
@@ -415,14 +426,81 @@ START_TEST(ole_server)
hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_HANDLER, &IID_IUnknown, (void **)&unknown);
ok(hr == REGDB_E_CLASSNOTREG, "expected REGDB_E_CLASSNOTREG, got %#x\n", hr);
- /* server supports IID_IUnknown */
+ if (!register_server(argv[0], TRUE))
+ {
+ win_skip("not enough permissions to create a server CLSID key\n");
+ unregister_server();
+ return;
+ }
+
+ trace("call CoCreateInstance(&IID_NULL)\n");
+ hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER, &IID_NULL, (void **)&unknown);
+ trace("ret CoCreateInstance(&IID_NULL)\n");
+ ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
+
+ /* in-process handler supports IID_IUnknown starting from Vista */
+ trace("call CoCreateInstance(&IID_IUnknown)\n");
+ hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_HANDLER, &IID_IUnknown, (void **)&unknown);
+ trace("ret CoCreateInstance(&IID_IUnknown)\n");
+ ok(hr == S_OK || broken(hr == REGDB_E_CLASSNOTREG) /* XP,win2000 and earlier */, "CoCreateInstance(IID_IUnknown) error %#x\n", hr);
+ if (hr != S_OK)
+ {
+ win_skip("In-process handler doesn't support IID_IUnknown on this platform\n");
+ goto test_local_server;
+ }
+
+ trace("call CoCreateInstance(&IID_IOleObject)\n");
+ hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER, &IID_IOleObject, (void **)&oleobj);
+ trace("ret CoCreateInstance(&IID_IOleObject)\n");
+ ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
+
+ trace("call IUnknown_QueryInterface(&IID_IRunnableObject)\n");
+ hr = IUnknown_QueryInterface(unknown, &IID_IRunnableObject, (void **)&runobj);
+ trace("ret IUnknown_QueryInterface(&IID_IRunnableObject)\n");
+ ok(hr == S_OK, "QueryInterface(&IID_IRunnableObject) error %#x\n", hr);
+
+ ret = IRunnableObject_IsRunning(runobj);
+ ok(!ret, "expected 0, got %d\n", ret);
+
+ trace("call OleRun\n");
+ hr = OleRun(unknown);
+ trace("ret OleRun\n");
+todo_wine
+ ok(hr == S_OK, "OleRun error %#x\n", hr);
+
+ ret = IRunnableObject_IsRunning(runobj);
+todo_wine
+ ok(ret == 1, "expected 1, got %d\n", ret);
+
+ trace("call IRunnableObject_Release\n");
+ ret = IRunnableObject_Release(runobj);
+ trace("ret IRunnableObject_Release\n");
+ ok(ret == 1, "expected ref 1, got %u\n", ret);
+
+ trace("call IUnknown_QueryInterface(&IID_IOleObject)\n");
+ hr = IUnknown_QueryInterface(unknown, &IID_IOleObject, (void **)&oleobj);
+ trace("ret IUnknown_QueryInterface(&IID_IOleObject)\n");
+ ok(hr == S_OK, "QueryInterface(&IID_IOleObject) error %#x\n", hr);
+
+ trace("call IOleObject_Release\n");
+ ret = IOleObject_Release(oleobj);
+ trace("ret IOleObject_Release\n");
+ ok(ret == 1, "expected ref 1, got %u\n", ret);
+
+ trace("call IUnknown_Release\n");
+ ret = IUnknown_Release(unknown);
+ trace("ret IUnknown_Release\n");
+ ok(!ret, "expected ref 0, got %u\n", ret);
+
+test_local_server:
+ /* local server supports IID_IUnknown */
trace("call CoCreateInstance(&IID_IUnknown)\n");
hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER, &IID_IUnknown, (void **)&unknown);
trace("ret CoCreateInstance(&IID_IUnknown)\n");
ok(hr == S_OK, "CoCreateInstance(IID_IUnknown) error %#x\n", hr);
trace("call IUnknown_QueryInterface(&IID_IRunnableObject)\n");
- hr = IUnknown_QueryInterface(unknown, &IID_IRunnableObject, (void **)&oleobj);
+ hr = IUnknown_QueryInterface(unknown, &IID_IRunnableObject, (void **)&runobj);
trace("ret IUnknown_QueryInterface(&IID_IRunnableObject)\n");
ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
@@ -446,9 +524,9 @@ START_TEST(ole_server)
trace("ret CoGetClassObject(&IID_IClassFactory)\n");
ok(hr == S_OK, "CoGetClassObject error %#x\n", hr);
- trace("call IClassFactory_QueryInterface(&IID_IOleObject)\n");
- hr = IClassFactory_QueryInterface(factory, &IID_IOleObject, (void **)&oleobj);
- trace("ret IClassFactory_QueryInterface(&IID_IOleObject)\n");
+ trace("call IClassFactory_CreateInstance(&IID_NULL)\n");
+ hr = IClassFactory_CreateInstance(factory, NULL, &IID_NULL, (void **)&oleobj);
+ trace("ret IClassFactory_CreateInstance(&IID_NULL)\n");
ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
trace("call IClassFactory_CreateInstance(&IID_IOleObject)\n");
More information about the wine-cvs
mailing list