]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sysupdate: Add tests for incomplete versions 33570/head
authorAdrian Vovk <adrianvovk@gmail.com>
Tue, 2 Jul 2024 16:36:37 +0000 (12:36 -0400)
committerAdrian Vovk <adrianvovk@gmail.com>
Thu, 22 Aug 2024 20:00:47 +0000 (16:00 -0400)
To make sure we don't regress on #33339

test/units/TEST-72-SYSUPDATE.sh

index 3f4aa5ce8a0165110da0a0ad07fc434e8bf7a28a..4dcdf5dced310e9bebc1ef508825af151f1102db 100755 (executable)
@@ -53,6 +53,10 @@ at_exit() {
 
 trap at_exit EXIT
 
+update_checksums() {
+       (cd "$WORKDIR/source" && sha256sum uki* part* dir-*.tar.gz >SHA256SUMS)
+}
+
 new_version() {
     local sector_size="${1:?}"
     local version="${2:?}"
@@ -74,7 +78,7 @@ new_version() {
     echo $RANDOM >"$WORKDIR/source/dir-$version/bar.txt"
     tar --numeric-owner -C "$WORKDIR/source/dir-$version/" -czf "$WORKDIR/source/dir-$version.tar.gz" .
 
-    (cd "$WORKDIR/source" && sha256sum uki* part* dir-*.tar.gz >SHA256SUMS)
+    update_checksums
 }
 
 update_now() {
@@ -91,9 +95,9 @@ verify_version() {
     local sector_size="${2:?}"
     local version="${3:?}"
     local part1_number="${4:?}"
-    local part2_number="${5:?}"
-    local gpt_reserved_sectors part1_offset part2_offset
+    local gpt_reserved_sectors part2_number part1_offset part2_offset
 
+    part2_number=$(( part1_number + 2 ))
     gpt_reserved_sectors=$((1024 * 1024 / sector_size))
     part1_offset=$(((part1_number - 1) * 2048 + gpt_reserved_sectors))
     part2_offset=$(((part2_number - 1) * 2048 + gpt_reserved_sectors))
@@ -108,6 +112,12 @@ verify_version() {
 
     # Check the extra efi
     cmp "$WORKDIR/source/uki-extra-$version.efi" "$WORKDIR/xbootldr/EFI/Linux/uki_$version.efi.extra.d/extra.addon.efi"
+}
+
+verify_version_current() {
+    local version="${3:?}"
+
+    verify_version "$@"
 
     # Check the directories
     cmp "$WORKDIR/source/dir-$version/foo.txt" "$WORKDIR/dirs/current/foo.txt"
@@ -225,24 +235,50 @@ EOF
     # Install initial version and verify
     new_version "$sector_size" v1
     update_now
-    verify_version "$blockdev" "$sector_size" v1 1 3
+    verify_version_current "$blockdev" "$sector_size" v1 1
 
     # Create second version, update and verify that it is added
     new_version "$sector_size" v2
     update_now
-    verify_version "$blockdev" "$sector_size" v2 2 4
+    verify_version "$blockdev" "$sector_size" v1 1
+    verify_version_current "$blockdev" "$sector_size" v2 2
 
     # Create third version, update and verify it replaced the first version
     new_version "$sector_size" v3
     update_now
-    verify_version "$blockdev" "$sector_size" v3 1 3
+    verify_version_current "$blockdev" "$sector_size" v3 1
+    verify_version "$blockdev" "$sector_size" v2 2
     test ! -f "$WORKDIR/xbootldr/EFI/Linux/uki_v1+3-0.efi"
     test ! -f "$WORKDIR/xbootldr/EFI/Linux/uki_v1.efi.extra.d/extra.addon.efi"
     test ! -d "$WORKDIR/xbootldr/EFI/Linux/uki_v1.efi.extra.d"
 
-    # Create fourth version, update using updatectl and verify it replaced the
-    # second version
+    # Create fourth version, but make it be incomplete (i.e. missing some files)
+    # on the server-side. Verify that it's not offered as an update.
     new_version "$sector_size" v4
+    rm "$WORKDIR/source/uki-extra-v4.efi"
+    update_checksums
+    (! "$SYSUPDATE" --verify=no check-new)
+
+    # Create a fifth version, that's complete on the server side. We should
+    # completely skip the incomplete v4 and install v5 instead.
+    new_version "$sector_size" v5
+    update_now
+    verify_version "$blockdev" "$sector_size" v3 1
+    verify_version_current "$blockdev" "$sector_size" v5 2
+
+    # Make the local installation of v5 incomplete by deleting a file, then make
+    # sure that sysupdate still recognizes the installation and can complete it
+    # in place
+    rm -r "$WORKDIR/xbootldr/EFI/Linux/uki_v5.efi.extra.d"
+    "$SYSUPDATE" --offline list v5 | grep -q "incomplete"
+    update_now
+    "$SYSUPDATE" --offline list v5 | grep -qv "incomplete"
+    verify_version "$blockdev" "$sector_size" v3 1
+    verify_version_current "$blockdev" "$sector_size" v5 2
+
+    # Create sixth version, update using updatectl and verify it replaced the
+    # correct version
+    new_version "$sector_size" v6
     if [[ -x "$SYSUPDATED" ]] && command -v updatectl; then
         systemctl start systemd-sysupdated
         "$SYSUPDATE" --verify=no check-new
@@ -254,7 +290,8 @@ EOF
     # User-facing updatectl returns 0 if there's no updates, so use the low-level
     # utility to make sure we did upgrade
     (! "$SYSUPDATE" --verify=no check-new )
-    verify_version "$blockdev" "$sector_size" v4 2 4
+    verify_version_current "$blockdev" "$sector_size" v6 1
+    verify_version "$blockdev" "$sector_size" v5 2
 
     # Next, let's run updatectl's various inspection commands. We're not
     # testing for specific output, but this will at least catch obvious crashes
@@ -265,18 +302,18 @@ EOF
         cp "$CONFIGDIR/01-first.conf" /run/sysupdate.test.d/01-first.conf
         updatectl list
         updatectl list host
-        updatectl list host@v4
+        updatectl list host@v6
         updatectl check
         rm -r /run/sysupdate.test.d
     fi
     
-    # Create fifth version, and update through a file:// URL. This should be
+    # Create seventh version, and update through a file:// URL. This should be
     # almost as good as testing HTTP, but is simpler for us to set up. file:// is
     # abstracted in curl for us, and since our main goal is to test our own code
     # (and not curl) this test should be quite good even if not comprehensive. This
     # will test the SHA256SUMS logic at least (we turn off GPG validation though,
     # see above)
-    new_version "$sector_size" v5
+    new_version "$sector_size" v7
 
     cat >"$CONFIGDIR/02-second.conf" <<EOF
 [Source]
@@ -306,7 +343,8 @@ InstancesMax=3
 EOF
 
     update_now
-    verify_version "$blockdev" "$sector_size" v5 1 3
+    verify_version "$blockdev" "$sector_size" v6 1
+    verify_version_current "$blockdev" "$sector_size" v7 2
 
     # Cleanup
     [[ -b "$blockdev" ]] && losetup --detach "$blockdev"