Merge branch 'topic_benavrhm_rfc8527a_20201103' of https://github.com/benavrhm/clixon into benavrhm-topic_benavrhm_rfc8527a_20201103
This commit is contained in:
commit
a0006075c3
26 changed files with 921 additions and 792 deletions
24
test/all.sh
24
test/all.sh
|
|
@ -1,13 +1,27 @@
|
|||
#!/usr/bin/env bash
|
||||
# Run, eg as:
|
||||
# ./all.sh 2>&1 | tee test.log # break on first test
|
||||
# Run test_*.sh tests, stop on error, verbose logging, no pass/fail summary.
|
||||
#
|
||||
# This script requires the user to be in the sudo group.
|
||||
#
|
||||
# The 'pattern' variable determines which test files to execute.
|
||||
# By default, run all the tests in the test_*.sh files in this directory.
|
||||
|
||||
# Pattern to run tests, default is all, but you may want to narrow it down
|
||||
: ${pattern:=test_*.sh}
|
||||
|
||||
# You can specify tests files to exclude using the 'SKIPLIST' variable in a
|
||||
# site.sh file. See example in README.md. Files excluded by the 'SKIPLIST'
|
||||
# variable have precedence over files included by the 'pattern' variable.
|
||||
|
||||
# This script does not take arguments, so if arguments exist, print the Usage
|
||||
# in http://docopt.org/ format.
|
||||
if [ $# -gt 0 ]; then
|
||||
echo "usage: $0 # detailed logs and stop on first error. Use pattern=\"\" $0 to"
|
||||
echo " Use pattern=<pattern> $0 to narrow down test cases"
|
||||
echo "Usage:"
|
||||
echo " $0 # Run all 'test_*.sh' files"
|
||||
echo " pattern=<Bash glob pattern> $0 # Run only files matching the pattern"
|
||||
echo ""
|
||||
echo "Example:"
|
||||
echo " ${0} 2>&1 | tee test.log # Run all tests, output to 'test.log'"
|
||||
echo " pattern=test_feature.sh ${0} # Run only the tests in 'test_feature.sh'"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
|
|
|
|||
45
test/lib.sh
45
test/lib.sh
|
|
@ -1,5 +1,9 @@
|
|||
#!/usr/bin/env bash
|
||||
# Define test functions.
|
||||
# See numerous configuration variables later on in this file that you can set
|
||||
# in the environment or the site.sh file. The definitions in the site.sh file
|
||||
# override
|
||||
#
|
||||
# Create working dir as variable "dir"
|
||||
# The functions are somewhat wildgrown, a little too many:
|
||||
# - expectfn
|
||||
|
|
@ -17,8 +21,11 @@
|
|||
# Testfile (not including path)
|
||||
: ${testfile:=$(basename $0)}
|
||||
|
||||
# Add test to this list that you dont want run
|
||||
# Typically add them in your site file
|
||||
# SKIPLIST lists the filenames of the test files that you do *not* want to run.
|
||||
# The format is a whitespace separated list of filenames. Specify the SKIPLIST
|
||||
# either in the shell environment or in the site.sh file. Any SKIPLIST specified
|
||||
# in site.sh overrides a SKIPLIST specified in the environment. If not specified
|
||||
# in either the environment or the site.sh, then the default SKIPLIST is empty.
|
||||
: ${SKIPLIST:=""}
|
||||
|
||||
# Some tests (openconfig/yang_models) just test for the cli to return a version
|
||||
|
|
@ -34,21 +41,6 @@ if [ -f ./config.sh ]; then
|
|||
fi
|
||||
fi
|
||||
|
||||
# Site file, an example of this file in README.md
|
||||
if [ -f ./site.sh ]; then
|
||||
. ./site.sh
|
||||
if [ $? -ne 0 ]; then
|
||||
return -1 # skip
|
||||
fi
|
||||
# test skiplist.
|
||||
for f in $SKIPLIST; do
|
||||
if [ "$testfile" = "$f" ]; then
|
||||
echo "...skipped (see site.sh)"
|
||||
return -1 # skip
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Sanity nginx running on systemd platforms
|
||||
if systemctl > /dev/null; then
|
||||
nginxactive=$(systemctl show nginx |grep ActiveState=active)
|
||||
|
|
@ -66,6 +58,7 @@ if systemctl > /dev/null; then
|
|||
fi
|
||||
fi
|
||||
fi # systemctl
|
||||
|
||||
# Test number from start
|
||||
: ${testnr:=0}
|
||||
|
||||
|
|
@ -139,7 +132,6 @@ fi
|
|||
|
||||
# Standard IETF RFC yang files.
|
||||
: ${IETFRFC=../yang/standard}
|
||||
#: ${IETFRFC=$YANGMODELS/standard/ietf/RFC}
|
||||
|
||||
# Backend user
|
||||
BUSER=clicon
|
||||
|
|
@ -158,6 +150,23 @@ BUSER=clicon
|
|||
|
||||
: ${clixon_backend:=clixon_backend}
|
||||
|
||||
# Source the site-specific definitions for test script variables, if site.sh
|
||||
# exists. The variables defined in site.sh override any variables of the same
|
||||
# names in the environment in the current execution.
|
||||
if [ -f ./site.sh ]; then
|
||||
. ./site.sh
|
||||
if [ $? -ne 0 ]; then
|
||||
return -1 # skip
|
||||
fi
|
||||
# test skiplist.
|
||||
for f in $SKIPLIST; do
|
||||
if [ "$testfile" = "$f" ]; then
|
||||
echo "...skipped (see site.sh)"
|
||||
return -1 # skip
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
dir=/var/tmp/$0
|
||||
if [ ! -d $dir ]; then
|
||||
mkdir $dir
|
||||
|
|
|
|||
22
test/site.sh
Normal file
22
test/site.sh
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
#!#/bin/sh
|
||||
# Use this file to specify local site-specific env variables, or tests to
|
||||
# skip. This file is sourced by lib.sh
|
||||
#
|
||||
# Add test filenames that you do not want to run to the SKIPLIST variable. The
|
||||
# SKIPLIST is evaluated as a Bash glob in lib.sh, so you can use it to skip
|
||||
# files from the begining of the file list up to a pattern by specifying an
|
||||
# appropriate glob such as "test_[a-n]*\.sh".
|
||||
#
|
||||
# The SKIPLIST has precedence over the 'pattern' variable that you can use to
|
||||
# specify included file when running the various test scripts such as "all.sh".
|
||||
#SKIPLIST="test_[a-t]*\.sh test_openconfig.sh test_yangmodels.sh"
|
||||
#
|
||||
# Parse yang openconfig models from https://github.com/openconfig/public
|
||||
#OPENCONFIG=/usr/local/share/openconfig/public
|
||||
#
|
||||
# Parse yangmodels from https://github.com/YangModels/yang
|
||||
#YANGMODELS=/usr/local/share/yangmodels
|
||||
#
|
||||
# Specify alternative directory for the standard IETF RFC yang files.
|
||||
#IETFRFC=$YANGMODELS/standard/ietf/RFC
|
||||
|
||||
27
test/sum.sh
27
test/sum.sh
|
|
@ -1,15 +1,30 @@
|
|||
#!/usr/bin/env bash
|
||||
# Run, eg as:
|
||||
# ./sum.sh # to run all tests and print
|
||||
# Run test_*.sh tests, continue on error, no logging, print pass/fail summary.
|
||||
#
|
||||
# This script requires the user to be in the sudo group.
|
||||
#
|
||||
# The 'pattern' variable determines which test files are executed.
|
||||
# By default, run all the tests in the test_*.sh files in this directory.
|
||||
|
||||
: ${pattern:=test_*.sh}
|
||||
|
||||
# You can specify tests files to exclude using the 'SKIPLIST' variable in a
|
||||
# site.sh file. See example in README.md. Files excluded by the 'SKIPLIST'
|
||||
# variable have precedence over files included by the 'pattern' variable.
|
||||
|
||||
# This script does not take arguments, so if arguments exist, print the Usage
|
||||
# in http://docopt.org/ format.
|
||||
if [ $# -gt 0 ]; then
|
||||
echo "usage: $0 # pipe to dev/null and continue on error"
|
||||
echo "Usage:"
|
||||
echo " ${0} # Run all 'test_*.sh' files"
|
||||
echo " pattern=<Bash glob pattern> ${0} # Run only files matching the pattern"
|
||||
echo ""
|
||||
echo "Example:"
|
||||
echo " ${0} 2>&1 | tee test.log # Run all tests, output to 'test.log'"
|
||||
echo " pattern=test_feature.sh ${0} # Run only the tests in 'test_feature.sh'"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
# Pattern to run tests, default is all, but you may want to narrow it down
|
||||
: ${pattern:=test_*.sh}
|
||||
|
||||
err=0
|
||||
for testfile in $pattern; do # For lib.sh the variable must be called testfile
|
||||
echo "Running $testfile"
|
||||
|
|
|
|||
|
|
@ -248,7 +248,7 @@ match=`echo "$ret" | grep --null -Go "$expect"`
|
|||
if [ -z "$match" ]; then
|
||||
err "$expect" "$ret"
|
||||
fi
|
||||
expect="<module><name>ietf-yang-library</name><revision>2016-06-21</revision><namespace>urn:ietf:params:xml:ns:yang:ietf-yang-library</namespace><conformance-type>implement</conformance-type></module>"
|
||||
expect="<module><name>ietf-yang-library</name><revision>2019-01-04</revision><namespace>urn:ietf:params:xml:ns:yang:ietf-yang-library</namespace><conformance-type>implement</conformance-type></module>"
|
||||
match=`echo "$ret" | grep --null -Go "$expect"`
|
||||
if [ -z "$match" ]; then
|
||||
err "$expect" "$ret"
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ new "Netconf snd hello with prefix"
|
|||
expecteof "$clixon_netconf -qf $cfg" 0 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><nc:hello xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><nc:capabilities><nc:capability>urn:ietf:params:netconf:base:1.0</nc:capability></nc:capabilities></nc:hello>]]>]]>" '^$'
|
||||
|
||||
new "netconf snd + rcv hello"
|
||||
expecteof "$clixon_netconf -f $cfg" 0 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><hello $DEFAULTNS><capabilities><capability>urn:ietf:params:netconf:base:1.0</capability></capabilities></hello>]]>]]>" "^<hello $DEFAULTNS><capabilities><capability>urn:ietf:params:netconf:base:1.0</capability><capability>urn:ietf:params:netconf:capability:yang-library:1.0?revision=2016-06-21&module-set-id=42</capability><capability>urn:ietf:params:netconf:capability:candidate:1.0</capability><capability>urn:ietf:params:netconf:capability:validate:1.1</capability><capability>urn:ietf:params:netconf:capability:startup:1.0</capability><capability>urn:ietf:params:netconf:capability:xpath:1.0</capability><capability>urn:ietf:params:netconf:capability:notification:1.0</capability></capabilities><session-id>[0-9]*</session-id></hello>]]>]]>$"
|
||||
expecteof "$clixon_netconf -f $cfg" 0 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><hello $DEFAULTNS><capabilities><capability>urn:ietf:params:netconf:base:1.0</capability></capabilities></hello>]]>]]>" "^<hello $DEFAULTNS><capabilities><capability>urn:ietf:params:netconf:base:1.0</capability><capability>urn:ietf:params:netconf:capability:yang-library:1.0?revision=2019-01-04&module-set-id=42</capability><capability>urn:ietf:params:netconf:capability:candidate:1.0</capability><capability>urn:ietf:params:netconf:capability:validate:1.1</capability><capability>urn:ietf:params:netconf:capability:startup:1.0</capability><capability>urn:ietf:params:netconf:capability:xpath:1.0</capability><capability>urn:ietf:params:netconf:capability:notification:1.0</capability></capabilities><session-id>[0-9]*</session-id></hello>]]>]]>$"
|
||||
|
||||
new "netconf rcv hello, disable RFC7895/ietf-yang-library"
|
||||
expecteof "$clixon_netconf -f $cfg -o CLICON_MODULE_LIBRARY_RFC7895=0" 0 "<rpc $DEFAULTNS message-id=\"101\"><get-config><source><candidate/></source></get-config></rpc>]]>]]>" "^<hello $DEFAULTNS><capabilities><capability>urn:ietf:params:netconf:base:1.0</capability><capability>urn:ietf:params:netconf:capability:candidate:1.0</capability><capability>urn:ietf:params:netconf:capability:validate:1.1</capability><capability>urn:ietf:params:netconf:capability:startup:1.0</capability><capability>urn:ietf:params:netconf:capability:xpath:1.0</capability><capability>urn:ietf:params:netconf:capability:notification:1.0</capability></capabilities><session-id>[0-9]*</session-id></hello>]]>]]><rpc-reply $DEFAULTNS message-id=\"101\"><data/></rpc-reply>]]>]]>$"
|
||||
|
|
|
|||
|
|
@ -76,7 +76,6 @@ testrun()
|
|||
new "kill old restconf daemon"
|
||||
stop_restconf_pre
|
||||
|
||||
|
||||
if $USEBACKEND; then
|
||||
new "start restconf daemon -b"
|
||||
start_restconf -f $cfg -b
|
||||
|
|
@ -84,7 +83,6 @@ testrun()
|
|||
new "start restconf daemon"
|
||||
start_restconf -f $cfg
|
||||
fi
|
||||
|
||||
fi
|
||||
new "wait restconf"
|
||||
wait_restconf
|
||||
|
|
@ -93,11 +91,11 @@ testrun()
|
|||
expectpart "$(curl $CURLOPTS -X GET $RCPROTO://localhost/.well-known/host-meta)" 0 'HTTP/1.1 200 OK' "<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'>" "<Link rel='restconf' href='/restconf'/>" "</XRD>"
|
||||
|
||||
new "restconf get restconf resource. RFC 8040 3.3 (json)"
|
||||
expectpart "$(curl $CURLOPTS -X GET -H "Accept: application/yang-data+json" $RCPROTO://localhost/restconf)" 0 'HTTP/1.1 200 OK' '{"ietf-restconf:restconf":{"data":{},"operations":{},"yang-library-version":"2016-06-21"}}'
|
||||
expectpart "$(curl $CURLOPTS -X GET -H "Accept: application/yang-data+json" $RCPROTO://localhost/restconf)" 0 'HTTP/1.1 200 OK' '{"ietf-restconf:restconf":{"data":{},"operations":{},"yang-library-version":"2019-01-04"}}'
|
||||
|
||||
new "restconf get restconf resource. RFC 8040 3.3 (xml)"
|
||||
# Get XML instead of JSON?
|
||||
expectpart "$(curl $CURLOPTS -X GET -H 'Accept: application/yang-data+xml' $RCPROTO://localhost/restconf)" 0 'HTTP/1.1 200 OK' '<restconf xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"><data/><operations/><yang-library-version>2016-06-21</yang-library-version></restconf>'
|
||||
new "restconf get restconf resource. RFC 8040 3.3 (xml)"
|
||||
# Get XML instead of JSON?
|
||||
expectpart "$(curl $CURLOPTS -X GET -H 'Accept: application/yang-data+xml' $RCPROTO://localhost/restconf)" 0 'HTTP/1.1 200 OK' '<restconf xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"><data/><operations/><yang-library-version>2019-01-04</yang-library-version></restconf>'
|
||||
|
||||
# Should be alphabetically ordered
|
||||
new "restconf get restconf/operations. RFC8040 3.3.2 (json)"
|
||||
|
|
@ -112,11 +110,11 @@ testrun()
|
|||
fi
|
||||
|
||||
new "restconf get restconf/yang-library-version. RFC8040 3.3.3"
|
||||
expectpart "$(curl $CURLOPTS -X GET $RCPROTO://localhost/restconf/yang-library-version)" 0 'HTTP/1.1 200 OK' '{"yang-library-version":"2016-06-21"}'
|
||||
expectpart "$(curl $CURLOPTS -X GET $RCPROTO://localhost/restconf/yang-library-version)" 0 'HTTP/1.1 200 OK' '{"yang-library-version":"2019-01-04"}'
|
||||
|
||||
new "restconf get restconf/yang-library-version. RFC8040 3.3.3 (xml)"
|
||||
ret=$(curl $CURLOPTS -X GET -H "Accept: application/yang-data+xml" $RCPROTO://localhost/restconf/yang-library-version)
|
||||
expect="<yang-library-version>2016-06-21</yang-library-version>"
|
||||
expect="<yang-library-version>2019-01-04</yang-library-version>"
|
||||
match=`echo $ret | grep --null -Eo "$expect"`
|
||||
if [ -z "$match" ]; then
|
||||
err "$expect" "$ret"
|
||||
|
|
|
|||
|
|
@ -91,12 +91,12 @@ fi
|
|||
new "B.1.1. Retrieve the Top-Level API Resource root"
|
||||
expectpart "$(curl $CURLOPTS -X GET -H 'Accept: application/xrd+xml' $RCPROTO://localhost/.well-known/host-meta)" 0 "HTTP/1.1 200 OK" "Content-Type: application/xrd+xml" "<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'>" "<Link rel='restconf' href='/restconf'/>" "</XRD>"
|
||||
|
||||
d='{"ietf-restconf:restconf":{"data":{},"operations":{},"yang-library-version":"2016-06-21"}}'
|
||||
d='{"ietf-restconf:restconf":{"data":{},"operations":{},"yang-library-version":"2019-01-04"}}'
|
||||
new "B.1.1. Retrieve the Top-Level API Resource /restconf json"
|
||||
expectpart "$(curl $CURLOPTS -X GET -H 'Accept: application/yang-data+json' $RCPROTO://localhost/restconf)" 0 "HTTP/1.1 200 OK" 'Cache-Control: no-cache' "Content-Type: application/yang-data+json" "$d"
|
||||
|
||||
new "B.1.1. Retrieve the Top-Level API Resource /restconf xml (not in RFC)"
|
||||
expectpart "$(curl $CURLOPTS -X GET -H 'Accept: application/yang-data+xml' $RCPROTO://localhost/restconf)" 0 "HTTP/1.1 200 OK" 'Cache-Control: no-cache' "Content-Type: application/yang-data+xml" '<restconf xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"><data/><operations/><yang-library-version>2016-06-21</yang-library-version></restconf>'
|
||||
expectpart "$(curl $CURLOPTS -X GET -H 'Accept: application/yang-data+xml' $RCPROTO://localhost/restconf)" 0 "HTTP/1.1 200 OK" 'Cache-Control: no-cache' "Content-Type: application/yang-data+xml" '<restconf xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf"><data/><operations/><yang-library-version>2019-01-04</yang-library-version></restconf>'
|
||||
|
||||
# This just catches the header and the jukebox module, the RFC has foo and bar which
|
||||
# seems wrong to recreate
|
||||
|
|
|
|||
|
|
@ -305,7 +305,6 @@ MODSTATE1='<modules-state xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-library">
|
|||
|
||||
MODSTATE2='<module><name>interfaces</name><revision>2018-02-20</revision><namespace>urn:example:interfaces</namespace></module>'
|
||||
|
||||
|
||||
XML='<interfaces xmlns="urn:example:interfaces"><interface><name>e0</name><docs><descr>First interface</descr></docs><type>eth</type><admin-status>up</admin-status><statistics><in-octets>54326.432</in-octets><in-unicast-pkts>8458765</in-unicast-pkts></statistics></interface><interface><name>e1</name><type>eth</type><admin-status>down</admin-status></interface></interfaces>'
|
||||
|
||||
ALL="<config>$MODSTATE$XML</config>"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue