From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28240 invoked by alias); 5 Mar 2012 12:49:07 -0000 Received: (qmail 28223 invoked by uid 9796); 5 Mar 2012 12:49:07 -0000 Date: Mon, 05 Mar 2012 12:49:00 -0000 Message-ID: <20120305124907.28221.qmail@sourceware.org> From: prajnoha@sourceware.org To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org Subject: LVM2/test/shell name-mangling.sh Mailing-List: contact lvm2-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: lvm2-cvs-owner@sourceware.org X-SW-Source: 2012-03/txt/msg00068.txt.bz2 CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: prajnoha@sourceware.org 2012-03-05 12:49:06 Added files: test/shell : name-mangling.sh Log message: Add test for name mangling functionality. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/test/shell/name-mangling.sh.diff?cvsroot=lvm2&r1=NONE&r2=1.1 /cvs/lvm2/LVM2/test/shell/name-mangling.sh,v --> standard output revision 1.1 --- LVM2/test/shell/name-mangling.sh +++ - 2012-03-05 12:49:07.028923000 +0000 @@ -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'