#! /usr/bin/env bash

# Usage: test.sh [test-options] [bpkg-common-options]
#
# Test options are:
#
# -v
#    Run verbose. By default, this script runs bpkg quiet and suppresses
#    error messages in the fail tests. Note that when this options is
#    specified, bpkg is called with default verbosity level. If you want
#    more bpkg diagnostics, add the --verbose N option.
#
# --remote
#    Test using the remote repositories. Normally, you would first run the
#    local test in order to create the repositories, then publish them (see
#    pkg/publish.sh), and finally run the remote test.
#
# -c <compiler>
#    Use the compiler specified to configure cxx module.
#
# --valgrind
#    Run under valgrind (takes forever).
#
# Some common bpkg use-cases worth testing:
#
# --fetch wget
# --fetch curl
# --fetch fetch --fetch-option --no-verify-peer
#
# --tar bsdtar
#
# --sha256 shasum
# --sha256 sha256-freebsd
#

trap 'exit 1' ERR

tmp_file=`mktemp`

# Remove temporary file on exit. Cover the case when exit due to an error.
#
trap 'rm -f $tmp_file' EXIT

function error ()
{
  echo "$*" 1>&2
  exit 1
}

bpkg="../bpkg/bpkg"
cfg=/tmp/conf

if [ "${MSYSTEM:0:5}" = "MINGW" -o "${MSYSTEM:0:4}" = "MSYS" ]; then
  msys=y
fi

verbose=n
remote=n
options=
cxx_options=

while [ $# -gt 0 ]; do
  case $1 in
    -v)
      verbose=y
      shift
      ;;
    --remote)
      remote=y
      shift
      ;;
    --valgrind)
      bpkg="valgrind -q $bpkg"
      shift
      ;;
    -c)
      shift
      cxx_options="config.cxx=$1"
      shift
      ;;
    *)
      # If this is the --verbose bpkg option, switch to the verbose
      # mode as well.
      #
      if [ "$1" == "--verbose" ]; then
        verbose=y
      fi

      options="$options $1"
      shift
      ;;
  esac
done

if [ "$verbose" != "y" ]; then
  options="$options -q"
fi

bpkg="$bpkg $options"

# Repository location and name prefixes. Note that the local path is carefully
# crafted so that we end up with the same repository names in both cases. This
# is necessary for the authentication tests to work in both cases.
#
if [ "$remote" = "y" ]; then
  rep=https://build2.org/bpkg/1
  repn=build2.org/
else
  rep=pkg/1/build2.org
  repn=build2.org/
fi

#
#
function test ()
{
  local cmd=$1; shift
  local ops=

  if [ "$cmd" != "rep-create" -a \
       "$cmd" != "rep-info" -a   \
       "$cmd" != "pkg-verify" ]; then
    ops="-d $cfg"
  fi

  if [ "$cmd" = "rep-fetch" -o \
       "$cmd" = "rep-info" ]; then
    ops="$ops --auth all"
  fi

  if [ -t 0 ]; then
    $bpkg $cmd $ops $*
  else
    $bpkg $cmd $ops $* >$tmp_file
    diff --strip-trailing-cr -u - $tmp_file
  fi

  if [ $? -ne 0 ]; then
    error "failed: $bpkg $cmd $ops $*"
  fi
}

function fail ()
{
  local cmd=$1; shift
  local ops=

  if [ "$cmd" != "rep-create" -a \
       "$cmd" != "rep-info" -a   \
       "$cmd" != "pkg-verify" ]; then
    ops="-d $cfg"
  fi

  if [ "$cmd" = "rep-fetch" -o \
       "$cmd" = "rep-info" ]; then
    ops="$ops --auth all"
  fi

  if [ "$verbose" = "y" ]; then
    $bpkg $cmd $ops $*
  else
    $bpkg $cmd $ops $* 2>/dev/null
  fi

  if [ $? -eq 0 ]; then
    error "succeeded: $bpkg $cmd $ops $*"
  fi

  return 0
}

# Verify package status.
#
function stat ()
{
  local s=`$bpkg pkg-status -d $cfg $1`

  if [ "$s" != "$2" ]; then
    error "status $1: '"$s"', expected: '"$2"'"
  fi
}

# Verify path is gone (no longer exists)
#
function gone ()
{
  if [ -e "$1" ]; then
    error "path $1 still exists"
  fi
}

#if false; then

# Repository certificate fingerprint.
#
function rep_cert_fp ()
{
  cat $1/repositories | \
  sed -n '/^-----BEGIN CERTIFICATE-----$/,/^-----END CERTIFICATE-----$/p' | \
  openssl x509 -sha256 -noout -fingerprint | \
  sed -n 's/^SHA256 Fingerprint=\(.*\)$/\1/p'
}

# Edit file with sed.
#
function edit ()
{
  local path=$1; shift
  sed "$@" $path > $path.bak
  mv $path.bak $path
}

# Repository absolute location from a relative path.
#
function location ()
{
  if [ "$remote" = "y" ]; then
    echo "$rep/$1"
  elif [ "$msys" = "y" ]; then
    # Convert Windows path like c:/abc/xyz to the c:\abc\xyz canonical form.
    #
    echo "`pwd -W`/$rep/$1" | sed 's%/%\\%g'
  else
    echo "`pwd`/$rep/$1"
  fi
}

##
## Low-level commands.
##


##
## pkg-verify
##
fail pkg-verify                 # archive expected
fail pkg-verify ./no-such-file  # archive does not exist
fail pkg-verify pkg/1/build2.org/common/not-a-package.tar.gz
fail pkg-verify --silent pkg/1/build2.org/common/not-a-package.tar.gz
test pkg-verify pkg/1/build2.org/common/hello/libhello-1.0.0+1.tar.gz


##
## rep-create
##
fail rep-create                          # no 'repositories' file
fail rep-create pkg/1/build2.org/satisfy # unexpected files

test rep-create pkg/1/build2.org/common/hello --key key.pem

test rep-create pkg/1/build2.org/common/foo/stable
test rep-create pkg/1/build2.org/common/foo/testing

test rep-create pkg/1/build2.org/common/bar/stable
test rep-create pkg/1/build2.org/common/bar/testing
test rep-create pkg/1/build2.org/common/bar/unstable


##
## rep-info
##
fail rep-info # repository location expected

test rep-info --trust-yes $rep/common/foo/testing <<EOF
${repn}common/foo/testing `location common/foo/testing`
complement ${repn}common/foo/stable `location common/foo/stable`
libfoo 1.1.0
EOF

