Alexandre Julliard : ws2_32/tests: Add some tests for write watches.
Alexandre Julliard
julliard at winehq.org
Thu Sep 21 15:01:01 CDT 2017
Module: wine
Branch: master
Commit: 1c72e594e32714d12f086714d6d0b37c188e50dc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1c72e594e32714d12f086714d6d0b37c188e50dc
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Sep 21 19:41:17 2017 +0200
ws2_32/tests: Add some tests for write watches.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ws2_32/tests/sock.c | 195 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 195 insertions(+)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 897839a..02f7473 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -6849,6 +6849,200 @@ end:
WSACloseEvent(event);
}
+struct write_watch_thread_args
+{
+ int func;
+ SOCKET dest;
+ void *base;
+ DWORD size;
+ const char *expect;
+};
+
+static DWORD CALLBACK write_watch_thread( void *arg )
+{
+ struct write_watch_thread_args *args = arg;
+ struct sockaddr addr;
+ int addr_len, ret;
+ DWORD bytes, flags = 0;
+ WSABUF buf[1];
+
+ switch (args->func)
+ {
+ case 0:
+ ret = recv( args->dest, args->base, args->size, 0 );
+ ok( ret == strlen(args->expect) + 1, "wrong len %d\n", ret );
+ ok( !strcmp( args->base, args->expect ), "wrong data\n" );
+ break;
+ case 1:
+ ret = recvfrom( args->dest, args->base, args->size, 0, &addr, &addr_len );
+ ok( ret == strlen(args->expect) + 1, "wrong len %d\n", ret );
+ ok( !strcmp( args->base, args->expect ), "wrong data\n" );
+ break;
+ case 2:
+ buf[0].len = args->size;
+ buf[0].buf = args->base;
+ ret = WSARecv( args->dest, buf, 1, &bytes, &flags, NULL, NULL );
+ ok( !ret, "WSARecv failed %u\n", GetLastError() );
+ ok( bytes == strlen(args->expect) + 1, "wrong len %d\n", bytes );
+ ok( !strcmp( args->base, args->expect ), "wrong data\n" );
+ break;
+ case 3:
+ buf[0].len = args->size;
+ buf[0].buf = args->base;
+ ret = WSARecvFrom( args->dest, buf, 1, &bytes, &flags, &addr, &addr_len, NULL, NULL );
+ ok( !ret, "WSARecvFrom failed %u\n", GetLastError() );
+ ok( bytes == strlen(args->expect) + 1, "wrong len %d\n", bytes );
+ ok( !strcmp( args->base, args->expect ), "wrong data\n" );
+ break;
+ }
+ return 0;
+}
+
+static void test_write_watch(void)
+{
+ SOCKET src, dest;
+ WSABUF bufs[2];
+ WSAOVERLAPPED ov;
+ struct write_watch_thread_args args;
+ DWORD bytesReturned, flags, size;
+ struct sockaddr addr;
+ int addr_len, ret;
+ HANDLE thread, event;
+ char *base;
+ void *results[64];
+ ULONG_PTR count;
+ ULONG pagesize;
+ UINT (WINAPI *pGetWriteWatch)(DWORD,LPVOID,SIZE_T,LPVOID*,ULONG_PTR*,ULONG*);
+
+ pGetWriteWatch = (void *)GetProcAddress( GetModuleHandleA("kernel32.dll"), "GetWriteWatch" );
+ if (!pGetWriteWatch)
+ {
+ win_skip( "write watched not supported\n" );
+ return;
+ }
+
+ tcp_socketpair(&src, &dest);
+ if (src == INVALID_SOCKET || dest == INVALID_SOCKET)
+ {
+ skip("failed to create sockets\n");
+ return;
+ }
+
+ memset(&ov, 0, sizeof(ov));
+ ov.hEvent = event = CreateEventA(NULL, FALSE, FALSE, NULL);
+ ok(ov.hEvent != NULL, "could not create event object, errno = %d\n", GetLastError());
+
+ flags = 0;
+
+ size = 0x10000;
+ base = VirtualAlloc( 0, size, MEM_RESERVE | MEM_COMMIT | MEM_WRITE_WATCH, PAGE_READWRITE );
+ ok( base != NULL, "VirtualAlloc failed %u\n", GetLastError() );
+
+ memset( base, 0, size );
+ count = 64;
+ ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
+ ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
+ ok( count == 16, "wrong count %lu\n", count );
+
+ bufs[0].len = 5;
+ bufs[0].buf = base;
+ bufs[1].len = 0x8000;
+ bufs[1].buf = base + 0x4000;
+
+ ret = WSARecv( dest, bufs, 2, NULL, &flags, &ov, NULL);
+ ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING,
+ "WSARecv failed - %d error %d\n", ret, GetLastError());
+
+ count = 64;
+ ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
+ ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
+ ok( count == 9, "wrong count %lu\n", count );
+ ok( !base[0], "data set\n" );
+
+ send(src, "test message", sizeof("test message"), 0);
+
+ ret = GetOverlappedResult( (HANDLE)dest, &ov, &bytesReturned, TRUE );
+ todo_wine
+ {
+ ok( ret, "GetOverlappedResult failed %u\n", GetLastError() );
+ ok( bytesReturned == sizeof("test message"), "wrong size %u\n", bytesReturned );
+ ok( !memcmp( base, "test ", 5 ), "wrong data %s\n", base );
+ ok( !memcmp( base + 0x4000, "message", 8 ), "wrong data %s\n", base + 0x4000 );
+ }
+
+ count = 64;
+ ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
+ ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
+ ok( count == 0, "wrong count %lu\n", count );
+
+ memset( base, 0, size );
+ count = 64;
+ ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
+ ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
+ ok( count == 16, "wrong count %lu\n", count );
+
+ bufs[1].len = 0x4000;
+ bufs[1].buf = base + 0x2000;
+ ret = WSARecvFrom( dest, bufs, 2, NULL, &flags, &addr, &addr_len, &ov, NULL);
+ todo_wine
+ ok(ret == SOCKET_ERROR && GetLastError() == ERROR_IO_PENDING,
+ "WSARecv failed - %d error %d\n", ret, GetLastError());
+
+ count = 64;
+ ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
+ ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
+ ok( count == 5, "wrong count %lu\n", count );
+ todo_wine
+ ok( !base[0], "data set\n" );
+
+ send(src, "test message", sizeof("test message"), 0);
+
+ ret = GetOverlappedResult( (HANDLE)dest, &ov, &bytesReturned, TRUE );
+ ok( ret, "GetOverlappedResult failed %u\n", GetLastError() );
+ ok( bytesReturned == sizeof("test message"), "wrong size %u\n", bytesReturned );
+ ok( !memcmp( base, "test ", 5 ), "wrong data %s\n", base );
+ ok( !memcmp( base + 0x2000, "message", 8 ), "wrong data %s\n", base + 0x2000 );
+
+ count = 64;
+ ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
+ ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
+ ok( count == 0, "wrong count %lu\n", count );
+
+ memset( base, 0, size );
+ count = 64;
+ ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
+ ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
+ ok( count == 16, "wrong count %lu\n", count );
+
+ args.dest = dest;
+ args.base = base;
+ args.size = 0x7002;
+ args.expect = "test message";
+ for (args.func = 0; args.func < 4; args.func++)
+ {
+ thread = CreateThread( NULL, 0, write_watch_thread, &args, 0, NULL );
+ Sleep( 200 );
+
+ count = 64;
+ ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
+ ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
+ ok( count == 8, "wrong count %lu\n", count );
+
+ send(src, "test message", sizeof("test message"), 0);
+ WaitForSingleObject( thread, 10000 );
+ CloseHandle( thread );
+
+ count = 64;
+ ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize );
+ ok( !ret, "GetWriteWatch failed %u\n", GetLastError() );
+ ok( count == 0, "wrong count %lu\n", count );
+ }
+ WSACloseEvent( event );
+ closesocket( dest );
+ closesocket( src );
+ VirtualFree( base, 0, MEM_FREE );
+}
+
#define POLL_CLEAR() ix = 0
#define POLL_SET(s, ev) {fds[ix].fd = s; fds[ix++].events = ev;}
#define POLL_ISSET(s, rev) poll_isset(fds, ix, s, rev)
@@ -10662,6 +10856,7 @@ START_TEST( sock )
test_WSASendTo();
test_WSARecv();
test_WSAPoll();
+ test_write_watch();
test_events(0);
test_events(1);
More information about the wine-cvs
mailing list