André Hentschel : ws2_32/tests: Add test for SIOCATMARK.
Alexandre Julliard
julliard at winehq.org
Fri May 27 11:03:41 CDT 2011
Module: wine
Branch: master
Commit: 979f872fc7c2cbce3d46e4fdb597a72396462f43
URL: http://source.winehq.org/git/wine.git/?a=commit;h=979f872fc7c2cbce3d46e4fdb597a72396462f43
Author: André Hentschel <nerv at 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] );
More information about the wine-cvs
mailing list