test rep-info -m -r -n --trust-yes $rep/common/bar/unstable <<EOF
${repn}common/bar/unstable `location common/bar/unstable`
: 1
location: ../../foo/testing
:
location: ../testing
role: complement
:
EOF

test rep-info -m -p --trust-yes $rep/common/bar/unstable <<EOF
: 1
sha256sum: 3034b727288efbb52b7b6e41fe147b815e7b3aa704e8cef6c2ee8d7421ab5b72
:
name: libbar
version: 1.1.1
summary: libbar
license: MIT
description: \\
libbar is a very modern C++ XML parser.

It has an API that we believe should have already been in Boost or even in
the C++ standard library.

\\
changes: \\
* Applied upstream patch for critical bug bar.

* Applied upstream patch for critical bug foo.

\\
url: http://example.org
email: pkg@example.org
depends: libfoo >= 1.1.0
location: libbar-1.1.1.tar.gz
sha256sum: d09700602ff78ae405b6d4850e34660e939d27676e015a23b549884497c8bb45
EOF

hello_fp=`rep_cert_fp pkg/1/build2.org/common/hello`

test rep-info -m -p --trust $hello_fp $rep/common/hello <<EOF
: 1
sha256sum: 8d324fa7911038778b215d28805c6546e737e0092f79f7bd167cf2e28f4ad96f
:
name: libhello
version: 1.0.0+1
summary: The "Hello World" example library
license: MIT
tags: c++, hello, world, example
description: \\
A simple library that implements the "Hello World" example in C++. Its primary
goal is to show a canonical build2/bpkg project/package.
\\
url: http://www.example.org/libhello
email: hello-users@example.org
requires: c++11
location: libhello-1.0.0+1.tar.gz
sha256sum: ff68e5269b5f594996a016ba2789f646cf5753e8baa0e9b4b77c4c4b81c41326
EOF

##
## cfg-create
##
test cfg-create --wipe cxx $cxx_options config.install.root=/tmp/install
stat libfoo unknown

test cfg-create --wipe config.install.root=/tmp/install cxx $cxx_options
stat libfoo unknown


##
## rep-add
##
test cfg-create --wipe

fail rep-add         # repository location expected
fail rep-add stable  # invalid location
fail rep-add http:// # invalid location

# relative path
#
test rep-add ./1/bar/stable
fail rep-add ./1/../1/bar/stable # duplicate

# absolute path
#
test rep-add /tmp/1/foo/stable
fail rep-add /tmp/1/../1/foo/stable # duplicate

# remote URL
#
test rep-add http://pkg.example.org/1/testing
fail rep-add https://www.example.org/1/testing # duplicate


##
## rep-fetch
##
test cfg-create --wipe

fail rep-fetch # no repositories

# hello repository
#
test cfg-create --wipe
test rep-add $rep/common/hello
test rep-fetch --trust $hello_fp
test rep-fetch

# bar/unstable repository
#
test cfg-create --wipe
test rep-add $rep/common/bar/unstable
test rep-fetch --trust-yes
test rep-fetch

# both
#
test cfg-create --wipe
test rep-add $rep/common/hello
test rep-add $rep/common/bar/unstable
test rep-fetch --trust-yes
test rep-fetch


##
## pkg-fetch
##
test rep-create pkg/1/build2.org/fetch/t1
test cfg-create --wipe

fail pkg-fetch -e                # archive expected
fail pkg-fetch -e ./no-such-file # archive does not exist

fail pkg-fetch                   # package name expected
fail pkg-fetch libfoo            # package version expected
fail pkg-fetch libfoo/1/2/3      # invalid package version

fail pkg-fetch libfoo/1.0.0      # no repositories
test rep-add $rep/fetch/t1
fail pkg-fetch libfoo/1.0.0      # no packages
test rep-fetch --trust-yes
fail pkg-fetch libfoo/2+1.0.0    # not available
test cfg-create --wipe
test rep-add $rep/fetch/t1
test rep-fetch --trust-yes
test pkg-fetch libfoo/1.0.0
stat libfoo/1.0.0 fetched
fail pkg-fetch libfoo/1.0.0
fail pkg-fetch -e pkg/1/build2.org/fetch/libfoo-1.0.0.tar.gz
test pkg-purge libfoo
test pkg-fetch -e pkg/1/build2.org/fetch/libfoo-1.0.0.tar.gz
stat libfoo/1.0.0 fetched
test pkg-unpack libfoo
test pkg-fetch -r libfoo/1.1.0
stat libfoo/1.1.0 fetched
test pkg-unpack libfoo
test pkg-fetch -r -e pkg/1/build2.org/fetch/libfoo-1.0.0.tar.gz
stat libfoo/1.0.0 fetched
test pkg-fetch -r libfoo/1.1.0
stat libfoo/1.1.0 fetched
test pkg-fetch -r -e pkg/1/build2.org/fetch/libfoo-1.0.0.tar.gz
stat libfoo/1.0.0 fetched
test pkg-purge libfoo

# hello
#
test cfg-create --wipe
test rep-add $rep/common/hello
test rep-fetch --trust $hello_fp
test pkg-fetch libhello/1.0.0+1
test pkg-purge libhello


##
## pkg-unpack
##
test cfg-create --wipe
fail pkg-unpack -r # replace only with existing
fail pkg-unpack -e # package directory expected
fail pkg-unpack    # package name expected

test rep-add $rep/fetch/t1
test rep-fetch --trust-yes

# existing
#
fail pkg-unpack -e ./no-such-dir # package directory does not exist
fail pkg-unpack -e ./pkg         # not a package directory
test pkg-fetch libfoo/1.0.0
fail pkg-unpack -e pkg/1/build2.org/fetch/libfoo-1.1.0 # already exists
test pkg-purge libfoo
test pkg-unpack -e pkg/1/build2.org/fetch/libfoo-1.1.0
stat libfoo/1.1.0 unpacked
test pkg-purge libfoo

# existing & replace
#
test pkg-fetch libfoo/1.0.0
fail pkg-unpack -e pkg/1/build2.org/fetch/libfoo-1.1.0
test pkg-unpack -r -e pkg/1/build2.org/fetch/libfoo-1.1.0
stat libfoo/1.1.0 unpacked
test pkg-purge libfoo
test pkg-fetch libfoo/1.0.0
test pkg-unpack libfoo
fail pkg-unpack -e pkg/1/build2.org/fetch/libfoo-1.1.0
test pkg-unpack -r -e pkg/1/build2.org/fetch/libfoo-1.1.0
stat libfoo/1.1.0 unpacked
test pkg-purge libfoo

