From 02f6a9b4e5f8239e0dfa64ba79e426005a5dec56 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Fri, 5 Oct 2018 12:29:39 +0200 Subject: Set DPKG_FRONTEND_LOCKED when running {pre,post}-invoke scripts Some post-invoke scripts install packages, which fails because the environment variable is not set. This sets the variable for all three kinds of scripts {pre,post-}invoke and pre-install-pkgs, but we will only allow post-invoke at a later time. Gbp-Dch: full (cherry picked from commit 6675601c81de85b40dc89772c1d6d17f1811c5ba) LP: #1796808 (cherry picked from commit 0ce6bc5ec70ff84eb2829f91f286a93687e77a46) --- test/integration/test-frontend-lock | 80 +++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100755 test/integration/test-frontend-lock (limited to 'test/integration') diff --git a/test/integration/test-frontend-lock b/test/integration/test-frontend-lock new file mode 100755 index 000000000..939344afc --- /dev/null +++ b/test/integration/test-frontend-lock @@ -0,0 +1,80 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + +insertinstalledpackage 'package1' 'i386' '1.0' +insertinstalledpackage 'package2' 'i386' '1.0' +insertinstalledpackage 'package3' 'i386' '1.0' +insertinstalledpackage 'package4' 'i386' '1.0' +insertinstalledpackage 'package5' 'i386' '1.0' +insertinstalledpackage 'package6' 'i386' '1.0' +buildsimplenativepackage 'foo' 'all' '1' + +setupaptarchive + +buildsimplenativepackage 'bar' 'all' '1' + + +# Checks that the correct variable is set +msgmsg 'Post-Invoke script has DPKG_FRONTEND_LOCKED set' +testsuccess aptget -q -y -o Dpkg::Post-Invoke::="echo DPKG_FRONTEND_LOCKED=\$DPKG_FRONTEND_LOCKED" remove package1 +cp rootdir/tmp/testsuccess.output install.output +testsuccess grep DPKG_FRONTEND_LOCKED=true install.output + +msgmsg 'Pre-Invoke script has DPKG_FRONTEND_LOCKED set' +testsuccess aptget -q -y -o Dpkg::Pre-Invoke::="echo DPKG_FRONTEND_LOCKED=\$DPKG_FRONTEND_LOCKED" remove package2 +cp rootdir/tmp/testsuccess.output install.output +testsuccess grep DPKG_FRONTEND_LOCKED=true install.output + +msgmsg 'Pre-Install-Pkgs script has DPKG_FRONTEND_LOCKED set' +testsuccess aptget -q -y -o DPkg::Pre-Install-Pkgs::="echo DPKG_FRONTEND_LOCKED=\$DPKG_FRONTEND_LOCKED" remove package3 +cp rootdir/tmp/testsuccess.output install.output +testsuccess grep DPKG_FRONTEND_LOCKED=true install.output + + +# Check that the frontend lock is hold by apt-get +msgmsg 'Post-Invoke script runs while frontend is locked' +testfailure aptget -q -y -o Dpkg::Post-Invoke::="apt-get remove" remove package4 +cp rootdir/tmp/testfailure.output install.output +testsuccess grep "E: Unable to acquire the dpkg frontend lock (${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/lock-frontend), is another process using it?" install.output +testsuccess grep "E: Problem executing scripts DPkg::Post-Invoke 'apt-get remove'" install.output + +msgmsg 'Pre-Invoke script runs while frontend is locked' +testfailure aptget -q -y -o Dpkg::Pre-Invoke::="apt-get remove" remove package5 +cp rootdir/tmp/testfailure.output install.output +testsuccess grep "E: Unable to acquire the dpkg frontend lock (${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/lock-frontend), is another process using it?" install.output +testsuccess grep "E: Problem executing scripts DPkg::Pre-Invoke 'apt-get remove'" install.output + +msgmsg 'Pre-Install-Pkgs runs while frontend is locked' +testfailure aptget -q -y -o DPkg::Pre-Install-Pkgs::="apt-get remove" remove package6 +cp rootdir/tmp/testfailure.output install.output +testsuccess grep "E: Unable to acquire the dpkg frontend lock (${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/lock-frontend), is another process using it?" install.output +testsuccess grep "E: Sub-process apt-get remove returned an error code (100)" install.output +testsuccess grep "Failure running script apt-get remove" install.output + + +# Applied test case from DonKult +msgmsg 'Applied case of frontend locking' +cat > ./post-invoke < rootdir/etc/apt/apt.conf.d/01dpkgpostinvoke + +testdpkgnotinstalled 'foo' 'bar' +testsuccess apt show foo +testfailure apt show bar + +testsuccess apt install foo -s +testdpkgnotinstalled 'foo' 'bar' + +testsuccess apt install foo +testdpkginstalled 'foo' 'bar' -- cgit v1.2.3