Blame winpr/libwinpr/utils/test/TestStream.c

Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/print.h>
Packit 1fb8d4
#include <winpr/stream.h>
Packit 1fb8d4
Packit 1fb8d4
static BOOL TestStream_Verify(wStream* s, size_t mincap, size_t len, size_t pos)
Packit 1fb8d4
{
Packit 1fb8d4
	if (Stream_Buffer(s) == NULL)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("stream buffer is null\n");
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_Pointer(s) == NULL)
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("stream pointer is null\n");
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_Pointer(s) < Stream_Buffer(s))
Packit 1fb8d4
	{
Packit Service 5a9772
		printf("stream pointer (%p) or buffer (%p) is invalid\n", (void*)Stream_Pointer(s),
Packit Service 5a9772
		       (void*)Stream_Buffer(s));
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_Capacity(s) < mincap)
Packit 1fb8d4
	{
Packit Service 5a9772
		printf("stream capacity is %" PRIuz " but minimum expected value is %" PRIuz "\n",
Packit 1fb8d4
		       Stream_Capacity(s), mincap);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_Length(s) != len)
Packit 1fb8d4
	{
Packit Service 5a9772
		printf("stream has unexpected length (%" PRIuz " instead of %" PRIuz ")\n",
Packit 1fb8d4
		       Stream_Length(s), len);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_GetPosition(s) != pos)
Packit 1fb8d4
	{
Packit Service 5a9772
		printf("stream has unexpected position (%" PRIuz " instead of %" PRIuz ")\n",
Packit 1fb8d4
		       Stream_GetPosition(s), pos);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_GetPosition(s) > Stream_Length(s))
