diff --git a/tests/unittests/tests-libc/tests-libc.c b/tests/unittests/tests-libc/tests-libc.c index 1f0a081919..82796c312c 100644 --- a/tests/unittests/tests-libc/tests-libc.c +++ b/tests/unittests/tests-libc/tests-libc.c @@ -8,6 +8,7 @@ #include #include +#include #include "string_utils.h" #include "tests-libc.h" @@ -39,11 +40,64 @@ static void test_libc_memchk(void) TEST_ASSERT(memchk(buffer, 0xff, sizeof(buffer)) == &buffer[5]); } +/** + * @name Unit test ensuring `` is provided and correct across + * all platforms + * @{ + */ +union u16 { + uint8_t as_bytes[2]; + uint16_t as_number; +}; + +union u32 { + uint8_t as_bytes[4]; + uint32_t as_number; +}; + +union u64 { + uint8_t as_bytes[8]; + uint64_t as_number; +}; + +static void test_libc_endian(void) +{ + /* format the numbers 0x0102, 0x01020304 and 0x0102030405060708 + * in little/big endian format by hand: */ + const uint16_t u16_host = 0x0102; + const union u16 u16_be = { .as_bytes = { 0x01, 0x02 } }; + const union u16 u16_le = { .as_bytes = { 0x02, 0x01 } }; + const uint32_t u32_host = 0x01020304; + const union u32 u32_be = { .as_bytes = { 0x01, 0x02, 0x03, 0x04 } }; + const union u32 u32_le = { .as_bytes = { 0x04, 0x03, 0x02, 0x01 } }; + const uint64_t u64_host = 0x0102030405060708; + const union u64 u64_be = { .as_bytes = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 } }; + const union u64 u64_le = { .as_bytes = { 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01 } }; + + /* check from host to big/little endian */ + TEST_ASSERT_EQUAL_INT(htobe16(u16_host), u16_be.as_number); + TEST_ASSERT_EQUAL_INT(htole16(u16_host), u16_le.as_number); + TEST_ASSERT_EQUAL_INT(htobe32(u32_host), u32_be.as_number); + TEST_ASSERT_EQUAL_INT(htole32(u32_host), u32_le.as_number); + TEST_ASSERT_EQUAL_INT(htobe64(u64_host), u64_be.as_number); + TEST_ASSERT_EQUAL_INT(htole64(u64_host), u64_le.as_number); + + /* check little/big endian to host */ + TEST_ASSERT_EQUAL_INT(be16toh(u16_be.as_number), u16_host); + TEST_ASSERT_EQUAL_INT(le16toh(u16_le.as_number), u16_host); + TEST_ASSERT_EQUAL_INT(be32toh(u32_be.as_number), u32_host); + TEST_ASSERT_EQUAL_INT(le32toh(u32_le.as_number), u32_host); + TEST_ASSERT_EQUAL_INT(be64toh(u64_be.as_number), u64_host); + TEST_ASSERT_EQUAL_INT(le64toh(u64_le.as_number), u64_host); +} +/** @} */ + Test *tests_libc_tests(void) { EMB_UNIT_TESTFIXTURES(fixtures) { new_TestFixture(test_libc_strscpy), new_TestFixture(test_libc_memchk), + new_TestFixture(test_libc_endian), }; EMB_UNIT_TESTCALLER(libc_tests, NULL, NULL, fixtures);