Add tests to verify that the kernel reports the expected error messages
when map creation fails.

Signed-off-by: Leon Hwang <[email protected]>
---
 .../selftests/bpf/prog_tests/map_init.c       | 168 ++++++++++++++++++
 1 file changed, 168 insertions(+)

diff --git a/tools/testing/selftests/bpf/prog_tests/map_init.c 
b/tools/testing/selftests/bpf/prog_tests/map_init.c
index 14a31109dd0e..824e2bea74bf 100644
--- a/tools/testing/selftests/bpf/prog_tests/map_init.c
+++ b/tools/testing/selftests/bpf/prog_tests/map_init.c
@@ -212,3 +212,171 @@ void test_map_init(void)
        if (test__start_subtest("pcpu_lru_map_init"))
                test_pcpu_lru_map_init();
 }
+
+#define BPF_LOG_FIXED  8
+
+static void test_map_create(enum bpf_map_type map_type, const char *map_name,
+                           struct bpf_map_create_opts *opts, const char 
*exp_msg)
+{
+       const int key_size = 4, value_size = 4, max_entries = 1;
+       char log_buf[128];
+       int fd;
+       LIBBPF_OPTS(bpf_syscall_common_attr_opts, copts);
+
+       log_buf[0] = '\0';
+       copts.log_buf = log_buf;
+       copts.log_size = sizeof(log_buf);
+       copts.log_level = BPF_LOG_FIXED;
+       opts->common_attr_opts = &copts;
+       fd = bpf_map_create(map_type, map_name, key_size, value_size, 
max_entries, opts);
+       if (!ASSERT_LT(fd, 0, "bpf_map_create")) {
+               close(fd);
+               return;
+       }
+
+       ASSERT_STREQ(log_buf, exp_msg, "log_buf");
+       ASSERT_EQ(copts.log_true_size, strlen(exp_msg) + 1, "log_true_size");
+}
+
+static void test_map_create_array(struct bpf_map_create_opts *opts, const char 
*exp_msg)
+{
+       test_map_create(BPF_MAP_TYPE_ARRAY, "test_map_create", opts, exp_msg);
+}
+
+static void test_invalid_vmlinux_value_type_id_struct_ops(void)
+{
+       const char *msg = "btf_vmlinux_value_type_id can only be used with 
struct_ops maps.\n";
+       LIBBPF_OPTS(bpf_map_create_opts, opts,
+                   .btf_vmlinux_value_type_id = 1,
+       );
+
+       test_map_create_array(&opts, msg);
+}
+
+static void test_invalid_vmlinux_value_type_id_kv_type_id(void)
+{
+       const char *msg = "btf_vmlinux_value_type_id is mutually exclusive with 
btf_key_type_id and btf_value_type_id.\n";
+       LIBBPF_OPTS(bpf_map_create_opts, opts,
+                   .btf_vmlinux_value_type_id = 1,
+                   .btf_key_type_id = 1,
+       );
+
+       test_map_create(BPF_MAP_TYPE_STRUCT_OPS, "test_map_create", &opts, msg);
+}
+
+static void test_invalid_value_type_id(void)
+{
+       const char *msg = "Invalid btf_value_type_id.\n";
+       LIBBPF_OPTS(bpf_map_create_opts, opts,
+                   .btf_key_type_id = 1,
+       );
+
+       test_map_create_array(&opts, msg);
+}
+
+static void test_invalid_map_extra(void)
+{
+       const char *msg = "Invalid map_extra.\n";
+       LIBBPF_OPTS(bpf_map_create_opts, opts,
+                   .map_extra = 1,
+       );
+
+       test_map_create_array(&opts, msg);
+}
+
+static void test_invalid_numa_node(void)
+{
+       const char *msg = "Invalid numa_node.\n";
+       LIBBPF_OPTS(bpf_map_create_opts, opts,
+                   .map_flags = BPF_F_NUMA_NODE,
+                   .numa_node = 0xFF,
+       );
+
+       test_map_create_array(&opts, msg);
+}
+
+static void test_invalid_map_type(void)
+{
+       const char *msg = "Invalid map_type.\n";
+       LIBBPF_OPTS(bpf_map_create_opts, opts);
+
+       test_map_create(__MAX_BPF_MAP_TYPE, "test_map_create", &opts, msg);
+}
+
+static void test_invalid_token_fd(void)
+{
+       const char *msg = "Invalid map_token_fd.\n";
+       LIBBPF_OPTS(bpf_map_create_opts, opts,
+                   .map_flags = BPF_F_TOKEN_FD,
+                   .token_fd = 0xFF,
+       );
+
+       test_map_create_array(&opts, msg);
+}
+
+static void test_invalid_map_name(void)
+{
+       const char *msg = "Invalid map_name.\n";
+       LIBBPF_OPTS(bpf_map_create_opts, opts);
+
+       test_map_create(BPF_MAP_TYPE_ARRAY, "test-!@#", &opts, msg);
+}
+
+static void test_invalid_btf_fd(void)
+{
+       const char *msg = "Invalid btf_fd.\n";
+       LIBBPF_OPTS(bpf_map_create_opts, opts,
+                   .btf_fd = -1,
+                   .btf_key_type_id = 1,
+                   .btf_value_type_id = 1,
+       );
+
+       test_map_create_array(&opts, msg);
+}
+
+static void test_excl_prog_hash_size_1(void)
+{
+       const char *msg = "Invalid excl_prog_hash_size.\n";
+       const char *hash = "DEADCODE";
+       LIBBPF_OPTS(bpf_map_create_opts, opts,
+                   .excl_prog_hash = hash,
+       );
+
+       test_map_create_array(&opts, msg);
+}
+
+static void test_excl_prog_hash_size_2(void)
+{
+       const char *msg = "Invalid excl_prog_hash_size.\n";
+       LIBBPF_OPTS(bpf_map_create_opts, opts,
+                   .excl_prog_hash_size = 1,
+       );
+
+       test_map_create_array(&opts, msg);
+}
+
+void test_map_create_failure(void)
+{
+       if (test__start_subtest("invalid_vmlinux_value_type_id_struct_ops"))
+               test_invalid_vmlinux_value_type_id_struct_ops();
+       if (test__start_subtest("invalid_vmlinux_value_type_id_kv_type_id"))
+               test_invalid_vmlinux_value_type_id_kv_type_id();
+       if (test__start_subtest("invalid_value_type_id"))
+               test_invalid_value_type_id();
+       if (test__start_subtest("invalid_map_extra"))
+               test_invalid_map_extra();
+       if (test__start_subtest("invalid_numa_node"))
+               test_invalid_numa_node();
+       if (test__start_subtest("invalid_map_type"))
+               test_invalid_map_type();
+       if (test__start_subtest("invalid_token_fd"))
+               test_invalid_token_fd();
+       if (test__start_subtest("invalid_map_name"))
+               test_invalid_map_name();
+       if (test__start_subtest("invalid_btf_fd"))
+               test_invalid_btf_fd();
+       if (test__start_subtest("invalid_excl_prog_hash_size_1"))
+               test_excl_prog_hash_size_1();
+       if (test__start_subtest("invalid_excl_prog_hash_size_2"))
+               test_excl_prog_hash_size_2();
+}
-- 
2.52.0


Reply via email to