📄 testpoll.c
字号:
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as * applicable. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */#include "test_apr.h"#include "apr_strings.h"#include "apr_errno.h"#include "apr_general.h"#include "apr_lib.h"#include "apr_network_io.h"#include "apr_poll.h"#define SMALL_NUM_SOCKETS 3/* We can't use 64 here, because some platforms *ahem* Solaris *ahem* have * a default limit of 64 open file descriptors per process. If we use * 64, the test will fail even though the code is correct. */#define LARGE_NUM_SOCKETS 50static apr_socket_t *s[LARGE_NUM_SOCKETS];static apr_sockaddr_t *sa[LARGE_NUM_SOCKETS];static apr_pollfd_t *pollarray;static apr_pollfd_t *pollarray_large;static apr_pollset_t *pollset;static void make_socket(apr_socket_t **sock, apr_sockaddr_t **sa, apr_port_t port, apr_pool_t *p, CuTest *tc){ apr_status_t rv; rv = apr_sockaddr_info_get(sa, "127.0.0.1", APR_UNSPEC, port, 0, p); CuAssertIntEquals(tc, APR_SUCCESS, rv); rv = apr_socket_create(sock, (*sa)->family, SOCK_DGRAM, p); CuAssertIntEquals(tc, APR_SUCCESS, rv); rv =apr_socket_bind((*sock), (*sa)); CuAssertIntEquals(tc, APR_SUCCESS, rv);}static void check_sockets(const apr_pollfd_t *pollarray, apr_socket_t **sockarray, int which, int pollin, CuTest *tc){ apr_status_t rv; apr_int16_t event; char *str; rv = apr_poll_revents_get(&event, sockarray[which], (apr_pollfd_t *)pollarray); CuAssertIntEquals(tc, APR_SUCCESS, rv); if (pollin) { str = apr_psprintf(p, "Socket %d not signalled when it should be", which); CuAssert(tc, str, event & APR_POLLIN); } else { str = apr_psprintf(p, "Socket %d signalled when it should not be", which); CuAssert(tc, str, !(event & APR_POLLIN)); }}static void send_msg(apr_socket_t **sockarray, apr_sockaddr_t **sas, int which, CuTest *tc){ apr_size_t len = 5; apr_status_t rv; CuAssertPtrNotNull(tc, sockarray[which]); rv = apr_socket_sendto(sockarray[which], sas[which], 0, "hello", &len); CuAssertIntEquals(tc, APR_SUCCESS, rv); CuAssertIntEquals(tc, strlen("hello"), len);}static void recv_msg(apr_socket_t **sockarray, int which, apr_pool_t *p, CuTest *tc){ apr_size_t buflen = 5; char *buffer = apr_pcalloc(p, sizeof(char) * (buflen + 1)); apr_sockaddr_t *recsa; apr_status_t rv; CuAssertPtrNotNull(tc, sockarray[which]); apr_sockaddr_info_get(&recsa, "127.0.0.1", APR_UNSPEC, 7770, 0, p); rv = apr_socket_recvfrom(recsa, sockarray[which], 0, buffer, &buflen); CuAssertIntEquals(tc, APR_SUCCESS, rv); CuAssertIntEquals(tc, strlen("hello"), buflen); CuAssertStrEquals(tc, "hello", buffer);} static void create_all_sockets(CuTest *tc){ int i; for (i = 0; i < LARGE_NUM_SOCKETS; i++){ make_socket(&s[i], &sa[i], 7777 + i, p, tc); }} static void setup_small_poll(CuTest *tc){ apr_status_t rv; int i; rv = apr_poll_setup(&pollarray, SMALL_NUM_SOCKETS, p); CuAssertIntEquals(tc, APR_SUCCESS, rv); for (i = 0; i < SMALL_NUM_SOCKETS;i++){ CuAssertIntEquals(tc, 0, pollarray[i].reqevents); CuAssertIntEquals(tc, 0, pollarray[i].rtnevents); rv = apr_poll_socket_add(pollarray, s[i], APR_POLLIN); CuAssertIntEquals(tc, APR_SUCCESS, rv); CuAssertPtrEquals(tc, s[i], pollarray[i].desc.s); }}static void setup_large_poll(CuTest *tc){ apr_status_t rv; int i; rv = apr_poll_setup(&pollarray_large, LARGE_NUM_SOCKETS, p); CuAssertIntEquals(tc, APR_SUCCESS, rv); for (i = 0; i < LARGE_NUM_SOCKETS;i++){ CuAssertIntEquals(tc, 0, pollarray_large[i].reqevents); CuAssertIntEquals(tc, 0, pollarray_large[i].rtnevents); rv = apr_poll_socket_add(pollarray_large, s[i], APR_POLLIN); CuAssertIntEquals(tc, APR_SUCCESS, rv); CuAssertPtrEquals(tc, s[i], pollarray_large[i].desc.s); }}static void nomessage(CuTest *tc){ apr_status_t rv; int srv = SMALL_NUM_SOCKETS; rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC); CuAssertIntEquals(tc, 1, APR_STATUS_IS_TIMEUP(rv)); check_sockets(pollarray, s, 0, 0, tc); check_sockets(pollarray, s, 1, 0, tc); check_sockets(pollarray, s, 2, 0, tc);}static void send_2(CuTest *tc){ apr_status_t rv; int srv = SMALL_NUM_SOCKETS; send_msg(s, sa, 2, tc); rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC); CuAssertIntEquals(tc, APR_SUCCESS, rv); check_sockets(pollarray, s, 0, 0, tc); check_sockets(pollarray, s, 1, 0, tc); check_sockets(pollarray, s, 2, 1, tc);}static void recv_2_send_1(CuTest *tc){ apr_status_t rv; int srv = SMALL_NUM_SOCKETS; recv_msg(s, 2, p, tc); send_msg(s, sa, 1, tc); rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC); CuAssertIntEquals(tc, APR_SUCCESS, rv); check_sockets(pollarray, s, 0, 0, tc); check_sockets(pollarray, s, 1, 1, tc); check_sockets(pollarray, s, 2, 0, tc);}static void send_2_signaled_1(CuTest *tc){ apr_status_t rv; int srv = SMALL_NUM_SOCKETS; send_msg(s, sa, 2, tc); rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC); CuAssertIntEquals(tc, APR_SUCCESS, rv); check_sockets(pollarray, s, 0, 0, tc); check_sockets(pollarray, s, 1, 1, tc); check_sockets(pollarray, s, 2, 1, tc);}static void recv_1_send_0(CuTest *tc){ apr_status_t rv; int srv = SMALL_NUM_SOCKETS; recv_msg(s, 1, p, tc); send_msg(s, sa, 0, tc); rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC); CuAssertIntEquals(tc, APR_SUCCESS, rv); check_sockets(pollarray, s, 0, 1, tc); check_sockets(pollarray, s, 1, 0, tc); check_sockets(pollarray, s, 2, 1, tc);}static void clear_all_signalled(CuTest *tc){ apr_status_t rv; int srv = SMALL_NUM_SOCKETS; recv_msg(s, 0, p, tc); recv_msg(s, 2, p, tc); rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC); CuAssertIntEquals(tc, 1, APR_STATUS_IS_TIMEUP(rv)); check_sockets(pollarray, s, 0, 0, tc); check_sockets(pollarray, s, 1, 0, tc); check_sockets(pollarray, s, 2, 0, tc);}static void send_large_pollarray(CuTest *tc){ apr_status_t rv; int lrv = LARGE_NUM_SOCKETS; int i; send_msg(s, sa, LARGE_NUM_SOCKETS - 1, tc); rv = apr_poll(pollarray_large, LARGE_NUM_SOCKETS, &lrv, 2 * APR_USEC_PER_SEC); CuAssertIntEquals(tc, APR_SUCCESS, rv); for (i = 0; i < LARGE_NUM_SOCKETS; i++) { if (i == (LARGE_NUM_SOCKETS - 1)) { check_sockets(pollarray_large, s, i, 1, tc); } else { check_sockets(pollarray_large, s, i, 0, tc); } }}static void recv_large_pollarray(CuTest *tc){ apr_status_t rv; int lrv = LARGE_NUM_SOCKETS; int i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -