On 'win32-socket-timeout-nonblocking' branch: Add test for apr_socket_timeout_set()
and apr_socket_opt_set(APR_SO_NONBLOCK) behavior.

git-svn-id: https://svn.apache.org/repos/asf/apr/apr/branches/win32-socket-timeout-nonblocking@1920078 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/test/testsock.c b/test/testsock.c
index 749ce72..69104ee 100644
--- a/test/testsock.c
+++ b/test/testsock.c
@@ -734,6 +734,102 @@
 #endif /* APR_HAVE_IPV6 */
 }
 
+static void test_nonblock_timeout(abts_case *tc, void *data)
+{
+    apr_status_t rv;
+    apr_socket_t *sock;
+    apr_interval_time_t timeout;
+    apr_int32_t nonblock;
+
+    rv = apr_socket_create(&sock, APR_INET, SOCK_STREAM, APR_PROTO_TCP, p);
+    APR_ASSERT_SUCCESS(tc, "Problem creating socket", rv);
+
+    /* By default socket timeout is infinite. */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_timeout_get()",
+                       apr_socket_timeout_get(sock, &timeout));
+    ABTS_LLONG_EQUAL(tc, -1, timeout);
+
+    /* By default socket is blocking. */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_opt_get(APR_SO_NONBLOCK)",
+                       apr_socket_opt_get(sock, APR_SO_NONBLOCK, &nonblock));
+    ABTS_INT_EQUAL(tc, 0, nonblock);
+
+
+    /* Set timeout = 0 (non-blocking). */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_timeout_set(0)",
+                       apr_socket_timeout_set(sock, 0));
+
+    /* Timeout should be zero. */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_timeout_get()",
+                       apr_socket_timeout_get(sock, &timeout));
+    ABTS_LLONG_EQUAL(tc, 0, timeout);
+
+    /* apr_socket_timeout_set() update non-blocking flag. */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_opt_get(APR_SO_NONBLOCK)",
+                       apr_socket_opt_get(sock, APR_SO_NONBLOCK, &nonblock));
+    ABTS_INT_EQUAL(tc, 1, nonblock);
+
+
+    /* Set timeout = 2 seconds. */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_timeout_set(2s)",
+                       apr_socket_timeout_set(sock, apr_time_from_sec(2)));
+
+    /* Timeout should be 2s. */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_timeout_get()",
+                       apr_socket_timeout_get(sock, &timeout));
+    ABTS_LLONG_EQUAL(tc, apr_time_from_sec(2), timeout);
+
+    /* apr_socket_timeout_set() update non-blocking flag. */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_opt_get(APR_SO_NONBLOCK)",
+                       apr_socket_opt_get(sock, APR_SO_NONBLOCK, &nonblock));
+    ABTS_INT_EQUAL(tc, 0, nonblock);
+
+
+    /* Set APR_SO_NONBLOCK = 1. */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_opt_set(APR_SO_NONBLOCK, 1)",
+                       apr_socket_opt_set(sock, APR_SO_NONBLOCK, 1));
+
+    /* Timeout should be unmodified (2s). */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_timeout_get()",
+                       apr_socket_timeout_get(sock, &timeout));
+    ABTS_LLONG_EQUAL(tc, apr_time_from_sec(2), timeout);
+
+    /* Non-blocking flag should be updated. */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_opt_get(APR_SO_NONBLOCK)",
+                       apr_socket_opt_get(sock, APR_SO_NONBLOCK, &nonblock));
+    ABTS_INT_EQUAL(tc, 1, nonblock);
+
+
+    /* Set timeout = 0 again. */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_timeout_set(0)",
+                       apr_socket_timeout_set(sock, 0));
+
+    /* Timeout should be zero. */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_timeout_get()",
+                       apr_socket_timeout_get(sock, &timeout));
+    ABTS_LLONG_EQUAL(tc, 0, timeout);
+
+    /* apr_socket_timeout_set() update non-blocking flag. */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_opt_get(APR_SO_NONBLOCK)",
+                       apr_socket_opt_get(sock, APR_SO_NONBLOCK, &nonblock));
+    ABTS_INT_EQUAL(tc, 1, nonblock);
+
+
+    /* Set timeout = -1 (Infinite). */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_timeout_set(-1)",
+                       apr_socket_timeout_set(sock, -1));
+
+    /* Timeout should be -1. */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_timeout_get()",
+                       apr_socket_timeout_get(sock, &timeout));
+    ABTS_LLONG_EQUAL(tc, -1, timeout);
+
+    /* apr_socket_timeout_set() update non-blocking flag. */
+    APR_ASSERT_SUCCESS(tc, "apr_socket_opt_get(APR_SO_NONBLOCK)",
+                       apr_socket_opt_get(sock, APR_SO_NONBLOCK, &nonblock));
+    ABTS_INT_EQUAL(tc, 0, nonblock);
+}
+
 abts_suite *testsock(abts_suite *suite)
 {
     suite = ADD_SUITE(suite)
@@ -752,6 +848,7 @@
     abts_run_test(suite, test_nonblock_inheritance, NULL);
     abts_run_test(suite, test_freebind, NULL);
     abts_run_test(suite, test_zone, NULL);
+    abts_run_test(suite, test_nonblock_timeout, NULL);
 #if APR_HAVE_SOCKADDR_UN
     socket_name = UNIX_SOCKET_NAME;
     socket_type = APR_UNIX;