diff --git a/test-tool/Makefile.am b/test-tool/Makefile.am index 2d42173..45acf27 100644 --- a/test-tool/Makefile.am +++ b/test-tool/Makefile.am @@ -40,6 +40,7 @@ iscsi_test_cu_SOURCES = iscsi-test-cu.c \ test_iscsi_cmdsn_toohigh.c \ test_iscsi_cmdsn_toolow.c \ test_iscsi_datasn_invalid.c \ + test_iscsi_sendtargets.c \ test_mandatory_sbc.c \ test_modesense6_all_pages.c \ test_modesense6_control.c \ diff --git a/test-tool/iscsi-test-cu.c b/test-tool/iscsi-test-cu.c index 26e1b05..ea3e026 100644 --- a/test-tool/iscsi-test-cu.c +++ b/test-tool/iscsi-test-cu.c @@ -558,6 +558,11 @@ static CU_TestInfo tests_iscsi_datasn[] = { CU_TEST_INFO_NULL }; +static CU_TestInfo tests_iscsi_sendtargets[] = { + { (char *)"Simple", test_iscsi_sendtargets_simple }, + CU_TEST_INFO_NULL +}; + static CU_TestInfo tests_iscsi_residuals[] = { { (char *)"Read10Invalid", test_read10_invalid }, { (char *)"Read10Residuals", test_read10_residuals }, @@ -588,6 +593,8 @@ static libiscsi_suite_info iscsi_suites[] = { tests_iscsi_residuals }, { "iSCSITMF", NON_PGR_FUNCS, tests_iscsi_tmf }, + { "iSCSISendTargets", NON_PGR_FUNCS, + tests_iscsi_sendtargets }, { NULL, NULL, NULL, NULL, NULL, NULL } }; @@ -645,6 +652,7 @@ static libiscsi_suite_info all_suites[] = { { "iSCSIdatasn", NON_PGR_FUNCS, tests_iscsi_datasn }, { "iSCSIResiduals", NON_PGR_FUNCS, tests_iscsi_residuals }, { "iSCSITMF", NON_PGR_FUNCS, tests_iscsi_tmf }, + { "iSCSISendTargets", NON_PGR_FUNCS, tests_iscsi_sendtargets }, { "MultipathIO", NON_PGR_FUNCS, tests_multipathio }, { NULL, NULL, NULL, NULL, NULL, NULL }, }; diff --git a/test-tool/iscsi-test-cu.h b/test-tool/iscsi-test-cu.h index 086b949..be1753b 100644 --- a/test-tool/iscsi-test-cu.h +++ b/test-tool/iscsi-test-cu.h @@ -78,6 +78,7 @@ void test_iscsi_cmdsn_toohigh(void); void test_iscsi_cmdsn_toolow(void); void test_iscsi_datasn_invalid(void); +void test_iscsi_sendtargets_simple(void); void test_mandatory_sbc(void); diff --git a/test-tool/test_iscsi_sendtargets.c b/test-tool/test_iscsi_sendtargets.c new file mode 100644 index 0000000..8d21155 --- /dev/null +++ b/test-tool/test_iscsi_sendtargets.c @@ -0,0 +1,100 @@ +/* + Copyright (C) 2019 SUSE LLC + Copyright (C) 2013 by Ronnie Sahlberg + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . +*/ + +#include +#include +#include +#include + +#include "iscsi.h" +#include "iscsi-private.h" +#include "scsi-lowlevel.h" +#include "iscsi-test-cu.h" + +struct test_iscsi_sendtargets_state { + int dispatched; + int completed; +}; + +static int +test_iscsi_sendtargets_txrx(struct test_iscsi_sendtargets_state *state) +{ + while (state->completed < state->dispatched) { + struct pollfd pfd; + int ret; + + pfd.fd = iscsi_get_fd(sd->iscsi_ctx); + pfd.events = iscsi_which_events(sd->iscsi_ctx); + + ret = poll(&pfd, 1, -1); + if (ret < 0) { + return ret; + } + + ret = iscsi_service(sd->iscsi_ctx, pfd.revents); + if (ret != 0) { + return ret; + } + } + return 0; +} + +static void +test_iscsi_sendtargets_simple_cb(struct iscsi_context *iscsi _U_, int status, + void *command_data, void *private_data) +{ + struct test_iscsi_sendtargets_state *state = private_data; + struct iscsi_discovery_address *da; + + state->completed++; + CU_ASSERT_EQUAL(status, 0); + for (da = command_data; da != NULL; da = da->next) { + struct iscsi_target_portal *po; + logging(LOG_VERBOSE, "Target: %s", da->target_name); + for (po = da->portals; po != NULL; po = po->next) { + logging(LOG_VERBOSE, "+ Portal: %s", po->portal); + } + } +} + +void +test_iscsi_sendtargets_simple(void) +{ + struct test_iscsi_sendtargets_state state; + int ret; + + logging(LOG_VERBOSE, LOG_BLANK_LINE); + logging(LOG_VERBOSE, "Test SendTargets in FFP"); + + if (sd->iscsi_ctx == NULL) { + const char *err = "[SKIPPED] This test is " + "only supported for iSCSI backends"; + logging(LOG_NORMAL, "%s", err); + CU_PASS(err); + return; + } + + memset(&state, 0, sizeof(state)); + ret = iscsi_discovery_async(sd->iscsi_ctx, + test_iscsi_sendtargets_simple_cb, &state); + CU_ASSERT_EQUAL(ret, 0); + state.dispatched++; + + ret = test_iscsi_sendtargets_txrx(&state); + CU_ASSERT_EQUAL(ret, 0); +}