summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorPeter Rajnoha <prajnoha@redhat.com>2012-03-05 12:49:06 +0000
committerPeter Rajnoha <prajnoha@redhat.com>2012-03-05 12:49:06 +0000
commit1518c7aac2d9026ab040377a4e4a6f473e7878af (patch)
tree34cfa4f579059ffc58a3a00db0a3347c11f23e29 /test
parentba428469e6b8546349f6acb293535b3e805a9313 (diff)
downloadlvm2-1518c7aac2d9026ab040377a4e4a6f473e7878af.tar.gz
lvm2-1518c7aac2d9026ab040377a4e4a6f473e7878af.tar.xz
lvm2-1518c7aac2d9026ab040377a4e4a6f473e7878af.zip
Add test for name mangling functionality.
Diffstat (limited to 'test')
-rw-r--r--test/shell/name-mangling.sh230
1 files changed, 230 insertions, 0 deletions
diff --git a/test/shell/name-mangling.sh b/test/shell/name-mangling.sh
new file mode 100644
index 00000000..327bd49e
--- /dev/null
+++ b/test/shell/name-mangling.sh
@@ -0,0 +1,230 @@
+# Copyright (C) 2012 Red Hat, Inc. All rights reserved.
+#
+# This copyrighted material is made available to anyone wishing to use,
+# modify, copy, or redistribute it subject to the terms and conditions
+# of the GNU General Public License v.2.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+. lib/test
+
+name_prefix=$RANDOM
+
+CHARACTER_WHITELIST="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789#+-.:=@_"
+FAIL_MIXED_STR="contains mixed mangled and unmangled characters"
+FAIL_MULTI_STR="seems to be multiple mangled"
+FAIL_BLACK_STR="should be mangled but it contains blacklisted characters"
+CORRECT_FORM_STR="name already in correct form"
+RENAMING_STR="renaming to"
+
+function create_dm_dev()
+{
+ local mode=$1
+ local name=$2;
+
+ if [ $mode = "none" ]; then
+ # there's no mangling done - we must use --verifyudev here in
+ # case we're testing with udev so we have the nodes in place,
+ # udev would not create them - it can't handle unmangled names
+ verify_udev="--verifyudev"
+ else
+ verify_udev=""
+ fi
+
+ dmsetup create "${name_prefix}$name" $verify_udev --manglename $mode --table "0 1 zero"
+}
+
+function remove_dm_dev()
+{
+ local mode=$1
+ local name=$2
+
+ if [ $mode = "none" ]; then
+ verify_udev="--verifyudev"
+ else
+ verify_udev=""
+ fi
+
+ dmsetup remove $verify_udev --manglename $mode "${name_prefix}$name"
+}
+
+function check_create_and_remove()
+{
+ local mode=$1
+ local input_name=$2
+ local dm_name=$3
+ local r=0
+
+ if [ $mode = "none" ]; then
+ verify_udev="--verifyudev"
+ else
+ verify_udev=""
+ fi
+
+ dmsetup create "${name_prefix}$input_name" $verify_udev --manglename $mode --table "0 1 zero" 2>err && \
+ test -b "$DM_DEV_DIR/mapper/${name_prefix}$dm_name" && \
+ dmsetup remove "${name_prefix}$input_name" $verify_udev --manglename $mode || r=1
+
+ if [ $dm_name = "FAIL_MIXED" ]; then
+ r=0
+ grep "$FAILED_MIXED_STR" err || r=1
+ elif [ $dm_name = "FAIL_MULTI" ]; then
+ r=0
+ grep "$FAILED_MULTI_STR" err || r=1
+ elif [ $dm_name = "FAIL_BLACK" ]; then
+ r=0
+ grep "$FAILED_BLACK_STR" err || r=1
+ fi
+
+ return $r
+}
+
+function check_dm_field()
+{
+ local mode=$1
+ local dm_name="$2"
+ local field=$3
+ local expected="$4"
+
+ value=$(dmsetup info --rows --noheadings --manglename $mode -c -o $field "${DM_DEV_DIR}/mapper/${name_prefix}$dm_name" 2> err || true)
+
+ if [ "$expected" = "FAIL_MIXED" ]; then
+ grep "$FAIL_MIXED_STR" err
+ elif [ "$expected" = "FAIL_MULTI" ]; then
+ grep "$FAIL_MULTI_STR" err
+ elif [ "$expected" = "FAIL_BLACK" ]; then
+ grep "$FAIL_BLACK_STR" err
+ else
+ test "$value" = "${name_prefix}$expected"
+ fi
+}
+
+function check_expected_names()
+{
+ local mode=$1
+ local dm_name="$2"
+ local r=0
+
+ create_dm_dev none "$dm_name"
+
+ test -b "$DM_DEV_DIR/mapper/${name_prefix}$dm_name" && \
+ check_dm_field none "$dm_name" name "$dm_name" && \
+ check_dm_field $mode "$dm_name" name "$3" && \
+ check_dm_field $mode "$dm_name" mangled_name "$4" && \
+ check_dm_field $mode "$dm_name" unmangled_name "$5" || r=1
+
+ remove_dm_dev none "$dm_name"
+
+ return $r
+}
+
+function check_mangle_cmd()
+{
+ local mode=$1
+ local dm_name="$2"
+ local expected="$3"
+ local rename_expected=0
+ local r=0
+
+ create_dm_dev none "$dm_name"
+
+ dmsetup mangle --manglename $mode "${name_prefix}$dm_name" 1>out 2>err || true;
+
+ if [ "$expected" = "OK" ]; then
+ grep "$CORRECT_FORM_STR" out || r=1
+ elif [ "$expected" = "FAIL_MIXED" ]; then
+ grep "$FAIL_MIXED_STR" err || r=1
+ elif [ "$expected" = "FAIL_MULTI" ]; then
+ grep "$FAIL_MULTI_STR" err || r=1
+ else
+ rename_expected=1
+ grep -F "$RENAMING_STR ${name_prefix}$expected" out || r=1
+ fi
+
+ if [ $r = 0 -a $rename_expected = 1 ]; then
+ # successfuly renamed to expected name
+ remove_dm_dev none "$expected"
+ elif [ $r = 1 ]; then
+ # failed to rename to expected or renamed when it should not - find the new name
+ new_name=$(sed -e "s/.*: $RENAMING_STR //g" out)
+ # try to remove any of the form - falling back to less probable error scenario
+ dmsetup remove --verifyudev --manglename none "$new_name" || \
+ remove_dm_dev none "$dm_name" || remove_dm_dev none "$expected"
+ else
+ # successfuly done nothing
+ remove_dm_dev none "$dm_name"
+ fi
+
+ return $r
+}
+
+# check dmsetup can process path where the last component is not equal dm name (rhbz #797322)
+r=0
+create_dm_dev auto "abc"
+ln -s ${DM_DEV_DIR}/mapper/${name_prefix}abc ${DM_DEV_DIR}/${name_prefix}xyz
+dmsetup status ${DM_DEV_DIR}/${name_prefix}xyz || r=1
+remove_dm_dev auto "abc"
+if [ r = 1 ]; then
+ exit 1
+fi
+
+### ALL WHITELISTED CHARACTERS ###
+# none of these should be mangled in any mode
+name="$CHARACTER_WHITELIST"
+for mode in auto hex none; do
+ check_expected_names $mode "$name" "$name" "$name" "$name"
+ check_mangle_cmd $mode "$name" "OK"
+done
+
+
+#### NONE MANGLING MODE ###
+check_create_and_remove none 'a b' 'a b'
+check_create_and_remove none 'a\x20b' 'a\x20b'
+check_create_and_remove none 'a b\x20c' 'a b\x20c'
+check_create_and_remove none 'a\x5cx20b' 'a\x5cx20b'
+
+check_expected_names none 'a b' 'a b' 'a\x20b' 'a b'
+check_expected_names none 'a\x20b' 'a\x20b' 'a\x20b' 'a b'
+check_expected_names none 'a b\x20c' 'a b\x20c' 'FAIL_MIXED' 'a b c'
+check_expected_names none 'a\x5cx20b' 'a\x5cx20b' 'a\x5cx20b' 'a\x20b'
+
+check_mangle_cmd none 'a b' 'OK'
+check_mangle_cmd none 'a\x20b' 'a b'
+check_mangle_cmd none 'a b\x20c' 'a b c'
+check_mangle_cmd none 'a\x5cx20b' 'a\x20b'
+
+
+### AUTO MANGLING MODE ###
+check_create_and_remove auto 'a b' 'a\x20b'
+check_create_and_remove auto 'a\x20b' 'a\x20b'
+check_create_and_remove auto 'a b\x20c' 'FAIL_MIXED'
+check_create_and_remove auto 'a\x5cx20b' 'FAIL_MULTI'
+
+check_expected_names auto 'a b' 'FAIL_BLACK' 'FAIL_BLACK' 'FAIL_BLACK'
+check_expected_names auto 'a\x20b' 'a b' 'a\x20b' 'a b'
+check_expected_names auto 'a b\x20c' 'FAIL_BLACK' 'FAIL_BLACK' 'FAIL_BLACK'
+check_expected_names auto 'a\x5cx20b' 'FAIL_MULTI' 'FAIL_MULTI' 'FAIL_MULTI'
+
+check_mangle_cmd auto 'a b' 'a\x20b'
+check_mangle_cmd auto 'a\x20b' 'OK'
+check_mangle_cmd auto 'a b\x20c' 'FAIL_MIXED'
+check_mangle_cmd auto 'a\x5cx20b' 'FAIL_MULTI'
+
+
+### HEX MANGLING MODE ###
+check_create_and_remove hex 'a b' 'a\x20b'
+check_create_and_remove hex 'a\x20b' 'a\x5cx20b'
+check_create_and_remove hex 'a b\x20c' 'a\x20b\x5cx20c'
+check_create_and_remove hex 'a\x5cx20b' 'a\x5cx5cx20b'
+
+check_expected_names hex 'a b' 'FAIL_BLACK' 'FAIL_BLACK' 'FAIL_BLACK'
+check_expected_names hex 'a\x20b' 'a b' 'a\x20b' 'a b'
+check_expected_names hex 'a b\x20c' 'FAIL_BLACK' 'FAIL_BLACK' 'FAIL_BLACK'
+check_expected_names hex 'a\x5cx20b' 'a\x20b' 'a\x5cx20b' 'a\x20b'
+
+check_mangle_cmd hex 'a b' 'a\x20b'
+check_mangle_cmd hex 'a\x20b' 'OK'
+check_mangle_cmd hex 'a b\x20c' 'FAIL_MIXED'
+check_mangle_cmd hex 'a\x5cx20b' 'OK'