[PATCH 5/7] mfplat/tests: Use synchronous API to get media events.
Giovanni Mascellani
gmascellani at codeweavers.com
Mon Sep 6 10:11:07 CDT 2021
An asynchronous media event request cannot be cancelled. This means that
we cannot test for no event firing within a certain timeout, because
if we did we would leave a pending thread that will spoil future tests.
Using synchronous APIs and repeated requests, we can wait for an even
with a certain timeout, without doing damages if the timeout is reached.
Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
---
dlls/mfplat/tests/mfplat.c | 106 ++++++++++++++-----------------------
1 file changed, 41 insertions(+), 65 deletions(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 90440a10c62..a18fb9256d6 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -565,77 +565,53 @@ static const IMFAsyncCallbackVtbl test_create_from_file_handler_callback_vtbl =
test_create_from_file_handler_callback_Invoke,
};
-static HRESULT WINAPI source_events_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result)
+#define get_event(a, b, c) get_event_(a, b, c, __LINE__)
+static BOOL get_event_(IMFMediaEventGenerator *generator, MediaEventType *met, PROPVARIANT *value, int line)
{
- struct test_callback *callback = impl_from_IMFAsyncCallback(iface);
- IMFMediaEventGenerator *generator;
- HRESULT hr;
-
- ok(!!result, "Unexpected result object.\n");
-
- generator = (IMFMediaEventGenerator *)IMFAsyncResult_GetStateNoAddRef(result);
-
- hr = IMFMediaEventGenerator_EndGetEvent(generator, result, &callback->media_event);
- ok(hr == S_OK, "Failed to create an object, hr %#x.\n", hr);
-
- SetEvent(callback->event);
-
- return S_OK;
-}
-
-static const IMFAsyncCallbackVtbl events_callback_vtbl =
-{
- testcallback_QueryInterface,
- testcallback_AddRef,
- testcallback_Release,
- testcallback_GetParameters,
- source_events_callback_Invoke,
-};
-
-static BOOL get_event(IMFMediaEventGenerator *generator, MediaEventType expected_event_type, PROPVARIANT *value)
-{
- struct test_callback callback = {{ 0 }};
- MediaEventType event_type;
- BOOL ret = FALSE;
+ IMFMediaEvent *event;
HRESULT hr;
+ int i;
- callback.IMFAsyncCallback_iface.lpVtbl = &events_callback_vtbl;
- callback.event = CreateEventA(NULL, FALSE, FALSE, NULL);
-
- for (;;)
+ for (i = 0; i < 10; i++)
{
- hr = IMFMediaEventGenerator_BeginGetEvent(generator, &callback.IMFAsyncCallback_iface,
- (IUnknown *)generator);
- ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
-
- if (WaitForSingleObject(callback.event, 1000) == WAIT_TIMEOUT)
- {
- ok(0, "timeout\n");
+ hr = IMFMediaEventGenerator_GetEvent(generator, MF_EVENT_FLAG_NO_WAIT, &event);
+ if (hr == S_OK)
break;
+ if (hr != MF_E_NO_EVENTS_AVAILABLE)
+ {
+ ok_(__FILE__, line)(FALSE, "Unexpected hr %#x.\n", hr);
+ return FALSE;
}
-
Sleep(10);
+ }
- hr = IMFMediaEvent_GetType(callback.media_event, &event_type);
- ok(hr == S_OK, "Failed to event type, hr %#x.\n", hr);
-
- if ((ret = (event_type == expected_event_type)))
- {
- if (value)
- {
- hr = IMFMediaEvent_GetValue(callback.media_event, value);
- ok(hr == S_OK, "Failed to get value of event, hr %#x.\n", hr);
- }
+ if (i == 10)
+ return FALSE;
- break;
- }
+ if (met)
+ {
+ hr = IMFMediaEvent_GetType(event, met);
+ ok_(__FILE__, line)(hr == S_OK, "Failed to get event type, hr %#x.\n", hr);
+ }
+ if (value)
+ {
+ hr = IMFMediaEvent_GetValue(event, value);
+ ok_(__FILE__, line)(hr == S_OK, "Failed to get event value, hr %#x.\n", hr);
}
+ IMFMediaEvent_Release(event);
- CloseHandle(callback.event);
- if (callback.media_event)
- IMFMediaEvent_Release(callback.media_event);
+ return TRUE;
+}
+
+#define expect_event(a, b, c) expect_event_(a, b, c, __LINE__)
+static BOOL expect_event_(IMFMediaEventGenerator *generator, MediaEventType expected_met, PROPVARIANT *value, int line)
+{
+ MediaEventType met;
- return ret;
+ if (!get_event_(generator, &met, value, line))
+ return FALSE;
+ ok_(__FILE__, line)(met == expected_met, "Got event %d instead of %d.\n", met, expected_met);
+ return met == expected_met;
}
static void test_source_resolver(void)
@@ -866,14 +842,14 @@ todo_wine
ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr);
video_stream = NULL;
- if (get_event((IMFMediaEventGenerator *)mediasource, MENewStream, &var))
+ if (expect_event((IMFMediaEventGenerator *)mediasource, MENewStream, &var))
{
ok(var.vt == VT_UNKNOWN, "Unexpected value type.\n");
video_stream = (IMFMediaStream *)var.punkVal;
}
- get_event((IMFMediaEventGenerator *)mediasource, MESourceStarted, NULL);
- get_event((IMFMediaEventGenerator *)video_stream, MEStreamStarted, NULL);
+ expect_event((IMFMediaEventGenerator *)mediasource, MESourceStarted, NULL);
+ expect_event((IMFMediaEventGenerator *)video_stream, MEStreamStarted, NULL);
sample_count = 10;
@@ -895,7 +871,7 @@ todo_wine
IMFSample *sample;
BOOL ret;
- ret = get_event((IMFMediaEventGenerator *)video_stream, MEMediaSample, &var);
+ ret = expect_event((IMFMediaEventGenerator *)video_stream, MEMediaSample, &var);
ok(ret, "Sample %u not received.\n", i + 1);
if (!ret)
break;
@@ -929,14 +905,14 @@ todo_wine
hr = IMFMediaStream_RequestSample(video_stream, NULL);
ok (hr == S_OK || hr == MF_E_END_OF_STREAM, "Unexpected hr %#x.\n", hr);
- get_event((IMFMediaEventGenerator *)video_stream, MEEndOfStream, NULL);
+ expect_event((IMFMediaEventGenerator *)video_stream, MEEndOfStream, NULL);
}
hr = IMFMediaStream_RequestSample(video_stream, NULL);
ok(hr == MF_E_END_OF_STREAM, "Unexpected hr %#x.\n", hr);
- get_event((IMFMediaEventGenerator *)mediasource, MEEndOfPresentation, NULL);
+ expect_event((IMFMediaEventGenerator *)mediasource, MEEndOfPresentation, NULL);
IMFMediaStream_Release(video_stream);
IMFMediaTypeHandler_Release(handler);
--
2.33.0
More information about the wine-devel
mailing list