Add tests/examples

This commit is contained in:
Laurence Withers 2007-11-07 21:12:22 +00:00
parent 0268195b45
commit 7f76359388
5 changed files with 268 additions and 0 deletions

1
src/tests/.params Normal file
View File

@ -0,0 +1 @@
tests c tests liblwevent

3
src/tests/build.default Normal file
View File

@ -0,0 +1,3 @@
source src/tests/build.tests
# kate: replace-trailing-space-save true; space-indent true; tab-width 4;
# vim: syntax=sh:expandtab:ts=4:sw=4

43
src/tests/build.tests Normal file
View File

@ -0,0 +1,43 @@
# These are external variables, and shouldn't clash with anything else
# tests_BUILT
#
build_target liblwevent || return 1
if [ -z ${tests_BUILT} ]
then
LIBS="${liblwevent} ${liblwevent_DEP_CFLAGS} ${liblwevent_DEP_LIBS} "
EXTRAS="-D_GNU_SOURCE -std=c99"
echo "Building test programs..."
do_cmd mkdir -p obj/tests || return 1
for SRC in src/tests/*.c
do
TEST="obj/tests/$(basename ${SRC} | sed -e 's,.c$,,')"
MODIFIED=0
for file in ${LIBS} ${SRC} src/tests/build.tests
do
if [ ${file} -nt ${TEST} ]
then
MODIFIED=1
break
fi
done
if [ ${MODIFIED} -ne 0 ]
then
do_cmd ${CC} -Iobj ${CFLAGS} -o ${TEST} ${SRC} ${LIBS} ${EXTRAS} || return 1
print_success "Built ${TEST}"
else
print_success "${TEST} is up to date"
fi
done
print_success "All tests built"
tests_BUILT=1
fi
# kate: replace-trailing-space-save true; space-indent true; tab-width 4;
# vim: syntax=sh:expandtab:ts=4:sw=4

185
src/tests/echoserver.c Normal file
View File

@ -0,0 +1,185 @@
/* liblwevent/src/tests/echoserver.c
*
* (c)2007, Laurence Withers, <l@lwithers.me.uk>.
* Released under the GNU GPLv3. See file COPYING or
* http://www.gnu.org/copyleft/gpl.html for details.
*/
#include "lwevent.h"
#include <errno.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/epoll.h>
#include <sys/types.h>
#include <sys/socket.h>
char buf[4096];
void client_callback(struct lwevent* ev, int revents)
{
ssize_t amt;
char* wr, * end;
int fd;
if(revents & ~(EPOLLIN | EPOLLHUP | EPOLLRDHUP)) {
fprintf(stderr, "Unexpected flags in client_callback(): 0x%X.\n", revents);
lwevent_loop_exit = 1;
}
if(revents & (EPOLLHUP | EPOLLRDHUP)) {
fputs("Client closed.\n", stdout);
lwevent_free_and_close(ev);
return;
}
fd = lwevent_get_fd(ev);
while(1) {
amt = TEMP_FAILURE_RETRY( read(fd, buf, sizeof(buf)) );
if(amt == -1) {
if(errno != EAGAIN) {
perror("read");
lwevent_free_and_close(ev);
}
return;
}
if(amt == 0) {
fputs("Client closed (EOF).\n", stdout);
lwevent_free_and_close(ev);
return;
}
wr = buf;
end = buf + amt;
while(wr != end) {
amt = TEMP_FAILURE_RETRY( write(fd, wr, end - wr) );
if(amt == -1) {
perror("write");
lwevent_free_and_close(ev);
return;
}
wr += amt;
}
}
}
void server_callback(struct lwevent* ev, int revents)
{
int ret;
if(revents & ~EPOLLIN) {
fprintf(stderr, "Unexpected flags in server_callback(): 0x%X.\n", revents);
lwevent_loop_exit = 1;
}
while(1) {
/* accept a possible client connection */
ret = TEMP_FAILURE_RETRY( accept(lwevent_get_fd(ev), 0, 0) );
if(ret == -1) {
if(errno == EAGAIN) return;
perror("accept");
lwevent_loop_exit = 1;
}
/* set up a new client */
if(lwevent_nonblock(ret)) {
perror("lwevent_nonblock");
close(ret);
continue;
}
if(!lwevent_new(ret, EPOLLIN | EPOLLRDHUP | EPOLLET, client_callback)) {
perror("lwevent_new");
close(ret);
}
fputs("New client.\n", stdout);
}
}
int main(int argc, char* argv[])
{
int ret = 0, fd;
struct addrinfo* saddr;
/* parse commandline arguments */
if(argc == 2 && !strcmp(argv[1], "--print-summary")) {
fputs("TCP echo server.\n", stdout);
return 0;
}
if(argc != 3) {
fputs("Expecting server name (or IP address) and port number.\n", stderr);
return 1;
}
/* initialise liblwevent */
if(lwevent_init()) {
perror("lwevent_init");
return 1;
}
#if 0
if(!lwevent_signalfd_default()) {
perror("lwevent_signalfd_default");
return 1;
}
#endif
/* get hostname and socket, and bind it */
ret = getaddrinfo(argv[1], argv[2], 0, &saddr);
if(ret) {
fputs("getaddrinfo: ", stderr);
fputs(gai_strerror(ret), stderr);
putc('\n', stderr);
return 1;
}
fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(fd == -1) {
perror("socket");
return 1;
}
if(lwevent_nonblock(fd)) {
perror("lwevent_nonblock");
return 1;
}
if(bind(fd, saddr->ai_addr, saddr->ai_addrlen)) {
perror("bind");
return 1;
}
freeaddrinfo(saddr);
if(listen(fd, 16)) {
perror("listen");
return 1;
}
/* set up server event */
if(!lwevent_new(fd, EPOLLIN | EPOLLET, server_callback)) {
perror("lwevent_new");
return 1;
}
/* main event loop */
ret = lwevent_loop();
if(ret) perror("lwevent_loop");
return ret;
}
/* options for text editors
kate: replace-trailing-space-save true; space-indent true; tab-width 4;
vim: expandtab:ts=4:sw=4
*/

36
src/tests/template Normal file
View File

@ -0,0 +1,36 @@
/* liblwevent/src/tests/???.c
*
* (c)2007, Laurence Withers, <l@lwithers.me.uk>.
* Released under the GNU GPLv3. See file COPYING or
* http://www.gnu.org/copyleft/gpl.html for details.
*/
#include "lwevent.h"
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
int ret = 0;
if(argc == 2 && !strcmp(argv[1], "--print-summary")) {
printf("One line summary.\n");
return 0;
}
if(argc == 1) {
/* empty argument list */
}
/* TODO */
return ret;
}
/* options for text editors
kate: replace-trailing-space-save true; space-indent true; tab-width 4;
vim: expandtab:ts=4:sw=4
*/