[PATCH 1/7] dinput8/tests: Make test_device_input tests more predictable.
Rémi Bernon
rbernon at codeweavers.com
Wed Nov 10 03:52:22 CST 2021
Using a notification event to wait for input, addressing spurious
failures or timeouts.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/dinput8/tests/device.c | 101 ++++++++++++++++++++++++------------
1 file changed, 67 insertions(+), 34 deletions(-)
diff --git a/dlls/dinput8/tests/device.c b/dlls/dinput8/tests/device.c
index 3cad4ce256c..5ae9e225dc9 100644
--- a/dlls/dinput8/tests/device.c
+++ b/dlls/dinput8/tests/device.c
@@ -90,67 +90,100 @@ static void flush_events(void)
}
}
-static void test_device_input(IDirectInputDevice8A *lpdid, DWORD event_type, DWORD event, UINT_PTR expected)
+static void test_device_input( IDirectInputDevice8A *device, DWORD type, DWORD code, UINT_PTR expected )
{
HRESULT hr;
DIDEVICEOBJECTDATA obj_data;
- DWORD data_size = 1;
+ DWORD res, data_size = 1;
+ HANDLE event;
int i;
- hr = IDirectInputDevice8_Acquire(lpdid);
- ok (SUCCEEDED(hr), "Failed to acquire device hr=%08x\n", hr);
+ event = CreateEventW( NULL, FALSE, FALSE, NULL );
+ ok( event != NULL, "CreateEventW failed, error %u\n", GetLastError() );
- if (event_type == INPUT_KEYBOARD)
- keybd_event(0, event, KEYEVENTF_SCANCODE, 0);
+ IDirectInputDevice_Unacquire( device );
- if (event_type == INPUT_MOUSE)
- mouse_event( event, 0, 0, 0, 0);
+ hr = IDirectInputDevice8_SetEventNotification( device, event );
+ ok( hr == DI_OK, "SetEventNotification returned %#x\n", hr );
- flush_events();
- IDirectInputDevice8_Poll(lpdid);
- hr = IDirectInputDevice8_GetDeviceData(lpdid, sizeof(obj_data), &obj_data, &data_size, 0);
+ hr = IDirectInputDevice8_Acquire( device );
+ ok( hr == DI_OK, "Acquire returned %#x\n", hr );
- if (data_size != 1)
+ if (type == INPUT_KEYBOARD)
{
- win_skip("We're not able to inject input into Windows dinput8 with events\n");
- IDirectInputDevice_Unacquire(lpdid);
- return;
+ keybd_event( 0, code, KEYEVENTF_SCANCODE, 0 );
+ res = WaitForSingleObject( event, 100 );
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#x\n", res );
+
+ keybd_event( 0, code, KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP, 0 );
+ res = WaitForSingleObject( event, 100 );
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#x\n", res );
+ }
+ if (type == INPUT_MOUSE)
+ {
+ mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
+ res = WaitForSingleObject( event, 100 );
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#x\n", res );
+
+ mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
+ res = WaitForSingleObject( event, 100 );
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#x\n", res );
}
- ok (obj_data.uAppData == expected, "Retrieval of action failed uAppData=%lu expected=%lu\n", obj_data.uAppData, expected);
+ hr = IDirectInputDevice8_GetDeviceData( device, sizeof(obj_data), &obj_data, &data_size, 0 );
+ ok( hr == DI_OK, "GetDeviceData returned %#x\n", hr );
+ ok( data_size == 1, "got data size %u, expected 1\n", data_size );
+ ok( obj_data.uAppData == expected, "got action uAppData %p, expected %p\n",
+ (void *)obj_data.uAppData, (void *)expected );
/* Check for buffer overflow */
for (i = 0; i < 17; i++)
- if (event_type == INPUT_KEYBOARD)
+ {
+ if (type == INPUT_KEYBOARD)
{
- keybd_event( VK_SPACE, DIK_SPACE, 0, 0);
- keybd_event( VK_SPACE, DIK_SPACE, KEYEVENTF_KEYUP, 0);
- }
- else if (event_type == INPUT_MOUSE)
- {
- mouse_event(MOUSEEVENTF_LEFTDOWN, 1, 1, 0, 0);
- mouse_event(MOUSEEVENTF_LEFTUP, 1, 1, 0, 0);
- }
+ keybd_event( VK_SPACE, DIK_SPACE, 0, 0 );
+ res = WaitForSingleObject( event, 100 );
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#x\n", res );
- flush_events();
- IDirectInputDevice8_Poll(lpdid);
+ keybd_event( VK_SPACE, DIK_SPACE, KEYEVENTF_KEYUP, 0 );
+ res = WaitForSingleObject( event, 100 );
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#x\n", res );
+ }
+ if (type == INPUT_MOUSE)
+ {
+ mouse_event( MOUSEEVENTF_LEFTDOWN, 1, 1, 0, 0 );
+ res = WaitForSingleObject( event, 100 );
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#x\n", res );
+
+ mouse_event( MOUSEEVENTF_LEFTUP, 1, 1, 0, 0 );
+ res = WaitForSingleObject( event, 100 );
+ ok( res == WAIT_OBJECT_0, "WaitForSingleObject returned %#x\n", res );
+ }
+ }
data_size = 1;
- hr = IDirectInputDevice8_GetDeviceData(lpdid, sizeof(obj_data), &obj_data, &data_size, 0);
- ok(hr == DI_BUFFEROVERFLOW, "GetDeviceData() failed: %08x\n", hr);
+ hr = IDirectInputDevice8_GetDeviceData( device, sizeof(obj_data), &obj_data, &data_size, 0 );
+ ok( hr == DI_BUFFEROVERFLOW, "GetDeviceData returned %#x\n", hr );
data_size = 1;
- hr = IDirectInputDevice8_GetDeviceData(lpdid, sizeof(obj_data), &obj_data, &data_size, 0);
- ok(hr == DI_OK && data_size == 1, "GetDeviceData() failed: %08x cnt:%d\n", hr, data_size);
+ hr = IDirectInputDevice8_GetDeviceData( device, sizeof(obj_data), &obj_data, &data_size, 0 );
+ ok( hr == DI_OK, "GetDeviceData returned %#x\n", hr );
+ ok( data_size == 1, "got data_size %u, expected 1\n", data_size );
/* drain device's queue */
while (data_size == 1)
{
- hr = IDirectInputDevice8_GetDeviceData(lpdid, sizeof(obj_data), &obj_data, &data_size, 0);
- ok(hr == DI_OK, "GetDeviceData() failed: %08x cnt:%d\n", hr, data_size);
+ hr = IDirectInputDevice8_GetDeviceData( device, sizeof(obj_data), &obj_data, &data_size, 0 );
+ ok( hr == DI_OK, "GetDeviceData returned %#x\n", hr );
if (hr != DI_OK) break;
}
- IDirectInputDevice_Unacquire(lpdid);
+ hr = IDirectInputDevice_Unacquire( device );
+ ok( hr == DI_OK, "Unacquire returned %#x\n", hr );
+
+ hr = IDirectInputDevice8_SetEventNotification( device, NULL );
+ ok( hr == DI_OK, "SetEventNotification returned %#x\n", hr );
+
+ CloseHandle( event );
}
static void test_build_action_map(IDirectInputDevice8A *lpdid, DIACTIONFORMATA *lpdiaf,
--
2.33.1
More information about the wine-devel
mailing list