unittest: Rewrite the INTEGER unittests to use macros and avoid code duplication

This commit is contained in:
Jakub Jelen 2019-11-05 16:03:09 +01:00
parent aaa302ca35
commit 71e45bb5a7
1 changed files with 87 additions and 134 deletions

View File

@ -170,139 +170,78 @@ static void torture_oid(void **state)
/* TODO SC_MAX_OBJECT_ID_OCTETS */
}
static void torture_integer(void **state)
{
/* Without the Tag and Length {0x02, 0x01} */
u8 null[] = {};
u8 padded_zero[] = {0x00, 0x00};
u8 zero[] = {0x00};
u8 one[] = {0x01};
u8 minus_one[] = {0xFF};
u8 padded_one[] = {0x00, 0x01};
u8 padded_minus_one[] = {0xFF, 0xFF};
u8 padded_127[] = {0x00, 0x7F};
u8 padded_128[] = {0x00, 0x80};
u8 max2[] = {0x7F, 0xFF};
u8 min2[] = {0x80, 0x00};
u8 max4[] = {0x7F, 0xFF, 0xFF, 0xFF};
u8 min4[] = {0x80, 0x00, 0x00, 0x00};
u8 over[] = {0x7F, 0xFF, 0xFF, 0xFF, 0xFF};
int value;
u8 *buf = NULL;
size_t buflen = 0;
int rv = 0;
rv = sc_asn1_decode_integer(null, sizeof(null), &value, 1);
assert_int_equal(rv, SC_ERROR_INVALID_ASN1_OBJECT);
rv = sc_asn1_decode_integer(padded_zero, sizeof(padded_zero), &value, 1);
assert_int_equal(rv, SC_ERROR_INVALID_ASN1_OBJECT);
rv = sc_asn1_decode_integer(padded_one, sizeof(padded_one), &value, 1);
assert_int_equal(rv, SC_ERROR_INVALID_ASN1_OBJECT);
/* but we can parse them without the strict checking */
rv = sc_asn1_decode_integer(padded_one, sizeof(padded_one), &value, 0);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(value, 1);
rv = sc_asn1_decode_integer(padded_minus_one, sizeof(padded_minus_one), &value, 1);
assert_int_equal(rv, SC_ERROR_INVALID_ASN1_OBJECT);
/* but we can parse them without the strict checking */
rv = sc_asn1_decode_integer(padded_minus_one, sizeof(padded_minus_one), &value, 0);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(value, -1);
rv = sc_asn1_decode_integer(padded_127, sizeof(padded_127), &value, 1);
assert_int_equal(rv, SC_ERROR_INVALID_ASN1_OBJECT);
/* but we can parse them without the strict checking */
rv = sc_asn1_decode_integer(padded_127, sizeof(padded_127), &value, 0);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(value, 127);
rv = sc_asn1_decode_integer(padded_128, sizeof(padded_128), &value, 1);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(value, 128);
rv = asn1_encode_integer(value, &buf, &buflen);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(buflen, sizeof(padded_128));
assert_memory_equal(buf, padded_128, buflen);
free(buf);
rv = sc_asn1_decode_integer(zero, sizeof(zero), &value, 1);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(value, 0);
rv = asn1_encode_integer(value, &buf, &buflen);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(buflen, sizeof(zero));
assert_memory_equal(buf, zero, buflen);
free(buf);
rv = sc_asn1_decode_integer(one, sizeof(one), &value, 1);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(value, 1);
rv = asn1_encode_integer(value, &buf, &buflen);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(buflen, sizeof(one));
assert_memory_equal(buf, one, buflen);
free(buf);
rv = sc_asn1_decode_integer(minus_one, sizeof(minus_one), &value, 1);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(value, -1);
rv = asn1_encode_integer(value, &buf, &buflen);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(buflen, sizeof(minus_one));
assert_memory_equal(buf, minus_one, buflen);
free(buf);
rv = sc_asn1_decode_integer(max2, sizeof(max2), &value, 1);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(value, 32767);
rv = asn1_encode_integer(value, &buf, &buflen);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(buflen, sizeof(max2));
assert_memory_equal(buf, max2, buflen);
free(buf);
rv = sc_asn1_decode_integer(min2, sizeof(min2), &value, 1);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(value, -32768);
rv = asn1_encode_integer(value, &buf, &buflen);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(buflen, sizeof(min2));
assert_memory_equal(buf, min2, buflen);
free(buf);
if (sizeof(int) == 4) {
rv = sc_asn1_decode_integer(max4, sizeof(max4), &value, 1);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(value, 2147483647);
rv = asn1_encode_integer(value, &buf, &buflen);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(buflen, sizeof(max4));
assert_memory_equal(buf, max4, buflen);
free(buf);
rv = sc_asn1_decode_integer(min4, sizeof(min4), &value, 1);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(value, -2147483648);
rv = asn1_encode_integer(value, &buf, &buflen);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(buflen, sizeof(min4));
assert_memory_equal(buf, min4, buflen);
free(buf);
rv = sc_asn1_decode_integer(over, sizeof(over), &value, 1);
assert_int_equal(rv, SC_ERROR_NOT_SUPPORTED);
} else {
/* On more esoteric architectures, we can have different size of int */
rv = sc_asn1_decode_integer(max4, sizeof(max4), &value, 1);
assert_int_equal(rv, SC_ERROR_NOT_SUPPORTED);
rv = sc_asn1_decode_integer(min4, sizeof(min4), &value, 1);
assert_int_equal(rv, SC_ERROR_NOT_SUPPORTED);
#define TORTURE_INTEGER(name, asn1_data, int_value) \
static void torture_asn1_integer_## name (void **state) \
{ \
u8 data[] = asn1_data; \
size_t datalen = sizeof(data) - 1; \
int value = 0; \
int rv; \
u8 *buf = NULL; \
size_t buflen = 0; \
\
rv = sc_asn1_decode_integer(data, datalen, &value, 1); \
assert_int_equal(rv, SC_SUCCESS); \
assert_int_equal(value, int_value); \
rv = asn1_encode_integer(value, &buf, &buflen); \
assert_int_equal(rv, SC_SUCCESS); \
assert_int_equal(buflen, datalen); \
assert_memory_equal(buf, data, buflen); \
free(buf); \
}
}
#define TORTURE_INTEGER_ERROR(name, asn1_data, error) \
static void torture_asn1_integer_## name (void **state) \
{ \
u8 data[] = asn1_data; \
size_t datalen = sizeof(data) - 1; \
int value = 0; \
int rv; \
\
rv = sc_asn1_decode_integer(data, datalen, &value, 1); \
assert_int_equal(rv, error); \
}
#define TORTURE_INTEGER_NONSTRICT(name, asn1_data, error, int_value) \
static void torture_asn1_integer_## name (void **state) \
{ \
u8 data[] = asn1_data; \
size_t datalen = sizeof(data) - 1; \
int value = 0; \
int rv; \
\
rv = sc_asn1_decode_integer(data, datalen, &value, 1); \
assert_int_equal(rv, error); \
/* but we can parse them without the strict checking */ \
rv = sc_asn1_decode_integer(data, datalen, &value, 0); \
assert_int_equal(rv, SC_SUCCESS); \
assert_int_equal(value, int_value); \
}
/* Data are without the Tag (0x02) and Length */
/* Positive test cases, mostly corner cases */
TORTURE_INTEGER(zero, "\x00", 0)
TORTURE_INTEGER(one, "\x01", 1)
TORTURE_INTEGER(minus_one, "\xFF", -1)
TORTURE_INTEGER(padded_128, "\x00\x80", 128)
TORTURE_INTEGER(max2, "\x7F\xFF", 32767)
TORTURE_INTEGER(min2, "\x80\x00", -32768)
#if INT_MAX == 2147483647
TORTURE_INTEGER(max4, "\x7F\xFF\xFF\xFF", 2147483647)
TORTURE_INTEGER(min4, "\x80\x00\x00\x00", -2147483648)
#else
TORTURE_INTEGER_ERROR(max4, "\x7F\xFF\xFF\xFF", SC_ERROR_NOT_SUPPORTED)
TORTURE_INTEGER_ERROR(min4, "\x80\x00\x00\x00", SC_ERROR_NOT_SUPPORTED)
#endif
/* Negative test cases */
TORTURE_INTEGER_ERROR(null, "", SC_ERROR_INVALID_ASN1_OBJECT)
TORTURE_INTEGER_ERROR(over, "\x7F\xFF\xFF\xFF\xFF", SC_ERROR_NOT_SUPPORTED)
/* Tests fail in strict mode, but work otherwise */
TORTURE_INTEGER_NONSTRICT(padded_zero, "\x00\x00", SC_ERROR_INVALID_ASN1_OBJECT, 0)
TORTURE_INTEGER_NONSTRICT(padded_one, "\x00\x01", SC_ERROR_INVALID_ASN1_OBJECT, 1)
TORTURE_INTEGER_NONSTRICT(padded_minus_one, "\xFF\xFF", SC_ERROR_INVALID_ASN1_OBJECT, -1)
TORTURE_INTEGER_NONSTRICT(padded_127, "\x00\x7F", SC_ERROR_INVALID_ASN1_OBJECT, 127)
/*
* Test undefined behavior of negative INTEGERS handling.
@ -375,13 +314,27 @@ static void torture_bit_field(void **state)
rv = decode_bit_field(invalid_padding, sizeof(invalid_padding), (unsigned int *)&value, value_len);
assert_int_equal(rv, SC_ERROR_INVALID_ASN1_OBJECT);
}
int main(void)
{
int rc;
struct CMUnitTest tests[] = {
cmocka_unit_test(torture_large_oid),
cmocka_unit_test(torture_integer),
cmocka_unit_test(torture_asn1_integer_zero),
cmocka_unit_test(torture_asn1_integer_one),
cmocka_unit_test(torture_asn1_integer_minus_one),
cmocka_unit_test(torture_asn1_integer_padded_128),
cmocka_unit_test(torture_asn1_integer_max2),
cmocka_unit_test(torture_asn1_integer_min2),
cmocka_unit_test(torture_asn1_integer_max4),
cmocka_unit_test(torture_asn1_integer_min4),
cmocka_unit_test(torture_asn1_integer_null),
cmocka_unit_test(torture_asn1_integer_over),
cmocka_unit_test(torture_asn1_integer_padded_zero),
cmocka_unit_test(torture_asn1_integer_padded_one),
cmocka_unit_test(torture_asn1_integer_padded_minus_one),
cmocka_unit_test(torture_asn1_integer_padded_127),
cmocka_unit_test(torture_negative_int),
cmocka_unit_test(torture_large_oid),
cmocka_unit_test(torture_oid),
cmocka_unit_test(torture_bit_field),
};