[PATCH 06/10] mfplat/tests: Add some tests for serial queues.
Nikolay Sivov
nsivov at codeweavers.com
Fri Mar 1 00:59:35 CST 2019
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/mfplat/tests/mfplat.c | 98 +++++++++++++++++++++++++++++++++++++-
1 file changed, 97 insertions(+), 1 deletion(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 55142a79cf..790eeaf6d9 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -44,6 +44,8 @@ static HRESULT (WINAPI *pMFCreateMemoryBuffer)(DWORD max_length, IMFMediaBuffer
static void* (WINAPI *pMFHeapAlloc)(SIZE_T size, ULONG flags, char *file, int line, EAllocationType type);
static void (WINAPI *pMFHeapFree)(void *p);
static HRESULT (WINAPI *pMFPutWaitingWorkItem)(HANDLE event, LONG priority, IMFAsyncResult *result, MFWORKITEM_KEY *key);
+static HRESULT (WINAPI *pMFAllocateSerialWorkQueue)(DWORD queue, DWORD *serial_queue);
+static HRESULT (WINAPI *pMFPutWorkItemEx2)(DWORD queue, LONG priority, IMFAsyncResult *result);
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
@@ -312,7 +314,8 @@ static void init_functions(void)
{
HMODULE mod = GetModuleHandleA("mfplat.dll");
-#define X(f) if (!(p##f = (void*)GetProcAddress(mod, #f))) return;
+#define X(f) p##f = (void*)GetProcAddress(mod, #f)
+ X(MFAllocateSerialWorkQueue);
X(MFCopyImage);
X(MFCreateSourceResolver);
X(MFCreateMFByteStreamOnStream);
@@ -320,6 +323,7 @@ static void init_functions(void)
X(MFHeapAlloc);
X(MFHeapFree);
X(MFPutWaitingWorkItem);
+ X(MFPutWorkItemEx2);
#undef X
}
@@ -1104,6 +1108,7 @@ static void test_submit_work_item(void)
MFASYNC_CALLBACK_QUEUE_LONG_FUNCTION,
};
IMFAsyncCallback callback = { &testcallbackvtbl };
+ IMFAsyncResult *norm, *low, *high;
unsigned int i;
HRESULT hr;
@@ -1116,6 +1121,96 @@ static void test_submit_work_item(void)
ok(hr == S_OK, "Failed to submit work item, hr %#x.\n", hr);
}
+ if (!pMFPutWorkItemEx2)
+ {
+ skip("MFPutWorkItem2 is not available.\n");
+ hr = MFShutdown();
+ ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
+ return;
+ }
+
+ hr = MFCreateAsyncResult(NULL, &callback, NULL, &norm);
+ ok(hr == S_OK, "Failed to create result, hr %#x.\n", hr);
+
+ hr = MFCreateAsyncResult(NULL, &callback, NULL, &low);
+ ok(hr == S_OK, "Failed to create result, hr %#x.\n", hr);
+
+ hr = MFCreateAsyncResult(NULL, &callback, NULL, &high);
+ ok(hr == S_OK, "Failed to create result, hr %#x.\n", hr);
+
+ for (i = 0; i < ARRAY_SIZE(queue_ids); ++i)
+ {
+ hr = pMFPutWorkItemEx2(queue_ids[i], 0, norm);
+ ok(hr == S_OK, "Failed to submit work item, hr %#x.\n", hr);
+
+ hr = pMFPutWorkItemEx2(queue_ids[i], -1, low);
+ ok(hr == S_OK, "Failed to submit work item, hr %#x.\n", hr);
+
+ hr = pMFPutWorkItemEx2(queue_ids[i], 1, high);
+ ok(hr == S_OK, "Failed to submit work item, hr %#x.\n", hr);
+ }
+
+ IMFAsyncResult_Release(norm);
+ IMFAsyncResult_Release(low);
+ IMFAsyncResult_Release(high);
+
+ hr = MFShutdown();
+ ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
+}
+
+static void test_serial_queue(void)
+{
+ static const DWORD queue_ids[] =
+ {
+ MFASYNC_CALLBACK_QUEUE_STANDARD,
+ MFASYNC_CALLBACK_QUEUE_RT,
+ MFASYNC_CALLBACK_QUEUE_IO,
+ MFASYNC_CALLBACK_QUEUE_TIMER,
+ MFASYNC_CALLBACK_QUEUE_MULTITHREADED,
+ MFASYNC_CALLBACK_QUEUE_LONG_FUNCTION,
+ };
+ DWORD queue, serial_queue;
+ unsigned int i;
+ HRESULT hr;
+
+ if (!pMFAllocateSerialWorkQueue)
+ {
+ skip("Serial queues are not supported.\n");
+ return;
+ }
+
+ hr = MFStartup(MF_VERSION, MFSTARTUP_FULL);
+ ok(hr == S_OK, "Failed to start up, hr %#x.\n", hr);
+
+ for (i = 0; i < ARRAY_SIZE(queue_ids); ++i)
+ {
+ BOOL broken_types = queue_ids[i] == MFASYNC_CALLBACK_QUEUE_TIMER ||
+ queue_ids[i] == MFASYNC_CALLBACK_QUEUE_LONG_FUNCTION;
+
+ hr = pMFAllocateSerialWorkQueue(queue_ids[i], &serial_queue);
+ ok(hr == S_OK || broken(broken_types && hr == E_INVALIDARG) /* Win8 */,
+ "%u: failed to allocate a queue, hr %#x.\n", i, hr);
+
+ if (SUCCEEDED(hr))
+ {
+ hr = MFUnlockWorkQueue(serial_queue);
+ ok(hr == S_OK, "%u: failed to unlock the queue, hr %#x.\n", i, hr);
+ }
+ }
+
+ /* Chain them together. */
+ hr = pMFAllocateSerialWorkQueue(MFASYNC_CALLBACK_QUEUE_STANDARD, &serial_queue);
+ ok(hr == S_OK, "Failed to allocate a queue, hr %#x.\n", hr);
+
+ hr = pMFAllocateSerialWorkQueue(serial_queue, &queue);
+ ok(hr == S_OK, "Failed to allocate a queue, hr %#x.\n", hr);
+
+ hr = MFUnlockWorkQueue(serial_queue);
+ ok(hr == S_OK, "Failed to unlock the queue, hr %#x.\n", hr);
+
+ hr = MFUnlockWorkQueue(queue);
+ ok(hr == S_OK, "Failed to unlock the queue, hr %#x.\n", hr);
+
hr = MFShutdown();
ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
}
@@ -1143,6 +1238,7 @@ START_TEST(mfplat)
test_MFHeapAlloc();
test_scheduled_items();
test_submit_work_item();
+ test_serial_queue();
CoUninitialize();
}
--
2.20.1
More information about the wine-devel
mailing list