From e20283217b32b6d9ea485857f900322334e973d7 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Sat, 11 Aug 2012 22:43:13 +0200 Subject: [PATCH] tests: make all tests use the new conf-parsers This allows the tests to have their own command-line parsers. Finally! Signed-off-by: David Herrmann --- tests/test_include.h | 82 ++++++++++++++++++++++++++++++++++++++++++---------- tests/test_input.c | 68 ++++++++++++++++++++++++++++++++++++++++--- tests/test_output.c | 64 ++++++++++++++++++++++++++++++++++++---- tests/test_vt.c | 51 +++++++++++++++++++++++++++++--- 4 files changed, 236 insertions(+), 29 deletions(-) diff --git a/tests/test_include.h b/tests/test_include.h index fbab9ea..d4e924f 100644 --- a/tests/test_include.h +++ b/tests/test_include.h @@ -33,6 +33,48 @@ #include "eloop.h" #include "log.h" +#define TEST_HELP \ + "\t-h, --help [off] Print this help and exit\n" \ + "\t-v, --verbose [off] Print verbose messages\n" \ + "\t --debug [off] Enable debug mode\n" \ + "\t --silent [off] Suppress notices and warnings\n" + +struct { + bool help; + bool exit; + bool verbose; + bool debug; + bool silent; +} test_conf; + +static int aftercheck_debug(struct conf_option *opt, int argc, char **argv, + int idx) +{ + /* --debug implies --verbose */ + if (test_conf.debug) + test_conf.verbose = 1; + + return 0; +} + +static int aftercheck_help(struct conf_option *opt, int argc, char **argv, + int idx) +{ + /* exit after printing --help information */ + if (test_conf.help) { + print_help(); + test_conf.exit = true; + } + + return 0; +} + +#define TEST_OPTIONS \ + CONF_OPTION_BOOL('h', "help", aftercheck_help, &test_conf.help, false), \ + CONF_OPTION_BOOL('v', "verbose", NULL, &test_conf.verbose, false), \ + CONF_OPTION_BOOL(0, "debug", aftercheck_debug, &test_conf.debug, false), \ + CONF_OPTION_BOOL(0, "silent", NULL, &test_conf.silent, false) + static void sig_generic(struct ev_eloop *p, struct signalfd_siginfo *info, void *data) { @@ -42,46 +84,52 @@ static void sig_generic(struct ev_eloop *p, struct signalfd_siginfo *info, log_info("terminating due to caught signal %d", info->ssi_signo); } -static int test_prepare(int argc, char **argv, struct ev_eloop **out) +static int test_prepare(struct conf_option *opts, size_t len, + int argc, char **argv, struct ev_eloop **out) { int ret; struct ev_eloop *eloop; - ret = conf_parse_argv(argc, argv); + ret = conf_parse_argv(opts, len, argc, argv); if (ret) - return -EINVAL; + goto err_out; - if (conf_global.exit) - return -1; + if (test_conf.exit) { + ret = -ECANCELED; + goto err_out; + } - if (!conf_global.debug && !conf_global.verbose && conf_global.silent) + if (!test_conf.debug && !test_conf.verbose && test_conf.silent) log_set_config(&LOG_CONFIG_WARNING(0, 0, 0, 0)); else - log_set_config(&LOG_CONFIG_INFO(conf_global.debug, - conf_global.verbose)); + log_set_config(&LOG_CONFIG_INFO(test_conf.debug, + test_conf.verbose)); log_print_init(argv[0]); ret = ev_eloop_new(&eloop, log_llog); if (ret) - return ret; + goto err_out; ret = ev_eloop_register_signal_cb(eloop, SIGTERM, sig_generic, eloop); - if (ret) { - ev_eloop_unref(eloop); - return ret; - } + if (ret) + goto err_unref; ret = ev_eloop_register_signal_cb(eloop, SIGINT, sig_generic, eloop); if (ret) { ev_eloop_unregister_signal_cb(eloop, SIGTERM, sig_generic, eloop); - ev_eloop_unref(eloop); - return ret; + goto err_unref; } *out = eloop; return 0; + +err_unref: + ev_eloop_unref(eloop); +err_out: + conf_free(opts, len); + return ret; } static void test_fail(int ret) @@ -90,9 +138,11 @@ static void test_fail(int ret) log_err("init failed, errno %d: %s", ret, strerror(-ret)); } -static void test_exit(struct ev_eloop *eloop) +static void test_exit(struct conf_option *opts, size_t len, + struct ev_eloop *eloop) { ev_eloop_unregister_signal_cb(eloop, SIGINT, sig_generic, eloop); ev_eloop_unregister_signal_cb(eloop, SIGTERM, sig_generic, eloop); ev_eloop_unref(eloop); + conf_free(opts, len); } diff --git a/tests/test_input.c b/tests/test_input.c index 1db58a5..ef71cb7 100644 --- a/tests/test_input.c +++ b/tests/test_input.c @@ -24,6 +24,8 @@ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +static void print_help(); + #include #include #include @@ -43,6 +45,12 @@ static struct ev_eloop *eloop; static struct uterm_input *input; +struct { + char *xkb_layout; + char *xkb_variant; + char *xkb_options; +} input_conf; + /* Pressing Ctrl-\ should toggle the capturing. */ static void sig_quit(struct ev_eloop *p, struct signalfd_siginfo *info, @@ -109,7 +117,10 @@ static void monitor_event(struct uterm_monitor *mon, if (strcmp(ev->seat_name, "seat0")) return; - ret = uterm_input_new(&input, eloop); + ret = uterm_input_new(&input, eloop, + input_conf.xkb_layout, + input_conf.xkb_variant, + input_conf.xkb_options); if (ret) return; ret = uterm_input_register_cb(input, input_arrived, NULL); @@ -128,12 +139,60 @@ static void monitor_event(struct uterm_monitor *mon, } } +static void print_help() +{ + /* + * Usage/Help information + * This should be scaled to a maximum of 80 characters per line: + * + * 80 char line: + * | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | + * "12345678901234567890123456789012345678901234567890123456789012345678901234567890\n" + * 80 char line starting with tab: + * |10| 20 | 30 | 40 | 50 | 60 | 70 | 80 | + * "\t901234567890123456789012345678901234567890123456789012345678901234567890\n" + */ + fprintf(stderr, + "Usage:\n" + "\t%1$s [options]\n" + "\t%1$s -h [options]\n" + "\n" + "You can prefix boolean options with \"no-\" to negate it. If an argument is\n" + "given multiple times, only the last argument matters if not otherwise stated.\n" + "\n" + "General Options:\n" + TEST_HELP + "\n" + "Input Device Options:\n" + "\t --xkb-layout [us] Set XkbLayout for input devices\n" + "\t --xkb-variant [-] Set XkbVariant for input devices\n" + "\t --xkb-options [-] Set XkbOptions for input devices\n", + "test_input"); + /* + * 80 char line: + * | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | + * "12345678901234567890123456789012345678901234567890123456789012345678901234567890\n" + * 80 char line starting with tab: + * |10| 20 | 30 | 40 | 50 | 60 | 70 | 80 | + * "\t901234567890123456789012345678901234567890123456789012345678901234567890\n" + */ +} + +struct conf_option options[] = { + TEST_OPTIONS, + CONF_OPTION_STRING(0, "xkb-layout", NULL, &input_conf.xkb_layout, "us"), + CONF_OPTION_STRING(0, "xkb-variant", NULL, &input_conf.xkb_variant, ""), + CONF_OPTION_STRING(0, "xkb-options", NULL, &input_conf.xkb_options, ""), +}; + int main(int argc, char **argv) { int ret; struct uterm_monitor *mon; + size_t onum; - ret = test_prepare(argc, argv, &eloop); + onum = sizeof(options) / sizeof(*options); + ret = test_prepare(options, onum, argc, argv, &eloop); if (ret) goto err_fail; @@ -160,8 +219,9 @@ int main(int argc, char **argv) err_mon: uterm_monitor_unref(mon); err_exit: - test_exit(eloop); + test_exit(options, onum, eloop); err_fail: - test_fail(ret); + if (ret != -ECANCELED) + test_fail(ret); return abs(ret); } diff --git a/tests/test_output.c b/tests/test_output.c index 025a3a3..8f8e0b7 100644 --- a/tests/test_output.c +++ b/tests/test_output.c @@ -37,6 +37,8 @@ * $ ./test_output something */ +static void print_help(); + #include #include #include @@ -52,6 +54,11 @@ /* eloop object */ static struct ev_eloop *eloop; +struct { + bool fbdev; + bool test; +} output_conf; + static int blit_outputs(struct uterm_video *video) { struct uterm_display *iter; @@ -143,18 +150,64 @@ static int list_outputs(struct uterm_video *video) return 0; } +static void print_help() +{ + /* + * Usage/Help information + * This should be scaled to a maximum of 80 characters per line: + * + * 80 char line: + * | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | + * "12345678901234567890123456789012345678901234567890123456789012345678901234567890\n" + * 80 char line starting with tab: + * |10| 20 | 30 | 40 | 50 | 60 | 70 | 80 | + * "\t901234567890123456789012345678901234567890123456789012345678901234567890\n" + */ + fprintf(stderr, + "Usage:\n" + "\t%1$s [options]\n" + "\t%1$s -h [options]\n" + "\n" + "You can prefix boolean options with \"no-\" to negate it. If an argument is\n" + "given multiple times, only the last argument matters if not otherwise stated.\n" + "\n" + "General Options:\n" + TEST_HELP + "\n" + "Video Options:\n" + "\t --fbdev [off] Use fbdev instead of DRM\n" + "\t --test [off] Try displaying content instead of listing devices\n", + "test_input"); + /* + * 80 char line: + * | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | + * "12345678901234567890123456789012345678901234567890123456789012345678901234567890\n" + * 80 char line starting with tab: + * |10| 20 | 30 | 40 | 50 | 60 | 70 | 80 | + * "\t901234567890123456789012345678901234567890123456789012345678901234567890\n" + */ +} + +struct conf_option options[] = { + TEST_OPTIONS, + CONF_OPTION_BOOL(0, "fbdev", NULL, &output_conf.fbdev, false), + CONF_OPTION_BOOL(0, "test", NULL, &output_conf.test, false), +}; + int main(int argc, char **argv) { struct uterm_video *video; int ret; unsigned int mode; const char *node; + size_t onum; - ret = test_prepare(argc, argv, &eloop); + onum = sizeof(options) / sizeof(*options); + ret = test_prepare(options, onum, argc, argv, &eloop); if (ret) goto err_fail; - if (conf_global.use_fbdev) { + if (output_conf.fbdev) { mode = UTERM_VIDEO_FBDEV; node = "/dev/fb0"; } else { @@ -182,7 +235,7 @@ int main(int argc, char **argv) if (ret < 0) goto err_unref; - if (argc < 2) { + if (!output_conf.test) { ret = list_outputs(video); if (ret) { log_err("Cannot list outputs: %d", ret); @@ -199,8 +252,9 @@ int main(int argc, char **argv) err_unref: uterm_video_unref(video); err_exit: - test_exit(eloop); + test_exit(options, onum, eloop); err_fail: - test_fail(ret); + if (ret != -ECANCELED) + test_fail(ret); return abs(ret); } diff --git a/tests/test_vt.c b/tests/test_vt.c index 2b347fa..e835904 100644 --- a/tests/test_vt.c +++ b/tests/test_vt.c @@ -33,26 +33,68 @@ * ctrl+alt+FX (or some equivalent) to switch back to X/VT. */ +static void print_help(); + #include #include #include +#include #include #include #include - #include "eloop.h" #include "log.h" #include "uterm.h" #include "test_include.h" +static void print_help() +{ + /* + * Usage/Help information + * This should be scaled to a maximum of 80 characters per line: + * + * 80 char line: + * | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | + * "12345678901234567890123456789012345678901234567890123456789012345678901234567890\n" + * 80 char line starting with tab: + * |10| 20 | 30 | 40 | 50 | 60 | 70 | 80 | + * "\t901234567890123456789012345678901234567890123456789012345678901234567890\n" + */ + fprintf(stderr, + "Usage:\n" + "\t%1$s [options]\n" + "\t%1$s -h [options]\n" + "\n" + "You can prefix boolean options with \"no-\" to negate it. If an argument is\n" + "given multiple times, only the last argument matters if not otherwise stated.\n" + "\n" + "General Options:\n" + TEST_HELP, + "test_vt"); + /* + * 80 char line: + * | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | + * "12345678901234567890123456789012345678901234567890123456789012345678901234567890\n" + * 80 char line starting with tab: + * |10| 20 | 30 | 40 | 50 | 60 | 70 | 80 | + * "\t901234567890123456789012345678901234567890123456789012345678901234567890\n" + */ +} + +struct conf_option options[] = { + TEST_OPTIONS +}; + int main(int argc, char **argv) { int ret; struct ev_eloop *eloop; struct uterm_vt_master *vtm; struct uterm_vt *vt; + size_t onum; - ret = test_prepare(argc, argv, &eloop); + onum = sizeof(options) / sizeof(*options); + ret = test_prepare(options, onum, argc, argv, &eloop); if (ret) goto err_fail; @@ -81,8 +123,9 @@ int main(int argc, char **argv) err_vtm: uterm_vt_master_unref(vtm); err_exit: - test_exit(eloop); + test_exit(options, onum, eloop); err_fail: - test_fail(ret); + if (ret != -ECANCELED) + test_fail(ret); return abs(ret); } -- 2.7.4