[PATCH 1/3] wmvcore/tests: Add more IWMReader_(Open|Start|Stop|Close) async checks.

Rémi Bernon wine at gitlab.winehq.org
Wed Jul 6 12:14:20 CDT 2022


From: Rémi Bernon <rbernon at codeweavers.com>

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/wmvcore/tests/wmvcore.c | 142 ++++++++++++++++++++++++++++++-----
 1 file changed, 122 insertions(+), 20 deletions(-)

diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c
index f639184de90..987f5def75a 100644
--- a/dlls/wmvcore/tests/wmvcore.c
+++ b/dlls/wmvcore/tests/wmvcore.c
@@ -1422,8 +1422,11 @@ struct callback
     IWMReaderCallbackAdvanced IWMReaderCallbackAdvanced_iface;
     IWMReaderAllocatorEx IWMReaderAllocatorEx_iface;
     LONG refcount;
-    HANDLE got_opened, got_stopped, eof_event;
-    unsigned int got_closed, got_started, got_sample, got_end_of_streaming, got_eof;
+    HANDLE expect_opened, got_opened;
+    HANDLE expect_started, got_started;
+    HANDLE expect_stopped, got_stopped;
+    HANDLE eof_event;
+    unsigned int got_closed, started_count, got_sample, got_end_of_streaming, got_eof;
     bool all_streams_off;
     bool allocated_samples;
 