# package name
#
fail pkg-unpack libfoo # no such package in configuration
test pkg-unpack -e pkg/1/build2.org/fetch/libfoo-1.1.0
fail pkg-unpack libfoo # wrong package state
test pkg-purge libfoo
test pkg-fetch libfoo/1.0.0
stat libfoo/1.0.0 fetched
test pkg-unpack libfoo
stat libfoo/1.0.0 unpacked
test pkg-purge libfoo

# hello
#
test cfg-create --wipe
test rep-add $rep/common/hello
test rep-fetch --trust $hello_fp
test pkg-fetch libhello/1.0.0+1
test pkg-unpack libhello
test pkg-purge libhello


##
## pkg-purge
##
test cfg-create --wipe

fail pkg-purge         # missing package name
fail pkg-purge libfoo  # no such package

# purge fetched
#
test pkg-fetch -e pkg/1/build2.org/fetch/libfoo-1.0.0.tar.gz
test pkg-purge libfoo
stat libfoo unknown

# --keep
#
test pkg-fetch -e pkg/1/build2.org/fetch/libfoo-1.0.0.tar.gz
test pkg-purge -k libfoo
stat libfoo "fetched 1.0.0"
test pkg-purge libfoo

# archive and --purge
#
cp pkg/1/build2.org/fetch/libfoo-1.0.0.tar.gz $cfg/
test pkg-fetch -e -p $cfg/libfoo-1.0.0.tar.gz
test pkg-purge libfoo
stat libfoo unknown
gone $cfg/libfoo-1.0.0.tar.gz

# no archive but --keep
#
test pkg-unpack -e pkg/1/build2.org/fetch/libfoo-1.1.0
fail pkg-purge --keep libfoo
stat libfoo "unpacked 1.1.0"
test pkg-purge libfoo

# purge unpacked directory
#
test pkg-unpack -e pkg/1/build2.org/fetch/libfoo-1.1.0
test pkg-purge libfoo
stat libfoo unknown

# purge unpacked archive
#
test pkg-fetch -e pkg/1/build2.org/fetch/libfoo-1.0.0.tar.gz
test pkg-unpack libfoo
test pkg-purge libfoo
stat libfoo unknown
gone $cfg/libfoo-1.0.0

# purge unpacked archive but --keep
#
test pkg-fetch -e pkg/1/build2.org/fetch/libfoo-1.0.0.tar.gz
test pkg-unpack libfoo
test pkg-purge --keep libfoo
stat libfoo "fetched 1.0.0"
gone $cfg/libfoo-1.0.0
test pkg-purge libfoo
stat libfoo unknown

# directory and --purge
#
cp -r pkg/1/build2.org/fetch/libfoo-1.1.0 $cfg/
test pkg-unpack -e -p $cfg/libfoo-1.1.0
test pkg-purge libfoo
stat libfoo unknown
gone $cfg/libfoo-1.1.0

# archive and --purge
#
cp pkg/1/build2.org/fetch/libfoo-1.0.0.tar.gz $cfg/
test pkg-fetch -e -p $cfg/libfoo-1.0.0.tar.gz
test pkg-unpack libfoo
test pkg-purge libfoo
stat libfoo unknown
gone $cfg/libfoo-1.0.0
gone $cfg/libfoo-1.0.0.tar.gz

# broken
#
cp pkg/1/build2.org/fetch/libfoo-1.0.0.tar.gz $cfg/
test pkg-fetch -e -p $cfg/libfoo-1.0.0.tar.gz
test pkg-unpack libfoo
chmod 000 $cfg/libfoo-1.0.0
fail pkg-purge libfoo
stat libfoo/1.0.0 broken
fail pkg-purge libfoo        # need --force
fail pkg-purge -f -k libfoo  # can't keep broken
fail pkg-purge -f libfoo     # out directory still exists
chmod 755 $cfg/libfoo-1.0.0
rm -r $cfg/libfoo-1.0.0
fail pkg-purge -f libfoo     # archive still exists
rm $cfg/libfoo-1.0.0.tar.gz
test pkg-purge -f libfoo
stat libfoo unknown

##
## pkg-configure/pkg-disfigure
##
test cfg-create --wipe
test rep-add $rep/common/hello
test rep-fetch --trust $hello_fp

fail pkg-configure                        # package name expected
fail pkg-configure config.dist.root=/tmp  # ditto
fail pkg-configure libhello libhello      # unexpected argument
fail pkg-configure libhello1              # no such package

fail pkg-disfigure                        # package name expected
fail pkg-disfigure libhello1              # no such package

test pkg-fetch libhello/1.0.0+1

fail pkg-configure libhello $cxx_options  # wrong package state
fail pkg-disfigure libhello               # wrong package state

test pkg-purge libhello

# src == out
#
test pkg-fetch libhello/1.0.0+1
test pkg-unpack libhello
test pkg-configure libhello $cxx_options
stat libhello "configured 1.0.0+1"
test pkg-disfigure libhello
stat libhello "unpacked 1.0.0+1"
test pkg-purge libhello
stat libhello/1.0.0 "available 1.0.0+1"

# src != out
#
test cfg-create --wipe
test pkg-unpack -e pkg/1/build2.org/common/libhello-1.0.0+1
test pkg-configure libhello $cxx_options
stat libhello "configured 1.0.0+1"
test pkg-disfigure libhello
stat libhello "unpacked 1.0.0+1"
test pkg-purge libhello
stat libhello unknown
gone $cfg/libhello-1.0.0+1

# out still exists after disfigure
#
test pkg-unpack -e pkg/1/build2.org/common/libhello-1.0.0+1
test pkg-configure libhello $cxx_options
touch $cfg/libhello-1.0.0+1/stray
fail pkg-disfigure libhello
stat libhello/1.0.0+1 broken
rm -r $cfg/libhello-1.0.0+1
test pkg-purge -f libhello
stat libhello unknown

# disfigure failed
#
test pkg-unpack -e pkg/1/build2.org/common/libhello-1.0.0+1
test pkg-configure libhello $cxx_options
chmod 555 $cfg/libhello-1.0.0+1
fail pkg-disfigure libhello
stat libhello/1.0.0+1 broken
chmod 755 $cfg/libhello-1.0.0+1
rm -r $cfg/libhello-1.0.0+1
test pkg-purge -f libhello
stat libhello unknown

