mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
selftests/net: Provide test_snprintf() helper
Instead of pre-allocating a fixed-sized buffer of TEST_MSG_BUFFER_SIZE and printing into it, call vsnprintf() with str = NULL, which will return the needed size of the buffer. This hack is documented in man 3 vsnprintf. Essentially, in C++ terms, it re-invents std::stringstream, which is going to be used to print different tracing paths and formatted strings. Use it straight away in __test_print() - which is thread-safe version of printing in selftests. Signed-off-by: Dmitry Safonov <0x7f454c46@gmail.com> Link: https://patch.msgid.link/20240823-tcp-ao-selftests-upd-6-12-v4-2-05623636fe8c@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
79504a4733
commit
7053e788de
@ -37,17 +37,58 @@ extern void __test_xfail(const char *buf);
|
|||||||
extern void __test_error(const char *buf);
|
extern void __test_error(const char *buf);
|
||||||
extern void __test_skip(const char *buf);
|
extern void __test_skip(const char *buf);
|
||||||
|
|
||||||
__attribute__((__format__(__printf__, 2, 3)))
|
static inline char *test_snprintf(const char *fmt, va_list vargs)
|
||||||
static inline void __test_print(void (*fn)(const char *), const char *fmt, ...)
|
|
||||||
{
|
{
|
||||||
#define TEST_MSG_BUFFER_SIZE 4096
|
char *ret = NULL;
|
||||||
char buf[TEST_MSG_BUFFER_SIZE];
|
size_t size = 0;
|
||||||
va_list arg;
|
va_list tmp;
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
va_start(arg, fmt);
|
va_copy(tmp, vargs);
|
||||||
vsnprintf(buf, sizeof(buf), fmt, arg);
|
n = vsnprintf(ret, size, fmt, tmp);
|
||||||
va_end(arg);
|
if (n < 0)
|
||||||
fn(buf);
|
return NULL;
|
||||||
|
|
||||||
|
size = n + 1;
|
||||||
|
ret = malloc(size);
|
||||||
|
if (!ret)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
n = vsnprintf(ret, size, fmt, vargs);
|
||||||
|
if (n < 0 || n > size - 1) {
|
||||||
|
free(ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __printf(1, 2) inline char *test_sprintf(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list vargs;
|
||||||
|
char *ret;
|
||||||
|
|
||||||
|
va_start(vargs, fmt);
|
||||||
|
ret = test_snprintf(fmt, vargs);
|
||||||
|
va_end(vargs);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __printf(2, 3) inline void __test_print(void (*fn)(const char *),
|
||||||
|
const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list vargs;
|
||||||
|
char *msg;
|
||||||
|
|
||||||
|
va_start(vargs, fmt);
|
||||||
|
msg = test_snprintf(fmt, vargs);
|
||||||
|
va_end(vargs);
|
||||||
|
|
||||||
|
if (!msg)
|
||||||
|
return;
|
||||||
|
|
||||||
|
fn(msg);
|
||||||
|
free(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define test_print(fmt, ...) \
|
#define test_print(fmt, ...) \
|
||||||
|
Loading…
Reference in New Issue
Block a user