blob: 82f2da6b84c3a219d7562d2d8b1e03ff1038c682 [file] [log] [blame]
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001/*==============================================================================
Laurence Lundbladed92a6162018-11-01 11:38:35 +07002 Copyright (c) 2016-2018, The Linux Foundation.
3 Copyright (c) 2018, Laurence Lundblade.
4 All rights reserved.
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +05305
Laurence Lundblade0dbc9172018-11-01 14:17:21 +07006Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are
8met:
9 * Redistributions of source code must retain the above copyright
10 notice, this list of conditions and the following disclaimer.
11 * Redistributions in binary form must reproduce the above
12 copyright notice, this list of conditions and the following
13 disclaimer in the documentation and/or other materials provided
14 with the distribution.
15 * Neither the name of The Linux Foundation nor the names of its
16 contributors, nor the name "Laurence Lundblade" may be used to
17 endorse or promote products derived from this software without
18 specific prior written permission.
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053019
Laurence Lundblade0dbc9172018-11-01 14:17:21 +070020THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
21WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
22MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
23ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
24BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
27BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
29OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
30IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053031 ==============================================================================*/
32
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080033#include "UsefulBuf.h"
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080034
35
36/* Basic exercise...
37
38 Call all the main public functions.
39
40 Binary compare the result to the expected.
41
42 There is nothing adversarial in this test
43 */
Laurence Lundblade7566b9f2018-10-12 09:13:32 +080044const char * UOBTest_NonAdversarial()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080045{
46 const char *szReturn = NULL;
47
Laurence Lundblade4fe9f312018-10-22 10:22:39 +053048 UsefulBuf_MAKE_STACK_UB(outbuf,50);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080049
50 UsefulOutBuf UOB;
51
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053052 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080053
54 if(!UsefulOutBuf_AtStart(&UOB)) {
55 szReturn = "Not at start";
56 goto Done;
57 }
58
59 // Put 7 bytes at beginning of buf
60 UsefulOutBuf_AppendData(&UOB, "bluster", 7);
61
62 if(UsefulOutBuf_AtStart(&UOB)) {
63 szReturn = "At start";
64 goto Done;
65 }
66
67 // add a space to end
68 UsefulOutBuf_AppendByte(&UOB, ' ');
69
70 // Add 5 bytes to the end
71 UsefulBufC UBC = {"hunny", 5};
72 UsefulOutBuf_AppendUsefulBuf(&UOB, UBC);
73
74 // Insert 9 bytes at the beginning, slide the previous stuff right
75 UsefulOutBuf_InsertData(&UOB, "heffalump", 9, 0);
76 UsefulOutBuf_InsertByte(&UOB, ' ', 9);
77
78 // Put 9 bytes in at position 10 -- just after "heffalump "
79 UsefulBufC UBC2 = {"unbounce ", 9};
80 UsefulOutBuf_InsertUsefulBuf(&UOB, UBC2, 10);
81
82 // Make it a null terminated string (because all the appends and inserts above not strcpy !)
83 UsefulOutBuf_AppendByte(&UOB, '\0');
84
85
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053086 UsefulBufC U = UsefulOutBuf_OutUBuf(&UOB);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080087
88 const char *expected = "heffalump unbounce bluster hunny";
89
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053090 if(UsefulBuf_IsNULLC(U) || U.len-1 != strlen(expected) || strcmp(expected, U.ptr) || UsefulOutBuf_GetError(&UOB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080091 szReturn = "OutUBuf";
92 }
93
Laurence Lundblade4fe9f312018-10-22 10:22:39 +053094 UsefulBuf_MAKE_STACK_UB(buf, 50);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053095 UsefulBufC Out = UsefulOutBuf_CopyOut(&UOB, buf);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080096
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053097 if(UsefulBuf_IsNULLC(Out) || Out.len-1 != strlen(expected) || strcmp(expected, Out.ptr)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080098 szReturn = "CopyOut";
99 }
100
101Done:
102 return szReturn;
103}
104
105
106/*
107 Append test utility.
108 pUOB is the buffer to append too
109 num is the amount to append
110 expected is the expected return code, 0 or 1
111
112 returns 0 if test passed
113
114 */
115static int AppendTest(UsefulOutBuf *pUOB, size_t num, int expected)
116{
117 //reset
118 UsefulOutBuf_Reset(pUOB);
119
120 // check status first
121 if(UsefulOutBuf_GetError(pUOB))
122 return 1;
123
124 // append the bytes
125 UsefulOutBuf_AppendData(pUOB, (const uint8_t *)"bluster", num);
126
127 // check error status after
128 if(UsefulOutBuf_GetError(pUOB) != expected)
129 return 1;
130
131 return 0;
132}
133
134
135/*
136 Same as append, but takes a position param too
137 */
138static int InsertTest(UsefulOutBuf *pUOB, size_t num, size_t pos, int expected)
139{
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530140 // reset
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800141 UsefulOutBuf_Reset(pUOB);
142
143 // check
144 if(UsefulOutBuf_GetError(pUOB))
145 return 1;
146
147 UsefulOutBuf_InsertData(pUOB, (const uint8_t *)"bluster", num, pos);
148
149 if(UsefulOutBuf_GetError(pUOB) != expected)
150 return 1;
151
152 return 0;
153}
154
155
156/*
157 Boundary conditions to test
158 - around 0
159 - around the buffer size
160 - around MAX size_t
161
162
163 Test these for the buffer size and the cursor, the insert amount, the append amount and the insert position
164
165 */
166
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800167const char *UOBTest_BoundaryConditionsTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800168{
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530169 UsefulBuf_MAKE_STACK_UB(outbuf,2);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800170
171 UsefulOutBuf UOB;
172
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530173 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800174
175 // append 0 byte to a 2 byte buffer --> success
176 if(AppendTest(&UOB, 0, 0))
177 return "Append 0 bytes failed";
178
179 // append 1 byte to a 2 byte buffer --> success
180 if(AppendTest(&UOB, 1, 0))
181 return "Append of 1 byte failed";
182
183 // append 2 byte to a 2 byte buffer --> success
184 if(AppendTest(&UOB, 2, 0))
185 return "Append to fill buffer failed";
186
187 // append 3 bytes to a 2 byte buffer --> failure
188 if(AppendTest(&UOB, 3, 1))
189 return "Overflow of buffer not caught";
190
191 // append max size_t to a 2 byte buffer --> failure
192 if(AppendTest(&UOB, SIZE_MAX, 1))
193 return "Append of SIZE_MAX error not caught";
194
195 if(InsertTest(&UOB, 1, 0, 0))
196 return "Insert 1 byte at start failed";
197
198 if(InsertTest(&UOB, 2, 0, 0))
199 return "Insert 2 bytes at start failed";
200
201 if(InsertTest(&UOB, 3, 0, 1))
202 return "Insert overflow not caught";
203
204 if(InsertTest(&UOB, 1, 1, 1))
205 return "Bad insertion point not caught";
206
207
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530208 UsefulBuf_MAKE_STACK_UB(outBuf2,10);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800209
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530210 UsefulOutBuf_Init(&UOB, outBuf2);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800211
212 UsefulOutBuf_Reset(&UOB);
213 // put data in the buffer
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800214 UsefulOutBuf_AppendString(&UOB, "abc123");
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800215
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800216 UsefulOutBuf_InsertString(&UOB, "xyz*&^", 0);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800217
218 if(!UsefulOutBuf_GetError(&UOB)) {
219 return "insert with data should have failed";
220 }
221
222
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530223 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800224 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX -6);
225 if(UsefulOutBuf_GetError(&UOB)) {
226 return "insert in huge should have succeeded";
227 }
228
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530229 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800230 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX -5);
231 if(UsefulOutBuf_GetError(&UOB)) {
232 return "insert in huge should have succeeded";
233 }
234
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530235 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800236 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX - 4);
237 if(!UsefulOutBuf_GetError(&UOB)) {
238 return "lengths near max size";
239 }
240
241 return NULL;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800242}
243
244
245
246
247
248// Test function to get size and magic number check
249
250const char *TestBasicSanity()
251{
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530252 UsefulBuf_MAKE_STACK_UB(outbuf,10);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800253
254 UsefulOutBuf UOB;
255
256 // First -- make sure that the room left function returns the right amount
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530257 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800258
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530259 if(UsefulOutBuf_RoomLeft(&UOB) != 10)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800260 return "room left failed";
261
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800262 if(!UsefulOutBuf_WillItFit(&UOB, 9)) {
263 return "it did not fit";
264 }
265
266 if(UsefulOutBuf_WillItFit(&UOB, 11)) {
267 return "it should have not fit";
268 }
269
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800270
271 // Next -- make sure that the magic number checking is working right
272 UOB.magic = 8888; // make magic bogus
273
274 UsefulOutBuf_AppendData(&UOB, (const uint8_t *)"bluster", 7);
275
276 if(!UsefulOutBuf_GetError(&UOB))
277 return "magic corruption check failed";
278
279
280
281 // Next make sure that the valid data length check is working right
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530282 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800283
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530284 UOB.data_len = UOB.UB.len+1; // make size bogus
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800285
286 UsefulOutBuf_AppendData(&UOB, (const uint8_t *)"bluster", 7);
287 if(!UsefulOutBuf_GetError(&UOB))
288 return "valid data check failed";
289
290 return NULL;
291}
292
293
294
295const char *UBMacroConversionsTest()
296{
297 char *szFoo = "foo";
298
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530299 UsefulBufC Foo = UsefulBuf_FromSZ(szFoo);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800300 if(Foo.len != 3 || strncmp(Foo.ptr, szFoo, 3))
301 return "SZToUsefulBufC failed";
302
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530303 UsefulBufC Too = UsefulBuf_FROM_SZ_LITERAL("Toooo");
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800304 if(Too.len != 5 || strncmp(Too.ptr, "Toooo", 5))
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530305 return "UsefulBuf_FROM_SZ_LITERAL failed";
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800306
307 uint8_t pB[] = {0x42, 0x6f, 0x6f};
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530308 UsefulBufC Boo = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pB);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800309 if(Boo.len != 3 || strncmp(Boo.ptr, "Boo", 3))
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530310 return "UsefulBuf_FROM_BYTE_ARRAY_LITERAL failed";
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800311
312 char *sz = "not const"; // some data for the test
313 UsefulBuf B = (UsefulBuf){sz, sizeof(sz)};
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530314 UsefulBufC BC = UsefulBuf_Const(B);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800315 if(BC.len != sizeof(sz) || BC.ptr != sz)
316 return "UsefulBufConst failed";
317
318 return NULL;
319}
320
321
322const char *UBUtilTests()
323{
324 UsefulBuf UB = NULLUsefulBuf;
325
326 if(!UsefulBuf_IsNULL(UB)){
327 return "IsNull failed";
328 }
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530329
330 if(!UsefulBuf_IsEmpty(UB)){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800331 return "IsEmpty failed";
332 }
333
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530334 if(!UsefulBuf_IsNULLOrEmpty(UB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800335 return "IsNULLOrEmpty failed";
336 }
337
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800338 const UsefulBufC UBC = UsefulBuf_Const(UB);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530339
340 if(!UsefulBuf_IsNULLC(UBC)){
341 return "IsNull const failed";
342 }
343
344 if(!UsefulBuf_IsEmptyC(UBC)){
345 return "IsEmptyC failed";
346 }
347
348 if(!UsefulBuf_IsNULLOrEmptyC(UBC)){
349 return "IsNULLOrEmptyC failed";
350 }
351
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800352 const UsefulBuf UB2 = UsefulBuf_Unconst(UBC);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530353 if(!UsefulBuf_IsEmpty(UB2)) {
354 return "Back to UB is Empty failed";
355 }
356
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800357 UB.ptr = "x"; // just some valid pointer
358
359 if(UsefulBuf_IsNULL(UB)){
360 return "IsNull failed";
361 }
362
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530363 if(!UsefulBuf_IsEmptyC(UBC)){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800364 return "IsEmpty failed";
365 }
366
367 // test the Unconst.
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530368 if(UsefulBuf_Unconst(UBC).ptr != NULL) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800369 return "Unconst failed";
370 }
371
372 // Set 100 bytes of '+'; validated a few tests later
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530373 UsefulBuf_MAKE_STACK_UB(Temp, 100);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800374 const UsefulBufC TempC = UsefulBuf_Set(Temp, '+');
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800375
376 // Try to copy into a buf that is too small and see failure
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530377 UsefulBuf_MAKE_STACK_UB(Temp2, 99);
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530378 if(!UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp2, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800379 return "Copy should have failed";
380 }
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530381
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800382 if(UsefulBuf_IsNULLC(UsefulBuf_CopyPtr(Temp2, "xx", 2))) {
383 return "CopyPtr failed";
384 }
385
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530386 UsefulBufC xxyy = UsefulBuf_CopyOffset(Temp2, 2, UsefulBuf_FROM_SZ_LITERAL("yy"));
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800387 if(UsefulBuf_IsNULLC(xxyy)) {
388 return "CopyOffset Failed";
389 }
390
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530391 if(UsefulBuf_Compare(UsefulBuf_Head(xxyy, 3), UsefulBuf_FROM_SZ_LITERAL("xxy"))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800392 return "head failed";
393 }
394
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530395 if(UsefulBuf_Compare(UsefulBuf_Tail(xxyy, 1), UsefulBuf_FROM_SZ_LITERAL("xyy"))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800396 return "tail failed";
397 }
398
399 if(!UsefulBuf_IsNULLC(UsefulBuf_Head(xxyy, 5))) {
400 return "head should have failed";
401 }
402
403 if(!UsefulBuf_IsNULLC(UsefulBuf_Tail(xxyy, 5))) {
404 return "tail should have failed";
405 }
406
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530407 if(!UsefulBuf_IsNULLC(UsefulBuf_CopyOffset(Temp2, 100, UsefulBuf_FROM_SZ_LITERAL("yy")))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800408 return "Copy Offset should have failed";
409 }
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530410
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800411 // Try to copy into a NULL/empty buf and see failure
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800412 const UsefulBuf UBNull = NULLUsefulBuf;
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530413 if(!UsefulBuf_IsNULLC(UsefulBuf_Copy(UBNull, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800414 return "Copy to NULL should have failed";
415 }
416
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800417
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800418 // Try to set a NULL/empty buf; nothing should happen
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530419 UsefulBuf_Set(UBNull, '+'); // This will crash on failure
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800420
421 // Copy successfully to a buffer
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530422 UsefulBuf_MAKE_STACK_UB(Temp3, 101);
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530423 if(UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp3, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800424 return "Copy should not have failed";
425 }
426
427 static const uint8_t pExpected[] = {
428 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
429 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
430 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
431 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
432 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
433 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
434 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
435 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
436 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
437 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
438 };
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530439 UsefulBufC Expected = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpected);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800440 // This validates comparison for equality and the UsefulBuf_Set
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530441 if(UsefulBuf_Compare(Expected, TempC)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800442 return "Set / Copy / Compare failed";
443 }
444
445 // Compare two empties and expect success
446 if(UsefulBuf_Compare(NULLUsefulBufC, NULLUsefulBufC)){
447 return "Compare Empties failed";
448 }
449
450 // Compare with empty and expect the first to be larger
451 if(UsefulBuf_Compare(Expected, NULLUsefulBufC) <= 0){
452 return "Compare with empty failed";
453 }
454
455
456 static const uint8_t pExpectedBigger[] = {
457 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
458 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
459 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
460 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
461 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
462 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
463 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
464 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
465 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
466 '+', '+', '+', '+', '+', '+', '+', '+', '+', ',',
467 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800468 const UsefulBufC ExpectedBigger = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedBigger);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800469
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530470 // Expect -1 when the first arg is smaller
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800471 if(UsefulBuf_Compare(Expected, ExpectedBigger) >= 0){
472 return "Compare with bigger";
473 }
474
475
476 static const uint8_t pExpectedSmaller[] = {
477 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
478 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
479 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
480 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
481 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
482 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
483 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
484 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
485 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
486 '+', '+', '+', '+', '+', '+', '+', '+', '+', '*',
487 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800488 const UsefulBufC ExpectedSmaller = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedSmaller);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530489 // Expect +1 when the first arg is larger
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800490 if(UsefulBuf_Compare(Expected, ExpectedSmaller) <= 0){
491 return "Compare with smaller";
492 }
493
494
495 static const uint8_t pExpectedLonger[] = {
496 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
497 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
498 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
499 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
500 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
501 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
502 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
503 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
504 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
505 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+'
506 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800507 const UsefulBufC ExpectedLonger = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedLonger);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800508
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530509 // Expect -1 when the first arg is smaller
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800510 if(UsefulBuf_Compare(Expected, ExpectedLonger) >= 0){
511 return "Compare with longer";
512 }
513
514
515 static const uint8_t pExpectedShorter[] = {
516 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
517 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
518 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
519 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
520 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
521 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
522 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
523 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
524 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
525 '+', '+', '+', '+', '+', '+', '+', '+', '+',
526 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800527 const UsefulBufC ExpectedShorter = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedShorter);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800528 // Expect +1 with the first arg is larger
529 if(UsefulBuf_Compare(Expected, ExpectedShorter) <= 0){
530 return "Compare with shorter";
531 }
532
533
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530534 if(UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp, NULLUsefulBufC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800535 return "Copy null/empty failed";
536 }
537
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800538 // Look for +++++... in +++++... and find it at the beginning
539 if(0 != UsefulBuf_FindBytes(ExpectedLonger, ExpectedShorter)){
540 return "Failed to find";
541 }
542
543 // look for ++* in ....++* and find it at the end
544 static const uint8_t pToFind[] = {'+', '+', '*'};
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800545 const UsefulBufC ToBeFound = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pToFind);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800546
547 if(97 != UsefulBuf_FindBytes(ExpectedSmaller, ToBeFound)){
548 return "Failed to find 2";
549 }
550
551 // look for ++* in ....++, and find it near the end
552 if(SIZE_MAX != UsefulBuf_FindBytes(ExpectedBigger, ToBeFound)){
553 return "Failed to not find";
554 }
555
556 // Look for the whole buffer in itself and succeed.
557 if(0 != UsefulBuf_FindBytes(ExpectedLonger, ExpectedLonger)){
558 return "Failed to find 3";
559 }
560
561 return NULL;
562}
563
564
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800565const char * UIBTest_IntegerFormat()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800566{
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530567 UsefulOutBuf_MakeOnStack(UOB,100);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800568
569 const uint32_t u32 = 0x0A0B0C0D; // from https://en.wikipedia.org/wiki/Endianness
570 const uint64_t u64 = 1984738472938472;
571 const uint16_t u16 = 40000;
572 const uint8_t u8 = 9;
573 const float f = (float)314.15;
574 const double d = 2.1e10;
575
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800576
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530577 UsefulOutBuf_AppendUint32(&UOB, u32); // Also tests UsefulOutBuf_InsertUint64 and UsefulOutBuf_GetEndPosition
578 UsefulOutBuf_AppendUint64(&UOB, u64); // Also tests UsefulOutBuf_InsertUint32
579 UsefulOutBuf_AppendUint16(&UOB, u16); // Also tests UsefulOutBuf_InsertUint16
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800580 UsefulOutBuf_AppendByte(&UOB, u8);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530581 UsefulOutBuf_AppendFloat(&UOB, f); // Also tests UsefulOutBuf_InsertFloat
582 UsefulOutBuf_AppendDouble(&UOB, d); // Also tests UsefulOutBuf_InsertDouble
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800583
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800584 const UsefulBufC O = UsefulOutBuf_OutUBuf(&UOB);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530585 if(UsefulBuf_IsNULLC(O))
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800586 return "Couldn't output integers";
587
588 // from https://en.wikipedia.org/wiki/Endianness
589 const uint8_t pExpectedNetworkOrder[4] = {0x0A, 0x0B, 0x0C, 0x0D};
590 if(memcmp(O.ptr, pExpectedNetworkOrder, 4)) {
591 return "not in network order";
592 }
593
594 UsefulInputBuf UIB;
595
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530596 UsefulInputBuf_Init(&UIB, O);
597
598 if(UsefulInputBuf_Tell(&UIB) != 0) {
599 return "UsefulInputBuf_Tell failed";
600 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800601
602 if(UsefulInputBuf_GetUint32(&UIB) != u32) {
603 return "u32 out then in failed";
604 }
605 if(UsefulInputBuf_GetUint64(&UIB) != u64) {
606 return "u64 out then in failed";
607 }
608 if(UsefulInputBuf_GetUint16(&UIB) != u16) {
609 return "u16 out then in failed";
610 }
611 if(UsefulInputBuf_GetByte(&UIB) != u8) {
612 return "u8 out then in failed";
613 }
614 if(UsefulInputBuf_GetFloat(&UIB) != f) {
615 return "float out then in failed";
616 }
617 if(UsefulInputBuf_GetDouble(&UIB) != d) {
618 return "double out then in failed";
619 }
620
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800621 // Reset and go again for a few more tests
622 UsefulInputBuf_Init(&UIB, O);
623
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800624 const UsefulBufC Four = UsefulInputBuf_GetUsefulBuf(&UIB, 4);
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800625 if(UsefulBuf_IsNULLC(Four)) {
626 return "Four is NULL";
627 }
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530628 if(UsefulBuf_Compare(Four, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedNetworkOrder))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800629 return "Four compare failed";
630 }
631
632 if(UsefulInputBuf_BytesUnconsumed(&UIB) != 23){
633 return "Wrong number of unconsumed bytes";
634 }
635
636 if(!UsefulInputBuf_BytesAvailable(&UIB, 23)){
637 return "Wrong number of bytes available I";
638 }
639
640 if(UsefulInputBuf_BytesAvailable(&UIB, 24)){
641 return "Wrong number of bytes available II";
642 }
643
644 UsefulInputBuf_Seek(&UIB, 0);
645
646 if(UsefulInputBuf_GetError(&UIB)) {
647 return "unexpected error after seek";
648 }
649
650 const uint8_t *pGetBytes = (const uint8_t *)UsefulInputBuf_GetBytes(&UIB, 4);
651 if(pGetBytes == NULL) {
652 return "GetBytes returns NULL";
653 }
654
655 if(memcmp(pGetBytes, pExpectedNetworkOrder, 4)) {
656 return "Got wrong bytes";
657 }
658
659 UsefulInputBuf_Seek(&UIB, 28);
660
661 if(!UsefulInputBuf_GetError(&UIB)) {
662 return "expected error after seek";
663 }
664
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530665 return NULL;
666}
667
668
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800669const char *UBUTest_CopyUtil()
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530670{
671 if(UsefulBufUtil_CopyFloatToUint32(65536.0F) != 0x47800000) {
672 return "CopyFloatToUint32 failed";
673 }
674
675 if(UsefulBufUtil_CopyDoubleToUint64(4e-40F) != 0X37C16C2800000000ULL) {
676 return "CopyDoubleToUint64 failed";
677 }
678
679 if(UsefulBufUtil_CopyUint64ToDouble(0X37C16C2800000000ULL) != 4e-40F) {
680 return "CopyUint64ToDouble failed";
681 }
682
683 if(UsefulBufUtil_CopyUint32ToFloat(0x47800000) != 65536.0F) {
684 return "CopyUint32ToFloat failed";
685 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800686
687 return NULL;
688}
689
690
691