blob: 385551cb13803c84692c535067b6d8a2ac11919b [file] [log] [blame]
Laurence Lundblade52aefa62024-06-13 13:23:17 -07001/* ==========================================================================
2 * Copyright (c) 2016-2018, The Linux Foundation.
3 * Copyright (c) 2018-2024, Laurence Lundblade.
4 * Copyright (c) 2021, Arm Limited.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
9 * met:
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following
14 * disclaimer in the documentation and/or other materials provided
15 * with the distribution.
16 * * Neither the name of The Linux Foundation nor the names of its
17 * contributors, nor the name "Laurence Lundblade" may be used to
18 * endorse or promote products derived from this software without
19 * specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
22 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
30 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
31 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 * ========================================================================= */
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053033
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080034#include "UsefulBuf.h"
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080035
36
Laurence Lundblade8ece3732021-09-21 21:47:23 -070037/* This calls the main methods to add stuff to a UsefulOutBuf.
Paul Liétarc6cfa332022-07-26 19:24:01 +010038 * The result in the UsefulOutBuf is "heffalump unbounce bluster hunny bear"
Laurence Lundblade8ece3732021-09-21 21:47:23 -070039 */
40const char *AddStuffToUOB(UsefulOutBuf *pUOB)
41{
42 const char *szReturn = NULL;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080043
Laurence Lundblade8ece3732021-09-21 21:47:23 -070044 if(!UsefulOutBuf_AtStart(pUOB)) {
45 szReturn = "Not at start";
46 goto Done;
47 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080048
Laurence Lundblade8ece3732021-09-21 21:47:23 -070049 /* Put 7 bytes at beginning of buf */
50 UsefulOutBuf_AppendData(pUOB, "bluster", 7);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080051
Laurence Lundblade8ece3732021-09-21 21:47:23 -070052 if(UsefulOutBuf_AtStart(pUOB)) {
53 szReturn = "At start";
54 goto Done;
55 }
56
57 /* add a space to end */
58 UsefulOutBuf_AppendByte(pUOB, ' ');
59
Laurence Lundblade5a6fec52022-12-25 11:28:43 -070060 /* Add an empty string */
61 UsefulOutBuf_AppendUsefulBuf(pUOB, NULLUsefulBufC);
62
63 /* Add a zero length string (valid pointer, 0 length) */
64 UsefulOutBuf_AppendData(pUOB, "xxx", 0);
65
Paul Liétarc6cfa332022-07-26 19:24:01 +010066 /* Add 6 bytes to the end */
67 UsefulBufC UBC = {"hunny ", 6};
Laurence Lundblade8ece3732021-09-21 21:47:23 -070068 UsefulOutBuf_AppendUsefulBuf(pUOB, UBC);
69
70 /* Insert 9 bytes at the beginning, slide the previous stuff right */
71 UsefulOutBuf_InsertData(pUOB, "heffalump", 9, 0);
72 UsefulOutBuf_InsertByte(pUOB, ' ', 9);
73
74 /* Put 9 bytes in at position 10 -- just after "heffalump " */
75 UsefulBufC UBC2 = {"unbounce ", 9};
76 UsefulOutBuf_InsertUsefulBuf(pUOB, UBC2, 10);
77
Paul Liétarc6cfa332022-07-26 19:24:01 +010078 /* Add 4 bytes to the end, by accessing the buffer directly and then advancing it */
79 UsefulBuf UB = UsefulOutBuf_GetOutPlace(pUOB);
80 if (!UsefulBuf_IsNULL(UB)) {
81 memcpy(UB.ptr, "bear", UB.len < 4 ? UB.len : 4);
82 }
83 UsefulOutBuf_Advance(pUOB, 4);
84
Laurence Lundblade8ece3732021-09-21 21:47:23 -070085Done:
86 return szReturn;
87}
88
89
90/* Basic exercise of a UsefulOutBuf
91 *
92 * Call all the main public functions.
93 *
94 * Binary compare the result to the expected.
95 *
96 * There is nothing adversarial in this test
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080097 */
Laurence Lundbladeb9702452021-03-08 21:02:57 -080098const char * UOBTest_NonAdversarial(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080099{
100 const char *szReturn = NULL;
101
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700102 UsefulBuf_MAKE_STACK_UB(outbuf, 50);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800103
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800104 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800105
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530106 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800107
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700108 szReturn = AddStuffToUOB(&UOB);
109 if(szReturn) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800110 goto Done;
111 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800112
Paul Liétarc6cfa332022-07-26 19:24:01 +0100113 const UsefulBufC Expected = UsefulBuf_FROM_SZ_LITERAL("heffalump unbounce bluster hunny bear");
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800114
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530115 UsefulBufC U = UsefulOutBuf_OutUBuf(&UOB);
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700116 if(UsefulBuf_IsNULLC(U) ||
117 UsefulBuf_Compare(Expected, U) ||
118 UsefulOutBuf_GetError(&UOB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800119 szReturn = "OutUBuf";
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700120 goto Done;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800121 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800122
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530123 UsefulBuf_MAKE_STACK_UB(buf, 50);
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700124 UsefulBufC Out = UsefulOutBuf_CopyOut(&UOB, buf);
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800125 if(UsefulBuf_IsNULLC(Out) || UsefulBuf_Compare(Expected, Out)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800126 szReturn = "CopyOut";
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700127 goto Done;
128 }
129
Laurence Lundblade534112f2025-02-26 15:12:47 -0700130 Out = UsefulOutBuf_OutSubString(&UOB, 10, 8);
Laurence Lundbladee2226742024-08-16 10:50:23 -0700131 if(UsefulBuf_IsNULLC(Out) ||
132 UsefulBuf_Compare(UsefulBuf_FROM_SZ_LITERAL("unbounce"), Out) ||
133 UsefulOutBuf_GetError(&UOB)) {
134 szReturn = "SubString substring";
135 goto Done;
136 }
137
Laurence Lundblade534112f2025-02-26 15:12:47 -0700138 Out = UsefulOutBuf_OutSubString(&UOB, 0, Expected.len);
Laurence Lundbladee2226742024-08-16 10:50:23 -0700139 if(UsefulBuf_IsNULLC(Out) ||
140 UsefulBuf_Compare(Expected, Out) ||
141 UsefulOutBuf_GetError(&UOB)) {
142 szReturn = "SubString all";
143 goto Done;
144 }
145
Laurence Lundblade534112f2025-02-26 15:12:47 -0700146 Out = UsefulOutBuf_OutSubString(&UOB, Expected.len, 0);
Laurence Lundbladee2226742024-08-16 10:50:23 -0700147 if(UsefulBuf_IsNULLC(Out) ||
148 UsefulBuf_Compare(UsefulBuf_FROM_SZ_LITERAL(""), Out) ||
149 UsefulOutBuf_GetError(&UOB)) {
150 szReturn = "SubString empty";
151 goto Done;
152 }
153
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700154 /* Now test the size calculation mode */
155 UsefulOutBuf_Init(&UOB, SizeCalculateUsefulBuf);
156
157 szReturn = AddStuffToUOB(&UOB);
158 if(szReturn) {
159 goto Done;
160 }
161
162 U = UsefulOutBuf_OutUBuf(&UOB);
163 if(U.len != Expected.len || U.ptr != NULL) {
164 szReturn = "size calculation failed";
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800165 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800166
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800167Done:
168 return szReturn;
169}
170
171
172/*
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700173 * Append test utility.
174 * pUOB is the buffer to append too
175 * num is the amount to append
176 * expected is the expected return code, 0 or 1
177 *
178 * returns 0 if test passed
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800179 */
180static int AppendTest(UsefulOutBuf *pUOB, size_t num, int expected)
181{
182 //reset
183 UsefulOutBuf_Reset(pUOB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800184
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800185 // check status first
186 if(UsefulOutBuf_GetError(pUOB))
187 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800188
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800189 // append the bytes
190 UsefulOutBuf_AppendData(pUOB, (const uint8_t *)"bluster", num);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800191
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800192 // check error status after
193 if(UsefulOutBuf_GetError(pUOB) != expected)
194 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800195
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800196 return 0;
197}
198
199
200/*
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700201 * Same as append, but takes a position param too
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800202 */
203static int InsertTest(UsefulOutBuf *pUOB, size_t num, size_t pos, int expected)
204{
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530205 // reset
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800206 UsefulOutBuf_Reset(pUOB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800207
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800208 // check
209 if(UsefulOutBuf_GetError(pUOB))
210 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800211
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800212 UsefulOutBuf_InsertData(pUOB, (const uint8_t *)"bluster", num, pos);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800213
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800214 if(UsefulOutBuf_GetError(pUOB) != expected)
215 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800216
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800217 return 0;
218}
219
220
221/*
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700222 * Boundary conditions to test
223 * - around 0
224 * - around the buffer size
225 * - around MAX size_t
226 *
227 *
228 * Test these for the buffer size and the cursor, the insert amount, the
229 * append amount and the insert position
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800230 */
231
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800232const char *UOBTest_BoundaryConditionsTest(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800233{
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700234 UsefulBuf_MAKE_STACK_UB(outbuf, 2);
Laurence Lundblade534112f2025-02-26 15:12:47 -0700235 UsefulOutBuf UOB_UnInitialized;
236 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800237
Laurence Lundblade534112f2025-02-26 15:12:47 -0700238 /* For test detection of uninitlized UOB (wrong magic number) */
239 memset(&UOB_UnInitialized, 42, sizeof(UsefulInputBuf));
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800240
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530241 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800242
243 // append 0 byte to a 2 byte buffer --> success
244 if(AppendTest(&UOB, 0, 0))
245 return "Append 0 bytes failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800246
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800247 // append 1 byte to a 2 byte buffer --> success
248 if(AppendTest(&UOB, 1, 0))
249 return "Append of 1 byte failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800250
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800251 // append 2 byte to a 2 byte buffer --> success
252 if(AppendTest(&UOB, 2, 0))
253 return "Append to fill buffer failed";
254
255 // append 3 bytes to a 2 byte buffer --> failure
256 if(AppendTest(&UOB, 3, 1))
257 return "Overflow of buffer not caught";
258
259 // append max size_t to a 2 byte buffer --> failure
260 if(AppendTest(&UOB, SIZE_MAX, 1))
261 return "Append of SIZE_MAX error not caught";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800262
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800263 if(InsertTest(&UOB, 1, 0, 0))
264 return "Insert 1 byte at start failed";
265
266 if(InsertTest(&UOB, 2, 0, 0))
267 return "Insert 2 bytes at start failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800268
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800269 if(InsertTest(&UOB, 3, 0, 1))
270 return "Insert overflow not caught";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800271
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800272 if(InsertTest(&UOB, 1, 1, 1))
273 return "Bad insertion point not caught";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800274
275
Laurence Lundbladee2226742024-08-16 10:50:23 -0700276 UsefulBuf_MAKE_STACK_UB(outBuf2, 10);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800277
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530278 UsefulOutBuf_Init(&UOB, outBuf2);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800279
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800280 UsefulOutBuf_Reset(&UOB);
281 // put data in the buffer
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800282 UsefulOutBuf_AppendString(&UOB, "abc123");
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800283
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800284 UsefulOutBuf_InsertString(&UOB, "xyz*&^", 0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800285
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800286 if(!UsefulOutBuf_GetError(&UOB)) {
287 return "insert with data should have failed";
288 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800289
Laurence Lundblade534112f2025-02-26 15:12:47 -0700290 UsefulOutBuf_InsertString(&UOB_UnInitialized, "abc123", 0);
291 if(!UsefulOutBuf_GetError(&UOB_UnInitialized)) {
292 return "InsertString failed uninit detect";
293 }
294
Laurence Lundbladee2226742024-08-16 10:50:23 -0700295 UsefulOutBuf_Init(&UOB, outBuf2);
296 UsefulOutBuf_AppendString(&UOB, "abc123");
297
Laurence Lundblade534112f2025-02-26 15:12:47 -0700298 UsefulBufC Out = UsefulOutBuf_OutSubString(&UOB, 7, 1);
Laurence Lundbladee2226742024-08-16 10:50:23 -0700299 if(!UsefulBuf_IsNULLC(Out)) {
300 return "SubString start should fail off end 1";
301 }
Laurence Lundblade534112f2025-02-26 15:12:47 -0700302 Out = UsefulOutBuf_OutSubString(&UOB, 5, 3);
Laurence Lundbladee2226742024-08-16 10:50:23 -0700303 if(!UsefulBuf_IsNULLC(Out)) {
304 return "SubString len should fail off end 2";
305 }
Laurence Lundblade534112f2025-02-26 15:12:47 -0700306 Out = UsefulOutBuf_OutSubString(&UOB, 0, 7);
Laurence Lundbladee2226742024-08-16 10:50:23 -0700307 if(!UsefulBuf_IsNULLC(Out)) {
308 return "SubString len should fail off end 3";
309 }
Laurence Lundblade534112f2025-02-26 15:12:47 -0700310 Out = UsefulOutBuf_OutSubString(&UOB, 7, 0);
Laurence Lundbladee2226742024-08-16 10:50:23 -0700311 if(!UsefulBuf_IsNULLC(Out)) {
312 return "SubString len should fail off end 4";
313 }
Laurence Lundblade534112f2025-02-26 15:12:47 -0700314 Out = UsefulOutBuf_OutSubString(&UOB, 6, 1);
Laurence Lundbladee2226742024-08-16 10:50:23 -0700315 if(!UsefulBuf_IsNULLC(Out)) {
316 return "SubString len should fail off end 5";
317 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800318
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530319 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800320 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX -6);
321 if(UsefulOutBuf_GetError(&UOB)) {
322 return "insert in huge should have succeeded";
323 }
Laurence Lundblade534112f2025-02-26 15:12:47 -0700324 UsefulOutBuf_Init(&UOB, outBuf2);
325 Out = UsefulOutBuf_OutSubString(&UOB, 0, 1);
326 if(!UsefulBuf_IsNULLC(Out)) {
327 return "SubString len should fail off end 5";
328 }
329 Out = UsefulOutBuf_OutSubString(&UOB_UnInitialized, 0, 1);
330 if(!UsefulBuf_IsNULLC(Out)) {
331 return "SubString failed uninit detect";
332 }
333
334
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800335
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530336 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800337 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX -5);
338 if(UsefulOutBuf_GetError(&UOB)) {
339 return "insert in huge should have succeeded";
340 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800341
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530342 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800343 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX - 4);
344 if(!UsefulOutBuf_GetError(&UOB)) {
345 return "lengths near max size";
346 }
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700347 UsefulBufC O = UsefulOutBuf_OutUBuf(&UOB);
348 if(!UsefulBuf_IsNULLC(O)) {
349 return "OutUBuf in error should have returned NULL";
350 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800351
Laurence Lundblade30dd0ba2019-05-26 23:37:30 +0300352 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, 100});
353 if(!UsefulOutBuf_IsBufferNULL(&UOB)) {
354 return "NULL check failed";
355 }
356
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700357 UsefulOutBuf_Init(&UOB, outbuf);
358 UOB.magic = 99; // corrupt the UOB
359 O = UsefulOutBuf_OutUBuf(&UOB);
360 if(!UsefulBuf_IsNULLC(O)) {
361 return "OutUBuf on corrupted should have returned NULL";
362 }
363
364 MakeUsefulBufOnStack(Tmp, 20);
365 O = UsefulOutBuf_CopyOut(&UOB, Tmp);
366 if(!UsefulBuf_IsNULLC(O)) {
367 return "CopyOut on corrupted should have returned NULL";
368 }
369
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800370 return NULL;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800371}
372
373
374
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800375// Test function to get size and magic number check
376
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800377const char *TestBasicSanity(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800378{
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530379 UsefulBuf_MAKE_STACK_UB(outbuf,10);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800380
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800381 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800382
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800383 // First -- make sure that the room left function returns the right amount
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530384 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800385
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530386 if(UsefulOutBuf_RoomLeft(&UOB) != 10)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800387 return "room left failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800388
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800389 if(!UsefulOutBuf_WillItFit(&UOB, 9)) {
390 return "it did not fit";
391 }
392
393 if(UsefulOutBuf_WillItFit(&UOB, 11)) {
394 return "it should have not fit";
395 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800396
397
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800398 // Next -- make sure that the magic number checking is working right
399 UOB.magic = 8888; // make magic bogus
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800400
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800401 UsefulOutBuf_AppendData(&UOB, (const uint8_t *)"bluster", 7);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800402
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700403 if(!UsefulOutBuf_GetError(&UOB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800404 return "magic corruption check failed";
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700405 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800406
407
408
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800409 // Next make sure that the valid data length check is working right
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530410 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800411
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530412 UOB.data_len = UOB.UB.len+1; // make size bogus
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800413
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800414 UsefulOutBuf_AppendData(&UOB, (const uint8_t *)"bluster", 7);
415 if(!UsefulOutBuf_GetError(&UOB))
416 return "valid data check failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800417
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800418 return NULL;
419}
420
421
422
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800423const char *UBMacroConversionsTest(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800424{
425 char *szFoo = "foo";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800426
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530427 UsefulBufC Foo = UsefulBuf_FromSZ(szFoo);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800428 if(Foo.len != 3 || strncmp(Foo.ptr, szFoo, 3))
429 return "SZToUsefulBufC failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800430
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530431 UsefulBufC Too = UsefulBuf_FROM_SZ_LITERAL("Toooo");
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800432 if(Too.len != 5 || strncmp(Too.ptr, "Toooo", 5))
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530433 return "UsefulBuf_FROM_SZ_LITERAL failed";
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800434
435 uint8_t pB[] = {0x42, 0x6f, 0x6f};
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530436 UsefulBufC Boo = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pB);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800437 if(Boo.len != 3 || strncmp(Boo.ptr, "Boo", 3))
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530438 return "UsefulBuf_FROM_BYTE_ARRAY_LITERAL failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800439
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800440 char *String = "string"; // Intentionally not const
441 UsefulBuf B = (UsefulBuf){(void *)String, strlen(String)};
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530442 UsefulBufC BC = UsefulBuf_Const(B);
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800443 if(BC.len != strlen(String) || BC.ptr != String)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800444 return "UsefulBufConst failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800445
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800446 return NULL;
447}
448
449
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800450const char *UBUtilTests(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800451{
452 UsefulBuf UB = NULLUsefulBuf;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800453
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800454 if(!UsefulBuf_IsNULL(UB)){
455 return "IsNull failed";
456 }
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530457
458 if(!UsefulBuf_IsEmpty(UB)){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800459 return "IsEmpty failed";
460 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800461
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530462 if(!UsefulBuf_IsNULLOrEmpty(UB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800463 return "IsNULLOrEmpty failed";
464 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800465
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800466 const UsefulBufC UBC = UsefulBuf_Const(UB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800467
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530468 if(!UsefulBuf_IsNULLC(UBC)){
469 return "IsNull const failed";
470 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800471
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530472 if(!UsefulBuf_IsEmptyC(UBC)){
473 return "IsEmptyC failed";
474 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800475
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530476 if(!UsefulBuf_IsNULLOrEmptyC(UBC)){
477 return "IsNULLOrEmptyC failed";
478 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800479
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800480 const UsefulBuf UB2 = UsefulBuf_Unconst(UBC);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530481 if(!UsefulBuf_IsEmpty(UB2)) {
482 return "Back to UB is Empty failed";
483 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800484
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800485 UB.ptr = "x"; // just some valid pointer
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800486
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800487 if(UsefulBuf_IsNULL(UB)){
488 return "IsNull failed";
489 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800490
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530491 if(!UsefulBuf_IsEmptyC(UBC)){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800492 return "IsEmpty failed";
493 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800494
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800495 // test the Unconst.
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530496 if(UsefulBuf_Unconst(UBC).ptr != NULL) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800497 return "Unconst failed";
498 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800499
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800500 // Set 100 bytes of '+'; validated a few tests later
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530501 UsefulBuf_MAKE_STACK_UB(Temp, 100);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800502 const UsefulBufC TempC = UsefulBuf_Set(Temp, '+');
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800503
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800504 // Try to copy into a buf that is too small and see failure
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530505 UsefulBuf_MAKE_STACK_UB(Temp2, 99);
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530506 if(!UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp2, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800507 return "Copy should have failed";
508 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800509
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800510 if(UsefulBuf_IsNULLC(UsefulBuf_CopyPtr(Temp2, "xx", 2))) {
511 return "CopyPtr failed";
512 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800513
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530514 UsefulBufC xxyy = UsefulBuf_CopyOffset(Temp2, 2, UsefulBuf_FROM_SZ_LITERAL("yy"));
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800515 if(UsefulBuf_IsNULLC(xxyy)) {
516 return "CopyOffset Failed";
517 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800518
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530519 if(UsefulBuf_Compare(UsefulBuf_Head(xxyy, 3), UsefulBuf_FROM_SZ_LITERAL("xxy"))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800520 return "head failed";
521 }
522
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530523 if(UsefulBuf_Compare(UsefulBuf_Tail(xxyy, 1), UsefulBuf_FROM_SZ_LITERAL("xyy"))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800524 return "tail failed";
525 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800526
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800527 if(!UsefulBuf_IsNULLC(UsefulBuf_Head(xxyy, 5))) {
528 return "head should have failed";
529 }
530
531 if(!UsefulBuf_IsNULLC(UsefulBuf_Tail(xxyy, 5))) {
532 return "tail should have failed";
533 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -0800534
Laurence Lundblade7412f812019-01-01 18:49:36 -0800535 if(!UsefulBuf_IsNULLC(UsefulBuf_Tail(NULLUsefulBufC, 0))) {
536 return "tail of NULLUsefulBufC is not NULLUsefulBufC";
537 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -0800538
Laurence Lundblade7412f812019-01-01 18:49:36 -0800539 const UsefulBufC TailResult = UsefulBuf_Tail((UsefulBufC){NULL, 100}, 99);
540 if(TailResult.ptr != NULL || TailResult.len != 1) {
541 return "tail of NULL and length incorrect";
542 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800543
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530544 if(!UsefulBuf_IsNULLC(UsefulBuf_CopyOffset(Temp2, 100, UsefulBuf_FROM_SZ_LITERAL("yy")))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800545 return "Copy Offset should have failed";
546 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800547
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800548 // Try to copy into a NULL/empty buf and see failure
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800549 const UsefulBuf UBNull = NULLUsefulBuf;
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530550 if(!UsefulBuf_IsNULLC(UsefulBuf_Copy(UBNull, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800551 return "Copy to NULL should have failed";
552 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800553
554
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800555 // Try to set a NULL/empty buf; nothing should happen
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530556 UsefulBuf_Set(UBNull, '+'); // This will crash on failure
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800557
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800558 // Copy successfully to a buffer
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530559 UsefulBuf_MAKE_STACK_UB(Temp3, 101);
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530560 if(UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp3, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800561 return "Copy should not have failed";
562 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800563
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800564 static const uint8_t pExpected[] = {
565 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
566 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
567 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
568 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
569 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
570 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
571 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
572 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
573 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
574 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
575 };
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530576 UsefulBufC Expected = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpected);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800577 // This validates comparison for equality and the UsefulBuf_Set
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530578 if(UsefulBuf_Compare(Expected, TempC)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800579 return "Set / Copy / Compare failed";
580 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800581
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800582 // Compare two empties and expect success
583 if(UsefulBuf_Compare(NULLUsefulBufC, NULLUsefulBufC)){
584 return "Compare Empties failed";
585 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800586
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800587 // Compare with empty and expect the first to be larger
588 if(UsefulBuf_Compare(Expected, NULLUsefulBufC) <= 0){
589 return "Compare with empty failed";
590 }
591
592
593 static const uint8_t pExpectedBigger[] = {
594 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
595 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
596 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
597 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
598 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
599 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
600 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
601 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
602 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
603 '+', '+', '+', '+', '+', '+', '+', '+', '+', ',',
604 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800605 const UsefulBufC ExpectedBigger = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedBigger);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800606
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530607 // Expect -1 when the first arg is smaller
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800608 if(UsefulBuf_Compare(Expected, ExpectedBigger) >= 0){
609 return "Compare with bigger";
610 }
611
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800612
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800613 static const uint8_t pExpectedSmaller[] = {
614 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
615 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
616 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
617 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
618 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
619 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
620 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
621 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
622 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
623 '+', '+', '+', '+', '+', '+', '+', '+', '+', '*',
624 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800625 const UsefulBufC ExpectedSmaller = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedSmaller);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530626 // Expect +1 when the first arg is larger
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800627 if(UsefulBuf_Compare(Expected, ExpectedSmaller) <= 0){
628 return "Compare with smaller";
629 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800630
631
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800632 static const uint8_t pExpectedLonger[] = {
633 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
634 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
635 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
636 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
637 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
638 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
639 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
640 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
641 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
642 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+'
643 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800644 const UsefulBufC ExpectedLonger = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedLonger);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800645
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530646 // Expect -1 when the first arg is smaller
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800647 if(UsefulBuf_Compare(Expected, ExpectedLonger) >= 0){
648 return "Compare with longer";
649 }
650
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800651
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800652 static const uint8_t pExpectedShorter[] = {
653 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
654 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
655 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
656 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
657 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
658 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
659 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
660 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
661 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
662 '+', '+', '+', '+', '+', '+', '+', '+', '+',
663 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800664 const UsefulBufC ExpectedShorter = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedShorter);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800665 // Expect +1 with the first arg is larger
666 if(UsefulBuf_Compare(Expected, ExpectedShorter) <= 0){
667 return "Compare with shorter";
668 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800669
670
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530671 if(UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp, NULLUsefulBufC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800672 return "Copy null/empty failed";
673 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800674
Laurence Lundbladed5e101e2019-03-06 17:23:18 -0800675 if(UsefulBuf_IsValue(ExpectedShorter, '+') != SIZE_MAX) {
676 return "IsValue failed to match all";
677 }
678
679 if(UsefulBuf_IsValue(ExpectedShorter, '-') != 0) {
680 return "IsValue should have failed right away";
681 }
682
683 if(UsefulBuf_IsValue(NULLUsefulBufC, 0x00) != 0) {
684 return "IsValue failed on NULLUsefulBufC";
685 }
686
687 if(UsefulBuf_IsValue((UsefulBufC){(uint8_t[]){0x00}, 1}, 0x00) != SIZE_MAX) {
688 return "IsValue failed finding 0 in one byte of 0";
689 }
690
691 if(UsefulBuf_IsValue((UsefulBufC){(uint8_t[]){0x00}, 1}, 0x01) != 0) {
692 return "IsValue failed not finding 1 in one byte of 0";
693 }
694
695 if(UsefulBuf_IsValue(ExpectedSmaller, '+') != ExpectedSmaller.len -1) {
696 return "IsValue failed to find final *";
697 }
698
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800699 // Look for +++++... in +++++... and find it at the beginning
700 if(0 != UsefulBuf_FindBytes(ExpectedLonger, ExpectedShorter)){
701 return "Failed to find";
702 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800703
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800704 // look for ++* in ....++* and find it at the end
705 static const uint8_t pToFind[] = {'+', '+', '*'};
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800706 const UsefulBufC ToBeFound = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pToFind);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800707
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800708 if(97 != UsefulBuf_FindBytes(ExpectedSmaller, ToBeFound)){
709 return "Failed to find 2";
710 }
711
712 // look for ++* in ....++, and find it near the end
713 if(SIZE_MAX != UsefulBuf_FindBytes(ExpectedBigger, ToBeFound)){
714 return "Failed to not find";
715 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800716
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800717 // Look for the whole buffer in itself and succeed.
718 if(0 != UsefulBuf_FindBytes(ExpectedLonger, ExpectedLonger)){
719 return "Failed to find 3";
720 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800721
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700722 if(SIZE_MAX != UsefulBuf_FindBytes(Expected, ExpectedLonger)) {
723 return "Failed to find 4";
724 }
725
Laurence Lundblade68769332024-11-03 13:09:20 -0800726 UsefulBufC Substring;
727 Substring = UsefulBuf_SkipLeading(UsefulBuf_FromSZ("xxyyzz"), 'x');
728 if(UsefulBuf_Compare(Substring, UsefulBuf_FromSZ("yyzz"))) {
729 return "SkipLeading didn't skip";
730 }
731
732 Substring = UsefulBuf_SkipLeading(UsefulBuf_FromSZ("xxyyzz"), 'y');
733 if(UsefulBuf_Compare(Substring, UsefulBuf_FromSZ("xxyyzz"))) {
734 return "SkipLeading skipped";
735 }
736
737 Substring = UsefulBuf_SkipLeading(UsefulBuf_FromSZ("qqq"), 'q');
738 if(UsefulBuf_Compare(Substring, UsefulBuf_FromSZ(""))) {
739 return "SkipLeading didn't return empty";
740 }
741
742 Substring = UsefulBuf_SkipLeading(UsefulBuf_FromSZ("x"), 'x');
743 if(UsefulBuf_Compare(Substring, UsefulBuf_FromSZ(""))) {
744 return "SkipLeading didn't return empty";
745 }
746
747 Substring = UsefulBuf_SkipLeading(UsefulBuf_FromSZ("xxxxxxxxxxxx"), 'x');
748 if(UsefulBuf_Compare(Substring, UsefulBuf_FromSZ(""))) {
749 return "SkipLeading didn't return empty";
750 }
Laurence Lundbladecf41c522021-02-20 10:19:07 -0700751
752 const uint8_t pB[] = {0x01, 0x02, 0x03};
753 UsefulBufC Boo = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pB);
754 // Try to map a pointer before
755 if(UsefulBuf_PointerToOffset(Boo, pB-1) != SIZE_MAX) {
756 return "Didn't error on pointer before";
757 }
758
759 // Try to map a pointer after
760 if(UsefulBuf_PointerToOffset(Boo, pB+sizeof(pB)) != SIZE_MAX) {
761 return "Didn't error on pointer after";
762 }
763
764 // Try to map a pointer inside
765 if(UsefulBuf_PointerToOffset(Boo, pB+1) != 1) {
766 return "Incorrect pointer offset";
767 }
768
769 // Try to map a pointer at the start
770 if(UsefulBuf_PointerToOffset(Boo, pB) != 0) {
771 return "Incorrect pointer offset for start";
772 }
773
774 // Try to map a pointer at the end
775 if(UsefulBuf_PointerToOffset(Boo, pB + sizeof(pB)-1) != 2) {
776 return "Incorrect pointer offset for end";
777 }
778
779 // Try to map a pointer on a NULL UB
780 if(UsefulBuf_PointerToOffset(NULLUsefulBufC, pB ) != SIZE_MAX) {
781 return "Incorrect pointer offset for start";
782 }
783
Laurence Lundbladea29f45a2024-05-14 15:55:19 -0700784 if(UsefulBuf_OffsetToPointer(Boo, 0) != &pB[0]) {
785 return "Wrong OffsetToPointer";
786 }
787
788 if(UsefulBuf_OffsetToPointer(Boo, 3) != NULL) {
789 return "Didn't validate offset correctly";
790 }
791
792 if(UsefulBuf_OffsetToPointer(Boo, 2) != &pB[2]) {
793 return "Wrong OffsetToPointer 2";
794 }
795
796 if(UsefulBuf_OffsetToPointer(NULLUsefulBufC, 2) != NULL) {
797 return "Failed OffsetToPtr on NULLUsefulBufC";
798 }
799
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800800 return NULL;
801}
802
803
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800804const char * UIBTest_IntegerFormat(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800805{
Laurence Lundbladecf41c522021-02-20 10:19:07 -0700806 UsefulOutBuf_MakeOnStack(UOB, 100);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800807
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800808 const uint32_t u32 = 0x0A0B0C0D; // from https://en.wikipedia.org/wiki/Endianness
809 const uint64_t u64 = 1984738472938472;
810 const uint16_t u16 = 40000;
811 const uint8_t u8 = 9;
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200812#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800813 const float f = (float)314.15;
814 const double d = 2.1e10;
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700815#endif /* ! USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800816
817
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530818 UsefulOutBuf_AppendUint32(&UOB, u32); // Also tests UsefulOutBuf_InsertUint64 and UsefulOutBuf_GetEndPosition
819 UsefulOutBuf_AppendUint64(&UOB, u64); // Also tests UsefulOutBuf_InsertUint32
820 UsefulOutBuf_AppendUint16(&UOB, u16); // Also tests UsefulOutBuf_InsertUint16
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800821 UsefulOutBuf_AppendByte(&UOB, u8);
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200822#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530823 UsefulOutBuf_AppendFloat(&UOB, f); // Also tests UsefulOutBuf_InsertFloat
824 UsefulOutBuf_AppendDouble(&UOB, d); // Also tests UsefulOutBuf_InsertDouble
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700825#endif /* ! USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800826
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800827 const UsefulBufC O = UsefulOutBuf_OutUBuf(&UOB);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530828 if(UsefulBuf_IsNULLC(O))
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800829 return "Couldn't output integers";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800830
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800831 // from https://en.wikipedia.org/wiki/Endianness
832 const uint8_t pExpectedNetworkOrder[4] = {0x0A, 0x0B, 0x0C, 0x0D};
833 if(memcmp(O.ptr, pExpectedNetworkOrder, 4)) {
834 return "not in network order";
835 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800836
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800837 UsefulInputBuf UIB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800838
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530839 UsefulInputBuf_Init(&UIB, O);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800840
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530841 if(UsefulInputBuf_Tell(&UIB) != 0) {
842 return "UsefulInputBuf_Tell failed";
843 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800844
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800845 if(UsefulInputBuf_GetUint32(&UIB) != u32) {
846 return "u32 out then in failed";
847 }
848 if(UsefulInputBuf_GetUint64(&UIB) != u64) {
849 return "u64 out then in failed";
850 }
851 if(UsefulInputBuf_GetUint16(&UIB) != u16) {
852 return "u16 out then in failed";
853 }
854 if(UsefulInputBuf_GetByte(&UIB) != u8) {
855 return "u8 out then in failed";
856 }
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200857#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800858 if(UsefulInputBuf_GetFloat(&UIB) != f) {
859 return "float out then in failed";
860 }
861 if(UsefulInputBuf_GetDouble(&UIB) != d) {
862 return "double out then in failed";
863 }
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200864#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800865
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700866 if(UsefulInputBuf_GetUint16(&UIB) != 0) {
867 return "Didn't catch off end with GetUint16";
868 }
869 if(UsefulInputBuf_GetUint32(&UIB) !=0 ) {
870 return "Didn't catch off end with GetUint32";
871 }
872 if(UsefulInputBuf_GetUint64(&UIB) !=0 ) {
873 return "Didn't catch off end with GetUint64";
874 }
875
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800876 // Reset and go again for a few more tests
877 UsefulInputBuf_Init(&UIB, O);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800878
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800879 const UsefulBufC Four = UsefulInputBuf_GetUsefulBuf(&UIB, 4);
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800880 if(UsefulBuf_IsNULLC(Four)) {
881 return "Four is NULL";
882 }
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530883 if(UsefulBuf_Compare(Four, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedNetworkOrder))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800884 return "Four compare failed";
885 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800886
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200887#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800888 if(UsefulInputBuf_BytesUnconsumed(&UIB) != 23){
889 return "Wrong number of unconsumed bytes";
890 }
891
892 if(!UsefulInputBuf_BytesAvailable(&UIB, 23)){
893 return "Wrong number of bytes available I";
894 }
895
896 if(UsefulInputBuf_BytesAvailable(&UIB, 24)){
897 return "Wrong number of bytes available II";
898 }
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200899#else /* USEFULBUF_DISABLE_ALL_FLOAT */
900 if(UsefulInputBuf_BytesUnconsumed(&UIB) != 11){
901 return "Wrong number of unconsumed bytes";
902 }
903 if(!UsefulInputBuf_BytesAvailable(&UIB, 11)){
904 return "Wrong number of bytes available I";
905 }
906
907 if(UsefulInputBuf_BytesAvailable(&UIB, 12)){
908 return "Wrong number of bytes available II";
909 }
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700910#endif /* ! USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800911
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800912 UsefulInputBuf_Seek(&UIB, 0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800913
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800914 if(UsefulInputBuf_GetError(&UIB)) {
915 return "unexpected error after seek";
916 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800917
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800918 const uint8_t *pGetBytes = (const uint8_t *)UsefulInputBuf_GetBytes(&UIB, 4);
919 if(pGetBytes == NULL) {
920 return "GetBytes returns NULL";
921 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800922
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800923 if(memcmp(pGetBytes, pExpectedNetworkOrder, 4)) {
924 return "Got wrong bytes";
925 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800926
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800927 UsefulInputBuf_Seek(&UIB, 28);
928
929 if(!UsefulInputBuf_GetError(&UIB)) {
930 return "expected error after seek";
931 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800932
Laurence Lundbladecf41c522021-02-20 10:19:07 -0700933 if(UsefulInputBuf_PointerToOffset(&UIB, O.ptr) != 0) {
934 return "PointerToOffset not working";
935 }
936
Laurence Lundbladea29f45a2024-05-14 15:55:19 -0700937
938 const uint8_t pB[] = {0x01, 0x02, 0x03};
939 UsefulBufC Boo = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pB);
940
941 UsefulInputBuf_Init(&UIB, Boo);
942
943 if(UsefulInputBuf_OffsetToPointer(&UIB, 0) != &pB[0]) {
944 return "OffsetToPointer fail";
945 }
946
947 if(UsefulInputBuf_OffsetToPointer(&UIB, SIZE_MAX) != NULL) {
948 return "OffsetToPointer SIZE_MAX fail";
949 }
950
Laurence Lundblade52aefa62024-06-13 13:23:17 -0700951 UsefulInputBuf_Init(&UIB, Boo);
952 UIB.magic = 88;
953 size_t uUnc = UsefulInputBuf_BytesUnconsumed(&UIB);
954 if(uUnc != 0) {
955 return "Didn't detect corrupted UsefulInputBuf";
956 }
957
958 UsefulInputBuf_Init(&UIB, Boo);
959 UIB.cursor = 500;
960 uUnc = UsefulInputBuf_BytesUnconsumed(&UIB);
961 if(uUnc != 0) {
962 return "Didn't detect bad UsefulInputBuf cursor";
963 }
964
965 if(!UsefulBuf_IsNULLC(UsefulInputBuf_GetUsefulBuf(&UIB, 5000))) {
966 return "Didn't detect off-end request of UsefulInputBuf";
967 }
968
969 if(!UsefulInputBuf_GetError(&UIB)) {
970 return "UIB Error state not reported";
971 }
972
973 UsefulInputBuf_Init(&UIB, Boo);
974 if(UsefulInputBuf_GetBufferLength(&UIB) != Boo.len) {
975 return "UIB length wrong";
976 }
977 UsefulInputBuf_SetBufferLength(&UIB, 1);
978 if(UsefulInputBuf_GetBufferLength(&UIB) != 1) {
979 return "UIB SetBufferLength failed";
980 }
981
Laurence Lundblade9b2ae8a2024-07-12 11:00:20 -0700982 UsefulBufC CompCheck = UsefulBuf_FROM_SZ_LITERAL("abcd");
983 UsefulInputBuf_Init(&UIB, CompCheck);
984
985 if(UsefulInputBuf_Compare(&UIB, 0, 2, 2, 2) >= 0) {
986 return "UB 1 compared greater than UB2";
987 }
988 if(UsefulInputBuf_Compare(&UIB, 0, 2, 0, 2) != 0) {
989 return "UB1 and UB2 didn't compare equally";
990 }
991 if(UsefulInputBuf_Compare(&UIB, 2, 2, 0, 2) <= 0) {
992 return "UB2 compared less than UB1";
993 }
994 if(UsefulInputBuf_Compare(&UIB, 4, 1, 2, 2) <= 0) {
995 return "Off-the-end UB1 compared as less than UB2";
996 }
997 if(UsefulInputBuf_Compare(&UIB, 0, 5, 2, 2) <= 0) {
998 return "Off-the-end UB1 compared as less than UB2 (second)";
999 }
1000 if(UsefulInputBuf_Compare(&UIB, 0, 2, 5, 1) >= 0) {
1001 return "Off-the-end UB2 compared as less than UB2";
1002 }
1003 if(UsefulInputBuf_Compare(&UIB, 0, 2, 2, 3) >= 0) {
1004 return "Off-the-end UB2 compared as less than UB2 (second)";
1005 }
1006
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +05301007 return NULL;
1008}
1009
1010
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +02001011#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundbladeb9702452021-03-08 21:02:57 -08001012const char *UBUTest_CopyUtil(void)
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +05301013{
1014 if(UsefulBufUtil_CopyFloatToUint32(65536.0F) != 0x47800000) {
1015 return "CopyFloatToUint32 failed";
1016 }
1017
1018 if(UsefulBufUtil_CopyDoubleToUint64(4e-40F) != 0X37C16C2800000000ULL) {
1019 return "CopyDoubleToUint64 failed";
1020 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001021
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +05301022 if(UsefulBufUtil_CopyUint64ToDouble(0X37C16C2800000000ULL) != 4e-40F) {
1023 return "CopyUint64ToDouble failed";
1024 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001025
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +05301026 if(UsefulBufUtil_CopyUint32ToFloat(0x47800000) != 65536.0F) {
1027 return "CopyUint32ToFloat failed";
1028 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001029
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001030 return NULL;
1031}
Laurence Lundblade52aefa62024-06-13 13:23:17 -07001032#endif /* ! USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001033
1034
Laurence Lundbladeb24faef2022-04-26 11:03:08 -06001035const char *UBAdvanceTest(void)
1036{
1037 #define ADVANCE_TEST_SIZE 10
1038 UsefulOutBuf_MakeOnStack(UOB, ADVANCE_TEST_SIZE);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001039
Laurence Lundbladeb24faef2022-04-26 11:03:08 -06001040 UsefulBuf Place = UsefulOutBuf_GetOutPlace(&UOB);
1041 if(Place.len != 10) {
1042 return "GetOutPlace wrong size";
1043 }
1044
1045 memset(Place.ptr, 'x', Place.len/2);
1046
1047 UsefulOutBuf_Advance(&UOB, Place.len/2);
1048
1049 UsefulOutBuf_AppendByte(&UOB, 'y');
1050
1051 Place = UsefulOutBuf_GetOutPlace(&UOB);
1052 if(Place.len != ADVANCE_TEST_SIZE/2 -1 ) {
1053 return "GetOutPlace wrong size 2";
1054 }
1055
1056 memset(Place.ptr, 'z', Place.len);
1057
1058 UsefulOutBuf_Advance(&UOB, Place.len);
1059
1060 UsefulBufC O = UsefulOutBuf_OutUBuf(&UOB);
1061
1062 UsefulBuf_Compare(O, UsefulBuf_FROM_SZ_LITERAL("xxxxxyzzzz"));
1063
1064 Place = UsefulOutBuf_GetOutPlace(&UOB);
1065 if(Place.len != 0 || Place.ptr != NULL) {
1066 return "GetOutPlace not null";
1067 }
1068
1069 if(UsefulOutBuf_GetError(&UOB)) {
1070 return "GetOutPlace error set";
1071 }
1072
1073 UsefulOutBuf_Advance(&UOB, 1);
1074 if(!UsefulOutBuf_GetError(&UOB)) {
1075 return "Advance off end didn't set error";
1076 }
1077
Laurence Lundblade52aefa62024-06-13 13:23:17 -07001078 // Try to advance in error state
1079 UsefulOutBuf_Reset(&UOB);
1080 UsefulOutBuf_Advance(&UOB, 1);
1081 Place = UsefulOutBuf_GetOutPlace(&UOB);
1082 UsefulOutBuf_Advance(&UOB, 1000);
1083 UsefulOutBuf_Advance(&UOB, 1);
1084 UsefulBuf Place2;
1085 Place2 = UsefulOutBuf_GetOutPlace(&UOB);
1086 if(memcmp(&Place, &Place2, sizeof(Place))) {
1087 return "Advance didn't noop in error state";
1088 }
1089
1090 UsefulOutBuf_Reset(&UOB);
1091 UOB.data_len = UOB.UB.len + 1; // React in and corrupt
1092 UsefulOutBuf_Advance(&UOB, 1);
1093 if(!UsefulOutBuf_GetError(&UOB)) {
1094 return "didn't detect corrupted UOB";
1095 }
1096
1097 UsefulOutBuf BadUOB;
1098 memset(&BadUOB, 'x', sizeof(BadUOB));
1099 BadUOB.err = 0;
1100 UsefulOutBuf_Advance(&BadUOB, 1);
1101 if(!UsefulOutBuf_GetError(&BadUOB)) {
1102 return "didn't detect bad UOB";
1103 }
1104
1105
Laurence Lundbladeb24faef2022-04-26 11:03:08 -06001106 return NULL;
1107}
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001108
1109
1110const char * UOBExtraTests(void)
1111{
1112 #define COMPARE_TEST_SIZE 10
Laurence Lundblade534112f2025-02-26 15:12:47 -07001113 UsefulOutBuf_MakeOnStack( UOB, COMPARE_TEST_SIZE); /* includes initialization */
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001114 int nCompare;
1115 UsefulBufC Out;
Laurence Lundblade534112f2025-02-26 15:12:47 -07001116 UsefulOutBuf UOB_UnInitialized;
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001117
Laurence Lundblade534112f2025-02-26 15:12:47 -07001118 /* For test detection of uninitlized UOB (wrong magic number) */
1119 memset(&UOB_UnInitialized, 42, sizeof(UsefulInputBuf));
1120
1121 /* --- Test UsefulOutBuf_Compare() --- */
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001122 UsefulOutBuf_AppendString(&UOB, "abcabdefab");
1123
Laurence Lundblade534112f2025-02-26 15:12:47 -07001124 /* Tests of equal length, not off the end. */
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001125 nCompare = UsefulOutBuf_Compare(&UOB, 0, 2, 8, 2);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001126 if(nCompare != 0) {
1127 return "ab should compare equal";
1128 }
1129
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001130 nCompare = UsefulOutBuf_Compare(&UOB, 0, 3, 3, 3);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001131 if(nCompare != 'd' - 'c') {
1132 return "abc should not equal abd";
1133 }
1134
Laurence Lundblade534112f2025-02-26 15:12:47 -07001135 nCompare = UsefulOutBuf_Compare(&UOB, 3, 3, 0, 3);
1136 if(nCompare != 'c' - 'd') {
1137 return "abd should not equal abc";
1138 }
1139
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001140 nCompare = UsefulOutBuf_Compare(&UOB, 3, 2, 8, 2);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001141 if(nCompare != 0) {
1142 return "ab should compare equal";
1143 }
1144
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001145 nCompare = UsefulOutBuf_Compare(&UOB, 2, 4, 5, 4);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001146 if(nCompare != 'd' - 'c') {
1147 return "ca should not equal de";
1148 }
1149
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001150 nCompare = UsefulOutBuf_Compare(&UOB, 5, 1, 2, 1);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001151 if(nCompare != 'c' - 'd') {
1152 return "de should not equal ca";
1153 }
1154
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001155 nCompare = UsefulOutBuf_Compare(&UOB, 7, 2, 8, 2);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001156 if(nCompare != 'a' - 'f') {
1157 return "fa should not equal ab";
1158 }
1159
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001160 nCompare = UsefulOutBuf_Compare(&UOB, 0, 10, 0, 10);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001161 if(nCompare != 0) {
1162 return "comparison to self failed";
1163 }
1164
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001165 nCompare = UsefulOutBuf_Compare(&UOB, 9, 1, 9, 1);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001166 if(nCompare != 0) {
1167 return "b should compare equal to b";
1168 }
1169
Laurence Lundblade534112f2025-02-26 15:12:47 -07001170 /* Tests off end */
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001171 nCompare = UsefulOutBuf_Compare(&UOB, 10, 1, 10, 1);
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001172 if(nCompare != 0) {
Laurence Lundblade534112f2025-02-26 15:12:47 -07001173 return "Comparison off the end is not equal";
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001174 }
1175
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001176 nCompare = UsefulOutBuf_Compare(&UOB, 0, 1, 100, 1);
Laurence Lundblade534112f2025-02-26 15:12:47 -07001177 if(nCompare != -1) {
1178 return "Comparison off end fail 1";
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001179 }
1180
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001181 nCompare = UsefulOutBuf_Compare(&UOB, 100, 1, 0, 1);
Laurence Lundblade534112f2025-02-26 15:12:47 -07001182 if(nCompare != 1) {
1183 return "Comparison off end fail 2";
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001184 }
1185
Laurence Lundblade534112f2025-02-26 15:12:47 -07001186 nCompare = UsefulOutBuf_Compare(&UOB, 8, 3, 0, 3);
1187 if(nCompare != 1) {
1188 return "Comparison off end fail 3";
1189 }
1190
1191 nCompare = UsefulOutBuf_Compare(&UOB, 0, 3, 8, 3);
1192 if(nCompare != -1) {
1193 return "Comparison off end fail 4";
1194 }
1195
1196 nCompare = UsefulOutBuf_Compare(&UOB, 10, 1, 5, 1);
1197 if(nCompare != 1) {
1198 return "Comparison off end fail 5";
1199 }
1200
1201 nCompare = UsefulOutBuf_Compare(&UOB, 5, 1, 10, 1);
1202 if(nCompare != -1) {
1203 return "Comparison off end fail 6";
1204 }
1205
1206 nCompare = UsefulOutBuf_Compare(&UOB, 8, 3, 0, 2);
1207 if(nCompare != 0) {
1208 return "Comparison off end fail 7";
1209 }
1210
1211 nCompare = UsefulOutBuf_Compare(&UOB, 0, 2, 8, 100);
1212 if(nCompare != 0) {
1213 return "Comparison off end fail 8";
1214 }
1215
1216 nCompare = UsefulOutBuf_Compare(&UOB, 0, 0, 0, 0);
1217 if(nCompare != 0) {
1218 return "Empty compare failed";
1219 }
1220
1221 nCompare = UsefulOutBuf_Compare(&UOB, 1, 1, 9, 3);
1222 if(nCompare != 0) {
1223 return "Unequal lengths, off end";
1224 }
1225
1226 /* Tests of unequal lengths */
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001227 nCompare = UsefulOutBuf_Compare(&UOB, 0, 3, 3, 2);
Laurence Lundblade534112f2025-02-26 15:12:47 -07001228 if(nCompare >= 0) {
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001229 return "Comparison of unequal lengths incorrect";
1230 }
1231
1232 nCompare = UsefulOutBuf_Compare(&UOB, 8, 2, 0, 3);
Laurence Lundblade534112f2025-02-26 15:12:47 -07001233 if(nCompare <= 0) {
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001234 return "Comparison of unequal lengths incorrect 2";
1235 }
1236
1237 nCompare = UsefulOutBuf_Compare(&UOB, 0, 2, 2, 3);
1238 if(nCompare != 'c' - 'a') {
Laurence Lundblade534112f2025-02-26 15:12:47 -07001239 return "Unequal lengths, unequal strings";
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001240 }
1241
1242 nCompare = UsefulOutBuf_Compare(&UOB, 1, 3, 4, 2);
1243 if(nCompare != 'd' - 'c') {
Laurence Lundblade534112f2025-02-26 15:12:47 -07001244 return "Unequal lengths, unequal strings";
Laurence Lundbladedee0d4e2024-03-03 13:46:33 -07001245 }
1246
Laurence Lundblade534112f2025-02-26 15:12:47 -07001247 nCompare = UsefulOutBuf_Compare(&UOB, 7, 0, 7, 1);
1248 if(nCompare != 1) {
1249 return "zero length unequal length compare";
1250 }
1251
1252 nCompare = UsefulOutBuf_Compare(&UOB, 0, 8, 3, 5);
1253 if(nCompare != 'd' - 'c') {
1254 return "another unequal length compare";
1255 }
1256
1257
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001258 /* Test UsefulOutBuf_Swap() */
1259
1260 UsefulOutBuf_Reset(&UOB);
1261 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1262 UsefulOutBuf_Swap(&UOB, 0, 4, 8);
1263 Out = UsefulOutBuf_OutUBuf(&UOB);
1264 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("efghabcd"))) {
1265 return "swap fail 1";
1266 }
1267
1268 UsefulOutBuf_Reset(&UOB);
1269 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1270 UsefulOutBuf_Swap(&UOB, 0, 1, 2);
1271 Out = UsefulOutBuf_OutUBuf(&UOB);
1272 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("bacdefgh"))) {
1273 return "swap fail 2";
1274 }
1275
1276 UsefulOutBuf_Reset(&UOB);
1277 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1278 UsefulOutBuf_Swap(&UOB, 0, 1, 8);
1279 Out = UsefulOutBuf_OutUBuf(&UOB);
1280 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("bcdefgha"))) {
1281 return "swap fail 3";
1282 }
1283
1284 UsefulOutBuf_Reset(&UOB);
1285 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1286 UsefulOutBuf_Swap(&UOB, 0, 3, 4);
1287 Out = UsefulOutBuf_OutUBuf(&UOB);
1288 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("dabcefgh"))) {
1289 return "swap fail 4";
1290 }
1291
1292 UsefulOutBuf_Reset(&UOB);
1293 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1294 UsefulOutBuf_Swap(&UOB, 9, 10, 11);
1295 Out = UsefulOutBuf_OutUBuf(&UOB);
1296 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("abcdefgh"))) {
1297 return "swap fail 5";
1298 }
1299
1300 UsefulOutBuf_Reset(&UOB);
1301 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1302 UsefulOutBuf_Swap(&UOB, 0, 4, 11);
1303 Out = UsefulOutBuf_OutUBuf(&UOB);
1304 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("abcdefgh"))) {
1305 return "swap fail 6";
1306 }
1307
1308 UsefulOutBuf_Reset(&UOB);
1309 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1310 UsefulOutBuf_Swap(&UOB, 9, 0, 0);
1311 Out = UsefulOutBuf_OutUBuf(&UOB);
1312 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("abcdefgh"))) {
1313 return "swap fail 7";
1314 }
1315
1316 UsefulOutBuf_Reset(&UOB);
1317 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1318 UsefulOutBuf_Swap(&UOB, 0, 0, 0);
1319 Out = UsefulOutBuf_OutUBuf(&UOB);
1320 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("abcdefgh"))) {
1321 return "swap fail 8";
1322 }
1323
1324 UsefulOutBuf_Reset(&UOB);
1325 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1326 UsefulOutBuf_Swap(&UOB, 8, 4, 0);
1327 Out = UsefulOutBuf_OutUBuf(&UOB);
1328 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("abcdefgh"))) {
1329 return "swap fail 9";
1330 }
1331
1332 UsefulOutBuf_Reset(&UOB);
1333 UsefulOutBuf_AppendString(&UOB, "abcdefgh");
1334 UsefulOutBuf_Swap(&UOB, 0, 8, 4);
1335 Out = UsefulOutBuf_OutUBuf(&UOB);
1336 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("abcdefgh"))) {
1337 return "swap fail 10";
1338 }
1339
1340
1341 /* Test for UsefulOutBuf_GetOutput() */
1342 UsefulOutBuf_Reset(&UOB);
1343 UsefulOutBuf_AppendString(&UOB, "abc");
1344 UsefulOutBuf_AppendString(&UOB, "xyz");
1345
1346 Out = UsefulOutBuf_OutUBufOffset(&UOB, 0);
1347 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("abcxyz"))) {
1348 return "GetOutput fail 1";
1349 }
1350
1351 Out = UsefulOutBuf_OutUBufOffset(&UOB, 5);
1352 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("z"))) {
1353 return "GetOutput fail 2";
1354 }
1355
1356 Out = UsefulOutBuf_OutUBufOffset(&UOB, 1);
1357 if(UsefulBuf_Compare(Out, UsefulBuf_FROM_SZ_LITERAL("bcxyz"))) {
1358 return "GetOutput fail 3";
1359 }
1360
1361 Out = UsefulOutBuf_OutUBufOffset(&UOB, 6);
1362 if(!UsefulBuf_IsNULLC(Out)) {
1363 return "GetOutput fail 4";
1364 }
1365
1366 Out = UsefulOutBuf_OutUBufOffset(&UOB, 7);
1367 if(!UsefulBuf_IsNULLC(Out)) {
1368 return "GetOutput fail 5";
1369 }
1370
Laurence Lundblade534112f2025-02-26 15:12:47 -07001371 Out = UsefulOutBuf_OutUBufOffset(&UOB_UnInitialized, 1);
1372 if(!UsefulBuf_IsNULLC(Out)) {
1373 return "GetOutput fail 7";
1374 }
1375
Laurence Lundbladed6e13022023-11-26 10:14:02 -07001376 return NULL;
1377}