1*d9497217SMartin Matuska // SPDX-License-Identifier: CDDL-1.0
2*d9497217SMartin Matuska /*
3*d9497217SMartin Matuska * This file and its contents are supplied under the terms of the
4*d9497217SMartin Matuska * Common Development and Distribution License ("CDDL"), version 1.0.
5*d9497217SMartin Matuska * You may only use this file in accordance with the terms of version
6*d9497217SMartin Matuska * 1.0 of the CDDL.
7*d9497217SMartin Matuska *
8*d9497217SMartin Matuska * A full copy of the text of the CDDL should have accompanied this
9*d9497217SMartin Matuska * source. A copy of the CDDL is also available via the Internet at
10*d9497217SMartin Matuska * http://www.illumos.org/license/CDDL.
11*d9497217SMartin Matuska */
12*d9497217SMartin Matuska
13*d9497217SMartin Matuska /*
14*d9497217SMartin Matuska * Copyright (c) 2026, TrueNAS.
15*d9497217SMartin Matuska */
16*d9497217SMartin Matuska
17*d9497217SMartin Matuska /* Core stubs, applicable to all test suites. */
18*d9497217SMartin Matuska
19*d9497217SMartin Matuska #include <stdio.h>
20*d9497217SMartin Matuska #include <stdarg.h>
21*d9497217SMartin Matuska
22*d9497217SMartin Matuska #include <sys/types.h>
23*d9497217SMartin Matuska #include <sys/cmn_err.h>
24*d9497217SMartin Matuska #include <sys/zfs_debug.h>
25*d9497217SMartin Matuska
26*d9497217SMartin Matuska #include "munit.h"
27*d9497217SMartin Matuska #include "unit.h"
28*d9497217SMartin Matuska
29*d9497217SMartin Matuska /*
30*d9497217SMartin Matuska * SET_ERROR() expands to __set_error() in debug builds. It's an
31*d9497217SMartin Matuska * under-the-hood tracing aid in production; a no-op is fine.
32*d9497217SMartin Matuska */
33*d9497217SMartin Matuska void
__set_error(const char * file,const char * func,int line,int err)34*d9497217SMartin Matuska __set_error(const char *file, const char *func, int line, int err)
35*d9497217SMartin Matuska {
36*d9497217SMartin Matuska (void) file; (void) func; (void) line; (void) err;
37*d9497217SMartin Matuska }
38*d9497217SMartin Matuska
39*d9497217SMartin Matuska /* Plumb logging and debug into munit for convenience. */
40*d9497217SMartin Matuska
41*d9497217SMartin Matuska /* dprintf() checks zfs_flags and calls __dprintf() in debug builds. */
42*d9497217SMartin Matuska int zfs_dbgmsg_enable = 1;
43*d9497217SMartin Matuska int zfs_flags = ZFS_DEBUG_DPRINTF;
44*d9497217SMartin Matuska
45*d9497217SMartin Matuska /* Log dprintf() to MUNIT_LOG_DEBUG. */
46*d9497217SMartin Matuska void
__dprintf(boolean_t dprint,const char * file,const char * func,int line,const char * fmt,...)47*d9497217SMartin Matuska __dprintf(boolean_t dprint, const char *file, const char *func,
48*d9497217SMartin Matuska int line, const char *fmt, ...)
49*d9497217SMartin Matuska {
50*d9497217SMartin Matuska char buf[1024];
51*d9497217SMartin Matuska
52*d9497217SMartin Matuska va_list ap;
53*d9497217SMartin Matuska va_start(ap, fmt);
54*d9497217SMartin Matuska vsnprintf(buf, sizeof (buf), fmt, ap);
55*d9497217SMartin Matuska va_end(ap);
56*d9497217SMartin Matuska
57*d9497217SMartin Matuska munit_logf_ex(MUNIT_LOG_DEBUG, NULL, 0, "%s%s:%d [%s]: %s",
58*d9497217SMartin Matuska dprint ? "dprintf: " : "", file, line, func, buf);
59*d9497217SMartin Matuska }
60*d9497217SMartin Matuska
61*d9497217SMartin Matuska /* Log cmn_err() to MUNIT_LOG_INFO or WARNING, abort test on CE_PANIC. */
62*d9497217SMartin Matuska void
cmn_err(int ce,const char * fmt,...)63*d9497217SMartin Matuska cmn_err(int ce, const char *fmt, ...)
64*d9497217SMartin Matuska {
65*d9497217SMartin Matuska if (ce == CE_IGNORE)
66*d9497217SMartin Matuska return;
67*d9497217SMartin Matuska
68*d9497217SMartin Matuska char buf[1024];
69*d9497217SMartin Matuska
70*d9497217SMartin Matuska va_list ap;
71*d9497217SMartin Matuska va_start(ap, fmt);
72*d9497217SMartin Matuska vsnprintf(buf, sizeof (buf), fmt, ap);
73*d9497217SMartin Matuska va_end(ap);
74*d9497217SMartin Matuska
75*d9497217SMartin Matuska switch (ce) {
76*d9497217SMartin Matuska case CE_WARN:
77*d9497217SMartin Matuska munit_logf_ex(MUNIT_LOG_WARNING, NULL, 0, "%s", buf);
78*d9497217SMartin Matuska break;
79*d9497217SMartin Matuska case CE_PANIC:
80*d9497217SMartin Matuska munit_errorf_ex(NULL, 0, "PANIC: %s", buf);
81*d9497217SMartin Matuska break;
82*d9497217SMartin Matuska default:
83*d9497217SMartin Matuska munit_logf_ex(MUNIT_LOG_INFO, NULL, 0, "%s", buf);
84*d9497217SMartin Matuska break;
85*d9497217SMartin Matuska }
86*d9497217SMartin Matuska }
87*d9497217SMartin Matuska
88*d9497217SMartin Matuska /* helpers to generate useful random data */
89*d9497217SMartin Matuska uint64_t
unit_rand_uint64(void)90*d9497217SMartin Matuska unit_rand_uint64(void)
91*d9497217SMartin Matuska {
92*d9497217SMartin Matuska uint64_t v =
93*d9497217SMartin Matuska (((uint64_t)munit_rand_uint32()) << 32) |
94*d9497217SMartin Matuska ((uint64_t)munit_rand_uint32());
95*d9497217SMartin Matuska return (v);
96*d9497217SMartin Matuska }
97*d9497217SMartin Matuska
98*d9497217SMartin Matuska char *
unit_rand_str(char * buf,size_t bufsz)99*d9497217SMartin Matuska unit_rand_str(char *buf, size_t bufsz)
100*d9497217SMartin Matuska {
101*d9497217SMartin Matuska for (int i = 0; i < bufsz-1; i++)
102*d9497217SMartin Matuska buf[i] = munit_rand_int_range('a', 'z');
103*d9497217SMartin Matuska buf[bufsz-1] = '\0';
104*d9497217SMartin Matuska return (buf);
105*d9497217SMartin Matuska }
106