aboutsummaryrefslogtreecommitdiff
path: root/src/testspdy/test_struct_namevalue.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/testspdy/test_struct_namevalue.c')
-rw-r--r--src/testspdy/test_struct_namevalue.c346
1 files changed, 346 insertions, 0 deletions
diff --git a/src/testspdy/test_struct_namevalue.c b/src/testspdy/test_struct_namevalue.c
new file mode 100644
index 00000000..54e79349
--- /dev/null
+++ b/src/testspdy/test_struct_namevalue.c
@@ -0,0 +1,346 @@
+/*
+ This file is part of libmicrospdy
+ Copyright Copyright (C) 2012 Andrey Uzunov
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file struct_namevalue.c
+ * @brief tests all the API functions for handling struct SPDY_NameValue
+ * @author Andrey Uzunov
+ */
+
+#include "platform.h"
+#include "microspdy.h"
+#include "common.h"
+#include "../microspdy/structures.h"
+#include "../microspdy/alstructures.h"
+
+char *pairs[] = {"one","1","two","2","three","3","four","4","five","5"};
+char *pairs_with_dups[] = {"one","1","two","2","one","11","two","22","three","3","two","222","two","2222","four","","five","5"};//82
+char *pairs_with_empty[] = {"name","","name","value"};
+char *pairs_different[] = {"30","thirty","40","fouthy"};
+int size;
+int size2;
+int brake_at = 3;
+bool flag;
+
+
+int
+iterate_cb (void *cls, const char *name, const char * const * value, int num_values)
+{
+ int *c = (int*)cls;
+
+ if(*c < 0 || *c > size)
+ exit(11);
+
+ if(strcmp(name,pairs[*c]) != 0)
+ {
+ FAIL_TEST("name is wrong\n");
+ }
+
+ if(1 != num_values)
+ {
+ FAIL_TEST("num_values is wrong\n");
+ }
+
+ if(strcmp(value[0],pairs[(*c)+1]) != 0)
+ {
+ FAIL_TEST("value is wrong\n");
+ }
+
+ (*c)+=2;
+
+ return SPDY_YES;
+}
+
+int
+iterate_brake_cb (void *cls, const char *name, const char * const *value, int num_values)
+{
+ (void)name;
+ (void)value;
+ (void)num_values;
+
+ int *c = (int*)cls;
+
+ if(*c < 0 || *c >= brake_at)
+ {
+ FAIL_TEST("iteration was not interrupted\n");
+ }
+
+ (*c)++;
+
+ if(*c == brake_at) return SPDY_NO;
+
+ return SPDY_YES;
+}
+
+int
+main()
+{
+ SPDY_init();
+
+ const char *const*value;
+ const char *const*value2;
+ int i;
+ int j;
+ int cls = 0;
+ int ret;
+ int ret2;
+ void *ob1;
+ void *ob2;
+ void *ob3;
+ void *stream;
+ char data[] = "anything";
+ struct SPDY_NameValue *container;
+ struct SPDY_NameValue *container2;
+ struct SPDY_NameValue *container3;
+ struct SPDY_NameValue *container_arr[2];
+
+ size = sizeof(pairs)/sizeof(pairs[0]);
+
+ if(NULL == (container = SPDY_name_value_create ()))
+ {
+ FAIL_TEST("SPDY_name_value_create failed\n");
+ }
+
+ if(NULL != SPDY_name_value_lookup (container, "anything", &ret))
+ {
+ FAIL_TEST("SPDY_name_value_lookup failed\n");
+ }
+
+ if(SPDY_name_value_iterate (container, NULL, NULL) != 0)
+ {
+ FAIL_TEST("SPDY_name_value_iterate failed\n");
+ }
+
+ for(i=0;i<size; i+=2)
+ {
+ if(SPDY_YES != SPDY_name_value_add(container,pairs[i],pairs[i+1]))
+ {
+ FAIL_TEST("SPDY_name_value_add failed\n");
+ }
+
+ if(SPDY_name_value_iterate (container, NULL, NULL) != ((i / 2) + 1))
+ {
+ FAIL_TEST("SPDY_name_value_iterate failed\n");
+ }
+ }
+
+ if(NULL != SPDY_name_value_lookup (container, "anything", &ret))
+ {
+ FAIL_TEST("SPDY_name_value_lookup failed\n");
+ }
+
+ for(i=size - 2; i >= 0; i-=2)
+ {
+ value = SPDY_name_value_lookup(container,pairs[i], &ret);
+ if(NULL == value || 1 !=ret || strcmp(value[0], pairs[i+1]) != 0)
+ {
+ printf("%p; %i; %i\n", value, ret,
+ (NULL == value) ? -1 : strcmp(value[0], pairs[i+1]));
+ FAIL_TEST("SPDY_name_value_lookup failed\n");
+ }
+ }
+
+ SPDY_name_value_iterate (container, &iterate_cb, &cls);
+
+ cls = 0;
+ if(SPDY_name_value_iterate (container, &iterate_brake_cb, &cls) != brake_at)
+ {
+ FAIL_TEST("SPDY_name_value_iterate with brake failed\n");
+ }
+
+ SPDY_name_value_destroy(container);
+
+ //check everything with NULL values
+ for(i=0; i<7; ++i)
+ {
+ printf("%i ",i);
+ ob1 = (i & 4) ? data : NULL;
+ ob2 = (i & 2) ? data : NULL;
+ ob3 = (i & 1) ? data : NULL;
+ if(SPDY_INPUT_ERROR != SPDY_name_value_add(ob1,ob2,ob3))
+ {
+ FAIL_TEST("SPDY_name_value_add with NULLs failed\n");
+ }
+ }
+ printf("\n");
+ fflush(stdout);
+
+ if(SPDY_INPUT_ERROR != SPDY_name_value_iterate(NULL,NULL,NULL))
+ {
+ FAIL_TEST("SPDY_name_value_iterate with NULLs failed\n");
+ }
+
+ for(i=0; i<7; ++i)
+ {
+ printf("%i ",i);
+ ob1 = (i & 4) ? data : NULL;
+ ob2 = (i & 2) ? data : NULL;
+ ob3 = (i & 1) ? data : NULL;
+ if(NULL != SPDY_name_value_lookup(ob1,ob2,ob3))
+ {
+ FAIL_TEST("SPDY_name_value_lookup with NULLs failed\n");
+ }
+ }
+ printf("\n");
+ SPDY_name_value_destroy(NULL);
+
+ if(NULL == (container = SPDY_name_value_create ()))
+ {
+ FAIL_TEST("SPDY_name_value_create failed\n");
+ }
+
+ size = sizeof(pairs_with_dups)/sizeof(pairs_with_dups[0]);
+
+ for(i=0;i<size; i+=2)
+ {
+ if(SPDY_YES != SPDY_name_value_add(container,pairs_with_dups[i],pairs_with_dups[i+1]))
+ {
+ FAIL_TEST("SPDY_name_value_add failed\n");
+ }
+ }
+ if(SPDY_name_value_iterate (container, NULL, NULL) != atoi(pairs_with_dups[size - 1]))
+ {
+ FAIL_TEST("SPDY_name_value_iterate failed\n");
+ }
+ for(i=size - 2; i >= 0; i-=2)
+ {
+ value = SPDY_name_value_lookup(container,pairs_with_dups[i], &ret);
+ if(NULL == value)
+ {
+ FAIL_TEST("SPDY_name_value_lookup failed\n");
+ }
+ flag = false;
+ for(j=0; j<ret; ++j)
+ if(0 == strcmp(pairs_with_dups[i + 1], value[j]))
+ {
+ if(flag)
+ FAIL_TEST("SPDY_name_value_lookup failed\n");
+ flag=true;
+ }
+
+ if(!flag)
+ FAIL_TEST("SPDY_name_value_lookup failed\n");
+ }
+ if(SPDY_NO != SPDY_name_value_add(container,pairs_with_dups[0],pairs_with_dups[1]))
+ FAIL_TEST("SPDY_name_value_add failed\n");
+
+ SPDY_name_value_destroy(container);
+
+ if(NULL == (container = SPDY_name_value_create ()))
+ {
+ FAIL_TEST("SPDY_name_value_create failed\n");
+ }
+
+ size = sizeof(pairs_with_empty)/sizeof(pairs_with_empty[0]);
+
+ for(i=0;i<size; i+=2)
+ {
+ if(SPDY_YES != SPDY_name_value_add(container,pairs_with_empty[i],pairs_with_empty[i+1]))
+ {
+ FAIL_TEST("SPDY_name_value_add failed\n");
+ }
+ value = SPDY_name_value_lookup(container,pairs_with_empty[i], &ret);
+ if(NULL == value || 1 != ret)
+ {
+ printf("%p; %i\n", value, ret);
+ FAIL_TEST("SPDY_name_value_lookup failed\n");
+ }
+ }
+
+ ret = SPDY_name_value_iterate(container, NULL, NULL);
+ if(SPDY_INPUT_ERROR != SPDY_name_value_add(container, "capitalLeter","anything")
+ || SPDY_name_value_iterate(container, NULL, NULL) != ret)
+ {
+ FAIL_TEST("SPDY_name_value_add failed\n");
+ }
+
+ SPDY_name_value_destroy(container);
+
+ if(NULL == (container = SPDY_name_value_create ()))
+ {
+ FAIL_TEST("SPDY_name_value_create failed\n");
+ }
+
+ size = sizeof(pairs_with_dups)/sizeof(pairs_with_dups[0]);
+
+ for(i=0;i<size; i+=2)
+ {
+ if(SPDY_YES != SPDY_name_value_add(container,pairs_with_dups[i],pairs_with_dups[i+1]))
+ {
+ FAIL_TEST("SPDY_name_value_add failed\n");
+ }
+ }
+
+ if(NULL == (container2 = SPDY_name_value_create ()))
+ {
+ FAIL_TEST("SPDY_name_value_create failed\n");
+ }
+
+ size2 = sizeof(pairs_different)/sizeof(pairs_different[0]);
+
+ for(i=0;i<size2; i+=2)
+ {
+ if(SPDY_YES != SPDY_name_value_add(container2,pairs_different[i],pairs_different[i+1]))
+ {
+ FAIL_TEST("SPDY_name_value_add failed\n");
+ }
+ }
+
+ container_arr[0] = container;
+ container_arr[1] = container2;
+ if(0 > (ret = SPDYF_name_value_to_stream(container_arr, 2, &stream)) || NULL == stream)
+ FAIL_TEST("SPDYF_name_value_to_stream failed\n");
+ ret = SPDYF_name_value_from_stream(stream, ret, &container3);
+ if(SPDY_YES != ret)
+ FAIL_TEST("SPDYF_name_value_from_stream failed\n");
+
+ if(SPDY_name_value_iterate(container3, NULL, NULL)
+ != (SPDY_name_value_iterate(container, NULL, NULL) + SPDY_name_value_iterate(container2, NULL, NULL)))
+ FAIL_TEST("SPDYF_name_value_from_stream failed\n");
+
+ for(i=size - 2; i >= 0; i-=2)
+ {
+ value = SPDY_name_value_lookup(container,pairs_with_dups[i], &ret);
+ if(NULL == value)
+ FAIL_TEST("SPDY_name_value_lookup failed\n");
+ value2 = SPDY_name_value_lookup(container3,pairs_with_dups[i], &ret2);
+ if(NULL == value2)
+ FAIL_TEST("SPDY_name_value_lookup failed\n");
+
+ for(j=0; j<ret; ++j)
+ if(0 != strcmp(value2[j], value[j]))
+ FAIL_TEST("SPDY_name_value_lookup failed\n");
+ }
+ for(i=size2 - 2; i >= 0; i-=2)
+ {
+ value = SPDY_name_value_lookup(container2,pairs_different[i], &ret);
+ if(NULL == value)
+ FAIL_TEST("SPDY_name_value_lookup failed\n");
+ value2 = SPDY_name_value_lookup(container3,pairs_different[i], &ret2);
+ if(NULL == value2)
+ FAIL_TEST("SPDY_name_value_lookup failed\n");
+
+ for(j=0; j<ret; ++j)
+ if(0 != strcmp(value2[j], value[j]))
+ FAIL_TEST("SPDY_name_value_lookup failed\n");
+ }
+
+ SPDY_deinit();
+
+ return 0;
+}