
#include <stdio.h>
#include <winpr/crt.h>
#include <winpr/tchar.h>
#include <winpr/environment.h>

int TestEnvironmentGetSetEB(int argc, char* argv[])
{
#ifndef _WIN32
	char test[1024];
	TCHAR* p;
	int length;
	LPTCH lpszEnvironmentBlock = "SHELL=123\0test=1\0test1=2\0DISPLAY=WINPR_TEST_VALUE\0\0";
	LPTCH lpszEnvironmentBlockNew = NULL;

	/* Get length of an variable */
	length = GetEnvironmentVariableEBA(lpszEnvironmentBlock,"DISPLAY", NULL, 0);
	if (0 == length)
		return -1;

	/* Get the variable itself */
	p = (LPSTR) malloc(length);
	if (!p)
		return -1;

	if (GetEnvironmentVariableEBA(lpszEnvironmentBlock,"DISPLAY", p, length) != length - 1)
		return -1;

	printf("GetEnvironmentVariableA(WINPR_TEST_VARIABLE) = %s\n" , p);

	if (strcmp(p, "WINPR_TEST_VALUE") != 0)
	{
		free(p);
		return -1;
	}

	free(p);

	/* Get length of an non-existing variable */
	length = GetEnvironmentVariableEBA(lpszEnvironmentBlock,"BLA", NULL, 0);
	if (0 != length)
	{
		printf("Unset variable returned\n");
		return -1;
	}

	/* Get length of an similar called variables */
	length = GetEnvironmentVariableEBA(lpszEnvironmentBlock,"XDISPLAY", NULL, 0);
	if (0 != length)
	{
		printf("Similar named variable returned (XDISPLAY, length %d)\n", length);
		return -1;
	}
	length = GetEnvironmentVariableEBA(lpszEnvironmentBlock,"DISPLAYX", NULL, 0);
	if (0 != length)
	{
		printf("Similar named variable returned (DISPLAYX, length %d)\n", length);
		return -1;
	}
	length = GetEnvironmentVariableEBA(lpszEnvironmentBlock,"DISPLA", NULL, 0);
	if (0 != length)
	{
		printf("Similar named variable returned (DISPLA, length %d)\n", length);
		return -1;
	}
	length = GetEnvironmentVariableEBA(lpszEnvironmentBlock,"ISPLAY", NULL, 0);
	if (0 != length)
	{
		printf("Similar named variable returned (ISPLAY, length %d)\n", length);
		return -1;
	}

	/* Set variable in empty environment block */
	if (SetEnvironmentVariableEBA(&lpszEnvironmentBlockNew, "test", "5"))
	{
		if (GetEnvironmentVariableEBA(lpszEnvironmentBlockNew,"test", test, 1023))
		{
			if (strcmp(test,"5") != 0)
			{
				return -1;
			}
		}
		else
		{
			return -1;
		}
	}
	/* Clear variable */
	if (SetEnvironmentVariableEBA(&lpszEnvironmentBlockNew, "test", NULL))
	{
		if (GetEnvironmentVariableEBA(lpszEnvironmentBlockNew,"test", test, 1023))
		{
			free(lpszEnvironmentBlockNew);
			return -1;
		}
		else
		{
			// not found .. this is expected
		}
	}
	free(lpszEnvironmentBlockNew);

	lpszEnvironmentBlockNew = (LPTCH) calloc(1024, sizeof(TCHAR));
	if (!lpszEnvironmentBlockNew)
		return -1;

	memcpy(lpszEnvironmentBlockNew,lpszEnvironmentBlock,length);

	/* Set variable in empty environment block */
	if (SetEnvironmentVariableEBA(&lpszEnvironmentBlockNew, "test", "5"))
	{
		if (0 != GetEnvironmentVariableEBA(lpszEnvironmentBlockNew,"testr", test, 1023))
		{
			printf("GetEnvironmentVariableEBA returned unset variable\n");
			free(lpszEnvironmentBlockNew);
			return -1;
		}
		if (GetEnvironmentVariableEBA(lpszEnvironmentBlockNew,"test", test, 1023))
		{
			if (strcmp(test,"5") != 0)
			{
				free(lpszEnvironmentBlockNew);
				return -1;
			}
		}
		else
		{
			free(lpszEnvironmentBlockNew);
			return -1;
		}
	}

	free(lpszEnvironmentBlockNew);
#endif

	return 0;
}

