#!/bin/bash

set -e

self="$(basename "$0")"

recent_enough_ubuntu=xenial

TD="$(dirname "$0")"
. "$TD/testlib.sh"
if [ -n "$PBUILDER_CHECKOUT" ]; then
    PBUILDER_APT_CONFIG="$PBUILDER_CHECKOUT/pbuilder-apt-config"
else
    PBUILDER_APT_CONFIG="$PBUILDER_TEST_PKGLIBDIR/pbuilder-apt-config"
fi

mirror_map=""

cleanup() {
    if [ -n "$mirror_map" ]; then
        rm -f "$mirror_map"
    fi
}

mirror_map="$(mktemp -t "$self.XXXXXXXXXX")"
cat >"$mirror_map" <<EOF
archive                 archive-mirror
ubuntu                  ubuntu-mirror
ubuntu-ports            ubuntu-ports-mirror
ubuntu-security         ubuntu-security-mirror
nomirror

ppa:people              ppa-people-ppa
ppa:people/otherppa     ppa-people-otherppa

# no mirror
debian-archive
EOF

run_suite_mode() {
    "$PBUILDER_APT_CONFIG" --mirror-map="$mirror_map" --with-sources=no --mirror mirror --suite hamm --components component apt-sources "$@"
}

debootstrap_suite() {
    "$PBUILDER_APT_CONFIG" --mirror-map="$mirror_map" --with-sources=no --mirror mirror --components component debootstrap-suite "$@"
}

debootstrap_mirror() {
    "$PBUILDER_APT_CONFIG" --mirror-map="$mirror_map" --with-sources=no --components component debootstrap-mirror "$@"
}

test_components() {
    run_suite_mode --components comp1
    run_suite_mode --components comp1,comp2,comp3
    run_suite_mode --components "comp1 comp2 comp3"
}

test_pockets() {
    run_suite_mode --pockets ""
    echo
    run_suite_mode --pockets pocket1
    echo
    run_suite_mode --pockets pocket1,pocket2,pocket3
    echo
    run_suite_mode --pockets "pocket1 pocket2 pocket3"
}

strip_mirror() {
    local deb mirror eol

    while read deb mirror eol; do
        echo "$deb $eol"
    done
}

test_profile() {
    local profile="$1"
    "$PBUILDER_APT_CONFIG" --with-sources=no --profile "$profile" --components comp1 apt-sources "$@" | strip_mirror
}

test_fail() {
    exit 1
}

test_options() {
    echo "$@"
    exit 1
}

expect_output "deb mirror hamm component" run_suite_mode --suite hamm

expect_output "deb archive-mirror hamm component" run_suite_mode --mirror "" --archive archive
expect_fail run_suite_mode --mirror "" --archive nomirror
expect_output "deb http://archive.debian.org/debian/ bo component" run_suite_mode --mirror "" --suite bo

expect_output "deb ubuntu-mirror ${recent_enough_ubuntu} component" run_suite_mode --mirror "" --suite ${recent_enough_ubuntu} --arch i386
expect_output "deb ubuntu-ports-mirror ${recent_enough_ubuntu} component" run_suite_mode --mirror "" --suite ${recent_enough_ubuntu} --arch armel

expect_output "deb mirror hamm comp1
deb mirror hamm comp1 comp2 comp3
deb mirror hamm comp1 comp2 comp3" test_components

expect_output "deb mirror hamm component

deb mirror hamm component
deb mirror hamm-pocket1 component

deb mirror hamm component
deb mirror hamm-pocket1 component
deb mirror hamm-pocket2 component
deb mirror hamm-pocket3 component

deb mirror hamm component
deb mirror hamm-pocket1 component
deb mirror hamm-pocket2 component
deb mirror hamm-pocket3 component" test_pockets

