public inbox for linux-cifs@vger.kernel.org
 help / color / mirror / Atom feed
From: huiwen.he@linux.dev
To: smfrench@gmail.com, linkinjeon@kernel.org, dhowells@redhat.com,
	chenxiaosong@kylinos.cn, chenxiaosong@chenxiaosong.com,
	tangyouling@kylinos.cn
Cc: linux-cifs@vger.kernel.org
Subject: [PATCH v3 07/13] smb/client: introduce KUnit test to check ntstatus_to_dos_map search
Date: Thu,  2 Apr 2026 14:18:33 +0000	[thread overview]
Message-ID: <20260402141839.461257-8-huiwen.he@linux.dev> (raw)
In-Reply-To: <20260402141839.461257-1-huiwen.he@linux.dev>

From: Youling Tang <tangyouling@kylinos.cn>

Check whether all elements can be correctly found in the array.

Introduce CONFIG_SMB1_KUNIT_TESTS for smb1maperror_test.ko since
smb1maperror.o is only built when CONFIG_CIFS_ALLOW_INSECURE_LEGACY
is enabled.

We are going to define 3 functions to check the search results, introduce
the macro DEFINE_CHECK_SEARCH_FUNC() to reduce duplicate code.

Signed-off-by: Youling Tang <tangyouling@kylinos.cn>
Reviewed-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
---
 fs/smb/client/Kconfig             | 11 ++++++
 fs/smb/client/Makefile            |  1 +
 fs/smb/client/smb1maperror.c      | 19 ++++++++++
 fs/smb/client/smb1maperror_test.c | 61 +++++++++++++++++++++++++++++++
 fs/smb/client/smb1proto.h         |  4 ++
 5 files changed, 96 insertions(+)
 create mode 100644 fs/smb/client/smb1maperror_test.c

diff --git a/fs/smb/client/Kconfig b/fs/smb/client/Kconfig
index 17bd368574e9..2e72d3c8423f 100644
--- a/fs/smb/client/Kconfig
+++ b/fs/smb/client/Kconfig
@@ -217,4 +217,15 @@ config CIFS_COMPRESSION
 	  Say Y here if you want SMB traffic to be compressed.
 	  If unsure, say N.
 
+config SMB1_KUNIT_TESTS
+	tristate "KUnit tests for SMB1"
+	depends on SMB_KUNIT_TESTS && CIFS_ALLOW_INSECURE_LEGACY
+	default SMB_KUNIT_TESTS
+	help
+	  This builds the SMB1-specific KUnit tests.
+
+	  These tests are only enabled when legacy insecure SMB1 support
+	  (CIFS_ALLOW_INSECURE_LEGACY) is enabled.
+
+	  If unsure, say N.
 endif
diff --git a/fs/smb/client/Makefile b/fs/smb/client/Makefile
index 8560fe99ec2b..220a97c8a488 100644
--- a/fs/smb/client/Makefile
+++ b/fs/smb/client/Makefile
@@ -71,6 +71,7 @@ $(obj)/smb2maperror.o: $(obj)/smb2_mapping_table.c
 quiet_cmd_gen_smb2_mapping = GEN     $@
       cmd_gen_smb2_mapping = perl $(src)/gen_smb2_mapping $< $@
 
+obj-$(CONFIG_SMB1_KUNIT_TESTS) += smb1maperror_test.o
 obj-$(CONFIG_SMB_KUNIT_TESTS) += smb2maperror_test.o
 
 # Let Kbuild handle tracking and cleaning
diff --git a/fs/smb/client/smb1maperror.c b/fs/smb/client/smb1maperror.c
index 66ceebbe535e..419057f296a7 100644
--- a/fs/smb/client/smb1maperror.c
+++ b/fs/smb/client/smb1maperror.c
@@ -288,3 +288,22 @@ int __init smb1_init_maperror(void)
 
 	return rc;
 }
