d/tests/1065494-futureproofing: Add a test for recurrence of #1065494
If at some point in the future we have another transition as extensive as time64, then libgtk-3-0t64 could conceivably be replaced by some other package, which I have modelled here as libgtk-3-0xyz. If that happens, we need to avoid deletion of immmodules.cache, otherwise we will have another bug similar to #1065494. This test-case depends on several implementation details of dpkg-repack and libgtk-3-0t64, so it might need to be adjusted in the future. As a result, I have marked it as flaky, so that failures in the official autopkgtest environment will not be considered a release-critical bug that stalls migration and requires immediate intervention by maintainers.
This commit is contained in:
		
							
								
								
									
										100
									
								
								debian/tests/1065494-futureproofing
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										100
									
								
								debian/tests/1065494-futureproofing
									
									
									
									
										vendored
									
									
										Executable file
									
								
							| @ -0,0 +1,100 @@ | ||||
| #!/bin/sh | ||||
| # Copyright 2024 Simon McVittie | ||||
| # SPDX-License-Identifier: LGPL-2.1-or-later | ||||
|  | ||||
| # Ensure that if the content of libgtk-3-0t64 is taken over by some | ||||
| # other package libgtk-3-0xyz, then that other package will not trigger | ||||
| # a bug equivalent to #1065494. | ||||
|  | ||||
| set -eux | ||||
|  | ||||
| export DEBIAN_FRONTEND=noninteractive | ||||
| n=0 | ||||
| failed=0 | ||||
| binary_package="libgtk-3-0t64" | ||||
| future_binary_package="libgtk-3-0xyz" | ||||
| srcdir="$(pwd)" | ||||
| tmpdir="$(mktemp -d)" | ||||
| cd "$tmpdir" | ||||
|  | ||||
| assert () { | ||||
|     n=$(( n + 1 )) | ||||
|  | ||||
|     if "$@"; then | ||||
|         echo "ok $n - $*" | ||||
|     else | ||||
|         echo "not ok $n - $* exit status $?" | ||||
|         failed=1 | ||||
|     fi | ||||
| } | ||||
|  | ||||
| assert_not () { | ||||
|     n=$(( n + 1 )) | ||||
|  | ||||
|     if ! "$@"; then | ||||
|         echo "ok $n - unsuccessful as expected: $*" | ||||
|     else | ||||
|         echo "not ok $n - should not have succeeded: $*" | ||||
|         failed=1 | ||||
|     fi | ||||
| } | ||||
|  | ||||
| # Add a deb822-formatted apt source at this location if you are testing a | ||||
| # locally-built gtk+3.0 before upload | ||||
| if [ -e "$srcdir/debian/tests/manual/local-1065494.sources" ]; then | ||||
|     install -m644 -t /etc/apt/sources.list.d/ -D \ | ||||
|         "$srcdir/debian/tests/manual/local-1065494.sources" | ||||
| fi | ||||
|  | ||||
| # For more convenient manual testing | ||||
| if ! dpkg-query -W dpkg-repack; then | ||||
|     apt-get -y update | ||||
|     apt-get -y install "$binary_package" | ||||
|     apt-get -y install dpkg-dev dpkg-repack | ||||
| fi | ||||
|  | ||||
| this_tuple="$(dpkg-architecture -qDEB_HOST_MULTIARCH)" | ||||
|  | ||||
| # This assumes that libgtk-3-0t64 has at least one each of Breaks, Provides | ||||
| # and Replaces, and will need to be adjusted if that assumption is broken in | ||||
| # the future for whatever reason. | ||||
| dpkg-repack --generate "$binary_package" | ||||
| grep -q '^Breaks:' dpkg-repack.*/DEBIAN/control | ||||
| grep -q '^Provides:' dpkg-repack.*/DEBIAN/control | ||||
| grep -q '^Replaces:' dpkg-repack.*/DEBIAN/control | ||||
| # The $ substitutions in the Perl expressions are to be expanded by Perl, | ||||
| # not by the shell, so: | ||||
| # shellcheck disable=SC2016 | ||||
| env \ | ||||
|     binary_package="$binary_package" \ | ||||
|     future_binary_package="$future_binary_package" \ | ||||
|     perl -p -i \ | ||||
|         -e 's/^Package:.*$/Package: $ENV{future_binary_package}/;' \ | ||||
|         -e 's/^(Breaks:.*)$/$1, $ENV{binary_package}/;' \ | ||||
|         -e 's/^(Provides:.*)$/$1, $ENV{binary_package}/;' \ | ||||
|         -e 's/^(Replaces:.*)$/$1, $ENV{binary_package}/;' \ | ||||
|         dpkg-repack.*/DEBIAN/control | ||||
| dpkg-deb --build dpkg-repack.* "$future_binary_package.deb" | ||||
| apt-get -y install ./"$future_binary_package.deb" | ||||
|  | ||||
| assert test -e "/usr/lib/$this_tuple/gtk-3.0/3.0.0/immodules.cache" | ||||
| assert test -s "/usr/lib/$this_tuple/gtk-3.0/3.0.0/immodules.cache" | ||||
|  | ||||
| # Purging the "old" (pre-transition) binary package does not destroy the | ||||
| # IM modules cache | ||||
| apt-get -y purge "$binary_package" | ||||
|  | ||||
| assert test -e "/usr/lib/$this_tuple/gtk-3.0/3.0.0/immodules.cache" | ||||
| assert test -s "/usr/lib/$this_tuple/gtk-3.0/3.0.0/immodules.cache" | ||||
|  | ||||
| # Purging the "new" (post-transition) binary package still *does* destroy the | ||||
| # IM modules cache | ||||
| apt-get -y purge "$future_binary_package" | ||||
|  | ||||
| assert_not test -e "/usr/lib/$this_tuple/gtk-3.0/3.0.0/immodules.cache" | ||||
| assert_not test -s "/usr/lib/$this_tuple/gtk-3.0/3.0.0/immodules.cache" | ||||
|  | ||||
| echo "1..$n" | ||||
| exit "$failed" | ||||
|  | ||||
| # vim:set sw=4 sts=4 et: | ||||
		Reference in New Issue
	
	Block a user
	 Simon McVittie
					Simon McVittie