tests/test_meta_config.sh
893e6636
 #!/usr/bin/env bash
 
 # Tests for DevStack meta-config functions
 
 TOP=$(cd $(dirname "$0")/.. && pwd)
 
 # Import config functions
bf2ad701
 source $TOP/inc/ini-config
 source $TOP/inc/meta-config
893e6636
 
fa3e8412
 set -e
 
893e6636
 # check_result() tests and reports the result values
 # check_result "actual" "expected"
aee18c74
 function check_result {
893e6636
     local actual=$1
     local expected=$2
     if [[ "$actual" == "$expected" ]]; then
         echo "OK"
     else
         echo -e "failed: $actual != $expected\n"
fcdca05d
         exit 1
893e6636
     fi
 }
 
85f42f69
 # mock function-common:die so that it does not
7f0be4fc
 # interrupt our test script
85f42f69
 function die {
     exit -1
 }
 
22b63666
 function warn {
     return 0
 }
 
893e6636
 TEST_1C_ADD="[eee]
 type=new
 multi = foo2"
 
aee18c74
 function create_test1c {
893e6636
     cat >test1c.conf <<EOF
 [eee]
 # original comment
 type=original
 EOF
 }
 
aee18c74
 function create_test2a {
893e6636
     cat >test2a.conf <<EOF
 [ddd]
 # original comment
 type=original
 EOF
 }
 
410f5c00
 function setup_test4 {
     mkdir -p test-etc
     cat >test-etc/test4.conf <<EOF
 [fff]
 # original comment
 type=original
 EOF
     TEST4_DIR="test-etc"
     TEST4_FILE="test4.conf"
 }
 
893e6636
 cat >test.conf <<EOF
 [[test1|test1a.conf]]
 [default]
 # comment an option
 #log_file=./log.conf
 log_file=/etc/log.conf
 handlers=do not disturb
 
 [aaa]
 # the commented option should not change
 #handlers=cc,dd
 handlers = aa, bb
 
 [[test1|test1b.conf]]
 [bbb]
 handlers=ee,ff
 
 [ ccc ]
 spaces  =  yes
 
 [[test2|test2a.conf]]
 [ddd]
 # new comment
 type=new
 additional=true
 
 [[test1|test1c.conf]]
 $TEST_1C_ADD
2ac8b3f3
 
 [[test3|test-space.conf]]
 [DEFAULT]
 attribute=value
22b63666
 
2ac8b3f3
 # the above line has a single space
893e6636
 
410f5c00
 [[test4|\$TEST4_DIR/\$TEST4_FILE]]
 [fff]
 type=new
e2c9fee8
 
f3bf8b6c
 [[test-env|test-env.conf]]
e2c9fee8
 [foo]
f3bf8b6c
 foo=\${FOO_BAR_BAZ}
cc87c287
 
 [[test5|test-equals.conf]]
 [DEFAULT]
 drivers = driver=python.import.path.Driver
 
 [[test6|test-strip.conf]]
 [DEFAULT]
 # next line has trailing space
e0d6a46b
 attr = strip_trailing_space
 
 [[test7|test-colon.conf]]
 [DEFAULT]
 servers=10.11.12.13:80
751ad1aa
 
85f42f69
 [[test8|/permission-denied.conf]]
 foo=bar
 
 [[test9|\$UNDEF]]
 foo=bar
 
 [[test10|does-not-exist-dir/test.conf]]
 foo=bar
 
02f3f9a6
 [[test11|test-same.conf]]
 [DEFAULT]
 foo=bar
 
 [[test11|test-same.conf]]
 [some]
 random=config
 
751ad1aa
 [[test-multi-sections|test-multi-sections.conf]]
 [sec-1]
 cfg_item1 = abcd
 cfg_item2 = efgh
 
 [sec-2]
 cfg_item1 = abcd
 cfg_item3 = /1/2/3/4:5
 cfg_item4 = end
 
 [sec-3]
 cfg_item5 = 5555
 cfg_item6 = 6666
 cfg_item5 = 5555another
 
 [[test-multiline|test-multiline.conf]]
 [multi]
f3bf8b6c
 cfg_item1 = ab:cd:ef:gh
751ad1aa
 cfg_item1 = abcd
 cfg_item2 = efgh
f3bf8b6c
 cfg_item2 = \${FOO_BAR_BAZ}
 
02f3f9a6
 [[test11|test-same.conf]]
 [another]
 non = sense
410f5c00
 EOF