# While it's forbidden to delete a directory with write permissions being
# revoked with the 'chmod 555' command in MSYS, it's still allowed to create
# subdirectories and files inside such a directory. This is why the following
# 'fail pkg-configure libhello' test cases undesirably succeed in MSYS.
#
if [ "$msys" != "y" ]; then
  # configure failed but disfigure succeeds
  #
  test pkg-unpack -e pkg/1/build2.org/common/libhello-1.0.0+1
  mkdir -p $cfg/libhello-1.0.0+1/build
  chmod 555 $cfg/libhello-1.0.0+1/build
  fail pkg-configure libhello $cxx_options
  stat libhello "unpacked 1.0.0+1"
  test pkg-purge libhello
  stat libhello unknown

  # configure and disfigure both failed
  #
  test pkg-unpack -e pkg/1/build2.org/common/libhello-1.0.0+1
  mkdir -p $cfg/libhello-1.0.0+1/build
  # Trip both con/dis.
  #
  chmod 555 $cfg/libhello-1.0.0+1 $cfg/libhello-1.0.0+1/build
  fail pkg-configure libhello $cxx_options
  stat libhello/1.0.0+1 broken
  chmod 755 $cfg/libhello-1.0.0+1 $cfg/libhello-1.0.0+1/build
  rm -r $cfg/libhello-1.0.0+1
  test pkg-purge -f libhello
  stat libhello unknown
fi

# dependency management
#
test rep-create pkg/1/build2.org/depend/stable
test cfg-create --wipe
test rep-add $rep/depend/stable
test rep-fetch --trust-yes

test pkg-fetch libbar/1.0.0
test pkg-unpack libbar
fail pkg-configure libbar # no libfoo
stat libbar/1.0.0 "unpacked"
test pkg-fetch libfoo/1.0.0
test pkg-unpack libfoo
fail pkg-configure libbar # libfoo not configured
test pkg-configure libfoo
test pkg-configure libbar
fail pkg-disfigure libfoo # libbar still depends on libfoo
test pkg-disfigure libbar
test pkg-disfigure libfoo
test pkg-purge libbar
test pkg-purge libfoo

test pkg-fetch libfoo/1.0.0
test pkg-unpack libfoo
test pkg-configure libfoo
test pkg-fetch libbar/1.1.0
test pkg-unpack libbar
fail pkg-configure libbar # libfoo >= 1.1.0
test pkg-disfigure libfoo
test pkg-purge libfoo
test pkg-fetch libfoo/1.1.0
test pkg-unpack libfoo
test pkg-configure libfoo
test pkg-configure libbar
test pkg-disfigure libbar
test pkg-disfigure libfoo
test pkg-purge libfoo
test pkg-purge libbar

test pkg-fetch libfoo/1.1.0
test pkg-unpack libfoo
test pkg-configure libfoo
test pkg-fetch libbar/1.2.0
test pkg-unpack libbar
fail pkg-configure libbar # libfoo >= 1.2.0
test pkg-disfigure libfoo
test pkg-purge libfoo
test pkg-fetch libfoo/1.2.0
test pkg-unpack libfoo
test pkg-configure libfoo
test pkg-configure libbar
fail pkg-disfigure libfoo # "package libbar on libfoo >= 1.2.0"
test pkg-disfigure libbar
test pkg-disfigure libfoo
test pkg-purge libfoo
test pkg-purge libbar

test pkg-fetch libfoo/1.1.0
test pkg-unpack libfoo
test pkg-configure libfoo
test pkg-fetch libbar/1.3.0
test pkg-unpack libbar
fail pkg-configure libbar # incompatible constraints
test pkg-disfigure libfoo
test pkg-purge libfoo
test pkg-purge libbar


##
## pkg-status (also tested in pkg-{fetch,unpack,configure,disfigure,purge})
##
test rep-create pkg/1/build2.org/status/stable
test rep-create pkg/1/build2.org/status/extra
test rep-create pkg/1/build2.org/status/testing
test rep-create pkg/1/build2.org/status/unstable

# basics
#
test cfg-create --wipe
stat libfoo/1.0.0 "unknown"
stat libfoo "unknown"
test rep-add $rep/status/stable
test rep-fetch --trust-yes
stat libfoo/1.0.0 "available"
stat libfoo "available 1.0.0"
test pkg-fetch libfoo/1.0.0
stat libfoo/1.0.0 "fetched"
stat libfoo "fetched 1.0.0"

# multiple versions/revisions
#
test cfg-create --wipe
test rep-add $rep/status/extra
test rep-fetch --trust-yes
stat libbar "available 1.1.0+1"
test rep-add $rep/status/stable
test rep-fetch --trust-yes
stat libbar "available 1.1.0+1 1.0.0"

test cfg-create --wipe
test rep-add $rep/status/testing
test rep-fetch --trust-yes
stat libbar "available 1.1.0 1.0.0+1 1.0.0"

test cfg-create --wipe
test rep-add $rep/status/unstable
test rep-fetch --trust-yes
stat libbar "available 2.0.0 1.1.0 1.0.0+1 1.0.0"
test pkg-fetch libbar/1.0.0+1
stat libbar "fetched 1.0.0+1; available 2.0.0 1.1.0"
test pkg-purge libbar
test pkg-fetch libbar/2.0.0
stat libbar "fetched 2.0.0"


##
## pkg-update
##
test cfg-create --wipe
test rep-add $rep/common/hello
test rep-fetch --trust $hello_fp

fail pkg-update                # package name expected
fail pkg-update libhello       # no such package
test pkg-fetch libhello/1.0.0+1
fail pkg-update libhello       # wrong package state
test pkg-purge libhello

# src == out
#
test pkg-fetch libhello/1.0.0+1
test pkg-unpack libhello
test pkg-configure libhello $cxx_options
test pkg-update libhello
test pkg-update libhello
test pkg-disfigure libhello
test pkg-purge libhello

# src != out
#
test cfg-create --wipe
test pkg-unpack -e pkg/1/build2.org/common/libhello-1.0.0+1
test pkg-configure libhello $cxx_options
test pkg-update libhello
test pkg-update libhello
test pkg-disfigure libhello
test pkg-purge libhello


##
## pkg-clean
##
test cfg-create --wipe
test rep-add $rep/common/hello
test rep-fetch --trust $hello_fp

fail pkg-clean                  # package name expected
fail pkg-clean libhello         # no such package
test pkg-fetch libhello/1.0.0+1
fail pkg-clean libhello         # wrong package state
test pkg-purge libhello

# src == out
#
test pkg-fetch libhello/1.0.0+1
test pkg-unpack libhello
test pkg-configure libhello $cxx_options
test pkg-update libhello
test pkg-clean libhello
test pkg-clean libhello
test pkg-disfigure libhello
test pkg-purge libhello

