blob: b21dc44efa57313ad1ffa54a7c8f68bcd7f1efda [file] [log] [blame]
#!/bin/bash
#
# Copyright (C) 2010 Davidlohr Bueso <dave@gnu.org>
#
# This file is part of util-linux.
#
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This file is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
TS_TOPDIR="${0%/*}/../.."
TS_DESC="partitions probing"
PARTS=3
. $TS_TOPDIR/functions.sh
ts_init "$*"
ts_check_test_command "$TS_CMD_PARTX"
ts_check_test_command "$TS_CMD_ADDPART"
ts_check_test_command "$TS_CMD_DELPART"
ts_skip_nonroot
shopt -s nullglob
function check_partition_count
{
# this function needs shopt -s nullglob
local cnt_want=$1
local devname=$(basename $TS_DEVICE)
local parts=(/sys/block/${devname}/${devname}*)
local cnt_have=${#parts[@]}
if [ $cnt_have -eq $cnt_want ]; then
return 0
fi
echo "error: expected $cnt_want partitions, have $cnt_have" >&2
echo "${parts[@]}" >&2
return 1
}
# set global variable TS_DEVICE
ts_scsi_debug_init dev_size_mb=50
ts_init_subtest "addpart"
{
$TS_CMD_ADDPART ${TS_DEVICE} 1 0 1 &&
echo OK ||
echo "Unable to add partition"
check_partition_count 1
} >$TS_OUTPUT 2>&1
ts_finalize_subtest
udevadm settle
ts_init_subtest "delpart"
{
$TS_CMD_DELPART ${TS_DEVICE} 1 &&
echo OK ||
echo "Unable to remove partition"
check_partition_count 0
} >$TS_OUTPUT 2>&1
ts_finalize_subtest
ts_scsi_debug_rmmod
# set global variable TS_DEVICE
ts_scsi_debug_init dev_size_mb=50 num_parts=$PARTS
ts_init_subtest "detect-parts"
{
$TS_CMD_PARTX --show $TS_DEVICE &&
echo OK ||
echo "Unable to list partitions"
check_partition_count $PARTS
} >$TS_OUTPUT 2>&1
ts_finalize_subtest
udevadm settle
ts_init_subtest "delete-all"
#delete partinfo
{
$TS_CMD_PARTX --delete $TS_DEVICE &&
echo "partitions deleted" ||
echo "Unable to delete partitions on $TS_DEVICE"
check_partition_count 0
} >$TS_OUTPUT 2>&1
ts_finalize_subtest
udevadm settle
ts_init_subtest "add-all"
#read TS_DEVICE and restore the partinfo
{
$TS_CMD_PARTX --add $TS_DEVICE &&
echo "partitions added" ||
echo "Unable to add partitions for $TS_DEVICE"
check_partition_count $PARTS
} >$TS_OUTPUT 2>&1
ts_finalize_subtest
udevadm settle
ts_init_subtest "update-one"
#read TS_DEVICE and update second partition
{
$TS_CMD_PARTX --update ${TS_DEVICE}2 &&
echo "partitions updated" ||
echo "Unable to update 2nd partition for $TS_DEVICE"
check_partition_count $PARTS
} >$TS_OUTPUT 2>&1
ts_finalize_subtest
udevadm settle
ts_init_subtest "delete-one"
#remove last partition only
{
$TS_CMD_PARTX -d --nr -1 $TS_DEVICE &&
echo "last partition removed" ||
echo "Unable to remove a partition on $TS_DEVICE"
check_partition_count $((PARTS-1))
} >$TS_OUTPUT 2>&1
ts_finalize_subtest
udevadm settle
ts_init_subtest "delete-non-existent"
#attempt to remove it again
{
$TS_CMD_PARTX -d --nr $PARTS $TS_DEVICE &&
echo "partx failed: removed non-existing partition" ||
echo "partx: OK"
} >$TS_OUTPUT 2>&1
ts_finalize_subtest
udevadm settle
ts_init_subtest "add-existing"
#try adding an existing partition
{
$TS_CMD_PARTX -a --nr 1 $TS_DEVICE 2>/dev/null &&
echo "partx failed: re-added an existing partition" ||
echo "partx: OK"
} >$TS_OUTPUT 2>&1
ts_finalize_subtest
udevadm settle
ts_init_subtest "change-by-range"
# {-a|-d} --nr 0 should handle all partitions
{
$TS_CMD_PARTX -d --nr 0 $TS_DEVICE &&
echo "partitions deleted" ||
echo "Unable to delete partitions on $TS_DEVICE"
check_partition_count 0
$TS_CMD_PARTX -a --nr 0 $TS_DEVICE &&
echo "partitions added" ||
echo "Failed to add $TS_DEVICE partitions"
check_partition_count $PARTS
} >$TS_OUTPUT 2>&1
ts_finalize_subtest
ts_finalize