1 #include <assert.h>
2 #include <inttypes.h>
3 #include <stdint.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <openthread/message.h>
7 #include <openthread/tcp.h>
8
9 #include "../bitmap.h"
10 #include "../cbuf.h"
11
12 uint32_t num_tests_passed = 0;
13 uint32_t num_tests_failed = 0;
14
otMessageRead(const otMessage * aMessage,uint16_t aOffset,void * aBuf,uint16_t aLength)15 uint16_t otMessageRead(const otMessage *aMessage, uint16_t aOffset, void *aBuf, uint16_t aLength) {
16 return aLength;
17 }
18
otMessageWrite(otMessage * aMessage,uint16_t aOffset,const void * aBuf,uint16_t aLength)19 int otMessageWrite(otMessage *aMessage, uint16_t aOffset, const void *aBuf, uint16_t aLength) {
20 return aLength;
21 }
22
bmp_print(uint8_t * buf,size_t buflen)23 void bmp_print(uint8_t* buf, size_t buflen) {
24 size_t i;
25 for (i = 0; i < buflen; i++) {
26 printf("%02X", buf[i]);
27 }
28 printf("\n");
29 }
30
bmp_test(const char * test_name,uint8_t * buf,size_t buflen,const char * contents)31 void bmp_test(const char* test_name, uint8_t* buf, size_t buflen, const char* contents) {
32 char buf_string[(buflen << 1) + 1];
33 buf_string[0] = '\0';
34 for (size_t i = 0; i < buflen; i++) {
35 snprintf(&buf_string[i << 1], 3, "%02X", buf[i]);
36 }
37 if (strcmp(contents, buf_string) == 0) {
38 printf("%s: PASS\n", test_name);
39 num_tests_passed++;
40 } else {
41 printf("%s: FAIL: %s vs. %s\n", test_name, contents, buf_string);
42 num_tests_failed++;
43 }
44 }
45
test_bmp()46 void test_bmp() {
47 size_t test_bmp_size = 8;
48 uint8_t buffer[test_bmp_size];
49
50 bmp_init(buffer, test_bmp_size);
51 bmp_test("bmp_init", buffer, test_bmp_size, "0000000000000000");
52
53 bmp_setrange(buffer, 11, 7);
54 bmp_test("bmp_setrange 1", buffer, test_bmp_size, "001FC00000000000");
55
56 bmp_setrange(buffer, 35, 3);
57 bmp_test("bmp_setrange 2", buffer, test_bmp_size, "001FC0001C000000");
58
59 bmp_setrange(buffer, 47, 4);
60 bmp_test("bmp_setrange 3", buffer, test_bmp_size, "001FC0001C01E000");
61
62 bmp_swap(buffer, 3, 36, 1);
63 bmp_test("bmp_swap 1", buffer, test_bmp_size, "101FC0001401E000");
64
65 bmp_swap(buffer, 0, 40, 24);
66 bmp_test("bmp_swap 2", buffer, test_bmp_size, "01E0000014101FC0");
67
68 bmp_swap(buffer, 2, 42, 15);
69 bmp_test("bmp_swap 3", buffer, test_bmp_size, "101F80001401E040");
70
71 bmp_swap(buffer, 13, 23, 2);
72 bmp_test("bmp_swap 4", buffer, test_bmp_size, "101981801401E040");
73
74 bmp_swap(buffer, 0, 35, 24);
75 bmp_test("bmp_swap 5", buffer, test_bmp_size, "A00F028002033020");
76 }
77
cbuf_test(const char * test_name,struct cbufhead * chdr,const char * contents)78 void cbuf_test(const char* test_name, struct cbufhead* chdr, const char* contents) {
79 char buf_string[chdr->size + 1];
80 struct otLinkedBuffer first;
81 struct otLinkedBuffer second;
82 cbuf_reference(chdr, &first, &second);
83
84
85 memcpy(&buf_string[0], &first.mData[0], first.mLength);
86 if (first.mNext != NULL) {
87 assert(first.mNext == &second);
88 memcpy(&buf_string[first.mLength], &second.mData[0], second.mLength);
89 assert(second.mNext == NULL);
90 buf_string[first.mLength + second.mLength] = '\0';
91 } else {
92 buf_string[first.mLength] = '\0';
93 }
94
95 if (strcmp(contents, buf_string) == 0) {
96 printf("%s: PASS\n", test_name);
97 num_tests_passed++;
98 } else {
99 printf("%s: FAIL: %s (%zu) vs. %s (%zu)\n", test_name, contents, strlen(contents), buf_string, strlen(buf_string));
100 num_tests_failed++;
101 }
102 }
103
cbuf_write_string(struct cbufhead * chdr,const char * string)104 void cbuf_write_string(struct cbufhead* chdr, const char* string) {
105 cbuf_write(chdr, string, 0, strlen(string), cbuf_copy_into_buffer);
106 }
107
test_cbuf()108 void test_cbuf() {
109 uint8_t buffer[65];
110 uint8_t bitmap[8];
111 struct cbufhead chdr;
112
113 cbuf_init(&chdr, buffer, 64); // capacity is actually 64
114 cbuf_test("cbuf_init", &chdr, "");
115
116 cbuf_write_string(&chdr, "abcdefghijklmnopqrstuvwxyz0123456789");
117 cbuf_test("cbuf_write", &chdr, "abcdefghijklmnopqrstuvwxyz0123456789");
118
119 cbuf_pop(&chdr, 1);
120 cbuf_test("cbuf_pop", &chdr, "bcdefghijklmnopqrstuvwxyz0123456789");
121
122 cbuf_pop(&chdr, 5);
123 cbuf_test("cbuf_pop", &chdr, "ghijklmnopqrstuvwxyz0123456789");
124
125 cbuf_write_string(&chdr, "abcdefghijklmnopqrstuvwxyz01234567");
126 cbuf_test("cbuf_write", &chdr, "ghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz01234567");
127
128 cbuf_contiguify(&chdr, NULL);
129 cbuf_test("cbuf_contiguify", &chdr, "ghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz01234567");
130
131 cbuf_pop(&chdr, 50);
132 cbuf_test("cbuf_pop", &chdr, "uvwxyz01234567");
133
134 cbuf_write_string(&chdr, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); // yz overflows and isn't written
135 cbuf_test("cbuf_write", &chdr, "uvwxyz01234567ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx");
136
137 cbuf_contiguify(&chdr, NULL);
138 cbuf_test("cbuf_contiguify", &chdr, "uvwxyz01234567ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx");
139
140 cbuf_contiguify(&chdr, NULL); // check that a second "contiguify" operation doesn't mess things up
141 cbuf_test("cbuf_contiguify", &chdr, "uvwxyz01234567ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx");
142
143 cbuf_pop(&chdr, 20);
144 cbuf_test("cbuf_pop", &chdr, "GHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx");
145
146 cbuf_write_string(&chdr, "yz");
147 cbuf_test("cbuf_write", &chdr, "GHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
148
149 bmp_init(bitmap, 8);
150 bmp_test("bmp_init", bitmap, 8, "0000000000000000");
151
152 cbuf_reass_write(&chdr, 4, "@@@@@@@@@@@", 0, 11, bitmap, NULL, cbuf_copy_from_buffer);
153 cbuf_test("cbuf_reass_write (cbuf)", &chdr, "GHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
154 bmp_test("cbuf_reass_write (bitmap)", bitmap, 8, "03FF800000000000");
155
156 cbuf_contiguify(&chdr, bitmap);
157 cbuf_test("cbuf_contiguify (cbuf)", &chdr, "GHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
158 bmp_test("cbuf_reass_write (bitmap)", bitmap, 8, "0000000000003FF8");
159
160 cbuf_write_string(&chdr, "1234");
161 cbuf_test("cbuf_write", &chdr, "GHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234");
162
163 cbuf_reass_merge(&chdr, 9, bitmap);
164 cbuf_test("cbuf_reass_merge (cbuf)", &chdr, "GHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234@@@@@@@@@");
165 bmp_test("cbuf_reass_merge (bitmap)", bitmap, 8, "0000000000000018");
166
167 cbuf_reass_merge(&chdr, 2, bitmap);
168 cbuf_test("cbuf_reass_merge (cbuf)", &chdr, "GHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234@@@@@@@@@@@");
169 bmp_test("cbuf_reass_merge (bitmap)", bitmap, 8, "0000000000000000");
170
171 cbuf_pop(&chdr, 61);
172 cbuf_test("cbuf_pop", &chdr, "");
173 }
174
test_cbuf_2()175 void test_cbuf_2() {
176 uint8_t buffer[32];
177 uint8_t bitmap[4];
178 struct cbufhead chdr;
179
180 cbuf_init(&chdr, buffer, 32);
181 cbuf_test("cbuf_init", &chdr, "");
182
183 bmp_init(bitmap, 4);
184 bmp_test("bmp_init", bitmap, 4, "00000000");
185
186 cbuf_reass_write(&chdr, 6, "abcdefghijklmnopqrstuvwxyz", 0, 26, bitmap, NULL, cbuf_copy_from_buffer);
187 cbuf_test("cbuf_reass_write (cbuf)", &chdr, "");
188 bmp_test("cbuf_reass_write (bitmap)", bitmap, 4, "03FFFFFF");
189
190 cbuf_write_string(&chdr, "ASDFGH");
191 cbuf_test("cbuf_write (cbuf)", &chdr, "ASDFGH");
192 bmp_test("cbuf_write (bitmap)", bitmap, 4, "03FFFFFF");
193
194 cbuf_pop(&chdr, 6);
195 cbuf_test("cbuf_pop (cbuf)", &chdr, "");
196 bmp_test("cbuf_pop (bitmap)", bitmap, 4, "03FFFFFF");
197
198 cbuf_reass_write(&chdr, 26, "!@#$^&", 0, 6, bitmap, NULL, cbuf_copy_from_buffer);
199 cbuf_test("cbuf_reass_write (cbuf)", &chdr, "");
200 bmp_test("cbuf_reass_write (bitmap)", bitmap, 4, "FFFFFFFF");
201
202 printf("Count Set: %d (should be at least 32)\n", (int) cbuf_reass_count_set(&chdr, 0, bitmap, 32));
203
204 cbuf_reass_merge(&chdr, 32, bitmap);
205 cbuf_test("cbuf_reass_merge (cbuf)", &chdr, "abcdefghijklmnopqrstuvwxyz!@#$^&");
206 bmp_test("cbuf_reass_merge (bitmap)", bitmap, 4, "00000000");
207 }
208
main(int argc,char ** argv)209 int main(int argc, char** argv) {
210 test_bmp();
211 test_cbuf();
212 test_cbuf_2();
213
214 printf("%" PRIu32 " tests passed (out of %" PRIu32 ")\n", num_tests_passed, num_tests_passed + num_tests_failed);
215 if (num_tests_failed != 0) {
216 return EXIT_FAILURE;
217 }
218 return EXIT_SUCCESS;
219 }
220