diff options
Diffstat (limited to 'test')
88 files changed, 1354 insertions, 2239 deletions
diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 000000000..da0a49b0c --- /dev/null +++ b/test/Makefile @@ -0,0 +1,16 @@ +# -*- make -*- + +# This is the top level test makefile for APT, it recurses to each lower +# level make file and runs it with the proper target +ifndef NOISY +.SILENT: +endif + +.PHONY: headers library clean veryclean all binary program doc test +all clean veryclean binary program dirs test: + $(MAKE) -C libapt $@ + $(MAKE) -C interactive-helper $@ + +# Some very common aliases +.PHONY: maintainer-clean dist-clean distclean pristine sanity +maintainer-clean dist-clean distclean pristine sanity: veryclean diff --git a/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-broken_Packages b/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-broken_Packages deleted file mode 100644 index 3e7265438..000000000 --- a/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-broken_Packages +++ /dev/null @@ -1,25 +0,0 @@ -Package: libglib2.0-data -Priority: optional -Section: misc -Installed-Size: 2288 -Maintainer: Ubuntu Desktop Team <ubuntu-desktop@lists.ubuntu.com> -Original-Maintainer: Loic Minier <lool@dooz.org> -Architecture: all -Source: glib2.0 -Version: 2.13.6-1ubuntu1 -Replaces: libglib1.3, libglib1.3-data -Depends: libglib2.0-0 (>= 2.13.6-1ubuntu1) -Conflicts: libglib1.3-data -Filename: ./libglib2.0-data_2.13.6-1ubuntu1_all.deb -Size: 958 -MD5sum: 803fc5e2e31a4345b3e9c771e1eae49f -SHA1: 75b2c62b21bae60c58e694dd40ed6d4df946e304 -SHA256: 142d8466eac252f06bc957d76fe1bb87f86f2d3512b99c8d4b08c1ad79fbe59e -Description: Common files for GLib library - GLib is a library containing many useful C routines for things such - as trees, hashes, lists, and strings. It is a useful general-purpose - C library used by projects such as GTK+, GIMP, and GNOME. - . - This package is needed for the runtime libraries to display messages in - languages other than English. - diff --git a/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-broken_Release b/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-broken_Release deleted file mode 100644 index 7ecd4cd19..000000000 --- a/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-broken_Release +++ /dev/null @@ -1,13 +0,0 @@ -Date: Fri, 27 Jul 2007 14:39:41 UTC -MD5Sum: - 4672dadea6a144839f823c9f3d5fd44b 934 Packages - 82ebcf09a8d78a2b9cf7759349da4936 603 Packages.gz - d41d8cd98f00b204e9800998ecf8427e 0 Release -SHA1: - fa0f294aa30789529371066b10e9497be1284d26 934 Packages - f4032808663b2810d87b4a4dab6f5ae4a1e8fa8e 603 Packages.gz - da39a3ee5e6b4b0d3255bfef95601890afd80709 0 Release -SHA256: - 92c9b605480dc74e6be79c0ddc24738bfcbd6dd3148af531acd68717de528049 934 Packages - 659ccc0d07ff21f0247f9fa5abe149221c90d5e17da52c7afddb035b93c23d39 603 Packages.gz - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 Release diff --git a/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-broken_Release.gpg b/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-broken_Release.gpg deleted file mode 100644 index 85c356e6f..000000000 --- a/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-broken_Release.gpg +++ /dev/null @@ -1,7 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.6 (GNU/Linux) - -iD8DBQBGqgOwliSD4VZixzQRAs6jAJ9p7Aiob9gzkUNCtoW8UPrBo0E/YwCdEaz0 -CQJszU6fRYX5jGWXSWzfc5c= -=ugH0 ------END PGP SIGNATURE----- diff --git a/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-ok_Packages b/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-ok_Packages deleted file mode 100644 index 3e7265438..000000000 --- a/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-ok_Packages +++ /dev/null @@ -1,25 +0,0 @@ -Package: libglib2.0-data -Priority: optional -Section: misc -Installed-Size: 2288 -Maintainer: Ubuntu Desktop Team <ubuntu-desktop@lists.ubuntu.com> -Original-Maintainer: Loic Minier <lool@dooz.org> -Architecture: all -Source: glib2.0 -Version: 2.13.6-1ubuntu1 -Replaces: libglib1.3, libglib1.3-data -Depends: libglib2.0-0 (>= 2.13.6-1ubuntu1) -Conflicts: libglib1.3-data -Filename: ./libglib2.0-data_2.13.6-1ubuntu1_all.deb -Size: 958 -MD5sum: 803fc5e2e31a4345b3e9c771e1eae49f -SHA1: 75b2c62b21bae60c58e694dd40ed6d4df946e304 -SHA256: 142d8466eac252f06bc957d76fe1bb87f86f2d3512b99c8d4b08c1ad79fbe59e -Description: Common files for GLib library - GLib is a library containing many useful C routines for things such - as trees, hashes, lists, and strings. It is a useful general-purpose - C library used by projects such as GTK+, GIMP, and GNOME. - . - This package is needed for the runtime libraries to display messages in - languages other than English. - diff --git a/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-ok_Release b/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-ok_Release deleted file mode 100644 index 7ecd4cd19..000000000 --- a/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-ok_Release +++ /dev/null @@ -1,13 +0,0 @@ -Date: Fri, 27 Jul 2007 14:39:41 UTC -MD5Sum: - 4672dadea6a144839f823c9f3d5fd44b 934 Packages - 82ebcf09a8d78a2b9cf7759349da4936 603 Packages.gz - d41d8cd98f00b204e9800998ecf8427e 0 Release -SHA1: - fa0f294aa30789529371066b10e9497be1284d26 934 Packages - f4032808663b2810d87b4a4dab6f5ae4a1e8fa8e 603 Packages.gz - da39a3ee5e6b4b0d3255bfef95601890afd80709 0 Release -SHA256: - 92c9b605480dc74e6be79c0ddc24738bfcbd6dd3148af531acd68717de528049 934 Packages - 659ccc0d07ff21f0247f9fa5abe149221c90d5e17da52c7afddb035b93c23d39 603 Packages.gz - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 Release diff --git a/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-ok_Release.gpg b/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-ok_Release.gpg deleted file mode 100644 index 85c356e6f..000000000 --- a/test/authReliability/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-ok_Release.gpg +++ /dev/null @@ -1,7 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.6 (GNU/Linux) - -iD8DBQBGqgOwliSD4VZixzQRAs6jAJ9p7Aiob9gzkUNCtoW8UPrBo0E/YwCdEaz0 -CQJszU6fRYX5jGWXSWzfc5c= -=ugH0 ------END PGP SIGNATURE----- diff --git a/test/authReliability/sources.list.failure b/test/authReliability/sources.list.failure deleted file mode 100644 index 110f31884..000000000 --- a/test/authReliability/sources.list.failure +++ /dev/null @@ -1,2 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/gpg-package-broken/ / - diff --git a/test/authReliability/sources.list.good b/test/authReliability/sources.list.good deleted file mode 100644 index 2e9a4458a..000000000 --- a/test/authReliability/sources.list.good +++ /dev/null @@ -1,2 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/gpg-package-ok/ / - diff --git a/test/conf.cc b/test/conf.cc deleted file mode 100644 index 340647b5f..000000000 --- a/test/conf.cc +++ /dev/null @@ -1,37 +0,0 @@ -#include <apt-pkg/configuration.h> -#include <apt-pkg/error.h> - -using namespace std; - -int main(int argc,const char *argv[]) -{ - Configuration Cnf; - - ReadConfigFile(Cnf,argv[1],true); - - // Process 'simple-key' type sections - const Configuration::Item *Top = Cnf.Tree("simple-key"); - for (Top = (Top == 0?0:Top->Child); Top != 0; Top = Top->Next) - { - Configuration Block(Top); - - string VendorID = Top->Tag; - string FingerPrint = Block.Find("Fingerprint"); - string Name = Block.Find("Name"); // Description? - - if (FingerPrint.empty() == true || Name.empty() == true) - _error->Error("Block %s is invalid",VendorID.c_str()); - - cout << VendorID << ' ' << FingerPrint << ' ' << Name << endl; - } - - // Print any errors or warnings found during parsing - if (_error->empty() == false) - { - bool Errors = _error->PendingError(); - _error->DumpErrors(); - return Errors == true?100:0; - } - - return 0; -} diff --git a/test/conf_clear.cc b/test/conf_clear.cc deleted file mode 100644 index 259aa0f39..000000000 --- a/test/conf_clear.cc +++ /dev/null @@ -1,23 +0,0 @@ -#include <apt-pkg/configuration.h> -#include <apt-pkg/error.h> - -using namespace std; - -int main(int argc,const char *argv[]) -{ - Configuration Cnf; - - cout << "adding elements" << endl; - Cnf.Set("APT::Keep-Fds::",28); - Cnf.Set("APT::Keep-Fds::",17); - Cnf.Set("APT::Keep-Fds::",47); - Cnf.Dump(); - - cout << "Removing elements" << endl; - Cnf.Clear("APT::Keep-Fds",17); - Cnf.Clear("APT::Keep-Fds",28); - Cnf.Clear("APT::Keep-Fds",47); - Cnf.Dump(); - - return 0; -} diff --git a/test/fake-status b/test/fake-status deleted file mode 100644 index 9e6366d5b..000000000 --- a/test/fake-status +++ /dev/null @@ -1,16 +0,0 @@ -Package: libglib2.0-0 -Status: install ok installed -Priority: optional -Section: libs -Installed-Size: 1376 -Maintainer: Ubuntu Desktop Team <ubuntu-desktop@lists.ubuntu.com> -Architecture: all -Source: glib2.0 -Version: 2.13.7-1ubuntu1 -Description: The GLib library of C routines - GLib is a library containing many useful C routines for things such - as trees, hashes, lists, and strings. It is a useful general-purpose - C library used by projects such as GTK+, GIMP, and GNOME. - . - This package contains the shared libraries. -Original-Maintainer: Loic Minier <lool@dooz.org> diff --git a/test/hash.cc b/test/hash.cc deleted file mode 100644 index cfdb4ea9d..000000000 --- a/test/hash.cc +++ /dev/null @@ -1,70 +0,0 @@ -#include <apt-pkg/md5.h> -#include <apt-pkg/sha1.h> -#include <apt-pkg/sha256.h> -#include <apt-pkg/strutl.h> -#include <iostream> - -using namespace std; - -template <class T> void Test(const char *In,const char *Out) -{ - T Sum; - Sum.Add(In); - cout << Sum.Result().Value() << endl; - if (stringcasecmp(Sum.Result().Value(),Out) != 0) - abort(); -} - -template <class T> void TestMill(const char *Out) -{ - T Sum; - - const unsigned char As[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; - unsigned Count = 1000000; - for (; Count != 0;) - { - if (Count >= 64) - { - Sum.Add(As,64); - Count -= 64; - } - else - { - Sum.Add(As,Count); - Count = 0; - } - } - - cout << Sum.Result().Value() << endl; - if (stringcasecmp(Sum.Result().Value(),Out) != 0) - abort(); -} - -int main() -{ - // From FIPS PUB 180-1 - Test<SHA1Summation>("abc","A9993E364706816ABA3E25717850C26C9CD0D89D"); - Test<SHA1Summation>("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", - "84983E441C3BD26EBAAE4AA1F95129E5E54670F1"); - TestMill<SHA1Summation>("34AA973CD4C4DAA4F61EEB2BDBAD27316534016F"); - - // MD5 tests from RFC 1321 - Test<MD5Summation>("","d41d8cd98f00b204e9800998ecf8427e"); - Test<MD5Summation>("a","0cc175b9c0f1b6a831c399e269772661"); - Test<MD5Summation>("abc","900150983cd24fb0d6963f7d28e17f72"); - Test<MD5Summation>("message digest","f96b697d7cb7938d525a2f31aaf161d0"); - Test<MD5Summation>("abcdefghijklmnopqrstuvwxyz","c3fcd3d76192e4007dfb496cca67e13b"); - Test<MD5Summation>("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", - "d174ab98d277d9f5a5611c2c9f419d9f"); - Test<MD5Summation>("12345678901234567890123456789012345678901234567890123456789012345678901234567890", - "57edf4a22be3c955ac49da2e2107b67a"); - - // SHA-256, From FIPS 180-2 - Test<SHA256Summation>("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", - "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"); - - - return 0; -} - - diff --git a/test/integration/Packages-hashsum-verification b/test/integration/Packages-hashsum-verification new file mode 100644 index 000000000..29a385f4f --- /dev/null +++ b/test/integration/Packages-hashsum-verification @@ -0,0 +1,18 @@ +Package: apt +Version: 0.7.25.3 +Architecture: i386 +Maintainer: APT Development Team <deity@lists.debian.org> +Installed-Size: 5244 +Replaces: libapt-pkg-dev (<< 0.3.7), libapt-pkg-doc (<< 0.3.7) +Provides: libapt-pkg-libc6.9-6-4.8 +Suggests: aptitude | synaptic | wajig, dpkg-dev, apt-doc, bzip2, lzma, python-apt +Filename: apt.deb +Size: 0 +MD5sum: d41d8cd98f00b204e9800998ecf8427e +Description: Advanced front-end for dpkg + This is Debian's next generation front-end for the dpkg package manager. + It provides the apt-get utility and APT dselect method that provides a + simpler, safer way to install and upgrade packages. + . + APT features complete installation ordering, multiple source capability + and several other unique features, see the Users Guide in apt-doc. diff --git a/test/integration/framework b/test/integration/framework index cc5af798c..a2e71760e 100644 --- a/test/integration/framework +++ b/test/integration/framework @@ -1,16 +1,19 @@ #!/bin/sh -- # no runable script, just for vi # we all like colorful messages -CERROR="[1;31m" # red -CWARNING="[1;33m" # yellow -CMSG="[1;32m" # green -CINFO="[1;96m" # light blue -CDEBUG="[1;94m" # blue -CNORMAL="[0;39m" # default system console color -CDONE="[1;32m" # green -CPASS="[1;32m" # green -CFAIL="[1;31m" # red -CCMD="[1;35m" # pink +if expr match "$(readlink -f /proc/$$/fd/1)" '/dev/pts/[0-9]\+' > /dev/null && \ + expr match "$(readlink -f /proc/$$/fd/2)" '/dev/pts/[0-9]\+' > /dev/null; then + CERROR="[1;31m" # red + CWARNING="[1;33m" # yellow + CMSG="[1;32m" # green + CINFO="[1;96m" # light blue + CDEBUG="[1;94m" # blue + CNORMAL="[0;39m" # default system console color + CDONE="[1;32m" # green + CPASS="[1;32m" # green + CFAIL="[1;31m" # red + CCMD="[1;35m" # pink +fi msgdie() { echo "${CERROR}E: $1${CNORMAL}" >&2; exit 1; } msgwarn() { echo "${CWARNING}W: $1${CNORMAL}" >&2; } @@ -42,7 +45,11 @@ if [ $MSGLEVEL -le 2 ]; then msgtest() { true; } msgpass() { echo -n " ${CPASS}P${CNORMAL}" >&2; } msgskip() { echo -n " ${CWARNING}S${CNORMAL}" >&2; } - msgfail() { echo -n " ${CFAIL}FAIL${CNORMAL}" >&2; } + if [ -n "$CFAIL" ]; then + msgfail() { echo -n " ${CFAIL}FAIL${CNORMAL}" >&2; } + else + msgfail() { echo -n " ###FAILED###" >&2; } + fi fi if [ $MSGLEVEL -le 3 ]; then msginfo() { true; } @@ -151,6 +158,7 @@ setupenvironment() { configarchitecture() { local CONFFILE=rootdir/etc/apt/apt.conf.d/01multiarch.conf + rm -f $CONFFILE echo "APT::Architecture \"$1\";" > $CONFFILE shift while [ -n "$1" ]; do @@ -429,6 +437,27 @@ Filename: pool/main/${NAME}/${NAME}_${VERSION}_${arch}.deb" >> $FILE done } +insertsource() { + local RELEASE="$1" + local NAME="$2" + local ARCH="$3" + local VERSION="$4" + local DEPENDENCIES="$5" + local ARCHS="" + local SPATH="aptarchive/dists/${RELEASE}/main/source" + mkdir -p $SPATH + local FILE="${SPATH}/Sources" + echo "Package: $NAME +Binary: $NAME +Version: $VERSION +Maintainer: Joe Sixpack <joe@example.org> +Architecture: $ARCH" >> $FILE + test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> $FILE + echo "Files: + d41d8cd98f00b204e9800998ecf8427e 0 ${NAME}_${VERSION}.dsc + d41d8cd98f00b204e9800998ecf8427e 0 ${NAME}_${VERSION}.tar.gz" >> $FILE +} + insertinstalledpackage() { local NAME="$1" local ARCH="$2" @@ -481,25 +510,52 @@ buildaptarchivefromfiles() { generatereleasefiles } +# can be overridden by testcases for their pleasure +getcodenamefromsuite() { echo -n "$1"; } +getreleaseversionfromsuite() { true; } +getlabelfromsuite() { true; } + generatereleasefiles() { + # $1 is the Date header and $2 is the ValidUntil header to be set + # both should be given in notation date/touch can understand msgninfo "\tGenerate Release files… " - local DATE="${1:-now}" if [ -e aptarchive/dists ]; then for dir in $(find ./aptarchive/dists -mindepth 3 -maxdepth 3 -type d -name 'i18n'); do aptftparchive -qq release $dir -o APT::FTPArchive::Release::Patterns::='Translation-*' > $dir/Index done for dir in $(find ./aptarchive/dists -mindepth 1 -maxdepth 1 -type d); do - local CODENAME="$(echo "$dir" | cut -d'/' -f 4)" - aptftparchive -qq release $dir -o APT::FTPArchive::Release::Suite="${CODENAME}" -o APT::FTPArchive::Release::Codename="${CODENAME}" | sed -e '/0 Release$/ d' > $dir/Release # remove the self reference - if [ "$CODENAME" = "experimental" -o "$CODENAME" = "experimental2" ]; then + local SUITE="$(echo "$dir" | cut -d'/' -f 4)" + local CODENAME="$(getcodenamefromsuite $SUITE)" + local VERSION="$(getreleaseversionfromsuite $SUITE)" + local LABEL="$(getlabelfromsuite $SUITE)" + if [ -n "$VERSION" ]; then + VERSION="-o APT::FTPArchive::Release::Version=${VERSION}" + fi + if [ -n "$LABEL" ]; then + LABEL="-o APT::FTPArchive::Release::Label=${LABEL}" + fi + aptftparchive -qq release $dir \ + -o APT::FTPArchive::Release::Suite="${SUITE}" \ + -o APT::FTPArchive::Release::Codename="${CODENAME}" \ + ${LABEL} \ + ${VERSION} \ + | sed -e '/0 Release$/ d' > $dir/Release # remove the self reference + if [ "$SUITE" = "experimental" -o "$SUITE" = "experimental2" ]; then sed -i '/^Date: / a\ NotAutomatic: yes' $dir/Release fi + if [ -n "$1" -a "$1" != "now" ]; then + sed -i "s/^Date: .*$/Date: $(date -d "$1" '+%a, %d %b %Y %H:%M:%S %Z')/" $dir/Release + fi + if [ -n "$2" ]; then + sed -i "/^Date: / a\ +Valid-Until: $(date -d "$2" '+%a, %d %b %Y %H:%M:%S %Z')" $dir/Release + fi done else aptftparchive -qq release ./aptarchive | sed -e '/0 Release$/ d' > aptarchive/Release # remove the self reference fi - if [ "$DATE" != "now" ]; then + if [ -n "$1" -a "$1" != "now" ]; then for release in $(find ./aptarchive -name 'Release'); do touch -d "$1" $release done @@ -573,6 +629,11 @@ changetowebserver() { if which weborf > /dev/null; then weborf -xb aptarchive/ 2>&1 > /dev/null & addtrap "kill $!;" + elif which gatling > /dev/null; then + cd aptarchive + gatling -p 8080 -F -S 2>&1 > /dev/null & + addtrap "kill $!;" + cd - > /dev/null elif which lighttpd > /dev/null; then echo "server.document-root = \"$(readlink -f ./aptarchive)\" server.port = 8080 @@ -708,3 +769,9 @@ testmarkedauto() { fi aptmark showauto 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail } + +pause() { + echo "STOPPED execution. Press enter to continue" + local IGNORE + read IGNORE +} diff --git a/test/integration/makefile b/test/integration/makefile new file mode 100644 index 000000000..fb12fe9a8 --- /dev/null +++ b/test/integration/makefile @@ -0,0 +1,10 @@ +# -*- make -*- +BASE=../.. +SUBDIR=test/integration + +# Bring in the default rules +include ../../buildlib/defaults.mak + +.PHONY: test +test: + ./run-tests diff --git a/test/integration/run-tests b/test/integration/run-tests index edac07dbf..75f2ad662 100755 --- a/test/integration/run-tests +++ b/test/integration/run-tests @@ -8,17 +8,30 @@ if [ "$1" = "-q" ]; then elif [ "$1" = "-v" ]; then export MSGLEVEL=4 fi + +if expr match "$(readlink -f /proc/$$/fd/1)" '/dev/pts/[0-9]\+' > /dev/null; then + CTEST='\033[1;32m' + CHIGH='\033[1;35m' + CRESET='\033[0m' +elif [ -z "${MSGLEVEL}" ]; then + export MSGLEVEL=2 +fi + +if [ -z "$MSGLEVEL" ]; then + MSGLEVEL=5 +fi + for testcase in $(run-parts --list $DIR | grep '/test-'); do - if [ "$1" = "-q" ]; then - echo -n "\033[1;32mRun Testcase \033[1;35m$(basename ${testcase})\033[0m" + if [ "$MSGLEVEL" -le 2 ]; then + echo -n "${CTEST}Testcase ${CHIGH}$(basename ${testcase})${CRESET}: " else - echo "\033[1;32mRun Testcase \033[1;35m$(basename ${testcase})\033[0m" + echo "${CTEST}Run Testcase ${CHIGH}$(basename ${testcase})${CRESET}" fi if ! ${testcase}; then FAIL=$((FAIL+1)) echo "$(basename $testcase) ... FAIL" fi - if [ "$1" = "-q" ]; then + if [ "$MSGLEVEL" -le 2 ]; then echo fi done diff --git a/test/integration/test-bug-254770-segfault-if-cache-not-buildable b/test/integration/test-bug-254770-segfault-if-cache-not-buildable index b9f45b131..8fa337ccc 100755 --- a/test/integration/test-bug-254770-segfault-if-cache-not-buildable +++ b/test/integration/test-bug-254770-segfault-if-cache-not-buildable @@ -12,7 +12,6 @@ trap "$CURRENTTRAP" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM chmod a-x rootdir/var/lib/dpkg testsegfault() { - rm -f rootdir/var/cache/apt/*.bin msgtest "No segfault in" "$*" local TEST="$($* 2>&1 | grep -v 'E:')" if [ -z "$TEST" ]; then diff --git a/test/integration/test-bug-407511-fail-invalid-default-release b/test/integration/test-bug-407511-fail-invalid-default-release new file mode 100755 index 000000000..d0a73af7d --- /dev/null +++ b/test/integration/test-bug-407511-fail-invalid-default-release @@ -0,0 +1,47 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'cool' 'all' '1.0-1' + +getcodenamefromsuite() { + if [ "$SUITE" = 'unstable' ]; then + echo -n 'sid' + else + echo -n "$SUITE" + fi +} +getreleaseversionfromsuite() { + if [ "$SUITE" = 'unstable' ]; then + echo -n '42.0' + else + echo -n '0.8.15' + fi +} + +setupaptarchive + +passdist() { + msgtest "Test that target-release is accepted" $1 + aptget dist-upgrade -t $1 -qq && msgpass || msgfail +} + +faildist() { + msgtest "Test that target-release is refused" $1 + aptget dist-upgrade -t $1 -qq 2> /dev/null && msgfail || msgpass +} + +passdist unstable +passdist sid +faildist sidd +faildist stable +passdist 42.0 +passdist 42.* +passdist 42* +passdist 4*.0 +faildist 21.0 +faildist 21* diff --git a/test/integration/test-bug-590438-broken-provides-thanks-to-remove-order b/test/integration/test-bug-590438-broken-provides-thanks-to-remove-order index 0f6493948..645e86d7d 100755 --- a/test/integration/test-bug-590438-broken-provides-thanks-to-remove-order +++ b/test/integration/test-bug-590438-broken-provides-thanks-to-remove-order @@ -25,7 +25,6 @@ MD5sum: 8489687ce10e656babd467c9ee389349 Description-de: Verschiedene Dateien für das Basis-System von Debian" predependsgawk() { - rm rootdir/var/cache/apt/*.bin cp $TESTDIR/$(echo "$(basename $0)" | sed 's/test-/status-/') rootdir/var/lib/dpkg/status echo "$pkgbasefile Pre-Depends: $1 @@ -57,7 +56,6 @@ predependsgawk "awk | aawk" predependsgawk "awk" predependsgawk2() { - rm rootdir/var/cache/apt/*.bin cp $TESTDIR/$(echo "$(basename $0)" | sed 's/test-/status-/') rootdir/var/lib/dpkg/status echo "$pkgbasefile Pre-Depends: $1 diff --git a/test/integration/test-bug-595691-empty-and-broken-archive-files b/test/integration/test-bug-595691-empty-and-broken-archive-files index 11dee0628..5c103da6f 100755 --- a/test/integration/test-bug-595691-empty-and-broken-archive-files +++ b/test/integration/test-bug-595691-empty-and-broken-archive-files @@ -11,7 +11,7 @@ touch aptarchive/Packages setupflataptarchive testaptgetupdate() { - rm -rf rootdir/var/lib/apt rootdir/var/cache/apt + rm -rf rootdir/var/lib/apt aptget update 2>> testaptgetupdate.diff >> testaptgetupdate.diff || true sed -i -e '/^Fetched / d' -e 's#\[[0-9]* [kMGTPY]*B\]#\[\]#' testaptgetupdate.diff GIVEN="$1" diff --git a/test/integration/test-bug-596498-trusted-unsigned-repo b/test/integration/test-bug-596498-trusted-unsigned-repo new file mode 100755 index 000000000..6ebc4a3bb --- /dev/null +++ b/test/integration/test-bug-596498-trusted-unsigned-repo @@ -0,0 +1,47 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'i386' + +buildsimplenativepackage 'cool' 'i386' '1.0' 'unstable' + +setupaptarchive + +aptgetupdate() { + rm -rf rootdir/var/lib/apt/ rootdir/var/cache/apt/*.bin + aptget update -qq +} + +PKGTEXT="$(aptget install cool --assume-no -d | head -n 7)" +DEBFILE='rootdir/etc/apt/sources.list.d/apt-test-unstable-deb.list' + +testequal "$PKGTEXT +Download complete and in download only mode" aptget install cool --assume-no -d + +sed -i -e 's#deb#deb [trusted=no]#' $DEBFILE +aptgetupdate + +testequal "$PKGTEXT +WARNING: The following packages cannot be authenticated! + cool +Install these packages without verification [y/N]? N +E: Some packages could not be authenticated" aptget install cool --assume-no -d + +find aptarchive/ \( -name 'Release.gpg' -o -name 'InRelease' \) -delete +sed -i -e 's#deb \[trusted=no\]#deb#' $DEBFILE +aptgetupdate + +testequal "$PKGTEXT +WARNING: The following packages cannot be authenticated! + cool +Install these packages without verification [y/N]? N +E: Some packages could not be authenticated" aptget install cool --assume-no -d + +sed -i -e 's#deb#deb [trusted=yes]#' $DEBFILE +aptgetupdate + +testequal "$PKGTEXT +Download complete and in download only mode" aptget install cool --assume-no -d diff --git a/test/integration/test-bug-601016-description-translation b/test/integration/test-bug-601016-description-translation index 2a323a201..44ab91900 100755 --- a/test/integration/test-bug-601016-description-translation +++ b/test/integration/test-bug-601016-description-translation @@ -57,7 +57,7 @@ Description-${LOCALE}: Mächtige Oberfläche für dpkg testrun() { echo "Acquire::Languages { \"${LOCALE}\"; \"en\"; };" > rootdir/etc/apt/apt.conf.d/00languages export LC_ALL="" - rm -rf rootdir/var/lib/apt/lists rootdir/var/cache/apt/ + rm -rf rootdir/var/lib/apt/lists setupaptarchive testequal "$LOCALESTANZA" aptcache show apt -o Test=File-${LOCALE} testequal "$NOLONGSTANZA" aptcache show apt -o Acquire::Languages="ww" -o Test=File-${LOCALE} diff --git a/test/integration/test-bug-618288-multiarch-same-lockstep b/test/integration/test-bug-618288-multiarch-same-lockstep index 7e384e428..7333054cc 100755 --- a/test/integration/test-bug-618288-multiarch-same-lockstep +++ b/test/integration/test-bug-618288-multiarch-same-lockstep @@ -17,7 +17,20 @@ buildsimplenativepackage 'apt2' 'amd64' '2' 'unstable' 'Depends: libsame (= 2)' setupaptarchive -testequal 'Reading package lists... +# order in switch libsame:{amd64,i386} are unpacked is irrelevant, as both are installed - but we need to do it together +testequalor2 'Reading package lists... +Building dependency tree... +The following packages will be upgraded: + apt:i386 apt2 libsame libsame:i386 +4 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +Inst libsame:i386 [1] (2 unstable [i386]) [libsame:amd64 on libsame:i386] [libsame:i386 on libsame:amd64] [libsame:amd64 apt:i386 ] +Inst libsame [1] (2 unstable [amd64]) [apt2:amd64 apt:i386 ] +Conf libsame:i386 (2 unstable [i386]) [apt2:amd64 apt:i386 ] +Conf libsame (2 unstable [amd64]) [apt2:amd64 apt:i386 ] +Inst apt2 [1] (2 unstable [amd64]) [apt:i386 ] +Conf apt2 (2 unstable [amd64]) [apt:i386 ] +Inst apt:i386 [1] (2 unstable [i386]) +Conf apt:i386 (2 unstable [i386])' 'Reading package lists... Building dependency tree... The following packages will be upgraded: apt:i386 apt2 libsame libsame:i386 diff --git a/test/integration/test-bug-632221-cross-dependency-satisfaction b/test/integration/test-bug-632221-cross-dependency-satisfaction new file mode 100755 index 000000000..4299f052f --- /dev/null +++ b/test/integration/test-bug-632221-cross-dependency-satisfaction @@ -0,0 +1,183 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'amd64' 'armel' + +insertinstalledpackage 'build-essential' 'all' '11.5' + +insertpackage 'unstable' 'doxygen' 'amd64,armel' '1.0' +insertpackage 'unstable' 'libc6' 'amd64,armel' '1.0' 'Multi-Arch: same' +insertpackage 'unstable' 'libc6-dev' 'amd64,armel' '1.0' 'Depends: libc6 +Multi-Arch: same' +insertpackage 'unstable' 'cool' 'amd64,armel' '1.0' 'Multi-Arch: allowed' +insertpackage 'unstable' 'amdboot' 'amd64' '1.0' +insertpackage 'unstable' 'foreigner' 'amd64,armel' '1.0' 'Multi-Arch: foreign' + +insertsource 'unstable' 'apt' 'any' '0.8.15' 'Build-Depends: doxygen, libc6-dev, libc6-dev:native, cool:any, amdboot:amd64, foreigner' + +setupaptarchive + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + amdboot cool doxygen foreigner libc6 libc6-dev +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +Inst amdboot (1.0 unstable [amd64]) +Inst cool (1.0 unstable [amd64]) +Inst doxygen (1.0 unstable [amd64]) +Inst foreigner (1.0 unstable [amd64]) +Inst libc6 (1.0 unstable [amd64]) +Inst libc6-dev (1.0 unstable [amd64]) +Conf amdboot (1.0 unstable [amd64]) +Conf cool (1.0 unstable [amd64]) +Conf doxygen (1.0 unstable [amd64]) +Conf foreigner (1.0 unstable [amd64]) +Conf libc6 (1.0 unstable [amd64]) +Conf libc6-dev (1.0 unstable [amd64])' aptget build-dep apt -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + amdboot cool doxygen foreigner libc6 libc6:armel libc6-dev libc6-dev:armel +0 upgraded, 8 newly installed, 0 to remove and 0 not upgraded. +Inst amdboot (1.0 unstable [amd64]) +Inst cool (1.0 unstable [amd64]) +Inst doxygen (1.0 unstable [amd64]) +Inst foreigner (1.0 unstable [amd64]) +Inst libc6 (1.0 unstable [amd64]) +Inst libc6:armel (1.0 unstable [armel]) +Inst libc6-dev (1.0 unstable [amd64]) +Inst libc6-dev:armel (1.0 unstable [armel]) +Conf amdboot (1.0 unstable [amd64]) +Conf cool (1.0 unstable [amd64]) +Conf doxygen (1.0 unstable [amd64]) +Conf foreigner (1.0 unstable [amd64]) +Conf libc6 (1.0 unstable [amd64]) +Conf libc6:armel (1.0 unstable [armel]) +Conf libc6-dev (1.0 unstable [amd64]) +Conf libc6-dev:armel (1.0 unstable [armel])' aptget build-dep apt -s -a armel + +configarchitecture 'armel' 'amd64' + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + amdboot:amd64 cool doxygen foreigner libc6 libc6-dev +0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. +Inst amdboot:amd64 (1.0 unstable [amd64]) +Inst cool (1.0 unstable [armel]) +Inst doxygen (1.0 unstable [armel]) +Inst foreigner (1.0 unstable [armel]) +Inst libc6 (1.0 unstable [armel]) +Inst libc6-dev (1.0 unstable [armel]) +Conf amdboot:amd64 (1.0 unstable [amd64]) +Conf cool (1.0 unstable [armel]) +Conf doxygen (1.0 unstable [armel]) +Conf foreigner (1.0 unstable [armel]) +Conf libc6 (1.0 unstable [armel]) +Conf libc6-dev (1.0 unstable [armel])' aptget build-dep apt -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + amdboot:amd64 cool doxygen foreigner libc6:amd64 libc6 libc6-dev:amd64 + libc6-dev +0 upgraded, 8 newly installed, 0 to remove and 0 not upgraded. +Inst amdboot:amd64 (1.0 unstable [amd64]) +Inst cool (1.0 unstable [armel]) +Inst doxygen (1.0 unstable [armel]) +Inst foreigner (1.0 unstable [armel]) +Inst libc6:amd64 (1.0 unstable [amd64]) +Inst libc6 (1.0 unstable [armel]) +Inst libc6-dev:amd64 (1.0 unstable [amd64]) +Inst libc6-dev (1.0 unstable [armel]) +Conf amdboot:amd64 (1.0 unstable [amd64]) +Conf cool (1.0 unstable [armel]) +Conf doxygen (1.0 unstable [armel]) +Conf foreigner (1.0 unstable [armel]) +Conf libc6:amd64 (1.0 unstable [amd64]) +Conf libc6 (1.0 unstable [armel]) +Conf libc6-dev:amd64 (1.0 unstable [amd64]) +Conf libc6-dev (1.0 unstable [armel])' aptget build-dep apt -s -a amd64 + +configarchitecture 'amd64' 'armel' + +insertinstalledpackage 'cool' 'amd64' '0.5' +insertinstalledpackage 'foreigner' 'armel' '0.5' + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + amdboot doxygen libc6 libc6-dev +0 upgraded, 4 newly installed, 0 to remove and 2 not upgraded. +Inst amdboot (1.0 unstable [amd64]) +Inst doxygen (1.0 unstable [amd64]) +Inst libc6 (1.0 unstable [amd64]) +Inst libc6-dev (1.0 unstable [amd64]) +Conf amdboot (1.0 unstable [amd64]) +Conf doxygen (1.0 unstable [amd64]) +Conf libc6 (1.0 unstable [amd64]) +Conf libc6-dev (1.0 unstable [amd64])' aptget build-dep apt -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + amdboot doxygen libc6 libc6:armel libc6-dev libc6-dev:armel +0 upgraded, 6 newly installed, 0 to remove and 2 not upgraded. +Inst amdboot (1.0 unstable [amd64]) +Inst doxygen (1.0 unstable [amd64]) +Inst libc6 (1.0 unstable [amd64]) +Inst libc6:armel (1.0 unstable [armel]) +Inst libc6-dev (1.0 unstable [amd64]) +Inst libc6-dev:armel (1.0 unstable [armel]) +Conf amdboot (1.0 unstable [amd64]) +Conf doxygen (1.0 unstable [amd64]) +Conf libc6 (1.0 unstable [amd64]) +Conf libc6:armel (1.0 unstable [armel]) +Conf libc6-dev (1.0 unstable [amd64]) +Conf libc6-dev:armel (1.0 unstable [armel])' aptget build-dep apt -s -a armel + +configarchitecture 'armel' 'amd64' + +# cool 0.5 is not M-A: allowed, so amd64 is not acceptable +testequal 'Reading package lists... +Building dependency tree... +The following packages will be REMOVED: + cool:amd64 +The following NEW packages will be installed: + amdboot:amd64 cool doxygen libc6 libc6-dev +0 upgraded, 5 newly installed, 1 to remove and 1 not upgraded. +Remv cool:amd64 [0.5] +Inst amdboot:amd64 (1.0 unstable [amd64]) +Inst cool (1.0 unstable [armel]) +Inst doxygen (1.0 unstable [armel]) +Inst libc6 (1.0 unstable [armel]) +Inst libc6-dev (1.0 unstable [armel]) +Conf amdboot:amd64 (1.0 unstable [amd64]) +Conf cool (1.0 unstable [armel]) +Conf doxygen (1.0 unstable [armel]) +Conf libc6 (1.0 unstable [armel]) +Conf libc6-dev (1.0 unstable [armel])' aptget build-dep apt -s + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + amdboot:amd64 doxygen libc6:amd64 libc6 libc6-dev:amd64 libc6-dev +0 upgraded, 6 newly installed, 0 to remove and 2 not upgraded. +Inst amdboot:amd64 (1.0 unstable [amd64]) +Inst doxygen (1.0 unstable [armel]) +Inst libc6:amd64 (1.0 unstable [amd64]) +Inst libc6 (1.0 unstable [armel]) +Inst libc6-dev:amd64 (1.0 unstable [amd64]) +Inst libc6-dev (1.0 unstable [armel]) +Conf amdboot:amd64 (1.0 unstable [amd64]) +Conf doxygen (1.0 unstable [armel]) +Conf libc6:amd64 (1.0 unstable [amd64]) +Conf libc6 (1.0 unstable [armel]) +Conf libc6-dev:amd64 (1.0 unstable [amd64]) +Conf libc6-dev (1.0 unstable [armel])' aptget build-dep apt -s -a amd64 + + diff --git a/test/integration/test-bug-633350-do-not-kill-last-char-in-Release b/test/integration/test-bug-633350-do-not-kill-last-char-in-Release new file mode 100755 index 000000000..2aae7cfcc --- /dev/null +++ b/test/integration/test-bug-633350-do-not-kill-last-char-in-Release @@ -0,0 +1,27 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'amd64' + +insertpackage 'unstable' 'cool' 'amd64' '1.0' + +setupaptarchive 2> /dev/null + +echo 'NotAutomatic: yes' >> aptarchive/dists/unstable/Release + +signreleasefiles +find aptarchive/dists -name 'InRelease' -delete + +rm -rf rootdir/var/lib/apt/lists + +OUTPUT="$(aptget update 2>&1)" +msgtest 'Check that parsing happens without warnings' 'with missing newline' +if echo "${OUTPUT}" | grep '^W:' > /dev/null; then + msgfail + echo "${OUTPUT}" +else + msgpass +fi diff --git a/test/integration/test-compressed-indexes b/test/integration/test-compressed-indexes index 99943574e..a5e885745 100755 --- a/test/integration/test-compressed-indexes +++ b/test/integration/test-compressed-indexes @@ -10,10 +10,10 @@ configarchitecture "i386" buildsimplenativepackage "testpkg" "i386" "1.0" setupaptarchive -local GOODSHOW="$(aptcache show testpkg) +GOODSHOW="$(aptcache show testpkg) " -local GOODPOLICY="$(aptcache policy testpkg)" -local GOODSHOWSRC="$(aptcache showsrc testpkg) +GOODPOLICY="$(aptcache policy testpkg)" +GOODSHOWSRC="$(aptcache showsrc testpkg) " test $(echo "$GOODSHOW" | grep -e '^Package: testpkg' -e '^Version: 1.0' -e '^Architecture: i386' | wc -l) -eq 3 || msgdie 'show is broken' @@ -51,17 +51,16 @@ testrun() { aptget clean msgtest "\tdeb file is gone"; ! test -f rootdir/var/cache/apt/archives/testpkg_1.0_i386.deb && msgpass || msgfail fi - rm rootdir/var/cache/apt/pkgcache.bin rootdir/var/cache/apt/srcpkgcache.bin + rm -f rootdir/var/cache/apt/pkgcache.bin rootdir/var/cache/apt/srcpkgcache.bin testequal "$GOODSHOW" aptcache show testpkg testequal "$GOODSHOW" aptcache show testpkg - rm rootdir/var/cache/apt/pkgcache.bin rootdir/var/cache/apt/srcpkgcache.bin + rm -f rootdir/var/cache/apt/pkgcache.bin rootdir/var/cache/apt/srcpkgcache.bin testequal "$GOODPOLICY" aptcache policy testpkg testequal "$GOODPOLICY" aptcache policy testpkg - rm rootdir/var/cache/apt/pkgcache.bin rootdir/var/cache/apt/srcpkgcache.bin + rm -f rootdir/var/cache/apt/pkgcache.bin rootdir/var/cache/apt/srcpkgcache.bin testequal "$GOODSHOWSRC" aptcache showsrc testpkg testequal "$GOODSHOWSRC" aptcache showsrc testpkg - rm -f rootdir/var/cache/apt/pkgcache.bin rootdir/var/cache/apt/srcpkgcache.bin - rm -rf rootdir/var/cache/apt/archives + aptget clean msgtest "Check if the source is aptgetable" aptget source testpkg -qq 2> /dev/null > /dev/null && msgpass || msgfail msgtest "\tdsc file is present"; test -f testpkg_1.0.dsc && msgpass || msgfail @@ -100,7 +99,7 @@ testrun "compressed" rm rootdir/etc/apt/apt.conf.d/02compressindex changetowebserver aptget update -qq -local GOODPOLICY="$(aptcache policy testpkg)" +GOODPOLICY="$(aptcache policy testpkg)" test $(echo "$GOODPOLICY" | grep -e '^testpkg:' -e '^ Candidate:' -e '^ Installed: (none)' -e '500 http://' | wc -l) -eq 4 testequal "$GOODPOLICY" aptcache policy testpkg diff --git a/test/integration/test-disappearing-packages b/test/integration/test-disappearing-packages index b5d565c2f..82ba9e592 100755 --- a/test/integration/test-disappearing-packages +++ b/test/integration/test-disappearing-packages @@ -12,13 +12,13 @@ buildsimplenativepackage "unrelated" "all" "0.5" "unstable" setupsimplenativepackage "new-pkg" "i386" "2.0" "unstable" "Provides: old-pkg Replaces: old-pkg Conflicts: old-pkg (<< 2.0)" -local BUILDDIR="incoming/new-pkg-2.0" +BUILDDIR="incoming/new-pkg-2.0" echo "/usr/share/doc/new-pkg /usr/share/doc/old-pkg" > ${BUILDDIR}/debian/new-pkg.links buildpackage "$BUILDDIR" "unstable" "main" rm -rf "$BUILDDIR" setupsimplenativepackage "old-pkg" "all" "2.0" "unstable" "Depends: new-pkg" -local BUILDDIR="incoming/old-pkg-2.0" +BUILDDIR="incoming/old-pkg-2.0" echo "/usr/share/doc/new-pkg /usr/share/doc/old-pkg" > ${BUILDDIR}/debian/old-pkg.links echo " override_dh_link: @@ -33,9 +33,9 @@ aptget install old-pkg=1.0 --trivial-only -qq 2>&1 > /dev/null testmarkedauto # old-pkg is manual installed -local CMD="aptget dist-upgrade -y -q=0" +CMD="aptget dist-upgrade -y -q=0" msgtest "Test for equality of" "$CMD" -local COMPAREFILE=$(mktemp) +COMPAREFILE=$(mktemp) echo "The following package disappeared from your system as all files have been overwritten by other packages: old-pkg diff --git a/test/integration/test-handling-broken-orgroups b/test/integration/test-handling-broken-orgroups index d88ad0000..20b314074 100755 --- a/test/integration/test-handling-broken-orgroups +++ b/test/integration/test-handling-broken-orgroups @@ -58,7 +58,7 @@ The following information may help to resolve the situation: The following packages have unmet dependencies: coolstuff-broken : Depends: cool2 but it is not installable or stuff2 but it is not installable -E: Broken packages' aptget install coolstuff-broken -s +E: Unable to correct problems, you have held broken packages.' aptget install coolstuff-broken -s testequal 'Reading package lists... Building dependency tree... @@ -105,4 +105,4 @@ The following information may help to resolve the situation: The following packages have unmet dependencies: coolstuff-provided-broken : Depends: cool2 but it is not installable or stuff-abi-2 -E: Broken packages' aptget install coolstuff-provided-broken -s +E: Unable to correct problems, you have held broken packages.' aptget install coolstuff-provided-broken -s diff --git a/test/integration/test-hashsum-verification b/test/integration/test-hashsum-verification new file mode 100755 index 000000000..3ac9eccfb --- /dev/null +++ b/test/integration/test-hashsum-verification @@ -0,0 +1,81 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework + +setupenvironment +configarchitecture "i386" + +buildaptarchive +setupflataptarchive +changetowebserver + +prepare() { + local DATE="${2:-now}" + if [ "$DATE" = 'now' -a "$1" = "${PKGFILE}-new" ]; then + DATE='now + 6 days' + fi + for release in $(find rootdir/var/lib/apt/lists 2> /dev/null); do + touch -d 'now - 6 hours' $release + done + cp $1 aptarchive/Packages + find aptarchive -name 'Release' -delete + cat aptarchive/Packages | gzip > aptarchive/Packages.gz + cat aptarchive/Packages | bzip2 > aptarchive/Packages.bz2 + cat aptarchive/Packages | lzma > aptarchive/Packages.lzma + # create Release file with incorret checksums + cat > aptarchive/Release <<EOF +Date: Fri, 05 Aug 2011 09:22:08 UTC +MD5Sum: + x15c483ac486f5dbe95095c7ec08626f 760 Packages + x0579797df4792164a17305fb0b317e9 546 Packages.bz2 + xc532a82873d2206b4e4503e92d167bd 489 Packages.gz + x4d1d25661377dd4bb95a1736e2624d3 527 Packages.lzma + xf1cc221194edbaa943d2375d6f44a88 572 Packages.xz +SHA1: + x0d3317839cf68cd40c28f0bddca8d2ce5a29cad 760 Packages + xffddf046ad8dfd8338a355d76fb08d143c8b636 546 Packages.bz2 + xa27a3df51ca4474b880a6594c4811957079b613 489 Packages.gz + x9d7bba4e6fa927a34dcd797694c2893c21f1004 527 Packages.lzma + x7d988fe59cf67298828e5299a15d329c0f00f1b 572 Packages.xz +SHA256: + x5a47d72f6b97bfa164b23326b6ad3cb019b5c6cc73769f8c0187616933d1b2b 760 Packages + x617252f5bfe3e9126352c7c2f8122d9c3b2c5e1a6c8a9616d62adc0ed164172 546 Packages.bz2 + xc6abc6fe9a4fcf0758ec5366dfd19bcba90af026a7017c3f6198c59eccd8ef5 489 Packages.gz + xb306e66e5e6a7169c8d281a888539d1fdca9cecc99ae605717df579d5b9c166 527 Packages.lzma + x9585d0e66b74c9385727fbea11fea9ab33c716b18a32f3036f037a2b9b57120 572 Packages.xz +EOF + cp aptarchive/Release aptarchive/InRelease +} + +# fake our downloadable file +touch aptarchive/apt.deb + +PKGFILE="${TESTDIR}/$(echo "$(basename $0)" | sed 's#^test-#Packages-#')" + +runtest() { + prepare ${PKGFILE} + rm -rf rootdir/var/lib/apt/lists + signreleasefiles 'Joe Sixpack' + find aptarchive/ -name "$DELETEFILE" -delete + + # test signed release file + msgtest 'apt-get update gets the expected hashsum mismatch' + aptget update 2>&1 | grep "Hash Sum mismatch" > /dev/null && msgpass || msgfail + msgtest 'No package from the source available' + [ "$(aptcache show apt 2>&1)" = "E: No packages found" ] && msgpass || msgfail + msgtest 'No Packages file in /var/lib/apt/lists' + [ "$(ls rootdir/var/lib/apt/lists/*Package* 2>/dev/null)" = "" ] && msgpass || msgfail + + # now with the unsigned Release file + rm -rf rootdir/var/lib/apt/lists + rm aptarchive/InRelease aptarchive/Release.gpg + msgtest 'unsigned apt-get update gets the expected hashsum mismatch' + aptget update 2>&1 | grep "Hash Sum mismatch" > /dev/null && msgpass || msgfail + + +} + +runtest + diff --git a/test/integration/test-policy-pinning b/test/integration/test-policy-pinning index fa356ed54..6b1473564 100755 --- a/test/integration/test-policy-pinning +++ b/test/integration/test-policy-pinning @@ -30,21 +30,18 @@ testequalpolicy 100 500 testequalpolicy 990 500 -t now sed -i aptarchive/Release -e 1i"NotAutomatic: yes" -rm rootdir/var/cache/apt/srcpkgcache.bin rootdir/var/cache/apt/pkgcache.bin aptget update -qq testequalpolicy 100 1 -o Test=NotAutomatic testequalpolicy 990 1 -o Test=NotAutomatic -t now sed -i aptarchive/Release -e 1i"ButAutomaticUpgrades: yes" -rm rootdir/var/cache/apt/srcpkgcache.bin rootdir/var/cache/apt/pkgcache.bin aptget update -qq testequalpolicy 100 100 -o Test=ButAutomaticUpgrades testequalpolicy 990 100 -o Test=ButAutomaticUpgrades -t now sed -i aptarchive/Release -e 's#NotAutomatic: yes#NotAutomatic: no#' -e '/ButAutomaticUpgrades: / d' -rm rootdir/var/cache/apt/srcpkgcache.bin rootdir/var/cache/apt/pkgcache.bin aptget update -qq testequalpolicy 100 500 -o Test=Automatic @@ -135,7 +132,6 @@ Pin-Priority: -1" > rootdir/etc/apt/preferences rm rootdir/etc/apt/preferences sed -i aptarchive/dists/backports/Release -e 1i"NotAutomatic: yes" signreleasefiles -rm rootdir/var/cache/apt/srcpkgcache.bin rootdir/var/cache/apt/pkgcache.bin aptget update -qq testequalpolicycoolstuff "" "1.0" 1 500 0 "" -o Test=NotAutomatic @@ -164,7 +160,6 @@ testequalpolicycoolstuff "" "1.0" 1 990 600 "2.0~bpo1" -o Test=NotAutomatic -t s rm rootdir/etc/apt/preferences sed -i aptarchive/dists/backports/Release -e 1i"ButAutomaticUpgrades: yes" signreleasefiles -rm rootdir/var/cache/apt/srcpkgcache.bin rootdir/var/cache/apt/pkgcache.bin aptget update -qq testequalpolicycoolstuff "" "1.0" 100 500 0 "" -o Test=ButAutomaticUpgrades @@ -211,7 +206,6 @@ setupaptarchive sed -i aptarchive/dists/backports/Release -e 1i"NotAutomatic: yes" signreleasefiles -rm rootdir/var/cache/apt/srcpkgcache.bin rootdir/var/cache/apt/pkgcache.bin aptget update -qq testequalpolicycoolstuff "2.0~bpo1" "2.0~bpo1" 1 500 0 "" "2.0~bpo2" -o Test=NotAutomatic @@ -220,7 +214,6 @@ testequalpolicycoolstuff "2.0~bpo1" "2.0~bpo2" 990 500 0 "" "2.0~bpo2" -o Test=N sed -i aptarchive/dists/backports/Release -e 1i"ButAutomaticUpgrades: yes" signreleasefiles -rm rootdir/var/cache/apt/srcpkgcache.bin rootdir/var/cache/apt/pkgcache.bin aptget update -qq testequalpolicycoolstuff "2.0~bpo1" "2.0~bpo2" 100 500 0 "" "2.0~bpo2" -o Test=ButAutomaticUpgrades diff --git a/test/integration/test-release-candidate-switching b/test/integration/test-release-candidate-switching index b6dbe99db..0970cb935 100755 --- a/test/integration/test-release-candidate-switching +++ b/test/integration/test-release-candidate-switching @@ -416,4 +416,4 @@ The following information may help to resolve the situation: The following packages have unmet dependencies: uninstallablepkg : Depends: libmtp8 (>= 10:0.20.1) but it is not going to be installed Depends: amarok-utils (= 2.3.2-2+exp) but 2.3.1-1+sid is to be installed -E: Broken packages" aptget install uninstallablepkg/experimental --trivial-only -V -q=0 +E: Unable to correct problems, you have held broken packages." aptget install uninstallablepkg/experimental --trivial-only -V -q=0 diff --git a/test/integration/test-releasefile-valid-until b/test/integration/test-releasefile-valid-until new file mode 100755 index 000000000..680a370cb --- /dev/null +++ b/test/integration/test-releasefile-valid-until @@ -0,0 +1,95 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'i386' + +insertpackage 'wheezy' 'apt' 'all' '0.8.15' + +getlabelfromsuite() { + echo -n 'Testcases' +} + + +setupaptarchive + +setupreleasefile() { + rm -rf rootdir/var/lib/apt/lists + aptget clean + generatereleasefiles "$1" "$2" + signreleasefiles +} + +aptgetupdate() { + if aptget update $* 2>&1 | grep -q 'is expired'; then + return 1 + else + return 0 + fi +} + +setupreleasefile +msgtest 'Release file is accepted as it has' 'no Until' +aptgetupdate && msgpass || msgfail + +setupreleasefile +msgtest 'Release file is accepted as it has' 'no Until and good Max-Valid' +aptgetupdate -o Acquire::Max-ValidTime=3600 && msgpass || msgfail + +setupreleasefile 'now - 2 days' +msgtest 'Release file is rejected as it has' 'no Until, but bad Max-Valid' +aptgetupdate -o Acquire::Max-ValidTime=3600 && msgfail || msgpass + +setupreleasefile 'now - 3 days' 'now + 1 day' +msgtest 'Release file is accepted as it has' 'good Until' +aptgetupdate && msgpass || msgfail + +setupreleasefile 'now - 7 days' 'now - 4 days' +msgtest 'Release file is rejected as it has' 'bad Until' +aptgetupdate && msgfail || msgpass + +setupreleasefile 'now - 7 days' 'now - 4 days' +msgtest 'Release file is rejected as it has' 'bad Until (ignore good Max-Valid)' +aptgetupdate -o Acquire::Max-ValidTime=1209600 && msgfail || msgpass + +setupreleasefile 'now - 7 days' 'now - 4 days' +msgtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until)' +aptgetupdate -o Acquire::Max-ValidTime=86400 && msgfail || msgpass + +setupreleasefile 'now - 7 days' 'now + 4 days' +msgtest 'Release file is rejected as it has' 'bad Max-Valid (good Until)' +aptgetupdate -o Acquire::Max-ValidTime=86400 && msgfail || msgpass + +setupreleasefile 'now - 7 days' 'now + 4 days' +msgtest 'Release file is accepted as it has' 'good labeled Max-Valid' +aptgetupdate -o Acquire::Max-ValidTime=86400 -o Acquire::Max-ValidTime::Testcases=1209600 && msgpass || msgfail + +setupreleasefile 'now - 7 days' 'now + 4 days' +msgtest 'Release file is rejected as it has' 'bad labeled Max-Valid' +aptgetupdate -o Acquire::Max-ValidTime=1209600 -o Acquire::Max-ValidTime::Testcases=86400 && msgfail || msgpass + +setupreleasefile 'now - 7 days' 'now + 1 days' +msgtest 'Release file is accepted as it has' 'good Until (good Min-Valid, no Max-Valid)' +aptgetupdate -o Acquire::Min-ValidTime=1209600 && msgpass || msgfail + +setupreleasefile 'now - 7 days' 'now - 4 days' +msgtest 'Release file is accepted as it has' 'good Min-Valid (bad Until, no Max-Valid)' +aptgetupdate -o Acquire::Min-ValidTime=1209600 && msgpass || msgfail + +setupreleasefile 'now - 7 days' 'now - 2 days' +msgtest 'Release file is accepted as it has' 'good Min-Valid (bad Until, good Max-Valid) <' +aptgetupdate -o Acquire::Min-ValidTime=1209600 -o Acquire::Max-ValidTime=2419200 && msgpass || msgfail + +setupreleasefile 'now - 7 days' 'now - 2 days' +msgtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until, good Min-Valid) >' +aptgetupdate -o Acquire::Max-ValidTime=12096 -o Acquire::Min-ValidTime=2419200 && msgfail || msgpass + +setupreleasefile 'now - 7 days' 'now - 2 days' +msgtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until, bad Min-Valid) <' +aptgetupdate -o Acquire::Min-ValidTime=12096 -o Acquire::Max-ValidTime=241920 && msgfail || msgpass + +setupreleasefile 'now - 7 days' 'now - 2 days' +msgtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until, bad Min-Valid) >' +aptgetupdate -o Acquire::Max-ValidTime=12096 -o Acquire::Min-ValidTime=241920 && msgfail || msgpass diff --git a/test/integration/test-releasefile-verification b/test/integration/test-releasefile-verification index 961c49895..8bf02a78f 100755 --- a/test/integration/test-releasefile-verification +++ b/test/integration/test-releasefile-verification @@ -19,8 +19,7 @@ prepare() { for release in $(find rootdir/var/lib/apt/lists 2> /dev/null); do touch -d 'now - 6 hours' $release done - rm -rf rootdir/var/cache/apt/archives - rm -f rootdir/var/cache/apt/*.bin + aptget clean cp $1 aptarchive/Packages find aptarchive -name 'Release' -delete cat aptarchive/Packages | gzip > aptarchive/Packages.gz diff --git a/test/integration/test-resolve-by-keep-new-recommends b/test/integration/test-resolve-by-keep-new-recommends new file mode 100755 index 000000000..8134b76aa --- /dev/null +++ b/test/integration/test-resolve-by-keep-new-recommends @@ -0,0 +1,20 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture "i386" + +insertinstalledpackage 'foo' 'i386' '1.0' +insertpackage 'unstable' 'foo' 'i386' '2.0' 'Recommends: bar' + +setupaptarchive + +UPGRADE_KEEP="Reading package lists... +Building dependency tree... +The following packages have been kept back: + foo +0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded." +testequal "$UPGRADE_KEEP" aptget upgrade -s + diff --git a/test/integration/test-ubuntu-bug-784473-InRelease-one-message-only b/test/integration/test-ubuntu-bug-784473-InRelease-one-message-only new file mode 100755 index 000000000..d97011914 --- /dev/null +++ b/test/integration/test-ubuntu-bug-784473-InRelease-one-message-only @@ -0,0 +1,31 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'i386' + +insertpackage 'unstable' 'apt' 'i386' '0.8.11' + +setupaptarchive + +rm -rf rootdir/var/lib/apt/lists + +find aptarchive/ -name 'Release.gpg' -delete +find aptarchive/ -name 'InRelease' -exec cp {} {}.old \; + +for RELEASE in $(find aptarchive/ -name 'InRelease'); do + (echo 'Origin: Marvin +Label: Marvin +Suite: experimental +Codename: experimental +MD5Sum: + 65fd410587b6978de2277f2912523f09 9360 Packages + d27b294ed172a1fa9dd5a53949914c5d 4076 Packages.bz2 + 2182897e0a2a0c09e760beaae117a015 2023 Packages.diff/Index + 1b895931853981ad8204d2439821b999 4144 Packages.gz'; echo; cat ${RELEASE}.old;) > ${RELEASE} +done +aptget update -qq > /dev/null 2> starts-with-unsigned.msg +sed -i 's#File .*InRelease#File InRelease#' starts-with-unsigned.msg +testfileequal starts-with-unsigned.msg "W: GPG error: file: unstable InRelease: File InRelease doesn't start with a clearsigned message" diff --git a/test/integration/test-ubuntu-bug-802901-multiarch-early-remove b/test/integration/test-ubuntu-bug-802901-multiarch-early-remove new file mode 100755 index 000000000..bdb4e5e4f --- /dev/null +++ b/test/integration/test-ubuntu-bug-802901-multiarch-early-remove @@ -0,0 +1,24 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'amd64' 'i386' + +insertinstalledpackage 'libgl1-mesa-glx' 'amd64' '2.0' 'Multi-Arch: same +Provides: libgl1 +Conflicts: libgl1' +insertpackage 'unstable' 'libgl1-mesa-glx' 'i386,amd64' '2.0' 'Multi-Arch: same +Provides: libgl1 +Conflicts: libgl1' + +setupaptarchive + +testequal 'Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + libgl1-mesa-glx:i386 +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libgl1-mesa-glx:i386 (2.0 unstable [i386]) +Conf libgl1-mesa-glx:i386 (2.0 unstable [i386])' aptget install libgl1-mesa-glx:i386 -s diff --git a/test/integration/test-ubuntu-bug-806274-install-suggests b/test/integration/test-ubuntu-bug-806274-install-suggests new file mode 100755 index 000000000..fb72f0999 --- /dev/null +++ b/test/integration/test-ubuntu-bug-806274-install-suggests @@ -0,0 +1,81 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture "i386" + +insertpackage 'unstable' 'apt' 'i386' '0.8.15' 'Depends: foo +Recommends: bar +Suggests: baz' +insertpackage 'unstable' 'foo' 'i386' '1.0' +insertpackage 'unstable' 'bar' 'i386' '1.0' +insertpackage 'unstable' 'baz' 'i386' '1.0' + +setupaptarchive + +testequal 'Reading package lists... +Building dependency tree... +The following extra packages will be installed: + bar foo +Suggested packages: + baz +The following NEW packages will be installed: + apt bar foo +0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 unstable [i386]) +Conf foo (1.0 unstable [i386]) +Inst apt (0.8.15 unstable [i386]) +Conf apt (0.8.15 unstable [i386]) +Inst bar (1.0 unstable [i386]) +Conf bar (1.0 unstable [i386])' aptget install apt -s --install-recommends --no-install-suggests + + +testequal 'Reading package lists... +Building dependency tree... +The following extra packages will be installed: + bar baz foo +The following NEW packages will be installed: + apt bar baz foo +0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 unstable [i386]) +Conf foo (1.0 unstable [i386]) +Inst apt (0.8.15 unstable [i386]) +Conf apt (0.8.15 unstable [i386]) +Inst bar (1.0 unstable [i386]) +Inst baz (1.0 unstable [i386]) +Conf bar (1.0 unstable [i386]) +Conf baz (1.0 unstable [i386])' aptget install apt -s --install-recommends --install-suggests + +testequal 'Reading package lists... +Building dependency tree... +The following extra packages will be installed: + foo +Suggested packages: + baz +Recommended packages: + bar +The following NEW packages will be installed: + apt foo +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 unstable [i386]) +Conf foo (1.0 unstable [i386]) +Inst apt (0.8.15 unstable [i386]) +Conf apt (0.8.15 unstable [i386])' aptget install apt -s --no-install-recommends --no-install-suggests + +testequal 'Reading package lists... +Building dependency tree... +The following extra packages will be installed: + baz foo +Recommended packages: + bar +The following NEW packages will be installed: + apt baz foo +0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. +Inst foo (1.0 unstable [i386]) +Conf foo (1.0 unstable [i386]) +Inst apt (0.8.15 unstable [i386]) +Conf apt (0.8.15 unstable [i386]) +Inst baz (1.0 unstable [i386]) +Conf baz (1.0 unstable [i386])' aptget install apt -s --no-install-recommends --install-suggests diff --git a/test/integration/test-ubuntu-bug-835625-multiarch-lockstep-installed-first b/test/integration/test-ubuntu-bug-835625-multiarch-lockstep-installed-first new file mode 100755 index 000000000..a9a4069cf --- /dev/null +++ b/test/integration/test-ubuntu-bug-835625-multiarch-lockstep-installed-first @@ -0,0 +1,31 @@ +#!/bin/sh +set -e + +TESTDIR=$(readlink -f $(dirname $0)) +. $TESTDIR/framework +setupenvironment +configarchitecture 'amd64' 'i386' + +insertinstalledpackage 'libsame' 'i386' '1' +insertinstalledpackage 'apt' 'i386' '1' 'Depends: libsame (= 1)' + +insertpackage 'unstable' 'libsame' 'i386,amd64' '2' 'Multi-Arch: same' +insertpackage 'unstable' 'apt' 'i386' '2' 'Depends: libsame (= 2)' + +setupaptarchive + +testequal 'Reading package lists... +Building dependency tree... +The following extra packages will be installed: + apt:i386 libsame:i386 +The following NEW packages will be installed: + libsame +The following packages will be upgraded: + apt:i386 libsame:i386 +2 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst libsame:i386 [1] (2 unstable [i386]) [apt:i386 ] +Inst libsame (2 unstable [amd64]) [apt:i386 ] +Conf libsame:i386 (2 unstable [i386]) [apt:i386 ] +Conf libsame (2 unstable [amd64]) [apt:i386 ] +Inst apt:i386 [1] (2 unstable [i386]) +Conf apt:i386 (2 unstable [i386])' aptget install libsame:amd64 -s diff --git a/test/extract-control.cc b/test/interactive-helper/extract-control.cc index 29dcbf371..29dcbf371 100644 --- a/test/extract-control.cc +++ b/test/interactive-helper/extract-control.cc diff --git a/test/makefile b/test/interactive-helper/makefile index 52adb96a2..b96139fda 100644 --- a/test/makefile +++ b/test/interactive-helper/makefile @@ -1,9 +1,9 @@ # -*- make -*- -BASE=.. -SUBDIR=test +BASE=../.. +SUBDIR=test/interactive-helper # Bring in the default rules -include ../buildlib/defaults.mak +include ../../buildlib/defaults.mak # Program for testing methods PROGRAM=mthdcat @@ -11,19 +11,6 @@ SLIBS = SOURCE = mthdcat.cc include $(PROGRAM_H) -# Program for testing methods -PROGRAM=uritest -SLIBS = -lapt-pkg -SOURCE = uri.cc -include $(PROGRAM_H) - -# Scratch program to test incomplete code fragments in -PROGRAM=scratch-test -SLIBS = -lapt-inst -lapt-pkg -LIB_MAKES = apt-pkg/makefile apt-inst/makefile -SOURCE = scratch.cc -include $(PROGRAM_H) - # Version compare tester PROGRAM=testextract SLIBS = -lapt-pkg -lapt-inst @@ -31,18 +18,6 @@ LIB_MAKES = apt-pkg/makefile apt-inst/makefile SOURCE = testextract.cc include $(PROGRAM_H) -# Program for testing the config file parser -PROGRAM=conftest_clear -SLIBS = -lapt-pkg -SOURCE = conf_clear.cc -include $(PROGRAM_H) - -# Program for testing the config file parser -PROGRAM=conftest -SLIBS = -lapt-pkg -SOURCE = conf.cc -include $(PROGRAM_H) - # Program for testing the tar/deb extractor PROGRAM=testdeb SLIBS = -lapt-pkg -lapt-inst @@ -55,12 +30,6 @@ SLIBS = -lapt-pkg -lapt-inst SOURCE = extract-control.cc include $(PROGRAM_H) -# Program for testing hashes -PROGRAM=hash -SLIBS = -lapt-pkg -SOURCE = hash.cc -include $(PROGRAM_H) - # Program for testing udevcdrom PROGRAM=test_udevcdrom SLIBS = -lapt-pkg diff --git a/test/mthdcat.cc b/test/interactive-helper/mthdcat.cc index 25d09a3f5..25d09a3f5 100644 --- a/test/mthdcat.cc +++ b/test/interactive-helper/mthdcat.cc diff --git a/test/networkless-install-fixes/README b/test/interactive-helper/networkless-install-fixes/README index e7ee2b03d..e7ee2b03d 100644 --- a/test/networkless-install-fixes/README +++ b/test/interactive-helper/networkless-install-fixes/README diff --git a/test/networkless-install-fixes/sources.test.list b/test/interactive-helper/networkless-install-fixes/sources.test.list index 380e1804d..380e1804d 100644 --- a/test/networkless-install-fixes/sources.test.list +++ b/test/interactive-helper/networkless-install-fixes/sources.test.list diff --git a/test/networkless-install-fixes/test.sh b/test/interactive-helper/networkless-install-fixes/test.sh index 809d467ba..809d467ba 100755 --- a/test/networkless-install-fixes/test.sh +++ b/test/interactive-helper/networkless-install-fixes/test.sh diff --git a/test/rpmver.cc b/test/interactive-helper/rpmver.cc index 9fc807de8..9fc807de8 100644 --- a/test/rpmver.cc +++ b/test/interactive-helper/rpmver.cc diff --git a/test/test_udevcdrom.cc b/test/interactive-helper/test_udevcdrom.cc index e65c7a297..dc25ab357 100644 --- a/test/test_udevcdrom.cc +++ b/test/interactive-helper/test_udevcdrom.cc @@ -4,14 +4,13 @@ int main() { - int i; pkgUdevCdromDevices c; assert(c.Dlopen()); vector<CdromDevice> l; l = c.Scan(); - assert(l.size() > 0); - for (i=0;i<l.size();i++) + assert(l.empty() == false); + for (size_t i = 0; i < l.size(); ++i) std::cerr << l[i].DeviceName << " " << l[i].Mounted << " " << l[i].MountPath << std::endl; diff --git a/test/testdeb.cc b/test/interactive-helper/testdeb.cc index d28f20114..d28f20114 100644 --- a/test/testdeb.cc +++ b/test/interactive-helper/testdeb.cc diff --git a/test/testextract.cc b/test/interactive-helper/testextract.cc index b790df618..b790df618 100644 --- a/test/testextract.cc +++ b/test/interactive-helper/testextract.cc diff --git a/test/libapt/assert.h b/test/libapt/assert.h index 5da76ae0a..fae9b6c64 100644 --- a/test/libapt/assert.h +++ b/test/libapt/assert.h @@ -1,9 +1,9 @@ #include <iostream> -#define equals(x,y) assertEquals(x, y, __LINE__) +#define equals(x,y) assertEquals(y, x, __LINE__) template < typename X, typename Y > -void OutputAssert(X expect, char const* compare, Y get, unsigned long const &line) { +void OutputAssertEqual(X expect, char const* compare, Y get, unsigned long const &line) { std::cerr << "Test FAILED: »" << expect << "« " << compare << " »" << get << "« at line " << line << std::endl; } @@ -11,11 +11,53 @@ template < typename X, typename Y > void assertEquals(X expect, Y get, unsigned long const &line) { if (expect == get) return; - OutputAssert(expect, "==", get, line); + OutputAssertEqual(expect, "==", get, line); } void assertEquals(unsigned int const &expect, int const &get, unsigned long const &line) { if (get < 0) - OutputAssert(expect, "==", get, line); + OutputAssertEqual(expect, "==", get, line); assertEquals<unsigned int const&, unsigned int const&>(expect, get, line); } + +void assertEquals(int const &expect, unsigned int const &get, unsigned long const &line) { + if (expect < 0) + OutputAssertEqual(expect, "==", get, line); + assertEquals<unsigned int const&, unsigned int const&>(expect, get, line); +} + + +#define equalsOr2(x,y,z) assertEqualsOr2(y, z, x, __LINE__) + +template < typename X, typename Y > +void OutputAssertEqualOr2(X expect1, X expect2, char const* compare, Y get, unsigned long const &line) { + std::cerr << "Test FAILED: »" << expect1 << "« or »" << expect2 << "« " << compare << " »" << get << "« at line " << line << std::endl; +} + +template < typename X, typename Y > +void assertEqualsOr2(X expect1, X expect2, Y get, unsigned long const &line) { + if (expect1 == get || expect2 == get) + return; + OutputAssertEqualOr2(expect1, expect2, "==", get, line); +} + +void assertEqualsOr2(unsigned int const &expect1, unsigned int const &expect2, int const &get, unsigned long const &line) { + if (get < 0) + OutputAssertEqualOr2(expect1, expect2, "==", get, line); + assertEqualsOr2<unsigned int const&, unsigned int const&>(expect1, expect2, get, line); +} + +void assertEqualsOr2(int const &expect1, int const &expect2, unsigned int const &get, unsigned long const &line) { + if (expect1 < 0 && expect2 < 0) + OutputAssertEqualOr2(expect1, expect2, "==", get, line); + assertEqualsOr2<unsigned int const&, unsigned int const&>(expect1, expect2, get, line); +} + + +// simple helper to quickly output a vectors +template < typename X > +void dumpVector(X vec) { + for (typename X::const_iterator v = vec.begin(); + v != vec.end(); ++v) + std::cout << *v << std::endl; +} diff --git a/test/libapt/compareversion_test.cc b/test/libapt/compareversion_test.cc index b6213e84c..fdb1d5674 100644 --- a/test/libapt/compareversion_test.cc +++ b/test/libapt/compareversion_test.cc @@ -63,6 +63,9 @@ void assertVersion(int const &CurLine, string const &A, string const &B, int con bool RunTest(const char *File) { + if (FileExists(File) == false) + return _error->Error("Versiontestfile %s doesn't exist!", File); + ifstream F(File,ios::in); if (!F != 0) return false; @@ -112,8 +115,8 @@ bool RunTest(const char *File) int main(int argc, char *argv[]) { - if (argc <= 1) - RunTest("../versions.lst"); + if (argc != 2) + return 1; else RunTest(argv[1]); diff --git a/test/libapt/configuration_test.cc b/test/libapt/configuration_test.cc new file mode 100644 index 000000000..5b23d17fb --- /dev/null +++ b/test/libapt/configuration_test.cc @@ -0,0 +1,78 @@ +#include <apt-pkg/configuration.h> + +#include <string> +#include <vector> + +#include "assert.h" + +int main(int argc,const char *argv[]) { + Configuration Cnf; + std::vector<std::string> fds; + + Cnf.Set("APT::Keep-Fds::",28); + Cnf.Set("APT::Keep-Fds::",17); + Cnf.Set("APT::Keep-Fds::2",47); + Cnf.Set("APT::Keep-Fds::","broken"); + fds = Cnf.FindVector("APT::Keep-Fds"); + equals(fds[0], "28"); + equals(fds[1], "17"); + equals(fds[2], "47"); + equals(fds[3], "broken"); + equals(fds.size(), 4); + equals(Cnf.Exists("APT::Keep-Fds::2"), true); + equals(Cnf.Find("APT::Keep-Fds::2"), "47"); + equals(Cnf.FindI("APT::Keep-Fds::2"), 47); + equals(Cnf.Exists("APT::Keep-Fds::3"), false); + equals(Cnf.Find("APT::Keep-Fds::3"), ""); + equals(Cnf.FindI("APT::Keep-Fds::3", 56), 56); + equals(Cnf.Find("APT::Keep-Fds::3", "not-set"), "not-set"); + + Cnf.Clear("APT::Keep-Fds::2"); + fds = Cnf.FindVector("APT::Keep-Fds"); + equals(fds[0], "28"); + equals(fds[1], "17"); + equals(fds[2], ""); + equals(fds[3], "broken"); + equals(fds.size(), 4); + equals(Cnf.Exists("APT::Keep-Fds::2"), true); + + Cnf.Clear("APT::Keep-Fds",28); + fds = Cnf.FindVector("APT::Keep-Fds"); + equals(fds[0], "17"); + equals(fds[1], ""); + equals(fds[2], "broken"); + equals(fds.size(), 3); + + Cnf.Clear("APT::Keep-Fds",""); + equals(Cnf.Exists("APT::Keep-Fds::2"), false); + + Cnf.Clear("APT::Keep-Fds",17); + Cnf.Clear("APT::Keep-Fds","broken"); + fds = Cnf.FindVector("APT::Keep-Fds"); + equals(fds.empty(), true); + + Cnf.Set("APT::Keep-Fds::",21); + Cnf.Set("APT::Keep-Fds::",42); + fds = Cnf.FindVector("APT::Keep-Fds"); + equals(fds[0], "21"); + equals(fds[1], "42"); + equals(fds.size(), 2); + + Cnf.Clear("APT::Keep-Fds"); + fds = Cnf.FindVector("APT::Keep-Fds"); + equals(fds.empty(), true); + + Cnf.CndSet("APT::Version", 42); + Cnf.CndSet("APT::Version", "66"); + equals(Cnf.Find("APT::Version"), "42"); + equals(Cnf.FindI("APT::Version"), 42); + equals(Cnf.Find("APT::Version", "33"), "42"); + equals(Cnf.FindI("APT::Version", 33), 42); + equals(Cnf.Find("APT2::Version", "33"), "33"); + equals(Cnf.FindI("APT2::Version", 33), 33); + + //FIXME: Test for configuration file parsing; + // currently only integration/ tests test them implicitly + + return 0; +} diff --git a/test/libapt/getarchitectures_test.cc b/test/libapt/getarchitectures_test.cc index 1500caeed..807469263 100644 --- a/test/libapt/getarchitectures_test.cc +++ b/test/libapt/getarchitectures_test.cc @@ -7,13 +7,6 @@ #include <iostream> -// simple helper to quickly output a vector of strings -void dumpVector(std::vector<std::string> vec) { - for (std::vector<std::string>::const_iterator v = vec.begin(); - v != vec.end(); v++) - std::cout << *v << std::endl; -} - int main(int argc,char *argv[]) { std::vector<std::string> vec; @@ -39,6 +32,12 @@ int main(int argc,char *argv[]) _config->Set("APT::Architecture", "armel"); vec = APT::Configuration::getArchitectures(false); equals(vec.size(), 2); + equals(vec[0], "armel"); + equals(vec[1], "i386"); + + _config->Set("APT::Architectures::2", "armel"); + vec = APT::Configuration::getArchitectures(false); + equals(vec.size(), 2); equals(vec[0], "i386"); equals(vec[1], "armel"); diff --git a/test/libapt/getlanguages_test.cc b/test/libapt/getlanguages_test.cc index 707142aef..f6aa7a697 100644 --- a/test/libapt/getlanguages_test.cc +++ b/test/libapt/getlanguages_test.cc @@ -7,13 +7,6 @@ #include <iostream> -// simple helper to quickly output a vector of strings -void dumpVector(std::vector<std::string> vec) { - for (std::vector<std::string>::const_iterator v = vec.begin(); - v != vec.end(); v++) - std::cout << *v << std::endl; -} - int main(int argc,char *argv[]) { if (argc != 2) { @@ -138,8 +131,8 @@ int main(int argc,char *argv[]) equals(vec[1], "de"); equals(vec[2], "en"); equals(vec[3], "none"); - equals(vec[4], "pt"); - equals(vec[5], "tr"); + equalsOr2(vec[4], "pt", "tr"); + equalsOr2(vec[5], "tr", "pt"); _config->Set("Dir::State::lists", "/non-existing-dir"); _config->Set("Acquire::Languages::1", "none"); diff --git a/test/libapt/getlistoffilesindir_test.cc b/test/libapt/getlistoffilesindir_test.cc index ed8d2dad6..5ee014cca 100644 --- a/test/libapt/getlistoffilesindir_test.cc +++ b/test/libapt/getlistoffilesindir_test.cc @@ -7,13 +7,6 @@ #include <stdio.h> #include <iostream> -// simple helper to quickly output a vector of strings -void dumpVector(std::vector<std::string> vec) { - for (std::vector<std::string>::const_iterator v = vec.begin(); - v != vec.end(); v++) - std::cout << *v << std::endl; -} - #define P(x) string(argv[1]).append("/").append(x) int main(int argc,char *argv[]) diff --git a/test/libapt/globalerror_test.cc b/test/libapt/globalerror_test.cc index 7d933f5a8..5d27414f9 100644 --- a/test/libapt/globalerror_test.cc +++ b/test/libapt/globalerror_test.cc @@ -101,7 +101,7 @@ int main(int argc,char *argv[]) longText.clear(); for (size_t i = 0; i < 50; ++i) longText.append("РезийбёбAZ"); - equals(_error->Warning(longText.c_str()), false); + equals(_error->Warning("%s", longText.c_str()), false); equals(_error->PopMessage(text), false); equals(text, longText); diff --git a/test/libapt/hashsums_test.cc b/test/libapt/hashsums_test.cc new file mode 100644 index 000000000..2cb71cc38 --- /dev/null +++ b/test/libapt/hashsums_test.cc @@ -0,0 +1,156 @@ +#include <apt-pkg/md5.h> +#include <apt-pkg/sha1.h> +#include <apt-pkg/sha2.h> +#include <apt-pkg/strutl.h> +#include <apt-pkg/hashes.h> +#include <iostream> + +#include <stdio.h> + +#include "assert.h" + +template <class T> void Test(const char *In,const char *Out) +{ + T Sum; + Sum.Add(In); + equals(Sum.Result().Value(), Out); +} + +template <class T> void TestMill(const char *Out) +{ + T Sum; + + const unsigned char As[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + unsigned Count = 1000000; + for (; Count != 0;) + { + if (Count >= 64) + { + Sum.Add(As,64); + Count -= 64; + } + else + { + Sum.Add(As,Count); + Count = 0; + } + } + + if (stringcasecmp(Sum.Result().Value(), Out) != 0) + abort(); +} + +int main(int argc, char** argv) +{ + // From FIPS PUB 180-1 + Test<SHA1Summation>("","da39a3ee5e6b4b0d3255bfef95601890afd80709"); + Test<SHA1Summation>("abc","a9993e364706816aba3e25717850c26c9cd0d89d"); + Test<SHA1Summation>("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "84983e441c3bd26ebaae4aa1f95129e5e54670f1"); + TestMill<SHA1Summation>("34aa973cd4c4daa4f61eeb2bdbad27316534016f"); + + // MD5 tests from RFC 1321 + Test<MD5Summation>("","d41d8cd98f00b204e9800998ecf8427e"); + Test<MD5Summation>("a","0cc175b9c0f1b6a831c399e269772661"); + Test<MD5Summation>("abc","900150983cd24fb0d6963f7d28e17f72"); + Test<MD5Summation>("message digest","f96b697d7cb7938d525a2f31aaf161d0"); + Test<MD5Summation>("abcdefghijklmnopqrstuvwxyz","c3fcd3d76192e4007dfb496cca67e13b"); + Test<MD5Summation>("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "d174ab98d277d9f5a5611c2c9f419d9f"); + Test<MD5Summation>("12345678901234567890123456789012345678901234567890123456789012345678901234567890", + "57edf4a22be3c955ac49da2e2107b67a"); + + // SHA-256, From FIPS 180-2 + Test<SHA256Summation>("", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); + Test<SHA256Summation>("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"); + + // SHA-512 + Test<SHA512Summation>("", + "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce" + "47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"); + Test<SHA512Summation>( + "abc", + "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a" + "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f"); + + + Test<MD5Summation>("The quick brown fox jumps over the lazy dog", "9e107d9d372bb6826bd81d3542a419d6"); + Test<MD5Summation>("The quick brown fox jumps over the lazy dog.", "e4d909c290d0fb1ca068ffaddf22cbd0"); + Test<SHA1Summation>("The quick brown fox jumps over the lazy dog", "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12"); + Test<SHA1Summation>("The quick brown fox jumps over the lazy cog", "de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3"); + Test<SHA256Summation>("The quick brown fox jumps over the lazy dog", "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592"); + Test<SHA256Summation>("The quick brown fox jumps over the lazy dog.", "ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c"); + Test<SHA512Summation>("The quick brown fox jumps over the lazy dog", "07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb64" + "2e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6"); + Test<SHA512Summation>("The quick brown fox jumps over the lazy dog.", "91ea1245f20d46ae9a037a989f54f1f790f0a47607eeb8a14d12890cea77a1bb" + "c6c7ed9cf205e67b7f2b8fd4c7dfd3a7a8617e45f3c463d481c7e586c39ac1ed"); + + FILE* fd = fopen(argv[1], "r"); + if (fd == NULL) { + std::cerr << "Can't open file for 1. testing: " << argv[1] << std::endl; + return 1; + } + { + Hashes hashes; + hashes.AddFD(fileno(fd)); + equals(argv[2], hashes.MD5.Result().Value()); + equals(argv[3], hashes.SHA1.Result().Value()); + equals(argv[4], hashes.SHA256.Result().Value()); + equals(argv[5], hashes.SHA512.Result().Value()); + } + fseek(fd, 0L, SEEK_END); + unsigned long sz = ftell(fd); + fseek(fd, 0L, SEEK_SET); + { + Hashes hashes; + hashes.AddFD(fileno(fd), sz); + equals(argv[2], hashes.MD5.Result().Value()); + equals(argv[3], hashes.SHA1.Result().Value()); + equals(argv[4], hashes.SHA256.Result().Value()); + equals(argv[5], hashes.SHA512.Result().Value()); + } + fseek(fd, 0L, SEEK_SET); + { + MD5Summation md5; + md5.AddFD(fileno(fd)); + equals(argv[2], md5.Result().Value()); + } + fseek(fd, 0L, SEEK_SET); + { + SHA1Summation sha1; + sha1.AddFD(fileno(fd)); + equals(argv[3], sha1.Result().Value()); + } + fseek(fd, 0L, SEEK_SET); + { + SHA256Summation sha2; + sha2.AddFD(fileno(fd)); + equals(argv[4], sha2.Result().Value()); + } + fseek(fd, 0L, SEEK_SET); + { + SHA512Summation sha2; + sha2.AddFD(fileno(fd)); + equals(argv[5], sha2.Result().Value()); + } + fclose(fd); + + // test HashString code + { + HashString sha2("SHA256", argv[4]); + equals(sha2.VerifyFile(argv[1]), true); + } + { + HashString sha2("SHA512", argv[5]); + equals(sha2.VerifyFile(argv[1]), true); + } + { + HashString sha2("SHA256:"+string(argv[4])); + equals(sha2.VerifyFile(argv[1]), true); + } + + return 0; +} + + diff --git a/test/libapt/makefile b/test/libapt/makefile index 50058262e..d3dddaeed 100644 --- a/test/libapt/makefile +++ b/test/libapt/makefile @@ -6,6 +6,10 @@ BASENAME=_libapt_test # Bring in the default rules include ../../buildlib/defaults.mak +.PHONY: test +test: + ./run-tests + # Program for testing getLanguageCode PROGRAM = getLanguages${BASENAME} SLIBS = -lapt-pkg @@ -46,3 +50,27 @@ PROGRAM = GlobalError${BASENAME} SLIBS = -lapt-pkg SOURCE = globalerror_test.cc include $(PROGRAM_H) + +# test the different Hashsum classes +PROGRAM = HashSums${BASENAME} +SLIBS = -lapt-pkg +SOURCE = hashsums_test.cc +include $(PROGRAM_H) + +# test the strutils stuff +PROGRAM = StrUtil${BASENAME} +SLIBS = -lapt-pkg +SOURCE = strutil_test.cc +include $(PROGRAM_H) + +# test the URI parsing stuff +PROGRAM = URI${BASENAME} +SLIBS = -lapt-pkg +SOURCE = uri_test.cc +include $(PROGRAM_H) + +# test the Configuration class +PROGRAM = Configuration${BASENAME} +SLIBS = -lapt-pkg +SOURCE = configuration_test.cc +include $(PROGRAM_H) diff --git a/test/libapt/run-tests b/test/libapt/run-tests index 4b71c2097..8cb2e049c 100755 --- a/test/libapt/run-tests +++ b/test/libapt/run-tests @@ -3,19 +3,32 @@ set -e DIR=$(readlink -f $(dirname $0)) echo "Compiling the tests …" -test -d "$DIR/../../build/obj/test/libapt/" || mkdir -p "$DIR/../../build/obj/test/libapt/" (cd $DIR && make) echo "Running all testcases …" LDPATH="$DIR/../../build/bin" EXT="_libapt_test" + +# detect if output is on a terminal (colorful) or better not +if expr match "$(readlink -f /proc/$$/fd/1)" '/dev/pts/[0-9]\+' > /dev/null; then + COLHIGH='\033[1;35m' + COLRESET='\033[0m' + TESTOKAY='\033[1;32mOKAY\033[0m' + TESTFAIL='\033[1;31mFAILED\033[0m' +else + COLHIGH='' + COLRESET='' + TESTOKAY='OK' + TESTFAIL='###FAILED###' +fi + for testapp in $(ls ${LDPATH}/*$EXT) do name=$(basename ${testapp}) + NAME="${COLHIGH}${name}${COLRESET}" tmppath="" if [ $name = "GetListOfFilesInDir${EXT}" ]; then # TODO: very-low: move env creation to the actual test-app - echo "Prepare Testarea for \033[1;35m$name\033[0m ..." tmppath=$(mktemp -d) touch "${tmppath}/anormalfile" \ "${tmppath}/01yet-anothernormalfile" \ @@ -47,20 +60,26 @@ do ln -s "${tmppath}/anormalfile" "${tmppath}/linkedfile.list" ln -s "${tmppath}/non-existing-file" "${tmppath}/brokenlink.list" elif [ $name = "getLanguages${EXT}" ]; then - echo "Prepare Testarea for \033[1;35m$name\033[0m ..." tmppath=$(mktemp -d) touch "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-tr" \ "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-pt" \ "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-se~" \ "${tmppath}/ftp.de.debian.org_debian_dists_sid_main_i18n_Translation-st.bak" + elif [ $name = "HashSums${EXT}" ]; then + TMP="$(mktemp)" + dmesg > $TMP + echo -n "Testing with \033[1;35m${name}\033[0m ... " + LD_LIBRARY_PATH=${LDPATH} ${testapp} $TMP $(md5sum $TMP | cut -d' ' -f 1) $(sha1sum $TMP | cut -d' ' -f 1) $(sha256sum $TMP | cut -d' ' -f 1) $(sha512sum $TMP | cut -d' ' -f 1) && echo "\033[1;32mOKAY\033[0m" || echo "\033[1;31mFAILED\033[0m" + rm $TMP + continue + elif [ $name = "CompareVersion${EXT}" ]; then + tmppath="${DIR}/versions.lst" fi - echo -n "Testing with \033[1;35m${name}\033[0m ... " - LD_LIBRARY_PATH=${LDPATH} ${testapp} ${tmppath} && echo "\033[1;32mOKAY\033[0m" || echo "\033[1;31mFAILED\033[0m" + echo -n "Testing with ${NAME} " + LD_LIBRARY_PATH=${LDPATH} ${testapp} ${tmppath} && echo "$TESTOKAY" || echo "$TESTFAIL" if [ -n "$tmppath" -a -d "$tmppath" ]; then - echo "Cleanup Testarea after \033[1;35m$name\033[0m ..." rm -rf "$tmppath" fi - done diff --git a/test/libapt/strutil_test.cc b/test/libapt/strutil_test.cc new file mode 100644 index 000000000..af6eb2cc6 --- /dev/null +++ b/test/libapt/strutil_test.cc @@ -0,0 +1,46 @@ +#include <apt-pkg/strutl.h> + +#include "assert.h" + +int main(int argc,char *argv[]) +{ + string input, output, expected; + + // no input + input = "foobar"; + expected = "foobar"; + output = DeEscapeString(input); + equals(output, expected); + + // hex and octal + input = "foo\\040bar\\x0abaz"; + expected = "foo bar\nbaz"; + output = DeEscapeString(input); + equals(output, expected); + + // at the end + input = "foo\\040"; + expected = "foo "; + output = DeEscapeString(input); + equals(output, expected); + + // double escape + input = "foo\\\\ x"; + expected = "foo\\ x"; + output = DeEscapeString(input); + equals(output, expected); + + // double escape at the end + input = "\\\\foo\\\\"; + expected = "\\foo\\"; + output = DeEscapeString(input); + equals(output, expected); + + // the string that we actually need it for + input = "/media/Ubuntu\\04011.04\\040amd64"; + expected = "/media/Ubuntu 11.04 amd64"; + output = DeEscapeString(input); + equals(output, expected); + + return 0; +} diff --git a/test/libapt/uri_test.cc b/test/libapt/uri_test.cc new file mode 100644 index 000000000..99bb3067e --- /dev/null +++ b/test/libapt/uri_test.cc @@ -0,0 +1,112 @@ +#include <apt-pkg/strutl.h> + +#include "assert.h" + +int main() { + // Basic stuff + { + URI U("http://www.debian.org:90/temp/test"); + equals("http", U.Access); + equals("", U.User); + equals("", U.Password); + equals(90, U.Port); + equals("www.debian.org", U.Host); + equals("/temp/test", U.Path); + } { + URI U("http://jgg:foo@ualberta.ca/blah"); + equals("http", U.Access); + equals("jgg", U.User); + equals("foo", U.Password); + equals(0, U.Port); + equals("ualberta.ca", U.Host); + equals("/blah", U.Path); + } { + URI U("file:/usr/bin/foo"); + equals("file", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals("", U.Host); + equals("/usr/bin/foo", U.Path); + } { + URI U("cdrom:Moo Cow Rom:/debian"); + equals("cdrom", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals("Moo Cow Rom", U.Host); + equals("/debian", U.Path); + } { + URI U("gzip:./bar/cow"); + equals("gzip", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals(".", U.Host); + equals("/bar/cow", U.Path); + } { + URI U("ftp:ftp.fr.debian.org/debian/pool/main/x/xtel/xtel_3.2.1-15_i386.deb"); + equals("ftp", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals("ftp.fr.debian.org", U.Host); + equals("/debian/pool/main/x/xtel/xtel_3.2.1-15_i386.deb", U.Path); + } + + // RFC 2732 stuff + { + URI U("http://[1080::8:800:200C:417A]/foo"); + equals("http", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals("1080::8:800:200C:417A", U.Host); + equals("/foo", U.Path); + } { + URI U("http://[::FFFF:129.144.52.38]:80/index.html"); + equals("http", U.Access); + equals("", U.User); + equals("", U.Password); + equals(80, U.Port); + equals("::FFFF:129.144.52.38", U.Host); + equals("/index.html", U.Path); + } { + URI U("http://[::FFFF:129.144.52.38:]:80/index.html"); + equals("http", U.Access); + equals("", U.User); + equals("", U.Password); + equals(80, U.Port); + equals("::FFFF:129.144.52.38:", U.Host); + equals("/index.html", U.Path); + } { + URI U("http://[::FFFF:129.144.52.38:]/index.html"); + equals("http", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals("::FFFF:129.144.52.38:", U.Host); + equals("/index.html", U.Path); + } + /* My Evil Corruption of RFC 2732 to handle CDROM names! Fun for + the whole family! */ + { + URI U("cdrom:[The Debian 1.2 disk, 1/2 R1:6]/debian/"); + equals("cdrom", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals("The Debian 1.2 disk, 1/2 R1:6", U.Host); + equals("/debian/", U.Path); + } { + URI U("cdrom:Foo Bar Cow/debian/"); + equals("cdrom", U.Access); + equals("", U.User); + equals("", U.Password); + equals(0, U.Port); + equals("Foo Bar Cow", U.Host); + equals("/debian/", U.Path); + } + + return 0; +} diff --git a/test/versions.lst b/test/libapt/versions.lst index 8dd8ebdc9..8dd8ebdc9 100644 --- a/test/versions.lst +++ b/test/libapt/versions.lst diff --git a/test/local-repo/Packages b/test/local-repo/Packages deleted file mode 100644 index fe62fc038..000000000 --- a/test/local-repo/Packages +++ /dev/null @@ -1,11 +0,0 @@ -Package: gdebi-test4 -Architecture: all -Version: 1.0 -Conflicts: apt (<= 0.1) -Filename: ./gdebi-test4.deb -Size: 2306 -MD5sum: 0952a2b4a566215e0794c7603f3fcfcc -SHA1: 318688ea2d53352a1bdb669ebd2cd4847f6c4e7c -SHA256: 35f600b57253cef807a1da7c5deb06e7821de9223842a310a77b4da87cf51e2c -Description: testpackage for gdebi - Conflicts: apt (<= 0.1) - diff --git a/test/local-repo/Packages.gz b/test/local-repo/Packages.gz Binary files differdeleted file mode 100644 index b5d528435..000000000 --- a/test/local-repo/Packages.gz +++ /dev/null diff --git a/test/local-repo/Packages.gz.save b/test/local-repo/Packages.gz.save Binary files differdeleted file mode 100644 index c73f56395..000000000 --- a/test/local-repo/Packages.gz.save +++ /dev/null diff --git a/test/local-repo/Release b/test/local-repo/Release deleted file mode 100644 index 7f206ef25..000000000 --- a/test/local-repo/Release +++ /dev/null @@ -1,13 +0,0 @@ -Date: Thu, 09 Aug 2007 10:13:06 UTC -MD5Sum: - 29f79161fafe1f0c393e7fc6ddcb99b5 338 Packages - 2f885b2ebdb77d3354ba63d8b5aad614 269 Packages.gz - d41d8cd98f00b204e9800998ecf8427e 0 Release -SHA1: - d8860d409a8b0db443fbf254e2d6afbfc9bc04a8 338 Packages - 8b668a7b730ceb4d702737a13a723959c20b67df 269 Packages.gz - da39a3ee5e6b4b0d3255bfef95601890afd80709 0 Release -SHA256: - 39aa9fc59d868a71030d24aeaa4b574d7a11a10ea79491a0881f8d755b36a06d 338 Packages - 62898623498ebf8304647db1ba2d33e4d8ec0e3e45250c2b66907c812b099297 269 Packages.gz - e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 Release diff --git a/test/local-repo/Release.gpg b/test/local-repo/Release.gpg deleted file mode 100644 index e1c309566..000000000 --- a/test/local-repo/Release.gpg +++ /dev/null @@ -1,7 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.6 (GNU/Linux) - -iD8DBQBGuui6liSD4VZixzQRApSlAJ9D6G1QXvtXH1jH1I4SStsb1VsImQCbBPfp -+1p0bDANcBVY+GckjJvFRkY= -=a0AR ------END PGP SIGNATURE----- diff --git a/test/local-repo/gdebi-test4.deb b/test/local-repo/gdebi-test4.deb Binary files differdeleted file mode 100644 index 9eb92d1b4..000000000 --- a/test/local-repo/gdebi-test4.deb +++ /dev/null diff --git a/test/pre-upload-check.py b/test/pre-upload-check.py deleted file mode 100755 index f9da8f941..000000000 --- a/test/pre-upload-check.py +++ /dev/null @@ -1,266 +0,0 @@ -#!/usr/bin/python - -import sys -import os -import glob -import os.path -import shutil -import time -from subprocess import call, PIPE - -import unittest - -stdout = os.open("/dev/null",0) #sys.stdout -stderr = os.open("/dev/null",0) # sys.stderr - -apt_args = [] -#apt_args = ["-o","Debug::pkgAcquire::Auth=true"] - -class testAptAuthenticationReliability(unittest.TestCase): - """ - test if the spec https://wiki.ubuntu.com/AptAuthenticationReliability - is properly implemented - """ - #apt = "../bin/apt-get" - apt = "apt-get" - - def setUp(self): - if os.path.exists("/tmp/autFailure"): - os.unlink("/tmp/authFailure"); - if os.path.exists("/tmp/autFailure2"): - os.unlink("/tmp/authFailure2"); - def testRepositorySigFailure(self): - """ - test if a repository that used to be authenticated and fails on - apt-get update refuses to update and uses the old state - """ - # copy valid signatures into lists (those are ok, even - # if the name is "-broken-" ... - for f in glob.glob("./authReliability/lists/*"): - shutil.copy(f,"/var/lib/apt/lists") - # ensure we do *not* get a I-M-S hit - os.utime("/var/lib/apt/lists/%s" % os.path.basename(f), (0,0)) - res = call([self.apt, - "update", - "-o","Dir::Etc::sourcelist=./authReliability/sources.list.failure", - "-o",'APT::Update::Auth-Failure::=touch /tmp/authFailure', - ] + apt_args, - stdout=stdout, stderr=stderr) - self.assert_(os.path.exists("/var/lib/apt/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-broken_Release.gpg"), - "The gpg file disappeared, this should not happen") - self.assert_(os.path.exists("/var/lib/apt/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-broken_Packages"), - "The Packages file disappeared, this should not happen") - self.assert_(os.path.exists("/tmp/authFailure"), - "The APT::Update::Auth-Failure script did not run (1)") - # the same with i-m-s hit this time - for f in glob.glob("./authReliability/lists/*"): - shutil.copy(f,"/var/lib/apt/lists") - os.utime("/var/lib/apt/lists/%s" % os.path.basename(f), (time.time(),time.time())) - res = call([self.apt, - "update", - "-o","Dir::Etc::sourcelist=./authReliability/sources.list.failure", - "-o",'APT::Update::Auth-Failure::=touch /tmp/authFailure2', - ] + apt_args, - stdout=stdout, stderr=stderr) - self.assert_(os.path.exists("/var/lib/apt/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-broken_Release.gpg"), - "The gpg file disappeared, this should not happen") - self.assert_(os.path.exists("/var/lib/apt/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-broken_Packages"), - "The Packages file disappeared, this should not happen") - self.assert_(os.path.exists("/tmp/authFailure2"), - "The APT::Update::Auth-Failure script did not run (2)") - def testRepositorySigGood(self): - """ - test that a regular repository with good data stays good - """ - res = call([self.apt, - "update", - "-o","Dir::Etc::sourcelist=./authReliability/sources.list.good" - ] + apt_args, - stdout=stdout, stderr=stderr) - self.assert_(os.path.exists("/var/lib/apt/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-ok_Release.gpg"), - "The gpg file disappeared after a regular download, this should not happen") - self.assert_(os.path.exists("/var/lib/apt/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-ok_Packages"), - "The Packages file disappeared, this should not happen") - # test good is still good after non I-M-S hit and a previous files in lists/ - for f in glob.glob("./authReliability/lists/*"): - shutil.copy(f,"/var/lib/apt/lists") - # ensure we do *not* get a I-M-S hit - os.utime("/var/lib/apt/lists/%s" % os.path.basename(f), (0,0)) - res = call([self.apt, - "update", - "-o","Dir::Etc::sourcelist=./authReliability/sources.list.good" - ] + apt_args, - stdout=stdout, stderr=stderr) - self.assert_(os.path.exists("/var/lib/apt/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-ok_Release.gpg"), - "The gpg file disappeared after a I-M-S hit, this should not happen") - self.assert_(os.path.exists("/var/lib/apt/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-ok_Packages"), - "The Packages file disappeared, this should not happen") - # test good is still good after I-M-S hit - for f in glob.glob("./authReliability/lists/*"): - shutil.copy(f,"/var/lib/apt/lists") - # ensure we do get a I-M-S hit - os.utime("/var/lib/apt/lists/%s" % os.path.basename(f), (time.time(),time.time())) - res = call([self.apt, - "update", - "-o","Dir::Etc::sourcelist=./authReliability/sources.list.good" - ] + apt_args, - stdout=stdout, stderr=stderr) - self.assert_(os.path.exists("/var/lib/apt/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-ok_Release.gpg"), - "The gpg file disappeared, this should not happen") - self.assert_(os.path.exists("/var/lib/apt/lists/people.ubuntu.com_%7emvo_apt_auth-test-suit_gpg-package-ok_Packages"), - "The Packages file disappeared, this should not happen") - - -class testAuthentication(unittest.TestCase): - """ - test if the authentication is working, the repository - of the test-data can be found here: - bzr get http://people.ubuntu.com/~mvo/bzr/apt/apt-auth-test-suit/ - """ - - # some class wide data - apt = "apt-get" - pkg = "libglib2.0-data" - pkgver = "2.13.6-1ubuntu1" - pkgpath = "/var/cache/apt/archives/libglib2.0-data_2.13.6-1ubuntu1_all.deb" - - def setUp(self): - for f in glob.glob("testkeys/*,key"): - call(["apt-key", "add", f], stdout=stdout, stderr=stderr) - - def _cleanup(self): - " make sure we get new lists and no i-m-s " - call(["rm","-f", "/var/lib/apt/lists/*"]) - if os.path.exists(self.pkgpath): - os.unlink(self.pkgpath) - - def _expectedRes(self, resultstr): - if resultstr == 'ok': - return 0 - elif resultstr == 'broken': - return 100 - - - def testPackages(self): - for f in glob.glob("testsources.list/sources.list*package*"): - self._cleanup() - (prefix, testtype, result) = f.split("-") - expected_res = self._expectedRes(result) - # update first - call([self.apt,"update", - "-o","Dir::Etc::sourcelist=./%s" % f]+apt_args, - stdout=stdout, stderr=stderr) - # then get the pkg - cmd = ["install", "-y", "-d", "--reinstall", - "%s=%s" % (self.pkg, self.pkgver), - "-o","Dir::state::Status=./fake-status"] - res = call([self.apt, "-o","Dir::Etc::sourcelist=./%s" % f]+cmd+apt_args, - stdout=stdout, stderr=stderr) - self.assert_(res == expected_res, - "test '%s' failed (got %s expected %s" % (f,res,expected_res)) - - - def testGPG(self): - for f in glob.glob("testsources.list/sources.list*gpg*"): - self._cleanup() - (prefix, testtype, result) = f.split("-") - expected_res = self._expectedRes(result) - # update first - call([self.apt,"update", - "-o","Dir::Etc::sourcelist=./%s" % f]+apt_args, - stdout=stdout, stderr=stderr) - cmd = ["install", "-y", "-d", "--reinstall", - "%s=%s" % (self.pkg, self.pkgver), - "-o","Dir::state::Status=./fake-status"] - res = call([self.apt, "-o","Dir::Etc::sourcelist=./%s" % f]+ - cmd+apt_args, - stdout=stdout, stderr=stderr) - self.assert_(res == expected_res, - "test '%s' failed (got %s expected %s" % (f,res,expected_res)) - - def testRelease(self): - for f in glob.glob("testsources.list/sources.list*release*"): - self._cleanup() - (prefix, testtype, result) = f.split("-") - expected_res = self._expectedRes(result) - cmd = ["update"] - res = call([self.apt,"-o","Dir::Etc::sourcelist=./%s" % f]+cmd+apt_args, - stdout=stdout, stderr=stderr) - self.assert_(res == expected_res, - "test '%s' failed (got %s expected %s" % (f,res,expected_res)) - if expected_res == 0: - self.assert_(len(glob.glob("/var/lib/apt/lists/partial/*")) == 0, - "partial/ dir has leftover files: %s" % glob.glob("/var/lib/apt/lists/partial/*")) - - def testValid(self): - for f in glob.glob("testsources.list/sources.list*validuntil*"): - self._cleanup() - (prefix, testtype, result) = f.split("-") - expected_res = self._expectedRes(result) - cmd = ["update"] - res = call([self.apt,"-o","Dir::Etc::sourcelist=./%s" % f]+cmd+apt_args, - stdout=stdout, stderr=stderr) - self.assert_(res == expected_res, - "test '%s' failed (got %s expected %s" % (f,res,expected_res)) - if expected_res == 0: - self.assert_(len(glob.glob("/var/lib/apt/lists/partial/*")) == 0, - "partial/ dir has leftover files: %s" % glob.glob("/var/lib/apt/lists/partial/*")) - - -class testLocalRepositories(unittest.TestCase): - " test local repository regressions " - - repo_dir = "local-repo" - apt = "apt-get" - pkg = "gdebi-test4" - - def setUp(self): - self.repo = os.path.abspath(os.path.join(os.getcwd(), self.repo_dir)) - self.sources = os.path.join(self.repo, "sources.list") - s = open(self.sources,"w") - s.write("deb file://%s/ /\n" % self.repo) - s.close() - - def testLocalRepoAuth(self): - # two times to get at least one i-m-s hit - for i in range(2): - self.assert_(os.path.exists(self.sources)) - cmd = [self.apt,"update","-o", "Dir::Etc::sourcelist=%s" % self.sources]+apt_args - res = call(cmd, stdout=stdout, stderr=stderr) - self.assertEqual(res, 0, "local repo test failed") - self.assert_(os.path.exists(os.path.join(self.repo,"Packages.gz")), - "Packages.gz vanished from local repo") - - def testInstallFromLocalRepo(self): - apt = [self.apt,"-o", "Dir::Etc::sourcelist=%s"% self.sources]+apt_args - cmd = apt+["update"] - res = call(cmd, stdout=stdout, stderr=stderr) - self.assertEqual(res, 0) - res = call(apt+["-y","install","--reinstall",self.pkg], - stdout=stdout, stderr=stderr) - self.assert_(res == 0, - "installing %s failed (got %s)" % (self.pkg, res)) - res = call(apt+["-y","remove",self.pkg], - stdout=stdout, stderr=stderr) - self.assert_(res == 0, - "removing %s failed (got %s)" % (self.pkg, res)) - - def testPythonAptInLocalRepo(self): - import apt, apt_pkg - apt_pkg.Config.Set("Dir::Etc::sourcelist",self.sources) - cache = apt.Cache() - cache.update() - pkg = cache["apt"] - self.assert_(pkg.name == 'apt') - - - -if __name__ == "__main__": - print "Runing simple testsuit on current apt-get and libapt" - if len(sys.argv) > 1 and sys.argv[1] == "-v": - stdout = sys.stdout - stderr = sys.stderr - - # run only one for now - #unittest.main(defaultTest="testAptAuthenticationReliability") - unittest.main() diff --git a/test/scratch.cc b/test/scratch.cc deleted file mode 100644 index d638c7097..000000000 --- a/test/scratch.cc +++ /dev/null @@ -1,105 +0,0 @@ -#include <apt-pkg/dpkgdb.h> -#include <apt-pkg/debfile.h> -#include <apt-pkg/error.h> -#include <apt-pkg/configuration.h> -#include <apt-pkg/progress.h> -#include <apt-pkg/extract.h> -#include <apt-pkg/init.h> -#include <apt-pkg/fileutl.h> - -using namespace std; - -int main(int argc,char *argv[]) -{ - pkgInitConfig(*_config); - pkgInitSystem(*_config,_system); - -// cout << flNoLink(argv[1]) << endl; - -// #if 0 -/* DynamicMMap *FileMap = new DynamicMMap(MMap::Public); - pkgFLCache *FList = new pkgFLCache(*FileMap); - - char *Name = "/tmp/test"; - pkgFLCache::PkgIterator Pkg(*FList,0); - pkgFLCache::NodeIterator Node = FList->GetNode(Name,Name+strlen(Name),Pkg.Offset(),true,false); - cout << (pkgFLCache::Node *)Node << endl; - Node = FList->GetNode(Name,Name+strlen(Name),Pkg.Offset(),true,false); - cout << (pkgFLCache::Node *)Node << endl; -*/ -// #if 0 - _config->Set("Dir::State::status","/tmp/testing/status"); - - debDpkgDB Db; - - { - OpTextProgress Prog; - - if (Db.ReadyPkgCache(Prog) == false) - cerr << "Error!" << endl; - Prog.Done(); - - if (Db.ReadyFileList(Prog) == false) - cerr << "Error!" << endl; - } - - if (_error->PendingError() == true) - { - _error->DumpErrors(); - return 0; - } - -/* Db.GetFLCache().BeginDiverLoad(); - pkgFLCache::PkgIterator Pkg(Db.GetFLCache(),0); - if (Db.GetFLCache().AddDiversion(Pkg,"/usr/include/linux/kerneld.h","/usr/bin/nslookup") == false) - cerr << "Error!" << endl; - - const char *Tmp = "/usr/include/linux/kerneld.h"; - pkgFLCache::NodeIterator Nde = Db.GetFLCache().GetNode(Tmp,Tmp+strlen(Tmp),0,false,false); - map_ptrloc Loc = Nde->File; - - for (; Nde.end() == false && Nde->File == Loc; Nde++) - cout << Nde->Flags << ',' << Nde->Pointer << ',' << Nde.File() << endl; - Db.GetFLCache().FinishDiverLoad();*/ - -/* unsigned int I = 0; - pkgFLCache &Fl = Db.GetFLCache(); - while (I < Fl.HeaderP->HashSize) - { - cout << I << endl; - pkgFLCache::NodeIterator Node(Fl,Fl.NodeP + Fl.HeaderP->FileHash + I++); - if (Node->Pointer == 0) - continue; - for (; Node.end() == false; Node++) - { - cout << Node.DirN() << '/' << Node.File(); - if (Node->Flags == pkgFLCache::Node::Diversion) - cout << " (div)"; - if (Node->Flags == pkgFLCache::Node::ConfFile) - cout << " (conf)"; - cout << endl; - } - }*/ - - for (int I = 1; I < argc; I++) - { - FileFd F(argv[I],FileFd::ReadOnly); - debDebFile Deb(F); - - if (Deb.ExtractControl(Db) == false) - cerr << "Error!" << endl; - cout << argv[I] << endl; - - pkgCache::VerIterator Ver = Deb.MergeControl(Db); - if (Ver.end() == true) - cerr << "Failed" << endl; - else - cout << Ver.ParentPkg().Name() << ' ' << Ver.VerStr() << endl; - - pkgExtract Extract(Db.GetFLCache(),Ver); - Deb.ExtractArchive(Extract); - } -// #endif -//#endif - _error->DumpErrors(); -} diff --git a/test/test-indexes.sh b/test/test-indexes.sh deleted file mode 100755 index 50d54f691..000000000 --- a/test/test-indexes.sh +++ /dev/null @@ -1,235 +0,0 @@ -#!/bin/sh -e - -# Test behaviour of index retrieval and usage, in particular with uncompressed -# and gzip compressed indexes. -# Author: Martin Pitt <martin.pitt@ubuntu.com> -# (C) 2010 Canonical Ltd. - -BUILDDIR=$(readlink -f $(dirname $0)/../build) - -TEST_SOURCE="http://ftp.debian.org/debian unstable contrib" -GPG_KEYSERVER=gpg-keyserver.de -# should be a small package with dependencies satisfiable in TEST_SOURCE, i. e. -# ideally no depends at all -TEST_PKG="python-psyco-doc" - -export LD_LIBRARY_PATH=$BUILDDIR/bin - -OPTS="-qq -o Dir::Bin::Methods=$BUILDDIR/bin/methods -o Debug::NoLocking=true" -DEBUG="" -#DEBUG="-o Debug::pkgCacheGen=true" -#DEBUG="-o Debug::pkgAcquire=true" -APT_GET="$BUILDDIR/bin/apt-get $OPTS $DEBUG" -APT_CACHE="$BUILDDIR/bin/apt-cache $OPTS $DEBUG" -APT_FTPARCHIVE="$BUILDDIR/bin/apt-ftparchive" - -[ -x "$BUILDDIR/bin/apt-get" ] || { - echo "please build the tree first" >&2 - exit 1 -} - -check_update() { - echo "--- apt-get update $@ (no trusted keys)" - - rm -f etc/apt/trusted.gpg etc/apt/secring.gpg - touch etc/apt/trusted.gpg etc/apt/secring.gpg - find var/lib/apt/lists/ -type f | xargs -r rm - - # first attempt should fail, no trusted GPG key - out=$($APT_GET "$@" update 2>&1) - echo "$out" | grep -q NO_PUBKEY - key=$(echo "$out" | sed -n '/NO_PUBKEY/ { s/^.*NO_PUBKEY \([[:alnum:]]\+\)$/\1/; p}') - - # get keyring - gpg -q --no-options --no-default-keyring --secret-keyring etc/apt/secring.gpg --trustdb-name etc/apt/trustdb.gpg --keyring etc/apt/trusted.gpg --primary-keyring etc/apt/trusted.gpg --keyserver $GPG_KEYSERVER --recv-keys $key - - # now it should work - echo "--- apt-get update $@ (with trusted keys)" - find var/lib/apt/lists/ -type f | xargs -r rm - $APT_GET "$@" update -} - -# if $1 == "compressed", check that we have compressed indexes, otherwise -# uncompressed ones -check_indexes() { - echo "--- only ${1:-uncompressed} index files present" - local F - if [ "$1" = "compressed" ]; then - ! test -e var/lib/apt/lists/*_Packages || F=1 - ! test -e var/lib/apt/lists/*_Sources || F=1 - test -e var/lib/apt/lists/*_Packages.gz || F=1 - test -e var/lib/apt/lists/*_Sources.gz || F=1 - else - test -e var/lib/apt/lists/*_Packages || F=1 - test -e var/lib/apt/lists/*_Sources || F=1 - ! test -e var/lib/apt/lists/*_Packages.gz || F=1 - ! test -e var/lib/apt/lists/*_Sources.gz || F=1 - fi - - if [ -n "$F" ]; then - ls -laR var/lib/apt/lists/ - exit 1 - fi -} - -# test apt-cache commands -check_cache() { - echo "--- apt-cache commands" - - $APT_CACHE show $TEST_PKG | grep -q ^Version: - # again (with cache) - $APT_CACHE show $TEST_PKG | grep -q ^Version: - rm var/cache/apt/*.bin - $APT_CACHE policy $TEST_PKG | egrep -q '500 (http://|file:/)' - # again (with cache) - $APT_CACHE policy $TEST_PKG | egrep -q '500 (http://|file:/)' - - TEST_SRC=`$APT_CACHE show $TEST_PKG | grep ^Source: | awk '{print $2}'` - rm var/cache/apt/*.bin - $APT_CACHE showsrc $TEST_SRC | grep -q ^Binary: - # again (with cache) - $APT_CACHE showsrc $TEST_SRC | grep -q ^Binary: -} - -# test apt-get install -check_install() { - echo "--- apt-get install" - - $APT_GET install -d $TEST_PKG - test -e var/cache/apt/archives/$TEST_PKG*.deb - $APT_GET clean - ! test -e var/cache/apt/archives/$TEST_PKG*.deb -} - -# test apt-get source -check_get_source() { - echo "--- apt-get source" - # quiesce: it'll complain about not being able to verify the signature - $APT_GET source $TEST_PKG >/dev/null 2>&1 - test -f $TEST_SRC_*.dsc - test -d $TEST_SRC-* - rm -r $TEST_SRC* -} - -############################################################################ -# main -############################################################################ - -echo "===== building sandbox =====" -WORKDIR=$(mktemp -d) -trap "cd /; rm -rf $WORKDIR" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM -cd $WORKDIR - -rm -fr etc var -rm -f home -ln -s /home home -mkdir -p etc/apt/preferences.d etc/apt/trusted.gpg.d etc/apt/apt.conf.d var/cache/apt/archives/partial var/lib/apt/lists/partial var/lib/dpkg -cp /etc/apt/trusted.gpg etc/apt -touch var/lib/dpkg/status -echo "deb $TEST_SOURCE" > etc/apt/sources.list -echo "deb-src $TEST_SOURCE" >> etc/apt/sources.list - -# specifying -o RootDir at the command line does not work for -# etc/apt/apt.conf.d/ since it is parsed after pkgInitConfig(); $APT_CONFIG is -# checked first, so this works -echo "RootDir \"$WORKDIR\";" > apt_config -export APT_CONFIG=`pwd`/apt_config - -echo "==== no indexes ====" -echo '--- apt-get check works without indexes' -[ -z `$APT_GET check` ] -echo '--- apt-cache policy works without indexes' -$APT_CACHE policy bash >/dev/null -echo '--- apt-cache show works without indexes' -! LC_MESSAGES=C $APT_CACHE show bash 2>&1| grep -q 'E: No packages found' - -echo "===== uncompressed indexes =====" -echo 'Acquire::GzipIndexes "false";' > etc/apt/apt.conf.d/02compress-indexes -check_update -check_indexes -check_cache -check_install -check_get_source - -echo "--- apt-get update with preexisting indexes" -$APT_GET update -check_indexes -check_cache - -echo "--- apt-get update with preexisting indexes and pdiff mode" -$APT_GET -o Acquire::PDiffs=true update -check_indexes -check_cache - -echo "===== compressed indexes (CLI option) =====" -check_update -o Acquire::GzipIndexes=true -check_indexes compressed -check_cache -check_install -check_get_source - -echo "--- apt-get update with preexisting indexes" -$APT_GET -o Acquire::GzipIndexes=true update -check_indexes compressed -check_cache - -echo "--- apt-get update with preexisting indexes and pdiff mode" -$APT_GET -o Acquire::GzipIndexes=true -o Acquire::PDiffs=true update -check_indexes compressed -check_cache - -echo "===== compressed indexes (apt.conf.d option) =====" -cat <<EOF > etc/apt/apt.conf.d/02compress-indexes -Acquire::GzipIndexes "true"; -Acquire::CompressionTypes::Order:: "gz"; -EOF - -check_update -check_indexes compressed -check_cache -check_install -check_get_source - -echo "--- apt-get update with preexisting indexes" -$APT_GET update -check_indexes compressed -check_cache - -echo "--- apt-get update with preexisting indexes and pdiff mode" -$APT_GET -o Acquire::PDiffs=true update -check_indexes compressed -check_cache - -rm etc/apt/apt.conf.d/02compress-indexes - -echo "==== apt-ftparchive ====" -mkdir arch -$APT_GET install -d $TEST_PKG -cp var/cache/apt/archives/$TEST_PKG*.deb arch/ -cd arch -$APT_GET source -d $TEST_PKG >/dev/null 2>&1 -$APT_FTPARCHIVE packages . | gzip -9 > Packages.gz -$APT_FTPARCHIVE sources . | gzip -9 > Sources.gz -cd .. - -echo "deb file://$WORKDIR/arch / -deb-src file://$WORKDIR/arch /" > etc/apt/sources.list -$APT_GET clean - -echo "==== uncompressed indexes from local file:// archive ====" -echo "--- apt-get update" -$APT_GET update -check_indexes -check_cache -check_get_source - -echo "==== compressed indexes from local file:// archive ====" -echo "--- apt-get update" -$APT_GET -o Acquire::GzipIndexes=true update -# EXFAIL: file:/ URIs currently decompress even with above option -#check_indexes compressed -check_indexes -check_cache -check_get_source - -echo "===== ALL TESTS PASSED =====" diff --git a/test/testkeys/mvo.key b/test/testkeys/mvo.key deleted file mode 100644 index e1ab50119..000000000 --- a/test/testkeys/mvo.key +++ /dev/null @@ -1,1182 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1.4.6 (GNU/Linux) - -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 -XGNZaqeIRgQTEQIABgUCPxVtRQAKCRC7VaR/yQHDPnjcAJ9es1zm1Kbba+MQpMJ/ -W7LoojAEQACg/qe/YgPY8kc3XIT3GTAxt4uU2NqIRgQTEQIABgUCPxZZigAKCRDn -yduv41bvwEH/AKDAx7U7T+mag4+nQgJt3fVtBaBotgCfUc8zZ1GoO+4nl6J16HaS -383ZMoOIRgQSEQIABgUCPxcIVwAKCRB3+BUzuw7ox4LhAJ985s36sd3XVShLnNSs -oWwBCASHuwCeMR+G2M9etc91AwWmWTAa7Cm5oyqIRgQTEQIABgUCPxZaGQAKCRD0 -tLDMeX6/q2ixAJ9s5BGe4RAXi6h8crxOe69xY8Z2UgCfa95gIjyGx/78TvCxTld1 -rN6qsQCIRgQQEQIABgUCPxe0rAAKCRBGzFxj8xilakodAJ44FYFEomCpZ8fZiY/9 -kuQaxxSvagCgulF5/z2p5KjhzG3WB/ujP+VIhSSIRgQTEQIABgUCPxfUcgAKCRBT -trgdwTzuB6pxAJ95M7TpYjim9ooeyC1t8escuno0LACeOe4iq+6JWhZcow3us448 -Duvc+IKJAQEEExECAMEFAj8Whg2GFIAAAAAAGgBjc2lnbmF0dXJlLW5vdGVzQHBl -bmd1aW4uZGUiaHR0cDovL3d3dy5wZW5ndWluLmRlL35iYi9jb250YWN0L3BncC9z -aWduaW5ncy9ub3Rlcy5FQTcxQjI5NjQ1OTc0RDhCMzQzRTgyMUU5NjI0ODNFMTU2 -NjJDNzM0LmFzYyIzGmh0dHA6Ly93d3cucGVuZ3Vpbi5kZS9+YmIvY29udGFjdC9w -Z3AvcG9saWN5L3YxLjEvAAoJEKseS2BGdWseknkAn1m1/xMVTIsJr18NZWVWaduY -SisWAJ9zpOZlUDvxUgygPf8qxpw/+QjhLYkB1wQTAQIAwQUCPxaF/4YUgAAAAAAa -AGNzaWduYXR1cmUtbm90ZXNAcGVuZ3Vpbi5kZSJodHRwOi8vd3d3LnBlbmd1aW4u -ZGUvfmJiL2NvbnRhY3QvcGdwL3NpZ25pbmdzL25vdGVzLkVBNzFCMjk2NDU5NzRE -OEIzNDNFODIxRTk2MjQ4M0UxNTY2MkM3MzQuYXNjIjMaaHR0cDovL3d3dy5wZW5n -dWluLmRlL35iYi9jb250YWN0L3BncC9wb2xpY3kvdjEuMS8ACgkQGaJoCYg4/ZRS -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 -CRCUT8anamoLvKHtAJ0TyFAX6asPnzbpFBjLtY6bzFqeBgCeMUofVcspoa/0/YBa -A8hSD9Qd/I6IRgQTEQIABgUCPxvrDwAKCRDYDvNai7Unr5ilAJ46rCD0b3Ywssdg -c/bBBUS9kgUzkACguVCo26BCv86vOgOBe2wQr9qEPZKIRgQQEQIABgUCPyfZIgAK -CRBvI4vCT9paDCFcAJ96KZRIVSLr+IrMrYoHd/H4r/R9uQCgioG+kSWctJYlqMxo -4fatptDbM4CIRgQSEQIABgUCPyfefgAKCRCfzyzNPz5kJqT2AJ9qA0P5h9X1TZ2t -ckVTEt1NRX9ydQCeOsbIvSvlfxdI72Bbpb6Uj8k1uwaIRgQTEQIABgUCPygYAgAK -CRAEMjbrEHMZdzbaAJ9TNJBBoYV7cPOsEtIm4546RqsOgwCePRaDLbRQ+zojgFYE -0l7c5G2kacOIjQQTEQIATQUCPyjtT0YaaHR0cDovL3d3dy50cmFzaC5uZXQvfnRo -b21hc2IvY3J5cHRvL2tleXNpZ25pbmcva2V5c2lnbmluZy52ZXIxLjAudHh0AAoJ -EKR5zcRatGBq87MAn0fdtv+HO8PkzE0jwcJTFq2mBMVAAKC/cq4wlxqxRnnHq0QB -vHPbR1ZKv4kBYwQTAQIATQUCPyjtWUYaaHR0cDovL3d3dy50cmFzaC5uZXQvfnRo -b21hc2IvY3J5cHRvL2tleXNpZ25pbmcva2V5c2lnbmluZy52ZXIxLjAudHh0AAoJ -EPl8+eM6S39dX/sH/3xKPJriQO+GAhgL206tg3CC0HD7szn4zstqcokgLuIDhnBU -dnEHq8RH5Cm9y31wfSJBhs3dhJD6cLEBKxZmO05T2eklYeGyhRzL2MH7PAj5oIHx -Xds7ue9k1OJbBlEugj0SQaO3twWv8DM68ynpSV89r7vYQXDIB+rDJBSUy38f2Sf6 -QEf31nThMgOo3zxg0HTnFqTZxF/Zxl+qXb29g/LIVo9Ro95AI62DDLbeBbo3ofX6 -pb9+iLLBO7gEp+jzLYWITpbS3yG3N+3kxJUSxHFkTVVnKUWdkkF2ba5VcdWOU8h0 -qCjds6Bd6AL9r1d9+OTAGNJo1/hKJmHB5i71HAmIjQQTEQIATQUCPyjtZEYaaHR0 -cDovL3d3dy50cmFzaC5uZXQvfnRob21hc2IvY3J5cHRvL2tleXNpZ25pbmcva2V5 -c2lnbmluZy52ZXIxLjAudHh0AAoJEHkFdo91hPXYWbwAn0wIO2rpKpKPbfLlYPLR -qogcYL7MAJ43Jo7qeNvX7+R1Y2egJKUMtJv/GIhGBBMRAgAGBQI/KO1zAAoJEPnQ -FPA4yYWN1J0An2MMMdigRu72LLgPs9y+N/OcBo53AKDR4YObuiiSusq05/0/IpRP -SpyFUohGBBMRAgAGBQI/KO1+AAoJEF0Pf0ng5J80GzgAoOw2yq4lnPopbXJT7NbT -SzYUdQhpAKD5nJtD1PBQfMEWX7+E9Q2eeq5LMIicBBMBAgAGBQI/KO2JAAoJEBuw -i78qkjIl634EAI1vXWW3JV4mRLWURiatAXE6ELl1t6zkcacP+VfsSpABqKw+/6Ga -rnpnS4/9Eg4RC9F1uHcx3HrZiWoJMdrmJX89QHuCF7t4d7DJk9HOSlL3LkGCe9m+ -Z1rflATrtr1MykMly8P2w8GeEsegeP/qpXA5M0IT5R5Ydq8/bcDayvBXiEYEExEC -AAYFAj8tVsEACgkQLJg+WtKKVdaquQCg1IXH52P/zc3SAg2BS9fwUrFfT6sAoLLv -pZMGtQr4Ls1ENx1vLn2/5tYSiEYEEhECAAYFAj8ueAkACgkQEgljnRFKqFzSIACg -4Czty3NmmCDd7ZytqaDYpnluyZQAoNXXygq5k5mFRSrYBNbKLQ2pTmcpiEYEExEC -AAYFAj8tjjgACgkQTvSphPLKucgE6gCgh9l3Htk/cN9inNeozu2BxwCVnTcAn34l -GxnITs3t11dr5fgeWntxWojQiEYEExECAAYFAj8zVvQACgkQyg4WnCj6OIrOcwCf -WFi3qRdARzOjOzHc7e3wkE2Y1HIAn0sI6DnpFArA2q0B4+QATJtwNWNYiEYEEhEC -AAYFAj8fL+EACgkQ2tp5zXiKP0wi6gCfZqoOI9vrerzDqwaHpusmhWZNHf4AoLxr -H4N+VDTFpyf2fcF6kOjTdOI8iEYEExECAAYFAj85JnEACgkQRcAhR2mr3VTtWgCf -RkvdJ+JLLABz0Rf8jUElesJAKg4An0T9vtCGack3TYp20xrkVjB1Y5E5iI4EExEC -AE4FAj8fB3FHGmh0dHA6Ly93d3cubWF0aGVtYXRpay51bmktYmllbGVmZWxkLmRl -L35tbXV0ei9zaWduLXBvbGljeS0yMDAzLTA3Lmh0bWwACgkQ3oWD+L2/6Dit8ACf -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 -RQAKCRC7VaR/yQHDPgwwAKDDo5Oczmfsy/K+rNhp0EdN8tTpYQCgyJyfezJ3lACl -gkZe3KJSjcWvsI6IRgQTEQIABgUCPxZZiQAKCRDnyduv41bvwB61AJ9WP2XS6gBZ -e8fgWb0oSNupfrL1TwCgvDsfeZ8+228+PuOBa9EmPqn4Z8yIRgQSEQIABgUCPxcI -VgAKCRB3+BUzuw7ox3SyAJ9lEoZio+Jqvu7yDsMy0v2W9H8BrwCaAu226tR8QQgp -efrzX7CFlqUp2oCIRgQTEQIABgUCPxZaFQAKCRD0tLDMeX6/q79tAJ95QA3Y7Vha -p/yq3/sU6rGdWv1gHACdGOlr2jlePeNjyM8XP7m/aTyTA3aIRgQQEQIABgUCPxe0 -rgAKCRBGzFxj8xilarPqAJ9CVDPJRDwCTEzyxU/aXPUcD2IIQgCfUwWviRTpr4Sl -hYQSLPInA8XRL3mIRgQTEQIABgUCPxfUbwAKCRBTtrgdwTzuBxZAAKChuDlCWIgR -y0RLB43upNulVEMhPgCgy3nvJsoNNdGtApgalnD3PCtADC6JAQEEExECAMEFAj8W -hgyGFIAAAAAAGgBjc2lnbmF0dXJlLW5vdGVzQHBlbmd1aW4uZGUiaHR0cDovL3d3 -dy5wZW5ndWluLmRlL35iYi9jb250YWN0L3BncC9zaWduaW5ncy9ub3Rlcy5FQTcx -QjI5NjQ1OTc0RDhCMzQzRTgyMUU5NjI0ODNFMTU2NjJDNzM0LmFzYyIzGmh0dHA6 -Ly93d3cucGVuZ3Vpbi5kZS9+YmIvY29udGFjdC9wZ3AvcG9saWN5L3YxLjEvAAoJ -EKseS2BGdWsetVoAoKC8/BexDahmSBm6ByFHjdnUNnqjAKCnraKOQoRD9mHRkhYL -hs6Kb6B/e4kB1wQTAQIAwQUCPxaF+YYUgAAAAAAaAGNzaWduYXR1cmUtbm90ZXNA -cGVuZ3Vpbi5kZSJodHRwOi8vd3d3LnBlbmd1aW4uZGUvfmJiL2NvbnRhY3QvcGdw -L3NpZ25pbmdzL25vdGVzLkVBNzFCMjk2NDU5NzREOEIzNDNFODIxRTk2MjQ4M0Ux -NTY2MkM3MzQuYXNjIjMaaHR0cDovL3d3dy5wZW5ndWluLmRlL35iYi9jb250YWN0 -L3BncC9wb2xpY3kvdjEuMS8ACgkQGaJoCYg4/ZQoyQgAp7zbUXdSJjC99c1U2Tf8 -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 -nl2OKb0xyan4c34SAiXW7tkAnjjlXUeZ1phjKkwCOxSGpzVL2dg2iEYEExECAAYF -Aj8nsWsACgkQ5ihPJ4ZiSrvw6wCfSqPnCQUf0RCBxTHwNeXoHZLNsgoAn0mmdV02 -e4GTUkP6hcahi8uktaz4iEYEEBECAAYFAj8n2R0ACgkQbyOLwk/aWgz6EACeP7lN -/AdK/F47D/RLEj0iFa3hoUcAnitXQcHBCa2V7nsdLGgBu+0RFrTFiEYEEhECAAYF -Aj8n3nwACgkQn88szT8+ZCYVUQCeI/GFVLQVfpjbILxq3QzePIvUd54An3yCiNfm -ou1ZfGQXR9ut54CFWGZniEYEExECAAYFAj8oGAIACgkQBDI26xBzGXcQUwCeIPT4 -RnjFVbpIu9/yB90/4XxGSJ8An1Q12NxzY3nguYjjeFZwPSfhV9zliI0EExECAE0F -Aj8o7UxGGmh0dHA6Ly93d3cudHJhc2gubmV0L350aG9tYXNiL2NyeXB0by9rZXlz -aWduaW5nL2tleXNpZ25pbmcudmVyMS4wLnR4dAAKCRCkec3EWrRgatzEAJ9NnEz0 -qdxIzRMKnwzIl5bT7iO/RgCgjxUaa4hVcZzWdpiAONJGlAbQALKJAWMEEwECAE0F -Aj8o7VZGGmh0dHA6Ly93d3cudHJhc2gubmV0L350aG9tYXNiL2NyeXB0by9rZXlz -aWduaW5nL2tleXNpZ25pbmcudmVyMS4wLnR4dAAKCRD5fPnjOkt/XQzwB/wOFo/i -eiHUOP0ZyKPlt7VBeaXIAGH0xpxZi+XJ0D5PwZmHylTIdlzJ2tlulJfU3pX1dOWm -uIa1YZsuP+ai+u9dk1QkGgSe5XAYXxqzvmbec8Rxdg0gDEdp3okAhPp9NyKtkxI+ -HNi4EgqDPIqZ1GVhk6k2Z6dfDe+QesI4FA0XIq2d1NFbCPiVenBeE0O6uQxsIvnS -HRm2PFOn1rWSgkznx25Ue9QLJP2utuxSd5cSJTL3x4E5eYDY2nXsorBOi7+SAiIo -Gdoj2V4y/5kOoyqnIotEeq4IGLuIedOCrv2Vvpn5Km+VXmyJRugOygMfafuLpPan -DBbDLjWk5ySNUaYEiI0EExECAE0FAj8o7WBGGmh0dHA6Ly93d3cudHJhc2gubmV0 -L350aG9tYXNiL2NyeXB0by9rZXlzaWduaW5nL2tleXNpZ25pbmcudmVyMS4wLnR4 -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 -qlFfyUDwnQCfTTs8DO0AFWVdMrwydOYSow2cI5o= -=CfD6 ------END PGP PUBLIC KEY BLOCK----- diff --git a/test/testsources.list/sources.list.all-gpg-broken b/test/testsources.list/sources.list.all-gpg-broken deleted file mode 100644 index 110f31884..000000000 --- a/test/testsources.list/sources.list.all-gpg-broken +++ /dev/null @@ -1,2 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/gpg-package-broken/ / - diff --git a/test/testsources.list/sources.list.all-gpg-ok b/test/testsources.list/sources.list.all-gpg-ok deleted file mode 100644 index 2e9a4458a..000000000 --- a/test/testsources.list/sources.list.all-gpg-ok +++ /dev/null @@ -1,2 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/gpg-package-ok/ / - diff --git a/test/testsources.list/sources.list.all-release-broken b/test/testsources.list/sources.list.all-release-broken deleted file mode 100644 index 5e138323a..000000000 --- a/test/testsources.list/sources.list.all-release-broken +++ /dev/null @@ -1 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/all-release-broken/ / diff --git a/test/testsources.list/sources.list.all-release-ok b/test/testsources.list/sources.list.all-release-ok deleted file mode 100644 index 8bcceeee8..000000000 --- a/test/testsources.list/sources.list.all-release-ok +++ /dev/null @@ -1 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/all-release-ok/ / diff --git a/test/testsources.list/sources.list.all-validuntil-broken b/test/testsources.list/sources.list.all-validuntil-broken deleted file mode 100644 index bab59bb81..000000000 --- a/test/testsources.list/sources.list.all-validuntil-broken +++ /dev/null @@ -1 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/all-validuntil-broken/ / diff --git a/test/testsources.list/sources.list.md5-package-broken b/test/testsources.list/sources.list.md5-package-broken deleted file mode 100644 index 3ba43181e..000000000 --- a/test/testsources.list/sources.list.md5-package-broken +++ /dev/null @@ -1,2 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/md5-package-broken/ / - diff --git a/test/testsources.list/sources.list.md5-package-ok b/test/testsources.list/sources.list.md5-package-ok deleted file mode 100644 index 9bf207780..000000000 --- a/test/testsources.list/sources.list.md5-package-ok +++ /dev/null @@ -1,2 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/md5-package-ok/ / - diff --git a/test/testsources.list/sources.list.md5-release-broken b/test/testsources.list/sources.list.md5-release-broken deleted file mode 100644 index 1c8f1dd79..000000000 --- a/test/testsources.list/sources.list.md5-release-broken +++ /dev/null @@ -1 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/md5-release-broken/ / diff --git a/test/testsources.list/sources.list.md5-release-ok b/test/testsources.list/sources.list.md5-release-ok deleted file mode 100644 index f27e04f16..000000000 --- a/test/testsources.list/sources.list.md5-release-ok +++ /dev/null @@ -1 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/md5-release-ok/ / diff --git a/test/testsources.list/sources.list.sha1-release-broken b/test/testsources.list/sources.list.sha1-release-broken deleted file mode 100644 index 29a277899..000000000 --- a/test/testsources.list/sources.list.sha1-release-broken +++ /dev/null @@ -1 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/sha1-release-broken/ / diff --git a/test/testsources.list/sources.list.sha1-release-ok b/test/testsources.list/sources.list.sha1-release-ok deleted file mode 100644 index 6f95d0247..000000000 --- a/test/testsources.list/sources.list.sha1-release-ok +++ /dev/null @@ -1 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/sha1-release-ok/ / diff --git a/test/testsources.list/sources.list.sha256-package-broken b/test/testsources.list/sources.list.sha256-package-broken deleted file mode 100644 index d6d284b9c..000000000 --- a/test/testsources.list/sources.list.sha256-package-broken +++ /dev/null @@ -1,2 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/sha256-package-broken/ / - diff --git a/test/testsources.list/sources.list.sha256-package-ok b/test/testsources.list/sources.list.sha256-package-ok deleted file mode 100644 index c2d7570d1..000000000 --- a/test/testsources.list/sources.list.sha256-package-ok +++ /dev/null @@ -1,2 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/sha256-package-ok/ / - diff --git a/test/testsources.list/sources.list.sha256-release-broken b/test/testsources.list/sources.list.sha256-release-broken deleted file mode 100644 index 713a4d9c8..000000000 --- a/test/testsources.list/sources.list.sha256-release-broken +++ /dev/null @@ -1 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/sha256-release-broken/ / diff --git a/test/testsources.list/sources.list.sha256-release-ok b/test/testsources.list/sources.list.sha256-release-ok deleted file mode 100644 index 93b44e366..000000000 --- a/test/testsources.list/sources.list.sha256-release-ok +++ /dev/null @@ -1 +0,0 @@ -deb http://people.ubuntu.com/~mvo/apt/auth-test-suit/sha256-release-ok/ / diff --git a/test/uri.cc b/test/uri.cc deleted file mode 100644 index ae9dc9d05..000000000 --- a/test/uri.cc +++ /dev/null @@ -1,34 +0,0 @@ -#include <apt-pkg/strutl.h> -#include <stdio.h> - -void Test(const char *Foo) -{ - URI U(Foo); - - printf("%s a='%s' u='%s' p='%s' port='%u'\n h='%s' p='%s'\n", - Foo,U.Access.c_str(),U.User.c_str(),U.Password.c_str(), - U.Port,U.Host.c_str(),U.Path.c_str()); -} - -int main() -{ - // Basic stuff - Test("http://www.debian.org:90/temp/test"); - Test("http://jgg:foo@ualberta.ca/blah"); - Test("file:/usr/bin/foo"); - Test("cdrom:Moo Cow Rom:/debian"); - Test("gzip:./bar/cow"); - - // RFC 2732 stuff - Test("http://[1080::8:800:200C:417A]/foo"); - Test("http://[::FFFF:129.144.52.38]:80/index.html"); - Test("http://[::FFFF:129.144.52.38:]:80/index.html"); - Test("http://[::FFFF:129.144.52.38:]/index.html"); - - /* My Evil Corruption of RFC 2732 to handle CDROM names! Fun for - the whole family! */ - Test("cdrom:[The Debian 1.2 disk, 1/2 R1:6]/debian/"); - Test("cdrom:Foo Bar Cow/debian/"); - - Test("ftp:ftp.fr.debian.org/debian/pool/main/x/xtel/xtel_3.2.1-15_i386.deb"); -} |