From d2d3454177837cc747d5fabd3e788edbe09795fe Mon Sep 17 00:00:00 2001 From: Olof hagsand Date: Wed, 13 Oct 2021 21:03:59 +0200 Subject: [PATCH] Dispatcher: modified key handling and added print function also added dispatcher utility and test functions --- lib/clixon/clixon_dispatcher.h | 42 ++++++++++++++++++++++--- test/test_dispatcher.sh | 54 +++++++++++++++++++++++++++++++++ util/clixon_util_dispatcher | Bin 0 -> 18608 bytes 3 files changed, 91 insertions(+), 5 deletions(-) create mode 100755 test/test_dispatcher.sh create mode 100755 util/clixon_util_dispatcher diff --git a/lib/clixon/clixon_dispatcher.h b/lib/clixon/clixon_dispatcher.h index 88bde49d..ff8bb0fd 100644 --- a/lib/clixon/clixon_dispatcher.h +++ b/lib/clixon/clixon_dispatcher.h @@ -1,12 +1,43 @@ /* - * Copyright 2021 Rubicon Communications LLC (Netgate) + * + ***** BEGIN LICENSE BLOCK ***** + + Copyright (C) 2021 Rubicon Communications, LLC(Netgate) + + This file is part of CLIXON. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Alternatively, the contents of this file may be used under the terms of + the GNU General Public License Version 3 or later (the "GPL"), + in which case the provisions of the GPL are applicable instead + of those above. If you wish to allow use of your version of this file only + under the terms of the GPL, and not to allow others to + use your version of this file under the terms of Apache License version 2, + indicate your decision by deleting the provisions above and replace them with + the notice and other provisions required by the GPL. If you do not delete + the provisions above, a recipient may use your version of this file under + the terms of any one of the Apache License version 2 or the GPL. + + ***** END LICENSE BLOCK ***** + * @see https://github.com/dcornejo/dispatcher */ -#ifndef DISPATCH_DISPATCHER_H -#define DISPATCH_DISPATCHER_H +#ifndef _CLIXON_DISPATCH_DISPATCHER_H +#define _CLIXON_DISPATCH_DISPATCHER_H -/*! prototype for a function to handle a path +/*! Prototype for a function to handle a path * minimally needs the path it's working on, but probably * we want to hand down cached data somehow * @param[in] h Generic handler @@ -74,5 +105,6 @@ struct _dispatcher_entry { int dispatcher_register_handler(dispatcher_entry_t **root, dispatcher_definition *x); int dispatcher_call_handlers(dispatcher_entry_t *root, void *handle, char *path, void *user_args); int dispatcher_free(dispatcher_entry_t *root); +int dispatcher_print(FILE *f, dispatcher_entry_t *root); -#endif /* DISPATCH_DISPATCHER_H */ +#endif /* _CLIXON_DISPATCH_DISPATCHER_H */ diff --git a/test/test_dispatcher.sh b/test/test_dispatcher.sh new file mode 100755 index 00000000..2735a9ad --- /dev/null +++ b/test/test_dispatcher.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +# Test of path dispatcher + +# Magic line must be first in script (see README.md) +s="$_" ; . ./lib.sh || if [ "$s" = $0 ]; then exit 0; else return 0; fi + +: ${clixon_util_dispatcher:="clixon_util_dispatcher"} + +new "null test" +expectpart "$($clixon_util_dispatcher)" 0 "^$" + +new "path /, nothing regged. Expect fail" +expectpart "$($clixon_util_dispatcher -c /)" 255 "^$" + +new "reg /, path / arg foo" +expectpart "$($clixon_util_dispatcher -a foo -p / -r -c /)" 0 "cb1 foo" + +new "reg /foo and /bar same cb1, call /" +expectpart "$($clixon_util_dispatcher -a foo -p /foo -r -a bar -p /bar -r -c /)" 0 "cb1 foo" "cb1 bar" + +new "reg /foo and /bar different cb, call /" +expectpart "$($clixon_util_dispatcher -i 1 -a foo -p /foo -r -a bar -p /bar -i 2 -r -c /)" 0 "cb1 foo" "cb2 bar" + +new "reg /foo and /bar call /foo" +expectpart "$($clixon_util_dispatcher -i 1 -a foo -p /foo -r -a bar -p /bar -i 2 -r -c /foo)" 0 "cb1 foo" + +new "reg /foo and /bar call /bar" +expectpart "$($clixon_util_dispatcher -i 1 -a foo -p /foo -r -a bar -p /bar -i 2 -r -c /bar)" 0 "cb2 bar" + +new "reg /route-table ipv4 and ipv6 call /route-table" +expectpart "$($clixon_util_dispatcher -i 1 -a ipv4 -p /route-table/ipv4 -r -a ipv6 -p /route-table -i 2 -r -c /route-table)" 0 "cb1 ipv4" "cb2 ipv6" + +new "reg /route-table/ ipv4,ipv6 call /route-table/ipv4" +expectpart "$($clixon_util_dispatcher -i 1 -a ipv4 -p /route-table/ipv4 -r -a ipv6 -p /route-table/ipv6 -i 2 -r -c /route-table/ipv4)" 0 "cb1 ipv4" --not-- cb2 + +new "reg /route-table/ ipv4,ipv6 call /route-table/ipv6" +expectpart "$($clixon_util_dispatcher -i 1 -a ipv4 -p /route-table/ipv4 -r -a ipv6 -p /route-table/ipv6 -i 2 -r -c /route-table/ipv6)" 0 "cb2 ipv6" --not-- cb1 + +new "reg /route-table/ ipv4,ipv6 call /route-table[proto='ipv4']/ipv4" +expectpart "$($clixon_util_dispatcher -i 1 -a ipv4 -p /route-table/ipv4 -r -a ipv6 -p /route-table/ipv6 -i 2 -r -c /route-table[proto='ipv4']/ipv4)" 0 "cb1 ipv4" --not-- "cb2 ipv6" + +new "reg /route-table/ ipv4,ipv6 call /route-table[proto='ipv6']/ipv6" +expectpart "$($clixon_util_dispatcher -i 1 -a ipv4 -p /route-table/ipv4 -r -a ipv6 -p /route-table/ipv6 -i 2 -r -c /route-table[proto='ipv6']/ipv6)" 0 "cb2 ipv6" --not-- "cb1 ipv4" + +new "reg /route-table/ ipv4,ipv6 call /route-table=/ipv4" +expectpart "$($clixon_util_dispatcher -i 1 -a ipv4 -p /route-table/ipv4 -r -a ipv6 -p /route-table/ipv6 -i 2 -r -c /route-table=/ipv4)" 0 "cb1 ipv4" --not-- "cb2 ipv6" + +# unset conditional parameters +unset clixon_util_dispatcher + +rm -rf $dir + +new "endtest" +endtest diff --git a/util/clixon_util_dispatcher b/util/clixon_util_dispatcher new file mode 100755 index 0000000000000000000000000000000000000000..4601c6a9c4dfb0e5784807463783c5fcae70dac2 GIT binary patch literal 18608 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