From ea648e70a989cca190cd7403fe892fd2dcc290b4 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 5 May 2024 20:37:14 +0200 Subject: Adding upstream version 1:9.11.5.P4+dfsg. Signed-off-by: Daniel Baumann --- lib/isc/tests/print_test.c | 184 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 lib/isc/tests/print_test.c (limited to 'lib/isc/tests/print_test.c') diff --git a/lib/isc/tests/print_test.c b/lib/isc/tests/print_test.c new file mode 100644 index 0000000..259e301 --- /dev/null +++ b/lib/isc/tests/print_test.c @@ -0,0 +1,184 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +#include + +#include + +#include +#include +#include +#include +#include + +/* + * Workout if we need to force the inclusion of print.c so we can test + * it on all platforms even if we don't include it in libisc. + */ +#include +#if !defined(ISC_PLATFORM_NEEDPRINTF) && \ + !defined(ISC_PLATFORM_NEEDFPRINTF) && \ + !defined(ISC_PLATFORM_NEEDSPRINTF) && \ + !defined(ISC_PLATFORM_NEEDVSNPRINTF) +#define ISC__PRINT_SOURCE +#include "../print.c" +#else +#if !defined(ISC_PLATFORM_NEEDPRINTF) || \ + !defined(ISC_PLATFORM_NEEDFPRINTF) || \ + !defined(ISC_PLATFORM_NEEDSPRINTF) || \ + !defined(ISC_PLATFORM_NEEDVSNPRINTF) +#define ISC__PRINT_SOURCE +#endif +#include +#include +#include +#endif + +ATF_TC(snprintf); +ATF_TC_HEAD(snprintf, tc) { + atf_tc_set_md_var(tc, "descr", "snprintf implementation"); +} +ATF_TC_BODY(snprintf, tc) { + char buf[10000]; + uint64_t ll = 8589934592ULL; + uint64_t nn = 20000000000000ULL; + uint64_t zz = 10000000000000000000ULL; + float pi = 3.141; + int n; + size_t size; + + UNUSED(tc); + + /* + * 4294967296 <= 8589934592 < 1000000000^2 to verify fix for + * RT#36505. + */ + + memset(buf, 0xff, sizeof(buf)); + n = isc_print_snprintf(buf, sizeof(buf), "%" PRIu64, ll); + ATF_CHECK_EQ(n, 10); + ATF_CHECK_STREQ(buf, "8589934592"); + + memset(buf, 0xff, sizeof(buf)); + n = isc_print_snprintf(buf, sizeof(buf), "%" PRIu64, ll); + ATF_CHECK_EQ(n, 10); + ATF_CHECK_STREQ(buf, "8589934592"); + + memset(buf, 0xff, sizeof(buf)); + n = isc_print_snprintf(buf, sizeof(buf), "%" PRIu64, nn); + ATF_CHECK_EQ(n, 14); + ATF_CHECK_STREQ(buf, "20000000000000"); + + memset(buf, 0xff, sizeof(buf)); + n = isc_print_snprintf(buf, sizeof(buf), "%" PRIu64, nn); + ATF_CHECK_EQ(n, 14); + ATF_CHECK_STREQ(buf, "20000000000000"); + + memset(buf, 0xff, sizeof(buf)); + n = isc_print_snprintf(buf, sizeof(buf), "%" PRIu64, zz); + ATF_CHECK_EQ(n, 20); + ATF_CHECK_STREQ(buf, "10000000000000000000"); + + memset(buf, 0xff, sizeof(buf)); + n = isc_print_snprintf(buf, sizeof(buf), "%" PRIu64, zz); + ATF_CHECK_EQ(n, 20); + ATF_CHECK_STREQ(buf, "10000000000000000000"); + + memset(buf, 0xff, sizeof(buf)); + n = isc_print_snprintf(buf, sizeof(buf), "%" PRId64, nn); + ATF_CHECK_EQ(n, 14); + ATF_CHECK_STREQ(buf, "20000000000000"); + + size = 1000; + memset(buf, 0xff, sizeof(buf)); + n = isc_print_snprintf(buf, sizeof(buf), "%zu", size); + ATF_CHECK_EQ(n, 4); + ATF_CHECK_STREQ(buf, "1000"); + + size = 1000; + memset(buf, 0xff, sizeof(buf)); + n = isc_print_snprintf(buf, sizeof(buf), "%zx", size); + ATF_CHECK_EQ(n, 3); + ATF_CHECK_STREQ(buf, "3e8"); + + size = 1000; + memset(buf, 0xff, sizeof(buf)); + n = isc_print_snprintf(buf, sizeof(buf), "%zo", size); + ATF_CHECK_EQ(n, 4); + ATF_CHECK_STREQ(buf, "1750"); + + zz = 0xf5f5f5f5f5f5f5f5ULL; + memset(buf, 0xff, sizeof(buf)); + n = isc_print_snprintf(buf, sizeof(buf), "0x%" PRIx64, zz); + ATF_CHECK_EQ(n, 18); + ATF_CHECK_STREQ(buf, "0xf5f5f5f5f5f5f5f5"); + + n = isc_print_snprintf(buf, sizeof(buf), "%.2f", pi); + ATF_CHECK_EQ(n, 4); + ATF_CHECK_STREQ(buf, "3.14"); + + /* Similar to the above, but additional characters follows */ + n = isc_print_snprintf(buf, sizeof(buf), "%.2f1592", pi); + ATF_CHECK_EQ(n, 8); + ATF_CHECK_STREQ(buf, "3.141592"); + + /* Similar to the above, but with leading spaces */ + n = isc_print_snprintf(buf, sizeof(buf), "% 8.2f1592", pi); + ATF_CHECK_EQ(n, 12); + ATF_CHECK_STREQ(buf, " 3.141592"); + + /* Similar to the above, but with trail spaces after the 4 */ + n = isc_print_snprintf(buf, sizeof(buf), "%-8.2f1592", pi); + ATF_CHECK_EQ(n, 12); + ATF_CHECK_STREQ(buf, "3.14 1592"); +} + +ATF_TC(fprintf); +ATF_TC_HEAD(fprintf, tc) { + atf_tc_set_md_var(tc, "descr", "fprintf implementation"); +} +ATF_TC_BODY(fprintf, tc) { + FILE *f; + int n; + size_t size; + char buf[10000]; + + UNUSED(tc); + + f = fopen("fprintf.test", "w+"); + ATF_REQUIRE(f != NULL); + + size = 1000; + n = isc_print_fprintf(f, "%zu", size); + ATF_CHECK_EQ(n, 4); + + rewind(f); + + memset(buf, 0, sizeof(buf)); + n = fread(buf, 1, sizeof(buf), f); + ATF_CHECK_EQ(n, 4); + + fclose(f); + + ATF_CHECK_STREQ(buf, "1000"); + + if ((n > 0) && (!strcmp(buf, "1000"))) + unlink("fprintf.test"); +} + +/* + * Main + */ +ATF_TP_ADD_TCS(tp) { + ATF_TP_ADD_TC(tp, snprintf); + ATF_TP_ADD_TC(tp, fprintf); + return (atf_no_error()); +} -- cgit v1.2.3