xref: /lighttpd1.4/src/t/test_buffer.c (revision fcf0dc3e)
1 #include "first.h"
2 
3 #undef NDEBUG
4 #include <assert.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 
8 #include "buffer.c"
9 
10 static void run_buffer_path_simplify(buffer *psrc, buffer *pdest, const char *in, size_t in_len, const char *out, size_t out_len) {
11 	buffer_copy_string_len(psrc, in, in_len);
12 	pdest = psrc; /*(buffer_path_simplify() now takes only one arg)*/
13 
14 	buffer_path_simplify(pdest);
15 
16 	if (!buffer_eq_slen(pdest, out, out_len)) {
17 		fprintf(stderr,
18 			"%s.%d: buffer_path_simplify('%s') failed: expected '%s', got '%s'\n",
19 			__FILE__,
20 			__LINE__,
21 			in,
22 			out,
23 			pdest->ptr);
24 		fflush(stderr);
25 		abort();
26 	} else {
27 		buffer_path_simplify(pdest);
28 
29 		if (!buffer_eq_slen(pdest, out, out_len)) {
30 			fprintf(stderr,
31 				"%s.%d: buffer_path_simplify('%s') failed - not idempotent: expected '%s', got '%s'\n",
32 				__FILE__,
33 				__LINE__,
34 				in,
35 				out,
36 				pdest->ptr);
37 			fflush(stderr);
38 			abort();
39 		}
40 	}
41 }
42 
43 static void test_buffer_path_simplify_with(buffer *psrc, buffer *pdest) {
44 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(""), CONST_STR_LEN(""));
45 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/"), CONST_STR_LEN("/"));
46 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("//"), CONST_STR_LEN("/"));
47 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc"), CONST_STR_LEN("abc"));
48 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc//"), CONST_STR_LEN("abc/"));
49 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/./xyz"), CONST_STR_LEN("abc/xyz"));
50 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/.//xyz"), CONST_STR_LEN("abc/xyz"));
51 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/../xyz"), CONST_STR_LEN("/xyz"));
52 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/./xyz"), CONST_STR_LEN("/abc/xyz"));
53 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc//./xyz"), CONST_STR_LEN("/abc/xyz"));
54 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/../xyz"), CONST_STR_LEN("/xyz"));
55 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/../xyz/."), CONST_STR_LEN("/xyz/"));
56 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/../xyz/."), CONST_STR_LEN("/xyz/"));
57 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/./xyz/.."), CONST_STR_LEN("abc/"));
58 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/./xyz/.."), CONST_STR_LEN("/abc/"));
59 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("."), CONST_STR_LEN(""));
60 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(".."), CONST_STR_LEN(""));
61 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("..."), CONST_STR_LEN("..."));
62 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("...."), CONST_STR_LEN("...."));
63 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(".../"), CONST_STR_LEN(".../"));
64 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("./xyz/.."), CONST_STR_LEN("/"));
65 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(".//xyz/.."), CONST_STR_LEN("/"));
66 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/./xyz/.."), CONST_STR_LEN("/"));
67 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(".././xyz/.."), CONST_STR_LEN("/"));
68 	run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/.././xyz/.."), CONST_STR_LEN("/"));
69 }
70 
71 static void test_buffer_path_simplify(void) {
72 	buffer *psrc = buffer_init();
73 
74 	/* test with using the same buffer and with using different buffers */
75 	test_buffer_path_simplify_with(psrc, psrc);
76 
77 	buffer_free(psrc);
78 }
79 
80 static void test_buffer_to_lower_upper(void) {
81 	buffer *psrc = buffer_init();
82 
83 	buffer_copy_string_len(psrc, CONST_STR_LEN("0123456789abcdefghijklmnopqrstuvwxyz"));
84 	buffer_to_lower(psrc);
85 	assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789abcdefghijklmnopqrstuvwxyz")));
86 	buffer_to_upper(psrc);
87 	assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")));
88 	buffer_to_upper(psrc);
89 	assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")));
90 	buffer_to_lower(psrc);
91 	assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789abcdefghijklmnopqrstuvwxyz")));
92 
93 	buffer_free(psrc);
94 }
95 
96 static void test_buffer_string_space(void) {
97 	buffer *b = buffer_init();
98 	size_t space;
99 
100 	space = buffer_string_space(b);
101 	assert(0 == space);
102 	buffer_copy_string_len(b, CONST_STR_LEN(""));
103 	space = buffer_string_space(b);
104 	assert(space > 0);
105 	assert(space + buffer_string_length(b) == b->size - 1);
106 	buffer_commit(b, b->size - 1);
107 	assert(b->used == b->size);
108 	space = buffer_string_space(b);
109 	assert(0 == space);
110 
111 	buffer_free(b);
112 }
113 
114 static void test_buffer_append_path_len(void) {
115 	buffer *b = buffer_init();
116 
117 	buffer_append_path_len(b, CONST_STR_LEN("a"));
118 	assert(buffer_eq_slen(b, CONST_STR_LEN("/a")));
119 	buffer_clear(b);
120 	buffer_append_path_len(b, CONST_STR_LEN("a"));
121 	assert(buffer_eq_slen(b, CONST_STR_LEN("/a")));
122 	buffer_clear(b);
123 	buffer_append_path_len(b, CONST_STR_LEN("/a"));
124 	assert(buffer_eq_slen(b, CONST_STR_LEN("/a")));
125 	buffer_copy_string_len(b, CONST_STR_LEN("/"));
126 	buffer_append_path_len(b, CONST_STR_LEN("a"));
127 	assert(buffer_eq_slen(b, CONST_STR_LEN("/a")));
128 	buffer_copy_string_len(b, CONST_STR_LEN("/"));
129 	buffer_append_path_len(b, CONST_STR_LEN("/a"));
130 	assert(buffer_eq_slen(b, CONST_STR_LEN("/a")));
131 	buffer_copy_string_len(b, CONST_STR_LEN("a"));
132 	buffer_append_path_len(b, CONST_STR_LEN("a"));
133 	assert(buffer_eq_slen(b, CONST_STR_LEN("a/a")));
134 	buffer_copy_string_len(b, CONST_STR_LEN("a/"));
135 	buffer_append_path_len(b, CONST_STR_LEN("a"));
136 	assert(buffer_eq_slen(b, CONST_STR_LEN("a/a")));
137 	buffer_copy_string_len(b, CONST_STR_LEN("a/"));
138 	buffer_append_path_len(b, CONST_STR_LEN("/a"));
139 	assert(buffer_eq_slen(b, CONST_STR_LEN("a/a")));
140 	buffer_copy_string_len(b, CONST_STR_LEN("/a/"));
141 	buffer_append_path_len(b, CONST_STR_LEN("/a"));
142 	assert(buffer_eq_slen(b, CONST_STR_LEN("/a/a")));
143 
144 	buffer_free(b);
145 }
146 
147 static void test_buffer_append_bs_escaped(void) {
148     buffer *b = buffer_init();
149 
150     buffer_append_bs_escaped_json(b, CONST_STR_LEN(" "));
151     assert(buffer_eq_slen(b, CONST_STR_LEN(" ")));
152     buffer_clear(b);
153     buffer_append_bs_escaped_json(b, CONST_STR_LEN("\0"));
154     assert(buffer_eq_slen(b, CONST_STR_LEN("\\u0000")));
155     buffer_clear(b);
156     buffer_append_bs_escaped_json(b, CONST_STR_LEN("\1"));
157     assert(buffer_eq_slen(b, CONST_STR_LEN("\\u0001")));
158     buffer_clear(b);
159     buffer_append_bs_escaped_json(b, CONST_STR_LEN("\n"));
160     assert(buffer_eq_slen(b, CONST_STR_LEN("\\n")));
161     buffer_clear(b);
162     buffer_append_bs_escaped_json(b, CONST_STR_LEN("é"));
163     assert(buffer_eq_slen(b, CONST_STR_LEN("é")));
164     buffer_clear(b);
165     buffer_append_bs_escaped_json(b, CONST_STR_LEN("ö"));
166     assert(buffer_eq_slen(b, CONST_STR_LEN("ö")));
167 
168   #if 0
169     buffer_clear(b);
170     magnet_buffer_append_bsdec(b, CONST_STR_LEN("\\u00E9"));
171     assert(buffer_eq_slen(b, CONST_STR_LEN("é")));
172     buffer_clear(b);
173     magnet_buffer_append_bsdec(b, CONST_STR_LEN("\\u00F6"));
174     assert(buffer_eq_slen(b, CONST_STR_LEN("ö")));
175   #endif
176 
177     /* TODO: more */
178 
179     buffer_free(b);
180 }
181 
182 void test_buffer (void);
183 void test_buffer (void)
184 {
185 	test_buffer_path_simplify();
186 	test_buffer_to_lower_upper();
187 	test_buffer_string_space();
188 	test_buffer_append_path_len();
189 	test_buffer_append_bs_escaped();
190 }
191