Module: wine Branch: master Commit: 979f872fc7c2cbce3d46e4fdb597a72396462f43 URL: http://source.winehq.org/git/wine.git/?a=commit;h=979f872fc7c2cbce3d46e4fdb5...
Author: André Hentschel nerv@dawncrow.de Date: Thu May 26 23:50:32 2011 +0200
ws2_32/tests: Add test for SIOCATMARK.
---
dlls/ws2_32/tests/sock.c | 154 ++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 150 insertions(+), 4 deletions(-)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index ac0a7d0..d1ac3c4 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -30,7 +30,6 @@ #include "wine/test.h"
#define MAX_CLIENTS 4 /* Max number of clients */ -#define NUM_TESTS 4 /* Number of tests performed */ #define FIRST_CHAR 'A' /* First character in transferred pattern */ #define BIND_SLEEP 10 /* seconds to wait between attempts to bind() */ #define BIND_TRIES 6 /* Number of bind() attempts */ @@ -252,6 +251,16 @@ static void read_zero_bytes ( SOCKET s ) ok ( n <= 0, "garbage data received: %d bytes\n", n ); }
+static int do_oob_send ( SOCKET s, char *buf, int buflen, int sendlen ) +{ + char* last = buf + buflen, *p; + int n = 1; + for ( p = buf; n > 0 && p < last; p += n ) + n = send ( s, p, min ( sendlen, last - p ), MSG_OOB ); + wsa_ok ( n, 0 <=, "do_oob_send (%x): error %d\n" ); + return p - buf; +} + static int do_synchronous_send ( SOCKET s, char *buf, int buflen, int sendlen ) { char* last = buf + buflen, *p; @@ -455,6 +464,76 @@ static VOID WINAPI simple_server ( server_params *par ) }
/* + * oob_server: A very basic server receiving out-of-band data. + */ +static VOID WINAPI oob_server ( server_params *par ) +{ + test_params *gen = par->general; + server_memory *mem; + u_long atmark; + int pos, n_recvd, n_expected = gen->n_chunks * gen->chunk_size, tmp, + id = GetCurrentThreadId(); + + trace ( "oob_server (%x) starting\n", id ); + + set_so_opentype ( FALSE ); /* non-overlapped */ + server_start ( par ); + mem = TlsGetValue ( tls ); + + wsa_ok ( set_blocking ( mem->s, TRUE ), 0 ==, "oob_server (%x): failed to set blocking mode: %d\n"); + wsa_ok ( listen ( mem->s, SOMAXCONN ), 0 ==, "oob_server (%x): listen failed: %d\n"); + + trace ( "oob_server (%x) ready\n", id ); + SetEvent ( server_ready ); /* notify clients */ + + trace ( "oob_server (%x): waiting for client\n", id ); + + /* accept a single connection */ + tmp = sizeof ( mem->sock[0].peer ); + mem->sock[0].s = accept ( mem->s, (struct sockaddr*) &mem->sock[0].peer, &tmp ); + wsa_ok ( mem->sock[0].s, INVALID_SOCKET !=, "oob_server (%x): accept failed: %d\n" ); + + ok ( mem->sock[0].peer.sin_addr.s_addr == inet_addr ( gen->inet_addr ), + "oob_server (%x): strange peer address\n", id ); + + /* check atmark state */ + ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark ); + todo_wine ok ( atmark == 1, "oob_server (%x): unexpectedly at the OOB mark: %i\n", id, atmark ); + + /* Receive normal data and check atmark state */ + n_recvd = do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, n_expected, par->buflen ); + ok ( n_recvd == n_expected, + "simple_server (%x): received less data than expected: %d of %d\n", id, n_recvd, n_expected ); + pos = test_buffer ( mem->sock[0].buf, gen->chunk_size, gen->n_chunks ); + ok ( pos == -1, "simple_server (%x): test pattern error: %d\n", id, pos); + + ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark ); + todo_wine ok ( atmark == 1, "oob_server (%x): unexpectedly at the OOB mark: %i\n", id, atmark ); + + /* Receive a part of the out-of-band data and check atmark state */ + n_recvd = do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, 8, par->buflen ); + ok ( n_recvd == 8, + "oob_server (%x): received less data than expected: %d of %d\n", id, n_recvd, 8 ); + n_expected -= 8; + + ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark ); + ok ( atmark == 0, "oob_server (%x): not at the OOB mark: %i\n", id, atmark ); + + /* Receive the rest of the out-of-band data and check atmark state */ + n_recvd = do_synchronous_recv ( mem->sock[0].s, mem->sock[0].buf, n_expected, par->buflen ); + + ioctlsocket ( mem->sock[0].s, SIOCATMARK, &atmark ); + ok ( atmark == 0, "oob_server (%x): not at the OOB mark: %i\n", id, atmark ); + + /* cleanup */ + wsa_ok ( closesocket ( mem->sock[0].s ), 0 ==, "oob_server (%x): closesocket error: %d\n" ); + mem->sock[0].s = INVALID_SOCKET; + + trace ( "oob_server (%x) exiting\n", id ); + server_stop (); +} + +/* * select_server: A non-blocking server. */ static VOID WINAPI select_server ( server_params *par ) @@ -637,6 +716,52 @@ static VOID WINAPI simple_client ( client_params *par ) }
/* + * oob_client: A very basic client sending out-of-band data. + */ +static VOID WINAPI oob_client ( client_params *par ) +{ + test_params *gen = par->general; + client_memory *mem; + int n_sent, n_expected = gen->n_chunks * gen->chunk_size, id; + + id = GetCurrentThreadId(); + trace ( "oob_client (%x): starting\n", id ); + /* wait here because we want to call set_so_opentype before creating a socket */ + WaitForSingleObject ( server_ready, INFINITE ); + trace ( "oob_client (%x): server ready\n", id ); + + check_so_opentype (); + set_so_opentype ( FALSE ); /* non-overlapped */ + client_start ( par ); + mem = TlsGetValue ( tls ); + + /* Connect */ + wsa_ok ( connect ( mem->s, (struct sockaddr*) &mem->addr, sizeof ( mem->addr ) ), + 0 ==, "oob_client (%x): connect error: %d\n" ); + ok ( set_blocking ( mem->s, TRUE ) == 0, + "oob_client (%x): failed to set blocking mode\n", id ); + trace ( "oob_client (%x) connected\n", id ); + + /* send data to server */ + n_sent = do_synchronous_send ( mem->s, mem->send_buf, n_expected, par->buflen ); + ok ( n_sent == n_expected, + "oob_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected ); + + /* send out-of-band data to server */ + n_sent = do_oob_send ( mem->s, mem->send_buf, n_expected, par->buflen ); + ok ( n_sent == n_expected, + "oob_client (%x): sent less data than expected: %d of %d\n", id, n_sent, n_expected ); + + /* shutdown send direction */ + wsa_ok ( shutdown ( mem->s, SD_SEND ), 0 ==, "simple_client (%x): shutdown failed: %d\n" ); + + /* cleanup */ + read_zero_bytes ( mem->s ); + trace ( "oob_client (%x) exiting\n", id ); + client_stop (); +} + +/* * simple_mixed_client: mixing send and recvfrom */ static VOID WINAPI simple_mixed_client ( client_params *par ) @@ -1268,7 +1393,7 @@ cleanup: SERVERIP, \ SERVERPORT
-static test_setup tests [NUM_TESTS] = +static test_setup tests [] = { /* Test 0: synchronous client and server */ { @@ -1333,7 +1458,28 @@ static test_setup tests [NUM_TESTS] = 128 } }, - /* Test 3: synchronous mixed client and server */ + /* Test 3: OOB client, OOB server */ + { + { + STD_STREAM_SOCKET, + 128, + 16, + 1 + }, + oob_server, + { + NULL, + 0, + 128 + }, + oob_client, + { + NULL, + 0, + 128 + } + }, + /* Test 4: synchronous mixed client and server */ { { STD_STREAM_SOCKET, @@ -4682,7 +4828,7 @@ START_TEST( sock ) test_ip_pktinfo(); test_extendedSocketOptions();
- for (i = 0; i < NUM_TESTS; i++) + for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) { trace ( " **** STARTING TEST %d ****\n", i ); do_test ( &tests[i] );