Zhiyi Zhang : user32/tests: Flush messages after mode changes.
Alexandre Julliard
julliard at winehq.org
Tue May 5 14:48:52 CDT 2020
Module: wine
Branch: master
Commit: 4369aaae5705092324576b6295799f37c60e6615
URL: https://source.winehq.org/git/wine.git/?a=commit;h=4369aaae5705092324576b6295799f37c60e6615
Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date: Tue May 5 20:30:07 2020 +0800
user32/tests: Flush messages after mode changes.
test_ChangeDisplaySettingsEx() can generate so many posted messages
for display change events that USERPostMessageLimit is reached and
ERROR_NOT_ENOUGH_QUOTA is returned for PostMessage(). Call flush_events()
after mode changes to limit message post rate.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48586
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/tests/monitor.c | 59 +++++++++++++++++++++------------------------
1 file changed, 28 insertions(+), 31 deletions(-)
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index e669b2b82e..080f040c3f 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -46,6 +46,23 @@ static void init_function_pointers(void)
#undef GET_PROC
}
+static void flush_events(void)
+{
+ int diff = 1000;
+ DWORD time;
+ MSG msg;
+
+ time = GetTickCount() + diff;
+ while (diff > 0)
+ {
+ if (MsgWaitForMultipleObjects(0, NULL, FALSE, 200, QS_ALLINPUT) == WAIT_TIMEOUT)
+ break;
+ while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE))
+ DispatchMessageA(&msg);
+ diff = time - GetTickCount();
+ }
+}
+
static BOOL CALLBACK monitor_enum_proc(HMONITOR hmon, HDC hdc, LPRECT lprc,
LPARAM lparam)
{
@@ -290,12 +307,6 @@ static void _expect_dm(INT line, DEVMODEA expected, const CHAR *device, DWORD te
dm.dmSize = sizeof(dm);
SetLastError(0xdeadbeef);
ret = EnumDisplaySettingsA(device, ENUM_CURRENT_SETTINGS, &dm);
- /* On win10 TestBot, after many resolution changes, EnumDisplaySettingsA fails sometimes for unknown reasons */
- if (!ret)
- {
- win_skip_(__FILE__, line)("EnumDisplaySettingsA failed.\n");
- return;
- }
ok_(__FILE__, line)(ret, "Device %s test %d EnumDisplaySettingsA failed, error %#x\n", device, test, GetLastError());
ok(get_primary_adapter(primary_adapter), "Failed to get primary adapter name.\n");
@@ -649,6 +660,7 @@ static void test_ChangeDisplaySettingsEx(void)
continue;
}
+ flush_events();
expect_dm(dm, devices[device].name, mode);
}
@@ -662,14 +674,7 @@ static void test_ChangeDisplaySettingsEx(void)
memset(&dm, 0, sizeof(dm));
dm.dmSize = sizeof(dm);
res = EnumDisplaySettingsA(devices[device].name, ENUM_CURRENT_SETTINGS, &dm);
- /* After many resolution changes, EnumDisplaySettingsA may fail on win10 TestBot */
- ok(res || broken(!res), "EnumDisplaySettingsA %s failed, error %#x\n",
- devices[device].name, GetLastError());
- if (!res)
- {
- win_skip("EnumDisplaySettingsA %s failed, error %#x\n", devices[device].name, GetLastError());
- continue;
- }
+ ok(res, "EnumDisplaySettingsA %s failed, error %#x\n", devices[device].name, GetLastError());
position.x = dm.dmPosition.x + dm.dmPelsWidth;
}
@@ -679,13 +684,7 @@ static void test_ChangeDisplaySettingsEx(void)
memset(&dm, 0, sizeof(dm));
dm.dmSize = sizeof(dm);
res = EnumDisplaySettingsA(devices[device].name, ENUM_CURRENT_SETTINGS, &dm);
- /* After many resolution changes, EnumDisplaySettingsA may fail on win10 TestBot */
- ok(res || broken(!res), "EnumDisplaySettingsA %s failed, error %#x\n", devices[device].name, GetLastError());
- if (!res)
- {
- win_skip("EnumDisplaySettingsA %s failed, error %#x\n", devices[device].name, GetLastError());
- continue;
- }
+ ok(res, "EnumDisplaySettingsA %s failed, error %#x\n", devices[device].name, GetLastError());
/* Find a mode that's different from the current mode */
memset(&dm2, 0, sizeof(dm2));
@@ -714,6 +713,7 @@ static void test_ChangeDisplaySettingsEx(void)
continue;
}
+ flush_events();
expect_dm(dm, devices[device].name, 0);
}
@@ -744,8 +744,7 @@ static void test_ChangeDisplaySettingsEx(void)
memset(&dm, 0, sizeof(dm));
dm.dmSize = sizeof(dm);
res = EnumDisplaySettingsA(devices[0].name, ENUM_CURRENT_SETTINGS, &dm);
- /* After many resolution changes, EnumDisplaySettingsA may fail on win10 TestBot */
- ok(res || broken(!res), "EnumDisplaySettingsA %s failed, error %#x\n", devices[0].name, GetLastError());
+ ok(res, "EnumDisplaySettingsA %s failed, error %#x\n", devices[0].name, GetLastError());
if (res)
{
@@ -753,8 +752,7 @@ static void test_ChangeDisplaySettingsEx(void)
memset(&dm2, 0, sizeof(dm2));
dm2.dmSize = sizeof(dm2);
res = EnumDisplaySettingsA(devices[1].name, ENUM_CURRENT_SETTINGS, &dm2);
- /* After many resolution changes, EnumDisplaySettingsA may fail on win10 TestBot */
- ok(res || broken(!res), "EnumDisplaySettingsA %s failed, error %#x\n", devices[1].name, GetLastError());
+ ok(res, "EnumDisplaySettingsA %s failed, error %#x\n", devices[1].name, GetLastError());
}
if (res)
@@ -769,9 +767,8 @@ static void test_ChangeDisplaySettingsEx(void)
memset(&dm2, 0, sizeof(dm2));
dm2.dmSize = sizeof(dm2);
res = EnumDisplaySettingsA(devices[1].name, ENUM_CURRENT_SETTINGS, &dm2);
- /* After many resolution changes, EnumDisplaySettingsA may fail on win10 TestBot */
- ok(res || broken(!res), "EnumDisplaySettingsA %s failed, error %#x\n", devices[1].name, GetLastError());
- todo_wine ok(dm2.dmPosition.x != dm.dmPosition.x || broken(!res), "Expect position change not applied.\n");
+ ok(res, "EnumDisplaySettingsA %s failed, error %#x\n", devices[1].name, GetLastError());
+ todo_wine ok(dm2.dmPosition.x != dm.dmPosition.x, "Expect position change not applied.\n");
/* Test position with extra space. The extra space will be removed */
dm2.dmPosition.x = dm.dmPosition.x - dm2.dmPelsWidth - dm2.dmPelsWidth / 2;
@@ -818,6 +815,7 @@ static void test_ChangeDisplaySettingsEx(void)
continue;
}
+ flush_events();
expect_dm(dm2, devices[1].name, side);
}
@@ -841,9 +839,8 @@ static void test_ChangeDisplaySettingsEx(void)
memset(&dm2, 0, sizeof(dm2));
dm2.dmSize = sizeof(dm2);
res = EnumDisplaySettingsA(devices[1].name, ENUM_CURRENT_SETTINGS, &dm2);
- /* After many resolution changes, EnumDisplaySettingsA may fail on win10 TestBot */
- ok(res || broken(!res), "EnumDisplaySettingsA %s failed, error %#x\n", devices[1].name, GetLastError());
- todo_wine ok(dm2.dmPosition.x == dm.dmPelsWidth || broken(!res), "Expect dmPosition.x %d, got %d\n",
+ ok(res, "EnumDisplaySettingsA %s failed, error %#x\n", devices[1].name, GetLastError());
+ todo_wine ok(dm2.dmPosition.x == dm.dmPelsWidth, "Expect dmPosition.x %d, got %d\n",
dm.dmPelsWidth, dm2.dmPosition.x);
}
else
More information about the wine-cvs
mailing list