[PATCH] ws2_32/tests: Add order-agnostic check in test_simultaneous_async_recv.

Jinoh Kang jinoh.kang.kr at gmail.com
Fri Jan 7 12:15:20 CST 2022


Signed-off-by: Jinoh Kang <jinoh.kang.kr at gmail.com>
---
 dlls/ws2_32/tests/sock.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 782b1e59729..966a681e809 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -11520,6 +11520,8 @@ static void test_simultaneous_async_recv(void)
         const void *expect = msgstr + i * stride;
         const void *actual = resbuf + i * stride;
         DWORD size;
+        int allcmp;
+        size_t j;
 
         ret = WaitForSingleObject(events[i], 1000);
         ok(!ret, "wait timed out\n");
@@ -11528,6 +11530,20 @@ static void test_simultaneous_async_recv(void)
         ret = GetOverlappedResult((HANDLE)client, &overlappeds[i], &size, FALSE);
         ok(ret, "got error %u\n", GetLastError());
         ok(size == stride, "got size %u\n", size);
+
+        allcmp = 0;
+        for (j = 0; j <= num_io * stride - size; j++) allcmp |= !memcmp(msgstr + j, actual, size);
+        ok(allcmp, "returned data shall be part of original message (got %s)\n", debugstr_an(actual, size));
+
+        /* Observation: Windows *always* respects the order of WSARecv() calls
+         * and fills out the buffers in first-in-first-out manner.
+         *
+         * This behaviour is admittedly not clearly documented, and it can be
+         * argued that a well-designed application would instead use vectored
+         * I/O with an array of WSABUFs, which are then are guaranteed to be
+         * filled out in order.  However, at least one real-world application
+         * is known to rely on the WSARecv() order-respecting behaviour.
+         */
         ok(!memcmp(expect, actual, stride), "expected %s, got %s\n", debugstr_an(expect, stride), debugstr_an(actual, stride));
     }
 
-- 
2.31.1




More information about the wine-devel mailing list