
This patch fixes an issue in iniset where backslash (\) characters are removed from the config value. This patch ensures that backslash characters (\) are escaped in addition to the ampersand (&) character that was already being escaped. Closes-Bug: #2120180 Signed-off-by: Douglas Mendizábal <dmendiza@redhat.com> Change-Id: Ica53ed42269931d151daf815d2e2c10c1f9e29a8
256 lines
6.4 KiB
Bash
Executable File
256 lines
6.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# Tests for DevStack INI functions
|
|
|
|
TOP=$(cd $(dirname "$0")/.. && pwd)
|
|
|
|
# Import config functions
|
|
source $TOP/inc/ini-config
|
|
|
|
source $TOP/tests/unittest.sh
|
|
|
|
set -e
|
|
|
|
echo "Testing INI functions"
|
|
|
|
INI_TMP_DIR=$(mktemp -d)
|
|
INI_TMP_ETC_DIR=$INI_TMP_DIR/etc
|
|
TEST_INI=${INI_TMP_ETC_DIR}/test.ini
|
|
mkdir ${INI_TMP_ETC_DIR}
|
|
|
|
echo "Creating $TEST_INI"
|
|
cat >${TEST_INI} <<EOF
|
|
[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
|
|
|
|
[bbb]
|
|
handlers=ee,ff
|
|
|
|
[ ccc ]
|
|
spaces = yes
|
|
|
|
[ddd]
|
|
empty =
|
|
|
|
[eee]
|
|
multi = foo1
|
|
multi = foo2
|
|
|
|
[fff]
|
|
ampersand =
|
|
|
|
[ggg]
|
|
backslash =
|
|
|
|
[key_with_spaces]
|
|
rgw special key = something
|
|
|
|
# inidelete(a)
|
|
[del_separate_options]
|
|
a=b
|
|
b=c
|
|
|
|
# inidelete(a)
|
|
[del_same_option]
|
|
a=b
|
|
a=c
|
|
|
|
# inidelete(a)
|
|
[del_missing_option]
|
|
b=c
|
|
|
|
# inidelete(a)
|
|
[del_missing_option_multi]
|
|
b=c
|
|
b=d
|
|
|
|
# inidelete(a)
|
|
[del_no_options]
|
|
|
|
# inidelete(a)
|
|
# no section - del_no_section
|
|
|
|
EOF
|
|
|
|
# set TEST_SUDO to test writing to root-owned files
|
|
SUDO_ARG=""
|
|
SUDO=""
|
|
if [ -n "$TEST_SUDO" ]; then
|
|
SUDO="sudo "
|
|
SUDO_ARG="-sudo "
|
|
sudo chown -R root:root ${INI_TMP_ETC_DIR}
|
|
fi
|
|
|
|
# test iniget_sections
|
|
VAL=$(iniget_sections "${TEST_INI}")
|
|
assert_equal "$VAL" "default aaa bbb ccc ddd eee fff ggg key_with_spaces \
|
|
del_separate_options del_same_option del_missing_option \
|
|
del_missing_option_multi del_no_options"
|
|
|
|
# Test with missing arguments
|
|
BEFORE=$(cat ${TEST_INI})
|
|
|
|
iniset ${SUDO_ARG} ${TEST_INI} aaa
|
|
NO_ATTRIBUTE=$(cat ${TEST_INI})
|
|
assert_equal "$BEFORE" "$NO_ATTRIBUTE" "test missing attribute argument"
|
|
|
|
iniset ${SUDO_ARG} ${TEST_INI}
|
|
NO_SECTION=$(cat ${TEST_INI})
|
|
assert_equal "$BEFORE" "$NO_SECTION" "missing section argument"
|
|
|
|
# Test with spaces in values
|
|
VAL=$(iniget ${TEST_INI} aaa handlers)
|
|
assert_equal "$VAL" "aa, bb" "iniget spaces in option"
|
|
|
|
iniset ${SUDO_ARG} ${TEST_INI} aaa handlers "11, 22"
|
|
VAL=$(iniget ${TEST_INI} aaa handlers)
|
|
assert_equal "$VAL" "11, 22" "iniset spaces in option"
|
|
|
|
# Test with spaces in section header
|
|
VAL=$(iniget ${TEST_INI} " ccc " spaces)
|
|
assert_equal "$VAL" "yes" "iniget with section header space"
|
|
|
|
iniset ${SUDO_ARG} ${TEST_INI} "b b" opt_ion 42
|
|
VAL=$(iniget ${TEST_INI} "b b" opt_ion)
|
|
assert_equal "$VAL" "42" "iniset with section header space"
|
|
|
|
# Test without spaces, end of file
|
|
VAL=$(iniget ${TEST_INI} bbb handlers)
|
|
assert_equal "$VAL" "ee,ff" "iniget at EOF"
|
|
|
|
iniset ${SUDO_ARG} ${TEST_INI} bbb handlers "33,44"
|
|
VAL=$(iniget ${TEST_INI} bbb handlers)
|
|
assert_equal "$VAL" "33,44" "inset at EOF"
|
|
|
|
# Test with ampersand in values
|
|
for i in `seq 3`; do
|
|
iniset ${TEST_INI} fff ampersand '&y'
|
|
done
|
|
VAL=$(iniget ${TEST_INI} fff ampersand)
|
|
assert_equal "$VAL" "&y" "iniset ampersands in option"
|
|
|
|
# Test with backslash in value
|
|
iniset ${TEST_INI} ggg backslash 'foo\bar'
|
|
VAL=$(iniget ${TEST_INI} ggg backslash)
|
|
assert_equal "$VAL" 'foo\bar' "iniset backslash in value"
|
|
|
|
# Test with both ampersand and backslash
|
|
iniset ${TEST_INI} ggg backslash 'foo\bar&baz'
|
|
VAL=$(iniget ${TEST_INI} ggg backslash)
|
|
assert_equal "$VAL" 'foo\bar&baz' "iniset ampersand and backslash in value"
|
|
|
|
# test empty option
|
|
if ini_has_option ${SUDO_ARG} ${TEST_INI} ddd empty; then
|
|
passed "ini_has_option: ddd.empty present"
|
|
else
|
|
failed "ini_has_option failed: ddd.empty not found"
|
|
fi
|
|
|
|
# test non-empty option
|
|
if ini_has_option ${SUDO_ARG} ${TEST_INI} bbb handlers; then
|
|
passed "ini_has_option: bbb.handlers present"
|
|
else
|
|
failed "ini_has_option failed: bbb.handlers not found"
|
|
fi
|
|
|
|
# test changing empty option
|
|
iniset ${SUDO_ARG} ${TEST_INI} ddd empty "42"
|
|
VAL=$(iniget ${TEST_INI} ddd empty)
|
|
assert_equal "$VAL" "42" "change empty option"
|
|
|
|
# test pipe in option
|
|
iniset ${SUDO_ARG} ${TEST_INI} aaa handlers "a|b"
|
|
VAL=$(iniget ${TEST_INI} aaa handlers)
|
|
assert_equal "$VAL" "a|b" "pipe in option"
|
|
|
|
# Test section not exist
|
|
VAL=$(iniget ${TEST_INI} zzz handlers)
|
|
assert_empty VAL "section does not exist"
|
|
|
|
# Test option not exist
|
|
VAL=$(iniget ${TEST_INI} aaa debug)
|
|
assert_empty VAL "option does not exist"
|
|
|
|
if ! ini_has_option ${TEST_INI} aaa debug; then
|
|
passed "ini_has_option: aaa.debug not present"
|
|
else
|
|
failed "ini_has_option failed: aaa.debug"
|
|
fi
|
|
|
|
# Test comments
|
|
inicomment ${SUDO_ARG} ${TEST_INI} aaa handlers
|
|
VAL=$(iniget ${TEST_INI} aaa handlers)
|
|
assert_empty VAL "test inicomment"
|
|
|
|
# Test multiple line iniset/iniget
|
|
iniset_multiline ${SUDO_ARG} ${TEST_INI} eee multi bar1 bar2
|
|
|
|
VAL=$(iniget_multiline ${TEST_INI} eee multi)
|
|
assert_equal "$VAL" "bar1 bar2" "iniget_multiline"
|
|
|
|
# Test iniadd with exiting values
|
|
iniadd ${SUDO_ARG} ${TEST_INI} eee multi bar3
|
|
VAL=$(iniget_multiline ${TEST_INI} eee multi)
|
|
assert_equal "$VAL" "bar1 bar2 bar3" "iniadd with existing values"
|
|
|
|
# Test iniadd with non-exiting values
|
|
iniadd ${SUDO_ARG} ${TEST_INI} eee non-multi foobar1 foobar2
|
|
VAL=$(iniget_multiline ${TEST_INI} eee non-multi)
|
|
assert_equal "$VAL" "foobar1 foobar2" "iniadd non-existing values"
|
|
|
|
# Test inidelete
|
|
del_cases="
|
|
del_separate_options
|
|
del_same_option
|
|
del_missing_option
|
|
del_missing_option_multi
|
|
del_no_options
|
|
del_no_section"
|
|
|
|
for x in $del_cases; do
|
|
inidelete ${SUDO_ARG} ${TEST_INI} $x a
|
|
VAL=$(iniget_multiline ${TEST_INI} $x a)
|
|
assert_empty VAL "inidelete $x"
|
|
if [ "$x" = "del_separate_options" -o \
|
|
"$x" = "del_missing_option" -o \
|
|
"$x" = "del_missing_option_multi" ]; then
|
|
VAL=$(iniget_multiline ${TEST_INI} $x b)
|
|
if [ "$VAL" = "c" -o "$VAL" = "c d" ]; then
|
|
passed "inidelete other_options $x"
|
|
else
|
|
failed "inidelete other_option $x: $VAL"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
# test file-creation
|
|
iniset $SUDO_ARG ${INI_TMP_ETC_DIR}/test.new.ini test foo bar
|
|
VAL=$(iniget ${INI_TMP_ETC_DIR}/test.new.ini test foo)
|
|
assert_equal "$VAL" "bar" "iniset created file"
|
|
|
|
# test creation of keys with spaces
|
|
iniset ${SUDO_ARG} ${TEST_INI} key_with_spaces "rgw another key" somethingelse
|
|
VAL=$(iniget ${TEST_INI} key_with_spaces "rgw another key")
|
|
assert_equal "$VAL" "somethingelse" "iniset created a key with spaces"
|
|
|
|
# test update of keys with spaces
|
|
iniset ${SUDO_ARG} ${TEST_INI} key_with_spaces "rgw special key" newvalue
|
|
VAL=$(iniget ${TEST_INI} key_with_spaces "rgw special key")
|
|
assert_equal "$VAL" "newvalue" "iniset updated a key with spaces"
|
|
|
|
inidelete ${SUDO_ARG} ${TEST_INI} key_with_spaces "rgw another key"
|
|
VAL=$(iniget ${TEST_INI} key_with_spaces "rgw another key")
|
|
assert_empty VAL "inidelete removed a key with spaces"
|
|
|
|
$SUDO rm -rf ${INI_TMP_DIR}
|
|
|
|
report_results
|