2#include <winpr/print.h>
3#include <winpr/crypto.h>
4#include <winpr/stream.h>
6static BOOL TestStream_Verify(
wStream* s,
size_t mincap,
size_t len,
size_t pos)
8 if (Stream_Buffer(s) ==
nullptr)
10 printf(
"stream buffer is null\n");
14 if (Stream_ConstPointer(s) ==
nullptr)
16 printf(
"stream pointer is null\n");
20 if (Stream_PointerAs(s, BYTE) < Stream_Buffer(s))
22 printf(
"stream pointer (%p) or buffer (%p) is invalid\n", Stream_ConstPointer(s),
23 (
void*)Stream_Buffer(s));
27 if (Stream_Capacity(s) < mincap)
29 printf(
"stream capacity is %" PRIuz
" but minimum expected value is %" PRIuz
"\n",
30 Stream_Capacity(s), mincap);
34 if (Stream_Length(s) != len)
36 printf(
"stream has unexpected length (%" PRIuz
" instead of %" PRIuz
")\n",
37 Stream_Length(s), len);
41 if (Stream_GetPosition(s) != pos)
43 printf(
"stream has unexpected position (%" PRIuz
" instead of %" PRIuz
")\n",
44 Stream_GetPosition(s), pos);
48 if (Stream_GetPosition(s) > Stream_Length(s))
50 printf(
"stream position (%" PRIuz
") exceeds length (%" PRIuz
")\n", Stream_GetPosition(s),
55 if (Stream_GetPosition(s) > Stream_Capacity(s))
57 printf(
"stream position (%" PRIuz
") exceeds capacity (%" PRIuz
")\n",
58 Stream_GetPosition(s), Stream_Capacity(s));
62 if (Stream_Length(s) > Stream_Capacity(s))
64 printf(
"stream length (%" PRIuz
") exceeds capacity (%" PRIuz
")\n", Stream_Length(s),
69 if (Stream_GetRemainingLength(s) != len - pos)
71 printf(
"stream remaining length (%" PRIuz
" instead of %" PRIuz
")\n",
72 Stream_GetRemainingLength(s), len - pos);
79static BOOL TestStream_New(
void)
82 wStream* s = Stream_New(
nullptr, 0);
91static BOOL TestStream_Static(
void)
93 BYTE buffer[20] = WINPR_C_ARRAY_INIT;
94 wStream staticStream = WINPR_C_ARRAY_INIT;
98 Stream_StaticInit(s, buffer,
sizeof(buffer));
99 Stream_Write_UINT16(s, 0xcab1);
100 Stream_ResetPosition(s);
101 Stream_Read_UINT16(s, v);
106 Stream_ResetPosition(s);
107 Stream_Write_UINT16(s, 1);
109 if (!Stream_EnsureRemainingCapacity(s, 10))
113 if (!Stream_EnsureRemainingCapacity(s, 30) || !s->isOwner)
116 Stream_Write_UINT16(s, 2);
117 Stream_ResetPosition(s);
118 Stream_Read_UINT16(s, v);
123 Stream_Read_UINT16(s, v);
131 WINPR_PRAGMA_DIAG_PUSH
132 WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
133 Stream_Free(s, TRUE);
134 WINPR_PRAGMA_DIAG_POP
138static BOOL TestStream_Create(
size_t count, BOOL selfAlloc)
143 void* buffer =
nullptr;
145 for (
size_t i = 0; i < count; i++)
151 if (!(buffer = malloc(cap)))
153 printf(
"%s: failed to allocate buffer of size %" PRIuz
"\n", __func__, cap);
158 if (!(s = Stream_New(selfAlloc ? buffer : nullptr, len)))
160 printf(
"%s: Stream_New failed for stream #%" PRIuz
"\n", __func__, i);
164 if (!TestStream_Verify(s, cap, len, 0))
169 for (
size_t pos = 0; pos < len; pos++)
171 if (!Stream_SetPosition(s, pos))
173 Stream_SealLength(s);
175 if (!TestStream_Verify(s, cap, pos, pos))
183 memset(buffer, (BYTE)(i % 256), cap);
185 if (memcmp(buffer, Stream_Buffer(s), cap) != 0)
187 printf(
"%s: buffer memory corruption\n", __func__);
192 Stream_Free(s, buffer ==
nullptr);
202 Stream_Free(s, buffer ==
nullptr);
208static BOOL TestStream_Extent(UINT32 maxSize)
213 if (!(s = Stream_New(
nullptr, 1)))
215 printf(
"%s: Stream_New failed\n", __func__);
219 for (UINT32 i = 1; i < maxSize; i++)
223 if (!Stream_EnsureRemainingCapacity(s, i))
228 if (!Stream_EnsureCapacity(s, i))
232 if (!Stream_SetPosition(s, i))
234 Stream_SealLength(s);
236 if (!TestStream_Verify(s, i, i, i))
238 printf(
"%s: failed to verify stream in iteration %" PRIu32
"\n", __func__, i);
248 Stream_Free(s, TRUE);
254#define Stream_Peek_UINT8_BE Stream_Peek_UINT8
255#define Stream_Read_UINT8_BE Stream_Read_UINT8
256#define Stream_Peek_Get_UINT8_BE Stream_Peek_Get_UINT8
257#define Stream_Get_UINT8_BE Stream_Get_UINT8
258#define Stream_Peek_INT8_BE Stream_Peek_INT8
259#define Stream_Peek_Get_INT8_BE Stream_Peek_Get_INT8
260#define Stream_Read_INT8_BE Stream_Read_INT8
261#define Stream_Get_INT8_BE Stream_Get_INT8
263#define TestStream_PeekAndRead(_s, _r, _t) \
268 BYTE* _p = Stream_Buffer(_s); \
269 Stream_ResetPosition(_s); \
270 Stream_Peek_##_t(_s, _a); \
271 Stream_Read_##_t(_s, _b); \
274 printf("%s: test1 " #_t "_LE failed\n", __func__); \
277 Stream_Rewind(_s, sizeof(_t)); \
278 const _t _d = Stream_Peek_Get_##_t(_s); \
279 const _t _c = Stream_Get_##_t(_s); \
282 printf("%s: test1 " #_t "_LE failed\n", __func__); \
285 for (size_t _i = 0; _i < sizeof(_t); _i++) \
287 if (((_a >> (_i * 8)) & 0xFF) != _p[_i]) \
289 printf("%s: test2 " #_t "_LE failed\n", __func__); \
295 Stream_ResetPosition(_s); \
296 Stream_Peek_##_t##_BE(_s, _a); \
297 Stream_Read_##_t##_BE(_s, _b); \
300 printf("%s: test1 " #_t "_BE failed\n", __func__); \
303 Stream_Rewind(_s, sizeof(_t)); \
304 const _t _e = Stream_Peek_Get_##_t##_BE(_s); \
305 const _t _f = Stream_Get_##_t##_BE(_s); \
308 printf("%s: test1 " #_t "_BE failed\n", __func__); \
311 for (size_t _i = 0; _i < sizeof(_t); _i++) \
313 if (((_a >> (_i * 8)) & 0xFF) != _p[sizeof(_t) - _i - 1]) \
315 printf("%s: test2 " #_t "_BE failed\n", __func__); \
323static BOOL TestStream_WriteAndRead(UINT64 value)
338 wStream* s = Stream_New(
nullptr, 1024);
344 Stream_Write_UINT8(s, val.u8);
345 Stream_Rewind_UINT8(s);
346 const UINT8 ru8 = Stream_Get_UINT8(s);
347 Stream_Rewind_UINT8(s);
352 Stream_Write_UINT16(s, val.u16);
353 Stream_Rewind_UINT16(s);
354 const UINT16 ru = Stream_Get_UINT16(s);
355 Stream_Rewind_UINT16(s);
360 Stream_Write_UINT16_BE(s, val.u16);
361 Stream_Rewind_UINT16(s);
362 const UINT16 ru = Stream_Get_UINT16_BE(s);
363 Stream_Rewind_UINT16(s);
368 Stream_Write_UINT32(s, val.u32);
369 Stream_Rewind_UINT32(s);
370 const UINT32 ru = Stream_Get_UINT32(s);
371 Stream_Rewind_UINT32(s);
376 Stream_Write_UINT32_BE(s, val.u32);
377 Stream_Rewind_UINT32(s);
378 const UINT32 ru = Stream_Get_UINT32_BE(s);
379 Stream_Rewind_UINT32(s);
384 Stream_Write_UINT64(s, val.u64);
385 Stream_Rewind_UINT64(s);
386 const UINT64 ru = Stream_Get_UINT64(s);
387 Stream_Rewind_UINT64(s);
392 Stream_Write_UINT64_BE(s, val.u64);
393 Stream_Rewind_UINT64(s);
394 const UINT64 ru = Stream_Get_UINT64_BE(s);
395 Stream_Rewind_UINT64(s);
400 Stream_Write_INT8(s, val.i8);
402 const INT8 ru8 = Stream_Get_INT8(s);
408 Stream_Write_INT16(s, val.i16);
410 const INT16 ru = Stream_Get_INT16(s);
416 Stream_Write_INT16_BE(s, val.i16);
418 const INT16 ru = Stream_Get_INT16_BE(s);
424 Stream_Write_INT32(s, val.i32);
426 const INT32 ru = Stream_Get_INT32(s);
432 Stream_Write_INT32_BE(s, val.i32);
434 const INT32 ru = Stream_Get_INT32_BE(s);
440 Stream_Write_INT64(s, val.i64);
442 const INT64 ru = Stream_Get_INT64(s);
448 Stream_Write_INT64_BE(s, val.i64);
450 const INT64 ru = Stream_Get_INT64_BE(s);
458 Stream_Free(s, TRUE);
462static BOOL TestStream_Reading(
void)
464 BYTE src[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
468 if (!(s = Stream_New(src,
sizeof(src))))
470 printf(
"%s: Stream_New failed\n", __func__);
474 TestStream_PeekAndRead(s, result, UINT8);
475 TestStream_PeekAndRead(s, result, INT8);
476 TestStream_PeekAndRead(s, result, UINT16);
477 TestStream_PeekAndRead(s, result, INT16);
478 TestStream_PeekAndRead(s, result, UINT32);
479 TestStream_PeekAndRead(s, result, INT32);
480 TestStream_PeekAndRead(s, result, UINT64);
481 TestStream_PeekAndRead(s, result, INT64);
482 Stream_Free(s, FALSE);
486static BOOL TestStream_Write(
void)
493 const BYTE data[] =
"someteststreamdata";
494 wStream* s = Stream_New(
nullptr, 100);
499 if (s->pointer != s->buffer)
502 Stream_Write(s, data,
sizeof(data));
504 if (memcmp(Stream_Buffer(s), data,
sizeof(data)) == 0)
507 if (s->pointer != s->buffer +
sizeof(data))
510 Stream_ResetPosition(s);
512 if (s->pointer != s->buffer)
515 Stream_Write_UINT8(s, 42);
517 if (s->pointer != s->buffer + 1)
520 Stream_ResetPosition(s);
522 if (s->pointer != s->buffer)
525 Stream_Peek_UINT8(s, u8);
530 Stream_Write_UINT16(s, 0x1234);
532 if (s->pointer != s->buffer + 2)
535 Stream_ResetPosition(s);
537 if (s->pointer != s->buffer)
540 Stream_Peek_UINT16(s, u16);
545 Stream_Write_UINT32(s, 0x12345678UL);
547 if (s->pointer != s->buffer + 4)
550 Stream_ResetPosition(s);
552 if (s->pointer != s->buffer)
555 Stream_Peek_UINT32(s, u32);
557 if (u32 != 0x12345678UL)
560 Stream_Write_UINT64(s, 0x1234567890ABCDEFULL);
562 if (s->pointer != s->buffer + 8)
565 Stream_ResetPosition(s);
567 if (s->pointer != s->buffer)
570 Stream_Peek_UINT64(s, u64);
572 if (u64 != 0x1234567890ABCDEFULL)
576 Stream_Free(s, TRUE);
580static BOOL TestStream_Seek(
void)
583 wStream* s = Stream_New(
nullptr, 100);
588 if (s->pointer != s->buffer)
593 if (s->pointer != s->buffer + 5)
596 Stream_Seek_UINT8(s);
598 if (s->pointer != s->buffer + 6)
601 Stream_Seek_UINT16(s);
603 if (s->pointer != s->buffer + 8)
606 Stream_Seek_UINT32(s);
608 if (s->pointer != s->buffer + 12)
611 Stream_Seek_UINT64(s);
613 if (s->pointer != s->buffer + 20)
618 Stream_Free(s, TRUE);
622static BOOL TestStream_Rewind(
void)
625 wStream* s = Stream_New(
nullptr, 100);
630 if (s->pointer != s->buffer)
635 if (s->pointer != s->buffer + 100)
638 Stream_Rewind(s, 10);
640 if (s->pointer != s->buffer + 90)
643 Stream_Rewind_UINT8(s);
645 if (s->pointer != s->buffer + 89)
648 Stream_Rewind_UINT16(s);
650 if (s->pointer != s->buffer + 87)
653 Stream_Rewind_UINT32(s);
655 if (s->pointer != s->buffer + 83)
658 Stream_Rewind_UINT64(s);
660 if (s->pointer != s->buffer + 75)
665 Stream_Free(s, TRUE);
669static BOOL TestStream_Zero(
void)
672 const BYTE data[] =
"someteststreamdata";
673 wStream* s = Stream_New(
nullptr,
sizeof(data));
678 Stream_Write(s, data,
sizeof(data));
680 if (memcmp(Stream_Buffer(s), data,
sizeof(data)) != 0)
683 Stream_ResetPosition(s);
685 if (s->pointer != s->buffer)
690 if (s->pointer != s->buffer + 5)
693 if (memcmp(Stream_ConstPointer(s), data + 5,
sizeof(data) - 5) != 0)
696 Stream_ResetPosition(s);
698 if (s->pointer != s->buffer)
701 for (UINT32 x = 0; x < 5; x++)
704 Stream_Read_UINT8(s, val);
712 Stream_Free(s, TRUE);
716static BOOL TestStream_Fill(
void)
719 const BYTE fill[7] =
"XXXXXXX";
720 const BYTE data[] =
"someteststreamdata";
721 wStream* s = Stream_New(
nullptr,
sizeof(data));
726 Stream_Write(s, data,
sizeof(data));
728 if (memcmp(Stream_Buffer(s), data,
sizeof(data)) != 0)
731 Stream_ResetPosition(s);
733 if (s->pointer != s->buffer)
736 Stream_Fill(s, fill[0],
sizeof(fill));
738 if (s->pointer != s->buffer +
sizeof(fill))
741 if (memcmp(Stream_ConstPointer(s), data +
sizeof(fill),
sizeof(data) -
sizeof(fill)) != 0)
744 Stream_ResetPosition(s);
746 if (s->pointer != s->buffer)
749 if (memcmp(Stream_ConstPointer(s), fill,
sizeof(fill)) != 0)
754 Stream_Free(s, TRUE);
758static BOOL TestStream_Copy(
void)
761 const BYTE data[] =
"someteststreamdata";
762 wStream* s = Stream_New(
nullptr,
sizeof(data));
763 wStream* d = Stream_New(
nullptr,
sizeof(data));
768 if (s->pointer != s->buffer)
771 Stream_Write(s, data,
sizeof(data));
773 if (memcmp(Stream_Buffer(s), data,
sizeof(data)) != 0)
776 if (s->pointer != s->buffer +
sizeof(data))
779 Stream_ResetPosition(s);
781 if (s->pointer != s->buffer)
784 Stream_Copy(s, d,
sizeof(data));
786 if (s->pointer != s->buffer +
sizeof(data))
789 if (d->pointer != d->buffer +
sizeof(data))
792 if (Stream_GetPosition(s) != Stream_GetPosition(d))
795 if (memcmp(Stream_Buffer(s), data,
sizeof(data)) != 0)
798 if (memcmp(Stream_Buffer(d), data,
sizeof(data)) != 0)
803 Stream_Free(s, TRUE);
804 Stream_Free(d, TRUE);
808int TestStream(
int argc,
char* argv[])
813 if (!TestStream_Create(200, FALSE))
816 if (!TestStream_Create(200, TRUE))
819 if (!TestStream_Extent(4096))
822 if (!TestStream_Reading())
825 if (!TestStream_New())
828 if (!TestStream_Write())
831 if (!TestStream_Seek())
834 if (!TestStream_Rewind())
837 if (!TestStream_Zero())
840 if (!TestStream_Fill())
843 if (!TestStream_Copy())
846 if (!TestStream_Static())
849 if (!TestStream_WriteAndRead(0x1234567890abcdef))
852 for (
size_t x = 0; x < 10; x++)
855 if (winpr_RAND(&val,
sizeof(val)) < 0)
857 if (!TestStream_WriteAndRead(val))