Zebediah Figura : quartz/tests: Add some tests for IFilterGraph_ConnectDirect() and IFilterGraph_Disconnect().

Alexandre Julliard julliard at winehq.org
Thu Sep 20 13:45:34 CDT 2018


Module: wine
Branch: master
Commit: 54843d8fbfd2bd6d8501bf8d7bbebdc4b2808fc8
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=54843d8fbfd2bd6d8501bf8d7bbebdc4b2808fc8

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Thu Sep 20 10:36:16 2018 -0500

quartz/tests: Add some tests for IFilterGraph_ConnectDirect() and IFilterGraph_Disconnect().

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/quartz/tests/filtergraph.c | 184 ++++++++++++++++++++++++++++++++++++----
 1 file changed, 168 insertions(+), 16 deletions(-)

diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c
index 5035f80..b1059ca 100644
--- a/dlls/quartz/tests/filtergraph.c
+++ b/dlls/quartz/tests/filtergraph.c
@@ -767,6 +767,7 @@ struct testpin
     PIN_DIRECTION dir;
     IBaseFilter *filter;
     IPin *peer;
+    AM_MEDIA_TYPE *mt;
 
     IEnumMediaTypes IEnumMediaTypes_iface;
     const AM_MEDIA_TYPE *types;
@@ -991,7 +992,19 @@ static HRESULT WINAPI testpin_EndOfStream(IPin *iface)
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI testsink_Connect(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
+static HRESULT WINAPI no_Connect(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
+{
+    ok(0, "Unexpected call.\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI no_ReceiveConnection(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
+{
+    ok(0, "Unexpected call.\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI no_EnumMediaTypes(IPin *iface, IEnumMediaTypes **out)
 {
     ok(0, "Unexpected call.\n");
     return E_NOTIMPL;
@@ -1007,18 +1020,12 @@ static HRESULT WINAPI testsink_ReceiveConnection(IPin *iface, IPin *peer, const
     return S_OK;
 }
 
-static HRESULT WINAPI testsink_EnumMediaTypes(IPin *iface, IEnumMediaTypes **out)
-{
-    ok(0, "Unexpected call.\n");
-    return E_NOTIMPL;
-}
-
 static const IPinVtbl testsink_vtbl =
 {
     testpin_QueryInterface,
     testpin_AddRef,
     testpin_Release,
-    testsink_Connect,
+    no_Connect,
     testsink_ReceiveConnection,
     testpin_Disconnect,
     testpin_ConnectedTo,
@@ -1027,7 +1034,7 @@ static const IPinVtbl testsink_vtbl =
     testpin_QueryDirection,
     testpin_QueryId,
     testpin_QueryAccept,
-    testsink_EnumMediaTypes,
+    no_EnumMediaTypes,
     testpin_QueryInternalConnections,
     testpin_EndOfStream,
     testpin_BeginFlush,
@@ -1057,19 +1064,13 @@ static HRESULT WINAPI testsource_Connect(IPin *iface, IPin *peer, const AM_MEDIA
     return IPin_ReceiveConnection(peer, &pin->IPin_iface, mt);
 }
 
-static HRESULT WINAPI testsource_ReceiveConnection(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
-{
-    ok(0, "Unexpected call.\n");
-    return E_NOTIMPL;
-}
-
 static const IPinVtbl testsource_vtbl =
 {
     testpin_QueryInterface,
     testpin_AddRef,
     testpin_Release,
     testsource_Connect,
-    testsource_ReceiveConnection,
+    no_ReceiveConnection,
     testpin_Disconnect,
     testpin_ConnectedTo,
     testpin_ConnectionMediaType,
@@ -1864,6 +1865,156 @@ static void test_add_remove_filter(void)
     ok(filter.ref == 1, "Got outstanding refcount %d.\n", filter.ref);
 }
 
+static HRESULT WINAPI test_connect_direct_Connect(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
+{
+    struct testpin *pin = impl_from_IPin(iface);
+    if (winetest_debug > 1) trace("%p->Connect()\n", pin);
+
+    pin->peer = peer;
+    IPin_AddRef(peer);
+    pin->mt = (AM_MEDIA_TYPE *)mt;
+    return S_OK;
+}
+
+static const IPinVtbl test_connect_direct_vtbl =
+{
+    testpin_QueryInterface,
+    testpin_AddRef,
+    testpin_Release,
+    test_connect_direct_Connect,
+    no_ReceiveConnection,
+    testpin_Disconnect,
+    testpin_ConnectedTo,
+    testpin_ConnectionMediaType,
+    testpin_QueryPinInfo,
+    testpin_QueryDirection,
+    testpin_QueryId,
+    testpin_QueryAccept,
+    no_EnumMediaTypes,
+    testpin_QueryInternalConnections,
+    testpin_EndOfStream,
+    testpin_BeginFlush,
+    testpin_EndFlush,
+    testpin_NewSegment
+};
+
+static void test_connect_direct_init(struct testpin *pin, PIN_DIRECTION dir)
+{
+    memset(pin, 0, sizeof(*pin));
+    pin->IPin_iface.lpVtbl = &test_connect_direct_vtbl;
+    pin->ref = 1;
+    pin->dir = dir;
+}
+
+static void test_connect_direct(void)
+{
+    struct testpin source_pin, sink_pin;
+    struct testfilter source, sink;
+
+    IFilterGraph2 *graph = create_graph();
+    AM_MEDIA_TYPE mt;
+    HRESULT hr;
+
+    test_connect_direct_init(&source_pin, PINDIR_OUTPUT);
+    test_connect_direct_init(&sink_pin, PINDIR_INPUT);
+    testfilter_init(&source, &source_pin, 1);
+    testfilter_init(&sink, &sink_pin, 1);
+
+    hr = IFilterGraph2_AddFilter(graph, &source.IBaseFilter_iface, NULL);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IFilterGraph2_AddFilter(graph, &sink.IBaseFilter_iface, NULL);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IFilterGraph2_ConnectDirect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface, NULL);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer);
+    ok(!source_pin.mt, "Got mt %p.\n", source_pin.mt);
+    ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer);
+
+    hr = IFilterGraph2_Disconnect(graph, &sink_pin.IPin_iface);
+    ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+    ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer);
+    ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer);
+
+    hr = IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer);
+    ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer);
+
+    /* Swap the pins when connecting. */
+    hr = IFilterGraph2_ConnectDirect(graph, &sink_pin.IPin_iface, &source_pin.IPin_iface, NULL);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+todo_wine
+    ok(sink_pin.peer == &source_pin.IPin_iface, "Got peer %p.\n", sink_pin.peer);
+    ok(!sink_pin.mt, "Got mt %p.\n", sink_pin.mt);
+todo_wine
+    ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer);
+
+    hr = IFilterGraph2_Disconnect(graph, &sink_pin.IPin_iface);
+todo_wine
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+todo_wine
+    ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer);
+    ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer);
+
+    /* Disconnect() does not disconnect the peer. */
+    hr = IFilterGraph2_ConnectDirect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface, NULL);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer);
+    ok(!source_pin.mt, "Got mt %p.\n", source_pin.mt);
+    ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer);
+
+    sink_pin.peer = &source_pin.IPin_iface;
+    IPin_AddRef(sink_pin.peer);
+
+    hr = IFilterGraph2_Disconnect(graph, &sink_pin.IPin_iface);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer);
+    ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer);
+
+    hr = IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer);
+    ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer);
+
+    /* Test specifying the media type. */
+    hr = IFilterGraph2_ConnectDirect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface, &mt);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer);
+    ok(source_pin.mt == &mt, "Got mt %p.\n", source_pin.mt);
+    ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer);
+
+    /* Both pins are disconnected when a filter is removed. */
+    sink_pin.peer = &source_pin.IPin_iface;
+    IPin_AddRef(sink_pin.peer);
+    hr = IFilterGraph2_RemoveFilter(graph, &source.IBaseFilter_iface);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer);
+    ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer);
+
+    /* Or when the graph is destroyed. */
+    hr = IFilterGraph2_AddFilter(graph, &source.IBaseFilter_iface, NULL);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IFilterGraph2_ConnectDirect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface, NULL);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer);
+    ok(!source_pin.mt, "Got mt %p.\n", source_pin.mt);
+    ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer);
+    IPin_AddRef(sink_pin.peer = &source_pin.IPin_iface);
+
+    hr = IFilterGraph2_Release(graph);
+    ok(!hr, "Got outstanding refcount %d.\n", hr);
+    ok(source.ref == 1, "Got outstanding refcount %d.\n", source.ref);
+    ok(sink.ref == 1, "Got outstanding refcount %d.\n", sink.ref);
+    ok(source_pin.ref == 1, "Got outstanding refcount %d.\n", source_pin.ref);
+todo_wine
+    ok(sink_pin.ref == 1, "Got outstanding refcount %d.\n", sink_pin.ref);
+    ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer);
+    ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer);
+}
+
 START_TEST(filtergraph)
 {
     CoInitializeEx(NULL, COINIT_MULTITHREADED);
@@ -1876,6 +2027,7 @@ START_TEST(filtergraph)
     test_aggregate_filter_graph();
     test_control_delegation();
     test_add_remove_filter();
+    test_connect_direct();
 
     CoUninitialize();
     test_render_with_multithread();




More information about the wine-cvs mailing list