xref: /aosp_15_r20/external/openthread/third_party/tcplp/lib/test/test_all.c (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
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