d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner/***
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner This file is part of systemd.
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner Copyright 2014 systemd developers
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner systemd is free software; you can redistribute it and/or modify it
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner under the terms of the GNU Lesser General Public License as published by
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner the Free Software Foundation; either version 2.1 of the License, or
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner (at your option) any later version.
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner systemd is distributed in the hope that it will be useful, but
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner WITHOUT ANY WARRANTY; without even the implied warranty of
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner Lesser General Public License for more details.
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner You should have received a copy of the GNU Lesser General Public License
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner along with systemd; If not, see <http://www.gnu.org/licenses/>.
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner***/
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner#include "macro.h"
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner#include "strv.h"
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner#include "verbs.h"
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisnerstatic int noop_dispatcher(int argc, char *argv[], void *userdata) {
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner return 0;
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner}
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner#define test_dispatch_one(argv, verbs, expected) \
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner optind = 0; \
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner assert_se(dispatch_verb(strv_length(argv), argv, verbs, NULL) == expected);
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisnerstatic void test_verbs(void) {
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner static const Verb verbs[] = {
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner { "help", VERB_ANY, VERB_ANY, 0, noop_dispatcher },
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner { "list-images", VERB_ANY, 1, 0, noop_dispatcher },
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner { "list", VERB_ANY, 2, VERB_DEFAULT, noop_dispatcher },
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner { "status", 2, VERB_ANY, 0, noop_dispatcher },
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner { "show", VERB_ANY, VERB_ANY, 0, noop_dispatcher },
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner { "terminate", 2, VERB_ANY, 0, noop_dispatcher },
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner { "login", 2, 2, 0, noop_dispatcher },
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner { "copy-to", 3, 4, 0, noop_dispatcher },
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner {}
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner };
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner /* not found */
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner test_dispatch_one(STRV_MAKE("command-not-found"), verbs, -EINVAL);
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner /* found */
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner test_dispatch_one(STRV_MAKE("show"), verbs, 0);
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner /* found, too few args */
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner test_dispatch_one(STRV_MAKE("copy-to", "foo"), verbs, -EINVAL);
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner /* found, meets min args */
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner test_dispatch_one(STRV_MAKE("status", "foo", "bar"), verbs, 0);
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner /* found, too many args */
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner test_dispatch_one(STRV_MAKE("copy-to", "foo", "bar", "baz", "quux", "qaax"), verbs, -EINVAL);
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner /* no verb, but a default is set */
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner test_dispatch_one(STRV_MAKE_EMPTY, verbs, 0);
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner}
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisnerstatic void test_verbs_no_default(void) {
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner static const Verb verbs[] = {
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner { "help", VERB_ANY, VERB_ANY, 0, noop_dispatcher },
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner {},
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner };
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner test_dispatch_one(STRV_MAKE(NULL), verbs, -EINVAL);
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner}
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisnerint main(int argc, char *argv[]) {
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner test_verbs();
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner test_verbs_no_default();
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner return 0;
d2f0e78f2b72620ecf088ea756f9958e947f1182Dave Reisner}