From: David Marchand Date: Mon, 18 Aug 2014 11:29:22 +0000 (+0200) Subject: app/test: introduce dynamic commands list X-Git-Tag: spdx-start~10457 X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=727909c59231;p=dpdk.git app/test: introduce dynamic commands list This patch adds a way to dynamically add a test without modifying commands.c. Move all current tests in a builtin_commands[] list, next patch will convert them to this new system. Signed-off-by: David Marchand Acked-by: Bruce Richardson Acked-by: Neil Horman --- diff --git a/app/test/commands.c b/app/test/commands.c index 4a0cc059cd..a1ffd43b6d 100644 --- a/app/test/commands.c +++ b/app/test/commands.c @@ -78,6 +78,15 @@ /****************/ +static struct test_commands_list commands_list = + TAILQ_HEAD_INITIALIZER(commands_list); + +void +add_test_command(struct test_command *t) +{ + TAILQ_INSERT_TAIL(&commands_list, t, next); +} + struct cmd_autotest_result { cmdline_fixed_string_t autotest; }; @@ -86,9 +95,15 @@ static void cmd_autotest_parsed(void *parsed_result, __attribute__((unused)) struct cmdline *cl, __attribute__((unused)) void *data) { + struct test_command *t; struct cmd_autotest_result *res = parsed_result; int ret = 0; + TAILQ_FOREACH(t, &commands_list, next) { + if (!strcmp(res->autotest, t->command)) + ret = t->callback(); + } + if (!strcmp(res->autotest, "version_autotest")) ret = test_version(); if (!strcmp(res->autotest, "eal_fs_autotest")) @@ -214,45 +229,7 @@ static void cmd_autotest_parsed(void *parsed_result, cmdline_parse_token_string_t cmd_autotest_autotest = TOKEN_STRING_INITIALIZER(struct cmd_autotest_result, autotest, - "pci_autotest#memory_autotest#" - "per_lcore_autotest#spinlock_autotest#" - "rwlock_autotest#atomic_autotest#" - "byteorder_autotest#prefetch_autotest#" - "cycles_autotest#logs_autotest#" - "memzone_autotest#ring_autotest#" - "mempool_autotest#mbuf_autotest#" - "timer_autotest#malloc_autotest#" - "memcpy_autotest#hash_autotest#" - "lpm_autotest#debug_autotest#" - "lpm6_autotest#" - "errno_autotest#tailq_autotest#" - "string_autotest#multiprocess_autotest#" - "cpuflags_autotest#eal_flags_autotest#" - "alarm_autotest#interrupt_autotest#" - "version_autotest#eal_fs_autotest#" - "cmdline_autotest#func_reentrancy_autotest#" -#ifdef RTE_LIBRTE_PMD_BOND - "link_bonding_autotest#" -#endif - "mempool_perf_autotest#hash_perf_autotest#" - "memcpy_perf_autotest#ring_perf_autotest#" - "red_autotest#meter_autotest#sched_autotest#" - "memcpy_perf_autotest#kni_autotest#" - "ivshmem_autotest#" - "devargs_autotest#table_autotest#" -#ifdef RTE_LIBRTE_ACL - "acl_autotest#" -#endif - "power_autotest#" - "timer_perf_autotest#" -#ifdef RTE_LIBRTE_PMD_RING - "ring_pmd_autotest#" -#endif -#ifdef RTE_LIBRTE_KVARGS - "kvargs_autotest#" -#endif - "common_autotest#" - "distributor_autotest#distributor_perf_autotest"); + ""); cmdline_parse_inst_t cmd_autotest = { .f = cmd_autotest_parsed, /* function to call */ @@ -460,3 +437,66 @@ cmdline_parse_ctx_t main_ctx[] = { NULL, }; +int commands_init(void) +{ + struct test_command *t; + char builtin_commands[] = + "pci_autotest#memory_autotest#" + "per_lcore_autotest#spinlock_autotest#" + "rwlock_autotest#atomic_autotest#" + "byteorder_autotest#prefetch_autotest#" + "cycles_autotest#logs_autotest#" + "memzone_autotest#ring_autotest#" + "mempool_autotest#mbuf_autotest#" + "timer_autotest#malloc_autotest#" + "memcpy_autotest#hash_autotest#" + "lpm_autotest#debug_autotest#" + "lpm6_autotest#" + "errno_autotest#tailq_autotest#" + "string_autotest#multiprocess_autotest#" + "cpuflags_autotest#eal_flags_autotest#" + "alarm_autotest#interrupt_autotest#" + "version_autotest#eal_fs_autotest#" + "cmdline_autotest#func_reentrancy_autotest#" +#ifdef RTE_LIBRTE_PMD_BOND + "link_bonding_autotest#" +#endif + "mempool_perf_autotest#hash_perf_autotest#" + "memcpy_perf_autotest#ring_perf_autotest#" + "red_autotest#meter_autotest#sched_autotest#" + "memcpy_perf_autotest#kni_autotest#" + "ivshmem_autotest#" + "devargs_autotest#table_autotest#" +#ifdef RTE_LIBRTE_ACL + "acl_autotest#" +#endif + "power_autotest#" + "timer_perf_autotest#" +#ifdef RTE_LIBRTE_PMD_RING + "ring_pmd_autotest#" +#endif +#ifdef RTE_LIBRTE_KVARGS + "kvargs_autotest#" +#endif + "common_autotest#" + "distributor_autotest#distributor_perf_autotest"; + char *commands, *ptr; + int commands_len = strlen(builtin_commands) + 1; + + TAILQ_FOREACH(t, &commands_list, next) { + commands_len += strlen(t->command) + 1; + } + + commands = malloc(commands_len); + if (!commands) + return -1; + + ptr = commands; + TAILQ_FOREACH(t, &commands_list, next) { + ptr += sprintf(ptr, "%s#", t->command); + } + ptr += sprintf(ptr, "%s", builtin_commands); + + cmd_autotest_autotest.string_data.str = commands; + return 0; +} diff --git a/app/test/test.c b/app/test/test.c index 589a168740..a33b2b5c44 100644 --- a/app/test/test.c +++ b/app/test/test.c @@ -126,6 +126,9 @@ main(int argc, char **argv) rte_timer_subsystem_init(); #endif + if (commands_init() < 0) + return -1; + argv += ret; prgname = argv[0]; diff --git a/app/test/test.h b/app/test/test.h index 181c38ef5c..bba0ec5224 100644 --- a/app/test/test.h +++ b/app/test/test.h @@ -34,6 +34,8 @@ #ifndef _TEST_H_ #define _TEST_H_ +#include + #define TEST_ASSERT(cond, msg, ...) do { \ if (!(cond)) { \ printf("TestCase %s() line %d failed: " \ @@ -125,6 +127,8 @@ int unit_test_suite_runner(struct unit_test_suite *suite); extern const char *prgname; +int commands_init(void); + int main(int argc, char **argv); int test_pci(void); @@ -183,4 +187,21 @@ int test_link_bonding(void); int test_pci_run; +typedef int (test_callback)(void); +TAILQ_HEAD(test_commands_list, test_command); +struct test_command { + TAILQ_ENTRY(test_command) next; + const char *command; + test_callback *callback; +}; + +void add_test_command(struct test_command *t); + +#define REGISTER_TEST_COMMAND(t) \ +static void testfn_##t(void);\ +void __attribute__((constructor, used)) testfn_##t(void)\ +{\ + add_test_command(&t);\ +} + #endif