893e6636
 
 echo -n "get_meta_section_files: test0 doesn't exist: "
 VAL=$(get_meta_section_files test.conf test0)
 check_result "$VAL" ""
 
 echo -n "get_meta_section_files: test1 3 files: "
 VAL=$(get_meta_section_files test.conf test1)
 EXPECT_VAL="test1a.conf
 test1b.conf
 test1c.conf"
 check_result "$VAL" "$EXPECT_VAL"
 
 echo -n "get_meta_section_files: test2 1 file: "
 VAL=$(get_meta_section_files test.conf test2)
 EXPECT_VAL="test2a.conf"
 check_result "$VAL" "$EXPECT_VAL"
 
 
 # Get a section from a group that doesn't exist
 echo -n "get_meta_section: test0 doesn't exist: "
 VAL=$(get_meta_section test.conf test0 test0.conf)
 check_result "$VAL" ""
 
 # Get a single section from a group with multiple files
 echo -n "get_meta_section: test1c single section: "
 VAL=$(get_meta_section test.conf test1 test1c.conf)
 check_result "$VAL" "$TEST_1C_ADD"
 
 # Get a single section from a group with a single file
 echo -n "get_meta_section: test2a single section: "
 VAL=$(get_meta_section test.conf test2 test2a.conf)
 EXPECT_VAL="[ddd]
 # new comment
 type=new
 additional=true"
 check_result "$VAL" "$EXPECT_VAL"
 
 # Get a single section that doesn't exist from a group
 echo -n "get_meta_section: test2z.conf not in test2: "
 VAL=$(get_meta_section test.conf test2 test2z.conf)
 check_result "$VAL" ""
 
 # Get a section from a conf file that doesn't exist
 echo -n "get_meta_section: nofile doesn't exist: "
 VAL=$(get_meta_section nofile.ini test1)
 check_result "$VAL" ""
 
 echo -n "get_meta_section: nofile doesn't exist: "
 VAL=$(get_meta_section nofile.ini test0 test0.conf)
 check_result "$VAL" ""
 
 echo -n "merge_config_file test1c exists: "
 create_test1c
 merge_config_file test.conf test1 test1c.conf
 VAL=$(cat test1c.conf)
 # iniset adds values immediately under the section header
 EXPECT_VAL="[eee]
 multi = foo2
 # original comment
 type=new"
 check_result "$VAL" "$EXPECT_VAL"
 
 echo -n "merge_config_file test2a exists: "
 create_test2a
 merge_config_file test.conf test2 test2a.conf
 VAL=$(cat test2a.conf)
 # iniset adds values immediately under the section header
 EXPECT_VAL="[ddd]
 additional = true
 # original comment
 type=new"
 check_result "$VAL" "$EXPECT_VAL"
 
 echo -n "merge_config_file test2a not exist: "
 rm test2a.conf
 merge_config_file test.conf test2 test2a.conf
 VAL=$(cat test2a.conf)
 # iniset adds a blank line if it creates the file...
 EXPECT_VAL="
 [ddd]
751ad1aa
 type = new
 additional = true"
 check_result "$VAL" "$EXPECT_VAL"
 
 echo -n "merge_config_file test-multi-sections: "
 rm -f test-multi-sections.conf
 merge_config_file test.conf test-multi-sections test-multi-sections.conf
 VAL=$(cat test-multi-sections.conf)
 EXPECT_VAL='
 [sec-1]
 cfg_item1 = abcd
 cfg_item2 = efgh
 
 [sec-2]
 cfg_item1 = abcd
 cfg_item3 = /1/2/3/4:5
 cfg_item4 = end
 
 [sec-3]
 cfg_item5 = 5555
 cfg_item5 = 5555another
 cfg_item6 = 6666'
 check_result "$VAL" "$EXPECT_VAL"
 
 echo -n "merge_config_file test-multiline: "
 rm -f test-multiline.conf
f3bf8b6c
 FOO_BAR_BAZ="foo bar baz"
751ad1aa
 merge_config_file test.conf test-multiline test-multiline.conf
 VAL=$(cat test-multiline.conf)
 EXPECT_VAL='
 [multi]
f3bf8b6c
 cfg_item1 = ab:cd:ef:gh
751ad1aa
 cfg_item1 = abcd
f3bf8b6c
 cfg_item2 = efgh
 cfg_item2 = foo bar baz'
893e6636
 check_result "$VAL" "$EXPECT_VAL"
f3bf8b6c
 unset FOO_BAR_BAZ
893e6636
 
 echo -n "merge_config_group test2: "
 rm test2a.conf
 merge_config_group test.conf test2
 VAL=$(cat test2a.conf)
 # iniset adds a blank line if it creates the file...
 EXPECT_VAL="
 [ddd]
751ad1aa
 type = new
 additional = true"