# src != out
#
test cfg-create --wipe
test pkg-unpack -e pkg/1/build2.org/common/libhello-1.0.0+1
test pkg-configure libhello $cxx_options
test pkg-update libhello
test pkg-clean libhello
test pkg-clean libhello
test pkg-disfigure libhello
test pkg-purge libhello


##
## Low-level command scenarios.
##


# build and clean package
#
test cfg-create --wipe cxx $cxx_options
test rep-add $rep/common/hello
test rep-fetch --trust $hello_fp
test pkg-fetch libhello/1.0.0+1
test pkg-unpack libhello
test pkg-configure libhello $cxx_options
test pkg-update libhello
test pkg-clean libhello
test pkg-disfigure libhello
test pkg-purge libhello

##
## pkg-build
##

# 1 (libfoo)
#
test rep-create pkg/1/build2.org/satisfy/t1
test cfg-create --wipe

fail pkg-build -p               # package name expected
fail pkg-build -p libfoo        # unknown package
fail pkg-build -p libfoo/1.0.0  # unknown package
test pkg-build -p pkg/1/build2.org/satisfy/libfoo-1.1.0.tar.gz <<EOF
build libfoo 1.1.0
EOF
test pkg-build -p pkg/1/build2.org/satisfy/libfoo-1.1.0/ <<EOF
build libfoo 1.1.0
EOF

test pkg-unpack -e pkg/1/build2.org/satisfy/libfoo-1.1.0
test pkg-build -p libfoo <<< "build libfoo 1.1.0"
test pkg-build -p libfoo/1.1.0 <<< "build libfoo 1.1.0"
test pkg-build -p libfoo libfoo <<< "build libfoo 1.1.0"
test pkg-build -p libfoo libfoo/1.1.0 <<< "build libfoo 1.1.0"
test pkg-build -p libfoo/1.1.0 libfoo <<< "build libfoo 1.1.0"
test pkg-build -p libfoo/1.1.0 libfoo/1.1.0 <<< "build libfoo 1.1.0"
fail pkg-build -p libfoo/1.0.0
test pkg-purge libfoo

test rep-add $rep/satisfy/t1
test rep-fetch --trust-yes
test pkg-build -p libfoo <<< "build libfoo 1.0.0"
test pkg-build -p libfoo/1.0.0 <<< "build libfoo 1.0.0"
test pkg-build -p libfoo libfoo <<< "build libfoo 1.0.0"
test pkg-build -p libfoo libfoo/1.0.0 <<< "build libfoo 1.0.0"
test pkg-build -p libfoo/1.0.0 libfoo <<< "build libfoo 1.0.0"
test pkg-build -p libfoo/1.0.0 libfoo/1.0.0 <<< "build libfoo 1.0.0"
fail pkg-build -p libfoo/1.1.0

test pkg-unpack -e pkg/1/build2.org/satisfy/libfoo-1.1.0
test pkg-build -p libfoo <<< "build libfoo 1.1.0"
test pkg-build -p libfoo/1.0.0 <<< "downgrade libfoo 1.0.0"
fail pkg-build -p libfoo/0.0.0
test pkg-purge libfoo

test pkg-fetch -e pkg/1/build2.org/satisfy/libfoo-0.0.0.tar.gz
test pkg-unpack libfoo
test pkg-build -p libfoo <<< "upgrade libfoo 1.0.0"
test pkg-build -p libfoo/0.0.0 <<< "build libfoo 0.0.0"
fail pkg-build -p libfoo/1.1.0
test pkg-purge libfoo

# 2 (libbar depends on libfoo)
#
test rep-create pkg/1/build2.org/satisfy/t2
test cfg-create --wipe

fail pkg-build pkg/1/build2.org/satisfy/libbar-1.0.0.tar.gz

test rep-add $rep/satisfy/t2
test rep-fetch --trust-yes

test pkg-build -p libbar <<EOF
build libfoo 1.0.0 (required by libbar)
build libbar 1.0.0
EOF
test pkg-build -p libbar libfoo <<EOF
build libfoo 1.0.0
build libbar 1.0.0
EOF
test pkg-build -p libbar libfoo/1.0.0 <<EOF
build libfoo 1.0.0
build libbar 1.0.0
EOF
test pkg-build -p libbar libfoo libbar/1.0.0 <<EOF
build libfoo 1.0.0
build libbar 1.0.0
EOF
fail pkg-build -p libbar libfoo/1.1.0

test pkg-fetch -e pkg/1/build2.org/satisfy/libfoo-0.0.0.tar.gz
test pkg-unpack libfoo
test pkg-build -p libbar <<EOF
build libfoo 0.0.0 (required by libbar)
build libbar 1.0.0
EOF
test pkg-build -p libbar libfoo <<EOF
upgrade libfoo 1.0.0
build libbar 1.0.0
EOF
test pkg-build -p libbar libfoo/0.0.0 <<EOF
build libfoo 0.0.0
build libbar 1.0.0
EOF
test pkg-purge libfoo

test pkg-unpack -e pkg/1/build2.org/satisfy/libfoo-1.1.0
test pkg-build -p libbar <<EOF
build libfoo 1.1.0 (required by libbar)
build libbar 1.0.0
EOF
test pkg-build -p libbar libfoo <<EOF
build libfoo 1.1.0
build libbar 1.0.0
EOF
test pkg-build -p libbar libfoo/1.0.0 <<EOF
downgrade libfoo 1.0.0
build libbar 1.0.0
EOF
test pkg-purge libfoo

# 3 (libbaz depends on libbar; libbar in prerequisite repository)
#
test rep-create pkg/1/build2.org/satisfy/t3
test cfg-create --wipe
test rep-add $rep/satisfy/t3
test rep-fetch --trust-yes

# only in prerequisite repository
#
fail pkg-build -p libfoo
fail pkg-build -p libbar
fail pkg-build -p libbaz libbar

test pkg-build -p libbaz <<EOF
build libfoo 1.0.0 (required by libbar)
build libbar 1.0.0 (required by libbaz)
build libbaz 1.0.0
EOF

test rep-add $rep/satisfy/t2
test rep-fetch

# order
#
test pkg-build -p libfox libfoo <<EOF
build libfox 1.0.0
build libfoo 1.0.0
EOF

test pkg-build -p libfoo libfox <<EOF
build libfoo 1.0.0
build libfox 1.0.0
EOF

test pkg-build -p libbaz libfoo <<EOF
build libfoo 1.0.0
build libbar 1.0.0 (required by libbaz)
build libbaz 1.0.0
EOF

