blob: e729ff139ffb8555753b3341c39559c145939ca1 [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.
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
Paul Liétarc6cfa332022-07-26 19:24:01 +010060 /* Add 6 bytes to the end */
61 UsefulBufC UBC = {"hunny ", 6};
Laurence Lundblade8ece3732021-09-21 21:47:23 -070062 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
Paul Liétarc6cfa332022-07-26 19:24:01 +010072 /* Add 4 bytes to the end, by accessing the buffer directly and then advancing it */
73 UsefulBuf UB = UsefulOutBuf_GetOutPlace(pUOB);
74 if (!UsefulBuf_IsNULL(UB)) {
75 memcpy(UB.ptr, "bear", UB.len < 4 ? UB.len : 4);
76 }
77 UsefulOutBuf_Advance(pUOB, 4);
78
Laurence Lundblade8ece3732021-09-21 21:47:23 -070079Done:
80 return szReturn;
81}
82
83
84/* Basic exercise of a UsefulOutBuf
85 *
86 * Call all the main public functions.
87 *
88 * Binary compare the result to the expected.
89 *
90 * There is nothing adversarial in this test
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080091 */
Laurence Lundbladeb9702452021-03-08 21:02:57 -080092const char * UOBTest_NonAdversarial(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080093{
94 const char *szReturn = NULL;
95
Laurence Lundblade8ece3732021-09-21 21:47:23 -070096 UsefulBuf_MAKE_STACK_UB(outbuf, 50);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080097
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080098 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080099
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530100 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800101
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700102 szReturn = AddStuffToUOB(&UOB);
103 if(szReturn) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800104 goto Done;
105 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800106
Paul Liétarc6cfa332022-07-26 19:24:01 +0100107 const UsefulBufC Expected = UsefulBuf_FROM_SZ_LITERAL("heffalump unbounce bluster hunny bear");
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800108
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530109 UsefulBufC U = UsefulOutBuf_OutUBuf(&UOB);
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700110 if(UsefulBuf_IsNULLC(U) ||
111 UsefulBuf_Compare(Expected, U) ||
112 UsefulOutBuf_GetError(&UOB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800113 szReturn = "OutUBuf";
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700114 goto Done;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800115 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800116
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530117 UsefulBuf_MAKE_STACK_UB(buf, 50);
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700118 UsefulBufC Out = UsefulOutBuf_CopyOut(&UOB, buf);
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800119 if(UsefulBuf_IsNULLC(Out) || UsefulBuf_Compare(Expected, Out)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800120 szReturn = "CopyOut";
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700121 goto Done;
122 }
123
124 /* Now test the size calculation mode */
125 UsefulOutBuf_Init(&UOB, SizeCalculateUsefulBuf);
126
127 szReturn = AddStuffToUOB(&UOB);
128 if(szReturn) {
129 goto Done;
130 }
131
132 U = UsefulOutBuf_OutUBuf(&UOB);
133 if(U.len != Expected.len || U.ptr != NULL) {
134 szReturn = "size calculation failed";
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800135 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800136
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800137Done:
138 return szReturn;
139}
140
141
142/*
143 Append test utility.
144 pUOB is the buffer to append too
145 num is the amount to append
146 expected is the expected return code, 0 or 1
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800147
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800148 returns 0 if test passed
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800149
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800150 */
151static int AppendTest(UsefulOutBuf *pUOB, size_t num, int expected)
152{
153 //reset
154 UsefulOutBuf_Reset(pUOB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800155
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800156 // check status first
157 if(UsefulOutBuf_GetError(pUOB))
158 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800159
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800160 // append the bytes
161 UsefulOutBuf_AppendData(pUOB, (const uint8_t *)"bluster", num);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800162
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800163 // check error status after
164 if(UsefulOutBuf_GetError(pUOB) != expected)
165 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800166
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800167 return 0;
168}
169
170
171/*
172 Same as append, but takes a position param too
173 */
174static int InsertTest(UsefulOutBuf *pUOB, size_t num, size_t pos, int expected)
175{
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530176 // reset
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800177 UsefulOutBuf_Reset(pUOB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800178
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800179 // check
180 if(UsefulOutBuf_GetError(pUOB))
181 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800182
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800183 UsefulOutBuf_InsertData(pUOB, (const uint8_t *)"bluster", num, pos);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800184
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800185 if(UsefulOutBuf_GetError(pUOB) != expected)
186 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800187
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800188 return 0;
189}
190
191
192/*
193 Boundary conditions to test
194 - around 0
195 - around the buffer size
196 - around MAX size_t
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800197
198
Laurence Lundbladeee851742020-01-08 08:37:05 -0800199 Test these for the buffer size and the cursor, the insert amount, the
200 append amount and the insert position
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800201
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800202 */
203
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800204const char *UOBTest_BoundaryConditionsTest(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800205{
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700206 UsefulBuf_MAKE_STACK_UB(outbuf, 2);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800207
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800208 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800209
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530210 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800211
212 // append 0 byte to a 2 byte buffer --> success
213 if(AppendTest(&UOB, 0, 0))
214 return "Append 0 bytes failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800215
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800216 // append 1 byte to a 2 byte buffer --> success
217 if(AppendTest(&UOB, 1, 0))
218 return "Append of 1 byte failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800219
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800220 // append 2 byte to a 2 byte buffer --> success
221 if(AppendTest(&UOB, 2, 0))
222 return "Append to fill buffer failed";
223
224 // append 3 bytes to a 2 byte buffer --> failure
225 if(AppendTest(&UOB, 3, 1))
226 return "Overflow of buffer not caught";
227
228 // append max size_t to a 2 byte buffer --> failure
229 if(AppendTest(&UOB, SIZE_MAX, 1))
230 return "Append of SIZE_MAX error not caught";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800231
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800232 if(InsertTest(&UOB, 1, 0, 0))
233 return "Insert 1 byte at start failed";
234
235 if(InsertTest(&UOB, 2, 0, 0))
236 return "Insert 2 bytes at start failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800237
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800238 if(InsertTest(&UOB, 3, 0, 1))
239 return "Insert overflow not caught";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800240
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800241 if(InsertTest(&UOB, 1, 1, 1))
242 return "Bad insertion point not caught";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800243
244
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530245 UsefulBuf_MAKE_STACK_UB(outBuf2,10);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800246
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530247 UsefulOutBuf_Init(&UOB, outBuf2);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800248
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800249 UsefulOutBuf_Reset(&UOB);
250 // put data in the buffer
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800251 UsefulOutBuf_AppendString(&UOB, "abc123");
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800252
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800253 UsefulOutBuf_InsertString(&UOB, "xyz*&^", 0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800254
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800255 if(!UsefulOutBuf_GetError(&UOB)) {
256 return "insert with data should have failed";
257 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800258
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800259
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530260 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800261 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX -6);
262 if(UsefulOutBuf_GetError(&UOB)) {
263 return "insert in huge should have succeeded";
264 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800265
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530266 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800267 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX -5);
268 if(UsefulOutBuf_GetError(&UOB)) {
269 return "insert in huge should have succeeded";
270 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800271
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530272 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800273 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX - 4);
274 if(!UsefulOutBuf_GetError(&UOB)) {
275 return "lengths near max size";
276 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800277
Laurence Lundblade30dd0ba2019-05-26 23:37:30 +0300278 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, 100});
279 if(!UsefulOutBuf_IsBufferNULL(&UOB)) {
280 return "NULL check failed";
281 }
282
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800283 return NULL;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800284}
285
286
287
288
289
290// Test function to get size and magic number check
291
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800292const char *TestBasicSanity(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800293{
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530294 UsefulBuf_MAKE_STACK_UB(outbuf,10);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800295
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800296 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800297
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800298 // First -- make sure that the room left function returns the right amount
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530299 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800300
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530301 if(UsefulOutBuf_RoomLeft(&UOB) != 10)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800302 return "room left failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800303
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800304 if(!UsefulOutBuf_WillItFit(&UOB, 9)) {
305 return "it did not fit";
306 }
307
308 if(UsefulOutBuf_WillItFit(&UOB, 11)) {
309 return "it should have not fit";
310 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800311
312
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800313 // Next -- make sure that the magic number checking is working right
314 UOB.magic = 8888; // make magic bogus
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800315
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800316 UsefulOutBuf_AppendData(&UOB, (const uint8_t *)"bluster", 7);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800317
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700318 if(!UsefulOutBuf_GetError(&UOB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800319 return "magic corruption check failed";
Laurence Lundblade8ece3732021-09-21 21:47:23 -0700320 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800321
322
323
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800324 // Next make sure that the valid data length check is working right
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530325 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800326
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530327 UOB.data_len = UOB.UB.len+1; // make size bogus
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800328
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800329 UsefulOutBuf_AppendData(&UOB, (const uint8_t *)"bluster", 7);
330 if(!UsefulOutBuf_GetError(&UOB))
331 return "valid data check failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800332
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800333 return NULL;
334}
335
336
337
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800338const char *UBMacroConversionsTest(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800339{
340 char *szFoo = "foo";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800341
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530342 UsefulBufC Foo = UsefulBuf_FromSZ(szFoo);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800343 if(Foo.len != 3 || strncmp(Foo.ptr, szFoo, 3))
344 return "SZToUsefulBufC failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800345
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530346 UsefulBufC Too = UsefulBuf_FROM_SZ_LITERAL("Toooo");
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800347 if(Too.len != 5 || strncmp(Too.ptr, "Toooo", 5))
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530348 return "UsefulBuf_FROM_SZ_LITERAL failed";
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800349
350 uint8_t pB[] = {0x42, 0x6f, 0x6f};
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530351 UsefulBufC Boo = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pB);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800352 if(Boo.len != 3 || strncmp(Boo.ptr, "Boo", 3))
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530353 return "UsefulBuf_FROM_BYTE_ARRAY_LITERAL failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800354
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800355 char *String = "string"; // Intentionally not const
356 UsefulBuf B = (UsefulBuf){(void *)String, strlen(String)};
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530357 UsefulBufC BC = UsefulBuf_Const(B);
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800358 if(BC.len != strlen(String) || BC.ptr != String)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800359 return "UsefulBufConst failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800360
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800361 return NULL;
362}
363
364
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800365const char *UBUtilTests(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800366{
367 UsefulBuf UB = NULLUsefulBuf;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800368
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800369 if(!UsefulBuf_IsNULL(UB)){
370 return "IsNull failed";
371 }
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530372
373 if(!UsefulBuf_IsEmpty(UB)){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800374 return "IsEmpty failed";
375 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800376
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530377 if(!UsefulBuf_IsNULLOrEmpty(UB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800378 return "IsNULLOrEmpty failed";
379 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800380
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800381 const UsefulBufC UBC = UsefulBuf_Const(UB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800382
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530383 if(!UsefulBuf_IsNULLC(UBC)){
384 return "IsNull const failed";
385 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800386
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530387 if(!UsefulBuf_IsEmptyC(UBC)){
388 return "IsEmptyC failed";
389 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800390
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530391 if(!UsefulBuf_IsNULLOrEmptyC(UBC)){
392 return "IsNULLOrEmptyC failed";
393 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800394
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800395 const UsefulBuf UB2 = UsefulBuf_Unconst(UBC);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530396 if(!UsefulBuf_IsEmpty(UB2)) {
397 return "Back to UB is Empty failed";
398 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800399
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800400 UB.ptr = "x"; // just some valid pointer
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800401
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800402 if(UsefulBuf_IsNULL(UB)){
403 return "IsNull failed";
404 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800405
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530406 if(!UsefulBuf_IsEmptyC(UBC)){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800407 return "IsEmpty failed";
408 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800409
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800410 // test the Unconst.
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530411 if(UsefulBuf_Unconst(UBC).ptr != NULL) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800412 return "Unconst failed";
413 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800414
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800415 // Set 100 bytes of '+'; validated a few tests later
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530416 UsefulBuf_MAKE_STACK_UB(Temp, 100);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800417 const UsefulBufC TempC = UsefulBuf_Set(Temp, '+');
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800418
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800419 // Try to copy into a buf that is too small and see failure
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530420 UsefulBuf_MAKE_STACK_UB(Temp2, 99);
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530421 if(!UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp2, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800422 return "Copy should have failed";
423 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800424
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800425 if(UsefulBuf_IsNULLC(UsefulBuf_CopyPtr(Temp2, "xx", 2))) {
426 return "CopyPtr failed";
427 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800428
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530429 UsefulBufC xxyy = UsefulBuf_CopyOffset(Temp2, 2, UsefulBuf_FROM_SZ_LITERAL("yy"));
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800430 if(UsefulBuf_IsNULLC(xxyy)) {
431 return "CopyOffset Failed";
432 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800433
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530434 if(UsefulBuf_Compare(UsefulBuf_Head(xxyy, 3), UsefulBuf_FROM_SZ_LITERAL("xxy"))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800435 return "head failed";
436 }
437
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530438 if(UsefulBuf_Compare(UsefulBuf_Tail(xxyy, 1), UsefulBuf_FROM_SZ_LITERAL("xyy"))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800439 return "tail failed";
440 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800441
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800442 if(!UsefulBuf_IsNULLC(UsefulBuf_Head(xxyy, 5))) {
443 return "head should have failed";
444 }
445
446 if(!UsefulBuf_IsNULLC(UsefulBuf_Tail(xxyy, 5))) {
447 return "tail should have failed";
448 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -0800449
Laurence Lundblade7412f812019-01-01 18:49:36 -0800450 if(!UsefulBuf_IsNULLC(UsefulBuf_Tail(NULLUsefulBufC, 0))) {
451 return "tail of NULLUsefulBufC is not NULLUsefulBufC";
452 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -0800453
Laurence Lundblade7412f812019-01-01 18:49:36 -0800454 const UsefulBufC TailResult = UsefulBuf_Tail((UsefulBufC){NULL, 100}, 99);
455 if(TailResult.ptr != NULL || TailResult.len != 1) {
456 return "tail of NULL and length incorrect";
457 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800458
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530459 if(!UsefulBuf_IsNULLC(UsefulBuf_CopyOffset(Temp2, 100, UsefulBuf_FROM_SZ_LITERAL("yy")))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800460 return "Copy Offset should have failed";
461 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800462
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800463 // Try to copy into a NULL/empty buf and see failure
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800464 const UsefulBuf UBNull = NULLUsefulBuf;
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530465 if(!UsefulBuf_IsNULLC(UsefulBuf_Copy(UBNull, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800466 return "Copy to NULL should have failed";
467 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800468
469
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800470 // Try to set a NULL/empty buf; nothing should happen
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530471 UsefulBuf_Set(UBNull, '+'); // This will crash on failure
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800472
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800473 // Copy successfully to a buffer
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530474 UsefulBuf_MAKE_STACK_UB(Temp3, 101);
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530475 if(UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp3, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800476 return "Copy should not have failed";
477 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800478
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800479 static const uint8_t pExpected[] = {
480 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
481 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
482 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
483 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
484 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
485 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
486 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
487 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
488 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
489 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
490 };
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530491 UsefulBufC Expected = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpected);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800492 // This validates comparison for equality and the UsefulBuf_Set
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530493 if(UsefulBuf_Compare(Expected, TempC)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800494 return "Set / Copy / Compare failed";
495 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800496
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800497 // Compare two empties and expect success
498 if(UsefulBuf_Compare(NULLUsefulBufC, NULLUsefulBufC)){
499 return "Compare Empties failed";
500 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800501
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800502 // Compare with empty and expect the first to be larger
503 if(UsefulBuf_Compare(Expected, NULLUsefulBufC) <= 0){
504 return "Compare with empty failed";
505 }
506
507
508 static const uint8_t pExpectedBigger[] = {
509 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
510 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
511 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
512 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
513 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
514 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
515 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
516 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
517 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
518 '+', '+', '+', '+', '+', '+', '+', '+', '+', ',',
519 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800520 const UsefulBufC ExpectedBigger = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedBigger);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800521
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530522 // Expect -1 when the first arg is smaller
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800523 if(UsefulBuf_Compare(Expected, ExpectedBigger) >= 0){
524 return "Compare with bigger";
525 }
526
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800527
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800528 static const uint8_t pExpectedSmaller[] = {
529 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
530 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
531 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
532 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
533 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
534 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
535 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
536 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
537 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
538 '+', '+', '+', '+', '+', '+', '+', '+', '+', '*',
539 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800540 const UsefulBufC ExpectedSmaller = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedSmaller);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530541 // Expect +1 when the first arg is larger
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800542 if(UsefulBuf_Compare(Expected, ExpectedSmaller) <= 0){
543 return "Compare with smaller";
544 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800545
546
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800547 static const uint8_t pExpectedLonger[] = {
548 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
549 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
550 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
551 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
552 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
553 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
554 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
555 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
556 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
557 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+'
558 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800559 const UsefulBufC ExpectedLonger = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedLonger);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800560
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530561 // Expect -1 when the first arg is smaller
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800562 if(UsefulBuf_Compare(Expected, ExpectedLonger) >= 0){
563 return "Compare with longer";
564 }
565
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800566
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800567 static const uint8_t pExpectedShorter[] = {
568 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
569 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
570 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
571 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
572 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
573 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
574 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
575 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
576 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
577 '+', '+', '+', '+', '+', '+', '+', '+', '+',
578 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800579 const UsefulBufC ExpectedShorter = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedShorter);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800580 // Expect +1 with the first arg is larger
581 if(UsefulBuf_Compare(Expected, ExpectedShorter) <= 0){
582 return "Compare with shorter";
583 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800584
585
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530586 if(UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp, NULLUsefulBufC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800587 return "Copy null/empty failed";
588 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800589
Laurence Lundbladed5e101e2019-03-06 17:23:18 -0800590 if(UsefulBuf_IsValue(ExpectedShorter, '+') != SIZE_MAX) {
591 return "IsValue failed to match all";
592 }
593
594 if(UsefulBuf_IsValue(ExpectedShorter, '-') != 0) {
595 return "IsValue should have failed right away";
596 }
597
598 if(UsefulBuf_IsValue(NULLUsefulBufC, 0x00) != 0) {
599 return "IsValue failed on NULLUsefulBufC";
600 }
601
602 if(UsefulBuf_IsValue((UsefulBufC){(uint8_t[]){0x00}, 1}, 0x00) != SIZE_MAX) {
603 return "IsValue failed finding 0 in one byte of 0";
604 }
605
606 if(UsefulBuf_IsValue((UsefulBufC){(uint8_t[]){0x00}, 1}, 0x01) != 0) {
607 return "IsValue failed not finding 1 in one byte of 0";
608 }
609
610 if(UsefulBuf_IsValue(ExpectedSmaller, '+') != ExpectedSmaller.len -1) {
611 return "IsValue failed to find final *";
612 }
613
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800614 // Look for +++++... in +++++... and find it at the beginning
615 if(0 != UsefulBuf_FindBytes(ExpectedLonger, ExpectedShorter)){
616 return "Failed to find";
617 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800618
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800619 // look for ++* in ....++* and find it at the end
620 static const uint8_t pToFind[] = {'+', '+', '*'};
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800621 const UsefulBufC ToBeFound = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pToFind);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800622
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800623 if(97 != UsefulBuf_FindBytes(ExpectedSmaller, ToBeFound)){
624 return "Failed to find 2";
625 }
626
627 // look for ++* in ....++, and find it near the end
628 if(SIZE_MAX != UsefulBuf_FindBytes(ExpectedBigger, ToBeFound)){
629 return "Failed to not find";
630 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800631
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800632 // Look for the whole buffer in itself and succeed.
633 if(0 != UsefulBuf_FindBytes(ExpectedLonger, ExpectedLonger)){
634 return "Failed to find 3";
635 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800636
Laurence Lundbladecf41c522021-02-20 10:19:07 -0700637
638 const uint8_t pB[] = {0x01, 0x02, 0x03};
639 UsefulBufC Boo = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pB);
640 // Try to map a pointer before
641 if(UsefulBuf_PointerToOffset(Boo, pB-1) != SIZE_MAX) {
642 return "Didn't error on pointer before";
643 }
644
645 // Try to map a pointer after
646 if(UsefulBuf_PointerToOffset(Boo, pB+sizeof(pB)) != SIZE_MAX) {
647 return "Didn't error on pointer after";
648 }
649
650 // Try to map a pointer inside
651 if(UsefulBuf_PointerToOffset(Boo, pB+1) != 1) {
652 return "Incorrect pointer offset";
653 }
654
655 // Try to map a pointer at the start
656 if(UsefulBuf_PointerToOffset(Boo, pB) != 0) {
657 return "Incorrect pointer offset for start";
658 }
659
660 // Try to map a pointer at the end
661 if(UsefulBuf_PointerToOffset(Boo, pB + sizeof(pB)-1) != 2) {
662 return "Incorrect pointer offset for end";
663 }
664
665 // Try to map a pointer on a NULL UB
666 if(UsefulBuf_PointerToOffset(NULLUsefulBufC, pB ) != SIZE_MAX) {
667 return "Incorrect pointer offset for start";
668 }
669
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800670 return NULL;
671}
672
673
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800674const char * UIBTest_IntegerFormat(void)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800675{
Laurence Lundbladecf41c522021-02-20 10:19:07 -0700676 UsefulOutBuf_MakeOnStack(UOB, 100);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800677
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800678 const uint32_t u32 = 0x0A0B0C0D; // from https://en.wikipedia.org/wiki/Endianness
679 const uint64_t u64 = 1984738472938472;
680 const uint16_t u16 = 40000;
681 const uint8_t u8 = 9;
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200682#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800683 const float f = (float)314.15;
684 const double d = 2.1e10;
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200685#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800686
687
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530688 UsefulOutBuf_AppendUint32(&UOB, u32); // Also tests UsefulOutBuf_InsertUint64 and UsefulOutBuf_GetEndPosition
689 UsefulOutBuf_AppendUint64(&UOB, u64); // Also tests UsefulOutBuf_InsertUint32
690 UsefulOutBuf_AppendUint16(&UOB, u16); // Also tests UsefulOutBuf_InsertUint16
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800691 UsefulOutBuf_AppendByte(&UOB, u8);
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200692#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530693 UsefulOutBuf_AppendFloat(&UOB, f); // Also tests UsefulOutBuf_InsertFloat
694 UsefulOutBuf_AppendDouble(&UOB, d); // Also tests UsefulOutBuf_InsertDouble
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200695#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800696
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800697 const UsefulBufC O = UsefulOutBuf_OutUBuf(&UOB);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530698 if(UsefulBuf_IsNULLC(O))
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800699 return "Couldn't output integers";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800700
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800701 // from https://en.wikipedia.org/wiki/Endianness
702 const uint8_t pExpectedNetworkOrder[4] = {0x0A, 0x0B, 0x0C, 0x0D};
703 if(memcmp(O.ptr, pExpectedNetworkOrder, 4)) {
704 return "not in network order";
705 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800706
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800707 UsefulInputBuf UIB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800708
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530709 UsefulInputBuf_Init(&UIB, O);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800710
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530711 if(UsefulInputBuf_Tell(&UIB) != 0) {
712 return "UsefulInputBuf_Tell failed";
713 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800714
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800715 if(UsefulInputBuf_GetUint32(&UIB) != u32) {
716 return "u32 out then in failed";
717 }
718 if(UsefulInputBuf_GetUint64(&UIB) != u64) {
719 return "u64 out then in failed";
720 }
721 if(UsefulInputBuf_GetUint16(&UIB) != u16) {
722 return "u16 out then in failed";
723 }
724 if(UsefulInputBuf_GetByte(&UIB) != u8) {
725 return "u8 out then in failed";
726 }
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200727#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800728 if(UsefulInputBuf_GetFloat(&UIB) != f) {
729 return "float out then in failed";
730 }
731 if(UsefulInputBuf_GetDouble(&UIB) != d) {
732 return "double out then in failed";
733 }
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200734#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800735
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800736 // Reset and go again for a few more tests
737 UsefulInputBuf_Init(&UIB, O);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800738
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800739 const UsefulBufC Four = UsefulInputBuf_GetUsefulBuf(&UIB, 4);
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800740 if(UsefulBuf_IsNULLC(Four)) {
741 return "Four is NULL";
742 }
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530743 if(UsefulBuf_Compare(Four, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedNetworkOrder))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800744 return "Four compare failed";
745 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800746
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200747#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800748 if(UsefulInputBuf_BytesUnconsumed(&UIB) != 23){
749 return "Wrong number of unconsumed bytes";
750 }
751
752 if(!UsefulInputBuf_BytesAvailable(&UIB, 23)){
753 return "Wrong number of bytes available I";
754 }
755
756 if(UsefulInputBuf_BytesAvailable(&UIB, 24)){
757 return "Wrong number of bytes available II";
758 }
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200759#else /* USEFULBUF_DISABLE_ALL_FLOAT */
760 if(UsefulInputBuf_BytesUnconsumed(&UIB) != 11){
761 return "Wrong number of unconsumed bytes";
762 }
763 if(!UsefulInputBuf_BytesAvailable(&UIB, 11)){
764 return "Wrong number of bytes available I";
765 }
766
767 if(UsefulInputBuf_BytesAvailable(&UIB, 12)){
768 return "Wrong number of bytes available II";
769 }
770#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800771
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800772 UsefulInputBuf_Seek(&UIB, 0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800773
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800774 if(UsefulInputBuf_GetError(&UIB)) {
775 return "unexpected error after seek";
776 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800777
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800778 const uint8_t *pGetBytes = (const uint8_t *)UsefulInputBuf_GetBytes(&UIB, 4);
779 if(pGetBytes == NULL) {
780 return "GetBytes returns NULL";
781 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800782
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800783 if(memcmp(pGetBytes, pExpectedNetworkOrder, 4)) {
784 return "Got wrong bytes";
785 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800786
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800787 UsefulInputBuf_Seek(&UIB, 28);
788
789 if(!UsefulInputBuf_GetError(&UIB)) {
790 return "expected error after seek";
791 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800792
Laurence Lundbladecf41c522021-02-20 10:19:07 -0700793 if(UsefulInputBuf_PointerToOffset(&UIB, O.ptr) != 0) {
794 return "PointerToOffset not working";
795 }
796
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530797 return NULL;
798}
799
800
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200801#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundbladeb9702452021-03-08 21:02:57 -0800802const char *UBUTest_CopyUtil(void)
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530803{
804 if(UsefulBufUtil_CopyFloatToUint32(65536.0F) != 0x47800000) {
805 return "CopyFloatToUint32 failed";
806 }
807
808 if(UsefulBufUtil_CopyDoubleToUint64(4e-40F) != 0X37C16C2800000000ULL) {
809 return "CopyDoubleToUint64 failed";
810 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800811
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530812 if(UsefulBufUtil_CopyUint64ToDouble(0X37C16C2800000000ULL) != 4e-40F) {
813 return "CopyUint64ToDouble failed";
814 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800815
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530816 if(UsefulBufUtil_CopyUint32ToFloat(0x47800000) != 65536.0F) {
817 return "CopyUint32ToFloat failed";
818 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800819
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800820 return NULL;
821}
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200822#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800823
824
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600825const char *UBAdvanceTest(void)
826{
827 #define ADVANCE_TEST_SIZE 10
828 UsefulOutBuf_MakeOnStack(UOB, ADVANCE_TEST_SIZE);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800829
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600830 UsefulBuf Place = UsefulOutBuf_GetOutPlace(&UOB);
831 if(Place.len != 10) {
832 return "GetOutPlace wrong size";
833 }
834
835 memset(Place.ptr, 'x', Place.len/2);
836
837 UsefulOutBuf_Advance(&UOB, Place.len/2);
838
839 UsefulOutBuf_AppendByte(&UOB, 'y');
840
841 Place = UsefulOutBuf_GetOutPlace(&UOB);
842 if(Place.len != ADVANCE_TEST_SIZE/2 -1 ) {
843 return "GetOutPlace wrong size 2";
844 }
845
846 memset(Place.ptr, 'z', Place.len);
847
848 UsefulOutBuf_Advance(&UOB, Place.len);
849
850 UsefulBufC O = UsefulOutBuf_OutUBuf(&UOB);
851
852 UsefulBuf_Compare(O, UsefulBuf_FROM_SZ_LITERAL("xxxxxyzzzz"));
853
854 Place = UsefulOutBuf_GetOutPlace(&UOB);
855 if(Place.len != 0 || Place.ptr != NULL) {
856 return "GetOutPlace not null";
857 }
858
859 if(UsefulOutBuf_GetError(&UOB)) {
860 return "GetOutPlace error set";
861 }
862
863 UsefulOutBuf_Advance(&UOB, 1);
864 if(!UsefulOutBuf_GetError(&UOB)) {
865 return "Advance off end didn't set error";
866 }
867
868 return NULL;
869}