GEO_REP_TIMEOUT=60

function check_status_num_rows()
{
    local search_key=$1
    $GEOREP_CLI $master $slave status detail | egrep -i "$search_key" | wc -l
}

function create_data()
{
    prefix=$1

    # GF_FOP_MKNOD
    # GF_FOP_MKDIR
    # GF_FOP_UNLINK
    # GF_FOP_RMDIR
    # GF_FOP_SYMLINK
    # GF_FOP_RENAME
    # GF_FOP_LINK
    # GF_FOP_SETXATTR
    # GF_FOP_REMOVEXATTR
    # GF_FOP_CREATE
    # GF_FOP_SETATTR

    # Regular file
    touch ${master_mnt}/${prefix}_f1
    touch ${master_mnt}/${prefix}_f2
    touch ${master_mnt}/${prefix}_f3

    # dir
    mkdir ${master_mnt}/${prefix}_d1
    mkdir ${master_mnt}/${prefix}_d2
    touch ${master_mnt}/${prefix}_d3

    # Hardlink
    ln ${master_mnt}/${prefix}_f1 ${master_mnt}/${prefix}_hl1

    # Symlink
    cd ${master_mnt}
    ln -s ${prefix}_f1 ${prefix}_sl1
    cd -

    # data
    echo "HelloWorld!" >> ${master_mnt}/${prefix}_f1

    # UNLINK
    rm ${master_mnt}/${prefix}_f2

    # RMDIR
    rmdir ${master_mnt}/${prefix}_d2

    # Rename - File
    mv ${master_mnt}/${prefix}_f3 ${master_mnt}/${prefix}_f4

    # Rename - Dir
    mv ${master_mnt}/${prefix}_d3 ${master_mnt}/${prefix}_d4

    # chown
    touch ${master_mnt}/${prefix}_chown_f1
    chown 1000:1000 ${master_mnt}/${prefix}_chown_f1
}

function chown_file_ok()
{
    local file_owner=$(stat --format "%u:%g" "$1")
    if test "X$file_owner" != "X1000:1000"; then echo 1; else echo 0; fi
}

function regular_file_ok()
{
    local file_type=$(stat --format "%F" "$1")
    if test "X$file_type" != "Xregular file"; then echo 1; else echo 0; fi
}

function directory_ok()
{
    file_type=$(stat --format "%F" "$1")
    if test "X$file_type" != "Xdirectory"; then echo 1; else echo 0; fi
}

function unlink_ok()
{
    stat "$1" > /dev/null 2>&1
    rc=$?
    echo $rc
}

function hardlink_file_ok()
{
    orig_file=$1
    link_file=$2

    orig_inode=$(stat --format "%i" "$orig_file")
    rc=$?
    if test $rc != 0; then echo $rc; fi

    link_inode=$(stat --format "%i" "$link_file")
    rc=$?
    if test $rc != 0; then echo $rc; fi

    if test $orig_inode != $link_inode
    then
        echo 1
    else
        echo 0
    fi
}

function data_ok()
{
    path=$1
    data1="$2"
    data2=$(cat $path)
    echo "data1:$data1"
    echo "data2:$data2"
    if test "X$data1" != "X$data2"
    then
        echo 1
    else
        echo 0
    fi
}

function arequal_checksum()
{
    master=$1
    slave=$2
    diff <(arequal-checksum -p $master) <(arequal-checksum -p $slave) | wc -l
}

function symlink_ok()
{
    local orig_file_name=$1
    local symlink_file=$2

    local file_type=$(stat --format "%F" "$symlink_file")
    if test "X$file_type" != "Xsymbolic link"; then echo 1;else echo 0; fi

    local fname=$(readlink $symlink_file)
    if test "X$fname" != "X$orig_file_name"; then echo 1;else echo 0; fi
}

function rename_ok()
{
    old_name=$1
    new_name=$2

    if [ -f $old_name ]
    then
        echo 1
    fi

    if [ ! -f $new_name ]
    then
        echo 1
    fi
    echo 0
}

function create_georep_session()
{
    $CLI system:: execute gsec_create
    rc=$?
    if test $rc != 0; then echo $rc; fi
    $CLI volume geo-rep $master $slave create push-pem
    rc=$?
    if test $rc != 0; then echo $rc; fi
    echo 0
}

# logrotate_simulate should be called (rotate_count + 1) times to cause
# an unlink and a gfid re-allocation.
# remember to keep the file name and rotate_count the same across the
# calls
function logrotate_simulate()
{
    file_name=$1
    declare -i rotate_count=$2

    while [ $rotate_count -ge 0 ]; do
        source_file="$file_name.$((rotate_count))"
        if [ $rotate_count -eq 0 ]; then
            source_file="$file_name"
        fi
        if [ -f "${source_file}" ]; then
                mv "${source_file}" "$file_name.$((rotate_count+1))"
        fi
        ((rotate_count--))
    done

    # logrotate causes gfid to be rellocated to a new file created
    # after an unlink and a blind rename later causes georep session
    # to go Faulty
    # this should not happen if source basename on slave is tested
    # to be linked with its own gfid as on master, before invoking
    # the rename syscall
    touch $file_name
    rotate_count=$2
    unlink_file_name="$file_name.$((rotate_count+1))"
    unlink $unlink_file_name 2>/dev/null
}

function create_rename()
{
    file_name=$1
    echo $file_name > $file_name
    mv $file_name $file_name.bak
}

function create_rename_ok()
{
    file_name=$1
    # after a log replay, we don't expect the original file
    # to be recreated i.e. a dangling entry without a corresponding
    # back-end gfid link should not exist on the slave
    if [ -f "$file_name" ]; then
            echo 1
    fi
    echo 0
}

function hardlink_rename()
{
    file_name=$1
    echo $file_name > $file_name
    ln $file_name $file_name.hl
    mv $file_name.hl $file_name
}

function hardlink_rename_ok()
{
    file_name=$1
    # the hardlink file should not exist on the slave after renaming
    # to one of its links
    if [ -f "$file_name.hl" ]; then
            echo 1
    fi
    echo 0
}
