forked from PeterScott/netstring-c
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtestsuite.c
169 lines (136 loc) · 5.32 KB
/
testsuite.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "netstring.h"
/* Good examples */
char ex1[] = "12:hello world!,";
char ex2[] = "3:foo,0:,3:bar,";
char exb[] = "3:foo,0:,3:bar, ";
/* Bad examples */
char ex3[] = "12:hello world! "; /* No comma */
char ex4[] = "15:hello world!,"; /* Too short */
char ex5[] = "03:foo,"; /* Leading zeros are forbidden */
char ex6[] = "999999999999999:haha lol,"; /* Too long */
char ex7[] = "3fool,"; /* No colon */
char ex8[] = "what's up"; /* No number or colon */
char ex9[] = ":what's up"; /* No number */
void test_netstring_read(void) {
char *base;
size_t base_len;
char *netstring;
size_t netstring_len;
int retval;
/* ex1: hello world */
base = ex1; base_len = strlen(ex1);
retval = netstring_read(&base, &base_len, &netstring, &netstring_len);
assert(netstring_len == 12); assert(strncmp(netstring, "hello world!", 12) == 0);
assert(base == ex1 + strlen(ex1)); assert(base_len == 0);
assert(retval == 0);
/* ex2: three netstrings, concatenated. */
base = ex2; base_len = strlen(ex2);
retval = netstring_read(&base, &base_len, &netstring, &netstring_len);
assert(netstring_len == 3); assert(strncmp(netstring, "foo", 3) == 0);
assert(retval == 0);
retval = netstring_read(&base, &base_len, &netstring, &netstring_len);
assert(netstring_len == 0); assert(retval == 0);
retval = netstring_read(&base, &base_len, &netstring, &netstring_len);
assert(netstring_len == 3); assert(strncmp(netstring, "bar", 3) == 0);
assert(retval == 0); assert(base_len == 0);
/* ex3: no comma */
base = ex3; base_len = strlen(ex3);
retval = netstring_read(&base, &base_len, &netstring, &netstring_len);
assert(netstring_len == 0); assert(netstring == NULL);
assert(retval == NETSTRING_ERROR_NO_COMMA);
/* ex4: too short */
base = ex4; base_len = strlen(ex4);
retval = netstring_read(&base, &base_len, &netstring, &netstring_len);
assert(netstring_len == 0); assert(netstring == NULL);
assert(retval == NETSTRING_ERROR_TOO_SHORT);
/* ex5: leading zero */
base = ex5; base_len = strlen(ex5);
retval = netstring_read(&base, &base_len, &netstring, &netstring_len);
assert(netstring_len == 0); assert(netstring == NULL);
assert(retval == NETSTRING_ERROR_LEADING_ZERO);
/* ex6: too long */
base = ex6; base_len = strlen(ex6);
retval = netstring_read(&base, &base_len, &netstring, &netstring_len);
assert(netstring_len == 0); assert(netstring == NULL);
assert(retval == NETSTRING_ERROR_TOO_LONG);
/* ex7: no colon */
base = ex7; base_len = strlen(ex7);
retval = netstring_read(&base, &base_len, &netstring, &netstring_len);
assert(netstring_len == 0); assert(netstring == NULL);
assert(retval == NETSTRING_ERROR_NO_COLON);
/* ex8: no number or colon */
base = ex8; base_len = strlen(ex8);
retval = netstring_read(&base, &base_len, &netstring, &netstring_len);
assert(netstring_len == 0); assert(netstring == NULL);
assert(retval == NETSTRING_ERROR_NO_LENGTH);
/* ex9: no number */
base = ex9; base_len = strlen(ex9);
retval = netstring_read(&base, &base_len, &netstring, &netstring_len);
assert(netstring_len == 0); assert(netstring == NULL);
assert(retval == NETSTRING_ERROR_NO_LENGTH);
}
void test_netstring_list_size(void) {
size_t size=0;
assert(netstring_list_size(ex1, strlen(ex1), &size) == 0);
assert(size == strlen(ex1));
assert(netstring_list_size(ex2, strlen(ex2), &size) == 0);
assert(size == strlen(ex2));
assert(netstring_list_size(exb, strlen(exb), &size) == 0);
assert(size == strlen(ex2));
}
void test_netstring_list_count(void) {
int count=0;
assert(netstring_list_count(ex1, strlen(ex1), &count) == 0);
assert(count == 1);
assert(netstring_list_count(ex2, strlen(ex2), &count) == 0);
assert(count == 3);
assert(netstring_list_count(exb, strlen(exb), &count) == 0);
assert(count == 3);
}
void test_netstring_buffer_size(void) {
assert(netstring_buffer_size(0) == 3);
assert(netstring_buffer_size(1) == 4);
assert(netstring_buffer_size(2) == 5);
assert(netstring_buffer_size(9) == 12);
assert(netstring_buffer_size(10) == 14);
assert(netstring_buffer_size(12345) == 12345 + 5 + 2);
}
void test_netstring_add_ex(void) {
char *ns=0; size_t bytes;
bytes = netstring_add_ex(&ns, "foo", 3);
assert(ns != NULL); assert(strncmp(ns, "3:foo,", 6) == 0); assert(bytes == 6);
free(ns); ns = 0;
bytes = netstring_add_ex(&ns, NULL, 0);
assert(ns != NULL); assert(strncmp(ns, "0:,", 3) == 0); assert(bytes == 3);
free(ns); ns = 0;
bytes = netstring_add_ex(&ns, "hello world!", 12); assert(bytes == 16);
assert(ns != NULL); assert(strncmp(ns, "12:hello world!,", 16) == 0);
free(ns); ns = 0;
bytes = netstring_add_ex(&ns, "hello world!", 5); assert(bytes == 8);
assert(ns != NULL); assert(strncmp(ns, "5:hello,", 8) == 0);
free(ns); ns = 0;
}
void test_netstring_add(void) {
char *list=0;
netstring_add(&list, "first");
netstring_add(&list, "second");
netstring_add(&list, "third");
netstring_add(&list, "");
assert(strcmp(list, "5:first,6:second,5:third,0:,") == 0);
free(list);
}
int main(void) {
printf("Running test suite...\n");
test_netstring_read();
test_netstring_list_size();
test_netstring_list_count();
test_netstring_buffer_size();
test_netstring_add_ex();
test_netstring_add();
printf("All tests passed!\n");
return 0;
}