1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause 21e3d25b9SShuhei Matsumoto * Copyright (C) 2018 Intel Corporation. All rights reserved. 31e3d25b9SShuhei Matsumoto * Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 49a1d9757SSeth Howell */ 59a1d9757SSeth Howell 69a1d9757SSeth Howell #include "spdk/stdinc.h" 79a1d9757SSeth Howell 8ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h" 99a1d9757SSeth Howell #include "common/lib/test_env.c" 109a1d9757SSeth Howell #include "event/app.c" 119a1d9757SSeth Howell 129a1d9757SSeth Howell #define test_argc 6 139a1d9757SSeth Howell 149a1d9757SSeth Howell DEFINE_STUB_V(spdk_event_call, (struct spdk_event *event)); 159a1d9757SSeth Howell DEFINE_STUB(spdk_event_allocate, struct spdk_event *, (uint32_t core, spdk_event_fn fn, void *arg1, 169a1d9757SSeth Howell void *arg2), NULL); 17b85881ecSTomasz Zawadzki DEFINE_STUB_V(spdk_subsystem_init, (spdk_subsystem_init_fn cb_fn, void *cb_arg)); 1842ec403bSJim Harris DEFINE_STUB_V(spdk_subsystem_fini, (spdk_msg_fn cb_fn, void *cb_arg)); 199a1d9757SSeth Howell DEFINE_STUB_V(spdk_rpc_register_method, (const char *method, spdk_rpc_method_handler func, 209a1d9757SSeth Howell uint32_t state_mask)); 21e85d4712SMaciej Wawryk DEFINE_STUB_V(spdk_rpc_register_alias_deprecated, (const char *method, const char *alias)); 229a1d9757SSeth Howell DEFINE_STUB_V(spdk_rpc_set_state, (uint32_t state)); 239bec4525SSeth Howell DEFINE_STUB(spdk_rpc_get_state, uint32_t, (void), SPDK_RPC_RUNTIME); 241e3d25b9SShuhei Matsumoto DEFINE_STUB(spdk_rpc_initialize, int, (const char *listen_addr, 251e3d25b9SShuhei Matsumoto const struct spdk_rpc_opts *opts), 0); 260d0de8e7SJohn Levon DEFINE_STUB_V(spdk_rpc_set_allowlist, (const char **rpc_allowlist)); 2742ec403bSJim Harris DEFINE_STUB_V(spdk_rpc_finish, (void)); 2809895428SKrzysztof Karas DEFINE_STUB_V(spdk_rpc_server_finish, (const char *listen_addr)); 299e3241a1SKrzysztof Karas DEFINE_STUB_V(spdk_rpc_server_pause, (const char *listen_addr)); 309e3241a1SKrzysztof Karas DEFINE_STUB_V(spdk_rpc_server_resume, (const char *listen_addr)); 319a86498dSKrzysztof Karas DEFINE_STUB_V(spdk_subsystem_load_config, (void *json, ssize_t json_size, 329a86498dSKrzysztof Karas spdk_subsystem_init_fn cb_fn, void *cb_arg, bool stop_on_error)); 3342ec403bSJim Harris DEFINE_STUB_V(spdk_reactors_start, (void)); 3442ec403bSJim Harris DEFINE_STUB_V(spdk_reactors_stop, (void *arg1)); 35a71cd521SAlexis Lescouet DEFINE_STUB(spdk_reactors_init, int, (size_t msg_mempool_size), 0); 36e7cbcec3SJim Harris DEFINE_STUB_V(spdk_reactors_fini, (void)); 37cff96883STomasz Zawadzki bool g_scheduling_in_progress; 389a1d9757SSeth Howell 39*54944c1dSJim Harris SPDK_LOG_REGISTER_COMPONENT(app_rpc); 40*54944c1dSJim Harris 419a1d9757SSeth Howell static void 429a1d9757SSeth Howell unittest_usage(void) 439a1d9757SSeth Howell { 449a1d9757SSeth Howell } 459a1d9757SSeth Howell 4601e5610dSChunyang Hui static int 479a1d9757SSeth Howell unittest_parse_args(int ch, char *arg) 489a1d9757SSeth Howell { 4901e5610dSChunyang Hui return 0; 509a1d9757SSeth Howell } 519a1d9757SSeth Howell 529a1d9757SSeth Howell static void 53470a1330STomasz Kulasek clean_opts(struct spdk_app_opts *opts) 54470a1330STomasz Kulasek { 559c2b3b35SJim Harris free(opts->pci_allowed); 569c2b3b35SJim Harris opts->pci_allowed = NULL; 579c2b3b35SJim Harris free(opts->pci_blocked); 589c2b3b35SJim Harris opts->pci_blocked = NULL; 59470a1330STomasz Kulasek memset(opts, 0, sizeof(struct spdk_app_opts)); 60470a1330STomasz Kulasek } 61470a1330STomasz Kulasek 62470a1330STomasz Kulasek static void 639a1d9757SSeth Howell test_spdk_app_parse_args(void) 649a1d9757SSeth Howell { 659a1d9757SSeth Howell spdk_app_parse_args_rvals_t rc; 669a1d9757SSeth Howell struct spdk_app_opts opts = {}; 67938183c9SPawel Wodkowski struct option my_options[2] = {}; 689a1d9757SSeth Howell char *valid_argv[test_argc] = {"app_ut", 6978ad6728STomasz Zawadzki "--single-file-segments", 709a1d9757SSeth Howell "-d", 719a1d9757SSeth Howell "-p0", 729a1d9757SSeth Howell "-B", 739a1d9757SSeth Howell "0000:81:00.0" 749a1d9757SSeth Howell }; 75698dbd02SKrzysztof Karas char *invalid_argv_BA[test_argc] = {"app_ut", 769a1d9757SSeth Howell "-B", 779a1d9757SSeth Howell "0000:81:00.0", 78698dbd02SKrzysztof Karas "-A", 799a1d9757SSeth Howell "0000:82:00.0", 809a1d9757SSeth Howell "-cspdk.conf" 819a1d9757SSeth Howell }; 829a1d9757SSeth Howell /* currently use -z as our new option */ 839a1d9757SSeth Howell char *argv_added_short_opt[test_argc] = {"app_ut", 849a1d9757SSeth Howell "-z", 859a1d9757SSeth Howell "-d", 8678ad6728STomasz Zawadzki "--single-file-segments", 879a1d9757SSeth Howell "-p0", 889a1d9757SSeth Howell "-cspdk.conf" 899a1d9757SSeth Howell }; 909a1d9757SSeth Howell char *argv_added_long_opt[test_argc] = {"app_ut", 919a1d9757SSeth Howell "-cspdk.conf", 929a1d9757SSeth Howell "-d", 939a1d9757SSeth Howell "-r/var/tmp/spdk.sock", 949a1d9757SSeth Howell "--test-long-opt", 9578ad6728STomasz Zawadzki "--single-file-segments" 969a1d9757SSeth Howell }; 979a1d9757SSeth Howell char *invalid_argv_missing_option[test_argc] = {"app_ut", 989a1d9757SSeth Howell "-d", 999a1d9757SSeth Howell "-p", 10078ad6728STomasz Zawadzki "--single-file-segments", 101d673fceeSBen Walker "--silence-noticelog", 1029a1d9757SSeth Howell "-R" 1039a1d9757SSeth Howell }; 1049a1d9757SSeth Howell 1059a1d9757SSeth Howell /* Test valid arguments. Expected result: PASS */ 10614ccaed6SSeth Howell rc = spdk_app_parse_args(test_argc, valid_argv, &opts, "", NULL, unittest_parse_args, NULL); 1079a1d9757SSeth Howell CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_SUCCESS); 1089a1d9757SSeth Howell optind = 1; 109470a1330STomasz Kulasek clean_opts(&opts); 1109a1d9757SSeth Howell 1119a1d9757SSeth Howell /* Test invalid short option Expected result: FAIL */ 11214ccaed6SSeth Howell rc = spdk_app_parse_args(test_argc, argv_added_short_opt, &opts, "", NULL, unittest_parse_args, 11314ccaed6SSeth Howell NULL); 1149a1d9757SSeth Howell CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_FAIL); 1159a1d9757SSeth Howell optind = 1; 116470a1330STomasz Kulasek clean_opts(&opts); 1179a1d9757SSeth Howell 1189a1d9757SSeth Howell /* Test valid global and local options. Expected result: PASS */ 1199a1d9757SSeth Howell rc = spdk_app_parse_args(test_argc, argv_added_short_opt, &opts, "z", NULL, unittest_parse_args, 1209a1d9757SSeth Howell unittest_usage); 1219a1d9757SSeth Howell CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_SUCCESS); 1229a1d9757SSeth Howell optind = 1; 123470a1330STomasz Kulasek clean_opts(&opts); 1249a1d9757SSeth Howell 1259a1d9757SSeth Howell /* Test invalid long option Expected result: FAIL */ 12614ccaed6SSeth Howell rc = spdk_app_parse_args(test_argc, argv_added_long_opt, &opts, "", NULL, unittest_parse_args, 12714ccaed6SSeth Howell NULL); 1289a1d9757SSeth Howell CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_FAIL); 1299a1d9757SSeth Howell optind = 1; 130470a1330STomasz Kulasek clean_opts(&opts); 1319a1d9757SSeth Howell 1329a1d9757SSeth Howell /* Test valid global and local options. Expected result: PASS */ 1339a1d9757SSeth Howell my_options[0].name = "test-long-opt"; 1349a1d9757SSeth Howell rc = spdk_app_parse_args(test_argc, argv_added_long_opt, &opts, "", my_options, unittest_parse_args, 1359a1d9757SSeth Howell unittest_usage); 1369a1d9757SSeth Howell CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_SUCCESS); 1379a1d9757SSeth Howell optind = 1; 138470a1330STomasz Kulasek clean_opts(&opts); 1399a1d9757SSeth Howell 1409a1d9757SSeth Howell /* Test overlapping global and local options. Expected result: FAIL */ 14114ccaed6SSeth Howell rc = spdk_app_parse_args(test_argc, valid_argv, &opts, SPDK_APP_GETOPT_STRING, NULL, 14214ccaed6SSeth Howell unittest_parse_args, NULL); 1439a1d9757SSeth Howell CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_FAIL); 1449a1d9757SSeth Howell optind = 1; 145470a1330STomasz Kulasek clean_opts(&opts); 1469a1d9757SSeth Howell 147698dbd02SKrzysztof Karas /* Specify -B and -A options at the same time. Expected result: FAIL */ 148698dbd02SKrzysztof Karas rc = spdk_app_parse_args(test_argc, invalid_argv_BA, &opts, "", NULL, unittest_parse_args, NULL); 149d70941c3SSeth Howell SPDK_CU_ASSERT_FATAL(rc == SPDK_APP_PARSE_ARGS_FAIL); 1509a1d9757SSeth Howell optind = 1; 151470a1330STomasz Kulasek clean_opts(&opts); 1529a1d9757SSeth Howell 1539a1d9757SSeth Howell /* Omit necessary argument to option */ 15414ccaed6SSeth Howell rc = spdk_app_parse_args(test_argc, invalid_argv_missing_option, &opts, "", NULL, 15514ccaed6SSeth Howell unittest_parse_args, NULL); 1569a1d9757SSeth Howell CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_FAIL); 1579a1d9757SSeth Howell optind = 1; 158470a1330STomasz Kulasek clean_opts(&opts); 1599a1d9757SSeth Howell } 1609a1d9757SSeth Howell 1619a1d9757SSeth Howell int 1629a1d9757SSeth Howell main(int argc, char **argv) 1639a1d9757SSeth Howell { 1649a1d9757SSeth Howell CU_pSuite suite = NULL; 1659a1d9757SSeth Howell unsigned int num_failures; 1669a1d9757SSeth Howell 16778b696bcSVitaliy Mysak CU_initialize_registry(); 1689a1d9757SSeth Howell 1699a1d9757SSeth Howell suite = CU_add_suite("app_suite", NULL, NULL); 1709a1d9757SSeth Howell 171dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_spdk_app_parse_args); 1729a1d9757SSeth Howell 173ea941caeSKonrad Sztyber num_failures = spdk_ut_run_tests(argc, argv, NULL); 1749a1d9757SSeth Howell CU_cleanup_registry(); 1759a1d9757SSeth Howell 1769a1d9757SSeth Howell return num_failures; 1779a1d9757SSeth Howell } 178