#!/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
