diff options
author | Luo Jinghua <sunmoon1997@gmail.com> | 2009-11-08 14:39:47 +0800 |
---|---|---|
committer | Luo Jinghua <sunmoon1997@gmail.com> | 2009-11-08 14:39:47 +0800 |
commit | 2c51d92c28a4d4fa8cf7f628416f33a2d664cf7f (patch) | |
tree | 41443f1ec81dd3cb454a365b46a84682dca8d620 | |
parent | 4d8acb028f581d48eae00a4b21baf2f127c80977 (diff) |
milkway/test: add a socket test case
-rw-r--r-- | milkway/test/Makefile.am | 10 | ||||
-rw-r--r-- | milkway/test/socket-test.c | 138 |
2 files changed, 146 insertions, 2 deletions
diff --git a/milkway/test/Makefile.am b/milkway/test/Makefile.am index e1499ef..9168c4f 100644 --- a/milkway/test/Makefile.am +++ b/milkway/test/Makefile.am @@ -1,5 +1,5 @@ SUBDIRS = -check_PROGRAMS = hexlify checksum object poll main-loop +check_PROGRAMS = hexlify checksum object poll main-loop socket hexlify_SOURCES = hexlify-test.c hexlify_CFLAGS = -I$(top_srcdir)/ hexlify_LDADD = $(top_builddir)/milkway/libmilkway.la @@ -23,4 +23,10 @@ poll_LDFLAGS = $(MILKWAY_LIBS) main_loop_SOURCES = main-loop-test.c main_loop_CFLAGS = -I$(top_srcdir)/ main_loop_LDADD = $(top_builddir)/milkway/libmilkway.la -main_loop_LDFLAGS = $(MILKWAY_LIBS)
\ No newline at end of file +main_loop_LDFLAGS = $(MILKWAY_LIBS) + +socket_SOURCES = socket-test.c +socket_CFLAGS = -I$(top_srcdir)/ +socket_LDADD = $(top_builddir)/milkway/libmilkway.la +socket_LDFLAGS = $(MILKWAY_LIBS) + diff --git a/milkway/test/socket-test.c b/milkway/test/socket-test.c new file mode 100644 index 0000000..0c9b3b0 --- /dev/null +++ b/milkway/test/socket-test.c @@ -0,0 +1,138 @@ +/* + * Copyright © 2009 Luo Jinghua <sunmoon1997@gmail.com> + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * LUO JINGHUA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +#include <milkway/milkway.h> +#include <milkway/mw-socket.h> +#include <milkway/mw-inet-socket-address.h> + +#include <string.h> +#include <stdio.h> + +#define PORT 11112 +#define PING_STR "ping" +#define PONG_STR "pong" + +static void* +server(void* arg) +{ + mw_inet_address_t *inetaddr; + mw_socket_address_t *addr; + mw_socket_t *sock, *cli; + char buffer[1024]; + int ret; + + inetaddr = mw_inet_address_new_any(MW_SOCKET_FAMILY_INET); + mw_unless(inetaddr); + + addr = (mw_socket_address_t *) + mw_inet_socket_address_new(inetaddr, PORT); + mw_unless(addr); + mw_object_unref(inetaddr); + + sock = mw_socket_new(MW_SOCKET_FAMILY_INET, + MW_SOCKET_TYPE_STREAM, + MW_SOCKET_PROTO_DEFAULT, + NULL); + mw_unless(addr); + + mw_unless(mw_socket_bind(sock, addr, NULL)); + mw_object_unref(addr); + + mw_unless(mw_socket_listen(sock, 10, NULL)); + cli = mw_socket_accept(sock, NULL); + mw_unless(cli); + + ret = mw_socket_recv(cli, buffer, sizeof(buffer), NULL); + mw_unless(ret == sizeof(PING_STR) && !strcmp(buffer, PING_STR)); + + ret = mw_socket_send(cli, PONG_STR, sizeof(PONG_STR), NULL); + mw_unless(ret == sizeof(PONG_STR)); + + mw_sleep(500); + + mw_socket_close(cli, NULL); + mw_object_unref(cli); + + mw_socket_close(sock, NULL); + mw_object_unref(sock); + + return NULL; +} + +static void +client(void) +{ + mw_inet_address_t *inetaddr; + mw_socket_address_t *addr; + mw_socket_t *sock; + char buffer[1024]; + int ret; + + inetaddr = mw_inet_address_new("127.0.0.1"); + mw_unless(inetaddr); + + addr = (mw_socket_address_t *) + mw_inet_socket_address_new(inetaddr, PORT); + mw_unless(addr); + mw_object_unref(inetaddr); + + sock = mw_socket_new(MW_SOCKET_FAMILY_INET, + MW_SOCKET_TYPE_STREAM, + MW_SOCKET_PROTO_DEFAULT, + NULL); + mw_unless(addr); + + mw_unless(mw_socket_connect(sock, addr, NULL)); + mw_object_unref(addr); + + ret = mw_socket_send(sock, PING_STR, sizeof(PING_STR), NULL); + mw_unless(ret == sizeof(PING_STR)); + + ret = mw_socket_recv(sock, buffer, sizeof(buffer), NULL); + mw_unless(ret == sizeof(PONG_STR) && !strcmp(buffer, PONG_STR)); + + mw_socket_close(sock, NULL); + mw_object_unref(sock); +} + +static void +test_socket(void) +{ + mw_thread_t *thread; + + mw_thread_init(); + thread = mw_thread_create("socket-server", + server, NULL, MW_TRUE); + mw_unless(thread); + + mw_sleep(500); + client(); + mw_thread_join(thread); +} + +int main(int argc, char **argv) +{ + test_socket(); + + printf ("sock test: PASS\n"); + + return 0; +} |