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