blob: 3ab3557c9e772893d097e91b1606b3e3426b6010 [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.
Laurence Lundbladeb24faef2022-04-26 11:03:08 -06003 Copyright (c) 2018-2022, Laurence Lundblade.
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +02004 Copyright (c) 2021, Arm Limited.
Laurence Lundbladed92a6162018-11-01 11:38:35 +07005 All rights reserved.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08006
Laurence Lundblade0dbc9172018-11-01 14:17:21 +07007Redistribution and use in source and binary forms, with or without
8modification, are permitted provided that the following conditions are
9met:
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.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080020
Laurence Lundblade0dbc9172018-11-01 14:17:21 +070021THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
22WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
24ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
25BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
30OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
31IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Laurence Lundbladeee851742020-01-08 08:37:05 -080032 =============================================================================*/
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.
38 * The result in the UsefulOutBuf is "heffalump unbounce bluster hunny"
39 */
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
60 /* Add 5 bytes to the end */
61 UsefulBufC UBC = {"hunny", 5};
62 UsefulOutBuf_AppendUsefulBuf(pUOB, UBC);
63
64 /* Insert 9 bytes at the beginning, slide the previous stuff right */
65 UsefulOutBuf_InsertData(pUOB, "heffalump", 9, 0);
66 UsefulOutBuf_InsertByte(pUOB, ' ', 9);
67
68 /* Put 9 bytes in at position 10 -- just after "heffalump " */
69 UsefulBufC UBC2 = {"unbounce ", 9};
70 UsefulOutBuf_InsertUsefulBuf(pUOB, UBC2, 10);
71
72Done:
73 return szReturn;
74}
75
76
77/* Basic exercise of a UsefulOutBuf
78 *
79 * Call all the main public functions.
80 *
81 * Binary compare the result to the expected.
82 *
83 * There is nothing adversarial in this test
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080084 */
Laurence Lundbladeb9702452021-03-08 21:02:57 -080085const char * UOBTest_NonAdversarial(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080086{
87 const char *szReturn = NULL;
88
Laurence Lundblade8ece3732021-09-21 21:47:23 -070089 UsefulBuf_MAKE_STACK_UB(outbuf, 50);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080090
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080091 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080092
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053093 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080094
Laurence Lundblade8ece3732021-09-21 21:47:23 -070095 szReturn = AddStuffToUOB(&UOB);
96 if(szReturn) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080097 goto Done;
98 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080099
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800100 const UsefulBufC Expected = UsefulBuf_FROM_SZ_LITERAL("heffalump unbounce bluster hunny");
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800101
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530102 UsefulBufC U = UsefulOutBuf_OutUBuf(&UOB);
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700103 if(UsefulBuf_IsNULLC(U) ||
104 UsefulBuf_Compare(Expected, U) ||
105 UsefulOutBuf_GetError(&UOB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800106 szReturn = "OutUBuf";
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700107 goto Done;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800108 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800109
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530110 UsefulBuf_MAKE_STACK_UB(buf, 50);
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700111 UsefulBufC Out = UsefulOutBuf_CopyOut(&UOB, buf);
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800112 if(UsefulBuf_IsNULLC(Out) || UsefulBuf_Compare(Expected, Out)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800113 szReturn = "CopyOut";
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700114 goto Done;
115 }
116
117 /* Now test the size calculation mode */
118 UsefulOutBuf_Init(&UOB, SizeCalculateUsefulBuf);
119
120 szReturn = AddStuffToUOB(&UOB);
121 if(szReturn) {
122 goto Done;
123 }
124
125 U = UsefulOutBuf_OutUBuf(&UOB);
126 if(U.len != Expected.len || U.ptr != NULL) {
127 szReturn = "size calculation failed";
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800128 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800129
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800130Done:
131 return szReturn;
132}
133
134
135/*
136 Append test utility.
137 pUOB is the buffer to append too
138 num is the amount to append
139 expected is the expected return code, 0 or 1
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800140
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800141 returns 0 if test passed
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800142
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800143 */
144static int AppendTest(UsefulOutBuf *pUOB, size_t num, int expected)
145{
146 //reset
147 UsefulOutBuf_Reset(pUOB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800148
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800149 // check status first
150 if(UsefulOutBuf_GetError(pUOB))
151 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800152
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800153 // append the bytes
154 UsefulOutBuf_AppendData(pUOB, (const uint8_t *)"bluster", num);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800155
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800156 // check error status after
157 if(UsefulOutBuf_GetError(pUOB) != expected)
158 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800159
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800160 return 0;
161}
162
163
164/*
165 Same as append, but takes a position param too
166 */
167static int InsertTest(UsefulOutBuf *pUOB, size_t num, size_t pos, int expected)
168{
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530169 // reset
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800170 UsefulOutBuf_Reset(pUOB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800171
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800172 // check
173 if(UsefulOutBuf_GetError(pUOB))
174 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800175
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800176 UsefulOutBuf_InsertData(pUOB, (const uint8_t *)"bluster", num, pos);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800177
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800178 if(UsefulOutBuf_GetError(pUOB) != expected)
179 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800180
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800181 return 0;
182}
183
184
185/*
186 Boundary conditions to test
187 - around 0
188 - around the buffer size
189 - around MAX size_t
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800190
191
Laurence Lundbladeee851742020-01-08 08:37:05 -0800192 Test these for the buffer size and the cursor, the insert amount, the
193 append amount and the insert position
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800194
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800195 */
196
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800197const char *UOBTest_BoundaryConditionsTest(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800198{
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700199 UsefulBuf_MAKE_STACK_UB(outbuf, 2);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800200
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800201 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800202
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530203 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800204
205 // append 0 byte to a 2 byte buffer --> success
206 if(AppendTest(&UOB, 0, 0))
207 return "Append 0 bytes failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800208
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800209 // append 1 byte to a 2 byte buffer --> success
210 if(AppendTest(&UOB, 1, 0))
211 return "Append of 1 byte failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800212
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800213 // append 2 byte to a 2 byte buffer --> success
214 if(AppendTest(&UOB, 2, 0))
215 return "Append to fill buffer failed";
216
217 // append 3 bytes to a 2 byte buffer --> failure
218 if(AppendTest(&UOB, 3, 1))
219 return "Overflow of buffer not caught";
220
221 // append max size_t to a 2 byte buffer --> failure
222 if(AppendTest(&UOB, SIZE_MAX, 1))
223 return "Append of SIZE_MAX error not caught";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800224
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800225 if(InsertTest(&UOB, 1, 0, 0))
226 return "Insert 1 byte at start failed";
227
228 if(InsertTest(&UOB, 2, 0, 0))
229 return "Insert 2 bytes at start failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800230
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800231 if(InsertTest(&UOB, 3, 0, 1))
232 return "Insert overflow not caught";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800233
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800234 if(InsertTest(&UOB, 1, 1, 1))
235 return "Bad insertion point not caught";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800236
237
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530238 UsefulBuf_MAKE_STACK_UB(outBuf2,10);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800239
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530240 UsefulOutBuf_Init(&UOB, outBuf2);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800241
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800242 UsefulOutBuf_Reset(&UOB);
243 // put data in the buffer
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800244 UsefulOutBuf_AppendString(&UOB, "abc123");
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800245
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800246 UsefulOutBuf_InsertString(&UOB, "xyz*&^", 0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800247
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800248 if(!UsefulOutBuf_GetError(&UOB)) {
249 return "insert with data should have failed";
250 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800251
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800252
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530253 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800254 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX -6);
255 if(UsefulOutBuf_GetError(&UOB)) {
256 return "insert in huge should have succeeded";
257 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800258
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530259 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800260 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX -5);
261 if(UsefulOutBuf_GetError(&UOB)) {
262 return "insert in huge should have succeeded";
263 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800264
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530265 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800266 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX - 4);
267 if(!UsefulOutBuf_GetError(&UOB)) {
268 return "lengths near max size";
269 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800270
Laurence Lundblade30dd0ba2019-05-26 23:37:30 +0300271 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, 100});
272 if(!UsefulOutBuf_IsBufferNULL(&UOB)) {
273 return "NULL check failed";
274 }
275
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800276 return NULL;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800277}
278
279
280
281
282
283// Test function to get size and magic number check
284
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800285const char *TestBasicSanity(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800286{
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530287 UsefulBuf_MAKE_STACK_UB(outbuf,10);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800288
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800289 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800290
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800291 // First -- make sure that the room left function returns the right amount
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530292 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800293
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530294 if(UsefulOutBuf_RoomLeft(&UOB) != 10)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800295 return "room left failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800296
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800297 if(!UsefulOutBuf_WillItFit(&UOB, 9)) {
298 return "it did not fit";
299 }
300
301 if(UsefulOutBuf_WillItFit(&UOB, 11)) {
302 return "it should have not fit";
303 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800304
305
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800306 // Next -- make sure that the magic number checking is working right
307 UOB.magic = 8888; // make magic bogus
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800308
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800309 UsefulOutBuf_AppendData(&UOB, (const uint8_t *)"bluster", 7);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800310
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700311 if(!UsefulOutBuf_GetError(&UOB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800312 return "magic corruption check failed";
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700313 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800314
315
316
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800317 // Next make sure that the valid data length check is working right
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530318 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800319
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530320 UOB.data_len = UOB.UB.len+1; // make size bogus
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800321
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800322 UsefulOutBuf_AppendData(&UOB, (const uint8_t *)"bluster", 7);
323 if(!UsefulOutBuf_GetError(&UOB))
324 return "valid data check failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800325
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800326 return NULL;
327}
328
329
330
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800331const char *UBMacroConversionsTest(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800332{
333 char *szFoo = "foo";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800334
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530335 UsefulBufC Foo = UsefulBuf_FromSZ(szFoo);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800336 if(Foo.len != 3 || strncmp(Foo.ptr, szFoo, 3))
337 return "SZToUsefulBufC failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800338
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530339 UsefulBufC Too = UsefulBuf_FROM_SZ_LITERAL("Toooo");
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800340 if(Too.len != 5 || strncmp(Too.ptr, "Toooo", 5))
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530341 return "UsefulBuf_FROM_SZ_LITERAL failed";
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800342
343 uint8_t pB[] = {0x42, 0x6f, 0x6f};
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530344 UsefulBufC Boo = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pB);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800345 if(Boo.len != 3 || strncmp(Boo.ptr, "Boo", 3))
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530346 return "UsefulBuf_FROM_BYTE_ARRAY_LITERAL failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800347
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800348 char *String = "string"; // Intentionally not const
349 UsefulBuf B = (UsefulBuf){(void *)String, strlen(String)};
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530350 UsefulBufC BC = UsefulBuf_Const(B);
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800351 if(BC.len != strlen(String) || BC.ptr != String)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800352 return "UsefulBufConst failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800353
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800354 return NULL;
355}
356
357
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800358const char *UBUtilTests(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800359{
360 UsefulBuf UB = NULLUsefulBuf;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800361
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800362 if(!UsefulBuf_IsNULL(UB)){
363 return "IsNull failed";
364 }
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530365
366 if(!UsefulBuf_IsEmpty(UB)){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800367 return "IsEmpty failed";
368 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800369
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530370 if(!UsefulBuf_IsNULLOrEmpty(UB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800371 return "IsNULLOrEmpty failed";
372 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800373
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800374 const UsefulBufC UBC = UsefulBuf_Const(UB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800375
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530376 if(!UsefulBuf_IsNULLC(UBC)){
377 return "IsNull const failed";
378 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800379
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530380 if(!UsefulBuf_IsEmptyC(UBC)){
381 return "IsEmptyC failed";
382 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800383
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530384 if(!UsefulBuf_IsNULLOrEmptyC(UBC)){
385 return "IsNULLOrEmptyC failed";
386 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800387
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800388 const UsefulBuf UB2 = UsefulBuf_Unconst(UBC);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530389 if(!UsefulBuf_IsEmpty(UB2)) {
390 return "Back to UB is Empty failed";
391 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800392
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800393 UB.ptr = "x"; // just some valid pointer
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800394
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800395 if(UsefulBuf_IsNULL(UB)){
396 return "IsNull failed";
397 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800398
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530399 if(!UsefulBuf_IsEmptyC(UBC)){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800400 return "IsEmpty failed";
401 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800402
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800403 // test the Unconst.
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530404 if(UsefulBuf_Unconst(UBC).ptr != NULL) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800405 return "Unconst failed";
406 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800407
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800408 // Set 100 bytes of '+'; validated a few tests later
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530409 UsefulBuf_MAKE_STACK_UB(Temp, 100);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800410 const UsefulBufC TempC = UsefulBuf_Set(Temp, '+');
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800411
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800412 // Try to copy into a buf that is too small and see failure
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530413 UsefulBuf_MAKE_STACK_UB(Temp2, 99);
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530414 if(!UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp2, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800415 return "Copy should have failed";
416 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800417
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800418 if(UsefulBuf_IsNULLC(UsefulBuf_CopyPtr(Temp2, "xx", 2))) {
419 return "CopyPtr failed";
420 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800421
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530422 UsefulBufC xxyy = UsefulBuf_CopyOffset(Temp2, 2, UsefulBuf_FROM_SZ_LITERAL("yy"));
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800423 if(UsefulBuf_IsNULLC(xxyy)) {
424 return "CopyOffset Failed";
425 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800426
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530427 if(UsefulBuf_Compare(UsefulBuf_Head(xxyy, 3), UsefulBuf_FROM_SZ_LITERAL("xxy"))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800428 return "head failed";
429 }
430
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530431 if(UsefulBuf_Compare(UsefulBuf_Tail(xxyy, 1), UsefulBuf_FROM_SZ_LITERAL("xyy"))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800432 return "tail failed";
433 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800434
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800435 if(!UsefulBuf_IsNULLC(UsefulBuf_Head(xxyy, 5))) {
436 return "head should have failed";
437 }
438
439 if(!UsefulBuf_IsNULLC(UsefulBuf_Tail(xxyy, 5))) {
440 return "tail should have failed";
441 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -0800442
Laurence Lundblade7412f812019-01-01 18:49:36 -0800443 if(!UsefulBuf_IsNULLC(UsefulBuf_Tail(NULLUsefulBufC, 0))) {
444 return "tail of NULLUsefulBufC is not NULLUsefulBufC";
445 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -0800446
Laurence Lundblade7412f812019-01-01 18:49:36 -0800447 const UsefulBufC TailResult = UsefulBuf_Tail((UsefulBufC){NULL, 100}, 99);
448 if(TailResult.ptr != NULL || TailResult.len != 1) {
449 return "tail of NULL and length incorrect";
450 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800451
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530452 if(!UsefulBuf_IsNULLC(UsefulBuf_CopyOffset(Temp2, 100, UsefulBuf_FROM_SZ_LITERAL("yy")))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800453 return "Copy Offset should have failed";
454 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800455
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800456 // Try to copy into a NULL/empty buf and see failure
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800457 const UsefulBuf UBNull = NULLUsefulBuf;
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530458 if(!UsefulBuf_IsNULLC(UsefulBuf_Copy(UBNull, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800459 return "Copy to NULL should have failed";
460 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800461
462
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800463 // Try to set a NULL/empty buf; nothing should happen
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530464 UsefulBuf_Set(UBNull, '+'); // This will crash on failure
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800465
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800466 // Copy successfully to a buffer
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530467 UsefulBuf_MAKE_STACK_UB(Temp3, 101);
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530468 if(UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp3, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800469 return "Copy should not have failed";
470 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800471
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800472 static const uint8_t pExpected[] = {
473 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
474 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
475 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
476 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
477 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
478 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
479 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
480 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
481 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
482 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
483 };
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530484 UsefulBufC Expected = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpected);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800485 // This validates comparison for equality and the UsefulBuf_Set
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530486 if(UsefulBuf_Compare(Expected, TempC)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800487 return "Set / Copy / Compare failed";
488 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800489
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800490 // Compare two empties and expect success
491 if(UsefulBuf_Compare(NULLUsefulBufC, NULLUsefulBufC)){
492 return "Compare Empties failed";
493 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800494
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800495 // Compare with empty and expect the first to be larger
496 if(UsefulBuf_Compare(Expected, NULLUsefulBufC) <= 0){
497 return "Compare with empty failed";
498 }
499
500
501 static const uint8_t pExpectedBigger[] = {
502 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
503 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
504 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
505 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
506 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
507 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
508 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
509 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
510 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
511 '+', '+', '+', '+', '+', '+', '+', '+', '+', ',',
512 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800513 const UsefulBufC ExpectedBigger = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedBigger);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800514
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530515 // Expect -1 when the first arg is smaller
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800516 if(UsefulBuf_Compare(Expected, ExpectedBigger) >= 0){
517 return "Compare with bigger";
518 }
519
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800520
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800521 static const uint8_t pExpectedSmaller[] = {
522 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
523 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
524 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
525 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
526 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
527 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
528 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
529 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
530 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
531 '+', '+', '+', '+', '+', '+', '+', '+', '+', '*',
532 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800533 const UsefulBufC ExpectedSmaller = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedSmaller);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530534 // Expect +1 when the first arg is larger
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800535 if(UsefulBuf_Compare(Expected, ExpectedSmaller) <= 0){
536 return "Compare with smaller";
537 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800538
539
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800540 static const uint8_t pExpectedLonger[] = {
541 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
542 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
543 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
544 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
545 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
546 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
547 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
548 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
549 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
550 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+'
551 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800552 const UsefulBufC ExpectedLonger = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedLonger);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800553
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530554 // Expect -1 when the first arg is smaller
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800555 if(UsefulBuf_Compare(Expected, ExpectedLonger) >= 0){
556 return "Compare with longer";
557 }
558
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800559
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800560 static const uint8_t pExpectedShorter[] = {
561 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
562 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
563 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
564 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
565 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
566 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
567 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
568 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
569 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
570 '+', '+', '+', '+', '+', '+', '+', '+', '+',
571 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800572 const UsefulBufC ExpectedShorter = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedShorter);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800573 // Expect +1 with the first arg is larger
574 if(UsefulBuf_Compare(Expected, ExpectedShorter) <= 0){
575 return "Compare with shorter";
576 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800577
578
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530579 if(UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp, NULLUsefulBufC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800580 return "Copy null/empty failed";
581 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800582
Laurence Lundbladed5e101e2019-03-06 17:23:18 -0800583 if(UsefulBuf_IsValue(ExpectedShorter, '+') != SIZE_MAX) {
584 return "IsValue failed to match all";
585 }
586
587 if(UsefulBuf_IsValue(ExpectedShorter, '-') != 0) {
588 return "IsValue should have failed right away";
589 }
590
591 if(UsefulBuf_IsValue(NULLUsefulBufC, 0x00) != 0) {
592 return "IsValue failed on NULLUsefulBufC";
593 }
594
595 if(UsefulBuf_IsValue((UsefulBufC){(uint8_t[]){0x00}, 1}, 0x00) != SIZE_MAX) {
596 return "IsValue failed finding 0 in one byte of 0";
597 }
598
599 if(UsefulBuf_IsValue((UsefulBufC){(uint8_t[]){0x00}, 1}, 0x01) != 0) {
600 return "IsValue failed not finding 1 in one byte of 0";
601 }
602
603 if(UsefulBuf_IsValue(ExpectedSmaller, '+') != ExpectedSmaller.len -1) {
604 return "IsValue failed to find final *";
605 }
606
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800607 // Look for +++++... in +++++... and find it at the beginning
608 if(0 != UsefulBuf_FindBytes(ExpectedLonger, ExpectedShorter)){
609 return "Failed to find";
610 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800611
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800612 // look for ++* in ....++* and find it at the end
613 static const uint8_t pToFind[] = {'+', '+', '*'};
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800614 const UsefulBufC ToBeFound = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pToFind);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800615
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800616 if(97 != UsefulBuf_FindBytes(ExpectedSmaller, ToBeFound)){
617 return "Failed to find 2";
618 }
619
620 // look for ++* in ....++, and find it near the end
621 if(SIZE_MAX != UsefulBuf_FindBytes(ExpectedBigger, ToBeFound)){
622 return "Failed to not find";
623 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800624
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800625 // Look for the whole buffer in itself and succeed.
626 if(0 != UsefulBuf_FindBytes(ExpectedLonger, ExpectedLonger)){
627 return "Failed to find 3";
628 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800629
Laurence Lundbladecf41c522021-02-20 10:19:07 -0700630
631 const uint8_t pB[] = {0x01, 0x02, 0x03};
632 UsefulBufC Boo = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pB);
633 // Try to map a pointer before
634 if(UsefulBuf_PointerToOffset(Boo, pB-1) != SIZE_MAX) {
635 return "Didn't error on pointer before";
636 }
637
638 // Try to map a pointer after
639 if(UsefulBuf_PointerToOffset(Boo, pB+sizeof(pB)) != SIZE_MAX) {
640 return "Didn't error on pointer after";
641 }
642
643 // Try to map a pointer inside
644 if(UsefulBuf_PointerToOffset(Boo, pB+1) != 1) {
645 return "Incorrect pointer offset";
646 }
647
648 // Try to map a pointer at the start
649 if(UsefulBuf_PointerToOffset(Boo, pB) != 0) {
650 return "Incorrect pointer offset for start";
651 }
652
653 // Try to map a pointer at the end
654 if(UsefulBuf_PointerToOffset(Boo, pB + sizeof(pB)-1) != 2) {
655 return "Incorrect pointer offset for end";
656 }
657
658 // Try to map a pointer on a NULL UB
659 if(UsefulBuf_PointerToOffset(NULLUsefulBufC, pB ) != SIZE_MAX) {
660 return "Incorrect pointer offset for start";
661 }
662
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800663 return NULL;
664}
665
666
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800667const char * UIBTest_IntegerFormat(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800668{
Laurence Lundbladecf41c522021-02-20 10:19:07 -0700669 UsefulOutBuf_MakeOnStack(UOB, 100);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800670
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800671 const uint32_t u32 = 0x0A0B0C0D; // from https://en.wikipedia.org/wiki/Endianness
672 const uint64_t u64 = 1984738472938472;
673 const uint16_t u16 = 40000;
674 const uint8_t u8 = 9;
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200675#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800676 const float f = (float)314.15;
677 const double d = 2.1e10;
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200678#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800679
680
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530681 UsefulOutBuf_AppendUint32(&UOB, u32); // Also tests UsefulOutBuf_InsertUint64 and UsefulOutBuf_GetEndPosition
682 UsefulOutBuf_AppendUint64(&UOB, u64); // Also tests UsefulOutBuf_InsertUint32
683 UsefulOutBuf_AppendUint16(&UOB, u16); // Also tests UsefulOutBuf_InsertUint16
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800684 UsefulOutBuf_AppendByte(&UOB, u8);
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200685#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530686 UsefulOutBuf_AppendFloat(&UOB, f); // Also tests UsefulOutBuf_InsertFloat
687 UsefulOutBuf_AppendDouble(&UOB, d); // Also tests UsefulOutBuf_InsertDouble
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200688#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800689
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800690 const UsefulBufC O = UsefulOutBuf_OutUBuf(&UOB);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530691 if(UsefulBuf_IsNULLC(O))
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800692 return "Couldn't output integers";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800693
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800694 // from https://en.wikipedia.org/wiki/Endianness
695 const uint8_t pExpectedNetworkOrder[4] = {0x0A, 0x0B, 0x0C, 0x0D};
696 if(memcmp(O.ptr, pExpectedNetworkOrder, 4)) {
697 return "not in network order";
698 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800699
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800700 UsefulInputBuf UIB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800701
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530702 UsefulInputBuf_Init(&UIB, O);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800703
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530704 if(UsefulInputBuf_Tell(&UIB) != 0) {
705 return "UsefulInputBuf_Tell failed";
706 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800707
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800708 if(UsefulInputBuf_GetUint32(&UIB) != u32) {
709 return "u32 out then in failed";
710 }
711 if(UsefulInputBuf_GetUint64(&UIB) != u64) {
712 return "u64 out then in failed";
713 }
714 if(UsefulInputBuf_GetUint16(&UIB) != u16) {
715 return "u16 out then in failed";
716 }
717 if(UsefulInputBuf_GetByte(&UIB) != u8) {
718 return "u8 out then in failed";
719 }
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200720#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800721 if(UsefulInputBuf_GetFloat(&UIB) != f) {
722 return "float out then in failed";
723 }
724 if(UsefulInputBuf_GetDouble(&UIB) != d) {
725 return "double out then in failed";
726 }
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200727#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800728
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800729 // Reset and go again for a few more tests
730 UsefulInputBuf_Init(&UIB, O);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800731
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800732 const UsefulBufC Four = UsefulInputBuf_GetUsefulBuf(&UIB, 4);
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800733 if(UsefulBuf_IsNULLC(Four)) {
734 return "Four is NULL";
735 }
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530736 if(UsefulBuf_Compare(Four, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedNetworkOrder))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800737 return "Four compare failed";
738 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800739
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200740#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800741 if(UsefulInputBuf_BytesUnconsumed(&UIB) != 23){
742 return "Wrong number of unconsumed bytes";
743 }
744
745 if(!UsefulInputBuf_BytesAvailable(&UIB, 23)){
746 return "Wrong number of bytes available I";
747 }
748
749 if(UsefulInputBuf_BytesAvailable(&UIB, 24)){
750 return "Wrong number of bytes available II";
751 }
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200752#else /* USEFULBUF_DISABLE_ALL_FLOAT */
753 if(UsefulInputBuf_BytesUnconsumed(&UIB) != 11){
754 return "Wrong number of unconsumed bytes";
755 }
756 if(!UsefulInputBuf_BytesAvailable(&UIB, 11)){
757 return "Wrong number of bytes available I";
758 }
759
760 if(UsefulInputBuf_BytesAvailable(&UIB, 12)){
761 return "Wrong number of bytes available II";
762 }
763#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800764
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800765 UsefulInputBuf_Seek(&UIB, 0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800766
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800767 if(UsefulInputBuf_GetError(&UIB)) {
768 return "unexpected error after seek";
769 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800770
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800771 const uint8_t *pGetBytes = (const uint8_t *)UsefulInputBuf_GetBytes(&UIB, 4);
772 if(pGetBytes == NULL) {
773 return "GetBytes returns NULL";
774 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800775
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800776 if(memcmp(pGetBytes, pExpectedNetworkOrder, 4)) {
777 return "Got wrong bytes";
778 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800779
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800780 UsefulInputBuf_Seek(&UIB, 28);
781
782 if(!UsefulInputBuf_GetError(&UIB)) {
783 return "expected error after seek";
784 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800785
Laurence Lundbladecf41c522021-02-20 10:19:07 -0700786 if(UsefulInputBuf_PointerToOffset(&UIB, O.ptr) != 0) {
787 return "PointerToOffset not working";
788 }
789
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530790 return NULL;
791}
792
793
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200794#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800795const char *UBUTest_CopyUtil(void)
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530796{
797 if(UsefulBufUtil_CopyFloatToUint32(65536.0F) != 0x47800000) {
798 return "CopyFloatToUint32 failed";
799 }
800
801 if(UsefulBufUtil_CopyDoubleToUint64(4e-40F) != 0X37C16C2800000000ULL) {
802 return "CopyDoubleToUint64 failed";
803 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800804
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530805 if(UsefulBufUtil_CopyUint64ToDouble(0X37C16C2800000000ULL) != 4e-40F) {
806 return "CopyUint64ToDouble failed";
807 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800808
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530809 if(UsefulBufUtil_CopyUint32ToFloat(0x47800000) != 65536.0F) {
810 return "CopyUint32ToFloat failed";
811 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800812
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800813 return NULL;
814}
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200815#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800816
817
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600818const char *UBAdvanceTest(void)
819{
820 #define ADVANCE_TEST_SIZE 10
821 UsefulOutBuf_MakeOnStack(UOB, ADVANCE_TEST_SIZE);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800822
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600823 UsefulBuf Place = UsefulOutBuf_GetOutPlace(&UOB);
824 if(Place.len != 10) {
825 return "GetOutPlace wrong size";
826 }
827
828 memset(Place.ptr, 'x', Place.len/2);
829
830 UsefulOutBuf_Advance(&UOB, Place.len/2);
831
832 UsefulOutBuf_AppendByte(&UOB, 'y');
833
834 Place = UsefulOutBuf_GetOutPlace(&UOB);
835 if(Place.len != ADVANCE_TEST_SIZE/2 -1 ) {
836 return "GetOutPlace wrong size 2";
837 }
838
839 memset(Place.ptr, 'z', Place.len);
840
841 UsefulOutBuf_Advance(&UOB, Place.len);
842
843 UsefulBufC O = UsefulOutBuf_OutUBuf(&UOB);
844
845 UsefulBuf_Compare(O, UsefulBuf_FROM_SZ_LITERAL("xxxxxyzzzz"));
846
847 Place = UsefulOutBuf_GetOutPlace(&UOB);
848 if(Place.len != 0 || Place.ptr != NULL) {
849 return "GetOutPlace not null";
850 }
851
852 if(UsefulOutBuf_GetError(&UOB)) {
853 return "GetOutPlace error set";
854 }
855
856 UsefulOutBuf_Advance(&UOB, 1);
857 if(!UsefulOutBuf_GetError(&UOB)) {
858 return "Advance off end didn't set error";
859 }
860
861 return NULL;
862}