[PATCH v3] dinput/tests: Prove that GetDeviceData() does nothing.

Rémi Bernon rbernon at codeweavers.com
Mon Aug 2 10:40:04 CDT 2021


On 7/27/21 4:49 PM, Arkadiusz Hiler wrote:
> Signed-off-by: Arkadiusz Hiler <ahiler at codeweavers.com>
> ---
> 
> v3: use todo_wine only where applicable
> 
> supersedes 210321
> 
>   dlls/dinput/tests/mouse.c | 47 ++++++++++++++++++++++++++-------------
>   1 file changed, 31 insertions(+), 16 deletions(-)
> 
> diff --git a/dlls/dinput/tests/mouse.c b/dlls/dinput/tests/mouse.c
> index 69051bb2a34..d4ffcf4853b 100644
> --- a/dlls/dinput/tests/mouse.c
> +++ b/dlls/dinput/tests/mouse.c
> @@ -106,7 +106,7 @@ static void test_acquire(IDirectInputA *pDI, HWND hwnd)
>       DIMOUSESTATE m_state;
>       HWND hwnd2;
>       DIPROPDWORD di_op;
> -    DIDEVICEOBJECTDATA mouse_state;
> +    DIDEVICEOBJECTDATA mouse_state[30];
>       DWORD cnt;
>       int i;
>   
> @@ -159,16 +159,22 @@ static void test_acquire(IDirectInputA *pDI, HWND hwnd)
>       ok(hr == S_OK, "Acquire() failed: %08x\n", hr);
>   
>       mouse_event(MOUSEEVENTF_MOVE, 10, 10, 0, 0);
> -    cnt = 1;
> -    hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0);
> -    ok(hr == S_OK && cnt > 0, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt);
> +    cnt = ARRAY_SIZE(mouse_state);
> +    mouse_state[0].dwTimeStamp = 0xdeadbeef;
> +    hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state[0]), mouse_state, &cnt, 0);
> +    ok(hr == S_OK, "GetDeviceData() failed: %08x\n", hr);
> +    todo_wine ok(cnt == ARRAY_SIZE(mouse_state), "GetDeviceData() unexpected cnt: %d\n", cnt);
> +    todo_wine ok(mouse_state[0].dwTimeStamp == 0xdeadbeef, "GetDeviceData() overwrote the timestamp: %d\n", mouse_state[0].dwTimeStamp);
>   
>       mouse_event(MOUSEEVENTF_MOVE, 10, 10, 0, 0);
>       hr = IDirectInputDevice_Unacquire(pMouse);
>       ok(hr == S_OK, "Failed: %08x\n", hr);
> -    cnt = 1;
> -    hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0);
> -    ok(hr == S_OK && cnt > 0, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt);
> +    cnt = ARRAY_SIZE(mouse_state);
> +    mouse_state[0].dwTimeStamp = 0xdeadbeef;
> +    hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state[0]), mouse_state, &cnt, 0);
> +    ok(hr == S_OK, "GetDeviceData() failed: %08x\n", hr);
> +    todo_wine ok(cnt == ARRAY_SIZE(mouse_state), "GetDeviceData() unexpected cnt: %d\n", cnt);
> +    todo_wine ok(mouse_state[0].dwTimeStamp == 0xdeadbeef, "GetDeviceData() overwrote the timestamp: %d\n", mouse_state[0].dwTimeStamp);
>   
>       hr = IDirectInputDevice_Acquire(pMouse);
>       ok(hr == S_OK, "Failed: %08x\n", hr);
> @@ -178,20 +184,29 @@ static void test_acquire(IDirectInputA *pDI, HWND hwnd)
>   
>       hr = IDirectInputDevice_Acquire(pMouse);
>       ok(hr == S_OK, "Failed: %08x\n", hr);
> -    cnt = 1;
> -    hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0);
> -    ok(hr == S_OK && cnt > 0, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt);
> +    cnt = ARRAY_SIZE(mouse_state);
> +    mouse_state[0].dwTimeStamp = 0xdeadbeef;
> +    hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state[0]), mouse_state, &cnt, 0);
> +    ok(hr == S_OK, "GetDeviceData() failed: %08x\n", hr);
> +    todo_wine ok(cnt == ARRAY_SIZE(mouse_state), "GetDeviceData() unexpected cnt: %d\n", cnt);
> +    todo_wine ok(mouse_state[0].dwTimeStamp == 0xdeadbeef, "GetDeviceData() overwrote the timestamp: %d\n", mouse_state[0].dwTimeStamp);
>   
>       /* Check for buffer overflow */
>       for (i = 0; i < 6; i++)
>           mouse_event(MOUSEEVENTF_MOVE, 10 + i, 10 + i, 0, 0);
>   
> -    cnt = 1;
> -    hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0);
> -    ok(hr == DI_OK, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt);
> -    cnt = 1;
> -    hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state), &mouse_state, &cnt, 0);
> -    ok(hr == DI_OK && cnt == 1, "GetDeviceData() failed: %08x cnt:%d\n", hr, cnt);
> +    cnt = ARRAY_SIZE(mouse_state);
> +    mouse_state[0].dwTimeStamp = 0xdeadbeef;
> +    hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state[0]), mouse_state, &cnt, 0);
> +    ok(hr == S_OK, "GetDeviceData() failed: %08x\n", hr);
> +    todo_wine ok(cnt == ARRAY_SIZE(mouse_state), "GetDeviceData() unexpected cnt: %d\n", cnt);
> +    todo_wine ok(mouse_state[0].dwTimeStamp == 0xdeadbeef, "GetDeviceData() overwrote the timestamp: %d\n", mouse_state[0].dwTimeStamp);
> +    cnt = ARRAY_SIZE(mouse_state);
> +    mouse_state[0].dwTimeStamp = 0xdeadbeef;
> +    hr = IDirectInputDevice_GetDeviceData(pMouse, sizeof(mouse_state[0]), mouse_state, &cnt, 0);
> +    ok(hr == S_OK, "GetDeviceData() failed: %08x\n", hr);
> +    todo_wine ok(cnt == ARRAY_SIZE(mouse_state), "GetDeviceData() unexpected cnt: %d\n", cnt);
> +    ok(mouse_state[0].dwTimeStamp == 0xdeadbeef, "GetDeviceData() overwrote the timestamp: %d\n", mouse_state[0].dwTimeStamp);
>   
>       /* Check for granularity property using BYOFFSET */
>       memset(&di_op, 0, sizeof(di_op));
> 

AFAICS the function does nothing with dinput <= 7, but only when used 
with DIDEVICEOBJECTDATA struct. It works as expected in the following cases:

* dinput >= 8 with size == sizeof(DIDEVICEOBJECTDATA)
* dinput <= 7 with size == sizeof(DIDEVICEOBJECTDATA_DX3)

The function fails with E_INVALIDARG with dinput >= 8 when called with 
sizeof(DIDEVICEOBJECTDATA_DX3).

I think a few simple tests should validate that (with a test in 
dinput8/device), but then the tests should instead use the appropriate 
sizes and check that the event data can be read.

Cheers,
-- 
Rémi Bernon <rbernon at codeweavers.com>



More information about the wine-devel mailing list