xref: /spdk/test/unit/lib/event/app.c/app_ut.c (revision 77be4b721c3bd5083994465767924549439a8365)
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