#!/usr/bin/env bash # Tests for DevStack meta-config functions TOP=$(cd $(dirname "$0")/.. && pwd) # Import config functions source $TOP/inc/ini-config source $TOP/inc/meta-config set -e # check_result() tests and reports the result values # check_result "actual" "expected" function check_result { local actual=$1 local expected=$2 if [[ "$actual" == "$expected" ]]; then echo "OK" else echo -e "failed: $actual != $expected\n" exit 1 fi } # mock function-common:die so that it does not # interrupt our test script function die { exit -1 } function warn { return 0 } TEST_1C_ADD="[eee] type=new multi = foo2" function create_test1c { cat >test1c.conf <<EOF [eee] # original comment type=original EOF } function create_test2a { cat >test2a.conf <<EOF [ddd] # original comment type=original EOF } 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" } 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 [[test3|test-space.conf]] [DEFAULT] attribute=value # the above line has a single space [[test4|\$TEST4_DIR/\$TEST4_FILE]] [fff] type=new [[test-env|test-env.conf]] [foo] foo=\${FOO_BAR_BAZ} [[test5|test-equals.conf]] [DEFAULT] drivers = driver=python.import.path.Driver [[test6|test-strip.conf]] [DEFAULT] # next line has trailing space attr = strip_trailing_space [[test7|test-colon.conf]] [DEFAULT] servers=10.11.12.13:80 [[test8|/permission-denied.conf]] foo=bar [[test9|\$UNDEF]] foo=bar [[test10|does-not-exist-dir/test.conf]] foo=bar [[test11|test-same.conf]] [DEFAULT] foo=bar [[test11|test-same.conf]] [some] random=config [[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] cfg_item1 = ab:cd:ef:gh cfg_item1 = abcd cfg_item2 = efgh cfg_item2 = \${FOO_BAR_BAZ} [[test11|test-same.conf]] [another] non = sense EOF 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] 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 FOO_BAR_BAZ="foo bar baz" merge_config_file test.conf test-multiline test-multiline.conf VAL=$(cat test-multiline.conf) EXPECT_VAL=' [multi] cfg_item1 = ab:cd:ef:gh cfg_item1 = abcd cfg_item2 = efgh cfg_item2 = foo bar baz' check_result "$VAL" "$EXPECT_VAL" unset FOO_BAR_BAZ 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] type = new additional = true" 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 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" 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) EXPECT_VAL=' [foo] foo = foo bar baz' check_result "$VAL" "$EXPECT_VAL" unset FOO_BAR_BAZ 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" 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" 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" 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 # function is expected to trigger warn and continue (merge_config_group test.conf test9) VAL=$? EXPECT_VAL=0 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 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" 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 \ test-multi-sections.conf test-same.conf rm -rf test-etc