expect_output "deb unstable comp1" test_profile unstable
expect_output "deb sid comp1" test_profile sid
expect_output "deb unstable comp1
deb experimental comp1" test_profile experimental
expect_output "deb squeeze comp1
deb squeeze/updates comp1" test_profile squeeze/updates
expect_output "deb squeeze comp1
deb squeeze-proposed-updates comp1" test_profile squeeze-proposed-updates
expect_output "deb squeeze comp1
deb squeeze-backports comp1" test_profile squeeze-backports
expect_output "deb squeeze comp1
deb squeeze/volatile comp1" test_profile squeeze/volatile
expect_output "deb squeeze comp1
deb squeeze/volatile comp1
deb squeeze/volatile-sloppy comp1" test_profile squeeze/volatile-sloppy
expect_output "deb squeeze comp1
deb squeeze/volatile comp1
deb squeeze-proposed-updates/volatile comp1" test_profile squeeze-proposed-updates/volatile
expect_output "deb bo comp1" test_profile bo

expect_output "deb ${recent_enough_ubuntu} comp1" test_profile ${recent_enough_ubuntu} --arch amd64
expect_output "deb ${recent_enough_ubuntu} comp1
deb ${recent_enough_ubuntu}-security comp1
deb ${recent_enough_ubuntu}-security comp1" test_profile ${recent_enough_ubuntu}-security --arch amd64
expect_output "deb ${recent_enough_ubuntu} comp1
deb ${recent_enough_ubuntu}-security comp1
deb ${recent_enough_ubuntu}-updates comp1
deb ${recent_enough_ubuntu}-security comp1" test_profile ${recent_enough_ubuntu}-updates --arch amd64
expect_output "deb ${recent_enough_ubuntu} comp1
deb ${recent_enough_ubuntu}-security comp1
deb ${recent_enough_ubuntu}-updates comp1
deb ${recent_enough_ubuntu}-backports comp1
deb ${recent_enough_ubuntu}-security comp1" test_profile ${recent_enough_ubuntu}-backports --arch amd64
expect_output "deb ${recent_enough_ubuntu} comp1
deb ${recent_enough_ubuntu}-security comp1
deb ${recent_enough_ubuntu}-updates comp1
deb ${recent_enough_ubuntu}-proposed comp1
deb ${recent_enough_ubuntu}-security comp1" test_profile ${recent_enough_ubuntu}-proposed --arch amd64

expect_output "deb     mirror hamm component
deb-src mirror hamm component" run_suite_mode --with-sources=yes
expect_output "deb     mirror hamm component
deb-src mirror hamm component" run_suite_mode --with-sources=
expect_output "deb     mirror hamm component
#deb-src mirror hamm component" run_suite_mode --with-sources=disabled
expect_output "deb mirror hamm component" run_suite_mode --with-sources=no

expect_output "deb ubuntu-mirror hamm component" run_suite_mode --mirror "" --archive ubuntu
expect_output "deb ubuntu-ports-mirror hamm component" run_suite_mode --arch armel --mirror "" --archive ubuntu-ports
expect_fail run_hamm_mode --arch armel --mirror "" --archive otherarchive
expect_success run_suite_mode --mirror "" --suite ${recent_enough_ubuntu} --arch amd64
expect_fail    run_suite_mode --mirror "" --suite suite
expect_success run_suite_mode --mirror "" --suite suite --archive ubuntu
expect_output "deb ppa-people-ppa suite component" run_suite_mode --mirror "" --suite suite --archive ppa:people
expect_output "deb ppa-people-otherppa suite component" run_suite_mode --mirror "" --suite suite --archive ppa:people/otherppa

expect_output "hamm" debootstrap_suite --suite hamm
expect_output "sid" debootstrap_suite --suite sid
expect_output "sid" debootstrap_suite --suite unstable
expect_output "mirror" debootstrap_mirror --suite sid --mirror mirror

expect_output "sid" debootstrap_suite --profile sid
expect_output "sid" debootstrap_suite --profile unstable
expect_output "ubuntu-mirror" debootstrap_mirror --profile ${recent_enough_ubuntu} --arch amd64
expect_output "ubuntu-ports-mirror" debootstrap_mirror --profile ${recent_enough_ubuntu} --arch armel

rm -f "$mirror_map"

testlib_summary
