#!/bin/bash
cvmfs_test_name="shrinkwrap"
cvmfs_test_suites="quick"

CVMFS_TEST081_SHRINKWRAP_DEST=
CVMFS_TEST081_REPO=

cleanup() {
    echo "*** [Cleanup]"
    sudo rm -f $workdir/cvmfs-$CVMFS_TEST081_REPO.trace.log 2> /dev/null
    sudo rm -f $workdir/cvmfs-$CVMFS_TEST081_REPO.spec.txt  2> /dev/null

    sudo rm -rf $CVMFS_TEST081_SHRINKWRAP_DEST 2> /dev/null
    sudo rm -rf /var/lib/cvmfs/shrinkwrap 2> /dev/null
}

cvmfs_run_test() {
    logfile=$1
    local test_location=$2
    workdir=/tmp/cvmfs-test-081-shrinkwrap-workdir
    CVMFS_TEST081_SHRINKWRAP_DEST="$PWD/shrinkwrap-base"

    local repo="sft.cern.ch"
    CVMFS_TEST081_REPO=$repo
    tracelog=$workdir/cvmfs-$repo.trace.log
    echo "*** Setup..."
    cleanup
    trap cleanup HUP EXIT TERM INT || return 4
    # make sure cvmfs user can write logs to workdir
    mkdir -p $workdir
    sudo chmod a+rw $workdir

    echo "*** Mounting test repository..."
    cvmfs_mount $repo "GLITE_VERSION=util" \
      "CVMFS_CHECK_PERMISSIONS=no" \
      "CVMFS_TRACEFILE=$workdir/cvmfs-@fqrn@.trace.log" \
      "CVMFS_TRACEBUFFER=4096" \
      "CVMFS_TRACEBUFFER_THRESHOLD=2048"

    echo "Checking trace log creation..."
    sudo cvmfs_talk -i $repo tracebuffer flush > /dev/null

    if [ ! -f $tracelog ]; then
        echo "*** ERROR: Trace file was not created"
        return 2
    fi

    sudo truncate -s0 $tracelog

    echo "*** Executing a few operations to check tracing..."

    ls /cvmfs/sft.cern.ch/lcg/contrib/binutils/2.28/x86_64-centos7/
    cat /cvmfs/sft.cern.ch/lcg/contrib/binutils/2.28/x86_64-centos7/version.txt > /dev/null
    cat /cvmfs/sft.cern.ch/lcg/contrib/binutils/2.28/x86_64-centos7/lib/libopcodes.a > /dev/null
    cat /cvmfs/sft.cern.ch/lcg/contrib/binutils/2.28/x86_64-centos7/lib/libopcodes.la > /dev/null

    sudo cvmfs_talk -i $repo tracebuffer flush
    sudo cat $tracelog

    echo "*** Creating specification file..."
    sudo $CVMFS_SYS_PYTHON /usr/libexec/cvmfs/shrinkwrap/spec_builder.py \
      --policy=exact \
      --filters opendir lookup -- \
      $workdir/cvmfs-$repo.trace.log \
      $workdir/cvmfs-$repo.spec.txt
    [ $? -eq 0 ] || return 3
    cat $workdir/cvmfs-$repo.spec.txt
    echo

    echo "*** Creating shrinkwrapped repository..."
    echo "CVMFS_HTTP_PROXY=DIRECT" > $workdir/local.config
    sudo cvmfs_shrinkwrap --repo $repo \
      --src-config "$test_location/$repo.config:$workdir/local.config" \
      --spec-file $workdir/cvmfs-$repo.spec.txt \
      --dest-base $CVMFS_TEST081_SHRINKWRAP_DEST
    [ $? -eq 0 ] || return 4

    # This verifies the file exists, but was not part of the spec.
    # Used later to verify the creation and mount were successful.
    ls /cvmfs/sft.cern.ch/lcg/lastUpdate
    [ $? -eq 0 ] || return 5

    echo "*** Lookup shrinkwrapped files ($CVMFS_TEST081_SHRINKWRAP_DEST)..."
    ls -la $CVMFS_TEST081_SHRINKWRAP_DEST/$repo
    local nfiles=$(find $CVMFS_TEST081_SHRINKWRAP_DEST/$repo -type f | wc -l)
    # The 3 shrinkwrapped files plus the "do not modify" file
    if [ $nfiles -ne 4 ]; then
      find $CVMFS_TEST081_SHRINKWRAP_DEST/$repo -type f
      return 10
    fi
    sudo stat $CVMFS_TEST081_SHRINKWRAP_DEST/.data || return 11
    ls $CVMFS_TEST081_SHRINKWRAP_DEST/.provenance || return 12

    ls $CVMFS_TEST081_SHRINKWRAP_DEST/$repo/lcg/lastUpdate
    [ $? -ne 0 ] || return 20

    echo "*** Update destination..."
    echo | sudo tee -a $workdir/cvmfs-$repo.spec.txt
    echo "^/lcg/lastUpdate" | sudo tee -a $workdir/cvmfs-$repo.spec.txt
    sudo cvmfs_shrinkwrap --repo $repo \
      --src-config "$test_location/$repo.config:$workdir/local.config" \
      --spec-file $workdir/cvmfs-$repo.spec.txt \
      --dest-base $CVMFS_TEST081_SHRINKWRAP_DEST
    [ $? -eq 0 ] || return 30
    ls $CVMFS_TEST081_SHRINKWRAP_DEST/$repo/lcg/lastUpdate || return 31
    rm $workdir
    return 0
}
