From dfeab17ef6462d4544ac6ddc21bac1d5160c7c60 Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Tue, 14 Dec 2021 10:24:35 +0100 Subject: [PATCH] ut/sock: add unit tests for spdk_sock_map The usage of internal API for sock_map was not unit tested, so far. This patch adds first set of UT for the sock_map, expanding it and fixing some issues later in the series. Signed-off-by: Tomasz Zawadzki Change-Id: Idfce8e19668a87f1d45d73310edb17d71d9f8bd8 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/10724 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Aleksey Marchuk Reviewed-by: Ben Walker --- test/unit/lib/sock/sock.c/sock_ut.c | 111 ++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/test/unit/lib/sock/sock.c/sock_ut.c b/test/unit/lib/sock/sock.c/sock_ut.c index 3b913388a..40bcaf117 100644 --- a/test/unit/lib/sock/sock.c/sock_ut.c +++ b/test/unit/lib/sock/sock.c/sock_ut.c @@ -956,6 +956,116 @@ posix_sock_impl_get_set_opts(void) CU_ASSERT(opts.recv_buf_size == 5); } +static void +ut_sock_map(void) +{ + struct spdk_sock_map map = { + .entries = STAILQ_HEAD_INITIALIZER(map.entries), + .mtx = PTHREAD_MUTEX_INITIALIZER + }; + struct spdk_sock_group_impl *group_1, *group_2, *test_group; + int rc; + int test_id; + + group_1 = spdk_ut_sock_group_impl_create(); + group_2 = spdk_ut_sock_group_impl_create(); + + /* Test 1 + * Sanity check when sock_map is empty */ + test_id = spdk_sock_map_find_free(&map); + CU_ASSERT(test_id == -1); + + test_group = NULL; + rc = spdk_sock_map_lookup(&map, 1, &test_group); + CU_ASSERT(rc == -EINVAL); + CU_ASSERT(test_group == NULL); + + /* Test 2 + * Insert single entry */ + rc = spdk_sock_map_insert(&map, 1, group_1); + CU_ASSERT(rc == 0); + + test_group = NULL; + rc = spdk_sock_map_lookup(&map, 1, &test_group); + CU_ASSERT(rc == 0); + CU_ASSERT(test_group == group_1); + + /* There is single entry allocated, but it is not free */ + test_id = spdk_sock_map_find_free(&map); + CU_ASSERT(test_id == -1); + + /* Free the entry and verify */ + spdk_sock_map_release(&map, 1); + test_id = spdk_sock_map_find_free(&map); + CU_ASSERT(test_id == 1); + + spdk_sock_map_cleanup(&map); + + /* Test 3 + * Insert sock_group into placement_id multiple times */ + rc = spdk_sock_map_insert(&map, 1, group_1); + CU_ASSERT(rc == 0); + CU_ASSERT(STAILQ_FIRST(&map.entries)->ref == 1); + rc = spdk_sock_map_insert(&map, 1, group_1); + CU_ASSERT(rc == 0); + CU_ASSERT(STAILQ_FIRST(&map.entries)->ref == 2); + + /* Release entry once and see that it still exists. */ + spdk_sock_map_release(&map, 1); + test_group = NULL; + rc = spdk_sock_map_lookup(&map, 1, &test_group); + CU_ASSERT(rc == 0); + CU_ASSERT(test_group == group_1); + + /* Release entry second and final time. */ + spdk_sock_map_release(&map, 1); + + spdk_sock_map_cleanup(&map); + + /* Test 4 + * Test multiple entries */ + rc = spdk_sock_map_insert(&map, 1, group_1); + CU_ASSERT(rc == 0); + + test_group = NULL; + rc = spdk_sock_map_lookup(&map, 1, &test_group); + CU_ASSERT(rc == 0); + CU_ASSERT(test_group == group_1); + + rc = spdk_sock_map_insert(&map, 2, group_2); + CU_ASSERT(rc == 0); + + test_group = NULL; + rc = spdk_sock_map_lookup(&map, 2, &test_group); + CU_ASSERT(rc == 0); + CU_ASSERT(test_group == group_2); + + spdk_sock_map_cleanup(&map); + + /* Test 5 + * Attempt inserting multiple entries into single placement_id */ + rc = spdk_sock_map_insert(&map, 1, group_1); + CU_ASSERT(rc == 0); + + test_group = NULL; + rc = spdk_sock_map_lookup(&map, 1, &test_group); + CU_ASSERT(rc == 0); + CU_ASSERT(test_group == group_1); + + rc = spdk_sock_map_insert(&map, 1, group_2); + CU_ASSERT(rc == -EINVAL); + + test_group = NULL; + rc = spdk_sock_map_lookup(&map, 1, &test_group); + CU_ASSERT(rc == 0); + CU_ASSERT(test_group == group_1); + + spdk_sock_map_cleanup(&map); + + spdk_ut_sock_group_impl_close(group_2); + spdk_ut_sock_group_impl_close(group_1); +} + int main(int argc, char **argv) { @@ -976,6 +1086,7 @@ main(int argc, char **argv) CU_ADD_TEST(suite, sock_get_default_opts); CU_ADD_TEST(suite, ut_sock_impl_get_set_opts); CU_ADD_TEST(suite, posix_sock_impl_get_set_opts); + CU_ADD_TEST(suite, ut_sock_map); CU_basic_set_mode(CU_BRM_VERBOSE);