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] = WINPR_C_ARRAY_INIT;
40 wStream sbuffer = WINPR_C_ARRAY_INIT;
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 Stream_ResetPosition(s);
51 if (!freerdp_read_four_byte_signed_integer(s, &rvalue))
53 (void)fprintf(stderr,
"[%s(%" PRId32
")] failed to read from stream\n", __func__, value);
58 (void)fprintf(stderr,
"[%s(%" PRId32
")] read invalid value %" PRId32
" from stream\n",
59 __func__, value, rvalue);
65static BOOL test_signed_integer_write_oor(INT32 value)
67 BYTE buffer[32] = WINPR_C_ARRAY_INIT;
68 wStream sbuffer = WINPR_C_ARRAY_INIT;
69 wStream* s = Stream_StaticInit(&sbuffer, buffer,
sizeof(buffer));
72 if (freerdp_write_four_byte_signed_integer(s, value))
75 "[%s(%" PRId32
")] out of range value not detected and written to stream\n",
82static BOOL test_signed_integers(
void)
84 const INT32 outofrange[] = { FREERDP_FOUR_BYTE_SIGNED_INT_MAX + 1,
85 FREERDP_FOUR_BYTE_SIGNED_INT_MIN - 1, INT32_MAX, INT32_MIN };
86 const INT32 limits[] = { 1, 0, -1, FREERDP_FOUR_BYTE_SIGNED_INT_MAX,
87 FREERDP_FOUR_BYTE_SIGNED_INT_MIN };
89 for (
size_t x = 0; x < ARRAYSIZE(limits); x++)
91 if (!test_signed_integer_read_write_equal(limits[x]))
94 for (
size_t x = 0; x < ARRAYSIZE(outofrange); x++)
96 if (!test_signed_integer_write_oor(outofrange[x]))
99 for (
size_t x = 0; x < 100000; x++)
102 if (winpr_RAND(&val,
sizeof(val)) < 0)
105 val = MIN(val, FREERDP_FOUR_BYTE_SIGNED_INT_MAX);
107 const INT32 nval = -val;
108 if (!test_signed_integer_read_write_equal(val))
110 if (!test_signed_integer_read_write_equal(nval))
116static BOOL test_float_read_write_equal(
double value)
119 double rvalue = FP_NAN;
120 BYTE buffer[32] = WINPR_C_ARRAY_INIT;
121 wStream sbuffer = WINPR_C_ARRAY_INIT;
122 wStream* s = Stream_StaticInit(&sbuffer, buffer,
sizeof(buffer));
125 if (!freerdp_write_four_byte_float(s, value))
127 (void)fprintf(stderr,
"[%s(%lf)] failed to write to stream\n", __func__, value);
130 Stream_ResetPosition(s);
132 if (!freerdp_read_four_byte_float_exp(s, &rvalue, &exp))
134 (void)fprintf(stderr,
"[%s(%lf)] failed to read from stream\n", __func__, value);
137 const double diff = fabs(value - rvalue);
138 const double expdiff = diff * pow(10, exp);
141 (void)fprintf(stderr,
"[%s(%lf)] read invalid value %lf from stream\n", __func__, value,
148static BOOL test_floag_write_oor(
double value)
150 BYTE buffer[32] = WINPR_C_ARRAY_INIT;
151 wStream sbuffer = WINPR_C_ARRAY_INIT;
152 wStream* s = Stream_StaticInit(&sbuffer, buffer,
sizeof(buffer));
155 if (freerdp_write_four_byte_float(s, value))
157 (void)fprintf(stderr,
"[%s(%lf)] out of range value not detected and written to stream\n",
164static double get(
void)
169 if (winpr_RAND(&val,
sizeof(val)) < 0)
174 }
while ((val < 0.0) || (val > FREERDP_FOUR_BYTE_FLOAT_MAX) || isnan(val) || isinf(val));
178static BOOL test_floats(
void)
180 const double outofrange[] = { FREERDP_FOUR_BYTE_FLOAT_MAX + 1, FREERDP_FOUR_BYTE_FLOAT_MIN - 1,
182 const double limits[] = { 100045.26129238126, 1, 0, -1, FREERDP_FOUR_BYTE_FLOAT_MAX,
183 FREERDP_FOUR_BYTE_FLOAT_MIN };
185 for (
size_t x = 0; x < ARRAYSIZE(limits); x++)
187 if (!test_float_read_write_equal(limits[x]))
190 for (
size_t x = 0; x < ARRAYSIZE(outofrange); x++)
192 if (!test_floag_write_oor(outofrange[x]))
195 for (
size_t x = 0; x < 100000; x++)
199 const double nval = -val;
200 if (!test_float_read_write_equal(val))
202 if (!test_float_read_write_equal(nval))
208int TestEncodedTypes(
int argc,
char* argv[])
213 if (!test_signed_integers())