mirror of
https://git.FreeBSD.org/src.git
synced 2024-11-21 07:15:49 +00:00
tests: Test endian.h, byteswap.h, sys/endian.h and both endian.h and byteswap.h together
What's required and not required to be defined is complicated. Write tests to enshrine it: endian.h and sys/endian.h: [bl]e{16,32,64}toh hto[bl]e{16,32,64} byteswap.h: {__,}bswap_{16,32,64} sys/endian.h: {__,}bswap{16,32,64} _BYTE_ORDER _BIG_ENDIAN _LITTLE_ENDIAN _PDP_ENDIAN endian.h: __BYTE_ORDER __BIG_ENDIAN __LITTLE_ENDIAN __PDP_ENDIAN __FLOAT_WORD_ORDER We also ensure that the sys/endian.h conditions hold true when we include both endian.h and sys/endian.h in either order. NOT TESTED: deprecated symbols, internal to glibc symbols Sponsored by: Netflix Discussed with: markj (made the changes he requested) Differential Revision: https://reviews.freebsd.org/D32052
This commit is contained in:
parent
9dbff03c34
commit
ac77b26215
@ -2,6 +2,12 @@
|
||||
|
||||
TESTSDIR= ${TESTSBASE}/include
|
||||
|
||||
ATF_TESTS_C+= byteswap_test
|
||||
ATF_TESTS_C+= byteswap_endian_test
|
||||
ATF_TESTS_C+= endian_test
|
||||
ATF_TESTS_C+= endian_sys_endian_test
|
||||
ATF_TESTS_C+= stdckdint_test
|
||||
ATF_TESTS_C+= sys_endian_test
|
||||
ATF_TESTS_C+= sys_endian_endian_test
|
||||
|
||||
.include <bsd.test.mk>
|
||||
|
9
tests/include/byteswap_endian_test.c
Normal file
9
tests/include/byteswap_endian_test.c
Normal file
@ -0,0 +1,9 @@
|
||||
/*-
|
||||
* Copyright (c) 2021 M. Warner Losh <imp@FreeBSD.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
/* Make sure this still passes if both endian.h and byteswap.h included */
|
||||
#include <endian.h>
|
||||
#include "byteswap_test.c"
|
76
tests/include/byteswap_test.c
Normal file
76
tests/include/byteswap_test.c
Normal file
@ -0,0 +1,76 @@
|
||||
/*-
|
||||
* Copyright (c) 2021 M. Warner Losh <imp@FreeBSD.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <byteswap.h>
|
||||
|
||||
#include <atf-c.h>
|
||||
|
||||
ATF_TC(byteswap);
|
||||
ATF_TC_HEAD(byteswap, tc)
|
||||
{
|
||||
atf_tc_set_md_var(tc, "descr", "Test swapping macros in <byteswap.h>");
|
||||
}
|
||||
|
||||
ATF_TC_BODY(byteswap, tc)
|
||||
{
|
||||
uint16_t ui16;
|
||||
uint32_t ui32;
|
||||
uint64_t ui64;
|
||||
|
||||
/* glibc defines the {__,}bswap_{16,32,64} */
|
||||
#ifndef __bswap_16
|
||||
atf_tc_fail_nonfatal("__bswap_16 not defined");
|
||||
#endif
|
||||
#ifndef bswap_16
|
||||
atf_tc_fail_nonfatal("bswap_16 not defined");
|
||||
#endif
|
||||
#ifndef __bswap_32
|
||||
atf_tc_fail_nonfatal("__bswap_32 not defined");
|
||||
#endif
|
||||
#ifndef bswap_32
|
||||
atf_tc_fail_nonfatal("bswap_32 not defined");
|
||||
#endif
|
||||
#ifndef __bswap_64
|
||||
atf_tc_fail_nonfatal("__bswap_64 not defined");
|
||||
#endif
|
||||
#ifndef bswap_64
|
||||
atf_tc_fail_nonfatal("bswap_64 not defined");
|
||||
#endif
|
||||
|
||||
/* glibc does not define bswap{16,32,64} */
|
||||
#ifdef bswap16
|
||||
atf_tc_fail_nonfatal("bswap16 improperly defined");
|
||||
#endif
|
||||
#ifdef bswap32
|
||||
atf_tc_fail_nonfatal("bswap32 improperly defined");
|
||||
#endif
|
||||
#ifdef bswap64
|
||||
atf_tc_fail_nonfatal("bswap64 improperly defined");
|
||||
#endif
|
||||
|
||||
ui16 = 0x1234;
|
||||
ATF_REQUIRE_MSG(0x3412 == bswap_16(ui16),
|
||||
"bswap16(%#x) != 0x3412 instead %#x\n", ui16, bswap_16(ui16));
|
||||
|
||||
ui32 = 0x12345678ul;
|
||||
ATF_REQUIRE_MSG(0x78563412ul == bswap_32(ui32),
|
||||
"bswap32(%#lx) != 0x78563412 instead %#lx\n",
|
||||
(unsigned long)ui32, (unsigned long)bswap_32(ui32));
|
||||
|
||||
ui64 = 0x123456789abcdef0ull;
|
||||
ATF_REQUIRE_MSG(0xf0debc9a78563412ull == bswap_64(ui64),
|
||||
"bswap64(%#llx) != 0x3412 instead %#llx\n",
|
||||
(unsigned long long)ui64, (unsigned long long)bswap_64(ui64));
|
||||
|
||||
}
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
{
|
||||
|
||||
ATF_TP_ADD_TC(tp, byteswap);
|
||||
|
||||
return atf_no_error();
|
||||
}
|
13
tests/include/endian_sys_endian_test.c
Normal file
13
tests/include/endian_sys_endian_test.c
Normal file
@ -0,0 +1,13 @@
|
||||
/*-
|
||||
* Copyright (c) 2021 M. Warner Losh <imp@FreeBSD.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
/*
|
||||
* Make sure this still passes if both endian.h and sys/endian.h are included
|
||||
* with sys/endian.h first
|
||||
*/
|
||||
#include <sys/endian.h>
|
||||
#include <endian.h>
|
||||
#include "sys_endian_test.c"
|
139
tests/include/endian_test.c
Normal file
139
tests/include/endian_test.c
Normal file
@ -0,0 +1,139 @@
|
||||
/*-
|
||||
* Copyright (c) 2021 M. Warner Losh <imp@FreeBSD.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <endian.h>
|
||||
|
||||
#include <atf-c.h>
|
||||
|
||||
ATF_TC(endian);
|
||||
ATF_TC_HEAD(endian, tc)
|
||||
{
|
||||
atf_tc_set_md_var(tc, "descr", "Test swapping macros in <byteswap.h>");
|
||||
}
|
||||
|
||||
ATF_TC_BODY(endian, tc)
|
||||
{
|
||||
/* glibc doesn't define the {__,}bswap_{16,32,64} */
|
||||
#ifdef __bswap_16
|
||||
atf_tc_fail_nonfatal("__bswap_16 improperly defined");
|
||||
#endif
|
||||
#ifdef bswap_16
|
||||
atf_tc_fail_nonfatal("bswap_16 improperly defined");
|
||||
#endif
|
||||
#ifdef __bswap_32
|
||||
atf_tc_fail_nonfatal("__bswap_32 improperly defined");
|
||||
#endif
|
||||
#ifdef bswap_32
|
||||
atf_tc_fail_nonfatal("bswap_32 improperly defined");
|
||||
#endif
|
||||
#ifdef __bswap_64
|
||||
atf_tc_fail_nonfatal("__bswap_64 improperly defined");
|
||||
#endif
|
||||
#ifdef bswap_64
|
||||
atf_tc_fail_nonfatal("bswap_64 improperly defined");
|
||||
#endif
|
||||
|
||||
/* glibc doesn't define bswap{16,32,64} */
|
||||
#ifdef bswap16
|
||||
atf_tc_fail_nonfatal("bswap16 improperly defined");
|
||||
#endif
|
||||
#ifdef bswap32
|
||||
atf_tc_fail_nonfatal("bswap32 improperly defined");
|
||||
#endif
|
||||
#ifdef bswap64
|
||||
atf_tc_fail_nonfatal("bswap64 improperly defined");
|
||||
#endif
|
||||
|
||||
/*
|
||||
* glibc defines with two underscores. We don't test for only one since
|
||||
* that doesn't interfere.
|
||||
*/
|
||||
#ifndef __BIG_ENDIAN
|
||||
atf_tc_fail_nonfatal("__BIG_ENDIAN not defined");
|
||||
#endif
|
||||
#ifndef __LITTLE_ENDIAN
|
||||
atf_tc_fail_nonfatal("__LITTLE_ENDIAN not defined");
|
||||
#endif
|
||||
#ifndef __PDP_ENDIAN
|
||||
atf_tc_fail_nonfatal("__PDP_ENDIAN not defined");
|
||||
#endif
|
||||
#ifndef __FLOAT_WORD_ORDER
|
||||
atf_tc_fail_nonfatal("__FLOAT_WORD_ORDER not defined");
|
||||
#endif
|
||||
#ifndef __BYTE_ORDER
|
||||
atf_tc_fail_nonfatal("__BYTE_ORDER not defined");
|
||||
#endif
|
||||
|
||||
/* order to host */
|
||||
#ifdef __BYTE_ORDER
|
||||
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||
#define H16(x) be16toh(x)
|
||||
#define H32(x) be32toh(x)
|
||||
#define H64(x) be64toh(x)
|
||||
#define O16(x) le16toh(x)
|
||||
#define O32(x) le32toh(x)
|
||||
#define O64(x) le64toh(x)
|
||||
#else
|
||||
#define H16(x) le16toh(x)
|
||||
#define H32(x) le32toh(x)
|
||||
#define H64(x) le64toh(x)
|
||||
#define O16(x) be16toh(x)
|
||||
#define O32(x) be32toh(x)
|
||||
#define O64(x) be64toh(x)
|
||||
#endif
|
||||
#endif
|
||||
ATF_REQUIRE(H16(0x1234) == 0x1234);
|
||||
ATF_REQUIRE(H32(0x12345678ul) == 0x12345678ul);
|
||||
ATF_REQUIRE(H64(0x123456789abcdef0ull) == 0x123456789abcdef0ull);
|
||||
ATF_REQUIRE(O16(0x1234) == __bswap16(0x1234));
|
||||
ATF_REQUIRE(O32(0x12345678ul) == __bswap32(0x12345678ul));
|
||||
ATF_REQUIRE(O64(0x123456789abcdef0ull) == __bswap64(0x123456789abcdef0ull));
|
||||
#undef H16
|
||||
#undef H32
|
||||
#undef H64
|
||||
#undef O16
|
||||
#undef O32
|
||||
#undef O64
|
||||
|
||||
/* host to order */
|
||||
#ifdef __BYTE_ORDER
|
||||
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||
#define H16(x) htobe16(x)
|
||||
#define H32(x) htobe32(x)
|
||||
#define H64(x) htobe64(x)
|
||||
#define O16(x) htole16(x)
|
||||
#define O32(x) htole32(x)
|
||||
#define O64(x) htole64(x)
|
||||
#else
|
||||
#define H16(x) htole16(x)
|
||||
#define H32(x) htole32(x)
|
||||
#define H64(x) htole64(x)
|
||||
#define O16(x) htobe16(x)
|
||||
#define O32(x) htobe32(x)
|
||||
#define O64(x) htobe64(x)
|
||||
#endif
|
||||
#endif
|
||||
ATF_REQUIRE(H16(0x1234) == 0x1234);
|
||||
ATF_REQUIRE(H32(0x12345678ul) == 0x12345678ul);
|
||||
ATF_REQUIRE(H64(0x123456789abcdef0ull) == 0x123456789abcdef0ull);
|
||||
ATF_REQUIRE(O16(0x1234) == __bswap16(0x1234));
|
||||
ATF_REQUIRE(O32(0x12345678ul) == __bswap32(0x12345678ul));
|
||||
ATF_REQUIRE(O64(0x123456789abcdef0ull) == __bswap64(0x123456789abcdef0ull));
|
||||
#undef H16
|
||||
#undef H32
|
||||
#undef H64
|
||||
#undef O16
|
||||
#undef O32
|
||||
#undef O64
|
||||
}
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
{
|
||||
|
||||
ATF_TP_ADD_TC(tp, endian);
|
||||
|
||||
return atf_no_error();
|
||||
}
|
12
tests/include/sys_endian_endian_test.c
Normal file
12
tests/include/sys_endian_endian_test.c
Normal file
@ -0,0 +1,12 @@
|
||||
/*-
|
||||
* Copyright (c) 2021 M. Warner Losh <imp@FreeBSD.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
/*
|
||||
* Make sure this still passes if both endian.h and sys/endian.h are included
|
||||
* with endian.h first.
|
||||
*/
|
||||
#include <endian.h>
|
||||
#include "sys_endian_test.c"
|
136
tests/include/sys_endian_test.c
Normal file
136
tests/include/sys_endian_test.c
Normal file
@ -0,0 +1,136 @@
|
||||
/*-
|
||||
* Copyright (c) 2021 M. Warner Losh <imp@FreeBSD.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <sys/endian.h>
|
||||
|
||||
#include <atf-c.h>
|
||||
|
||||
ATF_TC(sys_endian);
|
||||
ATF_TC_HEAD(sys_endian, tc)
|
||||
{
|
||||
atf_tc_set_md_var(tc, "descr", "Test swapping macros in <byteswap.h>");
|
||||
}
|
||||
|
||||
ATF_TC_BODY(sys_endian, tc)
|
||||
{
|
||||
/* FreeBSD sys/endian.h doesn't define the {__,}bswap_{16,32,64} */
|
||||
#ifdef __bswap_16
|
||||
atf_tc_fail_nonfatal("__bswap_16 defined");
|
||||
#endif
|
||||
#ifdef bswap_16
|
||||
atf_tc_fail_nonfatal("bswap_16 defined");
|
||||
#endif
|
||||
#ifdef __bswap_32
|
||||
atf_tc_fail_nonfatal("__bswap_32 defined");
|
||||
#endif
|
||||
#ifdef bswap_32
|
||||
atf_tc_fail_nonfatal("bswap_32 defined");
|
||||
#endif
|
||||
#ifdef __bswap_64
|
||||
atf_tc_fail_nonfatal("__bswap_64 defined");
|
||||
#endif
|
||||
#ifdef bswap_64
|
||||
atf_tc_fail_nonfatal("bswap_64 defined");
|
||||
#endif
|
||||
|
||||
/* FreeBSD sys/endian.h does define bswap{16,32,64} */
|
||||
#ifndef bswap16
|
||||
atf_tc_fail_nonfatal("bswap16 not defined");
|
||||
#endif
|
||||
#ifndef bswap32
|
||||
atf_tc_fail_nonfatal("bswap32 not defined");
|
||||
#endif
|
||||
#ifndef bswap64
|
||||
atf_tc_fail_nonfatal("bswap64 not defined");
|
||||
#endif
|
||||
|
||||
/*
|
||||
* FreeBSD defines with one underscore
|
||||
* We don't test for two since that doesn't interfere
|
||||
*/
|
||||
#ifndef _BIG_ENDIAN
|
||||
atf_tc_fail_nonfatal("_BIG_ENDIAN not defined");
|
||||
#endif
|
||||
#ifndef _LITTLE_ENDIAN
|
||||
atf_tc_fail_nonfatal("_LITTLE_ENDIAN not defined");
|
||||
#endif
|
||||
#ifndef _PDP_ENDIAN
|
||||
atf_tc_fail_nonfatal("_PDP_ENDIAN not defined");
|
||||
#endif
|
||||
#ifndef _BYTE_ORDER
|
||||
atf_tc_fail_nonfatal("_BYTE_ORDER not defined");
|
||||
#endif
|
||||
|
||||
/* order to host */
|
||||
#ifdef _BYTE_ORDER
|
||||
#if _BYTE_ORDER == _BIG_ENDIAN
|
||||
#define H16(x) be16toh(x)
|
||||
#define H32(x) be32toh(x)
|
||||
#define H64(x) be64toh(x)
|
||||
#define O16(x) le16toh(x)
|
||||
#define O32(x) le32toh(x)
|
||||
#define O64(x) le64toh(x)
|
||||
#else
|
||||
#define H16(x) le16toh(x)
|
||||
#define H32(x) le32toh(x)
|
||||
#define H64(x) le64toh(x)
|
||||
#define O16(x) be16toh(x)
|
||||
#define O32(x) be32toh(x)
|
||||
#define O64(x) be64toh(x)
|
||||
#endif
|
||||
#endif
|
||||
ATF_REQUIRE(H16(0x1234) == 0x1234);
|
||||
ATF_REQUIRE(H32(0x12345678ul) == 0x12345678ul);
|
||||
ATF_REQUIRE(H64(0x123456789abcdef0ull) == 0x123456789abcdef0ull);
|
||||
ATF_REQUIRE(O16(0x1234) == __bswap16(0x1234));
|
||||
ATF_REQUIRE(O32(0x12345678ul) == __bswap32(0x12345678ul));
|
||||
ATF_REQUIRE(O64(0x123456789abcdef0ull) == __bswap64(0x123456789abcdef0ull));
|
||||
#undef H16
|
||||
#undef H32
|
||||
#undef H64
|
||||
#undef O16
|
||||
#undef O32
|
||||
#undef O64
|
||||
|
||||
/* host to order */
|
||||
#ifdef _BYTE_ORDER
|
||||
#if _BYTE_ORDER == _BIG_ENDIAN
|
||||
#define H16(x) htobe16(x)
|
||||
#define H32(x) htobe32(x)
|
||||
#define H64(x) htobe64(x)
|
||||
#define O16(x) htole16(x)
|
||||
#define O32(x) htole32(x)
|
||||
#define O64(x) htole64(x)
|
||||
#else
|
||||
#define H16(x) htole16(x)
|
||||
#define H32(x) htole32(x)
|
||||
#define H64(x) htole64(x)
|
||||
#define O16(x) htobe16(x)
|
||||
#define O32(x) htobe32(x)
|
||||
#define O64(x) htobe64(x)
|
||||
#endif
|
||||
#endif
|
||||
ATF_REQUIRE(H16(0x1234) == 0x1234);
|
||||
ATF_REQUIRE(H32(0x12345678ul) == 0x12345678ul);
|
||||
ATF_REQUIRE(H64(0x123456789abcdef0ull) == 0x123456789abcdef0ull);
|
||||
ATF_REQUIRE(O16(0x1234) == __bswap16(0x1234));
|
||||
ATF_REQUIRE(O32(0x12345678ul) == __bswap32(0x12345678ul));
|
||||
ATF_REQUIRE(O64(0x123456789abcdef0ull) == __bswap64(0x123456789abcdef0ull));
|
||||
#undef H16
|
||||
#undef H32
|
||||
#undef H64
|
||||
#undef O16
|
||||
#undef O32
|
||||
#undef O64
|
||||
}
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
{
|
||||
|
||||
ATF_TP_ADD_TC(tp, sys_endian);
|
||||
|
||||
return atf_no_error();
|
||||
}
|
Loading…
Reference in New Issue
Block a user