@@ -1480,6 +1483,7 @@ static HRESULT WINAPI callback_OnStatus(IWMReaderCallback *iface, WMT_STATUS sta
         HRESULT hr, WMT_ATTR_DATATYPE type, BYTE *value, void *context)
 {
     struct callback *callback = impl_from_IWMReaderCallback(iface);
+    DWORD ret;
 
     if (winetest_debug > 1)
         trace("%lu: %04lx: IWMReaderCallback::OnStatus(status %u, hr %#lx, type %#x, value %p)\n",
@@ -1491,6 +1495,9 @@ static HRESULT WINAPI callback_OnStatus(IWMReaderCallback *iface, WMT_STATUS sta
             ok(type == WMT_TYPE_DWORD, "Got type %#x.\n", type);
             ok(!*(DWORD *)value, "Got value %#lx.\n", *(DWORD *)value);
             ok(context == (void *)0xdeadbeef, "Got unexpected context %p.\n", context);
+            ret = WaitForSingleObject(callback->expect_opened, 100);
+            todo_wine
+            ok(!ret, "Wait timed out.\n");
             SetEvent(callback->got_opened);
             break;
 
@@ -1498,14 +1505,21 @@ static HRESULT WINAPI callback_OnStatus(IWMReaderCallback *iface, WMT_STATUS sta
             ok(type == WMT_TYPE_DWORD, "Got type %#x.\n", type);
             ok(!*(DWORD *)value, "Got value %#lx.\n", *(DWORD *)value);
             ok(context == (void *)0xfacade, "Got unexpected context %p.\n", context);
+            ret = WaitForSingleObject(callback->expect_started, 100);
+            todo_wine
+            ok(!ret, "Wait timed out.\n");
             callback->got_end_of_streaming = callback->got_eof = callback->got_sample = 0;
-            ++callback->got_started;
+            SetEvent(callback->got_started);
+            ++callback->started_count;
             break;
 
         case WMT_STOPPED:
             ok(type == WMT_TYPE_DWORD, "Got type %#x.\n", type);
             ok(!*(DWORD *)value, "Got value %#lx.\n", *(DWORD *)value);
             ok(context == (void *)0xfacade, "Got unexpected context %p.\n", context);
+            ret = WaitForSingleObject(callback->expect_stopped, 100);
+            todo_wine
+            ok(!ret, "Wait timed out.\n");
             SetEvent(callback->got_stopped);
             break;
 
@@ -1613,7 +1627,7 @@ static HRESULT WINAPI callback_OnSample(IWMReaderCallback *iface, DWORD output,
     check_async_sample(callback, sample);
 
     ok(!callback->read_compressed, "OnSample() should not be called when reading compressed samples.\n");
-    ok(callback->got_started > 0, "Got %u WMT_STARTED callbacks.\n", callback->got_started);
+    ok(callback->started_count > 0, "Got %u WMT_STARTED callbacks.\n", callback->started_count);
     ok(!callback->got_eof, "Got %u WMT_EOF callbacks.\n", callback->got_eof);
     ++callback->got_sample;
 
@@ -1666,7 +1680,7 @@ static HRESULT WINAPI callback_advanced_OnStreamSample(IWMReaderCallbackAdvanced
     check_async_sample(callback, sample);
 
     ok(callback->read_compressed, "OnStreamSample() should not be called unless reading compressed samples.\n");
-    ok(callback->got_started > 0, "Got %u WMT_STARTED callbacks.\n", callback->got_started);
+    ok(callback->started_count > 0, "Got %u WMT_STARTED callbacks.\n", callback->started_count);
     ok(!callback->got_eof, "Got %u WMT_EOF callbacks.\n", callback->got_eof);
     ++callback->got_sample;
 
@@ -1840,7 +1854,11 @@ static void callback_init(struct callback *callback)
     callback->IWMReaderCallbackAdvanced_iface.lpVtbl = &callback_advanced_vtbl;
     callback->IWMReaderAllocatorEx_iface.lpVtbl = &callback_allocator_vtbl;
     callback->refcount = 1;
+    callback->expect_opened = CreateEventW(NULL, FALSE, FALSE, NULL);
     callback->got_opened = CreateEventW(NULL, FALSE, FALSE, NULL);
+    callback->expect_started = CreateEventW(NULL, FALSE, FALSE, NULL);
+    callback->got_started = CreateEventW(NULL, FALSE, FALSE, NULL);
+    callback->expect_stopped = CreateEventW(NULL, FALSE, FALSE, NULL);
     callback->got_stopped = CreateEventW(NULL, FALSE, FALSE, NULL);
     callback->eof_event = CreateEventW(NULL, FALSE, FALSE, NULL);
     callback->ontime_event = CreateEventW(NULL, FALSE, FALSE, NULL);
@@ -1849,7 +1867,11 @@ static void callback_init(struct callback *callback)
 static void callback_cleanup(struct callback *callback)
 {
     CloseHandle(callback->got_opened);
+    CloseHandle(callback->expect_opened);
+    CloseHandle(callback->got_started);
+    CloseHandle(callback->expect_started);
     CloseHandle(callback->got_stopped);
+    CloseHandle(callback->expect_stopped);
     CloseHandle(callback->eof_event);
     CloseHandle(callback->ontime_event);
 }
@@ -1860,13 +1882,22 @@ static void run_async_reader(IWMReader *reader, IWMReaderAdvanced2 *advanced, st
     DWORD ret;
 
     callback->got_closed = 0;
-    callback->got_started = 0;
+    callback->started_count = 0;
     callback->got_sample = 0;
     callback->got_end_of_streaming = 0;
     callback->got_eof = 0;
 
     hr = IWMReader_Start(reader, 0, 0, 1.0f, (void *)0xfacade);
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
+    ret = WaitForSingleObject(callback->got_started, 0);
+    todo_wine
+    ok(ret == WAIT_TIMEOUT, "Got unexpected WMT_STARTED.\n");
+    if (ret == WAIT_TIMEOUT)
+    {
+        SetEvent(callback->expect_started);
+        ret = WaitForSingleObject(callback->got_started, 1000);
+        ok(!ret, "Wait timed out.\n");
+    }
 
     hr = IWMReaderAdvanced2_SetUserProvidedClock(advanced, TRUE);
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
@@ -1879,8 +1910,15 @@ static void run_async_reader(IWMReader *reader, IWMReaderAdvanced2 *advanced, st
 
     hr = IWMReader_Stop(reader);
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
-    ret = WaitForSingleObject(callback->got_stopped, 1000);
-    ok(!ret, "Wait timed out.\n");
+    ret = WaitForSingleObject(callback->got_stopped, 0);
+    todo_wine
+    ok(ret == WAIT_TIMEOUT, "Got unexpected WMT_STOPPED.\n");
+    if (ret == WAIT_TIMEOUT)
+    {
+        SetEvent(callback->expect_stopped);
+        ret = WaitForSingleObject(callback->got_stopped, 1000);
+        ok(!ret, "Wait timed out.\n");
+    }
 
     ok(!outstanding_buffers, "Got %ld outstanding buffers.\n", outstanding_buffers);
 }
@@ -2178,8 +2216,15 @@ static void test_async_reader_streaming(void)
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
     ok(stream.refcount > 1, "Got refcount %ld.\n", stream.refcount);
     ok(callback.refcount > 1, "Got refcount %ld.\n", callback.refcount);
-    ret = WaitForSingleObject(callback.got_opened, 1000);
-    ok(!ret, "Wait timed out.\n");
+    ret = WaitForSingleObject(callback.got_opened, 0);
+    todo_wine
+    ok(ret == WAIT_TIMEOUT, "Got unexpected WMT_OPENED.\n");
+    if (ret == WAIT_TIMEOUT)
+    {
+        SetEvent(callback.expect_opened);
+        ret = WaitForSingleObject(callback.got_opened, 1000);
+        ok(!ret, "Wait timed out.\n");
+    }
 
     hr = IWMReaderAdvanced2_OpenStream(advanced, &stream.IStream_iface, &callback.IWMReaderCallback_iface, (void **)0xdeadbee0);
     ok(hr == E_UNEXPECTED, "Got hr %#lx.\n", hr);
@@ -2205,6 +2250,15 @@ static void test_async_reader_streaming(void)
 
     hr = IWMReader_Start(reader, 0, 0, 1.0f, (void *)0xfacade);
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
+    ret = WaitForSingleObject(callback.got_started, 0);
+    todo_wine
+    ok(ret == WAIT_TIMEOUT, "Got unexpected WMT_STARTED.\n");
+    if (ret == WAIT_TIMEOUT)
+    {
+        SetEvent(callback.expect_started);
+        ret = WaitForSingleObject(callback.got_started, 1000);
+        ok(!ret, "Wait timed out.\n");
+    }
 
     /* By default the reader will time itself, and attempt to deliver samples
      * according to their presentation time. Call DeliverTime with the file
@@ -2235,6 +2289,15 @@ static void test_async_reader_streaming(void)
 
     hr = IWMReader_Start(reader, 0, 0, 1.0f, (void *)0xfacade);
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
+    ret = WaitForSingleObject(callback.got_started, 0);
+    todo_wine
+    ok(ret == WAIT_TIMEOUT, "Got unexpected WMT_STARTED.\n");
+    if (ret == WAIT_TIMEOUT)
+    {
+        SetEvent(callback.expect_started);
+        ret = WaitForSingleObject(callback.got_started, 1000);
+        ok(!ret, "Wait timed out.\n");
+    }
 
     hr = IWMReaderAdvanced2_DeliverTime(advanced, 3000 * 10000);
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
@@ -2245,13 +2308,27 @@ static void test_async_reader_streaming(void)
 
     hr = IWMReader_Stop(reader);
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
-    ret = WaitForSingleObject(callback.got_stopped, 1000);
-    ok(!ret, "Wait timed out.\n");
+    ret = WaitForSingleObject(callback.got_stopped, 0);
+    todo_wine
+    ok(ret == WAIT_TIMEOUT, "Got unexpected WMT_STOPPED.\n");
+    if (ret == WAIT_TIMEOUT)
+    {
+        SetEvent(callback.expect_stopped);
+        ret = WaitForSingleObject(callback.got_stopped, 1000);
+        ok(!ret, "Wait timed out.\n");
+    }
 
     hr = IWMReader_Stop(reader);
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
-    ret = WaitForSingleObject(callback.got_stopped, 1000);
-    ok(!ret, "Wait timed out.\n");
+    ret = WaitForSingleObject(callback.got_stopped, 0);
+    todo_wine
+    ok(ret == WAIT_TIMEOUT, "Got unexpected WMT_STOPPED.\n");
+    if (ret == WAIT_TIMEOUT)
+    {
+        SetEvent(callback.expect_stopped);
+        ret = WaitForSingleObject(callback.got_stopped, 1000);
+        ok(!ret, "Wait timed out.\n");
+    }
 
     test_reader_attributes(profile);
     test_async_reader_selection(reader, advanced, &callback);
@@ -2263,7 +2340,8 @@ static void test_async_reader_streaming(void)
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
     ok(callback.got_closed == 1, "Got %u WMT_CLOSED callbacks.\n", callback.got_closed);
     ok(callback.refcount == 1, "Got outstanding refcount %ld.\n", callback.refcount);
-    callback_cleanup(&callback);
+    ret = WaitForSingleObject(callback.got_stopped, 0);
+    ok(ret == WAIT_TIMEOUT, "Got unexpected WMT_STOPPED.\n");
 
     hr = IWMReader_Stop(reader);
     ok(hr == E_UNEXPECTED, "Got hr %#lx.\n", hr);
@@ -2318,8 +2396,15 @@ static void test_async_reader_types(void)
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
     ok(stream.refcount > 1, "Got refcount %ld.\n", stream.refcount);
     ok(callback.refcount > 1, "Got refcount %ld.\n", callback.refcount);
-    ret = WaitForSingleObject(callback.got_opened, 1000);
-    ok(!ret, "Wait timed out.\n");
+    ret = WaitForSingleObject(callback.got_opened, 0);
+    todo_wine
+    ok(ret == WAIT_TIMEOUT, "Got unexpected WMT_OPENED.\n");
+    if (ret == WAIT_TIMEOUT)
+    {
+        SetEvent(callback.expect_opened);
+        ret = WaitForSingleObject(callback.got_opened, 1000);
+        ok(!ret, "Wait timed out.\n");
+    }
 
     for (i = 0; i < 2; ++i)
     {
@@ -2541,8 +2626,15 @@ static void test_async_reader_file(void)
     hr = IWMReader_Open(reader, filename, &callback.IWMReaderCallback_iface, (void **)0xdeadbeef);
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
     ok(callback.refcount > 1, "Got refcount %ld.\n", callback.refcount);
-    ret = WaitForSingleObject(callback.got_opened, 1000);
-    ok(!ret, "Wait timed out.\n");
+    ret = WaitForSingleObject(callback.got_opened, 0);
+    todo_wine
+    ok(ret == WAIT_TIMEOUT, "Got unexpected WMT_OPENED.\n");
+    if (ret == WAIT_TIMEOUT)
+    {
+        SetEvent(callback.expect_opened);
+        ret = WaitForSingleObject(callback.got_opened, 1000);
+        ok(!ret, "Wait timed out.\n");
+    }
 
     hr = IWMReader_Open(reader, filename, &callback.IWMReaderCallback_iface, (void **)0xdeadbee0);
     ok(hr == E_UNEXPECTED, "Got hr %#lx.\n", hr);
@@ -2554,12 +2646,22 @@ static void test_async_reader_file(void)
 
     hr = IWMReader_Start(reader, 0, 0, 1.0f, (void *)0xfacade);
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
+    ret = WaitForSingleObject(callback.got_started, 0);
+    todo_wine
+    ok(ret == WAIT_TIMEOUT, "Got unexpected WMT_STARTED.\n");
+    if (ret == WAIT_TIMEOUT)
+    {
+        SetEvent(callback.expect_started);
+        ret = WaitForSingleObject(callback.got_started, 1000);
+        ok(!ret, "Wait timed out.\n");
+    }
 
     hr = IWMReader_Close(reader);
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
     ok(callback.got_closed == 1, "Got %u WMT_CLOSED callbacks.\n", callback.got_closed);
     ok(callback.refcount == 1, "Got outstanding refcount %ld.\n", callback.refcount);
-    callback_cleanup(&callback);
+    ret = WaitForSingleObject(callback.got_stopped, 0);
+    ok(ret == WAIT_TIMEOUT, "Got unexpected WMT_STOPPED.\n");
 
     hr = IWMReader_Close(reader);
     ok(hr == NS_E_INVALID_REQUEST, "Got hr %#lx.\n", hr);
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/393



More information about the wine-devel mailing list