25#include <winpr/crypto.h> 
   26#include <freerdp/utils/encoded_types.h> 
   29#define MIN(x, y) ((x) < (y)) ? (x) : (y) 
   33#define MAX(x, y) ((x) > (y)) ? (x) : (y) 
   36static BOOL test_signed_integer_read_write_equal(INT32 value)
 
   39  BYTE buffer[32] = { 0 };
 
   41  wStream* s = Stream_StaticInit(&sbuffer, buffer, 
sizeof(buffer));
 
   44  if (!freerdp_write_four_byte_signed_integer(s, value))
 
   46    (void)fprintf(stderr, 
"[%s(%" PRId32 
")] failed to write to stream\n", __func__, value);
 
   49  if (!Stream_SetPosition(s, 0))
 
   51    (void)fprintf(stderr, 
"[%s(%" PRId32 
")] failed to reset stream position\n", __func__,
 
   55  if (!freerdp_read_four_byte_signed_integer(s, &rvalue))
 
   57    (void)fprintf(stderr, 
"[%s(%" PRId32 
")] failed to read from stream\n", __func__, value);
 
   62    (void)fprintf(stderr, 
"[%s(%" PRId32 
")] read invalid value %" PRId32 
" from stream\n",
 
   63                  __func__, value, rvalue);
 
   69static BOOL test_signed_integer_write_oor(INT32 value)
 
   71  BYTE buffer[32] = { 0 };
 
   73  wStream* s = Stream_StaticInit(&sbuffer, buffer, 
sizeof(buffer));
 
   76  if (freerdp_write_four_byte_signed_integer(s, value))
 
   79                  "[%s(%" PRId32 
")] out of range value not detected and written to stream\n",
 
   86static BOOL test_signed_integers(
void)
 
   88  const INT32 outofrange[] = { FREERDP_FOUR_BYTE_SIGNED_INT_MAX + 1,
 
   89                             FREERDP_FOUR_BYTE_SIGNED_INT_MIN - 1, INT32_MAX, INT32_MIN };
 
   90  const INT32 limits[] = { 1, 0, -1, FREERDP_FOUR_BYTE_SIGNED_INT_MAX,
 
   91                         FREERDP_FOUR_BYTE_SIGNED_INT_MIN };
 
   93  for (
size_t x = 0; x < ARRAYSIZE(limits); x++)
 
   95    if (!test_signed_integer_read_write_equal(limits[x]))
 
   98  for (
size_t x = 0; x < ARRAYSIZE(outofrange); x++)
 
  100    if (!test_signed_integer_write_oor(outofrange[x]))
 
  103  for (
size_t x = 0; x < 100000; x++)
 
  106    winpr_RAND(&val, 
sizeof(val));
 
  108    val = MIN(val, FREERDP_FOUR_BYTE_SIGNED_INT_MAX);
 
  110    const INT32 nval = -val;
 
  111    if (!test_signed_integer_read_write_equal(val))
 
  113    if (!test_signed_integer_read_write_equal(nval))
 
  119static BOOL test_float_read_write_equal(
double value)
 
  122  double rvalue = FP_NAN;
 
  123  BYTE buffer[32] = { 0 };
 
  125  wStream* s = Stream_StaticInit(&sbuffer, buffer, 
sizeof(buffer));
 
  128  if (!freerdp_write_four_byte_float(s, value))
 
  130    (void)fprintf(stderr, 
"[%s(%lf)] failed to write to stream\n", __func__, value);
 
  133  if (!Stream_SetPosition(s, 0))
 
  135    (void)fprintf(stderr, 
"[%s(%lf)] failed to reset stream position\n", __func__, value);
 
  138  if (!freerdp_read_four_byte_float_exp(s, &rvalue, &exp))
 
  140    (void)fprintf(stderr, 
"[%s(%lf)] failed to read from stream\n", __func__, value);
 
  143  const double diff = fabs(value - rvalue);
 
  144  const double expdiff = diff * pow(10, exp);
 
  147    (void)fprintf(stderr, 
"[%s(%lf)] read invalid value %lf from stream\n", __func__, value,
 
  154static BOOL test_floag_write_oor(
double value)
 
  156  BYTE buffer[32] = { 0 };
 
  158  wStream* s = Stream_StaticInit(&sbuffer, buffer, 
sizeof(buffer));
 
  161  if (freerdp_write_four_byte_float(s, value))
 
  163    (void)fprintf(stderr, 
"[%s(%lf)] out of range value not detected and written to stream\n",
 
  170static double get(
void)
 
  175    winpr_RAND(&val, 
sizeof(val));
 
  176  } 
while ((val < 0.0) || (val > FREERDP_FOUR_BYTE_FLOAT_MAX) || isnan(val) || isinf(val));
 
  180static BOOL test_floats(
void)
 
  182  const double outofrange[] = { FREERDP_FOUR_BYTE_FLOAT_MAX + 1, FREERDP_FOUR_BYTE_FLOAT_MIN - 1,
 
  184  const double limits[] = { 100045.26129238126,         1, 0, -1, FREERDP_FOUR_BYTE_FLOAT_MAX,
 
  185                          FREERDP_FOUR_BYTE_FLOAT_MIN };
 
  187  for (
size_t x = 0; x < ARRAYSIZE(limits); x++)
 
  189    if (!test_float_read_write_equal(limits[x]))
 
  192  for (
size_t x = 0; x < ARRAYSIZE(outofrange); x++)
 
  194    if (!test_floag_write_oor(outofrange[x]))
 
  197  for (
size_t x = 0; x < 100000; x++)
 
  201    const double nval = -val;
 
  202    if (!test_float_read_write_equal(val))
 
  204    if (!test_float_read_write_equal(nval))
 
  210int TestEncodedTypes(
int argc, 
char* argv[])
 
  215  if (!test_signed_integers())