#!/bin/sh
#
# Testcase for nand2bin and bin2nand. Generate testdata and inject
# biterrors. Convert data back and compare with original data.
#
# Conversion:
#    bin -> bin2nand -> mif -> nand2bin -> img
#

inject_biterror=./scripts/inject_biterror.pl

pagesize=2048
oobsize=64

# Create test data
dd if=/dev/urandom of=testblock.bin bs=131072 count=1

echo "Test conversion without bitflips ..."

echo -n "Convert bin to mif ... "
bin2nand --pagesize=${pagesize} -o testblock.mif testblock.bin
if [ $? -ne "0" ]; then
    echo "failed!"
    exit 1
else
    echo "ok"
fi

echo -n "Convert mif to bin ... "
nand2bin --pagesize=${pagesize} -o testblock.img testblock.mif
if [ $? -ne "0" ]; then
    echo "failed!"
    exit 1
else
    echo "ok"
fi

echo -n "Comparing data ... "
diff testblock.bin testblock.img
if [ $? -ne "0" ]; then
    echo "failed!"
    exit 1
else
    echo "ok"
fi

echo "Test conversion with uncorrectable ECC erors ..."
echo -n "Inject biterror at offset $ioffs ... "
${inject_biterror} --offset=0 --bitmask=0x81 \
    --input=testblock.mif \
    --output=testblock_bitflip.mif
if [ $? -ne "0" ]; then
    echo "failed!"
    exit 1
else
    echo "ok"
fi

echo "Convert mif to bin ... "
rm testblock.img
nand2bin --correct-ecc --pagesize=${pagesize} -o testblock.img \
    testblock_bitflip.mif
if [ $? -ne "0" ]; then
    echo "failed!"
    exit 1
else
    echo "ok"
fi

echo -n "Comparing data, must fail due to uncorrectable ECC ... "
diff testblock.bin testblock.img
if [ $? -ne "0" ]; then
    echo "ok" # Must fail!
else
    echo "failed!"
    exit 1
fi

echo "Test bitflips in data ... "
for offs in `seq 0 255` ; do

    cp testblock.mif testblock_bitflip.mif

    for xoffs in 0 256 512 768 ; do
	let ioffs=$offs+$xoffs

	cp testblock_bitflip.mif testblock_bitflip_tmp.mif
	echo -n "Inject biterror at offset $ioffs ... "
	${inject_biterror} --offset=${ioffs} --bitmask=0x01 \
	    --input=testblock_bitflip_tmp.mif \
	    --output=testblock_bitflip.mif
	if [ $? -ne "0" ]; then
	    echo "failed!"
	    exit 1
	else
	    echo "ok"
	fi
    done

    echo "Convert mif to bin ... "
    rm testblock.img
    nand2bin --correct-ecc --pagesize=${pagesize} -o testblock.img \
	testblock_bitflip.mif
    if [ $? -ne "0" ]; then
	echo "failed!"
	exit 1
    else
	echo "ok"
    fi

    echo -n "Comparing data ... "
    diff testblock.bin testblock.img
    if [ $? -ne "0" ]; then
	hexdump testblock.bin > testblock.bin.txt
	hexdump testblock.img > testblock.img.txt
	echo "Use tkdiff testblock.bin.txt testblock.img.txt to compare"
	echo "failed!"
	exit 1
    else
	echo "ok"
    fi

    # Without correction
    echo "Convert mif to bin ... "
    rm testblock.img
    nand2bin --pagesize=${pagesize} -o testblock.img \
	testblock_bitflip.mif
    if [ $? -ne "0" ]; then
	echo "failed!"
	exit 1
    else
	echo "ok"
    fi

    echo -n "Comparing data must differ, correction is disabled ... "
    diff testblock.bin testblock.img
    if [ $? -ne "0" ]; then
	echo "ok" # must fail
    else
	echo "failed!"
	exit 1
    fi
done

echo "Test bitflips in OOB data ... "
for offs in `seq 0 $oobsize` ; do

    let ioffs=$pagesize+$offs

    echo -n "Inject biterror at offset $ioffs ... "
    ${inject_biterror} --offset=${ioffs} --bitmask=0x01 \
	--input=testblock.mif \
	--output=testblock_bitflip.mif
    if [ $? -ne "0" ]; then
	echo "failed!"
	exit 1
    else
	echo "ok"
    fi

    echo "Convert mif to bin ... "
    rm testblock.img
    nand2bin --correct-ecc --pagesize=${pagesize} -o testblock.img \
	testblock_bitflip.mif
    if [ $? -ne "0" ]; then
	echo "failed!"
	exit 1
    else
	echo "ok"
    fi

    echo -n "Comparing data ... "
    diff testblock.bin testblock.img
    if [ $? -ne "0" ]; then
	hexdump testblock.bin > testblock.bin.txt
	hexdump testblock.img > testblock.img.txt
	echo "Use tkdiff testblock.bin.txt testblock.img.txt to compare"
	echo "failed!"
	exit 1
    else
	echo "ok"
    fi
done