893e6636
 check_result "$VAL" "$EXPECT_VAL"
 
 echo -n "merge_config_group test2 no conf file: "
 rm test2a.conf
 merge_config_group x-test.conf test2
 if [[ ! -r test2a.conf ]]; then
     echo "OK"
 else
     echo "failed: $VAL != $EXPECT_VAL"
 fi
 
2ac8b3f3
 echo -n "merge_config_file test-space: "
 rm -f test-space.conf
 merge_config_file test.conf test3 test-space.conf
 VAL=$(cat test-space.conf)
 # iniset adds a blank line if it creates the file...
 EXPECT_VAL="
 [DEFAULT]
 attribute = value"
 check_result "$VAL" "$EXPECT_VAL"
 
f3bf8b6c
 echo -n "merge_config_file test-env: "
 rm -f test-env.conf
 FOO_BAR_BAZ="foo bar baz"
 merge_config_file test.conf test-env test-env.conf
 VAL=$(cat test-env.conf)
e2c9fee8
 EXPECT_VAL='
 [foo]
f3bf8b6c
 foo = foo bar baz'
e2c9fee8
 check_result "$VAL" "$EXPECT_VAL"
f3bf8b6c
 unset FOO_BAR_BAZ
e2c9fee8
 
410f5c00
 echo -n "merge_config_group test4 variable filename: "
 setup_test4
 merge_config_group test.conf test4
 VAL=$(cat test-etc/test4.conf)
 EXPECT_VAL="[fff]
 # original comment
 type=new"
 check_result "$VAL" "$EXPECT_VAL"
 
 echo -n "merge_config_group test4 variable filename (not exist): "
 setup_test4
 rm test-etc/test4.conf
 merge_config_group test.conf test4
 VAL=$(cat test-etc/test4.conf)
 EXPECT_VAL="
 [fff]
 type = new"
 check_result "$VAL" "$EXPECT_VAL"
 
cc87c287
 echo -n "merge_config_file test5 equals in value: "
 rm -f test-equals.conf
 merge_config_file test.conf test5 test-equals.conf
 VAL=$(cat test-equals.conf)
 # iniset adds a blank line if it creates the file...
 EXPECT_VAL="
 [DEFAULT]
 drivers = driver=python.import.path.Driver"
 check_result "$VAL" "$EXPECT_VAL"
 
 echo -n "merge_config_file test6 value stripped: "
 rm -f test-strip.conf
 merge_config_file test.conf test6 test-strip.conf
 VAL=$(cat test-strip.conf)
 # iniset adds a blank line if it creates the file...
 EXPECT_VAL="
 [DEFAULT]
 attr = strip_trailing_space"
 check_result "$VAL" "$EXPECT_VAL"
 
e0d6a46b
 echo -n "merge_config_file test7 colon in value: "
 rm -f test-colon.conf
 merge_config_file test.conf test7 test-colon.conf
 VAL=$(cat test-colon.conf)
 EXPECT_VAL="
 [DEFAULT]
 servers = 10.11.12.13:80"
 check_result "$VAL" "$EXPECT_VAL"
 
85f42f69
 echo "merge_config_file test8 non-touchable conf file: "
 set +e
 # function is expected to fail and exit, running it
 # in a subprocess to let this script proceed
 (merge_config_file test.conf test8 /permission-denied.conf)
 VAL=$?
 EXPECT_VAL=255
 check_result "$VAL" "$EXPECT_VAL"
 set -e
 
 echo -n "merge_config_group test9 undefined conf file: "
 set +e
22b63666
 # function is expected to trigger warn and continue
85f42f69
 (merge_config_group test.conf test9)
 VAL=$?
22b63666
 EXPECT_VAL=0
85f42f69
 check_result "$VAL" "$EXPECT_VAL"
 set -e
 
 echo -n "merge_config_group test10 not directory: "
 set +e
 # function is expected to fail and exit, running it
 # in a subprocess to let this script proceed
 (merge_config_group test.conf test10)
 VAL=$?
 EXPECT_VAL=255
 check_result "$VAL" "$EXPECT_VAL"
 set -e
 
02f3f9a6
 echo -n "merge_config_file test11 same section: "
 rm -f test-same.conf
 merge_config_group test.conf test11
 VAL=$(cat test-same.conf)
 EXPECT_VAL='
 [DEFAULT]
 foo = bar
 
 [some]
 random = config
 
 [another]
 non = sense'
 check_result "$VAL" "$EXPECT_VAL"
 
 
f3bf8b6c
 rm -f test.conf test1c.conf test2a.conf \
     test-space.conf test-equals.conf test-strip.conf \
     test-colon.conf test-env.conf test-multiline.conf \
02f3f9a6
     test-multi-sections.conf test-same.conf
410f5c00
 rm -rf test-etc