cvmfs_test_name="Repository gateway nested catalogs"
cvmfs_test_autofs_on_startup=false
cvmfs_test_suites="quick"

# This test covers the creation and deletion of nested catalogs when the repository
# upstream is of type GW

clean_up() {
    echo "Cleaning up"

    echo "  Removing output directories"
    rm -rvf /tmp/cvmfs_out_{1,2,3}
}

check_status() {
    echo $(( $1 || 0 ))
}

compare_file_checksum() {
    local file_name=$1
    local target_checksum=$2
    local checksum=$(md5sum $file_name | cut -d' ' -f1)
    echo "Checksum of $file_name is $checksum"
    if [ "$checksum" != "$target_checksum" ]; then
        echo "Checksum mismatch for $file_name. Expected $target_checksum. Found $checksum"
        return 1
    fi
}

save_repo_contents() {
    local dest=$1
    rm -rf $dest
    mkdir -p $dest
    cp -r /cvmfs/test.repo.org/* $dest/
}

run_transactions() {
    set_up_repository_gateway

    echo "Checking transaction + publish"

    ## Transaction 1
    echo "  Starting transaction 1 (Creating a deep directory tree which is assigned to a sub-catalog)"
    cvmfs_server transaction test.repo.org

    echo "  Create a deep directory hierarchy"
    mkdir -p /cvmfs/test.repo.org/a
    echo "New file" > /cvmfs/test.repo.org/a/b
    touch /cvmfs/test.repo.org/a/.cvmfscatalog

    echo "  Publishing changes 1"
    cvmfs_server publish -v test.repo.org
    cvmfs_server check test.repo.org

    echo "  Copy the contents of the repository"
    save_repo_contents /tmp/cvmfs_out_1

    echo "  Checking results 1"
    compare_file_checksum /tmp/cvmfs_out_1/a/b f1885b1a57c71cacbd923fc5e9aefef3
    if [ x"$(cvmfs_server check test.repo.org | grep /a)" = x"" ]; then
        echo "Nested catalog not created at /a"
        return 1
    else
        echo "Nested catalog was successfully created at /a"
    fi

    ## Transaction 2
    echo "  Starting transaction 2 (Replace a file with a directory tree, which is assigned to a sub-catalog)"
    cvmfs_server transaction test.repo.org

    echo "  Create a deep directory hierarchy"
    rm -v /cvmfs/test.repo.org/a/b
    mkdir -p /cvmfs/test.repo.org/a/b
    echo "New file" > /cvmfs/test.repo.org/a/b/new_file.txt
    touch /cvmfs/test.repo.org/a/b/.cvmfscatalog

    echo "  Publishing changes 2"
    cvmfs_server publish -v test.repo.org
    cvmfs_server check test.repo.org

    echo "  Copy the contents of the repository"
    save_repo_contents /tmp/cvmfs_out_2

    echo "  Checking results 2"
    compare_file_checksum /tmp/cvmfs_out_2/a/b/new_file.txt f1885b1a57c71cacbd923fc5e9aefef3
    if [ x"$(cvmfs_server check test.repo.org | grep /a/b)" = x"" ]; then
        echo "Nested catalog not created at /a/b"
        return 1
    else
        echo "Nested catalog was successfully created at /a/b"
    fi

    ## Transaction 3
    echo "  Starting transaction 3 (Remove nested catalogs)"
    cvmfs_server transaction test.repo.org

    echo "  Remove all the nested catalogs and have their contents merged into the root catalog"
    rm -v /cvmfs/test.repo.org/a/.cvmfscatalog
    rm -v /cvmfs/test.repo.org/a/b/.cvmfscatalog

    echo "  Publishing changes 3"
    cvmfs_server publish -v test.repo.org
    cvmfs_server check test.repo.org

    echo "  Copy the contents of the repository"
    save_repo_contents /tmp/cvmfs_out_3

    echo "  Checking results 3"
    compare_file_checksum /tmp/cvmfs_out_1/a/b f1885b1a57c71cacbd923fc5e9aefef3
    compare_file_checksum /tmp/cvmfs_out_2/a/b/new_file.txt f1885b1a57c71cacbd923fc5e9aefef3
    if [ x"$(cvmfs_server check test.repo.org | grep /a)" != x"" ]; then
        echo "Nested catalog at /a should have been removed"
        return 1
    else
        echo "Nested catalog at /a was successfully removed"
    fi
    if [ x"$(cvmfs_server check test.repo.org | grep /a/b)" != x"" ]; then
        echo "Nested catalog at /a/b should have been removed"
        return 1
    else
        echo "Nested catalog at /a/b was successfully removed"
    fi

    ## Transaction 4
    echo "  Starting transaction 4 (Create nested catalogs with .cvmfsdirtab)"
    cvmfs_server transaction test.repo.org

    echo "  Add .cvmfsdirtab file"
    echo "/dir1" >> /cvmfs/test.repo.org/.cvmfsdirtab
    echo "/dir2" >> /cvmfs/test.repo.org/.cvmfsdirtab

    echo "  Creating some files in the repository"
    mkdir -p /cvmfs/test.repo.org/dir{1,2}
    echo "New file" > /cvmfs/test.repo.org/dir1/a.txt
    echo "New file" > /cvmfs/test.repo.org/dir2/b.txt

    echo "  Publishing changes 4"
    cvmfs_server publish test.repo.org
    cvmfs_server check test.repo.org

    echo "  Checking results 4"
    if [ x"$(cvmfs_server check test.repo.org | grep /dir1)" = x"" ]; then
        echo "Nested catalog at /dir1 should have been created from .cvmfsdirtab"
        return 1
    else
        echo "Nested catalog at /dir1 was successfully created from .cvmfsdirtab"
    fi
    if [ x"$(cvmfs_server check test.repo.org | grep /dir2)" = x"" ]; then
        echo "Nested catalog at /dir2 should have been created from .cvmfsdirtab"
        return 1
    else
        echo "Nested catalog at /dir2 was successfully created from .cvmfsdirtab"
    fi

    ## Transaction 5
    echo "  Starting transaction 5 (Remove .cvmfsdirtab)"
    cvmfs_server transaction test.repo.org

    echo "  Remove .cvmfsdirtab and .cvmfscatalog files"
    rm -f /cvmfs/test.repo.org/.cvmfsdirtab
    rm -f /cvmfs/test.repo.org/dir1/.cvmfscatalog
    rm -f /cvmfs/test.repo.org/dir2/.cvmfscatalog

    echo "  Publishing changes 5"
    cvmfs_server publish test.repo.org
    cvmfs_server check test.repo.org

    echo "  Checking results 5"
    compare_file_checksum /cvmfs/test.repo.org/dir1/a.txt f1885b1a57c71cacbd923fc5e9aefef3
    compare_file_checksum /cvmfs/test.repo.org/dir2/b.txt f1885b1a57c71cacbd923fc5e9aefef3
    if [ x"$(cvmfs_server check test.repo.org | grep /dir1)" != x"" ]; then
        echo "Nested catalog at /dir1 should have been removed"
        return 1
    else
        echo "Nested catalog at /dir1 was successfully removed"
    fi
    if [ x"$(cvmfs_server check test.repo.org | grep /dir2)" != x"" ]; then
        echo "Nested catalog at /dir2 should have been removed"
        return 1
    else
        echo "Nested catalog at /dir2 was successfully removed"
    fi

    clean_up
}

cvmfs_run_test() {
    trap clean_up EXIT HUP INT TERM || return $?

    run_transactions
    local status=$?

    return $(check_status $status)
}


