[PATCH v2 5/5] user32/tests: Rewrite msg tests ok_sequence to reduce verbosity.

Rémi Bernon rbernon at codeweavers.com
Mon Jan 31 07:18:10 CST 2022


At WINETEST_DEBUG <= 1, only sequence mismatches will be checked and
reported.

At WINETEST_DEBUG == 2, individual message mismatches will be checked
and reported, expected / received sequences will be traced on mismatch.

At WINETEST_DEBUG > 2, individual message will be checked or traced,
all expected / received sequences will be traced.

Wine-Bug: https://bugs.winehq.org//show_bug.cgi?id=51780
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/user32/tests/msg.c | 378 +++++++++++++---------------------------
 1 file changed, 122 insertions(+), 256 deletions(-)

diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index 90816a9df52..03b2fc3870d 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -2619,294 +2619,157 @@ static void flush_sequence(void)
     LeaveCriticalSection( &sequence_cs );
 }
 
-static void dump_sequence(const struct message *expected, const char *context, const char *file, int line)
+static int try_compare_message( const struct message *expected, const struct recvd_message *received )
 {
-    const struct recvd_message *actual = sequence;
-    unsigned int count = 0;
+    static DWORD type_flags = hook | winevent_hook | kbd_hook;
+    int ret;
 
-    trace_(file, line)("Failed sequence %s:\n", context );
-    while (expected->message && actual->message)
+    if ((ret = (expected->flags & type_flags) - (received->flags & type_flags))) return ret;
+    if ((ret = expected->message - received->message)) return ret;
+
+    /* validate parent and defwinproc flags for optional messages */
+    if (!(expected->flags & optional)) return 0;
+    if ((ret = (expected->flags & defwinproc) - (received->flags & defwinproc))) return ret;
+    if ((ret = (expected->flags & parent) - (received->flags & parent))) return ret;
+
+    return 0;
+}
+
+static int compare_message( const struct message *expected, const struct recvd_message *received,
+                            BOOL todo, const char *file, int line )
+{
+    static DWORD type_flags = hook | winevent_hook | kbd_hook;
+    static DWORD msg_flags = sent | posted;
+    int ret;
+
+    if ((ret = (expected->flags & type_flags) - (received->flags & type_flags))) goto done;
+    if ((ret = expected->message - received->message)) goto done;
+    if ((ret = (expected->flags & defwinproc) - (received->flags & defwinproc))) goto done;
+    if ((ret = (expected->flags & parent) - (received->flags & parent))) goto done;
+    if ((ret = (expected->flags & msg_flags) - (received->flags & msg_flags))) goto done;
+    if ((ret = (expected->flags & beginpaint) - (received->flags & beginpaint))) goto done;
+    if ((expected->flags & wparam) && (ret = (expected->wParam & ~expected->wp_mask) - (received->wParam & ~expected->wp_mask))) goto done;
+    if ((expected->flags & lparam) && (ret = (expected->lParam & ~expected->lp_mask) - (received->lParam & ~expected->lp_mask))) goto done;
+
+done:
+    if (ret && winetest_debug > 1)
     {
-        if (actual->output[0])
+        todo_wine_if(todo)
+        ok_(file, line)( 0, "mismatch %#x, %#x, %#lx, %#lx\n", received->message,
+                         received->flags, received->wParam, received->lParam );
+    }
+    if (!ret && winetest_debug > 2)
+        trace_(file, line)( "match %#x, %#x, %#lx, %#lx\n", received->message,
+                         received->flags, received->wParam, received->lParam );
+    return ret;
+}
+
+static BOOL find_next_message( const struct message **expected, const struct recvd_message **received,
+                               BOOL *matches, BOOL todo, const char *file, int line )
+{
+    const struct recvd_message *first_received = *received, *tmp_received, *next_received;
+    const struct message *first_expected = *expected, *tmp_expected, *next_expected;
+    BOOL winhook_todo;
+
+    /* try matching messages in expected list with first received message */
+    for (next_expected = first_expected; next_expected->message; next_expected++)
+        if (!try_compare_message( next_expected, first_received )) break;
+
+    /* if current message doesn't match anything in the received list, match a non-optional message */
+    if (!next_expected->message) while (first_expected->flags & optional) first_expected++;
+
+    /* try matching messages in received list with first non-optional message */
+    for (next_received = first_received; next_received->message; next_received++)
+        if (!try_compare_message( first_expected, next_received ) &&
+            !(first_expected->flags & optional)) break;
+
+    /* couldn't find a match but there's more messages to try */
+    if (!next_expected->message && next_expected - first_expected > 1 &&
+        !next_received->message && next_received - first_received > 1)
+        return TRUE;
+
+    /* report the smallest mismatch which doesn't end the sequence */
+    if ((next_expected->message && next_expected - first_expected < next_received - first_received) ||
+        !next_received->message)
+    {
+        for (tmp_expected = first_expected; tmp_expected != next_expected; ++tmp_expected)
         {
-            if (expected->flags & hook)
+            if (tmp_expected->flags & optional) continue;
+            if ((tmp_expected->flags & winevent_hook) && !hEvent_hook) continue;
+            winhook_todo = (tmp_expected->flags & winevent_hook) && (tmp_expected->flags & winevent_hook_todo);
+            if (!winhook_todo) *matches = FALSE;
+            if (winetest_debug > 1)
             {
-                trace_(file, line)( "  %u: expected: hook %04x - actual: %s\n",
-                                    count, expected->message, actual->output );
-            }
-            else if (expected->flags & winevent_hook)
-            {
-                trace_(file, line)( "  %u: expected: winevent %04x - actual: %s\n",
-                                    count, expected->message, actual->output );
-            }
-            else if (expected->flags & kbd_hook)
-            {
-                trace_(file, line)( "  %u: expected: kbd %04x - actual: %s\n",
-                                    count, expected->message, actual->output );
-            }
-            else
-            {
-                trace_(file, line)( "  %u: expected: msg %04x - actual: %s\n",
-                                    count, expected->message, actual->output );
+                todo_wine_if(todo || winhook_todo)
+                ok_(file, line)( 0, "missing %#x, %#x, %#lx, %#lx\n", tmp_expected->message,
+                                 tmp_expected->flags, tmp_expected->wParam, tmp_expected->lParam );
             }
         }
+        *expected = next_expected;
+    }
 
-	if (expected->message == actual->message)
-	{
-	    if ((expected->flags & defwinproc) != (actual->flags & defwinproc) &&
-                (expected->flags & optional))
-            {
-                /* don't match messages if their defwinproc status differs */
-                expected++;
-            }
-            else
-            {
-                expected++;
-                actual++;
-            }
-	}
-	/* silently drop winevent messages if there is no support for them */
-	else if ((expected->flags & optional) || ((expected->flags & winevent_hook) && !hEvent_hook) ||
-                ((expected->flags & winevent_hook_todo) && !strcmp(winetest_platform, "wine")))
-	    expected++;
-        else
+    if ((next_received->message && next_received - first_received < next_expected - first_expected) ||
+        !next_expected->message)
+    {
+        for (tmp_received = first_received; tmp_received != next_received; ++tmp_received)
         {
-            expected++;
-            actual++;
+            *matches = FALSE;
+            if (winetest_debug > 1)
+            {
+                todo_wine_if(todo)
+                ok_(file, line)( 0, "spurious %#x, %#x, %#lx, %#lx\n", tmp_received->message,
+                                 tmp_received->flags, tmp_received->wParam, tmp_received->lParam );
+            }
         }
-        count++;
+        *received = next_received;
     }
 
-    /* optional trailing messages */
-    while (expected->message && ((expected->flags & optional) ||
-	    ((expected->flags & winevent_hook) && !hEvent_hook)))
-    {
-        trace_(file, line)( "  %u: expected: msg %04x - actual: nothing\n", count, expected->message );
-	expected++;
-        count++;
-    }
-
-    if (expected->message)
-    {
-        trace_(file, line)( "  %u: expected: msg %04x - actual: nothing\n", count, expected->message );
-        return;
-    }
-
-    while (actual->message && actual->output[0])
-    {
-        trace_(file, line)( "  %u: expected: nothing - actual: %s\n", count, actual->output );
-        actual++;
-        count++;
-    }
+    return (*expected)->message && (*received)->message;
 }
 
 #define ok_sequence( exp, contx, todo) \
         ok_sequence_( (exp), (contx), (todo), __FILE__, __LINE__)
 
