#!/usr/bin/env bash # API-PATH tests # Most tests are: generate lists, then access # Tests include single and double indexes. # string and int indexes # Lists and leaf-lists # Augmented yang where two lists are inside each other (depth) # Multiple matches # 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_path:=clixon_util_path -a -D $DBG} # Number of list/leaf-list entries : ${nr:=100} if [ $nr -lt 2 ] ; then echo "nr==$nr must be > 1" exit fi # Number of tests to generate XML for max=7 # XML file (alt provide it in stdin after xpath) for (( i=1; i<$max; i++ )); do eval xml$i=$dir/xml$i.xml done ydir=$dir/yang if [ ! -d $ydir ]; then mkdir $ydir fi # XPATH binary search in ordered-by system lists cat < $ydir/moda.yang module moda{ namespace "urn:example:a"; prefix a; import modb{ prefix b; } container x1{ description "list with single string key"; list y{ ordered-by system; key k1; leaf k1{ type string; } leaf z{ type string; } } } container x2{ description "list with single int key"; list y{ ordered-by system; key k1; leaf k1{ type uint32; } leaf z{ type string; } } } container x3{ description "list with double string keys"; list y{ ordered-by system; key "k1 k2"; leaf k1{ type string; } leaf k2{ type string; } leaf z{ type string; } } } container x4{ description "leaf-list with int key"; leaf-list y{ type string; } } list x5{ ordered-by system; description "Direct under root"; key "k1"; leaf k1{ type string; } leaf z{ type string; } } augment "/b:x6/b:yy" { list y{ ordered-by system; key "k1 k2"; leaf k1{ type string; } leaf k2{ type string; } leaf-list z{ type string; } } } } EOF # This is for augment usecase cat < $ydir/modb.yang module modb{ namespace "urn:example:b"; prefix b; container x6{ description "deep tree and augment"; list yy{ ordered-by system; key "kk1 kk2"; leaf kk1{ type string; } leaf kk2{ type string; } leaf-list zz{ type string; } } } } EOF rnd=$(( ( RANDOM % $nr ) )) # Single string key new "generate list with $nr single string key to $xml1" echo -n '' > $xml1 for (( i=0; i<$nr; i++ )); do echo -n "a$ifoo$i" >> $xml1 done echo -n '' >> $xml1 new "api-path single string key k1=a$rnd" echo "$clixon_util_path -f $xml1 -y $ydir -p /moda:x1/y=a$rnd" expectpart "$($clixon_util_path -f $xml1 -y $ydir -p /moda:x1/y=a$rnd)" 0 "^0: a$rndfoo$rnd$" new "api-path single string key /x1" expectpart "$($clixon_util_path -f $xml1 -y $ydir -p /moda:x1)" 0 "0: a0foo0a1foo1" # Assume at least two elements new "api-path single string key omit key" expectpart "$($clixon_util_path -f $xml1 -y $ydir -p /moda:x1/y)" 0 '^0: a0foo0 1: a0foo0' new "api-path single string wrong module, notfound" expectpart "$($clixon_util_path -f $xml1 -y $ydir -p /modxxx:x1/y=a$rnd 2> /dev/null)" 255 '^$' new "api-path single string no module, notfound" expectpart "$($clixon_util_path -f $xml1 -y $ydir -p /x1/y=a$rnd 2> /dev/null)" 255 '^$' new "api-path single string wrong top-symbol, notfound" expectpart "$($clixon_util_path -f $xml1 -y $ydir -p /moda:xxx/y=a$rnd 2> /dev/null)" 255 '^$' new "api-path single string wrong list-symbol, notfound" expectpart "$($clixon_util_path -f $xml1 -y $ydir -p /moda:x1/xxx=a$rnd 2> /dev/null)" 255 '^$' new "api-path single string two keys, notfound" expectpart "$($clixon_util_path -f $xml1 -y $ydir -p /moda:x1/y=a$rnd,a$rnd 2> /dev/null)" 255 '^$' new "api-path single string sub-element, notfound" expectpart "$($clixon_util_path -f $xml1 -y $ydir -p /moda:x1/y=a$rnd/xxx 2> /dev/null)" 255 '^$' # Single int key new "generate list with $nr single int key to $xml2" echo -n '' > $xml2 for (( i=0; i<$nr; i++ )); do echo -n "$ifoo$i" >> $xml2 done echo -n '' >> $xml2 new "api-path single int key k1=$rnd" expectpart "$($clixon_util_path -f $xml2 -y $ydir -p /moda:x2/y=$rnd)" 0 "^0: $rndfoo$rnd$" # Double string key new "generate list with $nr double string keys to $xml3 (two k2 entries per k1 key)" echo -n '' > $xml3 for (( i=0; i<$nr; i++ )); do echo -n "a$ia$ifoo$i" >> $xml3 echo -n "a$ib$ifoob$i" >> $xml3 done # Add two rules with empty k2 string echo -n "a0foo0" >> $xml3 echo -n "a1foo1" >> $xml3 echo -n '' >> $xml3 new "api-path double string key k1=a$rnd,b$rnd" expectpart "$($clixon_util_path -f $xml3 -y $ydir -p /moda:x3/y=a$rnd,b$rnd)" 0 "0: a$rndb$rndfoob$rnd" new "api-path double string key k1=a$rnd, - empty k2 string" expectpart "$($clixon_util_path -f $xml3 -y $ydir -p /moda:x3/y=a1,)" 0 "0: a1foo1" new "api-path double string key k1=a$rnd, - no k2 string - three matches" expectpart "$($clixon_util_path -f $xml3 -y $ydir -p /moda:x3/y=a1)" 0 "0: a1foo1 1: a1a1foo1 2: a1b1foob1" # Leaf-list new "generate leaf-list int keys to $xml4" echo -n '' > $xml4 for (( i=0; i<$nr; i++ )); do echo -n "a$i" >> $xml4 done echo -n '' >> $xml4 new "api-path leaf-list k1=a$rnd" expectpart "$($clixon_util_path -f $xml4 -y $ydir -p /moda:x4/y=a$rnd)" 0 "^0: a$rnd$" # Single string key direct under root new "generate list with $nr single string key to $xml5" echo -n '' > $xml5 for (( i=0; i<$nr; i++ )); do echo -n "a$ifoo$i" >> $xml5 done new "api-path direct under root single string key k1=a$rnd" expectpart "$($clixon_util_path -f $xml5 -y $ydir -p /moda:x5=a$rnd)" 0 "^0: a$rndfoo$rnd$" # Depth and augment # Deep augmented xml path new "generate deep list with augment" echo -n '' > $xml6 for (( i=0; i<$nr; i++ )); do echo -n "b$ib$ifoo$i" >> $xml6 for (( j=0; j<3; j++ )); do echo -n "a$ja$jfoo$j" >> $xml6 done echo -n "" >> $xml6 done echo -n '' >> $xml6 new "api-path double string key k1=b$rnd,b$rnd in modb" expectpart "$($clixon_util_path -f $xml6 -y $ydir -p /modb:x6/yy=b$rnd,b$rnd)" 0 "0: b$rndb$rndfoo$rnda0a0foo0a1a1foo1a2a2foo2" new "api-path double string key k1=a$rnd,b$rnd in modb + augmented in moda" expectpart "$($clixon_util_path -f $xml6 -y $ydir -p /modb:x6/yy=b$rnd,b$rnd/moda:y=a1,a1/z=foo1)" 0 "0: foo1" # unset conditional parameters unset nr unset clixon_util_path rm -rf $dir new "endtest" endtest