blob: 46700a32e7cfd8a6505c40589c77044f7adf945a [file] [log] [blame]
#!/bin/bash
TS_TOPDIR="${0%/*}/../.."
TS_DESC="count file contents in core"
. $TS_TOPDIR/functions.sh
ts_init "$*"
ts_check_test_command "$TS_HELPER_SYSINFO"
# Send patch if you know how to keep it portable and robust. Thanks.
TS_KNOWN_FAIL="yes"
function header
{
echo "[" "$1" "]"
}
function footer
{
echo "return value: $1"
}
function make_input_name
{
header=$1
prefix=i_
echo ${prefix}$(sed -e "s/[^-+a-zA-Z0-9_]/_/g"<<<"$header")
}
function _dd
{
local msg
local ret=0
msg=$(dd "$@" 2>&1)
ret=$?
if [ $ret != 0 ]; then
echo "failed: dd $@" >&2
echo "$msg" >&2
fi
return $ret
}
function check_dd_fs_feat
{
local testf="$TS_OUTDIR/ddtest"
rm -f "$testf"
touch "$testf"
# NFS seems to fail for direct AND append
_dd if=/dev/zero of="$testf" bs=1k count=2 oflag=direct,append &>/dev/null \
|| ts_skip "unsupported: dd oflag=direct,append"
# TODO: Should we check for sparse file support?
rm -f "$testf"
}
function run_dd_test
{
header=$1
bs=$2
flags=$3
input=$(make_input_name "$header")
INPUT="${INPUT} ${input}"
rm -f "$input"
if [ "$bs" = 0 ]; then
touch $input
else
_dd if=/dev/zero of=$input count=1 bs=$bs $flags || return
fi
$TS_CMD_FINCORE --output $OUT_COLUMNS --bytes --noheadings $input
footer "$?"
}
function run_dd_dd_test
{
header=$1
flags0=$2
flags1=$3
bs=$PAGE_SIZE
input=$(make_input_name "$header")
INPUT="${INPUT} ${input}"
rm -f "$input"
_dd if=/dev/zero of=$input count=1 bs=$bs $flags0 || return
_dd if=/dev/zero of=$input count=1 bs=$bs $flags1 || return
$TS_CMD_FINCORE --output $OUT_COLUMNS --bytes --noheadings $input
footer "$?"
}
PAGE_SIZE=$($TS_HELPER_SYSINFO pagesize)
WINDOW_SIZE=$(( 32 * 1024 * PAGE_SIZE ))
# we use PAGE_SIZE dependent output for a few systems
if test -f "$TS_EXPECTED.$PAGE_SIZE"; then
TS_EXPECTED+=".$PAGE_SIZE"
OUT_COLUMNS="PAGES,SIZE,FILE"
else
TS_EXPECTED+=".nosize"
OUT_COLUMNS="PAGES,FILE"
fi
ts_check_test_command "$TS_CMD_FINCORE"
ts_cd "$TS_OUTDIR"
check_dd_fs_feat
INPUT=
input=
{
input=no_such_file
INPUT="${INPUT} ${input}"
header "NO EXCITING FILE"
$TS_CMD_FINCORE --output $OUT_COLUMNS --bytes --noheadings $input
footer "$?"
} >> $TS_OUTPUT 2>&1
{
run_dd_test "EMPTY FILE" 0
} >> $TS_OUTPUT 2>&1
{
run_dd_test "PAGESIZE -1 (incore)" $(( PAGE_SIZE - 1 ))
} >> $TS_OUTPUT 2>&1
{
run_dd_test "JUST PAGESIZE(incore)" $(( PAGE_SIZE ))
} >> $TS_OUTPUT 2>&1
{
run_dd_test "JUST PAGESIZE(directio)" $(( PAGE_SIZE )) "oflag=direct"
} >> $TS_OUTPUT 2>&1
{
run_dd_test "TWO PAGES(incore)" $(( 2 * PAGE_SIZE ))
} >> $TS_OUTPUT 2>&1
{
run_dd_test "TWO PAGES(directio)" $(( 2 * PAGE_SIZE )) "oflag=direct"
} >> $TS_OUTPUT 2>&1
{
run_dd_dd_test "TWO PAGES(mixed directio/incore)" \
oflag=direct \
"oflag=append seek=1"
} >> $TS_OUTPUT 2>&1
{
run_dd_dd_test "TWO PAGES(mixed incore/directio)" \
"" \
"oflag=direct,append seek=1"
} >> $TS_OUTPUT 2>&1
{
hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 2 ))
run_dd_dd_test "WINDOW SIZE(incore-sparse-incore)" \
"" \
"oflag=append seek=$hole_count"
} >> $TS_OUTPUT 2>&1
{
hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 2 ))
run_dd_dd_test "WINDOW SIZE(directio-sparse-directio)" \
"oflag=direct" \
"oflag=append,direct seek=$hole_count"
} >> $TS_OUTPUT 2>&1
{
hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 2 ))
run_dd_dd_test "WINDOW SIZE(incore-sparse-directio)" \
"" \
"oflag=append,direct seek=$hole_count"
} >> $TS_OUTPUT 2>&1
{
hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 2 ))
run_dd_dd_test "WINDOW SIZE(directio-sparse-incore)" \
"oflag=direct" \
"oflag=append seek=$hole_count"
} >> $TS_OUTPUT 2>&1
{
hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 1 ))
run_dd_dd_test "WINDOW SIZE + 1 page(incore-sparse-incore)" \
"" \
"oflag=append seek=$hole_count"
} >> $TS_OUTPUT 2>&1
{
hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 1 ))
run_dd_dd_test "WINDOW SIZE + 1 page(directio-sparse-directio)" \
"oflag=direct" \
"oflag=append,direct seek=$hole_count"
} >> $TS_OUTPUT 2>&1
{
hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 1 ))
run_dd_dd_test "WINDOW SIZE + 1 page(incore-sparse-directio)" \
"" \
"oflag=append,direct seek=$hole_count"
} >> $TS_OUTPUT 2>&1
{
hole_count=$(( WINDOW_SIZE / PAGE_SIZE - 1 ))
run_dd_dd_test "WINDOW SIZE + 1 page(directio-sparse-incore)" \
"oflag=direct" \
"oflag=append seek=$hole_count"
} >> $TS_OUTPUT 2>&1
{
header "MULTIPLE FILES"
$TS_CMD_FINCORE --output $OUT_COLUMNS --bytes $INPUT
footer "$?"
} >> $TS_OUTPUT 2>&1
rm -f $INPUT
ts_finalize