#!/bin/bash

#
# 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="resize"

. $TS_TOPDIR/functions.sh
ts_init "$*"

ts_check_test_command "$TS_CMD_SFDISK"
ts_check_test_command "$TS_CMD_WIPEFS"

ts_skip_nonroot

# set global variable TS_DEVICE
ts_scsi_debug_init dev_size_mb=100 sector_size=512

declare -a COMM
declare -a NAME

COMM[0]="3000,"
NAME[0]="move-up-absolute"

COMM[1]="2048,"
NAME[1]="move-down-absolute"

COMM[2]="+1M,"
NAME[2]="move-up-relative"

COMM[3]="-1M,"
NAME[3]="move-down-relative"

COMM[4]="-,15M"
NAME[4]="enlarge-absolute"

COMM[5]=",5M,"
NAME[5]="reduce-absolute"

COMM[6]=", +10M"
NAME[6]="enlarge-relative"

NAME[7]="reduce-relative"
COMM[7]=", -10M"

NAME[8]="enlarge-all"
COMM[8]=",+"

NAME[9]="up-preduce"
COMM[9]="+10M,-10M"

NAME[10]="down-enlarge"
COMM[10]="-10M,+10M,,*"

NAME[11]="absolute-move-resize"
COMM[11]="2048,10M,L"

function test_label_resize {
	local label="$1"

	$TS_CMD_WIPEFS -a ${TS_DEVICE} &> /dev/null
	udevadm settle

	# create a partition
	echo ',10M,L' | $TS_CMD_SFDISK --no-reread --label ${label} ${TS_DEVICE} &> /dev/null
	udevadm settle

	for idx in $(seq 0 $(( ${#COMM[*]} - 1 ))); do

		cmd=${COMM[$idx]}
		name=${NAME[$idx]}

		ts_init_subtest "$label-$idx-$name"
		echo -e "$cmd\n" >> $TS_OUTPUT
		echo "$cmd" | $TS_CMD_SFDISK --no-reread -N1 ${TS_DEVICE} >> $TS_OUTPUT 2>&1
		ts_fdisk_clean $TS_DEVICE
		udevadm settle
		ts_finalize_subtest
	done

	echo ',10M,L' | $TS_CMD_SFDISK --no-reread --append ${TS_DEVICE} &> /dev/null
	udevadm settle

	echo ',10M,L' | $TS_CMD_SFDISK --no-reread --append ${TS_DEVICE} &> /dev/null
	udevadm settle

	idx=$(( $idx + 1 ))
	ts_init_subtest "$label-$idx-reduce-midle"
	cmd=',-5M'
	echo -e "$cmd\n" >> $TS_OUTPUT
	echo "$cmd" | $TS_CMD_SFDISK --no-reread -N2 ${TS_DEVICE} >> $TS_OUTPUT 2>&1
	ts_fdisk_clean $TS_DEVICE
	udevadm settle
	ts_finalize_subtest

	idx=$(( $idx + 1 ))
	ts_init_subtest "$label-$idx-max-last"
	cmd='-5M,+'
	echo -e "$cmd\n" >> $TS_OUTPUT
	echo $cmd | $TS_CMD_SFDISK --no-reread -N3 ${TS_DEVICE} >> $TS_OUTPUT 2>&1
	ts_fdisk_clean $TS_DEVICE
	udevadm settle
	ts_finalize_subtest
}

# MBR
test_label_resize dos

# GPT
test_label_resize gpt


$TS_CMD_WIPEFS -a ${TS_DEVICE} &> /dev/null
udevadm settle

ts_init_subtest "dos-unsorted"
# create layout where partition #4 is the last on disk (by offset)
# and there is freespace at the end of the disk. Note that #4 is not the last
# partno on the disk. The libfdisk has to be able to check for the free space
# independently on the partno, only offset+size matters.
$TS_CMD_SFDISK --no-reread ${TS_DEVICE}  >> $TS_OUTPUT 2>&1 <<EOF
label: dos
label-id: 0xda2e45ac
device: ${TS_DEVICE}
unit: sectors

${TS_DEVICE}1 : start=        2048, size=        2048, type=83
${TS_DEVICE}2 : start=        4096, size=        2048, type=83
${TS_DEVICE}3 : start=        6144, size=      102400, type=5
${TS_DEVICE}4 : start=      108544, size=        2048, type=83
${TS_DEVICE}5 : start=        8192, size=        2048, type=83
${TS_DEVICE}6 : start=       12288, size=       96256, type=83
EOF
udevadm settle
# enlarge to use all space behind partition #4
echo ',+,' | $TS_CMD_SFDISK --no-reread -N 4 ${TS_DEVICE} >> $TS_OUTPUT 2>&1
ts_fdisk_clean $TS_DEVICE
udevadm settle
ts_finalize_subtest

ts_finalize
