[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