xref: /lighttpd1.4/src/t/test_buffer.c (revision e11f72b1)
1 #include "first.h"
2 
3 #undef NDEBUG
4 #include <assert.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 
8 #include "buffer.h"
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 
13 	buffer_path_simplify(pdest, psrc);
14 
15 	if (!buffer_eq_slen(pdest, out, out_len)) {
16 		fprintf(stderr,
17 			"%s.%d: buffer_path_simplify('%s') failed: expected '%s', got '%s'\n",
18 			__FILE__,
19 			__LINE__,
20 			in,
21 			out,
22 			pdest->ptr ? pdest->ptr : "");
23 		fflush(stderr);
24 		abort();
25 	} else {
26 		if (psrc != pdest) buffer_copy_buffer(psrc, pdest);
27 		buffer_path_simplify(pdest, psrc);
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 ? 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 	buffer *pdest = buffer_init();
74 
75 	/* test with using the same buffer and with using different buffers */
76 	test_buffer_path_simplify_with(psrc, psrc);
77 	test_buffer_path_simplify_with(pdest, psrc);
78 
79 	buffer_free(psrc);
80 	buffer_free(pdest);
81 }
82 
83 static void test_buffer_to_lower_upper(void) {
84 	buffer *psrc = buffer_init();
85 
86 	buffer_copy_string_len(psrc, CONST_STR_LEN("0123456789abcdefghijklmnopqrstuvwxyz"));
87 	buffer_to_lower(psrc);
88 	assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789abcdefghijklmnopqrstuvwxyz")));
89 	buffer_to_upper(psrc);
90 	assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")));
91 	buffer_to_upper(psrc);
92 	assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")));
93 	buffer_to_lower(psrc);
94 	assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789abcdefghijklmnopqrstuvwxyz")));
95 
96 	buffer_free(psrc);
97 }
98 
99 static void test_buffer_string_space(void) {
100 	buffer *b = buffer_init();
101 	size_t space;
102 
103 	space = buffer_string_space(b);
104 	assert(0 == space);
105 	buffer_copy_string_len(b, CONST_STR_LEN(""));
106 	space = buffer_string_space(b);
107 	assert(space > 0);
108 	assert(space + buffer_string_length(b) == b->size - 1);
109 	buffer_commit(b, b->size - 1);
110 	assert(b->used == b->size);
111 	space = buffer_string_space(b);
112 	assert(0 == space);
113 
114 	buffer_free(b);
115 }
116 
117 static void test_buffer_append_path_len(void) {
118 	buffer *b = buffer_init();
119 
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_clear(b);
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("/"));
132 	buffer_append_path_len(b, CONST_STR_LEN("/a"));
133 	assert(buffer_eq_slen(b, CONST_STR_LEN("/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 	buffer_copy_string_len(b, CONST_STR_LEN("/a/"));
144 	buffer_append_path_len(b, CONST_STR_LEN("/a"));
145 	assert(buffer_eq_slen(b, CONST_STR_LEN("/a/a")));
146 
147 	buffer_free(b);
148 }
149 
150 int main() {
151 	test_buffer_path_simplify();
152 	test_buffer_to_lower_upper();
153 	test_buffer_string_space();
154 	test_buffer_append_path_len();
155 
156 	return 0;
157 }
158