+
+#if IS_ENABLED(CONFIG_SMB1_KUNIT_TESTS)
+#define EXPORT_SYMBOL_FOR_SMB_TEST(sym) \
+	EXPORT_SYMBOL_FOR_MODULES(sym, "smb1maperror_test")
+
+const struct ntstatus_to_dos_err *
+search_ntstatus_to_dos_map_test(__u32 ntstatus)
+{
+	return search_ntstatus_to_dos_map(ntstatus);
+}
+EXPORT_SYMBOL_FOR_SMB_TEST(search_ntstatus_to_dos_map_test);
+
+const struct ntstatus_to_dos_err *
+ntstatus_to_dos_map_test = ntstatus_to_dos_map;
+EXPORT_SYMBOL_FOR_SMB_TEST(ntstatus_to_dos_map_test);
+
+unsigned int ntstatus_to_dos_num = ARRAY_SIZE(ntstatus_to_dos_map);
+EXPORT_SYMBOL_FOR_SMB_TEST(ntstatus_to_dos_num);
+#endif
diff --git a/fs/smb/client/smb1maperror_test.c b/fs/smb/client/smb1maperror_test.c
new file mode 100644
index 000000000000..b38857dc388c
--- /dev/null
+++ b/fs/smb/client/smb1maperror_test.c
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ *
+ *   KUnit tests of SMB1 maperror
+ *
+ *   Copyright (C) 2026 KylinSoft Co., Ltd. All rights reserved.
+ *   Author(s): Youling Tang <tangyouling@kylinos.cn>
+ *              ChenXiaoSong <chenxiaosong@kylinos.cn>
+ *
+ */
+
+#include <kunit/test.h>
+#include "smb1proto.h"
+#include "nterr.h"
+
+extern const struct ntstatus_to_dos_err *ntstatus_to_dos_map_test;
+extern unsigned int ntstatus_to_dos_num;
+
+#define DEFINE_CHECK_SEARCH_FUNC(__struct_name, __field,		\
+				 __array, __num)			\
+static void check_search_ ## __array(struct kunit *test)		\
+{									\
+	unsigned int i;							\
+	const struct __struct_name *expect, *result;			\
+									\
+	for (i = 0; i < __num; i++) {					\
+		expect = &__array ## _test[i];				\
+		result = search_ ## __array ## _test(expect->__field);	\
+		KUNIT_ASSERT_NOT_NULL(test, result);			\
+		test_cmp_ ## __struct_name(test, expect, result);	\
+	}								\
+}
+
+static void
+test_cmp_ntstatus_to_dos_err(struct kunit *test,
+			     const struct ntstatus_to_dos_err *expect,
+			     const struct ntstatus_to_dos_err *result)
+{
+	KUNIT_EXPECT_EQ(test, expect->dos_class, result->dos_class);
+	KUNIT_EXPECT_EQ(test, expect->dos_code, result->dos_code);
+	KUNIT_EXPECT_EQ(test, expect->ntstatus, result->ntstatus);
+	KUNIT_EXPECT_STREQ(test, expect->nt_errstr, result->nt_errstr);
+}
+
+/* check_search_ntstatus_to_dos_map */
+DEFINE_CHECK_SEARCH_FUNC(ntstatus_to_dos_err, ntstatus, ntstatus_to_dos_map,
+			 ntstatus_to_dos_num);
+
+static struct kunit_case maperror_test_cases[] = {
+	KUNIT_CASE(check_search_ntstatus_to_dos_map),
+	{}
+};
+
+static struct kunit_suite maperror_suite = {
+	.name = "smb1_maperror",
+	.test_cases = maperror_test_cases,
+};
+
+kunit_test_suite(maperror_suite);
+
+MODULE_LICENSE("GPL");
diff --git a/fs/smb/client/smb1proto.h b/fs/smb/client/smb1proto.h
index dd98d04e837a..43b773e7964b 100644
--- a/fs/smb/client/smb1proto.h
+++ b/fs/smb/client/smb1proto.h
@@ -237,6 +237,10 @@ int map_smb_to_linux_error(char *buf, bool logErr);
 int smb1_init_maperror(void);
 int map_and_check_smb_error(struct TCP_Server_Info *server,
 			    struct mid_q_entry *mid, bool logErr);
+#if IS_ENABLED(CONFIG_SMB1_KUNIT_TESTS)
+const struct ntstatus_to_dos_err *
+search_ntstatus_to_dos_map_test(__u32 ntstatus);
+#endif
 
 /*
  * smb1misc.c
-- 
2.53.0


  parent reply	other threads:[~2026-04-02 14:20 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-02 14:18 [PATCH v3 00/13] smb: improve search speed of SMB1 maperror huiwen.he
2026-04-02 14:18 ` [PATCH v3 01/13] smb/client: annotate nterr.h with DOS error codes huiwen.he
2026-04-02 22:35   ` Steve French
2026-04-02 14:18 ` [PATCH v3 02/13] smb/client: autogenerate SMB1 NT status to DOS error mapping huiwen.he
2026-04-02 14:18 ` [PATCH v3 03/13] smb/client: replace nt_errs with ntstatus_to_dos_map huiwen.he
2026-04-02 14:18 ` [PATCH v3 04/13] smb/client: refactor ntstatus_to_dos() to return mapping entry huiwen.he
2026-04-02 14:18 ` [PATCH v3 05/13] smb/client: use binary search for NT status to DOS mapping huiwen.he
2026-04-02 14:18 ` [PATCH v3 06/13] smb/client: check if ntstatus_to_dos_map is sorted huiwen.he
2026-04-02 14:18 ` huiwen.he [this message]
2026-04-02 14:18 ` [PATCH v3 08/13] smb/client: move ERRnetlogonNotStarted to DOS error class huiwen.he
2026-04-02 14:18 ` [PATCH v3 09/13] smb/client: annotate smberr.h with POSIX error codes huiwen.he
2026-04-02 14:18 ` [PATCH v3 10/13] smb/client: autogenerate SMB1 DOS/SRV to POSIX error mapping huiwen.he
2026-04-02 14:18 ` [PATCH v3 11/13] smb/client: use binary search for SMB1 DOS/SRV " huiwen.he
2026-04-02 14:18 ` [PATCH v3 12/13] smb/client: check if SMB1 DOS/SRV error mapping arrays are sorted huiwen.he
2026-04-02 14:18 ` [PATCH v3 13/13] smb/client: introduce KUnit tests to check DOS/SRV err mapping search huiwen.he

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260402141839.461257-8-huiwen.he@linux.dev \
    --to=huiwen.he@linux.dev \
    --cc=chenxiaosong@chenxiaosong.com \
    --cc=chenxiaosong@kylinos.cn \
    --cc=dhowells@redhat.com \
    --cc=linkinjeon@kernel.org \
    --cc=linux-cifs@vger.kernel.org \
    --cc=smfrench@gmail.com \
    --cc=tangyouling@kylinos.cn \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox