From patchwork Fri Feb 14 16:19:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tamir Duberstein X-Patchwork-Id: 865394 Received: from mail-qt1-f169.google.com (mail-qt1-f169.google.com [209.85.160.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5EFB7267700; Fri, 14 Feb 2025 16:20:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739550020; cv=none; b=qqrt0soZFJtCdzv5tkpbLUYT2C1aySrHdl8c2OGTqPCS/GQ1XCCcCfitj8kaCTu+JdR9+Zp7S1/jTh5PsE1JHAsJzvovraP9s0n6NJBIcfbJadoV9pFRWPAmaOjvfNi2RMMKO3lDcvhbJ2ayyQpt8Q+6LcfaOUWXjx7Zb/Th464= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739550020; c=relaxed/simple; bh=O4XRHx00u8LeMOTlb8oINWTn9rn9zg1L6QMp1wkUCkE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=u6dXqQ6ga1q7YKq86RvmbyAm/urUC5s6nv5bkI5yGkawfXda7hBM9i45xgW7BUy6AUFtVTYYO/jxQjJYG8bau8VNWB0giObCD90pMB/kp3jSVleAGURiVUJ7ja3DKZwE7+ZOUEPDR427fhPmFEzBtnR82z+tWYGArBRbb9Yrz3g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=eJGz/Tq3; arc=none smtp.client-ip=209.85.160.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="eJGz/Tq3" Received: by mail-qt1-f169.google.com with SMTP id d75a77b69052e-46b1d40abbdso17833871cf.2; Fri, 14 Feb 2025 08:20:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739550016; x=1740154816; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=qUz+jjCFU1ufbjv5/7ngcTa5QZ/QALO1ok87HNfKxfo=; b=eJGz/Tq3xFgxXquYQXqu1gdKcC1kyk7DDeRj5aeEoSHU4tHQku8FOpuHuVNhD68sl5 qDiH4n8tKsUszS/9eUL0ggU8ejmJrE9EYAXBsUqBKafI8bsE1pNi+XvhUQ0T6tmGbjZF PX5wchJzJdJ7MVtzyga9rm8BeZxPAhM/17KvG1RqHFRowE97LRUuaZh5whgf77vCE1bG E3SJRodgEDnIiZt5240fVYYEuGRtItMQTaaLxa9flt7bYoXZs1nsW+mxLWyCZL0pSaUS DJ9ZcmlNRZr3E2b399ziyzaWssJuDxvQAb+c2hRkA1mS94cd1Xwmhhwjy+0PTjNKuNtx XJxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739550016; x=1740154816; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qUz+jjCFU1ufbjv5/7ngcTa5QZ/QALO1ok87HNfKxfo=; b=H+PBy9JfKVCAqZlimFgPkmEvEdWNiThKst9/29xbB+J9ovrpg9deTgpDmYJy5REkVQ NyGBCAK0dk1gWgVrYmANr9ygYaSsUbGqjxUQgbbVh9muO3tE3CbkbbasBf+TOdKa6nRF qBAAWso4W1cBa7HJzzaDSvHMwZRDmf3k99Bpk5vKN29PowkVBfbG/JaTXDVEaSm1TGhO 3vnKwgL/uxSj1i8u56cRJ3R6QpsXyFlmUCFthunXeBrbczn1IDKGu3tGdz9jnJeUzxtE nXbR6oUmz35/zetuRkDHnMBjOJgh5e7bIgqz+Jw/aKXJmeX6KKdlx6eSweowetXWx/PK LuWg== X-Forwarded-Encrypted: i=1; AJvYcCVWiwRofVRnuJzEndcXXFV+gIdw4DlK1oav9FJ83wpK/9Hypk88E8XxBwLBfxT4kz1XDRA5zcCJIwh8jp8=@vger.kernel.org, AJvYcCWVfbsOEGtIL7rpWIx3ZTNpL1AeBZeFsrcPwY6SFa5gSt/g0GT3UTsPC8E3Be+/9y8i5pN/dTvy0gRh3+aa1Ve+@vger.kernel.org X-Gm-Message-State: AOJu0YwGhZG6aKKcZhniz/uyGdz1MxkyYYUY6C+xlC/LQNsMaVO71dbg Y2yeX59WZhywGcbyUmgxT58dSS9gVXc1IfuzaMwgFBc67znP+WYM X-Gm-Gg: ASbGncv/RuidUllomHYFw8NydG603TdvTIZoJ33fMwWklSWnQAR66iGZjojrnAwoTGT klSQJm7yS1bvIuuTzHO+Rhb8OI/BjpH8Q/ieK1nlkisybtfCiAqpCaQG+9oc65m9hpZ4b+FsCGx TOICsH+w2gtATgaSBoENQk8HEvWYak6gvDuU6lQb5oK/3vDws4v+NxSroIOxGGqw2xDbMmroZ09 885Gre5S+T5Vld7Ck5aQvEzeH/q37h6DNs5H6KRyDOw1IkHXn2naeYmH276jHXKJrDWEQxF2ix8 /yYbVejULyikMe9WCPhQSoyzPuklkZ+3eiF6UA== X-Google-Smtp-Source: AGHT+IFspXCCtEtBaZbuATrzMaOpYK1v7G3V5p66Nt1kRfWM+DKYIFnFRn31Y162VPQqPh0Usv8/CQ== X-Received: by 2002:a05:622a:8c08:b0:471:b403:59cf with SMTP id d75a77b69052e-471b4035a7dmr141019211cf.4.1739550016081; Fri, 14 Feb 2025 08:20:16 -0800 (PST) Received: from [192.168.1.159] ([2600:4041:5be7:7c00:d4df:402c:65f0:87da]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-471c2af37c7sm19196911cf.61.2025.02.14.08.20.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Feb 2025 08:20:14 -0800 (PST) From: Tamir Duberstein Date: Fri, 14 Feb 2025 11:19:58 -0500 Subject: [PATCH v8 1/4] scanf: implicate test line in failure messages Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250214-scanf-kunit-convert-v8-1-5ea50f95f83c@gmail.com> References: <20250214-scanf-kunit-convert-v8-0-5ea50f95f83c@gmail.com> In-Reply-To: <20250214-scanf-kunit-convert-v8-0-5ea50f95f83c@gmail.com> To: David Gow , Petr Mladek , Steven Rostedt , Andy Shevchenko , Rasmus Villemoes , Sergey Senozhatsky , Andrew Morton , Shuah Khan Cc: Geert Uytterhoeven , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Tamir Duberstein X-Mailer: b4 0.15-dev This improves the failure output by pointing to the failing line at the top level of the test. Signed-off-by: Tamir Duberstein --- lib/test_scanf.c | 66 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/lib/test_scanf.c b/lib/test_scanf.c index 44f8508c9d88..d1664e0d0138 100644 --- a/lib/test_scanf.c +++ b/lib/test_scanf.c @@ -24,12 +24,12 @@ static char *test_buffer __initdata; static char *fmt_buffer __initdata; static struct rnd_state rnd_state __initdata; -typedef int (*check_fn)(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap); +typedef int (*check_fn)(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap); -static void __scanf(4, 6) __init -_test(check_fn fn, const void *check_data, const char *string, const char *fmt, - int n_args, ...) +static void __scanf(6, 0) __init +_test(const char *file, const int line, check_fn fn, const void *check_data, const char *string, + const char *fmt, int n_args, ...) { va_list ap, ap_copy; int ret; @@ -42,12 +42,12 @@ _test(check_fn fn, const void *check_data, const char *string, const char *fmt, va_end(ap_copy); if (ret != n_args) { - pr_warn("vsscanf(\"%s\", \"%s\", ...) returned %d expected %d\n", - string, fmt, ret, n_args); + pr_warn("%s:%d: vsscanf(\"%s\", \"%s\", ...) returned %d expected %d\n", + file, line, string, fmt, ret, n_args); goto fail; } - ret = (*fn)(check_data, string, fmt, n_args, ap); + ret = (*fn)(file, line, check_data, string, fmt, n_args, ap); if (ret) goto fail; @@ -67,88 +67,88 @@ do { \ typeof(*expect) got = *va_arg(ap, typeof(expect)); \ pr_debug("\t" arg_fmt "\n", got); \ if (got != *expect) { \ - pr_warn("vsscanf(\"%s\", \"%s\", ...) expected " arg_fmt " got " arg_fmt "\n", \ - str, fmt, *expect, got); \ + pr_warn("%s:%d, vsscanf(\"%s\", \"%s\", ...) expected " arg_fmt " got " arg_fmt "\n", \ + file, line, str, fmt, *expect, got); \ return 1; \ } \ } \ return 0; \ } while (0) -static int __init check_ull(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_ull(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const unsigned long long *pval = check_data; _check_numbers_template("%llu", pval, string, fmt, n_args, ap); } -static int __init check_ll(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_ll(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const long long *pval = check_data; _check_numbers_template("%lld", pval, string, fmt, n_args, ap); } -static int __init check_ulong(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_ulong(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const unsigned long *pval = check_data; _check_numbers_template("%lu", pval, string, fmt, n_args, ap); } -static int __init check_long(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_long(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const long *pval = check_data; _check_numbers_template("%ld", pval, string, fmt, n_args, ap); } -static int __init check_uint(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_uint(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const unsigned int *pval = check_data; _check_numbers_template("%u", pval, string, fmt, n_args, ap); } -static int __init check_int(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_int(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const int *pval = check_data; _check_numbers_template("%d", pval, string, fmt, n_args, ap); } -static int __init check_ushort(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_ushort(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const unsigned short *pval = check_data; _check_numbers_template("%hu", pval, string, fmt, n_args, ap); } -static int __init check_short(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_short(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const short *pval = check_data; _check_numbers_template("%hd", pval, string, fmt, n_args, ap); } -static int __init check_uchar(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_uchar(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const unsigned char *pval = check_data; _check_numbers_template("%hhu", pval, string, fmt, n_args, ap); } -static int __init check_char(const void *check_data, const char *string, - const char *fmt, int n_args, va_list ap) +static int __init check_char(const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const signed char *pval = check_data; @@ -196,7 +196,7 @@ do { \ T result = ~expect_val; /* should be overwritten */ \ \ snprintf(test_buffer, BUF_SIZE, gen_fmt, expect_val); \ - _test(fn, &expect_val, test_buffer, "%" scan_fmt, 1, &result); \ + _test(__FILE__, __LINE__, fn, &expect_val, test_buffer, "%" scan_fmt, 1, &result); \ } while (0) #define simple_numbers_loop(T, gen_fmt, scan_fmt, fn) \ @@ -344,7 +344,7 @@ static void __init append_delim(char *str_buf, int *str_buf_pos, int str_buf_len #define test_array_8(fn, check_data, string, fmt, arr) \ do { \ BUILD_BUG_ON(ARRAY_SIZE(arr) != 8); \ - _test(fn, check_data, string, fmt, 8, \ + _test(__FILE__, __LINE__, fn, check_data, string, fmt, 8, \ &(arr)[0], &(arr)[1], &(arr)[2], &(arr)[3], \ &(arr)[4], &(arr)[5], &(arr)[6], &(arr)[7]); \ } while (0) @@ -608,7 +608,7 @@ do { \ const T expect[2] = { expect0, expect1 }; \ T result[2] = { (T)~expect[0], (T)~expect[1] }; \ \ - _test(fn, &expect, str, scan_fmt, n_args, &result[0], &result[1]); \ + _test(__FILE__, __LINE__, fn, &expect, str, scan_fmt, n_args, &result[0], &result[1]); \ } while (0) /* From patchwork Fri Feb 14 16:19:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tamir Duberstein X-Patchwork-Id: 865213 Received: from mail-qt1-f176.google.com (mail-qt1-f176.google.com [209.85.160.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6E876267703; Fri, 14 Feb 2025 16:20:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739550020; cv=none; b=MuBc9gQo3hSsZ8jpfNndzNiEplzPIINOgaLv7k5VcaDbqA/HHwmvrGQAQRf8O3LikfwTnylJ0Kk+xSCR3FhnC031QJad5xEx41yI9SBiEmkpOdndnU9AqNMJVKvdtMFjy+/75drE6MixRbimQHkVcZZB8TGIn3aPI4UcfEeDDyY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739550020; c=relaxed/simple; bh=w04qy4Y0Et0Rg+GX4a15bfGYKtii9SVsChClczIe+/4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DdXFaGtD7aSZd9ndOTEovNIJmfwuPWfYWRPqC62OcMOYZ7KMNhkdYtSWMVdGGzvNWa59wtR1pbfd7szbJ0csl+n2ur+TnKahPndN0+zACVXs4W7pFBmpqbfcdNQdDnW7yYt3ha5tjGk/q218FALcRBQPhv8G6fBVua7/tEFhr00= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=iyoTGte8; arc=none smtp.client-ip=209.85.160.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="iyoTGte8" Received: by mail-qt1-f176.google.com with SMTP id d75a77b69052e-471b5372730so25927151cf.1; Fri, 14 Feb 2025 08:20:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739550017; x=1740154817; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=eQ1dqGAKYKMBZVkr6E0w87TNxfEIiyY2O6Uuan8/TUM=; b=iyoTGte8dndlvrxwmXbn8WpDdk6K4Offp3A4buNWyjKpmS9pXHO/GbUuoDCU0E0WA6 ZtqBkp27vWUkB8PxNKmSgosQW4ye1LbGniKFh2G9uKEFV6WQMtU7nGuSSFMU76yhYk8x 2ASRtOY9f463+6gCiBb0yYbLFuNgq9+qTjrl3lzKLI+goFhR0vfi01eu+jyXfJC9BceO cl5EYCgBD90RIXwvB3nimBbRf2bCdij5zqN5U5f4UbaEv11FW5wiwayAJKLsdXJqdkid Za/F5pj3kR1+osJo+Rbi7N2TdMdCb4nn4K50tysQDSOpQ0xt87tMpq8XL43qXHQ/Su0X zvPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739550017; x=1740154817; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=eQ1dqGAKYKMBZVkr6E0w87TNxfEIiyY2O6Uuan8/TUM=; b=RNFeyQ/6/gWXBZd9Vm198iFA7i+govJwLMVv7hCMhj1vRlqhp1iyWG8h/263VVwZo1 cTNpzri27lLtWiiKbYUnCCftAj6ze1G2l2quqy3158amJodwYoqwurV4cuU4Ij2mPs8l rkdCDVLVyaMJASDKzHP44kCcRpRli/ykpZYTjiurRDvIzW/snpF9pelOrw5sZN2hXZyJ mpbhqyNKDsKRGTuWRXMlRtRBdH6CI43++LXv1Q1UJWbbsYC6E1NG3GX7IDhogE2h4XEc s3u8CweLyWYsXlyKnbDIyUSH7BOn/RQ96h0JLCruLtNyDtytbwsCemQAwSIdjz4fRezO bHuQ== X-Forwarded-Encrypted: i=1; AJvYcCV07GcsNu8aTKnHw8JLVcih03viTe9SxCp2wClhzG8vqp1f1porxozh3a9CSnaqP48IOJ0eDgsa6Zm78uA=@vger.kernel.org, AJvYcCWNosSIjekwuGpcV+AEotiK2W/gsE281zSPHcgKYj775YUVR19VZujANd6GYoFiyc/WuURRxVUzBVU0hY9+yxpj@vger.kernel.org X-Gm-Message-State: AOJu0Yxe6dwPcr9KDD3POlb4FPv6zcgw7XJ+FokuM+Lr+ebOCEIOAbSF p6W/4gbc9tUUXlRgt7JheB6R07stZ5q2apFDC31C4SzFDVmDJic1 X-Gm-Gg: ASbGncvE69JdLQXFX7SAKIr4sV114WAzZyoLbvfD2uQl+ZfR74CwALIJC9SlwXwb6/S SSTPiJvD5YEc8fQFiqky1HSHdyjDTQWPpu/QGAo3f2pkd3ZtRVK0DrTuaimFQNMp8kp1GnLuffe nGVTif/SvPOdzWNfloeRkTiYV2sxYKVW2et09FYwdOKxme1oD39TYDXLlheUBeMnZe32wnhgrhM CAmQrsxVmSyvAbO6FzqOlG34bgIT69+p7lJvwsmEYSd/0WOcwLd4HytyHrBjPGHcKDlgAd/5oCH 3E8ChCik79bLci8Dn/T6EVUYhLXY+SisSLL6WQ== X-Google-Smtp-Source: AGHT+IEtGCLolLmoRwa5yC6C8RqZL3fVb/Jwme6jD923Jj3vW+H7s5w4ZUBfA0G1cPEvrszj7sfe0A== X-Received: by 2002:a05:622a:14c9:b0:471:b192:16d1 with SMTP id d75a77b69052e-471bed86dd8mr122838891cf.30.1739550017129; Fri, 14 Feb 2025 08:20:17 -0800 (PST) Received: from [192.168.1.159] ([2600:4041:5be7:7c00:d4df:402c:65f0:87da]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-471c2af37c7sm19196911cf.61.2025.02.14.08.20.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Feb 2025 08:20:16 -0800 (PST) From: Tamir Duberstein Date: Fri, 14 Feb 2025 11:19:59 -0500 Subject: [PATCH v8 2/4] scanf: remove redundant debug logs Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250214-scanf-kunit-convert-v8-2-5ea50f95f83c@gmail.com> References: <20250214-scanf-kunit-convert-v8-0-5ea50f95f83c@gmail.com> In-Reply-To: <20250214-scanf-kunit-convert-v8-0-5ea50f95f83c@gmail.com> To: David Gow , Petr Mladek , Steven Rostedt , Andy Shevchenko , Rasmus Villemoes , Sergey Senozhatsky , Andrew Morton , Shuah Khan Cc: Geert Uytterhoeven , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Tamir Duberstein X-Mailer: b4 0.15-dev Remove `pr_debug` calls which emit information already contained in `pr_warn` calls that occur on test failure. This reduces unhelpful test verbosity. Note that a `pr_debug` removed from `_check_numbers_template` appears to have been the only guard against silent false positives, but in fact this condition is handled in `_test`; it is only possible for `n_args` to be `0` in `_check_numbers_template` if the test explicitly expects it *and* `vsscanf` returns `0`, matching the expectation. Signed-off-by: Tamir Duberstein --- lib/test_scanf.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/test_scanf.c b/lib/test_scanf.c index d1664e0d0138..efdde6f498d9 100644 --- a/lib/test_scanf.c +++ b/lib/test_scanf.c @@ -62,10 +62,8 @@ _test(const char *file, const int line, check_fn fn, const void *check_data, con #define _check_numbers_template(arg_fmt, expect, str, fmt, n_args, ap) \ do { \ - pr_debug("\"%s\", \"%s\" ->\n", str, fmt); \ for (; n_args > 0; n_args--, expect++) { \ typeof(*expect) got = *va_arg(ap, typeof(expect)); \ - pr_debug("\t" arg_fmt "\n", got); \ if (got != *expect) { \ pr_warn("%s:%d, vsscanf(\"%s\", \"%s\", ...) expected " arg_fmt " got " arg_fmt "\n", \ file, line, str, fmt, *expect, got); \ @@ -689,7 +687,6 @@ do { \ total_tests++; \ len = snprintf(test_buffer, BUF_SIZE, gen_fmt, expect); \ got = (fn)(test_buffer, &endp, base); \ - pr_debug(#fn "(\"%s\", %d) -> " gen_fmt "\n", test_buffer, base, got); \ if (got != (expect)) { \ fail = true; \ pr_warn(#fn "(\"%s\", %d): got " gen_fmt " expected " gen_fmt "\n", \ From patchwork Fri Feb 14 16:20:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tamir Duberstein X-Patchwork-Id: 865212 Received: from mail-qt1-f173.google.com (mail-qt1-f173.google.com [209.85.160.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C01EF26770C; Fri, 14 Feb 2025 16:20:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739550022; cv=none; b=csEgXE1C84YFzbpSniKN8bzb7tnfPLVrVgyeRh/xMctoLOhg8qiJf3gg/b/LlYF6XImO85tiv2jkDaVDYMkLxHuYvf402mB/KQHB1bBmBXu9y6uR6ZQ79XLotsES1S6HEOBMIN+ksFqQ06GftHvwLa3DvwzzrfjCpRHeJOji4Xk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739550022; c=relaxed/simple; bh=AhQiOUtEtf8Kfg7ogwG8jjfVbP2I67tNj/tXj8vxYMo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ps8BDD0T0eGnaJL+16txdlSRgFtjc72lRZlsQ3u/YNucxscVcmII2xwz2/l8+oXbksUKCb8Gre0L7gi0lY5V0f0haM5EIc34vxEe9Jk2pi3rRYieXsNH77dW1DiofCGvyYAscGBXjyMxBo9zrDxhnafCYGPNrGpoq6R8oUIWtM4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=d7XqZv44; arc=none smtp.client-ip=209.85.160.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="d7XqZv44" Received: by mail-qt1-f173.google.com with SMTP id d75a77b69052e-471d0d123d8so7865081cf.0; Fri, 14 Feb 2025 08:20:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739550018; x=1740154818; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=2VCBhSjbpSxxtoIMl4LQSzahtuVSOdMB24YuJYpx5a0=; b=d7XqZv4422RoDMe+At2dtgxpsCDZVRW9syPwZSePLXGAzeK8DmuOTs2qY98PDQnJiy 1CP1n7Bw01lBz/PcgIsmMxCVKOIAYKrP99h6pCegNrspghgyB/XLFBk1gDND7a8MnTE9 Fpmx6EzYfAAgLH/FuOKRDE+3qeyQhaa9KN6Sbke0aC73ANpD4aUElsSJMWs1ei4WZP1b LY9dHNrLs1TF736BNfS9yJ8hI/4YscixIzPpxLELFIodQCUPGRaFs1uuabELhGXMxCEu 0ELuUeM/wa+GzvpVuKdg4dcKXWoxwhrGvLTSC15crnvEt+nQinP3KCc9Y72t/D7oJTST x79g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739550018; x=1740154818; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2VCBhSjbpSxxtoIMl4LQSzahtuVSOdMB24YuJYpx5a0=; b=k68fBam0JK8jBlZ6+dIfoLZyKFq+sOg7uW3Lhw4reWZexgt4CDqOuS89MXYOI/23oV rBE+Pstpd5itP11Iqmpk69nWpUazpBFjBrxT9xpFq/3g48inImxauGjRm4vXFgw11bi8 lEhdow3pElsUJb0RW/W72oPjFWQpjiNVuTsHgkK1Sn/dt02TlzImsJugpgU18gYVARLP vBeZEofu1Qa1gCGjY8zldpCwtgvDvKOTOr48Dp63aX7ICZBsu9KrsggSXKp4tTJd+uFN Ot4nX0mQucSXLlI/AxZ4LgzxLk8UJRVfI2YJ5REJ1O+GQ/5KHlE2N7E6/oCbnBfqjLNf 10GA== X-Forwarded-Encrypted: i=1; AJvYcCVPq58kd4nIH8/3RAJt4IqgIemoxOZ6ARIo5bkS+u0A6dTMRprWITtnA+ECZeYAFHzTKZ+4T6OZLd0wMs+6BBAn@vger.kernel.org, AJvYcCVQUbn8i3QOS+II/h3j4v5Y+AzLG/uobCLKUL5tuUSSHWzNzTkFZ4zmkf9nbv5Wn8LlEOcOm8seMQn8N0w=@vger.kernel.org X-Gm-Message-State: AOJu0YweLbBVhl+MxtdYIUwULvjeZB4ISoO3IYi6to4c1I5DF45kUl4Z 9C0ClV3xVnqKoPWKObPhCrmUkk5BvYVzIdjNoPmGy5YxLGCcQ4hg X-Gm-Gg: ASbGncvXELe+2FG110pyKyRtcVtBUFjQrS2XpX4CdIG+kGOR01Hl2pFaNnNOq2jdHKx HavVKe93ibLJ10f5hms7RGybnhAAF+Qa7xRXfidZmrfdO4R8soscuKfw0JY+8nBH6p28yesmJXY OtW3LIP/IKL3mJjiKa0bY+x10ZVGntGUhimV8HgI6j8uEcgjDMw2In4Ptho3rJbgt14G6OLb+kt vEq+pmtD3+HqKvRsw0aMRP9wLAAuhjQoql2eAk832IWXABY/K5SKKqH8ycGDnNjH76cNOL6H8N1 bfXqL5sQSEm8jKIuTduj7A6iCs+D10aq8PWkzw== X-Google-Smtp-Source: AGHT+IE6T/9N01eDB7ziU4pK0igxY2B5d7EupZB37PemAO66qr7SEcdHk6F4rH85iSDUqK0mf/P31g== X-Received: by 2002:ac8:7d4c:0:b0:471:c6c7:4847 with SMTP id d75a77b69052e-471c6c74b42mr100704751cf.2.1739550018386; Fri, 14 Feb 2025 08:20:18 -0800 (PST) Received: from [192.168.1.159] ([2600:4041:5be7:7c00:d4df:402c:65f0:87da]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-471c2af37c7sm19196911cf.61.2025.02.14.08.20.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Feb 2025 08:20:17 -0800 (PST) From: Tamir Duberstein Date: Fri, 14 Feb 2025 11:20:00 -0500 Subject: [PATCH v8 3/4] scanf: convert self-test to KUnit Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250214-scanf-kunit-convert-v8-3-5ea50f95f83c@gmail.com> References: <20250214-scanf-kunit-convert-v8-0-5ea50f95f83c@gmail.com> In-Reply-To: <20250214-scanf-kunit-convert-v8-0-5ea50f95f83c@gmail.com> To: David Gow , Petr Mladek , Steven Rostedt , Andy Shevchenko , Rasmus Villemoes , Sergey Senozhatsky , Andrew Morton , Shuah Khan Cc: Geert Uytterhoeven , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Tamir Duberstein X-Mailer: b4 0.15-dev Convert the scanf() self-test to a KUnit test. In the interest of keeping the patch reasonably-sized this doesn't refactor the tests into proper parameterized tests - it's all one big test case. Reviewed-by: David Gow Signed-off-by: Tamir Duberstein --- MAINTAINERS | 2 +- lib/Kconfig.debug | 12 +- lib/Makefile | 1 - lib/tests/Makefile | 1 + lib/{test_scanf.c => tests/scanf_kunit.c} | 251 +++++++++++++++--------------- tools/testing/selftests/lib/Makefile | 2 +- tools/testing/selftests/lib/config | 1 - tools/testing/selftests/lib/scanf.sh | 4 - 8 files changed, 134 insertions(+), 140 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 92fc0eca7061..8dc8f597596d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -25466,8 +25466,8 @@ R: Sergey Senozhatsky S: Maintained T: git git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux.git F: Documentation/core-api/printk-formats.rst +F: lib/tests/scanf_kunit.c F: lib/test_printf.c -F: lib/test_scanf.c F: lib/vsprintf.c VT1211 HARDWARE MONITOR DRIVER diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 85b95d645b10..bf3b8999a2ac 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -2436,6 +2436,15 @@ config ASYNC_RAID6_TEST config TEST_HEXDUMP tristate "Test functions located in the hexdump module at runtime" +config SCANF_KUNIT_TEST + tristate "KUnit test scanf() family of functions at runtime" if !KUNIT_ALL_TESTS + depends on KUNIT + default KUNIT_ALL_TESTS + help + Enable this option to test the scanf functions at runtime. + + If unsure, say N. + config STRING_KUNIT_TEST tristate "KUnit test string functions at runtime" if !KUNIT_ALL_TESTS depends on KUNIT @@ -2452,9 +2461,6 @@ config TEST_KSTRTOX config TEST_PRINTF tristate "Test printf() family of functions at runtime" -config TEST_SCANF - tristate "Test scanf() family of functions at runtime" - config TEST_BITMAP tristate "Test bitmap_*() family of functions at runtime" help diff --git a/lib/Makefile b/lib/Makefile index 961aef91d493..459ca67825f4 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -78,7 +78,6 @@ obj-$(CONFIG_TEST_STATIC_KEYS) += test_static_keys.o obj-$(CONFIG_TEST_STATIC_KEYS) += test_static_key_base.o obj-$(CONFIG_TEST_DYNAMIC_DEBUG) += test_dynamic_debug.o obj-$(CONFIG_TEST_PRINTF) += test_printf.o -obj-$(CONFIG_TEST_SCANF) += test_scanf.o obj-$(CONFIG_TEST_BITMAP) += test_bitmap.o ifeq ($(CONFIG_CC_IS_CLANG)$(CONFIG_KASAN),yy) diff --git a/lib/tests/Makefile b/lib/tests/Makefile index 8961fbcff7a4..db9b685f2d88 100644 --- a/lib/tests/Makefile +++ b/lib/tests/Makefile @@ -30,6 +30,7 @@ obj-$(CONFIG_LINEAR_RANGES_TEST) += test_linear_ranges.o obj-$(CONFIG_MEMCPY_KUNIT_TEST) += memcpy_kunit.o CFLAGS_overflow_kunit.o = $(call cc-disable-warning, tautological-constant-out-of-range-compare) obj-$(CONFIG_OVERFLOW_KUNIT_TEST) += overflow_kunit.o +obj-$(CONFIG_SCANF_KUNIT_TEST) += scanf_kunit.o obj-$(CONFIG_SIPHASH_KUNIT_TEST) += siphash_kunit.o obj-$(CONFIG_SLUB_KUNIT_TEST) += slub_kunit.o obj-$(CONFIG_TEST_SORT) += test_sort.o diff --git a/lib/test_scanf.c b/lib/tests/scanf_kunit.c similarity index 79% rename from lib/test_scanf.c rename to lib/tests/scanf_kunit.c index efdde6f498d9..3bbad9ebe437 100644 --- a/lib/test_scanf.c +++ b/lib/tests/scanf_kunit.c @@ -3,10 +3,8 @@ * Test cases for sscanf facility. */ -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - +#include #include -#include #include #include #include @@ -15,48 +13,35 @@ #include #include -#include "../tools/testing/selftests/kselftest_module.h" - #define BUF_SIZE 1024 -KSTM_MODULE_GLOBALS(); -static char *test_buffer __initdata; -static char *fmt_buffer __initdata; -static struct rnd_state rnd_state __initdata; +static char *test_buffer; +static char *fmt_buffer; +static struct rnd_state rnd_state; -typedef int (*check_fn)(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap); +typedef void (*check_fn)(struct kunit *test, const char *file, const int line, + const void *check_data, const char *string, const char *fmt, int n_args, + va_list ap); -static void __scanf(6, 0) __init -_test(const char *file, const int line, check_fn fn, const void *check_data, const char *string, - const char *fmt, int n_args, ...) +static void __scanf(7, 0) +_test(struct kunit *test, const char *file, const int line, check_fn fn, const void *check_data, + const char *string, const char *fmt, int n_args, ...) { va_list ap, ap_copy; int ret; - total_tests++; - va_start(ap, n_args); va_copy(ap_copy, ap); ret = vsscanf(string, fmt, ap_copy); va_end(ap_copy); if (ret != n_args) { - pr_warn("%s:%d: vsscanf(\"%s\", \"%s\", ...) returned %d expected %d\n", - file, line, string, fmt, ret, n_args); - goto fail; + KUNIT_FAIL(test, "%s:%d: vsscanf(\"%s\", \"%s\", ...) returned %d expected %d", + file, line, string, fmt, ret, n_args); + } else { + (*fn)(test, file, line, check_data, string, fmt, n_args, ap); } - ret = (*fn)(file, line, check_data, string, fmt, n_args, ap); - if (ret) - goto fail; - - va_end(ap); - - return; - -fail: - failed_tests++; va_end(ap); } @@ -65,88 +50,92 @@ do { \ for (; n_args > 0; n_args--, expect++) { \ typeof(*expect) got = *va_arg(ap, typeof(expect)); \ if (got != *expect) { \ - pr_warn("%s:%d, vsscanf(\"%s\", \"%s\", ...) expected " arg_fmt " got " arg_fmt "\n", \ - file, line, str, fmt, *expect, got); \ - return 1; \ + KUNIT_FAIL(test, \ + "%s:%d: vsscanf(\"%s\", \"%s\", ...) expected " arg_fmt " got " arg_fmt, \ + file, line, str, fmt, *expect, got); \ + return; \ } \ } \ - return 0; \ } while (0) -static int __init check_ull(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_ull(struct kunit *test, const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const unsigned long long *pval = check_data; _check_numbers_template("%llu", pval, string, fmt, n_args, ap); } -static int __init check_ll(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_ll(struct kunit *test, const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const long long *pval = check_data; _check_numbers_template("%lld", pval, string, fmt, n_args, ap); } -static int __init check_ulong(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_ulong(struct kunit *test, const char *file, const int line, + const void *check_data, const char *string, const char *fmt, int n_args, + va_list ap) { const unsigned long *pval = check_data; _check_numbers_template("%lu", pval, string, fmt, n_args, ap); } -static int __init check_long(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_long(struct kunit *test, const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const long *pval = check_data; _check_numbers_template("%ld", pval, string, fmt, n_args, ap); } -static int __init check_uint(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_uint(struct kunit *test, const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const unsigned int *pval = check_data; _check_numbers_template("%u", pval, string, fmt, n_args, ap); } -static int __init check_int(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_int(struct kunit *test, const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const int *pval = check_data; _check_numbers_template("%d", pval, string, fmt, n_args, ap); } -static int __init check_ushort(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_ushort(struct kunit *test, const char *file, const int line, + const void *check_data, const char *string, const char *fmt, int n_args, + va_list ap) { const unsigned short *pval = check_data; _check_numbers_template("%hu", pval, string, fmt, n_args, ap); } -static int __init check_short(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_short(struct kunit *test, const char *file, const int line, + const void *check_data, const char *string, const char *fmt, int n_args, + va_list ap) { const short *pval = check_data; _check_numbers_template("%hd", pval, string, fmt, n_args, ap); } -static int __init check_uchar(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_uchar(struct kunit *test, const char *file, const int line, + const void *check_data, const char *string, const char *fmt, int n_args, + va_list ap) { const unsigned char *pval = check_data; _check_numbers_template("%hhu", pval, string, fmt, n_args, ap); } -static int __init check_char(const char *file, const int line, const void *check_data, - const char *string, const char *fmt, int n_args, va_list ap) +static void check_char(struct kunit *test, const char *file, const int line, const void *check_data, + const char *string, const char *fmt, int n_args, va_list ap) { const signed char *pval = check_data; @@ -154,7 +143,7 @@ static int __init check_char(const char *file, const int line, const void *check } /* Selection of interesting numbers to test, copied from test-kstrtox.c */ -static const unsigned long long numbers[] __initconst = { +static const unsigned long long numbers[] = { 0x0ULL, 0x1ULL, 0x7fULL, @@ -194,7 +183,7 @@ do { \ T result = ~expect_val; /* should be overwritten */ \ \ snprintf(test_buffer, BUF_SIZE, gen_fmt, expect_val); \ - _test(__FILE__, __LINE__, fn, &expect_val, test_buffer, "%" scan_fmt, 1, &result); \ + _test(test, __FILE__, __LINE__, fn, &expect_val, test_buffer, "%" scan_fmt, 1, &result);\ } while (0) #define simple_numbers_loop(T, gen_fmt, scan_fmt, fn) \ @@ -212,7 +201,7 @@ do { \ } \ } while (0) -static void __init numbers_simple(void) +static void numbers_simple(struct kunit *test) { simple_numbers_loop(unsigned long long, "%llu", "llu", check_ull); simple_numbers_loop(long long, "%lld", "lld", check_ll); @@ -265,14 +254,14 @@ static void __init numbers_simple(void) * the raw prandom*() functions (Not mathematically rigorous!!). * Variabilty of length and value is more important than perfect randomness. */ -static u32 __init next_test_random(u32 max_bits) +static u32 next_test_random(u32 max_bits) { u32 n_bits = hweight32(prandom_u32_state(&rnd_state)) % (max_bits + 1); return prandom_u32_state(&rnd_state) & GENMASK(n_bits, 0); } -static unsigned long long __init next_test_random_ull(void) +static unsigned long long next_test_random_ull(void) { u32 rand1 = prandom_u32_state(&rnd_state); u32 n_bits = (hweight32(rand1) * 3) % 64; @@ -309,7 +298,7 @@ do { \ * updating buf_pos and returning the number of characters appended. * On error buf_pos is not changed and return value is 0. */ -static int __init __printf(4, 5) +static int __printf(4, 5) append_fmt(char *buf, int *buf_pos, int buf_len, const char *val_fmt, ...) { va_list ap; @@ -331,7 +320,7 @@ append_fmt(char *buf, int *buf_pos, int buf_len, const char *val_fmt, ...) * Convenience function to append the field delimiter string * to both the value string and format string buffers. */ -static void __init append_delim(char *str_buf, int *str_buf_pos, int str_buf_len, +static void append_delim(char *str_buf, int *str_buf_pos, int str_buf_len, char *fmt_buf, int *fmt_buf_pos, int fmt_buf_len, const char *delim_str) { @@ -342,7 +331,7 @@ static void __init append_delim(char *str_buf, int *str_buf_pos, int str_buf_len #define test_array_8(fn, check_data, string, fmt, arr) \ do { \ BUILD_BUG_ON(ARRAY_SIZE(arr) != 8); \ - _test(__FILE__, __LINE__, fn, check_data, string, fmt, 8, \ + _test(test, __FILE__, __LINE__, fn, check_data, string, fmt, 8, \ &(arr)[0], &(arr)[1], &(arr)[2], &(arr)[3], \ &(arr)[4], &(arr)[5], &(arr)[6], &(arr)[7]); \ } while (0) @@ -396,7 +385,7 @@ do { \ test_array_8(fn, expect, test_buffer, fmt_buffer, result); \ } while (0) -static void __init numbers_list_ll(const char *delim) +static void numbers_list_ll(struct kunit *test, const char *delim) { numbers_list_8(unsigned long long, "%llu", delim, "llu", check_ull); numbers_list_8(long long, "%lld", delim, "lld", check_ll); @@ -406,7 +395,7 @@ static void __init numbers_list_ll(const char *delim) numbers_list_8(long long, "0x%llx", delim, "lli", check_ll); } -static void __init numbers_list_l(const char *delim) +static void numbers_list_l(struct kunit *test, const char *delim) { numbers_list_8(unsigned long, "%lu", delim, "lu", check_ulong); numbers_list_8(long, "%ld", delim, "ld", check_long); @@ -416,7 +405,7 @@ static void __init numbers_list_l(const char *delim) numbers_list_8(long, "0x%lx", delim, "li", check_long); } -static void __init numbers_list_d(const char *delim) +static void numbers_list_d(struct kunit *test, const char *delim) { numbers_list_8(unsigned int, "%u", delim, "u", check_uint); numbers_list_8(int, "%d", delim, "d", check_int); @@ -426,7 +415,7 @@ static void __init numbers_list_d(const char *delim) numbers_list_8(int, "0x%x", delim, "i", check_int); } -static void __init numbers_list_h(const char *delim) +static void numbers_list_h(struct kunit *test, const char *delim) { numbers_list_8(unsigned short, "%hu", delim, "hu", check_ushort); numbers_list_8(short, "%hd", delim, "hd", check_short); @@ -436,7 +425,7 @@ static void __init numbers_list_h(const char *delim) numbers_list_8(short, "0x%hx", delim, "hi", check_short); } -static void __init numbers_list_hh(const char *delim) +static void numbers_list_hh(struct kunit *test, const char *delim) { numbers_list_8(unsigned char, "%hhu", delim, "hhu", check_uchar); numbers_list_8(signed char, "%hhd", delim, "hhd", check_char); @@ -446,16 +435,16 @@ static void __init numbers_list_hh(const char *delim) numbers_list_8(signed char, "0x%hhx", delim, "hhi", check_char); } -static void __init numbers_list(const char *delim) +static void numbers_list(struct kunit *test, const char *delim) { - numbers_list_ll(delim); - numbers_list_l(delim); - numbers_list_d(delim); - numbers_list_h(delim); - numbers_list_hh(delim); + numbers_list_ll(test, delim); + numbers_list_l(test, delim); + numbers_list_d(test, delim); + numbers_list_h(test, delim); + numbers_list_hh(test, delim); } -static void __init numbers_list_field_width_ll(const char *delim) +static void numbers_list_field_width_ll(struct kunit *test, const char *delim) { numbers_list_fix_width(unsigned long long, "%llu", delim, 20, "llu", check_ull); numbers_list_fix_width(long long, "%lld", delim, 20, "lld", check_ll); @@ -465,7 +454,7 @@ static void __init numbers_list_field_width_ll(const char *delim) numbers_list_fix_width(long long, "0x%llx", delim, 18, "lli", check_ll); } -static void __init numbers_list_field_width_l(const char *delim) +static void numbers_list_field_width_l(struct kunit *test, const char *delim) { #if BITS_PER_LONG == 64 numbers_list_fix_width(unsigned long, "%lu", delim, 20, "lu", check_ulong); @@ -484,7 +473,7 @@ static void __init numbers_list_field_width_l(const char *delim) #endif } -static void __init numbers_list_field_width_d(const char *delim) +static void numbers_list_field_width_d(struct kunit *test, const char *delim) { numbers_list_fix_width(unsigned int, "%u", delim, 10, "u", check_uint); numbers_list_fix_width(int, "%d", delim, 11, "d", check_int); @@ -494,7 +483,7 @@ static void __init numbers_list_field_width_d(const char *delim) numbers_list_fix_width(int, "0x%x", delim, 10, "i", check_int); } -static void __init numbers_list_field_width_h(const char *delim) +static void numbers_list_field_width_h(struct kunit *test, const char *delim) { numbers_list_fix_width(unsigned short, "%hu", delim, 5, "hu", check_ushort); numbers_list_fix_width(short, "%hd", delim, 6, "hd", check_short); @@ -504,7 +493,7 @@ static void __init numbers_list_field_width_h(const char *delim) numbers_list_fix_width(short, "0x%hx", delim, 6, "hi", check_short); } -static void __init numbers_list_field_width_hh(const char *delim) +static void numbers_list_field_width_hh(struct kunit *test, const char *delim) { numbers_list_fix_width(unsigned char, "%hhu", delim, 3, "hhu", check_uchar); numbers_list_fix_width(signed char, "%hhd", delim, 4, "hhd", check_char); @@ -518,16 +507,16 @@ static void __init numbers_list_field_width_hh(const char *delim) * List of numbers separated by delim. Each field width specifier is the * maximum possible digits for the given type and base. */ -static void __init numbers_list_field_width_typemax(const char *delim) +static void numbers_list_field_width_typemax(struct kunit *test, const char *delim) { - numbers_list_field_width_ll(delim); - numbers_list_field_width_l(delim); - numbers_list_field_width_d(delim); - numbers_list_field_width_h(delim); - numbers_list_field_width_hh(delim); + numbers_list_field_width_ll(test, delim); + numbers_list_field_width_l(test, delim); + numbers_list_field_width_d(test, delim); + numbers_list_field_width_h(test, delim); + numbers_list_field_width_hh(test, delim); } -static void __init numbers_list_field_width_val_ll(const char *delim) +static void numbers_list_field_width_val_ll(struct kunit *test, const char *delim) { numbers_list_val_width(unsigned long long, "%llu", delim, "llu", check_ull); numbers_list_val_width(long long, "%lld", delim, "lld", check_ll); @@ -537,7 +526,7 @@ static void __init numbers_list_field_width_val_ll(const char *delim) numbers_list_val_width(long long, "0x%llx", delim, "lli", check_ll); } -static void __init numbers_list_field_width_val_l(const char *delim) +static void numbers_list_field_width_val_l(struct kunit *test, const char *delim) { numbers_list_val_width(unsigned long, "%lu", delim, "lu", check_ulong); numbers_list_val_width(long, "%ld", delim, "ld", check_long); @@ -547,7 +536,7 @@ static void __init numbers_list_field_width_val_l(const char *delim) numbers_list_val_width(long, "0x%lx", delim, "li", check_long); } -static void __init numbers_list_field_width_val_d(const char *delim) +static void numbers_list_field_width_val_d(struct kunit *test, const char *delim) { numbers_list_val_width(unsigned int, "%u", delim, "u", check_uint); numbers_list_val_width(int, "%d", delim, "d", check_int); @@ -557,7 +546,7 @@ static void __init numbers_list_field_width_val_d(const char *delim) numbers_list_val_width(int, "0x%x", delim, "i", check_int); } -static void __init numbers_list_field_width_val_h(const char *delim) +static void numbers_list_field_width_val_h(struct kunit *test, const char *delim) { numbers_list_val_width(unsigned short, "%hu", delim, "hu", check_ushort); numbers_list_val_width(short, "%hd", delim, "hd", check_short); @@ -567,7 +556,7 @@ static void __init numbers_list_field_width_val_h(const char *delim) numbers_list_val_width(short, "0x%hx", delim, "hi", check_short); } -static void __init numbers_list_field_width_val_hh(const char *delim) +static void numbers_list_field_width_val_hh(struct kunit *test, const char *delim) { numbers_list_val_width(unsigned char, "%hhu", delim, "hhu", check_uchar); numbers_list_val_width(signed char, "%hhd", delim, "hhd", check_char); @@ -581,13 +570,13 @@ static void __init numbers_list_field_width_val_hh(const char *delim) * List of numbers separated by delim. Each field width specifier is the * exact length of the corresponding value digits in the string being scanned. */ -static void __init numbers_list_field_width_val_width(const char *delim) +static void numbers_list_field_width_val_width(struct kunit *test, const char *delim) { - numbers_list_field_width_val_ll(delim); - numbers_list_field_width_val_l(delim); - numbers_list_field_width_val_d(delim); - numbers_list_field_width_val_h(delim); - numbers_list_field_width_val_hh(delim); + numbers_list_field_width_val_ll(test, delim); + numbers_list_field_width_val_l(test, delim); + numbers_list_field_width_val_d(test, delim); + numbers_list_field_width_val_h(test, delim); + numbers_list_field_width_val_hh(test, delim); } /* @@ -596,9 +585,9 @@ static void __init numbers_list_field_width_val_width(const char *delim) * of digits. For example the hex values c0,3,bf01,303 would have a * string representation of "c03bf01303" and extracted with "%2x%1x%4x%3x". */ -static void __init numbers_slice(void) +static void numbers_slice(struct kunit *test) { - numbers_list_field_width_val_width(""); + numbers_list_field_width_val_width(test, ""); } #define test_number_prefix(T, str, scan_fmt, expect0, expect1, n_args, fn) \ @@ -606,14 +595,14 @@ do { \ const T expect[2] = { expect0, expect1 }; \ T result[2] = { (T)~expect[0], (T)~expect[1] }; \ \ - _test(__FILE__, __LINE__, fn, &expect, str, scan_fmt, n_args, &result[0], &result[1]); \ + _test(test, __FILE__, __LINE__, fn, &expect, str, scan_fmt, n_args, &result[0], &result[1]);\ } while (0) /* * Number prefix is >= field width. * Expected behaviour is derived from testing userland sscanf. */ -static void __init numbers_prefix_overflow(void) +static void numbers_prefix_overflow(struct kunit *test) { /* * Negative decimal with a field of width 1, should quit scanning @@ -682,24 +671,17 @@ do { \ T got; \ char *endp; \ int len; \ - bool fail = false; \ \ - total_tests++; \ len = snprintf(test_buffer, BUF_SIZE, gen_fmt, expect); \ got = (fn)(test_buffer, &endp, base); \ if (got != (expect)) { \ - fail = true; \ - pr_warn(#fn "(\"%s\", %d): got " gen_fmt " expected " gen_fmt "\n", \ - test_buffer, base, got, expect); \ + KUNIT_FAIL(test, #fn "(\"%s\", %d): got " gen_fmt " expected " gen_fmt, \ + test_buffer, base, got, expect); \ } else if (endp != test_buffer + len) { \ - fail = true; \ - pr_warn(#fn "(\"%s\", %d) startp=0x%px got endp=0x%px expected 0x%px\n", \ - test_buffer, base, test_buffer, \ - test_buffer + len, endp); \ + KUNIT_FAIL(test, #fn "(\"%s\", %d) startp=0x%px got endp=0x%px expected 0x%px", \ + test_buffer, base, test_buffer, \ + test_buffer + len, endp); \ } \ - \ - if (fail) \ - failed_tests++; \ } while (0) #define test_simple_strtoxx(T, fn, gen_fmt, base) \ @@ -715,7 +697,7 @@ do { \ } \ } while (0) -static void __init test_simple_strtoull(void) +static void test_simple_strtoull(struct kunit *test) { test_simple_strtoxx(unsigned long long, simple_strtoull, "%llu", 10); test_simple_strtoxx(unsigned long long, simple_strtoull, "%llu", 0); @@ -724,7 +706,7 @@ static void __init test_simple_strtoull(void) test_simple_strtoxx(unsigned long long, simple_strtoull, "0x%llx", 0); } -static void __init test_simple_strtoll(void) +static void test_simple_strtoll(struct kunit *test) { test_simple_strtoxx(long long, simple_strtoll, "%lld", 10); test_simple_strtoxx(long long, simple_strtoll, "%lld", 0); @@ -733,7 +715,7 @@ static void __init test_simple_strtoll(void) test_simple_strtoxx(long long, simple_strtoll, "0x%llx", 0); } -static void __init test_simple_strtoul(void) +static void test_simple_strtoul(struct kunit *test) { test_simple_strtoxx(unsigned long, simple_strtoul, "%lu", 10); test_simple_strtoxx(unsigned long, simple_strtoul, "%lu", 0); @@ -742,7 +724,7 @@ static void __init test_simple_strtoul(void) test_simple_strtoxx(unsigned long, simple_strtoul, "0x%lx", 0); } -static void __init test_simple_strtol(void) +static void test_simple_strtol(struct kunit *test) { test_simple_strtoxx(long, simple_strtol, "%ld", 10); test_simple_strtoxx(long, simple_strtol, "%ld", 0); @@ -752,35 +734,35 @@ static void __init test_simple_strtol(void) } /* Selection of common delimiters/separators between numbers in a string. */ -static const char * const number_delimiters[] __initconst = { +static const char * const number_delimiters[] = { " ", ":", ",", "-", "/", }; -static void __init test_numbers(void) +static void test_numbers(struct kunit *test) { int i; /* String containing only one number. */ - numbers_simple(); + numbers_simple(test); /* String with multiple numbers separated by delimiter. */ for (i = 0; i < ARRAY_SIZE(number_delimiters); i++) { - numbers_list(number_delimiters[i]); + numbers_list(test, number_delimiters[i]); /* Field width may be longer than actual field digits. */ - numbers_list_field_width_typemax(number_delimiters[i]); + numbers_list_field_width_typemax(test, number_delimiters[i]); /* Each field width exactly length of actual field digits. */ - numbers_list_field_width_val_width(number_delimiters[i]); + numbers_list_field_width_val_width(test, number_delimiters[i]); } /* Slice continuous sequence of digits using field widths. */ - numbers_slice(); + numbers_slice(test); - numbers_prefix_overflow(); + numbers_prefix_overflow(test); } -static void __init selftest(void) +static void scanf_test(struct kunit *test) { test_buffer = kmalloc(BUF_SIZE, GFP_KERNEL); if (!test_buffer) @@ -794,18 +776,29 @@ static void __init selftest(void) prandom_seed_state(&rnd_state, 3141592653589793238ULL); - test_numbers(); + test_numbers(test); - test_simple_strtoull(); - test_simple_strtoll(); - test_simple_strtoul(); - test_simple_strtol(); + test_simple_strtoull(test); + test_simple_strtoll(test); + test_simple_strtoul(test); + test_simple_strtol(test); kfree(fmt_buffer); kfree(test_buffer); } -KSTM_MODULE_LOADERS(test_scanf); +static struct kunit_case scanf_test_cases[] = { + KUNIT_CASE(scanf_test), + {} +}; + +static struct kunit_suite scanf_test_suite = { + .name = "scanf", + .test_cases = scanf_test_cases, +}; + +kunit_test_suite(scanf_test_suite); + MODULE_AUTHOR("Richard Fitzgerald "); MODULE_DESCRIPTION("Test cases for sscanf facility"); MODULE_LICENSE("GPL v2"); diff --git a/tools/testing/selftests/lib/Makefile b/tools/testing/selftests/lib/Makefile index c52fe3ad8e98..4afda556151f 100644 --- a/tools/testing/selftests/lib/Makefile +++ b/tools/testing/selftests/lib/Makefile @@ -4,5 +4,5 @@ # No binaries, but make sure arg-less "make" doesn't trigger "run_tests" all: -TEST_PROGS := printf.sh bitmap.sh prime_numbers.sh scanf.sh +TEST_PROGS := printf.sh bitmap.sh prime_numbers.sh include ../lib.mk diff --git a/tools/testing/selftests/lib/config b/tools/testing/selftests/lib/config index 306a3d4dca98..1d17fa85de8f 100644 --- a/tools/testing/selftests/lib/config +++ b/tools/testing/selftests/lib/config @@ -1,4 +1,3 @@ CONFIG_TEST_PRINTF=m -CONFIG_TEST_SCANF=m CONFIG_TEST_BITMAP=m CONFIG_TEST_BITOPS=m diff --git a/tools/testing/selftests/lib/scanf.sh b/tools/testing/selftests/lib/scanf.sh deleted file mode 100755 index b59b8ba561c3..000000000000 --- a/tools/testing/selftests/lib/scanf.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Tests the scanf infrastructure using test_scanf kernel module. -$(dirname $0)/../kselftest/module.sh "scanf" test_scanf From patchwork Fri Feb 14 16:20:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tamir Duberstein X-Patchwork-Id: 865393 Received: from mail-qt1-f176.google.com (mail-qt1-f176.google.com [209.85.160.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3EA63267AE8; Fri, 14 Feb 2025 16:20:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739550023; cv=none; b=ADr9DUv3eek/HKmOck/TG/J4FDuyKoKU0a2fscNn7zYXCXDl4+S25FR/24fNwj6Kh05jroecwSzhzeUK/0YbdAskEVHn2E9/mhCuYSwKV47s3nvW0+xwlckduKyA0xe6zarKPtgRKxFecYPxiyCf5xqVJg8BtnVk8RyfAEDhey8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739550023; c=relaxed/simple; bh=hFIdtrrfEFBYDz5o5JUKbXTS33/240JJ6HCd+hbDb8o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=isnh6ZSb/1Oan8bwwcX8qyIWWinlz/RmtJfN4F3ZmZiWesKaBn9UKo/E7cvhIBZVk+s9lIv5GRqEgDY32OhhSrlY+IZoHLj2X0J+809nwuaMRCNeYFVHOBlAnLssY7GviuSioMG2eiEe2BgxyNJ1x/iLaJIpNqr3rxYtZKCv70s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=LqK3BHfX; arc=none smtp.client-ip=209.85.160.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LqK3BHfX" Received: by mail-qt1-f176.google.com with SMTP id d75a77b69052e-471b36d6766so19958461cf.2; Fri, 14 Feb 2025 08:20:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739550020; x=1740154820; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=HY5XrygemAI7GO6XQVsrwKH+b6zMhA6wwjDH5Lplluc=; b=LqK3BHfX349qlDAA/vmlEfBghB744Cjfiqd5YbweeFfmRYN9LuzCn3DpYWzsVRwuGm DOZasQYSGkpyr8o0eZD/SqkpoFdgCV094ihdvsjO0VoKTQAZzpftcYYUC6VhH+EGe/CB 2XgqWwOeiBMItCBHQt1BHyI+fQJTpK5jnBpKY53yGJXUf3KaWo4GqfQF+VZPJYKv2s+T SuRTqgw0a/q7DmkKeN5XPlFiunA6qEIXsmSZIXoLWRWT101UjI7b66TqkVwqKV92hbkL ZTjvAxvUSIwQQ0IpYDNQA1DvJbFmRDsu5F0GilfYg+4mQoGBvLKm6c8DazxcpfnDI1cw zZRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739550020; x=1740154820; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=HY5XrygemAI7GO6XQVsrwKH+b6zMhA6wwjDH5Lplluc=; b=Pfmp+Cg2hLi3QoKg08PwxOQQIjNPohuQTWB0pPJE67R9WYwea0zvEe5eLRtKxYXYb7 SsJ6OPhNEdePtJOAyrkAzmS6POv552Yk+u0qaspFimyGQqe3aIbCo1T+suZZxgzASUlK nyYaO9SSCEYj9iahybFFogtBrZb7nVzvj2VZJIPyWAzZkFDJyVVpak0ImEdHRQhHKKUO j9x1PFn4Z7BBycBHENSZzax0J8xo/yUVMezeRKBnB2wRhaFH5vLOnzKTnaCKwblCkuV9 cX7tUa5l7FFvUxqGpTo/POBvl2qnkbziPnSKU2V4XeqttzY96FDANjjbbtQGQm/fX6KK EYAw== X-Forwarded-Encrypted: i=1; AJvYcCUFPBvLOxuCwkVKV2uK+NxxwDNhtKZMVqa6Xm6eTjTgEq/ENpO5rDnskqP+3MdBXHTFkJSBSuYx8VsqkCo=@vger.kernel.org, AJvYcCUwSSpXG6csK13i0yc7BsGxbdp0t90B/wlJV0BjZQKD7bJ7yiOkh7Sr4uYI8qyHimXd8eW1uZdfYiVb0eBlQ2my@vger.kernel.org X-Gm-Message-State: AOJu0Ywea9O9tyUoUZVkSPwyRM3bgn41ui7Vq+h3uoTmG6+402HT+ES3 ICEqIDs+JE0XiQEpot35/au5YRwuBhAQR7Nj4ci0tSGc0NHSi3Ae X-Gm-Gg: ASbGncv6bNcV3XvIZP9oi/S5QbiUuxNYgp9fB2PIFf/aBzlRVDG9vQbLbdR5aye0dHB HVGhjY/Up6J3cCqA61Q/OilE5CtyFSpnuC3GNR9hb8U4Q1TKiIAXfcn6Dd+yfdPi45MuUCPoG/H zs6Um0NGcYkny3mkXyXyRMo587xe67kUDbwacfZufzlCxcbq+JcsUBf3UF8FVy44j9th8+RiLQN g8X22fnT2uuy31RoJsBGv9+ZRfew1/gebtMNPe1Cbg3JjH65eFMR6RQTHOIfW5N8bVreHn8G4JX nyhF5qxvYRSWoLzFYP9aeBDUEKhvVyf6xVWPAw== X-Google-Smtp-Source: AGHT+IEEligZE+6AVvNn+kyi+tOG0B57/J0XUYVp2UKssML2RX4ygkFmKyYDx8RbUoBtxNhzoM6S6Q== X-Received: by 2002:a05:622a:189a:b0:467:5d0b:c750 with SMTP id d75a77b69052e-471bed70234mr118061011cf.22.1739550020087; Fri, 14 Feb 2025 08:20:20 -0800 (PST) Received: from [192.168.1.159] ([2600:4041:5be7:7c00:d4df:402c:65f0:87da]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-471c2af37c7sm19196911cf.61.2025.02.14.08.20.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Feb 2025 08:20:19 -0800 (PST) From: Tamir Duberstein Date: Fri, 14 Feb 2025 11:20:01 -0500 Subject: [PATCH v8 4/4] scanf: break kunit into test cases Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250214-scanf-kunit-convert-v8-4-5ea50f95f83c@gmail.com> References: <20250214-scanf-kunit-convert-v8-0-5ea50f95f83c@gmail.com> In-Reply-To: <20250214-scanf-kunit-convert-v8-0-5ea50f95f83c@gmail.com> To: David Gow , Petr Mladek , Steven Rostedt , Andy Shevchenko , Rasmus Villemoes , Sergey Senozhatsky , Andrew Morton , Shuah Khan Cc: Geert Uytterhoeven , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Tamir Duberstein X-Mailer: b4 0.15-dev Use `suite_init` and move some tests into `scanf_test_cases`. This gives us nicer output in the event of a failure. Reviewed-by: David Gow Signed-off-by: Tamir Duberstein --- lib/tests/scanf_kunit.c | 95 ++++++++++++++++++++++++++----------------------- 1 file changed, 51 insertions(+), 44 deletions(-) diff --git a/lib/tests/scanf_kunit.c b/lib/tests/scanf_kunit.c index 3bbad9ebe437..fa215a7db366 100644 --- a/lib/tests/scanf_kunit.c +++ b/lib/tests/scanf_kunit.c @@ -4,14 +4,10 @@ */ #include -#include -#include #include -#include -#include #include #include -#include +#include #define BUF_SIZE 1024 @@ -50,10 +46,9 @@ do { \ for (; n_args > 0; n_args--, expect++) { \ typeof(*expect) got = *va_arg(ap, typeof(expect)); \ if (got != *expect) { \ - KUNIT_FAIL(test, \ - "%s:%d: vsscanf(\"%s\", \"%s\", ...) expected " arg_fmt " got " arg_fmt, \ - file, line, str, fmt, *expect, got); \ - return; \ + KUNIT_FAIL_AND_ABORT(test, \ + "%s:%d: vsscanf(\"%s\", \"%s\", ...) expected " arg_fmt " got " arg_fmt, \ + file, line, str, fmt, *expect, got); \ } \ } \ } while (0) @@ -435,8 +430,11 @@ static void numbers_list_hh(struct kunit *test, const char *delim) numbers_list_8(signed char, "0x%hhx", delim, "hhi", check_char); } -static void numbers_list(struct kunit *test, const char *delim) +static void numbers_list(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_ll(test, delim); numbers_list_l(test, delim); numbers_list_d(test, delim); @@ -507,8 +505,11 @@ static void numbers_list_field_width_hh(struct kunit *test, const char *delim) * List of numbers separated by delim. Each field width specifier is the * maximum possible digits for the given type and base. */ -static void numbers_list_field_width_typemax(struct kunit *test, const char *delim) +static void numbers_list_field_width_typemax(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_field_width_ll(test, delim); numbers_list_field_width_l(test, delim); numbers_list_field_width_d(test, delim); @@ -570,8 +571,11 @@ static void numbers_list_field_width_val_hh(struct kunit *test, const char *deli * List of numbers separated by delim. Each field width specifier is the * exact length of the corresponding value digits in the string being scanned. */ -static void numbers_list_field_width_val_width(struct kunit *test, const char *delim) +static void numbers_list_field_width_val_width(struct kunit *test) { + const char * const *param = test->param_value; + const char *delim = *param; + numbers_list_field_width_val_ll(test, delim); numbers_list_field_width_val_l(test, delim); numbers_list_field_width_val_d(test, delim); @@ -587,7 +591,12 @@ static void numbers_list_field_width_val_width(struct kunit *test, const char *d */ static void numbers_slice(struct kunit *test) { - numbers_list_field_width_val_width(test, ""); + const char *delim = ""; + + KUNIT_ASSERT_PTR_EQ(test, test->param_value, NULL); + test->param_value = &delim; + + numbers_list_field_width_val_width(test); } #define test_number_prefix(T, str, scan_fmt, expect0, expect1, n_args, fn) \ @@ -738,62 +747,60 @@ static const char * const number_delimiters[] = { " ", ":", ",", "-", "/", }; -static void test_numbers(struct kunit *test) +static void number_delimiter_param_desc(const char * const *param, + char *desc) { - int i; + snprintf(desc, KUNIT_PARAM_DESC_SIZE, "\"%s\"", *param); +} - /* String containing only one number. */ - numbers_simple(test); +KUNIT_ARRAY_PARAM(number_delimiters, number_delimiters, number_delimiter_param_desc); +static struct kunit_case scanf_test_cases[] = { + KUNIT_CASE(numbers_simple), /* String with multiple numbers separated by delimiter. */ - for (i = 0; i < ARRAY_SIZE(number_delimiters); i++) { - numbers_list(test, number_delimiters[i]); - - /* Field width may be longer than actual field digits. */ - numbers_list_field_width_typemax(test, number_delimiters[i]); - - /* Each field width exactly length of actual field digits. */ - numbers_list_field_width_val_width(test, number_delimiters[i]); - } - + KUNIT_CASE_PARAM(numbers_list, number_delimiters_gen_params), + /* Field width may be longer than actual field digits. */ + KUNIT_CASE_PARAM(numbers_list_field_width_typemax, number_delimiters_gen_params), + /* Each field width exactly length of actual field digits. */ + KUNIT_CASE_PARAM(numbers_list_field_width_val_width, number_delimiters_gen_params), /* Slice continuous sequence of digits using field widths. */ - numbers_slice(test); + KUNIT_CASE(numbers_slice), + KUNIT_CASE(numbers_prefix_overflow), - numbers_prefix_overflow(test); -} + KUNIT_CASE(test_simple_strtoull), + KUNIT_CASE(test_simple_strtoll), + KUNIT_CASE(test_simple_strtoul), + KUNIT_CASE(test_simple_strtol), + {} +}; -static void scanf_test(struct kunit *test) +static int scanf_suite_init(struct kunit_suite *suite) { test_buffer = kmalloc(BUF_SIZE, GFP_KERNEL); if (!test_buffer) - return; + return -ENOMEM; fmt_buffer = kmalloc(BUF_SIZE, GFP_KERNEL); if (!fmt_buffer) { kfree(test_buffer); - return; + return -ENOMEM; } prandom_seed_state(&rnd_state, 3141592653589793238ULL); - test_numbers(test); - - test_simple_strtoull(test); - test_simple_strtoll(test); - test_simple_strtoul(test); - test_simple_strtol(test); + return 0; +} +static void scanf_suite_exit(struct kunit_suite *suite) +{ kfree(fmt_buffer); kfree(test_buffer); } -static struct kunit_case scanf_test_cases[] = { - KUNIT_CASE(scanf_test), - {} -}; - static struct kunit_suite scanf_test_suite = { .name = "scanf", + .suite_init = scanf_suite_init, + .suite_exit = scanf_suite_exit, .test_cases = scanf_test_cases, };