sbuf(3): increase test coverage

This change adds additional explicit test coverage for the following
sbuf(3) APIs:
- sbuf_clear_flags
- sbuf_get_flags
- sbuf_set_flags

While here, add a missing `sbuf_delete` to `sbuf_drain_ret0_test`: while
it isn't strictly required (the library's state is cleaned up shortly
after the test process ends), tools such as Coverity and LSAN flag
issues with leaked memory. Adding the sbuf_delete(3) call to the test
quells that issue.

MFC after:	1 week
Reviewed-by:	ngie
Pull-Request:	https://github.com/freebsd/freebsd-src/pull/2367
This commit is contained in:
Joao Bonifacio authored and Enji Cooper committed 2026-10-18 11:10:33 -07:00
1 parent 23ab9a9d09
commit 642b3d965e
1 file changed
+77 -10
+77 -10
View File
@@ -41,6 +41,30 @@ static char test_string[] = "this is a test string";
_Static_assert(nitems(test_string) > TEST_STRING_CHOP_COUNT,
"test_string is too short");
#ifdef HAVE_SBUF_CLEAR_FLAGS
ATF_TC_WITHOUT_HEAD(sbuf_clear_flags_test);
ATF_TC_BODY(sbuf_clear_flags_test, tc)
{
struct sbuf *sb;
int flags;
sb = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND | SBUF_INCLUDENUL);
ATF_REQUIRE_MSG(sb != NULL,
"sbuf_new failed: %s", strerror(errno));
flags = sbuf_get_flags(sb);
ATF_REQUIRE_INTEQ(SBUF_INCLUDENUL, flags & SBUF_INCLUDENUL);
sbuf_clear_flags(sb, SBUF_INCLUDENUL);
flags = sbuf_get_flags(sb);
ATF_CHECK_INTEQ(0, flags & SBUF_INCLUDENUL);
sbuf_delete(sb);
}
ATF_TC_WITHOUT_HEAD(sbuf_clear_test);
ATF_TC_BODY(sbuf_clear_test, tc)
{
@@ -80,6 +104,7 @@ ATF_TC_BODY(sbuf_clear_test, tc)
sbuf_delete(sb);
}
#endif
ATF_TC_WITHOUT_HEAD(sbuf_done_and_sbuf_finish_test);
ATF_TC_BODY(sbuf_done_and_sbuf_finish_test, tc)
@@ -125,6 +150,8 @@ ATF_TC_BODY(sbuf_drain_ret0_test, tc)
"required to return error when drain func returns 0");
ATF_CHECK_EQ_MSG(EDEADLK, errno,
"errno required to be EDEADLK when drain func returns 0");
sbuf_delete(sb);
}
ATF_TC_WITHOUT_HEAD(sbuf_len_test);
@@ -242,26 +269,66 @@ ATF_TC_BODY(sbuf_setpos_test, tc)
sbuf_delete(sb);
}
#ifdef HAVE_SBUF_GET_FLAGS
ATF_TC_WITHOUT_HEAD(sbuf_get_flags_test);
ATF_TC_BODY(sbuf_get_flags_test, tc)
{
struct sbuf *sb;
int flags;
sb = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND | SBUF_INCLUDENUL);
ATF_REQUIRE_MSG(sb != NULL, "sbuf_new failed: %s", strerror(errno));
flags = sbuf_get_flags(sb);
ATF_CHECK_INTEQ(
flags & (SBUF_AUTOEXTEND | SBUF_AUTOEXTEND),
SBUF_AUTOEXTEND | SBUF_AUTOEXTEND);
ATF_CHECK_INTEQ(flags ^ (SBUF_AUTOEXTEND | SBUF_INCLUDENUL), 0);
sbuf_delete(sb);
}
#endif
#ifdef HAVE_SBUF_SET_FLAGS
ATF_TC_WITHOUT_HEAD(sbuf_set_flags_test);
ATF_TC_BODY(sbuf_set_flags_test, tc)
{
struct sbuf *sb;
sb = sbuf_new_auto();
ATF_REQUIRE_MSG(sb != NULL,
"sbuf_new_auto failed: %s", strerror(errno));
sbuf_set_flags(sb, SBUF_INCLUDENUL);
ATF_REQUIRE_MSG(sbuf_cat(sb, test_string) == 0, "sbuf_cat failed");
ATF_REQUIRE_EQ_MSG(0, sbuf_finish(sb),
"sbuf_finish failed: %s", strerror(errno));
ATF_CHECK_EQ((ssize_t)(strlen(test_string) + 1), sbuf_len(sb));
sbuf_delete(sb);
}
#endif
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, sbuf_clear_test);
ATF_TP_ADD_TC(tp, sbuf_done_and_sbuf_finish_test);
ATF_TP_ADD_TC(tp, sbuf_drain_ret0_test);
ATF_TP_ADD_TC(tp, sbuf_len_test);
ATF_TP_ADD_TC(tp, sbuf_new_fixedlen);
#if 0
/* TODO */
#ifdef HAVE_SBUF_CLEAR_FLAGS
ATF_TP_ADD_TC(tp, sbuf_clear_flags_test);
ATF_TP_ADD_TC(tp, sbuf_clear_test);
#endif
ATF_TP_ADD_TC(tp, sbuf_done_and_sbuf_finish_test);
ATF_TP_ADD_TC(tp, sbuf_drain_ret0_test);
#ifdef HAVE_SBUF_GET_FLAGS
ATF_TP_ADD_TC(tp, sbuf_get_flags_test);
#endif
ATF_TP_ADD_TC(tp, sbuf_new_positive_test);
ATF_TP_ADD_TC(tp, sbuf_new_negative_test);
ATF_TP_ADD_TC(tp, sbuf_len_test);
ATF_TP_ADD_TC(tp, sbuf_new_fixedlen);
#ifdef HAVE_SBUF_SET_FLAGS
ATF_TP_ADD_TC(tp, sbuf_set_flags_test);
#endif
#endif
ATF_TP_ADD_TC(tp, sbuf_setpos_test);