Use PTHREAD_CFLAGS for all test sources
[yaz-moved-to-github.git] / test / tst_comstack.c
index c2e2597..eee72f8 100644 (file)
@@ -1,15 +1,15 @@
-/*
- * Copyright (C) 1995-2007, Index Data ApS
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) 1995-2010 Index Data
  * See the file LICENSE for details.
- *
- * $Id: tst_comstack.c,v 1.1 2007-01-11 10:30:41 adam Exp $
  */
 
 #include <stdlib.h>
+#include <string.h>
 #include <stdio.h>
 
 #include <yaz/test.h>
 #include <yaz/comstack.h>
+#include <yaz/tcpip.h>
 
 static void tst_http_request(void)
 {
@@ -21,12 +21,12 @@ static void tst_http_request(void)
             "\r\n"
             "GET / HTTP/1.0\r\n";
         
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 16), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 17), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 18), 18);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 19), 18);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 16), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 17), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 18), 18);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 19), 18);
     }
     {
         /* one header, no content */
@@ -37,11 +37,11 @@ static void tst_http_request(void)
             "\r\n"
             "GET / HTTP/1.0\r\n";
         
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 34), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 35), 35);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 36), 35);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 34), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 35), 35);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 36), 35);
     }        
     {
         /* one content-length header, length 0 */
@@ -52,11 +52,11 @@ static void tst_http_request(void)
             "\r\n"
             "GET / HTTP/1.0\r\n";
         
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 35), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 37), 37);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 38), 37);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 35), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 37), 37);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 38), 37);
     }        
     {
         /* one content-length header, length 5 */
@@ -68,11 +68,11 @@ static void tst_http_request(void)
             "ABCDE"
             "GET / HTTP/1.0\r\n";
         
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 41), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 42), 42);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 43), 42);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 41), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 42), 42);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 43), 42);
     }        
     {
         /* LF only in GET, one content-length header, length 5 */
@@ -84,11 +84,11 @@ static void tst_http_request(void)
             "ABCDE"
             "GET / HTTP/1.0\r\n";
         
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 40), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 41), 41);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 42), 41);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 40), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 41), 41);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 42), 41);
     }        
     {
         /* LF only in all places, one content-length header, length 5 */
@@ -100,11 +100,11 @@ static void tst_http_request(void)
             "ABCDE"
             "GET / HTTP/1.0\r\n";
         
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 38), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 39), 39);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 40), 39);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 38), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 39), 39);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 40), 39);
     }        
 
     {
@@ -116,8 +116,8 @@ static void tst_http_request(void)
             "\r\n"
             "GET / HTTP/1.0\r\n";
         
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 45), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 46), 46);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 45), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 46), 46);
     }        
 
     {
@@ -132,8 +132,8 @@ static void tst_http_request(void)
             "0\r\n\r\n"
             "GET / HTTP/1.0\r\n";
         
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 58), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 59), 59);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 58), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 59), 59);
     }        
 
     {
@@ -150,8 +150,8 @@ static void tst_http_request(void)
             "0\r\n\r\n"
             "GET / HTTP/1.0\r\n";
         
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 64), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 65), 65);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 64), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 65), 65);
     }        
 }
 
@@ -165,9 +165,9 @@ static void tst_http_response(void)
             "\r\n"
             "HTTP/1.1 200 OK\r\n";
         
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 24), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 24), 0);
     }
     {
         /* response, content  */
@@ -179,12 +179,70 @@ static void tst_http_response(void)
             "12"
             "HTTP/1.1 200 OK\r\n";
         
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 1), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 2), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 39), 0);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 40), 40);
-        YAZ_CHECK_EQ(cs_complete_http(http_buf, 41), 40);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 39), 0);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 40), 40);
+        YAZ_CHECK_EQ(cs_complete_auto(http_buf, 41), 40);
+    }
+}
+
+/** \brief COMSTACK synopsis from manual, doc/comstack.xml */
+static int comstack_example(const char *server_address_str)
+{    
+    COMSTACK stack;
+    char *buf = 0;
+    int size = 0, length_incoming;
+    void *server_address_ip;
+    int status;
+
+    char *protocol_package = "GET / HTTP/1.0\r\n\r\n";
+    int protocol_package_length = strlen(protocol_package);
+
+    stack = cs_create(tcpip_type, 1, PROTO_HTTP);
+    if (!stack) {
+        perror("cs_create");  /* use perror() here since we have no stack yet */
+        return -1;
+    }
+    
+    server_address_ip = cs_straddr(stack, server_address_str);
+    if (!server_address_ip)
+    {
+        fprintf(stderr, "cs_straddr: address could not be resolved\n");
+        return -1;
+    }
+    
+    status = cs_connect(stack, server_address_ip);
+    if (status != 0) {
+        fprintf(stderr, "cs_connect: %s\n", cs_strerror(stack));
+        return -1;
+    }
+    
+    status = cs_put(stack, protocol_package, protocol_package_length);
+    if (status) {
+        fprintf(stderr, "cs_put: %s\n", cs_strerror(stack));
+        return -1;
+    }
+    
+    /* Now get a response */
+    
+    length_incoming = cs_get(stack, &buf, &size);
+    if (!length_incoming) {
+        fprintf(stderr, "Connection closed\n");
+        return -1;
+    } else if (length_incoming < 0) {
+        fprintf(stderr, "cs_get: %s\n", cs_strerror(stack));
+        return -1;
     }
+    
+    /* Print result */
+    fwrite(buf, length_incoming, 1, stdout);
+    
+    /* clean up */
+    cs_close(stack);
+    if (buf)
+        free(buf);
+    return 0;
 }
 
 
@@ -192,6 +250,8 @@ int main (int argc, char **argv)
 {
     YAZ_CHECK_INIT(argc, argv);
     YAZ_CHECK_LOG();
+    if (argc == 2)
+       comstack_example(argv[1]);
     tst_http_request();
     tst_http_response();
     YAZ_CHECK_TERM;
@@ -200,6 +260,7 @@ int main (int argc, char **argv)
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab