summaryrefslogtreecommitdiff
path: root/test/testpoll.c
diff options
context:
space:
mode:
authorPaul Querna <pquerna@apache.org>2007-02-19 00:31:01 +0000
committerPaul Querna <pquerna@apache.org>2007-02-19 00:31:01 +0000
commitdc592bfdde071e2b7c419a4be84f35b0c3861f6d (patch)
tree48228c0107026bbf0fefb558e208827d0bccf3d0 /test/testpoll.c
parent5f119205ebe97b2eca3e195f6c8c7a00e6f9b73f (diff)
downloadapr-dc592bfdde071e2b7c419a4be84f35b0c3861f6d.tar.gz
Add the apr_pollcb API.
This was mostly sitting in the pollcb-dev branch for several months at: <https://svn.apache.org/repos/asf/apr/apr/branches/pollcb-dev/> This commit has small improvements over the branch, and also includes a KQueue backend. This will likely break trunk for operating systems were we only have select|poll, so we will need to add some autoconf foo to define a HAVE_APR_POLLCB unless someone can implement apr_pollcb for all platforms. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@509038 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'test/testpoll.c')
-rw-r--r--test/testpoll.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/test/testpoll.c b/test/testpoll.c
index 36dd8a06b..0073317b6 100644
--- a/test/testpoll.c
+++ b/test/testpoll.c
@@ -32,6 +32,7 @@
static apr_socket_t *s[LARGE_NUM_SOCKETS];
static apr_sockaddr_t *sa[LARGE_NUM_SOCKETS];
static apr_pollset_t *pollset;
+static apr_pollcb_t *pollcb;
/* ###: tests surrounded by ifdef OLD_POLL_INTERFACE either need to be
* converted to use the pollset interface or removed. */
@@ -552,6 +553,91 @@ static void pollset_remove(abts_case *tc, void *data)
(hot_files[1].client_data == (void *)1)));
}
+static void setup_pollcb(abts_case *tc, void *data)
+{
+ apr_status_t rv;
+ rv = apr_pollcb_create(&pollcb, LARGE_NUM_SOCKETS, p, 0);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+}
+
+typedef struct pollcb_baton_t {
+ abts_case *tc;
+ int count;
+} pollcb_baton_t;
+
+static apr_status_t trigger_pollcb_cb(void* baton, apr_pollfd_t *descriptor)
+{
+ pollcb_baton_t* pcb = (pollcb_baton_t*) baton;
+ ABTS_PTR_EQUAL(pcb->tc, s[0], descriptor->desc.s);
+ ABTS_PTR_EQUAL(pcb->tc, s[0], descriptor->client_data);
+ pcb->count++;
+ return APR_SUCCESS;
+}
+
+static void trigger_pollcb(abts_case *tc, void *data)
+{
+ apr_status_t rv;
+ apr_pollfd_t socket_pollfd;
+ pollcb_baton_t pcb;
+
+ ABTS_PTR_NOTNULL(tc, s[0]);
+ socket_pollfd.desc_type = APR_POLL_SOCKET;
+ socket_pollfd.reqevents = APR_POLLIN;
+ socket_pollfd.desc.s = s[0];
+ socket_pollfd.client_data = s[0];
+ rv = apr_pollcb_add(pollcb, &socket_pollfd);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ send_msg(s, sa, 0, tc);
+ pcb.tc = tc;
+ pcb.count = 0;
+ rv = apr_pollcb_poll(pollcb, 0, trigger_pollcb_cb, &pcb);
+ ABTS_INT_EQUAL(tc, 0, APR_STATUS_IS_TIMEUP(rv));
+ ABTS_INT_EQUAL(tc, 1, pcb.count);
+
+ rv = apr_pollcb_remove(pollcb, &socket_pollfd);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+}
+
+static void timeout_pollcb(abts_case *tc, void *data)
+{
+ apr_status_t rv;
+ pollcb_baton_t pcb;
+ pcb.count = 0;
+ pcb.tc = tc;
+
+ rv = apr_pollcb_poll(pollcb, 1, trigger_pollcb_cb, &pcb);
+ ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_TIMEUP(rv));
+ ABTS_INT_EQUAL(tc, 0, pcb.count);
+}
+
+static void timeout_pollin_pollcb(abts_case *tc, void *data)
+{
+ apr_status_t rv;
+ pollcb_baton_t pcb;
+ apr_pollfd_t socket_pollfd;
+
+ recv_msg(s, 0, p, tc);
+
+ ABTS_PTR_NOTNULL(tc, s[0]);
+ socket_pollfd.desc_type = APR_POLL_SOCKET;
+ socket_pollfd.reqevents = APR_POLLIN;
+ socket_pollfd.desc.s = s[0];
+ socket_pollfd.client_data = s[0];
+ rv = apr_pollcb_add(pollcb, &socket_pollfd);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ pcb.count = 0;
+ pcb.tc = tc;
+
+ rv = apr_pollcb_poll(pollcb, 1, trigger_pollcb_cb, &pcb);
+ ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_TIMEUP(rv));
+ ABTS_INT_EQUAL(tc, 0, pcb.count);
+
+ rv = apr_pollcb_remove(pollcb, &socket_pollfd);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+}
+
abts_suite *testpoll(abts_suite *suite)
{
suite = ADD_SUITE(suite)
@@ -586,6 +672,13 @@ abts_suite *testpoll(abts_suite *suite)
abts_run_test(suite, close_all_sockets, NULL);
+ abts_run_test(suite, create_all_sockets, NULL);
+ abts_run_test(suite, setup_pollcb, NULL);
+ abts_run_test(suite, trigger_pollcb, NULL);
+ abts_run_test(suite, timeout_pollcb, NULL);
+ abts_run_test(suite, timeout_pollin_pollcb, NULL);
+ abts_run_test(suite, close_all_sockets, NULL);
+
return suite;
}