test/browser: run tests inside the tasks container

This simplifies the "outside" setup quite a bit and gives us the same
tasks container that test runs on the Cockpit CI run under.

This change also implicitly changes the test browser to chromium (which
is no longer an issue — we just use it from the tasks container).
This commit is contained in:
Allison Karlitskaya 2024-03-14 17:54:22 +01:00
parent e112794936
commit 2e8b932ece
4 changed files with 30 additions and 46 deletions

View file

@ -1,25 +1,14 @@
#!/bin/sh
set -eux set -eux
export TEST_BROWSER=${TEST_BROWSER:-firefox} cd "${0%/*}/../.."
TESTS="$(realpath $(dirname "$0"))"
export SOURCE="$(realpath $TESTS/../..)"
export LOGS="${TMT_TEST_DATA:-$(pwd)/logs}"
mkdir -p "$LOGS"
chmod a+w "$LOGS"
# HACK: https://bugzilla.redhat.com/show_bug.cgi?id=2033020 # HACK: https://bugzilla.redhat.com/show_bug.cgi?id=2033020
dnf update -y pam || true dnf update -y pam || true
# install firefox (available everywhere in Fedora and RHEL) # allow test to set up things on the machine
# we don't need the H.264 codec, and it is sometimes not available (rhbz#2005760) mkdir -p /root/.ssh
dnf install --disablerepo=fedora-cisco-openh264 -y --setopt=install_weak_deps=False firefox curl https://raw.githubusercontent.com/cockpit-project/bots/main/machine/identity.pub >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
# nodejs 10 is too old for current Cockpit test API
if grep -q platform:el8 /etc/os-release; then
dnf module switch-to -y nodejs:16
fi
# create user account for logging in # create user account for logging in
if ! id admin 2>/dev/null; then if ! id admin 2>/dev/null; then
@ -33,25 +22,19 @@ echo root:foobar | chpasswd
# avoid sudo lecture during tests # avoid sudo lecture during tests
su -c 'echo foobar | sudo --stdin whoami' - admin su -c 'echo foobar | sudo --stdin whoami' - admin
# create user account for running the test
if ! id runtest 2>/dev/null; then
useradd -c 'Test runner' runtest
# allow test to set up things on the machine
mkdir -p /root/.ssh
curl https://raw.githubusercontent.com/cockpit-project/bots/main/machine/identity.pub >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
fi
chown -R runtest "$SOURCE"
# disable core dumps, we rather investigate them upstream where test VMs are accessible # disable core dumps, we rather investigate them upstream where test VMs are accessible
echo core > /proc/sys/kernel/core_pattern echo core > /proc/sys/kernel/core_pattern
systemctl enable --now cockpit.socket sh test/vm.install
# Run tests as unprivileged user # Run tests in the cockpit tasks container, as unprivileged user
# once we drop support for RHEL 8, use this: CONTAINER="$(cat .cockpit-ci/container)"
# runuser -u runtest --whitelist-environment=TEST_BROWSER,TEST_ALLOW_JOURNAL_MESSAGES,TEST_AUDIT_NO_SELINUX,SOURCE,LOGS $TESTS/run-test.sh exec podman \
runuser -u runtest --preserve-environment env USER=runtest HOME=$(getent passwd runtest | cut -f6 -d:) $TESTS/run-test.sh run \
--rm \
RC=$(cat $LOGS/exitcode) --shm-size=1024m \
exit ${RC:-1} --security-opt=label=disable \
--volume="${TMT_TEST_DATA}":/logs:rw,U --env=LOGS=/logs \
--volume="$(pwd)":/source:rw,U --env=SOURCE=/source \
"${CONTAINER}" \
sh /source/test/browser/run-test.sh

View file

@ -2,14 +2,9 @@ summary:
Run browser integration tests on the host Run browser integration tests on the host
require: require:
- cockpit-starter-kit - cockpit-starter-kit
- podman
- cockpit-ws - cockpit-ws
- cockpit-system - cockpit-system
- bzip2
- git-core
- glibc-langpack-de - glibc-langpack-de
- libvirt-python3
- make
- npm
- python3
test: ./browser.sh test: ./browser.sh
duration: 60m duration: 60m

15
test/browser/run-test.sh Executable file → Normal file
View file

@ -1,8 +1,8 @@
#!/bin/sh
set -eux set -eux
cd "${SOURCE}"
# tests need cockpit's bots/ libraries and test infrastructure # tests need cockpit's bots/ libraries and test infrastructure
cd $SOURCE
git init git init
rm -f bots # common local case: existing bots symlink rm -f bots # common local case: existing bots symlink
make bots test/common make bots test/common
@ -33,10 +33,15 @@ EXCLUDES=""
echo "TEST_ALLOW_JOURNAL_MESSAGES: ${TEST_ALLOW_JOURNAL_MESSAGES:-}" echo "TEST_ALLOW_JOURNAL_MESSAGES: ${TEST_ALLOW_JOURNAL_MESSAGES:-}"
echo "TEST_AUDIT_NO_SELINUX: ${TEST_AUDIT_NO_SELINUX:-}" echo "TEST_AUDIT_NO_SELINUX: ${TEST_AUDIT_NO_SELINUX:-}"
GATEWAY="$(python3 -c 'import socket; print(socket.gethostbyname("_gateway"))')"
RC=0 RC=0
test/common/run-tests --nondestructive --machine 127.0.0.1:22 --browser 127.0.0.1:9090 $EXCLUDES || RC=$? ./test/common/run-tests \
--nondestructive \
--machine "${GATEWAY}":22 \
--browser "${GATEWAY}":9090 \
$EXCLUDES \
|| RC=$?
echo $RC > "$LOGS/exitcode" echo $RC > "$LOGS/exitcode"
cp --verbose Test* "$LOGS" || true cp --verbose Test* "$LOGS" || true
# deliver test result via exitcode file exit $RC
exit 0

View file

@ -1,9 +1,10 @@
#!/bin/sh #!/bin/sh
# image-customize script to prepare a bots VM for testing this application # image-customize script to prepare a bots VM for testing this application
# The application package will be installed separately # The application package will be installed separately
set -eu set -eux
# don't force https:// (self-signed cert) # don't force https:// (self-signed cert)
mkdir -p /etc/cockpit
printf "[WebService]\\nAllowUnencrypted=true\\n" > /etc/cockpit/cockpit.conf printf "[WebService]\\nAllowUnencrypted=true\\n" > /etc/cockpit/cockpit.conf
if type firewall-cmd >/dev/null 2>&1; then if type firewall-cmd >/dev/null 2>&1; then