blob: 388f8cfd7e6edc30ab5849b31bc3db66cbecac7a [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 Lundblade6d926af2019-01-01 19:01:43 -08003 Copyright (c) 2018-2019, Laurence Lundblade.
Laurence Lundbladed92a6162018-11-01 11:38:35 +07004 All rights reserved.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08005
Laurence Lundblade0dbc9172018-11-01 14:17:21 +07006Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are
8met:
9 * Redistributions of source code must retain the above copyright
10 notice, this list of conditions and the following disclaimer.
11 * Redistributions in binary form must reproduce the above
12 copyright notice, this list of conditions and the following
13 disclaimer in the documentation and/or other materials provided
14 with the distribution.
15 * Neither the name of The Linux Foundation nor the names of its
16 contributors, nor the name "Laurence Lundblade" may be used to
17 endorse or promote products derived from this software without
18 specific prior written permission.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080019
Laurence Lundblade0dbc9172018-11-01 14:17:21 +070020THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
21WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
22MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
23ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
24BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
27BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
29OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
30IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053031 ==============================================================================*/
32
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080033#include "UsefulBuf.h"
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080034
35
36/* Basic exercise...
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080037
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080038 Call all the main public functions.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080039
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080040 Binary compare the result to the expected.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080041
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080042 There is nothing adversarial in this test
43 */
Laurence Lundblade7566b9f2018-10-12 09:13:32 +080044const char * UOBTest_NonAdversarial()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080045{
46 const char *szReturn = NULL;
47
Laurence Lundblade4fe9f312018-10-22 10:22:39 +053048 UsefulBuf_MAKE_STACK_UB(outbuf,50);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080049
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080050 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080051
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053052 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080053
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080054 if(!UsefulOutBuf_AtStart(&UOB)) {
55 szReturn = "Not at start";
56 goto Done;
57 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080058
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080059 // Put 7 bytes at beginning of buf
60 UsefulOutBuf_AppendData(&UOB, "bluster", 7);
61
62 if(UsefulOutBuf_AtStart(&UOB)) {
63 szReturn = "At start";
64 goto Done;
65 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080066
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080067 // add a space to end
68 UsefulOutBuf_AppendByte(&UOB, ' ');
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080069
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080070 // Add 5 bytes to the end
71 UsefulBufC UBC = {"hunny", 5};
72 UsefulOutBuf_AppendUsefulBuf(&UOB, UBC);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080073
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080074 // Insert 9 bytes at the beginning, slide the previous stuff right
75 UsefulOutBuf_InsertData(&UOB, "heffalump", 9, 0);
76 UsefulOutBuf_InsertByte(&UOB, ' ', 9);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080077
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080078 // Put 9 bytes in at position 10 -- just after "heffalump "
79 UsefulBufC UBC2 = {"unbounce ", 9};
80 UsefulOutBuf_InsertUsefulBuf(&UOB, UBC2, 10);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080081
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080082 // Make it a null terminated string (because all the appends and inserts above not strcpy !)
83 UsefulOutBuf_AppendByte(&UOB, '\0');
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080084
85
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053086 UsefulBufC U = UsefulOutBuf_OutUBuf(&UOB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080087
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080088 const char *expected = "heffalump unbounce bluster hunny";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080089
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053090 if(UsefulBuf_IsNULLC(U) || U.len-1 != strlen(expected) || strcmp(expected, U.ptr) || UsefulOutBuf_GetError(&UOB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080091 szReturn = "OutUBuf";
92 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080093
Laurence Lundblade4fe9f312018-10-22 10:22:39 +053094 UsefulBuf_MAKE_STACK_UB(buf, 50);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053095 UsefulBufC Out = UsefulOutBuf_CopyOut(&UOB, buf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080096
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053097 if(UsefulBuf_IsNULLC(Out) || Out.len-1 != strlen(expected) || strcmp(expected, Out.ptr)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080098 szReturn = "CopyOut";
99 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800100
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800101Done:
102 return szReturn;
103}
104
105
106/*
107 Append test utility.
108 pUOB is the buffer to append too
109 num is the amount to append
110 expected is the expected return code, 0 or 1
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800111
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800112 returns 0 if test passed
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800113
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800114 */
115static int AppendTest(UsefulOutBuf *pUOB, size_t num, int expected)
116{
117 //reset
118 UsefulOutBuf_Reset(pUOB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800119
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800120 // check status first
121 if(UsefulOutBuf_GetError(pUOB))
122 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800123
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800124 // append the bytes
125 UsefulOutBuf_AppendData(pUOB, (const uint8_t *)"bluster", num);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800126
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800127 // check error status after
128 if(UsefulOutBuf_GetError(pUOB) != expected)
129 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800130
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800131 return 0;
132}
133
134
135/*
136 Same as append, but takes a position param too
137 */
138static int InsertTest(UsefulOutBuf *pUOB, size_t num, size_t pos, int expected)
139{
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530140 // reset
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800141 UsefulOutBuf_Reset(pUOB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800142
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800143 // check
144 if(UsefulOutBuf_GetError(pUOB))
145 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800146
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800147 UsefulOutBuf_InsertData(pUOB, (const uint8_t *)"bluster", num, pos);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800148
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800149 if(UsefulOutBuf_GetError(pUOB) != expected)
150 return 1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800151
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800152 return 0;
153}
154
155
156/*
157 Boundary conditions to test
158 - around 0
159 - around the buffer size
160 - around MAX size_t
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800161
162
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800163 Test these for the buffer size and the cursor, the insert amount, the append amount and the insert position
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800164
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800165 */
166
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800167const char *UOBTest_BoundaryConditionsTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800168{
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530169 UsefulBuf_MAKE_STACK_UB(outbuf,2);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800170
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800171 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800172
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530173 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800174
175 // append 0 byte to a 2 byte buffer --> success
176 if(AppendTest(&UOB, 0, 0))
177 return "Append 0 bytes failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800178
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800179 // append 1 byte to a 2 byte buffer --> success
180 if(AppendTest(&UOB, 1, 0))
181 return "Append of 1 byte failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800182
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800183 // append 2 byte to a 2 byte buffer --> success
184 if(AppendTest(&UOB, 2, 0))
185 return "Append to fill buffer failed";
186
187 // append 3 bytes to a 2 byte buffer --> failure
188 if(AppendTest(&UOB, 3, 1))
189 return "Overflow of buffer not caught";
190
191 // append max size_t to a 2 byte buffer --> failure
192 if(AppendTest(&UOB, SIZE_MAX, 1))
193 return "Append of SIZE_MAX error not caught";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800194
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800195 if(InsertTest(&UOB, 1, 0, 0))
196 return "Insert 1 byte at start failed";
197
198 if(InsertTest(&UOB, 2, 0, 0))
199 return "Insert 2 bytes at start failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800200
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800201 if(InsertTest(&UOB, 3, 0, 1))
202 return "Insert overflow not caught";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800203
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800204 if(InsertTest(&UOB, 1, 1, 1))
205 return "Bad insertion point not caught";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800206
207
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530208 UsefulBuf_MAKE_STACK_UB(outBuf2,10);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800209
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530210 UsefulOutBuf_Init(&UOB, outBuf2);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800211
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800212 UsefulOutBuf_Reset(&UOB);
213 // put data in the buffer
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800214 UsefulOutBuf_AppendString(&UOB, "abc123");
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800215
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800216 UsefulOutBuf_InsertString(&UOB, "xyz*&^", 0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800217
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800218 if(!UsefulOutBuf_GetError(&UOB)) {
219 return "insert with data should have failed";
220 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800221
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800222
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530223 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800224 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX -6);
225 if(UsefulOutBuf_GetError(&UOB)) {
226 return "insert in huge should have succeeded";
227 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800228
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530229 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800230 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX -5);
231 if(UsefulOutBuf_GetError(&UOB)) {
232 return "insert in huge should have succeeded";
233 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800234
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530235 UsefulOutBuf_Init(&UOB, (UsefulBuf){NULL, SIZE_MAX - 5});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800236 UsefulOutBuf_AppendData(&UOB, "123456789", SIZE_MAX - 4);
237 if(!UsefulOutBuf_GetError(&UOB)) {
238 return "lengths near max size";
239 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800240
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800241 return NULL;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800242}
243
244
245
246
247
248// Test function to get size and magic number check
249
250const char *TestBasicSanity()
251{
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530252 UsefulBuf_MAKE_STACK_UB(outbuf,10);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800253
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800254 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800255
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800256 // First -- make sure that the room left function returns the right amount
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530257 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800258
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530259 if(UsefulOutBuf_RoomLeft(&UOB) != 10)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800260 return "room left failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800261
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800262 if(!UsefulOutBuf_WillItFit(&UOB, 9)) {
263 return "it did not fit";
264 }
265
266 if(UsefulOutBuf_WillItFit(&UOB, 11)) {
267 return "it should have not fit";
268 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800269
270
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800271 // Next -- make sure that the magic number checking is working right
272 UOB.magic = 8888; // make magic bogus
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800273
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800274 UsefulOutBuf_AppendData(&UOB, (const uint8_t *)"bluster", 7);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800275
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800276 if(!UsefulOutBuf_GetError(&UOB))
277 return "magic corruption check failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800278
279
280
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800281 // Next make sure that the valid data length check is working right
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530282 UsefulOutBuf_Init(&UOB, outbuf);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800283
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530284 UOB.data_len = UOB.UB.len+1; // make size bogus
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800285
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800286 UsefulOutBuf_AppendData(&UOB, (const uint8_t *)"bluster", 7);
287 if(!UsefulOutBuf_GetError(&UOB))
288 return "valid data check failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800289
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800290 return NULL;
291}
292
293
294
295const char *UBMacroConversionsTest()
296{
297 char *szFoo = "foo";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800298
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530299 UsefulBufC Foo = UsefulBuf_FromSZ(szFoo);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800300 if(Foo.len != 3 || strncmp(Foo.ptr, szFoo, 3))
301 return "SZToUsefulBufC failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800302
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530303 UsefulBufC Too = UsefulBuf_FROM_SZ_LITERAL("Toooo");
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800304 if(Too.len != 5 || strncmp(Too.ptr, "Toooo", 5))
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530305 return "UsefulBuf_FROM_SZ_LITERAL failed";
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800306
307 uint8_t pB[] = {0x42, 0x6f, 0x6f};
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530308 UsefulBufC Boo = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pB);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800309 if(Boo.len != 3 || strncmp(Boo.ptr, "Boo", 3))
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530310 return "UsefulBuf_FROM_BYTE_ARRAY_LITERAL failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800311
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800312 char *sz = "not const"; // some data for the test
313 UsefulBuf B = (UsefulBuf){sz, sizeof(sz)};
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530314 UsefulBufC BC = UsefulBuf_Const(B);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800315 if(BC.len != sizeof(sz) || BC.ptr != sz)
316 return "UsefulBufConst failed";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800317
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800318 return NULL;
319}
320
321
322const char *UBUtilTests()
323{
324 UsefulBuf UB = NULLUsefulBuf;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800325
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800326 if(!UsefulBuf_IsNULL(UB)){
327 return "IsNull failed";
328 }
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530329
330 if(!UsefulBuf_IsEmpty(UB)){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800331 return "IsEmpty failed";
332 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800333
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530334 if(!UsefulBuf_IsNULLOrEmpty(UB)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800335 return "IsNULLOrEmpty failed";
336 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800337
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800338 const UsefulBufC UBC = UsefulBuf_Const(UB);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800339
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530340 if(!UsefulBuf_IsNULLC(UBC)){
341 return "IsNull const failed";
342 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800343
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530344 if(!UsefulBuf_IsEmptyC(UBC)){
345 return "IsEmptyC failed";
346 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800347
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530348 if(!UsefulBuf_IsNULLOrEmptyC(UBC)){
349 return "IsNULLOrEmptyC failed";
350 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800351
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800352 const UsefulBuf UB2 = UsefulBuf_Unconst(UBC);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530353 if(!UsefulBuf_IsEmpty(UB2)) {
354 return "Back to UB is Empty failed";
355 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800356
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800357 UB.ptr = "x"; // just some valid pointer
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800358
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800359 if(UsefulBuf_IsNULL(UB)){
360 return "IsNull failed";
361 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800362
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530363 if(!UsefulBuf_IsEmptyC(UBC)){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800364 return "IsEmpty failed";
365 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800366
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800367 // test the Unconst.
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530368 if(UsefulBuf_Unconst(UBC).ptr != NULL) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800369 return "Unconst failed";
370 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800371
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800372 // Set 100 bytes of '+'; validated a few tests later
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530373 UsefulBuf_MAKE_STACK_UB(Temp, 100);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800374 const UsefulBufC TempC = UsefulBuf_Set(Temp, '+');
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800375
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800376 // Try to copy into a buf that is too small and see failure
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530377 UsefulBuf_MAKE_STACK_UB(Temp2, 99);
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530378 if(!UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp2, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800379 return "Copy should have failed";
380 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800381
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800382 if(UsefulBuf_IsNULLC(UsefulBuf_CopyPtr(Temp2, "xx", 2))) {
383 return "CopyPtr failed";
384 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800385
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530386 UsefulBufC xxyy = UsefulBuf_CopyOffset(Temp2, 2, UsefulBuf_FROM_SZ_LITERAL("yy"));
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800387 if(UsefulBuf_IsNULLC(xxyy)) {
388 return "CopyOffset Failed";
389 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800390
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530391 if(UsefulBuf_Compare(UsefulBuf_Head(xxyy, 3), UsefulBuf_FROM_SZ_LITERAL("xxy"))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800392 return "head failed";
393 }
394
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530395 if(UsefulBuf_Compare(UsefulBuf_Tail(xxyy, 1), UsefulBuf_FROM_SZ_LITERAL("xyy"))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800396 return "tail failed";
397 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800398
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800399 if(!UsefulBuf_IsNULLC(UsefulBuf_Head(xxyy, 5))) {
400 return "head should have failed";
401 }
402
403 if(!UsefulBuf_IsNULLC(UsefulBuf_Tail(xxyy, 5))) {
404 return "tail should have failed";
405 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -0800406
Laurence Lundblade7412f812019-01-01 18:49:36 -0800407 if(!UsefulBuf_IsNULLC(UsefulBuf_Tail(NULLUsefulBufC, 0))) {
408 return "tail of NULLUsefulBufC is not NULLUsefulBufC";
409 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -0800410
Laurence Lundblade7412f812019-01-01 18:49:36 -0800411 const UsefulBufC TailResult = UsefulBuf_Tail((UsefulBufC){NULL, 100}, 99);
412 if(TailResult.ptr != NULL || TailResult.len != 1) {
413 return "tail of NULL and length incorrect";
414 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800415
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530416 if(!UsefulBuf_IsNULLC(UsefulBuf_CopyOffset(Temp2, 100, UsefulBuf_FROM_SZ_LITERAL("yy")))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800417 return "Copy Offset should have failed";
418 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800419
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800420 // Try to copy into a NULL/empty buf and see failure
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800421 const UsefulBuf UBNull = NULLUsefulBuf;
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530422 if(!UsefulBuf_IsNULLC(UsefulBuf_Copy(UBNull, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800423 return "Copy to NULL should have failed";
424 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800425
426
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800427 // Try to set a NULL/empty buf; nothing should happen
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530428 UsefulBuf_Set(UBNull, '+'); // This will crash on failure
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800429
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800430 // Copy successfully to a buffer
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530431 UsefulBuf_MAKE_STACK_UB(Temp3, 101);
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530432 if(UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp3, TempC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800433 return "Copy should not have failed";
434 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800435
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800436 static const uint8_t pExpected[] = {
437 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
438 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
439 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
440 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
441 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
442 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
443 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
444 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
445 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
446 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
447 };
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530448 UsefulBufC Expected = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpected);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800449 // This validates comparison for equality and the UsefulBuf_Set
Laurence Lundblade05ec57b2018-10-21 01:50:03 +0530450 if(UsefulBuf_Compare(Expected, TempC)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800451 return "Set / Copy / Compare failed";
452 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800453
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800454 // Compare two empties and expect success
455 if(UsefulBuf_Compare(NULLUsefulBufC, NULLUsefulBufC)){
456 return "Compare Empties failed";
457 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800458
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800459 // Compare with empty and expect the first to be larger
460 if(UsefulBuf_Compare(Expected, NULLUsefulBufC) <= 0){
461 return "Compare with empty failed";
462 }
463
464
465 static const uint8_t pExpectedBigger[] = {
466 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
467 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
468 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
469 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
470 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
471 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
472 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
473 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
474 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
475 '+', '+', '+', '+', '+', '+', '+', '+', '+', ',',
476 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800477 const UsefulBufC ExpectedBigger = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedBigger);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800478
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530479 // Expect -1 when the first arg is smaller
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800480 if(UsefulBuf_Compare(Expected, ExpectedBigger) >= 0){
481 return "Compare with bigger";
482 }
483
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800484
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800485 static const uint8_t pExpectedSmaller[] = {
486 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
487 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
488 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
489 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
490 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
491 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
492 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
493 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
494 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
495 '+', '+', '+', '+', '+', '+', '+', '+', '+', '*',
496 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800497 const UsefulBufC ExpectedSmaller = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedSmaller);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530498 // Expect +1 when the first arg is larger
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800499 if(UsefulBuf_Compare(Expected, ExpectedSmaller) <= 0){
500 return "Compare with smaller";
501 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800502
503
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800504 static const uint8_t pExpectedLonger[] = {
505 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
506 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
507 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
508 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
509 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
510 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
511 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
512 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
513 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
514 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+'
515 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800516 const UsefulBufC ExpectedLonger = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedLonger);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800517
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530518 // Expect -1 when the first arg is smaller
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800519 if(UsefulBuf_Compare(Expected, ExpectedLonger) >= 0){
520 return "Compare with longer";
521 }
522
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800523
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800524 static const uint8_t pExpectedShorter[] = {
525 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
526 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
527 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
528 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
529 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
530 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
531 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
532 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
533 '+', '+', '+', '+', '+', '+', '+', '+', '+', '+',
534 '+', '+', '+', '+', '+', '+', '+', '+', '+',
535 };
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800536 const UsefulBufC ExpectedShorter = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedShorter);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800537 // Expect +1 with the first arg is larger
538 if(UsefulBuf_Compare(Expected, ExpectedShorter) <= 0){
539 return "Compare with shorter";
540 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800541
542
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530543 if(UsefulBuf_IsNULLC(UsefulBuf_Copy(Temp, NULLUsefulBufC))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800544 return "Copy null/empty failed";
545 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800546
Laurence Lundbladed5e101e2019-03-06 17:23:18 -0800547 if(UsefulBuf_IsValue(ExpectedShorter, '+') != SIZE_MAX) {
548 return "IsValue failed to match all";
549 }
550
551 if(UsefulBuf_IsValue(ExpectedShorter, '-') != 0) {
552 return "IsValue should have failed right away";
553 }
554
555 if(UsefulBuf_IsValue(NULLUsefulBufC, 0x00) != 0) {
556 return "IsValue failed on NULLUsefulBufC";
557 }
558
559 if(UsefulBuf_IsValue((UsefulBufC){(uint8_t[]){0x00}, 1}, 0x00) != SIZE_MAX) {
560 return "IsValue failed finding 0 in one byte of 0";
561 }
562
563 if(UsefulBuf_IsValue((UsefulBufC){(uint8_t[]){0x00}, 1}, 0x01) != 0) {
564 return "IsValue failed not finding 1 in one byte of 0";
565 }
566
567 if(UsefulBuf_IsValue(ExpectedSmaller, '+') != ExpectedSmaller.len -1) {
568 return "IsValue failed to find final *";
569 }
570
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800571 // Look for +++++... in +++++... and find it at the beginning
572 if(0 != UsefulBuf_FindBytes(ExpectedLonger, ExpectedShorter)){
573 return "Failed to find";
574 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800575
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800576 // look for ++* in ....++* and find it at the end
577 static const uint8_t pToFind[] = {'+', '+', '*'};
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800578 const UsefulBufC ToBeFound = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pToFind);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800579
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800580 if(97 != UsefulBuf_FindBytes(ExpectedSmaller, ToBeFound)){
581 return "Failed to find 2";
582 }
583
584 // look for ++* in ....++, and find it near the end
585 if(SIZE_MAX != UsefulBuf_FindBytes(ExpectedBigger, ToBeFound)){
586 return "Failed to not find";
587 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800588
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800589 // Look for the whole buffer in itself and succeed.
590 if(0 != UsefulBuf_FindBytes(ExpectedLonger, ExpectedLonger)){
591 return "Failed to find 3";
592 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800593
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800594 return NULL;
595}
596
597
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800598const char * UIBTest_IntegerFormat()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800599{
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530600 UsefulOutBuf_MakeOnStack(UOB,100);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800601
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800602 const uint32_t u32 = 0x0A0B0C0D; // from https://en.wikipedia.org/wiki/Endianness
603 const uint64_t u64 = 1984738472938472;
604 const uint16_t u16 = 40000;
605 const uint8_t u8 = 9;
606 const float f = (float)314.15;
607 const double d = 2.1e10;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800608
609
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530610 UsefulOutBuf_AppendUint32(&UOB, u32); // Also tests UsefulOutBuf_InsertUint64 and UsefulOutBuf_GetEndPosition
611 UsefulOutBuf_AppendUint64(&UOB, u64); // Also tests UsefulOutBuf_InsertUint32
612 UsefulOutBuf_AppendUint16(&UOB, u16); // Also tests UsefulOutBuf_InsertUint16
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800613 UsefulOutBuf_AppendByte(&UOB, u8);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530614 UsefulOutBuf_AppendFloat(&UOB, f); // Also tests UsefulOutBuf_InsertFloat
615 UsefulOutBuf_AppendDouble(&UOB, d); // Also tests UsefulOutBuf_InsertDouble
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800616
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800617 const UsefulBufC O = UsefulOutBuf_OutUBuf(&UOB);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530618 if(UsefulBuf_IsNULLC(O))
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800619 return "Couldn't output integers";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800620
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800621 // from https://en.wikipedia.org/wiki/Endianness
622 const uint8_t pExpectedNetworkOrder[4] = {0x0A, 0x0B, 0x0C, 0x0D};
623 if(memcmp(O.ptr, pExpectedNetworkOrder, 4)) {
624 return "not in network order";
625 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800626
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800627 UsefulInputBuf UIB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800628
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530629 UsefulInputBuf_Init(&UIB, O);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800630
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530631 if(UsefulInputBuf_Tell(&UIB) != 0) {
632 return "UsefulInputBuf_Tell failed";
633 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800634
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800635 if(UsefulInputBuf_GetUint32(&UIB) != u32) {
636 return "u32 out then in failed";
637 }
638 if(UsefulInputBuf_GetUint64(&UIB) != u64) {
639 return "u64 out then in failed";
640 }
641 if(UsefulInputBuf_GetUint16(&UIB) != u16) {
642 return "u16 out then in failed";
643 }
644 if(UsefulInputBuf_GetByte(&UIB) != u8) {
645 return "u8 out then in failed";
646 }
647 if(UsefulInputBuf_GetFloat(&UIB) != f) {
648 return "float out then in failed";
649 }
650 if(UsefulInputBuf_GetDouble(&UIB) != d) {
651 return "double out then in failed";
652 }
653
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800654 // Reset and go again for a few more tests
655 UsefulInputBuf_Init(&UIB, O);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800656
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800657 const UsefulBufC Four = UsefulInputBuf_GetUsefulBuf(&UIB, 4);
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800658 if(UsefulBuf_IsNULLC(Four)) {
659 return "Four is NULL";
660 }
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530661 if(UsefulBuf_Compare(Four, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pExpectedNetworkOrder))) {
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800662 return "Four compare failed";
663 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800664
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800665 if(UsefulInputBuf_BytesUnconsumed(&UIB) != 23){
666 return "Wrong number of unconsumed bytes";
667 }
668
669 if(!UsefulInputBuf_BytesAvailable(&UIB, 23)){
670 return "Wrong number of bytes available I";
671 }
672
673 if(UsefulInputBuf_BytesAvailable(&UIB, 24)){
674 return "Wrong number of bytes available II";
675 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800676
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800677 UsefulInputBuf_Seek(&UIB, 0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800678
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800679 if(UsefulInputBuf_GetError(&UIB)) {
680 return "unexpected error after seek";
681 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800682
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800683 const uint8_t *pGetBytes = (const uint8_t *)UsefulInputBuf_GetBytes(&UIB, 4);
684 if(pGetBytes == NULL) {
685 return "GetBytes returns NULL";
686 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800687
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800688 if(memcmp(pGetBytes, pExpectedNetworkOrder, 4)) {
689 return "Got wrong bytes";
690 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800691
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800692 UsefulInputBuf_Seek(&UIB, 28);
693
694 if(!UsefulInputBuf_GetError(&UIB)) {
695 return "expected error after seek";
696 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800697
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530698 return NULL;
699}
700
701
Laurence Lundblade7566b9f2018-10-12 09:13:32 +0800702const char *UBUTest_CopyUtil()
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530703{
704 if(UsefulBufUtil_CopyFloatToUint32(65536.0F) != 0x47800000) {
705 return "CopyFloatToUint32 failed";
706 }
707
708 if(UsefulBufUtil_CopyDoubleToUint64(4e-40F) != 0X37C16C2800000000ULL) {
709 return "CopyDoubleToUint64 failed";
710 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800711
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530712 if(UsefulBufUtil_CopyUint64ToDouble(0X37C16C2800000000ULL) != 4e-40F) {
713 return "CopyUint64ToDouble failed";
714 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800715
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530716 if(UsefulBufUtil_CopyUint32ToFloat(0x47800000) != 65536.0F) {
717 return "CopyUint32ToFloat failed";
718 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800719
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800720 return NULL;
721}
722
723
724