-
-static void ok_sequence_(const struct message *expected_list, const char *context, BOOL todo,
+static void ok_sequence_(const struct message *expected, const char *context, BOOL todo,
                          const char *file, int line)
 {
     static const struct recvd_message end_of_sequence;
-    const struct message *expected = expected_list;
-    const struct recvd_message *actual;
-    int failcount = 0, dump = 0;
-    unsigned int count = 0;
+    const struct message *tmp_expected, *first_expected = expected;
+    const struct recvd_message *tmp_received, *received;
+    BOOL matches = TRUE;
 
     add_message(&end_of_sequence);
+    received = sequence;
 
-    actual = sequence;
-
-    while (expected->message && actual->message)
+    while (expected->message || received->message)
     {
-	if (expected->message == actual->message &&
-            !((expected->flags ^ actual->flags) & (hook|winevent_hook|kbd_hook)))
-	{
-	    if (expected->flags & wparam)
-	    {
-		if (((expected->wParam ^ actual->wParam) & ~expected->wp_mask) && todo)
-		{
-		    todo_wine {
-                        failcount ++;
-                        if (strcmp(winetest_platform, "wine")) dump++;
-                        ok_( file, line) (FALSE,
-			    "%s: %u: in msg 0x%04x expecting wParam 0x%lx got 0x%lx\n",
-                            context, count, expected->message, expected->wParam, actual->wParam);
-		    }
-		}
-		else
-                {
-                    ok_( file, line)( ((expected->wParam ^ actual->wParam) & ~expected->wp_mask) == 0,
-                                     "%s: %u: in msg 0x%04x expecting wParam 0x%lx got 0x%lx\n",
-                                     context, count, expected->message, expected->wParam, actual->wParam);
-                    if ((expected->wParam ^ actual->wParam) & ~expected->wp_mask) dump++;
-                }
-
-	    }
-	    if (expected->flags & lparam)
-            {
-		if (((expected->lParam ^ actual->lParam) & ~expected->lp_mask) && todo)
-		{
-		    todo_wine {
-                        failcount ++;
-                        if (strcmp(winetest_platform, "wine")) dump++;
-                        ok_( file, line) (FALSE,
-			    "%s: %u: in msg 0x%04x expecting lParam 0x%lx got 0x%lx\n",
-                            context, count, expected->message, expected->lParam, actual->lParam);
-		    }
-		}
-		else
-                {
-                    ok_( file, line)(((expected->lParam ^ actual->lParam) & ~expected->lp_mask) == 0,
-                                     "%s: %u: in msg 0x%04x expecting lParam 0x%lx got 0x%lx\n",
-                                     context, count, expected->message, expected->lParam, actual->lParam);
-                    if ((expected->lParam ^ actual->lParam) & ~expected->lp_mask) dump++;
-                }
-            }
-	    if ((expected->flags & optional) &&
-                ((expected->flags ^ actual->flags) & (defwinproc|parent)))
-            {
-                /* don't match optional messages if their defwinproc or parent status differs */
-                expected++;
-                count++;
-                continue;
-            }
-	    if ((expected->flags & defwinproc) != (actual->flags & defwinproc) && todo)
-	    {
-		    todo_wine {
-                        failcount ++;
-                        if (strcmp(winetest_platform, "wine")) dump++;
-                        ok_( file, line) (FALSE,
-                            "%s: %u: the msg 0x%04x should %shave been sent by DefWindowProc\n",
-                            context, count, expected->message, (expected->flags & defwinproc) ? "" : "NOT ");
-		    }
-	    }
-	    else
-            {
-	        ok_( file, line) ((expected->flags & defwinproc) == (actual->flags & defwinproc),
-		    "%s: %u: the msg 0x%04x should %shave been sent by DefWindowProc\n",
-                    context, count, expected->message, (expected->flags & defwinproc) ? "" : "NOT ");
-                if ((expected->flags & defwinproc) != (actual->flags & defwinproc)) dump++;
-            }
-
-	    ok_( file, line) ((expected->flags & beginpaint) == (actual->flags & beginpaint),
-		"%s: %u: the msg 0x%04x should %shave been sent by BeginPaint\n",
-                context, count, expected->message, (expected->flags & beginpaint) ? "" : "NOT ");
-            if ((expected->flags & beginpaint) != (actual->flags & beginpaint)) dump++;
-
-	    ok_( file, line) ((expected->flags & (sent|posted)) == (actual->flags & (sent|posted)),
-		"%s: %u: the msg 0x%04x should have been %s\n",
-                context, count, expected->message, (expected->flags & posted) ? "posted" : "sent");
-            if ((expected->flags & (sent|posted)) != (actual->flags & (sent|posted))) dump++;
-
-	    ok_( file, line) ((expected->flags & parent) == (actual->flags & parent),
-		"%s: %u: the msg 0x%04x was expected in %s\n",
-                context, count, expected->message, (expected->flags & parent) ? "parent" : "child");
-            if ((expected->flags & parent) != (actual->flags & parent)) dump++;
-
-	    ok_( file, line) ((expected->flags & hook) == (actual->flags & hook),
-		"%s: %u: the msg 0x%04x should have been sent by a hook\n",
-                context, count, expected->message);
-            if ((expected->flags & hook) != (actual->flags & hook)) dump++;
-
-	    ok_( file, line) ((expected->flags & winevent_hook) == (actual->flags & winevent_hook),
-		"%s: %u: the msg 0x%04x should have been sent by a winevent hook\n",
-                context, count, expected->message);
-            if ((expected->flags & winevent_hook) != (actual->flags & winevent_hook)) dump++;
-
-	    ok_( file, line) ((expected->flags & kbd_hook) == (actual->flags & kbd_hook),
-		"%s: %u: the msg 0x%04x should have been sent by a keyboard hook\n",
-                context, count, expected->message);
-            if ((expected->flags & kbd_hook) != (actual->flags & kbd_hook)) dump++;
-
-	    expected++;
-	    actual++;
-	}
-	/*
-         * silently drop hook messages if there is no support for them, mark
-         * winevent todo's.
-         */
-	else if ((expected->flags & optional) ||
-                 ((expected->flags & hook) && !hCBT_hook) ||
-                 ((expected->flags & winevent_hook) && !hEvent_hook) ||
-                 ((expected->flags & kbd_hook) && !hKBD_hook) ||
-                 ((expected->flags & winevent_hook_todo) && !strcmp(winetest_platform, "wine")))
+        winetest_push_context( "%u", expected - first_expected );
+        if (find_next_message( &expected, &received, &matches, todo, file, line ))
         {
-            if ((expected->flags & winevent_hook_todo) && hEvent_hook)
-            {
-                todo_wine {
-                    ok_( file, line) (FALSE,
-                        "%s: %u: the msg 0x%04x was expected, but got msg 0x%04x instead\n",
-                        context, count, expected->message, actual->message);
-                }
-            }
-	    expected++;
-        }
-	else if (todo)
-	{
-            failcount++;
-            todo_wine {
-                if (strcmp(winetest_platform, "wine")) dump++;
-                ok_( file, line) (FALSE, "%s: %u: the msg 0x%04x was expected, but got msg 0x%04x instead\n",
-                                  context, count, expected->message, actual->message);
-            }
-            goto done;
-        }
-        else
-        {
-            ok_( file, line) (FALSE, "%s: %u: the msg 0x%04x was expected, but got msg 0x%04x instead\n",
-                              context, count, expected->message, actual->message);
-            dump++;
+            if (compare_message( expected, received, todo, file, line )) matches = FALSE;
             expected++;
-            actual++;
+            received++;
         }
-        count++;
+        winetest_pop_context();
     }
 
-    /* skip all optional trailing messages, check for winevent todo's. */
-    while (expected->message && ((expected->flags & optional) ||
-                                 ((expected->flags & hook) && !hCBT_hook) ||
-                                 ((expected->flags & winevent_hook) && !hEvent_hook) ||
-                                 ((expected->flags & winevent_hook_todo) && !strcmp(winetest_platform, "wine"))))
+    todo_wine_if(todo)
+    ok_(file, line)( matches, "%s mismatches\n", context );
+
+    if (winetest_debug > (matches ? 2 : 1))
     {
-        if ((expected->flags & winevent_hook_todo) && hEvent_hook)
-        {
-            todo_wine {
-                ok_( file, line) (FALSE, "%s: %u: the msg sequence is not complete: expected 0x%04x - actual 0x%04x\n",
-                                context, count, expected->message, actual->message);
-            }
-        }
-	expected++;
+        trace_(file, line)( "expected:\n" );
+        for (tmp_expected = expected; tmp_expected->message; ++tmp_expected)
+            trace_(file, line)( "  %u: %#x, %#x, %#lx, %#lx\n", tmp_expected - expected,
+                                tmp_expected->message, tmp_expected->flags, tmp_expected->wParam,
+                                tmp_expected->lParam );
+        trace_(file, line)( "received:\n" );
+        for (tmp_received = received; tmp_received->message; ++tmp_received)
+            trace_(file, line)( "  %u: %#x, %#x, %#lx, %#lx\n", tmp_received - received,
+                                tmp_received->message, tmp_received->flags, tmp_received->wParam,
+                                tmp_received->lParam );
     }
 
-    if (todo)
-    {
-        todo_wine {
-            if (expected->message || actual->message) {
-                failcount++;
-                if (strcmp(winetest_platform, "wine")) dump++;
-                ok_( file, line) (FALSE, "%s: %u: the msg sequence is not complete: expected %04x - actual %04x\n",
-                                  context, count, expected->message, actual->message);
-            }
-        }
-    }
-    else
-    {
-        if (expected->message || actual->message)
-        {
-            dump++;
-            ok_( file, line) (FALSE, "%s: %u: the msg sequence is not complete: expected %04x - actual %04x\n",
-                              context, count, expected->message, actual->message);
-        }
-    }
-    if( todo && !failcount) /* succeeded yet marked todo */
-        todo_wine {
-            if (!strcmp(winetest_platform, "wine")) dump++;
-            ok_( file, line)( TRUE, "%s: marked \"todo_wine\" but succeeds\n", context);
-        }
-
-done:
-    if (dump) dump_sequence(expected_list, context, file, line);
     flush_sequence();
 }
 
@@ -13997,6 +13860,7 @@ static void test_ShowWindow(void)
         };
         char comment[64];
         INT idx; /* index into the above array of names */
+        winetest_push_context("%u", i);
 
         idx = (sw[i].cmd == SW_NORMALNA) ? 12 : sw[i].cmd;
 
@@ -14038,6 +13902,8 @@ static void test_ShowWindow(void)
 if (0) /* FIXME: Wine behaves completely different here */
         ok(EqualRect(&win_rc, &wp.rcNormalPosition), "expected %s got %s\n",
            wine_dbgstr_rect(&win_rc), wine_dbgstr_rect(&wp.rcNormalPosition));
+
+        winetest_pop_context();
     }
     DestroyWindow(hwnd);
     flush_events();
-- 
2.34.1




More information about the wine-devel mailing list