diff options
| author | Alexander Larsson <alexl@redhat.com> | 2020-10-29 12:57:10 +0100 |
|---|---|---|
| committer | Alexander Larsson <alexl@redhat.com> | 2020-10-29 12:57:10 +0100 |
| commit | 4c038b421c9134e87d8b4f60692ed90917a7a658 (patch) | |
| tree | 78a1527a691fca038b81b34b14dbe96fb914cd10 | |
| parent | 7c99dbc6ef829172557d74799e6de05a0dce0396 (diff) | |
| download | flatpak-scalable-repo.tar.gz | |
tests: Add some tests for subsummariesscalable-repo
| -rw-r--r-- | tests/Makefile-test-matrix.am.inc | 3 | ||||
| -rw-r--r-- | tests/Makefile.am.inc | 1 | ||||
| -rw-r--r-- | tests/libtest.sh | 2 | ||||
| -rwxr-xr-x | tests/test-summaries.sh | 257 |
4 files changed, 263 insertions, 0 deletions
diff --git a/tests/Makefile-test-matrix.am.inc b/tests/Makefile-test-matrix.am.inc index 66806b27..72e96d41 100644 --- a/tests/Makefile-test-matrix.am.inc +++ b/tests/Makefile-test-matrix.am.inc @@ -24,6 +24,8 @@ TEST_MATRIX= \ tests/test-update-remote-configuration@oldsummary.wrap \ tests/test-update-portal@user.wrap \ tests/test-update-portal@system.wrap \ + tests/test-summaries@user.wrap \ + tests/test-summaries@system.wrap \ $(NULL) TEST_MATRIX_DIST= \ tests/test-basic.sh \ @@ -47,4 +49,5 @@ TEST_MATRIX_EXTRA_DIST= \ tests/test-oci-registry.sh \ tests/test-update-remote-configuration.sh \ tests/test-update-portal.sh \ + tests/test-summaries.sh \ $(NULL) diff --git a/tests/Makefile.am.inc b/tests/Makefile.am.inc index 4b18499b..ecda7b1a 100644 --- a/tests/Makefile.am.inc +++ b/tests/Makefile.am.inc @@ -204,6 +204,7 @@ TEST_MATRIX_SOURCE = \ tests/test-update-portal.sh{user+system} \ tests/test-auth.sh \ tests/test-unused.sh \ + tests/test-summaries.sh{user+system} \ $(NULL) update-test-matrix: diff --git a/tests/libtest.sh b/tests/libtest.sh index 886cd68b..bea00128 100644 --- a/tests/libtest.sh +++ b/tests/libtest.sh @@ -117,10 +117,12 @@ if [ x${USE_SYSTEMDIR-} == xyes ] ; then export FL_DIR=${SYSTEMDIR} export U= export INVERT_U=--user + export FL_CACHE_DIR=${XDG_CACHE_HOME}/flatpak/system-cache else export FL_DIR=${USERDIR} export U="--user" export INVERT_U=--system + export FL_CACHE_DIR=$FL_DIR/repo/tmp/cache fi if [ x${USE_DELTAS-} == xyes ] ; then diff --git a/tests/test-summaries.sh b/tests/test-summaries.sh new file mode 100755 index 00000000..ee8766ed --- /dev/null +++ b/tests/test-summaries.sh @@ -0,0 +1,257 @@ +#!/bin/bash +# +# Copyright (C) 2020 Alexander Larsson <alexl@redhat.com> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +set -euo pipefail + +. $(dirname $0)/libtest.sh + +echo "1..2" + +setup_repo + +sha256() { + sha256sum -b | awk "{ print \$1 }" +} + +gunzip_sha256() { + gunzip -c $1 | sha256 +} + +make_app() { + APP_ID=$1 + APPARCH=$2 + REPO=$3 + + DIR=`mktemp -d` + cat > ${DIR}/metadata <<EOF +[Application] +name=$APP_ID +runtime=org.test.Platform/$APPARCH/master +EOF + + mkdir -p ${DIR}/files/bin + cat > ${DIR}/files/bin/hello.sh <<EOF +#!/bin/sh +echo "Hello world, from a sandbox" +EOF + chmod a+x ${DIR}/files/bin/hello.sh + + mkdir -p ${DIR}/files/share/app-info/xmls + mkdir -p ${DIR}/files/share/app-info/icons/flatpak/64x64 + gzip -c > ${DIR}/files/share/app-info/xmls/${APP_ID}.xml.gz <<EOF +<?xml version="1.0" encoding="UTF-8"?> +<components version="0.8"> + <component type="desktop"> + <id>$APP_ID.desktop</id> + <name>Hello world test app: $APP_ID</name> + <summary>Print a greeting</summary> + <description><p>This is a test app.</p></description> + <releases> + <release timestamp="1525132800" version="0.0.1"/> + </releases> + </component> +</components> +EOF + cp $(dirname $0)/org.test.Hello.png ${DIR}/files/share/app-info/icons/flatpak/64x64/${APP_ID}.png + + $FLATPAK build-finish --command=hello.sh ${DIR} &> /dev/null + $FLATPAK build-export ${GPGARGS} --arch=$APPARCH --disable-sandbox ${REPO} ${DIR} &> /dev/null + rm -rf ${DIR} +} + +active_subsets() { + REPO=$1 + $FLATPAK repo --subsets $REPO | awk "{ print \$2 }" +} + +active_subset_for_arch() { + REPO=$1 + THE_ARCH=$2 + $FLATPAK repo --subsets $REPO --subset $THE_ARCH | awk "{ print \$2 }" +} + +active_subset() { + active_subset_for_arch $1 $ARCH +} + +n_histories() { + REPO=$1 + $FLATPAK repo --subsets $REPO | awk "{ sum +=\$3 } END {print sum}" +} + +verify_subsummaries() { + REPO=$1 + + ACTIVE_SUBSETS=$(active_subsets $REPO) + for SUBSET in $ACTIVE_SUBSETS; do + assert_has_file $REPO/summaries/$SUBSET.gz + done + + N_HISTORIES=$(n_histories $REPO) + + N_DELTAS=0 + for DELTA_FILE in $REPO/summaries/*.delta; do + DELTA=$(basename $DELTA_FILE .delta) + FROM=$(echo $DELTA | cut -d "-" -f 1) + TO=$(echo $DELTA | cut -d "-" -f 2) + + # All TO should be in an active SUBSET + if [[ "$ACTIVE_SUBSETS" != *"$TO"* ]]; then + assert_not_reached + fi + N_DELTAS=$(($N_DELTAS+1)) + done + assert_streq "$N_DELTAS" "$N_HISTORIES" + + N_OLD=0 + for SUMMARY_FILE in $REPO/summaries/*.gz; do + DIGEST=$(basename $SUMMARY_FILE .gz) + COMPUTED_DIGEST=$(gunzip_sha256 $SUMMARY_FILE) + assert_streq "$DIGEST" "$COMPUTED_DIGEST" + + if [[ "$ACTIVE_SUBSETS" != *"$DIGEST"* ]]; then + N_OLD=$(($N_OLD+1)) + fi + done + assert_streq "$N_OLD" "$N_HISTORIES" + +} + +set +x + +# A non-default arch (that isn't compatible) +if [ $ARCH == x86_64 -o $ARCH == i386 ]; then + OTHER_ARCH=aarch64 +else + OTHER_ARCH=x86_64 +fi + +# Set up some arches, including the current one +declare -A arches +for A in aarch64 arm $($FLATPAK --supported-arches); do + arches[$A]=1 +done +ARCHES=${!arches[@]} + +for A in $ARCHES; do + # Create runtimes for all arches (based on $ARCH version) + if [ $A != $ARCH ]; then + $FLATPAK build-commit-from ${GPGARGS} --src-ref=runtime/org.test.Platform/x86_64/master repos/test runtime/org.test.Platform/$A/master + fi + + # Create a bunch of apps (for all arches) + for I in $(seq 10); do + make_app org.app.App$I $A repos/test + done + + # Make sure we have no superfluous summary files + verify_subsummaries repos/test +done + +set -x + +ok subsummary update generations + +ACTIVE_SUBSET=$(active_subset repos/test) +ACTIVE_SUBSET_OTHER=$(active_subset_for_arch repos/test $OTHER_ARCH) + +assert_not_has_file $FL_CACHE_DIR/summaries/test-repo-${ACTIVE_SUBSET}.sub +assert_not_has_file $FL_CACHE_DIR/summaries/test-repo-${ACTIVE_SUBSET_OTHER}.sub + +httpd_clear_log +$FLATPAK $U remote-ls test-repo > /dev/null + +assert_has_file $FL_CACHE_DIR/summaries/test-repo-${ARCH}-${ACTIVE_SUBSET}.sub +assert_not_has_file $FL_CACHE_DIR/summaries/test-repo-${OTHER_ARCH}-${ACTIVE_SUBSET_OTHER}.sub +# We downloaded the full summary (not delta) +assert_file_has_content httpd-log summaries/${ACTIVE_SUBSET}.gz + +httpd_clear_log +$FLATPAK $U remote-ls test-repo --arch=$OTHER_ARCH > /dev/null + +assert_has_file $FL_CACHE_DIR/summaries/test-repo-${ARCH}-${ACTIVE_SUBSET}.sub +assert_has_file $FL_CACHE_DIR/summaries/test-repo-${OTHER_ARCH}-${ACTIVE_SUBSET_OTHER}.sub +# We downloaded the full summary (not delta) +assert_file_has_content httpd-log summaries/${ACTIVE_SUBSET_OTHER}.gz + +# Modify the ARCH subset +$FLATPAK build-commit-from ${GPGARGS} --src-ref=app/org.app.App1/$ARCH/master repos/test app/org.app.App1.NEW/$ARCH/master + +OLD_ACTIVE_SUBSET=$ACTIVE_SUBSET +OLD_ACTIVE_SUBSET_OTHER=$ACTIVE_SUBSET_OTHER +ACTIVE_SUBSET=$(active_subset repos/test) +ACTIVE_SUBSET_OTHER=$(active_subset_for_arch repos/test $OTHER_ARCH) + +assert_not_streq "$OLD_ACTIVE_SUBSET" "$ACTIVE_SUBSET" +assert_streq "$OLD_ACTIVE_SUBSET_OTHER" "$ACTIVE_SUBSET_OTHER" + +sleep 1 # Ensure mtime differs for cached summary files (so they are removed) +httpd_clear_log +$FLATPAK $U remote-ls test-repo > /dev/null + +assert_has_file $FL_CACHE_DIR/summaries/test-repo-${ARCH}-${ACTIVE_SUBSET}.sub +assert_not_has_file $FL_CACHE_DIR/summaries/test-repo-${ARCH}-${OLD_ACTIVE_SUBSET}.sub +assert_has_file $FL_CACHE_DIR/summaries/test-repo-${OTHER_ARCH}-${ACTIVE_SUBSET_OTHER}.sub # This is the same as before +# We should have uses the delta +assert_not_file_has_content httpd-log summaries/${ACTIVE_SUBSET}.gz +assert_file_has_content httpd-log summaries/${OLD_ACTIVE_SUBSET}-${ACTIVE_SUBSET}.delta + +# Modify the ARCH *and* OTHER_ARCH subset +$FLATPAK build-commit-from ${GPGARGS} --src-ref=app/org.app.App1/$ARCH/master repos/test app/org.app.App1.NEW2/$ARCH/master +$FLATPAK build-commit-from ${GPGARGS} --src-ref=app/org.app.App1/$OTHER_ARCH/master repos/test app/org.app.App1.NEW2/$OTHER_ARCH/master + +OLD_OLD_ACTIVE_SUBSET=$OLD_ACTIVE_SUBSET +OLD_OLD_ACTIVE_SUBSET_OTHER=$OLD_ACTIVE_SUBSET_OTHER +OLD_ACTIVE_SUBSET=$ACTIVE_SUBSET +OLD_ACTIVE_SUBSET_OTHER=$ACTIVE_SUBSET_OTHER +ACTIVE_SUBSET=$(active_subset repos/test) +ACTIVE_SUBSET_OTHER=$(active_subset_for_arch repos/test $OTHER_ARCH) + +assert_not_streq "$OLD_ACTIVE_SUBSET" "$ACTIVE_SUBSET" +assert_not_streq "$OLD_ACTIVE_SUBSET_OTHER" "$ACTIVE_SUBSET_OTHER" + +sleep 1 # Ensure mtime differs for cached summary files (so they are removed) +httpd_clear_log +$FLATPAK $U remote-ls test-repo > /dev/null # Only update for $ARCH + +assert_has_file $FL_CACHE_DIR/summaries/test-repo-${ARCH}-${ACTIVE_SUBSET}.sub +assert_not_has_file $FL_CACHE_DIR/summaries/test-repo-${ARCH}-${OLD_ACTIVE_SUBSET}.sub +# We didn't get OTHER_ARCH summary +assert_not_has_file $FL_CACHE_DIR/summaries/test-repo-${OTHER_ARCH}-${ACTIVE_SUBSET_OTHER}.sub +assert_has_file $FL_CACHE_DIR/summaries/test-repo-${OTHER_ARCH}-${OLD_ACTIVE_SUBSET_OTHER}.sub +# We should have used the delta +assert_not_file_has_content httpd-log summaries/${ACTIVE_SUBSET}.gz +assert_file_has_content httpd-log summaries/${OLD_ACTIVE_SUBSET}-${ACTIVE_SUBSET}.delta + +sleep 1 # Ensure mtime differs for cached summary files (so they are removed) +httpd_clear_log +$FLATPAK $U remote-ls --arch=* test-repo > /dev/null # update for all arches + +assert_has_file $FL_CACHE_DIR/summaries/test-repo-${ARCH}-${ACTIVE_SUBSET}.sub +assert_not_has_file $FL_CACHE_DIR/summaries/test-repo-${ARCH}-${OLD_ACTIVE_SUBSET}.sub +assert_has_file $FL_CACHE_DIR/summaries/test-repo-${OTHER_ARCH}-${ACTIVE_SUBSET_OTHER}.sub +assert_not_has_file $FL_CACHE_DIR/summaries/test-repo-${OTHER_ARCH}-${OLD_ACTIVE_SUBSET_OTHER}.sub +# We should have used the delta +assert_not_file_has_content httpd-log summaries/${ACTIVE_SUBSET_OTHER}.gz +assert_file_has_content httpd-log summaries/${OLD_ACTIVE_SUBSET_OTHER}-${ACTIVE_SUBSET_OTHER}.delta +# We should have used the $ARCH one from the cache +assert_not_file_has_content httpd-log summaries/${ACTIVE_SUBSET}.gz +assert_not_file_has_content httpd-log summaries/${OLD_ACTIVE_SUBSET}-${ACTIVE_SUBSET}.delta + +ok subsummary fetching and caching |
