1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause 2a6dbe372Spaul luse * Copyright (C) 2021 Intel Corporation. All rights reserved. 32ddc2b3cSMao Jiang * Copyright (c) 2019, 2021 Mellanox Technologies LTD. All rights reserved. 42ddc2b3cSMao Jiang */ 52ddc2b3cSMao Jiang 62ddc2b3cSMao Jiang #include "spdk/stdinc.h" 7ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h" 82ddc2b3cSMao Jiang #include "common/lib/test_env.c" 92ddc2b3cSMao Jiang #include "nvmf/nvmf.c" 102ddc2b3cSMao Jiang #include "spdk/bdev_module.h" 112ddc2b3cSMao Jiang 122ddc2b3cSMao Jiang DEFINE_STUB_V(nvmf_transport_poll_group_destroy, (struct spdk_nvmf_transport_poll_group *group)); 132ddc2b3cSMao Jiang DEFINE_STUB_V(nvmf_ctrlr_destruct, (struct spdk_nvmf_ctrlr *ctrlr)); 142ddc2b3cSMao Jiang DEFINE_STUB_V(nvmf_transport_qpair_fini, (struct spdk_nvmf_qpair *qpair, 152ddc2b3cSMao Jiang spdk_nvmf_transport_qpair_fini_cb cb_fn, 162ddc2b3cSMao Jiang void *cb_arg)); 172ddc2b3cSMao Jiang DEFINE_STUB_V(nvmf_qpair_free_aer, (struct spdk_nvmf_qpair *qpair)); 18a50a70ecSKonrad Sztyber DEFINE_STUB_V(nvmf_qpair_abort_pending_zcopy_reqs, (struct spdk_nvmf_qpair *qpair)); 192ddc2b3cSMao Jiang DEFINE_STUB(nvmf_transport_poll_group_create, struct spdk_nvmf_transport_poll_group *, 205e373163SJohn Levon (struct spdk_nvmf_transport *transport, 215e373163SJohn Levon struct spdk_nvmf_poll_group *group), NULL); 222ddc2b3cSMao Jiang DEFINE_STUB(spdk_bdev_get_io_channel, struct spdk_io_channel *, (struct spdk_bdev_desc *desc), 232ddc2b3cSMao Jiang NULL); 242ddc2b3cSMao Jiang DEFINE_STUB(nvmf_ctrlr_async_event_ns_notice, int, (struct spdk_nvmf_ctrlr *ctrlr), 0); 252ddc2b3cSMao Jiang DEFINE_STUB(nvmf_ctrlr_async_event_ana_change_notice, int, 262ddc2b3cSMao Jiang (struct spdk_nvmf_ctrlr *ctrlr), 0); 272ddc2b3cSMao Jiang DEFINE_STUB(nvmf_transport_poll_group_remove, int, (struct spdk_nvmf_transport_poll_group *group, 282ddc2b3cSMao Jiang struct spdk_nvmf_qpair *qpair), 0); 292ddc2b3cSMao Jiang DEFINE_STUB(nvmf_transport_req_free, int, (struct spdk_nvmf_request *req), 0); 302ddc2b3cSMao Jiang DEFINE_STUB(nvmf_transport_poll_group_poll, int, (struct spdk_nvmf_transport_poll_group *group), 0); 312ddc2b3cSMao Jiang DEFINE_STUB_V(nvmf_subsystem_remove_all_listeners, (struct spdk_nvmf_subsystem *subsystem, 322ddc2b3cSMao Jiang bool stop)); 3397385af1SAlexey Marchuk DEFINE_STUB(spdk_nvmf_subsystem_destroy, int, (struct spdk_nvmf_subsystem *subsystem, 3497385af1SAlexey Marchuk nvmf_subsystem_destroy_cb cpl_cb, void *cpl_cb_arg), 0); 352ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_first_listener, struct spdk_nvmf_subsystem_listener *, 362ddc2b3cSMao Jiang (struct spdk_nvmf_subsystem *subsystem), NULL); 372ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_next_listener, struct spdk_nvmf_subsystem_listener *, 382ddc2b3cSMao Jiang (struct spdk_nvmf_subsystem *subsystem, 392ddc2b3cSMao Jiang struct spdk_nvmf_subsystem_listener *prev_listener), NULL); 402ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_next, struct spdk_nvmf_subsystem *, 412ddc2b3cSMao Jiang (struct spdk_nvmf_subsystem *subsystem), NULL); 422ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_nqn, const char *, 432ddc2b3cSMao Jiang (const struct spdk_nvmf_subsystem *subsystem), NULL); 442ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_allow_any_host, bool, 452ddc2b3cSMao Jiang (const struct spdk_nvmf_subsystem *subsystem), true); 462ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_sn, const char *, 472ddc2b3cSMao Jiang (const struct spdk_nvmf_subsystem *subsystem), 482ddc2b3cSMao Jiang NULL); 492ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_mn, const char *, 502ddc2b3cSMao Jiang (const struct spdk_nvmf_subsystem *subsystem), 512ddc2b3cSMao Jiang NULL); 522ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_max_namespaces, uint32_t, 532ddc2b3cSMao Jiang (const struct spdk_nvmf_subsystem *subsystem), 0); 542ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_min_cntlid, uint16_t, 552ddc2b3cSMao Jiang (const struct spdk_nvmf_subsystem *subsystem), 0); 562ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_max_cntlid, uint16_t, 572ddc2b3cSMao Jiang (const struct spdk_nvmf_subsystem *subsystem), 0); 582ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_listener_get_trid, const struct spdk_nvme_transport_id *, 592ddc2b3cSMao Jiang (struct spdk_nvmf_subsystem_listener *listener), NULL); 602ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvme_transport_id_adrfam_str, const char *, (enum spdk_nvmf_adrfam adrfam), NULL); 612ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_first_host, struct spdk_nvmf_host *, 622ddc2b3cSMao Jiang (struct spdk_nvmf_subsystem *subsystem), 0); 632ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_host_get_nqn, const char *, (const struct spdk_nvmf_host *host), NULL); 642ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_next_host, struct spdk_nvmf_host *, 652ddc2b3cSMao Jiang (struct spdk_nvmf_subsystem *subsystem, struct spdk_nvmf_host *prev_host), NULL); 662ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_first_ns, struct spdk_nvmf_ns *, 672ddc2b3cSMao Jiang (struct spdk_nvmf_subsystem *subsystem), NULL); 68fb5650ceSAbhineet Pandey DEFINE_STUB(spdk_nvmf_subsystem_get_ana_reporting, bool, (struct spdk_nvmf_subsystem *subsystem), 69fb5650ceSAbhineet Pandey false); 702ddc2b3cSMao Jiang DEFINE_STUB_V(spdk_nvmf_ns_get_opts, (const struct spdk_nvmf_ns *ns, 712ddc2b3cSMao Jiang struct spdk_nvmf_ns_opts *opts, size_t opts_size)); 722ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_ns_get_id, uint32_t, (const struct spdk_nvmf_ns *ns), 0); 732ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_ns_get_bdev, struct spdk_bdev *, (struct spdk_nvmf_ns *ns), NULL); 742ddc2b3cSMao Jiang DEFINE_STUB(spdk_bdev_get_name, const char *, (const struct spdk_bdev *bdev), 0); 752ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_next_ns, struct spdk_nvmf_ns *, 762ddc2b3cSMao Jiang (struct spdk_nvmf_subsystem *subsystem, struct spdk_nvmf_ns *prev_ns), NULL); 772ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_transport_listen, int, (struct spdk_nvmf_transport *transport, 782ddc2b3cSMao Jiang const struct spdk_nvme_transport_id *trid, 792ddc2b3cSMao Jiang struct spdk_nvmf_listen_opts *opts), 0); 802ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_transport_stop_listen, int, 812ddc2b3cSMao Jiang (struct spdk_nvmf_transport *transport, 822ddc2b3cSMao Jiang const struct spdk_nvme_transport_id *trid), 0) 832ddc2b3cSMao Jiang DEFINE_STUB(nvmf_transport_get_optimal_poll_group, struct spdk_nvmf_transport_poll_group *, 842ddc2b3cSMao Jiang (struct spdk_nvmf_transport *transport, struct spdk_nvmf_qpair *qpair), NULL); 852ddc2b3cSMao Jiang DEFINE_STUB(nvmf_transport_poll_group_add, int, 862ddc2b3cSMao Jiang (struct spdk_nvmf_transport_poll_group *group, 872ddc2b3cSMao Jiang struct spdk_nvmf_qpair *qpair), 0); 882ddc2b3cSMao Jiang DEFINE_STUB(nvmf_transport_qpair_get_peer_trid, int, 892ddc2b3cSMao Jiang (struct spdk_nvmf_qpair *qpair, 902ddc2b3cSMao Jiang struct spdk_nvme_transport_id *trid), 0); 912ddc2b3cSMao Jiang DEFINE_STUB(nvmf_transport_qpair_get_local_trid, int, 922ddc2b3cSMao Jiang (struct spdk_nvmf_qpair *qpair, 932ddc2b3cSMao Jiang struct spdk_nvme_transport_id *trid), 0); 942ddc2b3cSMao Jiang DEFINE_STUB(nvmf_transport_qpair_get_listen_trid, int, 952ddc2b3cSMao Jiang (struct spdk_nvmf_qpair *qpair, 962ddc2b3cSMao Jiang struct spdk_nvme_transport_id *trid), 0); 972ddc2b3cSMao Jiang DEFINE_STUB_V(spdk_nvmf_request_exec, (struct spdk_nvmf_request *req)); 98974a32b7SKonrad Sztyber DEFINE_STUB_V(spdk_nvmf_request_zcopy_start, (struct spdk_nvmf_request *req)); 992ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_get_transport_name, const char *, 1002ddc2b3cSMao Jiang (struct spdk_nvmf_transport *transport), NULL); 1012ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_transport_destroy, int, (struct spdk_nvmf_transport *transport, 1022ddc2b3cSMao Jiang spdk_nvmf_transport_destroy_done_cb cb_fn, void *cb_arg), 0); 1032ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_type, enum spdk_nvmf_subtype, 1042ddc2b3cSMao Jiang (struct spdk_nvmf_subsystem *subsystem), 0); 1052ddc2b3cSMao Jiang DEFINE_STUB(spdk_nvmf_subsystem_get_first, struct spdk_nvmf_subsystem *, 1062ddc2b3cSMao Jiang (struct spdk_nvmf_tgt *tgt), NULL); 107220bcf7dSJacek Kalwas DEFINE_STUB_V(nvmf_transport_dump_opts, (struct spdk_nvmf_transport *transport, 108220bcf7dSJacek Kalwas struct spdk_json_write_ctx *w, bool named)); 109f5260201SWojciech Panfil DEFINE_STUB_V(nvmf_transport_listen_dump_trid, (const struct spdk_nvme_transport_id *trid, 110f5260201SWojciech Panfil struct spdk_json_write_ctx *w)); 111470e8518SSlawomir Ptak DEFINE_STUB(spdk_nvme_transport_id_compare, int, (const struct spdk_nvme_transport_id *trid1, 112470e8518SSlawomir Ptak const struct spdk_nvme_transport_id *trid2), 0); 113*5a8c76d9SAbhineet Pandey DEFINE_STUB_V(spdk_nvmf_send_discovery_log_notice, (struct spdk_nvmf_tgt *tgt, 114*5a8c76d9SAbhineet Pandey const char *hostnqn)); 115020c4e11SKonrad Sztyber DEFINE_STUB(nvmf_nqn_is_valid, bool, (const char *nqn), true); 116020c4e11SKonrad Sztyber DEFINE_STUB(nvmf_nqn_is_discovery, bool, (const char *nqn), true); 1173f4f8ad0SKonrad Sztyber DEFINE_STUB(spdk_key_get_name, const char *, (struct spdk_key *k), NULL); 1180a6bb8caSKonrad Sztyber DEFINE_STUB(nvmf_qpair_auth_init, int, (struct spdk_nvmf_qpair *q), 0); 1190a6bb8caSKonrad Sztyber DEFINE_STUB_V(nvmf_qpair_auth_destroy, (struct spdk_nvmf_qpair *q)); 120c99689f9SKonrad Sztyber DEFINE_STUB_V(nvmf_tgt_stop_mdns_prr, (struct spdk_nvmf_tgt *tgt)); 1212ddc2b3cSMao Jiang 1222ddc2b3cSMao Jiang struct spdk_io_channel { 1232ddc2b3cSMao Jiang struct spdk_thread *thread; 1242ddc2b3cSMao Jiang struct io_device *dev; 1252ddc2b3cSMao Jiang uint32_t ref; 1262ddc2b3cSMao Jiang uint32_t destroy_ref; 1272ddc2b3cSMao Jiang TAILQ_ENTRY(spdk_io_channel) tailq; 1282ddc2b3cSMao Jiang spdk_io_channel_destroy_cb destroy_cb; 1292ddc2b3cSMao Jiang 1302ddc2b3cSMao Jiang uint8_t _padding[48]; 1312ddc2b3cSMao Jiang }; 1322ddc2b3cSMao Jiang 1332ddc2b3cSMao Jiang uint64_t 1342ddc2b3cSMao Jiang spdk_bdev_get_num_blocks(const struct spdk_bdev *bdev) 1352ddc2b3cSMao Jiang { 1362ddc2b3cSMao Jiang return bdev->blockcnt; 1372ddc2b3cSMao Jiang } 1382ddc2b3cSMao Jiang 1392ddc2b3cSMao Jiang const struct spdk_uuid * 1402ddc2b3cSMao Jiang spdk_bdev_get_uuid(const struct spdk_bdev *bdev) 1412ddc2b3cSMao Jiang { 1422ddc2b3cSMao Jiang return &bdev->uuid; 1432ddc2b3cSMao Jiang } 1442ddc2b3cSMao Jiang 1452ddc2b3cSMao Jiang static void 1462ddc2b3cSMao Jiang test_nvmf_tgt_create_poll_group(void) 1472ddc2b3cSMao Jiang { 1482ddc2b3cSMao Jiang int rc; 1492ddc2b3cSMao Jiang struct spdk_thread *thread = NULL; 1502ddc2b3cSMao Jiang struct spdk_nvmf_tgt tgt = {}; 1512ddc2b3cSMao Jiang struct spdk_nvmf_poll_group group = {}; 1522ddc2b3cSMao Jiang struct spdk_nvmf_transport transport = {}; 1532ddc2b3cSMao Jiang struct spdk_nvmf_subsystem subsystem = {}; 1542ddc2b3cSMao Jiang struct spdk_nvmf_ns ns = {}; 1552ddc2b3cSMao Jiang struct spdk_bdev bdev = {}; 1562ddc2b3cSMao Jiang struct spdk_io_channel ch = {}; 157fb4398efSAlexey Marchuk struct spdk_nvmf_transport_poll_group transport_pg = {}; 1582ddc2b3cSMao Jiang 1592ddc2b3cSMao Jiang thread = spdk_thread_create(NULL, NULL); 1602ddc2b3cSMao Jiang SPDK_CU_ASSERT_FATAL(thread != NULL); 1612ddc2b3cSMao Jiang spdk_set_thread(thread); 1622ddc2b3cSMao Jiang 1632ddc2b3cSMao Jiang /* Create group with single subsystem */ 1642ddc2b3cSMao Jiang ch.thread = thread; 1652ddc2b3cSMao Jiang MOCK_SET(spdk_bdev_get_io_channel, &ch); 1662ddc2b3cSMao Jiang 1672ddc2b3cSMao Jiang tgt.max_subsystems = 1; 1680aef7f2aSJim Harris RB_INIT(&tgt.subsystems); 1692ddc2b3cSMao Jiang 1700aef7f2aSJim Harris /* Make sure subsystem has enough in subnqn so it can be 1710aef7f2aSJim Harris * inserted into RB-tree. 1720aef7f2aSJim Harris */ 1730aef7f2aSJim Harris snprintf(subsystem.subnqn, sizeof(subsystem.subnqn), "abc"); 1740aef7f2aSJim Harris RB_INSERT(subsystem_tree, &tgt.subsystems, &subsystem); 175a2653a72SJim Harris subsystem.id = 0; 176a2653a72SJim Harris subsystem.max_nsid = 1; 177a2653a72SJim Harris subsystem.ns = calloc(1, sizeof(struct spdk_nvmf_ns *)); 178a2653a72SJim Harris SPDK_CU_ASSERT_FATAL(subsystem.ns != NULL); 179516639cfSJim Harris MOCK_SET(spdk_nvmf_subsystem_get_first, &subsystem); 1802ddc2b3cSMao Jiang 181a2653a72SJim Harris subsystem.ns[0] = &ns; 1822ddc2b3cSMao Jiang ns.crkey = 0xaa; 1832ddc2b3cSMao Jiang ns.rtype = 0xbb; 1842ddc2b3cSMao Jiang TAILQ_INIT(&ns.registrants); 1852ddc2b3cSMao Jiang ns.bdev = &bdev; 1862ddc2b3cSMao Jiang spdk_uuid_generate(&bdev.uuid); 1872ddc2b3cSMao Jiang bdev.blockcnt = 512; 1882ddc2b3cSMao Jiang 1892ddc2b3cSMao Jiang TAILQ_INIT(&tgt.transports); 1902ddc2b3cSMao Jiang TAILQ_INIT(&tgt.poll_groups); 191f9424ae7SJim Harris tgt.num_poll_groups = 0; 1922ddc2b3cSMao Jiang pthread_mutex_init(&tgt.mutex, NULL); 1932ddc2b3cSMao Jiang transport.tgt = &tgt; 1942ddc2b3cSMao Jiang TAILQ_INSERT_TAIL(&tgt.transports, &transport, link); 1952ddc2b3cSMao Jiang 196fb4398efSAlexey Marchuk MOCK_SET(nvmf_transport_poll_group_create, &transport_pg); 1972ddc2b3cSMao Jiang rc = nvmf_tgt_create_poll_group((void *)&tgt, (void *)&group); 198fb4398efSAlexey Marchuk MOCK_SET(nvmf_transport_poll_group_create, NULL); 1992ddc2b3cSMao Jiang CU_ASSERT(rc == 0); 2002ddc2b3cSMao Jiang CU_ASSERT(group.num_sgroups == 1); 2012ddc2b3cSMao Jiang CU_ASSERT(group.sgroups != NULL); 2022ddc2b3cSMao Jiang CU_ASSERT(group.sgroups[0].state == SPDK_NVMF_SUBSYSTEM_ACTIVE); 2032ddc2b3cSMao Jiang CU_ASSERT(group.sgroups[0].ns_info[0].channel == &ch); 2042ddc2b3cSMao Jiang CU_ASSERT(!memcmp(&group.sgroups[0].ns_info[0].uuid, &bdev.uuid, 16)); 2052ddc2b3cSMao Jiang CU_ASSERT(group.sgroups[0].ns_info[0].num_blocks == 512); 2062ddc2b3cSMao Jiang CU_ASSERT(group.sgroups[0].ns_info[0].crkey == 0xaa); 2072ddc2b3cSMao Jiang CU_ASSERT(group.sgroups[0].ns_info[0].rtype == 0xbb); 2082ddc2b3cSMao Jiang CU_ASSERT(TAILQ_FIRST(&tgt.poll_groups) == &group); 209f9424ae7SJim Harris CU_ASSERT(tgt.num_poll_groups == 1); 2102ddc2b3cSMao Jiang CU_ASSERT(group.thread == thread); 2112ddc2b3cSMao Jiang 2122ddc2b3cSMao Jiang nvmf_tgt_destroy_poll_group((void *)&tgt, (void *)&group); 2132ddc2b3cSMao Jiang CU_ASSERT(TAILQ_EMPTY(&tgt.poll_groups)); 214f9424ae7SJim Harris CU_ASSERT(tgt.num_poll_groups == 0); 215a2653a72SJim Harris free(subsystem.ns); 216516639cfSJim Harris MOCK_CLEAR(spdk_nvmf_subsystem_get_first); 2172ddc2b3cSMao Jiang 2182ddc2b3cSMao Jiang spdk_thread_exit(thread); 2192ddc2b3cSMao Jiang while (!spdk_thread_is_exited(thread)) { 2202ddc2b3cSMao Jiang spdk_thread_poll(thread, 0, 0); 2212ddc2b3cSMao Jiang } 2222ddc2b3cSMao Jiang spdk_thread_destroy(thread); 2232ddc2b3cSMao Jiang MOCK_CLEAR(spdk_bdev_get_io_channel); 2242ddc2b3cSMao Jiang } 2252ddc2b3cSMao Jiang 2268dd1cd21SBen Walker int 2278dd1cd21SBen Walker main(int argc, char **argv) 2282ddc2b3cSMao Jiang { 2292ddc2b3cSMao Jiang CU_pSuite suite = NULL; 2302ddc2b3cSMao Jiang unsigned int num_failures; 2312ddc2b3cSMao Jiang 2322ddc2b3cSMao Jiang CU_initialize_registry(); 2332ddc2b3cSMao Jiang 2342ddc2b3cSMao Jiang suite = CU_add_suite("nvmf", NULL, NULL); 2352ddc2b3cSMao Jiang 2362ddc2b3cSMao Jiang CU_ADD_TEST(suite, test_nvmf_tgt_create_poll_group); 2372ddc2b3cSMao Jiang 238ea941caeSKonrad Sztyber num_failures = spdk_ut_run_tests(argc, argv, NULL); 2392ddc2b3cSMao Jiang CU_cleanup_registry(); 2402ddc2b3cSMao Jiang return num_failures; 2412ddc2b3cSMao Jiang } 242