summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Jinghua <sunmoon1997@gmail.com>2009-11-08 14:39:47 +0800
committerLuo Jinghua <sunmoon1997@gmail.com>2009-11-08 14:39:47 +0800
commit2c51d92c28a4d4fa8cf7f628416f33a2d664cf7f (patch)
tree41443f1ec81dd3cb454a365b46a84682dca8d620
parent4d8acb028f581d48eae00a4b21baf2f127c80977 (diff)
milkway/test: add a socket test case
-rw-r--r--milkway/test/Makefile.am10
-rw-r--r--milkway/test/socket-test.c138
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;
+}