test pkg-build -p libfoo libbaz <<EOF
build libfoo 1.0.0
build libbar 1.0.0 (required by libbaz)
build libbaz 1.0.0
EOF

test pkg-build -p libbaz libfox <<EOF
build libfoo 1.0.0 (required by libbar)
build libbar 1.0.0 (required by libbaz)
build libbaz 1.0.0
build libfox 1.0.0
EOF

test pkg-build -p libfox libbaz <<EOF
build libfox 1.0.0
build libfoo 1.0.0 (required by libbar)
build libbar 1.0.0 (required by libbaz)
build libbaz 1.0.0
EOF

test pkg-build -p libfox libfoo libbaz <<EOF
build libfox 1.0.0
build libfoo 1.0.0
build libbar 1.0.0 (required by libbaz)
build libbaz 1.0.0
EOF

test pkg-build -p libfox libbaz libfoo <<EOF
build libfox 1.0.0
build libfoo 1.0.0
build libbar 1.0.0 (required by libbaz)
build libbaz 1.0.0
EOF

test pkg-build -p libfoo libfox libbaz <<EOF
build libfoo 1.0.0
build libfox 1.0.0
build libbar 1.0.0 (required by libbaz)
build libbaz 1.0.0
EOF

test pkg-build -p libfoo libbaz libfox <<EOF
build libfoo 1.0.0
build libbar 1.0.0 (required by libbaz)
build libbaz 1.0.0
build libfox 1.0.0
EOF

# this one is contradictory: baz before fox but fox before foo
#
test pkg-build -p libbaz libfox libfoo <<EOF
build libfox 1.0.0
build libfoo 1.0.0
build libbar 1.0.0 (required by libbaz)
build libbaz 1.0.0
EOF

test pkg-build -p libbaz libfoo libfox <<EOF
build libfoo 1.0.0
build libbar 1.0.0 (required by libbaz)
build libbaz 1.0.0
build libfox 1.0.0
EOF

test pkg-build -p libbaz libfoo libbar <<EOF
build libfoo 1.0.0
build libbar 1.0.0
build libbaz 1.0.0
EOF

test pkg-build -p libbaz libbar libfoo <<EOF
build libfoo 1.0.0
build libbar 1.0.0
build libbaz 1.0.0
EOF

# 4 (libbaz depends on libfoo and libbar; libbar depends on libfoo >= 1.1.0)
#
test rep-create pkg/1/build2.org/satisfy/t4a
test rep-create pkg/1/build2.org/satisfy/t4b
test rep-create pkg/1/build2.org/satisfy/t4c
test rep-create pkg/1/build2.org/satisfy/t4d

test cfg-create --wipe
test rep-add $rep/satisfy/t4c
test rep-fetch --trust-yes

test pkg-build -p libbaz <<EOF
build libfoo 1.1.0 (required by libbar libbaz)
build libbar 1.1.0 (required by libbaz)
build libbaz 1.1.0
EOF

test pkg-build -p libfoo libbaz <<EOF
build libfoo 1.1.0
build libbar 1.1.0 (required by libbaz)
build libbaz 1.1.0
EOF

fail pkg-build -p libfoo/1.0.0 libbaz
fail pkg-build -p libfoo/1.1.0 libbaz

# upgrade warning
#
test pkg-fetch -e pkg/1/build2.org/satisfy/libfoo-0.0.0.tar.gz
test pkg-unpack libfoo
test pkg-build -p libbaz <<EOF
upgrade libfoo 1.1.0 (required by libbar libbaz)
build libbar 1.1.0 (required by libbaz)
build libbaz 1.1.0
EOF
test pkg-purge libfoo

# downgrade error
#
test pkg-fetch -e pkg/1/build2.org/satisfy/libfoo-1.2.0.tar.gz
test pkg-unpack libfoo
fail pkg-build -p libbaz
test rep-add $rep/satisfy/t4a
test rep-fetch --trust-yes
test pkg-build -p libfoo/1.1.0 libbaz <<EOF
downgrade libfoo 1.1.0
build libbar 1.1.0 (required by libbaz)
build libbaz 1.1.0
EOF
test pkg-purge libfoo

# dependent prevents upgrade/downgrade
#
test pkg-fetch libfoo/1.1.0
test pkg-unpack libfoo
test pkg-configure libfoo
test pkg-fetch libbar/1.1.0
test pkg-unpack libbar
test pkg-configure libbar
fail pkg-build -p pkg/1/build2.org/satisfy/libfoo-1.2.0.tar.gz
fail pkg-build -p libfoo/1.0.0
test pkg-build -p libfoo/1.1.0 <<< "build libfoo 1.1.0"
test pkg-disfigure libbar
test pkg-disfigure libfoo
test pkg-purge libbar
test pkg-purge libfoo

# dependent reconfigure
#
test cfg-create --wipe

test pkg-fetch -e pkg/1/build2.org/satisfy/libfoo-1.0.0.tar.gz
test pkg-unpack libfoo
test pkg-configure libfoo
test pkg-fetch -e pkg/1/build2.org/satisfy/libbar-1.0.0.tar.gz
test pkg-unpack libbar
test pkg-configure libbar
test pkg-fetch -e pkg/1/build2.org/satisfy/libbaz-1.1.0.tar.gz
test pkg-unpack libbaz
test pkg-configure libbaz

test rep-add $rep/satisfy/t4a
test rep-add $rep/satisfy/t4b
test rep-fetch --trust-yes

test pkg-build -p libbar <<EOF
upgrade libfoo 1.1.0 (required by libbar libbaz)
upgrade libbar 1.1.0
reconfigure libbaz (dependent of libbar)
EOF

test pkg-build -p libfoo <<EOF
upgrade libfoo 1.1.0
reconfigure libbar (dependent of libfoo)
reconfigure libbaz (dependent of libbar)
EOF

test pkg-build -p libfoo libbar/1.0.0 <<EOF
upgrade libfoo 1.1.0
reconfigure/build libbar 1.0.0
reconfigure libbaz (dependent of libbar)
EOF

test pkg-build -p libbar/1.0.0 libfoo <<EOF
upgrade libfoo 1.1.0
reconfigure/build libbar 1.0.0
reconfigure libbaz (dependent of libbar)
EOF

test pkg-build -p libbaz libfoo <<EOF
upgrade libfoo 1.1.0
reconfigure libbar (dependent of libbaz libfoo)
reconfigure/build libbaz 1.1.0
EOF

test pkg-build -p libbaz libfoo/1.0.0 <<EOF
build libfoo 1.0.0
build libbaz 1.1.0
EOF