Packit 1fb8d4
	{
Packit Service 5a9772
		printf("stream position (%" PRIuz ") exceeds length (%" PRIuz ")\n", Stream_GetPosition(s),
Packit Service 5a9772
		       Stream_Length(s));
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_GetPosition(s) > Stream_Capacity(s))
Packit 1fb8d4
	{
Packit Service 5a9772
		printf("stream position (%" PRIuz ") exceeds capacity (%" PRIuz ")\n",
Packit 1fb8d4
		       Stream_GetPosition(s), Stream_Capacity(s));
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_Length(s) > Stream_Capacity(s))
Packit 1fb8d4
	{
Packit Service 5a9772
		printf("stream length (%" PRIuz ") exceeds capacity (%" PRIuz ")\n", Stream_Length(s),
Packit Service 5a9772
		       Stream_Capacity(s));
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_GetRemainingLength(s) != len - pos)
Packit 1fb8d4
	{
Packit Service 5a9772
		printf("stream remaining length (%" PRIuz " instead of %" PRIuz ")\n",
Packit 1fb8d4
		       Stream_GetRemainingLength(s), len - pos);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL TestStream_New(void)
Packit 1fb8d4
{
Packit 1fb8d4
	wStream* s = NULL;
Packit 1fb8d4
	/* Test creation of a 0-size stream with no buffer */
Packit 1fb8d4
	s = Stream_New(NULL, 0);
Packit 1fb8d4
Packit 1fb8d4
	if (s)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL TestStream_Static()
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE buffer[20];
Packit 1fb8d4
	wStream staticStream, *s = &staticStream;
Packit 1fb8d4
	UINT16 v;
Packit 1fb8d4
	/* Test creation of a static stream */
Packit 1fb8d4
	Stream_StaticInit(s, buffer, sizeof(buffer));
Packit 1fb8d4
	Stream_Write_UINT16(s, 0xcab1);
Packit 1fb8d4
	Stream_SetPosition(s, 0);
Packit 1fb8d4
	Stream_Read_UINT16(s, v);
Packit 1fb8d4
Packit 1fb8d4
	if (v != 0xcab1)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	Stream_SetPosition(s, 0);
Packit 1fb8d4
	Stream_Write_UINT16(s, 1);
Packit 1fb8d4
Packit 1fb8d4
	if (!Stream_EnsureRemainingCapacity(s, 10)) /* we can ask for 10 bytes */
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	/* 30 is bigger than the buffer, it will be reallocated on the heap */
Packit 1fb8d4
	if (!Stream_EnsureRemainingCapacity(s, 30) || !s->isOwner)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Write_UINT16(s, 2);
Packit 1fb8d4
	Stream_SetPosition(s, 0);
Packit 1fb8d4
	Stream_Read_UINT16(s, v);
Packit 1fb8d4
Packit 1fb8d4
	if (v != 1)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Read_UINT16(s, v);
Packit 1fb8d4
Packit 1fb8d4
	if (v != 2)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Free(s, TRUE);
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL TestStream_Create(size_t count, BOOL selfAlloc)
Packit 1fb8d4
{
Packit 1fb8d4
	size_t i, len, cap, pos;
Packit 1fb8d4
	wStream* s = NULL;
Packit 1fb8d4
	void* buffer = NULL;
Packit 1fb8d4
Packit 1fb8d4
	for (i = 0; i < count; i++)
Packit 1fb8d4
	{
Packit 1fb8d4
		len = cap = i + 1;
Packit 1fb8d4
		pos = 0;
Packit 1fb8d4
Packit 1fb8d4
		if (selfAlloc)
Packit 1fb8d4
		{
Packit 1fb8d4
			if (!(buffer = malloc(cap)))
Packit 1fb8d4
			{
Packit Service 5a9772
				printf("%s: failed to allocate buffer of size %" PRIuz "\n", __FUNCTION__, cap);
Packit 1fb8d4
				goto fail;
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		if (!(s = Stream_New(selfAlloc ? buffer : NULL, len)))
Packit 1fb8d4
		{
Packit Service 5a9772
			printf("%s: Stream_New failed for stream #%" PRIuz "\n", __FUNCTION__, i);
Packit 1fb8d4
			goto fail;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		if (!TestStream_Verify(s, cap, len, pos))
Packit 1fb8d4
		{
Packit 1fb8d4
			goto fail;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		for (pos = 0; pos < len; pos++)
Packit 1fb8d4
		{
Packit 1fb8d4
			Stream_SetPosition(s, pos);
Packit 1fb8d4
			Stream_SealLength(s);
Packit 1fb8d4
Packit 1fb8d4
			if (!TestStream_Verify(s, cap, pos, pos))
Packit 1fb8d4
			{
Packit 1fb8d4
				goto fail;
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		if (selfAlloc)
Packit 1fb8d4
		{
Packit 1fb8d4
			memset(buffer, i % 256, cap);
Packit 1fb8d4
Packit 1fb8d4
			if (memcmp(buffer, Stream_Buffer(s), cap))
Packit 1fb8d4
			{
Packit 1fb8d4
				printf("%s: buffer memory corruption\n", __FUNCTION__);
Packit 1fb8d4
				goto fail;
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		Stream_Free(s, buffer ? FALSE : TRUE);
Packit 1fb8d4
		free(buffer);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
fail:
Packit 1fb8d4
	free(buffer);
Packit 1fb8d4
Packit 1fb8d4
	if (s)
Packit 1fb8d4
	{
Packit 1fb8d4
		Stream_Free(s, buffer ? FALSE : TRUE);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return FALSE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL TestStream_Extent(UINT32 maxSize)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 i;
Packit 1fb8d4
	wStream* s = NULL;
Packit 1fb8d4
	BOOL result = FALSE;
Packit 1fb8d4
Packit 1fb8d4
	if (!(s = Stream_New(NULL, 1)))
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("%s: Stream_New failed\n", __FUNCTION__);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	for (i = 1; i < maxSize; i++)
Packit 1fb8d4
	{
Packit 1fb8d4
		if (i % 2)
Packit 1fb8d4
		{
Packit 1fb8d4
			if (!Stream_EnsureRemainingCapacity(s, i))
Packit 1fb8d4
				goto fail;
Packit 1fb8d4
		}
Packit 1fb8d4
		else
Packit 1fb8d4
		{
Packit 1fb8d4
			if (!Stream_EnsureCapacity(s, i))
Packit 1fb8d4
				goto fail;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		Stream_SetPosition(s, i);
Packit 1fb8d4
		Stream_SealLength(s);
Packit 1fb8d4
Packit 1fb8d4
		if (!TestStream_Verify(s, i, i, i))
Packit 1fb8d4
		{
Packit Service 5a9772
			printf("%s: failed to verify stream in iteration %" PRIu32 "\n", __FUNCTION__, i);
Packit 1fb8d4
			goto fail;
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	result = TRUE;
Packit 1fb8d4
fail:
Packit 1fb8d4
Packit 1fb8d4
	if (s)
Packit 1fb8d4
	{
Packit 1fb8d4
		Stream_Free(s, TRUE);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return result;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
#define Stream_Peek_UINT8_BE Stream_Peek_UINT8
Packit Service 5a9772
#define Stream_Read_UINT8_BE Stream_Read_UINT8
Packit Service 5a9772
#define Stream_Peek_INT8_BE Stream_Peek_INT8
Packit Service 5a9772
#define Stream_Read_INT8_BE Stream_Read_INT8
Packit Service 5a9772
Packit Service 5a9772
#define TestStream_PeekAndRead(_s, _r, _t)                             \
Packit Service 5a9772
	do                                                                 \
Packit Service 5a9772
	{                                                                  \
Packit Service 5a9772
		_t _a, _b;                                                     \
Packit Service 5a9772
		size_t _i;                                                     \
Packit Service 5a9772
		BYTE* _p = Stream_Buffer(_s);                                  \
Packit Service 5a9772
		Stream_SetPosition(_s, 0);                                     \
Packit Service 5a9772
		Stream_Peek_##_t(_s, _a);                                      \
Packit Service 5a9772
		Stream_Read_##_t(_s, _b);                                      \
Packit Service 5a9772
		if (_a != _b)                                                  \
Packit Service 5a9772
		{                                                              \
Packit Service 5a9772
			printf("%s: test1 " #_t "_LE failed\n", __FUNCTION__);     \
Packit Service 5a9772
			_r = FALSE;                                                \
Packit Service 5a9772
		}                                                              \
Packit Service 5a9772
		for (_i = 0; _i < sizeof(_t); _i++)                            \
Packit Service 5a9772
		{                                                              \
Packit Service 5a9772
			if (((_a >> (_i * 8)) & 0xFF) != _p[_i])                   \
Packit Service 5a9772
			{                                                          \
Packit Service 5a9772
				printf("%s: test2 " #_t "_LE failed\n", __FUNCTION__); \
Packit Service 5a9772
				_r = FALSE;                                            \
Packit Service 5a9772
				break;                                                 \
Packit Service 5a9772
			}                                                          \
Packit Service 5a9772
		}                                                              \
Packit Service 5a9772
		/* printf("a: 0x%016llX\n", a); */                             \
Packit Service 5a9772
		Stream_SetPosition(_s, 0);                                     \
Packit Service 5a9772
		Stream_Peek_##_t##_BE(_s, _a);                                 \
Packit Service 5a9772
		Stream_Read_##_t##_BE(_s, _b);                                 \
Packit Service 5a9772
		if (_a != _b)                                                  \
Packit Service 5a9772
		{                                                              \
Packit Service 5a9772
			printf("%s: test1 " #_t "_BE failed\n", __FUNCTION__);     \
Packit Service 5a9772
			_r = FALSE;                                                \
Packit Service 5a9772
		}                                                              \
Packit Service 5a9772
		for (_i = 0; _i < sizeof(_t); _i++)                            \
Packit Service 5a9772
		{                                                              \
Packit Service 5a9772
			if (((_a >> (_i * 8)) & 0xFF) != _p[sizeof(_t) - _i - 1])  \
Packit Service 5a9772
			{                                                          \
Packit Service 5a9772
				printf("%s: test2 " #_t "_BE failed\n", __FUNCTION__); \
Packit Service 5a9772
				_r = FALSE;                                            \
Packit Service 5a9772
				break;                                                 \
Packit Service 5a9772
			}                                                          \
Packit Service 5a9772
		}                                                              \
Packit Service 5a9772
		/* printf("a: 0x%016llX\n", a); */                             \
Packit 1fb8d4
	} while (0)
Packit 1fb8d4
Packit 1fb8d4
static BOOL TestStream_Reading(void)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE src[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
Packit 1fb8d4
	wStream* s = NULL;
Packit 1fb8d4
	BOOL result = TRUE;
Packit 1fb8d4
Packit 1fb8d4
	if (!(s = Stream_New(src, sizeof(src))))
Packit 1fb8d4
	{
Packit 1fb8d4
		printf("%s: Stream_New failed\n", __FUNCTION__);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	TestStream_PeekAndRead(s, result, UINT8);
Packit 1fb8d4
	TestStream_PeekAndRead(s, result, INT8);
Packit 1fb8d4
	TestStream_PeekAndRead(s, result, UINT16);
Packit 1fb8d4
	TestStream_PeekAndRead(s, result, INT16);
Packit 1fb8d4
	TestStream_PeekAndRead(s, result, UINT32);
Packit 1fb8d4
	TestStream_PeekAndRead(s, result, INT32);
Packit 1fb8d4
	TestStream_PeekAndRead(s, result, UINT64);
Packit 1fb8d4
	TestStream_PeekAndRead(s, result, INT64);
Packit 1fb8d4
	Stream_Free(s, FALSE);
Packit 1fb8d4
	return result;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL TestStream_Write(void)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL rc = FALSE;
Packit 1fb8d4
	UINT8 u8;
Packit 1fb8d4
	UINT16 u16;
Packit 1fb8d4
	UINT32 u32;
Packit 1fb8d4
	UINT64 u64;
Packit 1fb8d4
	const BYTE data[] = "someteststreamdata";
Packit 1fb8d4
	wStream* s = Stream_New(NULL, 100);
Packit 1fb8d4
Packit 1fb8d4
	if (!s)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Write(s, data, sizeof(data));
Packit 1fb8d4
Packit 1fb8d4
	if (memcmp(Stream_Buffer(s), data, sizeof(data)) == 0)
Packit 1fb8d4
		rc = TRUE;
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + sizeof(data))
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_SetPosition(s, 0);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Write_UINT8(s, 42);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 1)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_SetPosition(s, 0);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Peek_UINT8(s, u8);
Packit 1fb8d4
Packit 1fb8d4
	if (u8 != 42)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Write_UINT16(s, 0x1234);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 2)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_SetPosition(s, 0);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Peek_UINT16(s, u16);
Packit 1fb8d4
Packit 1fb8d4
	if (u16 != 0x1234)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Write_UINT32(s, 0x12345678UL);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 4)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_SetPosition(s, 0);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Peek_UINT32(s, u32);
Packit 1fb8d4
Packit 1fb8d4
	if (u32 != 0x12345678UL)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Write_UINT64(s, 0x1234567890ABCDEFULL);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 8)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_SetPosition(s, 0);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Peek_UINT64(s, u64);
Packit 1fb8d4
Packit 1fb8d4
	if (u64 != 0x1234567890ABCDEFULL)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
out:
Packit 1fb8d4
	Stream_Free(s, TRUE);
Packit 1fb8d4
	return rc;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL TestStream_Seek(void)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL rc = FALSE;
Packit 1fb8d4
	wStream* s = Stream_New(NULL, 100);
Packit 1fb8d4
Packit 1fb8d4
	if (!s)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Seek(s, 5);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 5)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Seek_UINT8(s);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 6)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Seek_UINT16(s);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 8)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Seek_UINT32(s);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 12)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Seek_UINT64(s);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 20)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	rc = TRUE;
Packit 1fb8d4
out:
Packit 1fb8d4
	Stream_Free(s, TRUE);
Packit 1fb8d4
	return rc;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL TestStream_Rewind(void)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL rc = FALSE;
Packit 1fb8d4
	wStream* s = Stream_New(NULL, 100);
Packit 1fb8d4
Packit 1fb8d4
	if (!s)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Seek(s, 100);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 100)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Rewind(s, 10);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 90)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Rewind_UINT8(s);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 89)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Rewind_UINT16(s);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 87)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Rewind_UINT32(s);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 83)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Rewind_UINT64(s);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 75)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	rc = TRUE;
Packit 1fb8d4
out:
Packit 1fb8d4
	Stream_Free(s, TRUE);
Packit 1fb8d4
	return rc;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL TestStream_Zero(void)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 x;
Packit 1fb8d4
	BOOL rc = FALSE;
Packit 1fb8d4
	const BYTE data[] = "someteststreamdata";
Packit 1fb8d4
	wStream* s = Stream_New(NULL, sizeof(data));
Packit 1fb8d4
Packit 1fb8d4
	if (!s)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Write(s, data, sizeof(data));
Packit 1fb8d4
Packit 1fb8d4
	if (memcmp(Stream_Buffer(s), data, sizeof(data)) != 0)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_SetPosition(s, 0);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Zero(s, 5);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + 5)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	if (memcmp(Stream_Pointer(s), data + 5, sizeof(data) - 5) != 0)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_SetPosition(s, 0);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	for (x = 0; x < 5; x++)
Packit 1fb8d4
	{
Packit 1fb8d4
		UINT8 val;
Packit 1fb8d4
		Stream_Read_UINT8(s, val);
Packit 1fb8d4
Packit 1fb8d4
		if (val != 0)
Packit 1fb8d4
			goto out;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	rc = TRUE;
Packit 1fb8d4
out:
Packit 1fb8d4
	Stream_Free(s, TRUE);
Packit 1fb8d4
	return rc;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL TestStream_Fill(void)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL rc = FALSE;
Packit 1fb8d4
	const BYTE fill[7] = "XXXXXXX";
Packit 1fb8d4
	const BYTE data[] = "someteststreamdata";
Packit 1fb8d4
	wStream* s = Stream_New(NULL, sizeof(data));
Packit 1fb8d4
Packit 1fb8d4
	if (!s)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Write(s, data, sizeof(data));
Packit 1fb8d4
Packit 1fb8d4
	if (memcmp(Stream_Buffer(s), data, sizeof(data)) != 0)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_SetPosition(s, 0);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Fill(s, fill[0], sizeof(fill));
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + sizeof(fill))
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	if (memcmp(Stream_Pointer(s), data + sizeof(fill), sizeof(data) - sizeof(fill)) != 0)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_SetPosition(s, 0);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	if (memcmp(Stream_Pointer(s), fill, sizeof(fill)) != 0)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	rc = TRUE;
Packit 1fb8d4
out:
Packit 1fb8d4
	Stream_Free(s, TRUE);
Packit 1fb8d4
	return rc;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static BOOL TestStream_Copy(void)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL rc = FALSE;
Packit 1fb8d4
	const BYTE data[] = "someteststreamdata";
Packit 1fb8d4
	wStream* s = Stream_New(NULL, sizeof(data));
Packit 1fb8d4
	wStream* d = Stream_New(NULL, sizeof(data));
Packit 1fb8d4
Packit 1fb8d4
	if (!s || !d)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Write(s, data, sizeof(data));
Packit 1fb8d4
Packit 1fb8d4
	if (memcmp(Stream_Buffer(s), data, sizeof(data)) != 0)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + sizeof(data))
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_SetPosition(s, 0);
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	Stream_Copy(s, d, sizeof(data));
Packit 1fb8d4
Packit 1fb8d4
	if (s->pointer != s->buffer + sizeof(data))
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	if (d->pointer != d->buffer + sizeof(data))
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	if (Stream_GetPosition(s) != Stream_GetPosition(d))
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	if (memcmp(Stream_Buffer(s), data, sizeof(data)) != 0)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	if (memcmp(Stream_Buffer(d), data, sizeof(data)) != 0)
Packit 1fb8d4
		goto out;
Packit 1fb8d4
Packit 1fb8d4
	rc = TRUE;
Packit 1fb8d4
out:
Packit 1fb8d4
	Stream_Free(s, TRUE);
Packit 1fb8d4
	Stream_Free(d, TRUE);
Packit 1fb8d4
	return rc;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int TestStream(int argc, char* argv[])
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_UNUSED(argc);
Packit 1fb8d4
	WINPR_UNUSED(argv);
Packit 1fb8d4
Packit 1fb8d4
	if (!TestStream_Create(200, FALSE))
Packit 1fb8d4
		return 1;
Packit 1fb8d4
Packit 1fb8d4
	if (!TestStream_Create(200, TRUE))
Packit 1fb8d4
		return 2;
Packit 1fb8d4
Packit 1fb8d4
	if (!TestStream_Extent(4096))
Packit 1fb8d4
		return 3;
Packit 1fb8d4
Packit 1fb8d4
	if (!TestStream_Reading())
Packit 1fb8d4
		return 4;
Packit 1fb8d4
Packit 1fb8d4
	if (!TestStream_New())
Packit 1fb8d4
		return 5;
Packit 1fb8d4
Packit 1fb8d4
	if (!TestStream_Write())
Packit 1fb8d4
		return 6;
Packit 1fb8d4
Packit 1fb8d4
	if (!TestStream_Seek())
Packit 1fb8d4
		return 7;
Packit 1fb8d4
Packit 1fb8d4
	if (!TestStream_Rewind())
Packit 1fb8d4
		return 8;
Packit 1fb8d4
Packit 1fb8d4
	if (!TestStream_Zero())
Packit 1fb8d4
		return 9;
Packit 1fb8d4
Packit 1fb8d4
	if (!TestStream_Fill())
Packit 1fb8d4
		return 10;
Packit 1fb8d4
Packit 1fb8d4
	if (!TestStream_Copy())
Packit 1fb8d4
		return 11;
Packit 1fb8d4
Packit 1fb8d4
	if (!TestStream_Static())
Packit 1fb8d4
		return 12;
Packit 1fb8d4
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}