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 <david.marchand@6wind.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
This commit is contained in:
David Marchand 2014-08-18 13:29:22 +02:00 committed by Thomas Monjalon
parent 3c9ea200e8
commit 727909c592
3 changed files with 103 additions and 39 deletions

View File

@ -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;
}

View File

@ -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];

View File

@ -34,6 +34,8 @@
#ifndef _TEST_H_
#define _TEST_H_
#include <sys/queue.h>
#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