summaryrefslogtreecommitdiff
path: root/test/integration
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2024-12-16 17:05:40 +0100
committerJulian Andres Klode <jak@debian.org>2024-12-18 10:25:24 +0100
commit6e260e26e4cd671f781151e24d89a17b29a55530 (patch)
tree0ae3b4f9122e5168df4d4d09102a88196d6baaf2 /test/integration
parent19000fab15ab0b30c95a1bf6e034aa3c6bdc36cb (diff)
Introduce automatic pager for read commands
Automatically show the output of `show`, `policy`, `list`, `search`, `showsrc` in a pager. The pager setup is inspired by git's pager setup. Notably, the pager is found using APT_PAGER and PAGER variables. We wait for the pager to be setup somewhat correctly by using a notify pipe to figure out whether execvp() was succesful - then the pipe will read EOF as the other end got closed by CLOEXEC during exec - or not, then the pipe will contain an errno. We set up the correct handlers for signals and exit to close the fds and wait for the pager. Notably inside the signal handler we cannot flush our streams, only close them, so there is some duplication. We call the InitOutputPager() function from inside the various Do...() functions rather than setting it up generally in InitOutput(). Doing so allows us to first render the progress without a pager, and then setup the pager for the content only which improves user experience. When we setup a pager we also take care to disable standard input, as we should not be prompting users while a pager is running (the pager will be reading from the tty directly). We do this by dup2-ing() a /dev/null over it; if we just close()d the fd, another open() might reuse the fd number and problems could occur.
Diffstat (limited to 'test/integration')
-rw-r--r--test/integration/framework11
-rwxr-xr-xtest/integration/test-apt-cli-pager116
2 files changed, 125 insertions, 2 deletions
diff --git a/test/integration/framework b/test/integration/framework
index 6d4d0b07f..a93168278 100644
--- a/test/integration/framework
+++ b/test/integration/framework
@@ -174,6 +174,13 @@ getaptconfig() {
}
runapt() {
msgdebug "Executing: ${CCMD}$*${CDEBUG} "
+ local unbuffer=
+ unset NO_COLOR
+ if [ "$1" = "--unbuffer" ]; then
+ unbuffer="unbuffer"
+ export NO_COLOR=1
+ shift
+ fi
local CMD="$1"
shift
case "$CMD" in
@@ -181,9 +188,9 @@ runapt() {
*) CMD="${APTCMDLINEBINDIR}/$CMD";;
esac
if [ "$CMD" = 'aptitude' ]; then
- MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH="${LIBRARYPATH}:${LD_LIBRARY_PATH}" command "$CMD" "$@"
+ MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH="${LIBRARYPATH}:${LD_LIBRARY_PATH}" command $unbuffer "$CMD" "$@"
else
- MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH="${LIBRARYPATH}:${LD_LIBRARY_PATH}" "$CMD" "$@"
+ MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH="${LIBRARYPATH}:${LD_LIBRARY_PATH}" $unbuffer "$CMD" "$@"
fi
}
runpython3() { runapt command python3 "$@"; }
diff --git a/test/integration/test-apt-cli-pager b/test/integration/test-apt-cli-pager
new file mode 100755
index 000000000..6d0f88f54
--- /dev/null
+++ b/test/integration/test-apt-cli-pager
@@ -0,0 +1,116 @@
+#!/bin/sh
+set -e
+
+TESTDIR="$(readlink -f "$(dirname "$0")")"
+. "$TESTDIR/framework"
+
+setupenvironment
+configarchitecture 'amd64'
+DESCR='Some description
+ That has multiple lines'
+insertsource 'unstable' 'foo' 'all' '1.0'
+insertpackage 'unstable' 'foo' 'all' '1.0' '' '' "$DESCR"
+insertpackage 'unstable' 'multi' 'all' '1.0' '' '' "$DESCR"
+insertpackage 'unstable' 'multi' 'all' '2.0' '' '' "$DESCR"
+
+setupaptarchive
+
+APTARCHIVE=$(readlink -f ./aptarchive)
+
+for show in info show; do
+msgmsg "$show supports pager"
+PAGER=cat testsuccessequal "Package: multi
+Version: 2.0
+Priority: optional
+Section: other
+Maintainer: Joe Sixpack <joe@example.org>
+Installed-Size: 43.0 kB
+Download-Size: 42 B
+APT-Sources: file:$APTARCHIVE unstable/main all Packages
+Description: Some description
+ That has multiple lines
+
+N: There is 1 additional record. Please use the '-a' switch to see it" runapt --unbuffer apt $show multi -o TestPager=cat
+
+PAGER="head -3" testsuccessequal "Package: multi
+Version: 2.0
+Priority: optional" runapt --unbuffer apt $show multi -o TestPager="head -3"
+
+# Test that we are not blocking
+PAGER=more testsuccessequal "Package: multi
+Version: 2.0
+Priority: optional
+Section: other
+Maintainer: Joe Sixpack <joe@example.org>
+Installed-Size: 43.0 kB
+Download-Size: 42 B
+APT-Sources: file:$APTARCHIVE unstable/main all Packages
+Description: Some description
+ That has multiple lines
+
+N: There is 1 additional record. Please use the '-a' switch to see it" runapt --unbuffer apt $show multi -o TestThatWeAreNotBlocking=1
+
+PAGER=not-a-valid-pager testsuccessequal "Package: multi
+Version: 2.0
+Priority: optional
+Section: other
+Maintainer: Joe Sixpack <joe@example.org>
+Installed-Size: 43.0 kB
+Download-Size: 42 B
+APT-Sources: file:$APTARCHIVE unstable/main all Packages
+Description: Some description
+ That has multiple lines
+
+W: Could not execute pager - PagerSetup (2: No such file or directory)
+N: There is 1 additional record. Please use the '-a' switch to see it" runapt --unbuffer apt $show multi -o TestPager="not-a-valid-pager"
+PAGER="dd status=none of=/dev/null" testsuccessequal "" runapt --unbuffer apt $show multi -o Test="everything is paged"
+done
+
+msgmsg "list supports pager"
+PAGER="head -1" testsuccessequal "foo/unstable 1.0 all
+multi/unstable 2.0 all" apt list -qq
+PAGER="head -1" testsuccessequal "foo/unstable 1.0 all" runapt --unbuffer apt list -qq -o TestPager="head -1"
+
+PAGER="dd status=none of=/dev/null" testsuccessequal "Listing..." runapt --unbuffer apt list -o Test="progress is not paged"
+
+msgmsg "search supports pager"
+PAGER="head -1" testsuccessequal "foo/unstable 1.0 all
+ Some description
+
+multi/unstable 2.0 all
+ Some description
+" apt search -qq .
+
+PAGER="head -1" testsuccessequal "foo/unstable 1.0 all" runapt --unbuffer apt search -qq . -o TestPager="head -1"
+
+PAGER="dd status=none of=/dev/null" testsuccessequal "Sorting...
+Full Text Search..." runapt --unbuffer apt search . -o Test="progress is not paged"
+
+msgmsg "policy supports pager"
+PAGER="head -1" testsuccessequal "foo:
+ Installed: (none)
+ Candidate: 1.0
+ Version table:
+ 1.0 500
+ 500 file:${APTARCHIVE} unstable/main all Packages" apt policy foo
+
+PAGER="head -1" testsuccessequal "foo:" runapt --unbuffer apt policy foo -o TestPager="head -1"
+
+PAGER="dd status=none of=/dev/null" testsuccessequal "" runapt --unbuffer apt policy foo -o Test="everything is paged"
+
+msgmsg "showsrc supports pager"
+PAGER="head -2" testsuccessequal "Package: foo
+Binary: foo
+Version: 1.0
+Maintainer: Joe Sixpack <joe@example.org>
+Architecture: all
+Files:
+ b998e085e36cf162e6a33c2801318fef 11 foo_1.0.dsc
+ d46b9a02af8487cbeb49165540c88184 14 foo_1.0.tar.gz
+Checksums-Sha256:
+ ed7c25c832596339bee13e4e7c45cf49f869b60d2bf57252f18191d75866c2a7 11 foo_1.0.dsc
+ f3da8c6ebc62c8ef2dae439a498dddcdacc1a07f45ff67ad12f44b6e2353c239 14 foo_1.0.tar.gz
+" runapt apt showsrc foo
+
+PAGER="head -2" testsuccessequal "Package: foo
+Binary: foo" runapt --unbuffer apt showsrc foo -o TestPager="head- 2"