# actually build
#
test cfg-create --wipe
test rep-add $rep/satisfy/t4c
test rep-fetch --trust-yes
test pkg-build -y libbaz
stat libfoo/1.1.0 "configured"
stat libbar/1.1.0 "configured"
stat libbaz/1.1.0 "configured hold_package"

# hold
#
test cfg-create --wipe
test pkg-build -y pkg/1/build2.org/satisfy/libfoo-1.0.0.tar.gz
stat libfoo "configured 1.0.0 hold_package hold_version"
test pkg-build -y pkg/1/build2.org/satisfy/libfoo-1.1.0/
stat libfoo "configured 1.1.0 hold_package hold_version"

test cfg-create --wipe
test rep-add $rep/satisfy/t4c
test rep-fetch --trust-yes
test pkg-build -y libfoo
stat libfoo "configured 1.0.0 hold_package"
test pkg-build -y libfoo/1.0.0
stat libfoo "configured 1.0.0 hold_package hold_version"

test cfg-create --wipe
test rep-add $rep/satisfy/t4c
test rep-fetch --trust-yes
test pkg-build -y libfoo/1.0.0
stat libfoo "configured 1.0.0 hold_package hold_version"

test cfg-create --wipe
test pkg-fetch -e pkg/1/build2.org/satisfy/libfoo-1.0.0.tar.gz
test pkg-unpack libfoo
test pkg-configure libfoo
stat libfoo "configured 1.0.0"
test pkg-build -y libfoo
stat libfoo "configured 1.0.0 hold_package"

test cfg-create --wipe
test rep-add $rep/satisfy/t4c
test rep-fetch --trust-yes
test pkg-build -y libfoo
stat libfoo "configured 1.0.0 hold_package"
test pkg-build -y libbaz
stat libfoo "configured 1.1.0 hold_package"

test cfg-create --wipe
test rep-add $rep/satisfy/t4c
test rep-fetch --trust-yes
test pkg-build -y libfoo/1.0.0
stat libfoo "configured 1.0.0 hold_package hold_version"
fail pkg-build -y libbaz

test cfg-create --wipe
test rep-add $rep/satisfy/t4c
test rep-fetch --trust-yes
test pkg-build -y libbaz
stat libfoo "configured 1.1.0"

# drop prerequisites on downgrade
#
test rep-create pkg/1/build2.org/satisfy/t5
test cfg-create --wipe
test rep-add $rep/satisfy/t2
test rep-fetch --trust-yes

test pkg-build -y libbar
stat libfoo "configured 1.0.0"
stat libbar "configured 1.0.0 hold_package"

test rep-add $rep/satisfy/t5
test rep-fetch --trust-yes

test pkg-build -y libbar
stat libfoo "available 1.0.0"
stat libbar "configured 1.2.0 hold_package"

test pkg-build -y libbar/1.0.0 libfoo
stat libfoo "configured 1.0.0 hold_package"
stat libbar "configured 1.0.0 hold_package hold_version; available 1.2.0"

test pkg-build -y libbar
stat libfoo "configured 1.0.0 hold_package"
stat libbar "configured 1.2.0 hold_package"

##
## pkg-drop
##
test cfg-create --wipe

fail pkg-drop -p               # package name expected
fail pkg-drop -p libfoo        # unknown package
fail pkg-drop -p libfoo/1.0.0  # unknown package

test cfg-create --wipe
test rep-add $rep/satisfy/t4c
test rep-fetch --trust-yes
test pkg-build -y libbaz

test pkg-drop -p -y libfoo libbaz libbar <<EOF
drop libbaz
drop libbar
drop libfoo
EOF

# dependents
#
fail pkg-drop -y libfoo
fail pkg-drop -y libfoo libbar
fail pkg-drop -y libfoo libbaz

test pkg-drop -p -y --drop-dependent libfoo <<EOF
drop libbaz
drop libbar
drop libfoo
EOF

test pkg-drop -p --drop-dependent libfoo libbaz <<EOF
drop libbaz
drop libbar
drop libfoo
EOF

test pkg-drop -p --drop-dependent libbaz libfoo <<EOF
drop libbaz
drop libbar
drop libfoo
EOF

# prerequisites
#
test pkg-drop -p -y libbaz <<EOF
drop libbaz
drop libbar
drop libfoo
EOF

test pkg-drop -p -n libbaz <<EOF
drop libbaz
EOF

test pkg-drop -p -n libbar libbaz <<EOF
drop libbaz
drop libbar
EOF

test pkg-drop -p -n libbaz libbar <<EOF
drop libbaz
drop libbar
EOF

# prerequisites and dependents
#
test pkg-drop -p -y --drop-dependent libbar <<EOF
drop libbaz
drop libbar
drop libfoo
EOF

test cfg-create --wipe
test rep-add $rep/satisfy/t4d
test rep-fetch --trust-yes
test pkg-build -y libbiz

test pkg-drop -p -y libbiz <<EOF
drop libbiz
drop libbaz
drop libbar
drop libfoo
drop libfox
EOF

test pkg-drop -p -y libfox libbiz <<EOF
drop libbiz
drop libfox
drop libbaz
drop libbar
drop libfoo
EOF

test pkg-drop -p -y --drop-dependent libfox <<EOF
drop libbiz
drop libfox
drop libbaz
drop libbar
drop libfoo
EOF

test pkg-drop -p -y --drop-dependent libbaz <<EOF
drop libbiz
drop libbaz
drop libbar
drop libfoo
drop libfox
EOF

test pkg-drop -p -y --drop-dependent libbar <<EOF
drop libbiz
drop libbaz
drop libbar
drop libfoo
drop libfox
EOF

test pkg-drop -p -y --drop-dependent libfoo <<EOF
drop libbiz
drop libbaz
drop libbar
drop libfoo
drop libfox
EOF

test pkg-drop -p -n --drop-dependent libfox libbaz <<EOF
drop libbiz
drop libfox
drop libbaz
EOF

test pkg-drop -p -n --drop-dependent libbaz libfox <<EOF
drop libbiz
drop libbaz
drop libfox
EOF

test pkg-drop -p -n --drop-dependent libfox libbar <<EOF
drop libbiz
drop libfox
drop libbaz
drop libbar
EOF

test pkg-drop -p -n --drop-dependent libbar libfox <<EOF
drop libbiz
drop libbaz
drop libbar
drop libfox
EOF

# actually drop
#
test pkg-drop -y --drop-dependent libbar
stat libfox/1.0.0 "available"
stat libfoo/1.1.0 "unknown"
stat libbar/1.1.0 "unknown"
stat libbaz/1.1.0 "unknown"
stat libbiz/1.0.0 "available"

