Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 15 Oct 2024 23:15:16 GMT
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: ac77b2621508 - main - tests: Test endian.h, byteswap.h, sys/endian.h and both endian.h and byteswap.h together
Message-ID:  <202410152315.49FNFGER024700@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=ac77b2621508c6a50ab01d07fe8d43795d908f05

commit ac77b2621508c6a50ab01d07fe8d43795d908f05
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2024-10-15 23:14:42 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2024-10-15 23:14:42 +0000

    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
---
 tests/include/Makefile                 |   6 ++
 tests/include/byteswap_endian_test.c   |   9 +++
 tests/include/byteswap_test.c          |  76 ++++++++++++++++++
 tests/include/endian_sys_endian_test.c |  13 +++
 tests/include/endian_test.c            | 139 +++++++++++++++++++++++++++++++++
 tests/include/sys_endian_endian_test.c |  12 +++
 tests/include/sys_endian_test.c        | 136 ++++++++++++++++++++++++++++++++
 7 files changed, 391 insertions(+)

diff --git a/tests/include/Makefile b/tests/include/Makefile
index e98d08da1f2b..0f6ef88f9e35 100644
--- a/tests/include/Makefile
+++ b/tests/include/Makefile
@@ -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>
diff --git a/tests/include/byteswap_endian_test.c b/tests/include/byteswap_endian_test.c
new file mode 100644
index 000000000000..012c1b5c447e
--- /dev/null
+++ b/tests/include/byteswap_endian_test.c
@@ -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"
diff --git a/tests/include/byteswap_test.c b/tests/include/byteswap_test.c
new file mode 100644
index 000000000000..ed23351e689b
--- /dev/null
+++ b/tests/include/byteswap_test.c
@@ -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();
+}
diff --git a/tests/include/endian_sys_endian_test.c b/tests/include/endian_sys_endian_test.c
new file mode 100644
index 000000000000..9c7829c94b1f
--- /dev/null
+++ b/tests/include/endian_sys_endian_test.c
@@ -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"
diff --git a/tests/include/endian_test.c b/tests/include/endian_test.c
new file mode 100644
index 000000000000..2431b54535a2
--- /dev/null
+++ b/tests/include/endian_test.c
@@ -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();
+}
diff --git a/tests/include/sys_endian_endian_test.c b/tests/include/sys_endian_endian_test.c
new file mode 100644
index 000000000000..4d668f8d5625
--- /dev/null
+++ b/tests/include/sys_endian_endian_test.c
@@ -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"
diff --git a/tests/include/sys_endian_test.c b/tests/include/sys_endian_test.c
new file mode 100644
index 000000000000..5a5f77526832
--- /dev/null
+++ b/tests/include/sys_endian_test.c
@@ -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();
+}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202410152315.49FNFGER024700>