From: Zebediah Figura Subject: Re: [PATCH] qcap: implement VfwPin_CheckMediaType(), and test connecting to a NullRenderer Message-Id: <45699c6a-e56c-b0d7-bdf6-fe9e4d7126d3@gmail.com> Date: Mon, 22 Apr 2019 16:05:57 -0500 In-Reply-To: References: On 4/22/19 2:40 AM, Damjan Jovanovic wrote: > +static void test_connect_null_renderer(IBaseFilter *captureDevice) > +{ > + IGraphBuilder *graph = NULL; > + IBaseFilter *nullRenderer = NULL; > + IPin *captureDeviceOut = NULL; > + IPin *nullRendererIn = NULL; > + HRESULT hr; > + > + hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IGraphBuilder, > + (LPVOID*)&graph); > + ok(SUCCEEDED(hr), "couldn't create graph builder, hr=0x%08x\n", hr); > + if (FAILED(hr)) > + goto end; > + > + hr = CoCreateInstance(&CLSID_NullRenderer, NULL, CLSCTX_INPROC_SERVER, > + &IID_IBaseFilter, (LPVOID*)&nullRenderer); > + ok(SUCCEEDED(hr) || > + /* Windows 2008: http://stackoverflow.com/questions/29410348/initialize-nullrender-failed-with-error-regdb-e-classnotreg-on-win2008-r2 */ > + broken(hr == REGDB_E_CLASSNOTREG), "couldn't create NullRenderer, hr=0x%08x\n", hr); > + if (FAILED(hr)) > + goto end; > + hr = IGraphBuilder_AddFilter(graph, nullRenderer, NULL); > + ok(SUCCEEDED(hr), "IGraphBuilder_AddFilter() failed, hr=0x%08x\n", hr); > + if (FAILED(hr)) > + goto end; > + > + hr = IGraphBuilder_AddFilter(graph, captureDevice, NULL); > + ok(SUCCEEDED(hr), "IGraphBuilder_AddFilter() failed, hr=0x%08x\n", hr); > + if (FAILED(hr)) > + goto end; > + > + hr = find_pin(nullRenderer, PINDIR_INPUT, &nullRendererIn); > + ok(hr == S_OK, "couldn't find NullRenderer input pin, hr=0x%08x\n", hr); > + if (hr != S_OK) > + goto end; > + > + hr = find_pin(captureDevice, PINDIR_OUTPUT, &captureDeviceOut); > + ok(hr == S_OK, "couldn't find capture device output pin, hr=0x%08x\n", hr); > + if (hr != S_OK) > + goto end; > + > + hr = IGraphBuilder_Connect(graph, captureDeviceOut, nullRendererIn); > + ok(SUCCEEDED(hr), "couldn't connect capture device to NullRenderer, hr=0x%08x\n", hr); > + > +end: > + if (graph != NULL) > + IGraphBuilder_Release(graph); > + if (nullRenderer != NULL) > + IBaseFilter_Release(nullRenderer); > + if (captureDeviceOut != NULL) > + IPin_Release(captureDeviceOut); > + if (nullRendererIn != NULL) > + IPin_Release(nullRendererIn); > +} > + This is not especially convincing. I know that we can't really test individual formats, given that devices themselves are going to vary, and I know also that you're using the same logic as is already present in IAMStreamConfig::SetFormat(), but it would be nice to test that IPin::QueryAccept() accepts formats returned by IEnumMediaTypes (if any) and by IAMStreamConfig::GetFormat() and IAMStreamConfig::GetStreamCaps() and rejects formats which are malformed, or use a major type other than MEDIATYPE_Video or GUID_NULL, or use a format type other than FORMAT_VideoInfo or FORMAT_NULL, etc. Stylistically I'd prefer if you'd use the same style as the quartz tests I've been recently adding. This means e.g. not using camel case, avoiding LPJUNK typedefs, braces on a new line, messages and comments formatted with consistent wording and period. Additionally I'd prefer that you test for S_OK where possible rather than using SUCCEEDED(), and omit superfluous failure paths where we expect success. > diff --git a/dlls/qcap/tests/Makefile.in b/dlls/qcap/tests/Makefile.in > index 2b988476ad..a5b9d0e474 100644 > --- a/dlls/qcap/tests/Makefile.in > +++ b/dlls/qcap/tests/Makefile.in > @@ -5,4 +5,5 @@ C_SRCS = \ > audiorecord.c \ > avico.c \ > qcap.c \ > - smartteefilter.c > + smartteefilter.c \ > + videocapture.c As long as these tests are aimed towards the WDM video capture filter rather than the VFW capture filter, I'd prefer a name like wdmcapture.c.