On Fri, May 04, 2018 at 01:34:32PM -0500, Sergio Gómez Del Real wrote:
This patch reworks the structure of the tests for OLE's default object handler. We want, at least, to:
- Test its behaviour when object is not running.
- Test its behaviour when is being aggregated by a custom handler.
- Test that it delegates appropriately to datacache.
- Test that it delegates appropriately to running object.
The present patch adds a local server (EXE), ands tests that some calls in some interfaces are delegated to it after calling _Run on the IRunnableObject interface.
Signed-off-by: Sergio Gómez Del Real sdelreal@codeweavers.com
dlls/ole32/tests/defaulthandler.c | 687 ++++++++++++++++++++++++++++++-------- 1 file changed, 545 insertions(+), 142 deletions(-)
diff --git a/dlls/ole32/tests/defaulthandler.c b/dlls/ole32/tests/defaulthandler.c index 60bc29c08d..776cda2eef 100644 --- a/dlls/ole32/tests/defaulthandler.c +++ b/dlls/ole32/tests/defaulthandler.c @@ -60,24 +60,31 @@ expect_ ## func = called_ ## func = FALSE; \ }while(0)
+#define CHARS_IN_GUID 39 +#define CLSID_KEY_LEN (CHARS_IN_GUID+6)
DEFINE_EXPECT(CF_QueryInterface_ClassFactory); -DEFINE_EXPECT(CF_CreateInstance); -DEFINE_EXPECT(CF_QueryInterface_IMarshal); +DEFINE_EXPECT(OleObject_Update); +DEFINE_EXPECT(PStorage_InitNew);
-static HRESULT create_storage(IStorage **stg) +struct TestClass {
- HRESULT hr;
- ILockBytes *lock_bytes;
- IUnknown IUnknown_iface;
- IOleObject IOleObject_iface;
- IDataObject IDataObject_iface;
- IPersistStorage IPersistStorage_iface;
- hr = CreateILockBytesOnHGlobal(NULL, TRUE, &lock_bytes);
- if(SUCCEEDED(hr))
- {
hr = StgCreateDocfileOnILockBytes(lock_bytes,
STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, stg);
ILockBytes_Release(lock_bytes);
- }
- return hr;
-}
- LONG ref;
- CLSID clsid;
+}; +typedef struct TestClass TestClass;
+const CLSID CLSID_Test_Server = {0x0f77e570,0x80c3,0x11e2,{0x9e,0x96,0x08,0x00,0x20,0x0c,0x9a,0x66}}; +static WCHAR clsid_key[CLSID_KEY_LEN] = {'C','L','S','I','D','\',0}; +static int wine_argc; +static char **wine_argv; +static IUnknown *dfhandler_unk; +static TestClass *test_class;
typedef struct { @@ -88,84 +95,364 @@ typedef struct DWORD moniker_size; } ole_stream_header_t;
-static void test_olestream(void) +static HRESULT WINAPI TC_IUnknown_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) {
- HRESULT hr;
- const CLSID non_existent_class = {0xa5f1772f, 0x3772, 0x490f, {0x9e, 0xc6, 0x77, 0x13, 0xe8, 0xb3, 0x4b, 0x5d}};
- IOleObject *ole_obj;
- IPersistStorage *persist;
- IStorage *stg;
- IStream *stm;
- static const WCHAR olestream[] = {1,'O','l','e',0};
- ULONG read;
- ole_stream_header_t header;
- hr = create_storage(&stg);
- ok(hr == S_OK, "got %08x\n", hr);
- hr = IStorage_OpenStream(stg, olestream, NULL, STGM_SHARE_EXCLUSIVE | STGM_READ, 0, &stm);
- ok(hr == STG_E_FILENOTFOUND, "got %08x\n", hr);
- hr = OleCreateDefaultHandler(&non_existent_class, 0, &IID_IOleObject, (void**)&ole_obj);
- ok(hr == S_OK, "got %08x\n", hr);
- hr = IOleObject_QueryInterface(ole_obj, &IID_IPersistStorage, (void**)&persist);
- ok(hr == S_OK, "got %08x\n", hr);
- hr = IPersistStorage_InitNew(persist, stg);
- ok(hr == S_OK, "got %08x\n", hr);
- hr = IStorage_OpenStream(stg, olestream, NULL, STGM_SHARE_EXCLUSIVE | STGM_READ, 0, &stm);
- ok(hr == S_OK, "got %08x\n", hr);
- hr = IStream_Read(stm, &header, sizeof(header), &read);
- ok(hr == S_OK, "got %08x\n", hr);
- ok(read == sizeof(header), "read %d\n", read);
- ok(header.version == 0x02000001, "got version %08x\n", header.version);
- ok(header.flags == 0x0, "got flags %08x\n", header.flags);
- ok(header.link_update_opt == 0x0, "got link update option %08x\n", header.link_update_opt);
- ok(header.res == 0x0, "got reserved %08x\n", header.res);
- ok(header.moniker_size == 0x0, "got moniker size %08x\n", header.moniker_size);
- IStream_Release(stm);
- IPersistStorage_Release(persist);
- IOleObject_Release(ole_obj);
- IStorage_Release(stg);
-}
-static HRESULT WINAPI test_class_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) -{
- if(IsEqualGUID(riid, &IID_IUnknown)) {
- if (IsEqualGUID(riid, &IID_IUnknown)) *ppv = iface;
return S_OK;
- }else if(IsEqualGUID(riid, &IID_IOleObject)) {
ok(0, "unexpected query for IOleObject interface\n");
- else if (IsEqualGUID(riid, &IID_IOleObject))
*ppv = &test_class->IOleObject_iface;
test_class doesn't need to be a global variable. Please use the usual impl_from_xxxx().
- else if (IsEqualGUID(riid, &IID_IDataObject))
*ppv = &test_class->IDataObject_iface;
- else if (IsEqualGUID(riid, &IID_IPersistStorage))
*ppv = &test_class->IPersistStorage_iface;
- else {
Please move the opening brace to a new line.
START_TEST(defaulthandler) {
- HRESULT hres;
- wine_argc = winetest_get_mainargs( &wine_argv );
- if (wine_argc > 2 && !strncmp(wine_argv[2], "-Embedding", strnlen(wine_argv[2], 10)))
- {
CoInitializeEx(NULL, COINIT_MULTITHREADED);
run_local_server();
CoUninitialize();
return;
- }
- OleInitialize(NULL);
- test_olestream();
- test_default_handler_run();
if (register_server() != ERROR_SUCCESS)
{
win_skip("not enough permissions to create a server CLSID key\n");
OleUninitialize();
return;
}
hres = OleCreateDefaultHandler(&CLSID_Test_Server, NULL, &IID_IUnknown, (void**)&dfhandler_unk);
ok(hres == S_OK, "OleCreateDefaultHandler failed: %x\n", hres);
if (FAILED(hres)) goto fail;
test_running_object();
I don't think you want a global dfhandle_unk, especially as you shutdown the server at the end of test_running_object().
Please check that the other global variables are necessary.
Huw.