[PATCH 5/5] qcap/tests: Add COM tests for VfwCapture.
Michael Stefaniuc
mstefani at redhat.de
Mon Jul 27 02:33:08 CDT 2015
---
dlls/qcap/tests/qcap.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 140 insertions(+)
diff --git a/dlls/qcap/tests/qcap.c b/dlls/qcap/tests/qcap.c
index 83d1339..7fd48ef 100644
--- a/dlls/qcap/tests/qcap.c
+++ b/dlls/qcap/tests/qcap.c
@@ -1850,6 +1850,145 @@ static void test_AviCo(void)
IBaseFilter_Release(avico);
}
+/* Outer IUnknown for COM aggregation tests */
+struct unk_impl {
+ IUnknown IUnknown_iface;
+ LONG ref;
+ IUnknown *inner_unk;
+};
+
+static inline struct unk_impl *impl_from_IUnknown(IUnknown *iface)
+{
+ return CONTAINING_RECORD(iface, struct unk_impl, IUnknown_iface);
+}
+
+static HRESULT WINAPI unk_QueryInterface(IUnknown *iface, REFIID riid, void **ret_iface)
+{
+ struct unk_impl *This = impl_from_IUnknown(iface);
+
+ return IUnknown_QueryInterface(This->inner_unk, riid, ret_iface);
+}
+
+static ULONG WINAPI unk_AddRef(IUnknown *iface)
+{
+ struct unk_impl *This = impl_from_IUnknown(iface);
+
+ return InterlockedIncrement(&This->ref);
+}
+
+static ULONG WINAPI unk_Release(IUnknown *iface)
+{
+ struct unk_impl *This = impl_from_IUnknown(iface);
+
+ return InterlockedDecrement(&This->ref);
+}
+
+static const IUnknownVtbl unk_vtbl =
+{
+ unk_QueryInterface,
+ unk_AddRef,
+ unk_Release
+};
+
+static void test_COM_vfwcapture(void)
+{
+ struct unk_impl unk_obj = {{&unk_vtbl}, 19, NULL};
+ IBaseFilter *bf;
+ IMediaFilter *mf;
+ IPersist *p;
+ IPersistPropertyBag *ppb;
+ IAMVfwCaptureDialogs *amvcd;
+ IAMFilterMiscFlags *amfmf;
+ ISpecifyPropertyPages *spp;
+ IUnknown *unk;
+ ULONG refcount;
+ HRESULT hr;
+
+ /* COM aggregation */
+ hr = CoCreateInstance(&CLSID_VfwCapture, &unk_obj.IUnknown_iface, CLSCTX_INPROC_SERVER,
+ &IID_IUnknown, (void**)&unk_obj.inner_unk);
+ ok(hr == S_OK, "VfwCapture create failed: %08x\n", hr);
+ hr = IUnknown_QueryInterface(unk_obj.inner_unk, &IID_IBaseFilter, (void**)&bf);
+ ok(hr == S_OK, "QueryInterface for IID_IBaseFilter failed: %08x\n", hr);
+ refcount = IBaseFilter_AddRef(bf);
+ ok(refcount == unk_obj.ref, "VfwCapture just pretends to support COM aggregation\n");
+ refcount = IBaseFilter_Release(bf);
+ ok(refcount == unk_obj.ref, "VfwCapture just pretends to support COM aggregation\n");
+ refcount = IBaseFilter_Release(bf);
+ ok(refcount == 19, "Refcount should be back at 19 but is %u\n", refcount);
+ IUnknown_Release(unk_obj.inner_unk);
+
+ /* Invalid RIID */
+ hr = CoCreateInstance(&CLSID_VfwCapture, NULL, CLSCTX_INPROC_SERVER, &IID_IClassFactory,
+ (void**)&bf);
+ ok(hr == E_NOINTERFACE, "VfwCapture create failed: %08x, expected E_NOINTERFACE\n", hr);
+
+ /* Same refcount for all VfwCapture interfaces */
+ hr = CoCreateInstance(&CLSID_VfwCapture, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter,
+ (void**)&bf);
+ ok(hr == S_OK, "VfwCapture create failed: %08x, expected S_OK\n", hr);
+ refcount = IBaseFilter_AddRef(bf);
+ ok(refcount == 2, "refcount == %u, expected 2\n", refcount);
+
+ hr = IBaseFilter_QueryInterface(bf, &IID_IMediaFilter, (void**)&mf);
+ ok(hr == S_OK, "QueryInterface for IID_IMediaFilter failed: %08x\n", hr);
+ refcount = IMediaFilter_AddRef(mf);
+ ok(refcount == 4, "refcount == %u, expected 4\n", refcount);
+ refcount = IMediaFilter_Release(mf);
+
+ hr = IBaseFilter_QueryInterface(bf, &IID_IPersist, (void**)&p);
+ ok(hr == S_OK, "QueryInterface for IID_IPersist failed: %08x\n", hr);
+ refcount = IPersist_AddRef(p);
+ ok(refcount == 5, "refcount == %u, expected 5\n", refcount);
+ refcount = IPersist_Release(p);
+
+ hr = IBaseFilter_QueryInterface(bf, &IID_IPersistPropertyBag, (void**)&ppb);
+ ok(hr == S_OK, "QueryInterface for IID_IPersistPropertyBag failed: %08x\n", hr);
+ refcount = IPersistPropertyBag_AddRef(ppb);
+ ok(refcount == 6, "refcount == %u, expected 6\n", refcount);
+ refcount = IPersistPropertyBag_Release(ppb);
+
+ hr = IBaseFilter_QueryInterface(bf, &IID_IAMVfwCaptureDialogs, (void**)&amvcd);
+ todo_wine ok(hr == S_OK, "QueryInterface for IID_IAMVfwCaptureDialogs failed: %08x\n", hr);
+ if (hr == S_OK) {
+ refcount = IAMVfwCaptureDialogs_AddRef(amvcd);
+ ok(refcount == 7, "refcount == %u, expected 7\n", refcount);
+ refcount = IAMVfwCaptureDialogs_Release(amvcd);
+ }
+
+ hr = IBaseFilter_QueryInterface(bf, &IID_IAMFilterMiscFlags, (void**)&amfmf);
+ todo_wine ok(hr == S_OK, "QueryInterface for IID_IAMFilterMiscFlags failed: %08x\n", hr);
+ if (hr == S_OK) {
+ refcount = IAMFilterMiscFlags_AddRef(amfmf);
+ ok(refcount == 8, "refcount == %u, expected 8\n", refcount);
+ refcount = IAMFilterMiscFlags_Release(amfmf);
+ }
+
+ hr = IBaseFilter_QueryInterface(bf, &IID_ISpecifyPropertyPages, (void**)&spp);
+ todo_wine ok(hr == S_OK, "QueryInterface for IID_ISpecifyPropertyPages failed: %08x\n", hr);
+ if (hr == S_OK) {
+ refcount = ISpecifyPropertyPages_AddRef(spp);
+ ok(refcount == 9, "refcount == %u, expected 9\n", refcount);
+ refcount = ISpecifyPropertyPages_Release(spp);
+ }
+
+ hr = IBaseFilter_QueryInterface(bf, &IID_IUnknown, (void**)&unk);
+ ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr);
+ refcount = IUnknown_AddRef(unk);
+ todo_wine ok(refcount == 10, "refcount == %u, expected 10\n", refcount);
+ refcount = IUnknown_Release(unk);
+
+ /* Unsupported interfaces */
+ hr = IBaseFilter_QueryInterface(bf, &IID_IAMStreamConfig, (void**)&unk);
+ todo_wine ok(hr == E_NOINTERFACE, "QueryInterface for IID_IAMStreamConfig failed: %08x\n", hr);
+ hr = IBaseFilter_QueryInterface(bf, &IID_IAMVideoProcAmp, (void**)&unk);
+ todo_wine ok(hr == E_NOINTERFACE, "QueryInterface for IID_IAMVideoProcAmp failed: %08x\n", hr);
+ hr = IBaseFilter_QueryInterface(bf, &IID_IOverlayNotify, (void**)&unk);
+ ok(hr == E_NOINTERFACE, "QueryInterface for IID_IOverlayNotify failed: %08x\n", hr);
+
+ while (IBaseFilter_Release(bf));
+}
+
START_TEST(qcap)
{
if (SUCCEEDED(CoInitialize(NULL)))
@@ -1862,6 +2001,7 @@ START_TEST(qcap)
test_AviMux_QueryInterface();
test_AviMux(arg_c>2 ? arg_v[2] : NULL);
test_AviCo();
+ test_COM_vfwcapture();
CoUninitialize();
}
--
2.1.0
More information about the wine-patches
mailing list