#include <sys/exterrvar.h>
#include <sys/mman.h>
#include <atf-c.h>
#include <errno.h>
#include <exterr.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "freebsd_test_suite/macros.h"
static void
pin_exterror_format(void)
{
unsetenv("EXTERROR_VERBOSE");
}
ATF_TC(gettext_extended);
ATF_TC_HEAD(gettext_extended, tc)
{
atf_tc_set_md_var(tc, "descr", "Retrieve an extended error message");
}
ATF_TC_BODY(gettext_extended, tc)
{
char exterr[UEXTERROR_MAXLEN];
int r;
pin_exterror_format();
ATF_CHECK_ERRNO(ENOTSUP,
mmap(NULL, 0, PROT_MAX(PROT_READ) | PROT_WRITE, 0, -1, 0));
r = uexterr_gettext(exterr, sizeof(exterr));
ATF_CHECK_EQ(0, r);
printf("Extended error: %s\n", exterr);
ATF_REQUIRE_FEATURE("exterr_strings");
ATF_CHECK(strstr(exterr, " is not subset of ") != NULL);
}
ATF_TC(gettext_noextended);
ATF_TC_HEAD(gettext_noextended, tc)
{
atf_tc_set_md_var(tc, "descr",
"Fail to retrieve an extended error message because none exists");
}
ATF_TC_BODY(gettext_noextended, tc)
{
char exterr[UEXTERROR_MAXLEN];
int r;
pin_exterror_format();
ATF_CHECK_ERRNO(EINVAL, exterrctl(EXTERRCTL_UD, 0, NULL));
r = uexterr_gettext(exterr, sizeof(exterr));
ATF_CHECK_EQ(0, r);
ATF_CHECK_STREQ(exterr, "");
}
ATF_TC(gettext_noextended_after_extended);
ATF_TC_HEAD(gettext_noextended_after_extended, tc)
{
atf_tc_set_md_var(tc, "descr",
"uexterr_gettext should not return a stale extended error message");
}
ATF_TC_BODY(gettext_noextended_after_extended, tc)
{
char exterr[UEXTERROR_MAXLEN];
int r;
pin_exterror_format();
ATF_CHECK_ERRNO(ENOTSUP,
mmap(NULL, 0, PROT_MAX(PROT_READ) | PROT_WRITE, 0, -1, 0));
ATF_CHECK_ERRNO(EINVAL, exterrctl(EXTERRCTL_UD, 0, NULL));
r = uexterr_gettext(exterr, sizeof(exterr));
ATF_CHECK_EQ(0, r);
ATF_CHECK_STREQ(exterr, "");
}
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, gettext_extended);
ATF_TP_ADD_TC(tp, gettext_noextended);
ATF_TP_ADD_TC(tp, gettext_noextended_after_extended);
return (atf_no_error());
}