/* Command line processing tests Copyright (C) Amitay Isaacs 2018 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 3 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 "replace.h" #include #include #include #include "common/cmdline.c" static int dummy_func(TALLOC_CTX *mem_ctx, int argc, const char **argv, void *private_data) { return 0; } static struct poptOption dummy_options[] = { POPT_TABLEEND }; static struct cmdline_command dummy_commands[] = { CMDLINE_TABLEEND }; static void test1(void) { TALLOC_CTX *mem_ctx; struct cmdline_context *cmdline; int ret; mem_ctx = talloc_new(NULL); assert(mem_ctx != NULL); ret = cmdline_init(mem_ctx, NULL, NULL, NULL, NULL, &cmdline); assert(ret == EINVAL); ret = cmdline_init(mem_ctx, "test1", NULL, NULL, NULL, &cmdline); assert(ret == EINVAL); ret = cmdline_init(mem_ctx, "test1", dummy_options, NULL, NULL, &cmdline); assert(ret == EINVAL); talloc_free(mem_ctx); } static struct cmdline_command test2_nofunc[] = { { "nofunc", NULL, NULL, NULL }, CMDLINE_TABLEEND }; static struct cmdline_command test2_nohelp[] = { { "nohelp", dummy_func, NULL, NULL }, CMDLINE_TABLEEND }; static struct cmdline_command test2_long[] = { { "really really long command with lots of words", dummy_func, "long command help", "" }, CMDLINE_TABLEEND }; static struct cmdline_command test2_longhelp[] = { { "longhelp", dummy_func, "this is a really really really long help message" \ "with lots of words and lots of description", NULL }, CMDLINE_TABLEEND }; static struct cmdline_command test2_twowords[] = { { "multiple words", dummy_func, "multiple words help", NULL }, CMDLINE_TABLEEND }; static void test2(void) { TALLOC_CTX *mem_ctx; struct cmdline_context *cmdline; int ret; mem_ctx = talloc_new(NULL); assert(mem_ctx != NULL); ret = cmdline_init(mem_ctx, "test2", NULL, NULL, test2_nofunc, &cmdline); assert(ret == EINVAL); ret = cmdline_init(mem_ctx, "test2", NULL, NULL, test2_nohelp, &cmdline); assert(ret == EINVAL); ret = cmdline_init(mem_ctx, "test2", NULL, NULL, test2_long, &cmdline); assert(ret == EINVAL); ret = cmdline_init(mem_ctx, "test2", NULL, NULL, test2_longhelp, &cmdline); assert(ret == EINVAL); ret = cmdline_init(mem_ctx, "test2", NULL, NULL, test2_twowords, &cmdline); assert(ret == 0); talloc_free(mem_ctx); } struct { const char *str; } test3_data; static struct poptOption test3_noname[] = { { NULL, 'o', POPT_ARG_STRING, &test3_data.str, 0, "Noname option", NULL }, POPT_TABLEEND }; static struct poptOption test3_notype[] = { { "debug", 'd', POPT_ARG_NONE, NULL, 0, "No argument option", NULL }, POPT_TABLEEND }; static struct poptOption test3_noarg[] = { { "debug", 'd', POPT_ARG_STRING, NULL, 0, "No argument option", NULL }, POPT_TABLEEND }; static void test3(void) { TALLOC_CTX *mem_ctx; struct cmdline_context *cmdline; int ret; mem_ctx = talloc_new(NULL); assert(mem_ctx != NULL); ret = cmdline_init(mem_ctx, "test3", test3_noname, NULL, dummy_commands, &cmdline); assert(ret == EINVAL); ret = cmdline_init(mem_ctx, "test3", test3_notype, NULL, dummy_commands, &cmdline); assert(ret == EINVAL); ret = cmdline_init(mem_ctx, "test3", test3_noarg, NULL, dummy_commands, &cmdline); assert(ret == EINVAL); talloc_free(mem_ctx); } static int test4_count; static int test4_value; static struct poptOption test4_options[] = { { "count", 'c', POPT_ARG_INT, &test4_count, 0, "Option help of length thirty.", NULL }, { "value", 'v', POPT_ARG_INT, &test4_value, 0, "Short description", "Value help of length 23" }, POPT_TABLEEND }; static struct cmdline_command test4_commands[] = { { "A really really long command", dummy_func, "This is a really long help message", "" }, { "short command", dummy_func, "short msg for short command", "" }, CMDLINE_TABLEEND }; static void test4(void) { TALLOC_CTX *mem_ctx; struct cmdline_context *cmdline; int ret; mem_ctx = talloc_new(NULL); assert(mem_ctx != NULL); ret = cmdline_init(mem_ctx, "test4", test4_options, NULL, test4_commands, &cmdline); assert(ret == 0); cmdline_usage(cmdline, NULL); cmdline_usage(cmdline, "short command"); talloc_free(mem_ctx); } static int action_func(TALLOC_CTX *mem_ctx, int argc, const char **argv, void *private_data) { if (argc != 1) { return 100; } printf("%s\n", argv[0]); return 200; } static struct cmdline_command action_commands[] = { { "action one", dummy_func, "action one help", NULL }, { "action two", action_func, "action two help", NULL }, CMDLINE_TABLEEND }; static void test5(void) { TALLOC_CTX *mem_ctx; struct cmdline_context *cmdline; const char *argv1[] = { "test5", "--help" }; const char *argv2[] = { "test5", "action" }; const char *argv3[] = { "test5", "action", "--help" }; const char *argv4[] = { "test5", "action", "one" }; int ret; mem_ctx = talloc_new(NULL); assert(mem_ctx != NULL); ret = cmdline_init(mem_ctx, "test5", NULL, "Action", action_commands, &cmdline); assert(ret == 0); ret = cmdline_parse(cmdline, 2, argv1, true); assert(ret == EAGAIN); ret = cmdline_parse(cmdline, 2, argv2, true); assert(ret == ENOENT); ret = cmdline_parse(cmdline, 3, argv3, true); assert(ret == EAGAIN); ret = cmdline_parse(cmdline, 3, argv4, true); assert(ret == 0); talloc_free(mem_ctx); } static void test6(void) { TALLOC_CTX *mem_ctx; struct cmdline_context *cmdline; const char *argv1[] = { "action", "two" }; const char *argv2[] = { "action", "two", "arg1" }; const char *argv3[] = { "action", "two", "arg1", "arg2" }; int ret, result; mem_ctx = talloc_new(NULL); assert(mem_ctx != NULL); ret = cmdline_init(mem_ctx, "test6", NULL, NULL, action_commands, &cmdline); assert(ret == 0); ret = cmdline_parse(cmdline, 2, argv1, false); assert(ret == 0); ret = cmdline_run(cmdline, NULL, &result); assert(ret == 0); assert(result == 100); ret = cmdline_parse(cmdline, 3, argv2, false); assert(ret == 0); ret = cmdline_run(cmdline, NULL, &result); assert(ret == 0); assert(result == 200); ret = cmdline_parse(cmdline, 4, argv3, false); assert(ret == 0); ret = cmdline_run(cmdline, NULL, &result); assert(ret == 0); assert(result == 100); talloc_free(mem_ctx); } static int test7_func(TALLOC_CTX *mem_ctx, int argc, const char **argv, void *private_data) { assert(argc == 1); printf("%s\n", argv[0]); return 0; } static struct cmdline_command test7_basic_commands[] = { { "cmd1", test7_func, "command one help", NULL }, { "cmd2", test7_func, "command two help", NULL }, CMDLINE_TABLEEND }; static struct cmdline_command test7_advanced_commands[] = { { "cmd3", test7_func, "command three help", NULL }, { "cmd4", test7_func, "command four help", NULL }, CMDLINE_TABLEEND }; static struct cmdline_command test7_ultimate_commands[] = { { "cmd5", test7_func, "command five help", NULL }, { "cmd6", test7_func, "command six help", NULL }, CMDLINE_TABLEEND }; static void test7(void) { TALLOC_CTX *mem_ctx; struct cmdline_context *cmdline; const char *argv1[] = { "cmd1", "one" }; const char *argv2[] = { "cmd3", "three" }; const char *argv3[] = { "cmd6", "six" }; int ret, result; mem_ctx = talloc_new(NULL); assert(mem_ctx != NULL); ret = cmdline_init(mem_ctx, "test7", NULL, "Basic", test7_basic_commands, &cmdline); assert(ret == 0); ret = cmdline_add(cmdline, "Advanced", test7_advanced_commands); assert(ret == 0); ret = cmdline_add(cmdline, "Ultimate", test7_ultimate_commands); assert(ret == 0); cmdline_usage(cmdline, NULL); printf("\n"); ret = cmdline_parse(cmdline, 2, argv1, false); assert(ret == 0); ret = cmdline_run(cmdline, NULL, &result); assert(ret == 0); assert(result == 0); ret = cmdline_parse(cmdline, 2, argv2, false); assert(ret == 0); ret = cmdline_run(cmdline, NULL, &result); assert(ret == 0); assert(result == 0); ret = cmdline_parse(cmdline, 2, argv3, false); assert(ret == 0); ret = cmdline_run(cmdline, NULL, &result); assert(ret == 0); assert(result == 0); talloc_free(mem_ctx); } int main(int argc, const char **argv) { int num; if (argc < 2) { fprintf(stderr, "Usage %s \n", argv[0]); exit(1); } num = atoi(argv[1]); switch (num) { case 1: test1(); break; case 2: test2(); break; case 3: test3(); break; case 4: test4(); break; case 5: test5(); break; case 6: test6(); break; case 7: test7(); break; } return 0; }