##
## auth
##

# rep-create
#
fail rep-create pkg/1/build2.org/auth/create-noemail --key key.pem
fail rep-create pkg/1/build2.org/auth/create-expired --key key.pem

fail rep-create pkg/1/build2.org/auth/signed # no --key option
test rep-create pkg/1/build2.org/auth/signed --key key.pem
test rep-create pkg/1/build2.org/auth/unsigned1
test rep-create pkg/1/build2.org/auth/unsigned2
test rep-create pkg/1/build2.org/auth/name-mismatch --key key.pem

test rep-create pkg/1/build2.org/auth/sha256sum-mismatch --key key.pem

# Tamper signature manifest's sha256sum value.
#
s=d374c59b36fdbdbd0d4468665061d94fda9c6c687863dfe72b0bcc34ff9d5fb4
edit pkg/1/build2.org/auth/sha256sum-mismatch/signature \
     "s/^\(sha256sum: \).*\$/\1$s/"

test rep-create pkg/1/build2.org/auth/signature-mismatch --key key.pem

# Tamper signature manifest's signature value.
#
edit pkg/1/build2.org/auth/signature-mismatch/signature \
     '/^signature: \\$/,/^\\$/d'
cat >> pkg/1/build2.org/auth/signature-mismatch/signature << EOF
signature: \\
XBjnmXXVHY0RqMI0gL/P4t/vuWwK9JJkLl4Qf2gMxq5k2WQ2CIE56DfG0RaGklgKcI3UxsQZvMQI
5PNtAHJDjteQ+BqY0io8A43KPX+2LKMU+I825sKmPRjCLYleGM3mNndDkWfYtAzYk5AmR2piqRz0
D7CLq9GIoQQZO4Fw44muaQDMCRcXy8Txx2jDnretQjx/C0ZQw4M/cd6/cKEKUmLITDkBig9oVlSh
tpxHqWz5NTbO3vm8ILc03AwiOJHwZweLb6ocJ6a467IJa+F/xUm9B09k8wFWMs+jHXXzHDE0syv7
lqWL7SvHSjVFrGVFKS6nx7lCj2b8XFiGlwWIwjY4m/VK/5QmbL/lC4f+ww5XT5NG5iYh/eMaCxCJ
zTg5iZsWNLhrx9uKNrL5xC4z0OONRVOwzu7gsqr0GLWewPyhH0AqJLgOSkw9N7FJwbv2IKNZ88YA
u2YMXNkXytcQvENLVQDX5oxvUMEurUJFOCuYB/SEnpcwkV5h9RtXzIFVy4OCTU2MhQHDEldI8s7w
Hga/ct4WupgE228gGdgwJLCbHx6AWBlS9iL10AdS8JkQ9LaZwTMHHz44f8y00X4MiT06gpgDeoQD
rUyP0KNG65tdWnVTMqg6Q/YXhtRZLHoD6+QbiYLlruR1phu4y4fDt7AKxoXfeme/a86A37UogZY=
\\
EOF

# rep-fetch
#
signed_fp=`rep_cert_fp pkg/1/build2.org/auth/signed`
test cfg-create --wipe
test rep-add $rep/auth/signed
test rep-fetch --trust $signed_fp
test rep-fetch

test cfg-create --wipe
test rep-add $rep/auth/signed
test rep-fetch --trust-no --trust $signed_fp
test rep-fetch
test rep-fetch --trust-no # certificate is already trusted

test cfg-create --wipe
test rep-add $rep/auth/signed
test rep-fetch --trust-yes
test rep-fetch

test cfg-create --wipe
test rep-add $rep/auth/signed
fail rep-fetch --trust-no

test cfg-create --wipe
test rep-add $rep/auth/signed
fail rep-fetch --trust-yes --trust-no # inconsistent options

test cfg-create --wipe
test rep-add $rep/auth/unsigned1
test rep-fetch --trust-yes
test rep-fetch
test rep-add $rep/auth/unsigned2
test rep-fetch
test rep-fetch --trust-no # certificates are already trusted

test cfg-create --wipe
test rep-add $rep/auth/unsigned1
fail rep-fetch --trust-no

test cfg-create --wipe
test rep-add $rep/auth/name-mismatch
fail rep-fetch --trust-yes # certificate name mismatch

test cfg-create --wipe
test rep-add $rep/auth/expired
fail rep-fetch --trust-yes # certificate expired

test cfg-create --wipe
test rep-add $rep/auth/sha256sum-mismatch
fail rep-fetch --trust-yes # packages file checksum mismatch

test cfg-create --wipe
test rep-add $rep/auth/signature-mismatch
fail rep-fetch --trust-yes # packages file signature:mismatch

# rep-info
#
test cfg-create --wipe
test rep-info --trust-no --trust $signed_fp -d $cfg $rep/auth/signed <<EOF
${repn}auth/signed `location auth/signed`
CN=build2.org/O=Code Synthesis/info@build2.org
$signed_fp
libfoo 1.0.0
EOF

test rep-info --trust-no -d $cfg $rep/auth/signed <<EOF
${repn}auth/signed `location auth/signed`
CN=build2.org/O=Code Synthesis/info@build2.org
$signed_fp
libfoo 1.0.0
EOF

test cfg-create --wipe
test rep-info --trust-yes $rep/auth/signed <<EOF
${repn}auth/signed `location auth/signed`
CN=build2.org/O=Code Synthesis/info@build2.org
$signed_fp
libfoo 1.0.0
EOF

fail rep-info --trust-no $rep/auth/signed <<EOF
${repn}auth/signed `location auth/signed`
CN=build2.org/O=Code Synthesis/info@build2.org
$signed_fp
libfoo 1.0.0
EOF

test cfg-create --wipe
test rep-info --trust-yes -d $cfg $rep/auth/unsigned1 <<EOF
${repn}auth/unsigned1 `location auth/unsigned1`
libfoo 1.0.0
EOF

test rep-info --trust-no -d $cfg $rep/auth/unsigned2 <<EOF
${repn}auth/unsigned2 `location auth/unsigned2`
libfoo 1.0.0
EOF

test cfg-create --wipe
test rep-info --trust-yes $rep/auth/unsigned1 <<EOF
${repn}auth/unsigned1 `location auth/unsigned1`
libfoo 1.0.0
EOF

fail rep-info --trust-no $rep/auth/unsigned1 <<EOF
${repn}auth/unsigned1 `location auth/unsigned1`
libfoo 1.0.0
EOF