10da057a4SKozlowski Mateusz /* SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse * Copyright (C) 2022 Intel Corporation.
30da057a4SKozlowski Mateusz * All rights reserved.
40da057a4SKozlowski Mateusz */
50da057a4SKozlowski Mateusz
60da057a4SKozlowski Mateusz #include "spdk/stdinc.h"
70da057a4SKozlowski Mateusz
8ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h"
90da057a4SKozlowski Mateusz #include "common/lib/test_env.c"
100da057a4SKozlowski Mateusz
110da057a4SKozlowski Mateusz #include "ftl/utils/ftl_mempool.c"
120da057a4SKozlowski Mateusz
130da057a4SKozlowski Mateusz #define COUNT 16
140da057a4SKozlowski Mateusz #define ALIGNMENT 64
150da057a4SKozlowski Mateusz #define SIZE (ALIGNMENT * 2)
160da057a4SKozlowski Mateusz #define SOCKET_ID_ANY -1
170da057a4SKozlowski Mateusz
1871a17628SArtur Paszkiewicz DEFINE_STUB(ftl_bitmap_create, struct ftl_bitmap *, (void *buf, size_t size), NULL);
1971a17628SArtur Paszkiewicz DEFINE_STUB_V(ftl_bitmap_destroy, (struct ftl_bitmap *bitmap));
2071a17628SArtur Paszkiewicz DEFINE_STUB(ftl_bitmap_get, bool, (const struct ftl_bitmap *bitmap, uint64_t bit), true);
2171a17628SArtur Paszkiewicz DEFINE_STUB_V(ftl_bitmap_set, (struct ftl_bitmap *bitmap, uint64_t bit));
2271a17628SArtur Paszkiewicz DEFINE_STUB_V(ftl_bitmap_clear, (struct ftl_bitmap *bitmap, uint64_t bit));
2371a17628SArtur Paszkiewicz
240da057a4SKozlowski Mateusz static struct ftl_mempool *g_mpool;
250da057a4SKozlowski Mateusz
260da057a4SKozlowski Mateusz static void
test_ftl_mempool_create(void)270da057a4SKozlowski Mateusz test_ftl_mempool_create(void)
280da057a4SKozlowski Mateusz {
290da057a4SKozlowski Mateusz struct ftl_mempool *mpool;
300da057a4SKozlowski Mateusz
310da057a4SKozlowski Mateusz /* improper value of alignment */
320da057a4SKozlowski Mateusz mpool = ftl_mempool_create(COUNT, SIZE, ALIGNMENT + 1, SOCKET_ID_ANY);
330da057a4SKozlowski Mateusz CU_ASSERT_EQUAL(mpool, NULL);
340da057a4SKozlowski Mateusz }
350da057a4SKozlowski Mateusz
360da057a4SKozlowski Mateusz static void
test_ftl_mempool_get_put(void)370da057a4SKozlowski Mateusz test_ftl_mempool_get_put(void)
380da057a4SKozlowski Mateusz {
390da057a4SKozlowski Mateusz void *elem[COUNT];
400da057a4SKozlowski Mateusz void *elem_empty;
410da057a4SKozlowski Mateusz void *elem_first = SLIST_FIRST(&g_mpool->list);
420da057a4SKozlowski Mateusz struct ftl_mempool_element *ftl_elem;
430da057a4SKozlowski Mateusz int i;
440da057a4SKozlowski Mateusz for (i = 0; i < COUNT; i++) {
450da057a4SKozlowski Mateusz elem[i] = ftl_mempool_get(g_mpool);
460da057a4SKozlowski Mateusz ftl_elem = elem[i];
470da057a4SKozlowski Mateusz CU_ASSERT_EQUAL(ftl_elem->entry.sle_next, SLIST_FIRST(&g_mpool->list));
480da057a4SKozlowski Mateusz }
490da057a4SKozlowski Mateusz
500da057a4SKozlowski Mateusz CU_ASSERT(SLIST_EMPTY(&g_mpool->list));
510da057a4SKozlowski Mateusz
520da057a4SKozlowski Mateusz elem_empty = ftl_mempool_get(g_mpool);
530da057a4SKozlowski Mateusz CU_ASSERT_EQUAL(elem_empty, NULL);
540da057a4SKozlowski Mateusz
550da057a4SKozlowski Mateusz for (i = COUNT - 1; i >= 0; i--) {
560da057a4SKozlowski Mateusz ftl_mempool_put(g_mpool, elem[i]);
570da057a4SKozlowski Mateusz CU_ASSERT_EQUAL(SLIST_FIRST(&g_mpool->list), elem[i]);
580da057a4SKozlowski Mateusz }
590da057a4SKozlowski Mateusz
600da057a4SKozlowski Mateusz CU_ASSERT_EQUAL(SLIST_FIRST(&g_mpool->list), elem_first);
610da057a4SKozlowski Mateusz }
620da057a4SKozlowski Mateusz
630da057a4SKozlowski Mateusz static int
test_setup(void)640da057a4SKozlowski Mateusz test_setup(void)
650da057a4SKozlowski Mateusz {
660da057a4SKozlowski Mateusz g_mpool = ftl_mempool_create(COUNT, SIZE, ALIGNMENT, SOCKET_ID_ANY);
670da057a4SKozlowski Mateusz if (!g_mpool) {
680da057a4SKozlowski Mateusz return -ENOMEM;
690da057a4SKozlowski Mateusz }
700da057a4SKozlowski Mateusz
710da057a4SKozlowski Mateusz return 0;
720da057a4SKozlowski Mateusz }
730da057a4SKozlowski Mateusz
740da057a4SKozlowski Mateusz static int
test_cleanup(void)750da057a4SKozlowski Mateusz test_cleanup(void)
760da057a4SKozlowski Mateusz {
770da057a4SKozlowski Mateusz ftl_mempool_destroy(g_mpool);
780da057a4SKozlowski Mateusz g_mpool = NULL;
790da057a4SKozlowski Mateusz return 0;
800da057a4SKozlowski Mateusz }
810da057a4SKozlowski Mateusz
820da057a4SKozlowski Mateusz int
main(int argc,char ** argv)830da057a4SKozlowski Mateusz main(int argc, char **argv)
840da057a4SKozlowski Mateusz {
850da057a4SKozlowski Mateusz CU_pSuite suite = NULL;
860da057a4SKozlowski Mateusz unsigned int num_failures;
870da057a4SKozlowski Mateusz
880da057a4SKozlowski Mateusz CU_initialize_registry();
890da057a4SKozlowski Mateusz
900da057a4SKozlowski Mateusz suite = CU_add_suite("ftl_mempool", test_setup, test_cleanup);
910da057a4SKozlowski Mateusz CU_ADD_TEST(suite, test_ftl_mempool_create);
920da057a4SKozlowski Mateusz CU_ADD_TEST(suite, test_ftl_mempool_get_put);
930da057a4SKozlowski Mateusz
94*ea941caeSKonrad Sztyber num_failures = spdk_ut_run_tests(argc, argv, NULL);
950da057a4SKozlowski Mateusz CU_cleanup_registry();
960da057a4SKozlowski Mateusz
970da057a4SKozlowski Mateusz return num_failures;
980da057a4SKozlowski Mateusz }
99