about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--tests/binary-patching.nix5
-rw-r--r--tests/binary-patching.sh47
2 files changed, 37 insertions, 15 deletions
diff --git a/tests/binary-patching.nix b/tests/binary-patching.nix
index afa0a0fb3f84..0de3028bd64d 100644
--- a/tests/binary-patching.nix
+++ b/tests/binary-patching.nix
@@ -8,8 +8,11 @@ mkDerivation {
     ''
       mkdir $out
       seq 1 1000000 > $out/foo
-      ${if version == 2 then ''
+      ${if version != 1 then ''
         seq 1000000 1010000 >> $out/foo
       '' else ""}
+      ${if version == 3 then ''
+        echo foobar >> $out/foo
+      '' else ""}
     '';
 }
diff --git a/tests/binary-patching.sh b/tests/binary-patching.sh
index 26a499727fae..c320dccc7901 100644
--- a/tests/binary-patching.sh
+++ b/tests/binary-patching.sh
@@ -12,28 +12,47 @@ $NIX_BIN_DIR/nix-push --copy $TEST_ROOT/cache2 $TEST_ROOT/manifest1 \
 
 out2=$($nixbuild -o $RESULT binary-patching.nix --arg version 2)
 $NIX_BIN_DIR/nix-push --copy $TEST_ROOT/cache2 $TEST_ROOT/manifest2 $out2
+    
+out3=$($nixbuild -o $RESULT binary-patching.nix --arg version 3)
+$NIX_BIN_DIR/nix-push --copy $TEST_ROOT/cache2 $TEST_ROOT/manifest3 $out3
+
 rm $RESULT
 
-# Generate a binary patch.
+# Generate binary patches.
 $NIX_BIN_DIR/generate-patches.pl $TEST_ROOT/cache2 $TEST_ROOT/patches \
     file://$TEST_ROOT/patches $TEST_ROOT/manifest1 $TEST_ROOT/manifest2
 
-grep -q "patch {" $TEST_ROOT/manifest2
+$NIX_BIN_DIR/generate-patches.pl $TEST_ROOT/cache2 $TEST_ROOT/patches \
+    file://$TEST_ROOT/patches $TEST_ROOT/manifest2 $TEST_ROOT/manifest3
 
-# Get rid of version 2.
-$nixstore --delete $out2
-! test -e $out2
+grep -q "patch {" $TEST_ROOT/manifest3
 
-# Pull the manifest containing the patch.
-clearManifests
-$NIX_BIN_DIR/nix-pull file://$TEST_ROOT/manifest2
+# Get rid of versions 2 and 3.
+$nixstore --delete $out2 $out3
 
-# To make sure that we're using the patch, delete the full NARs.
-rm -f $TEST_ROOT/cache2/*
+# Pull the manifest containing the patches.
+clearManifests
+$NIX_BIN_DIR/nix-pull file://$TEST_ROOT/manifest3
 
-# Make sure that the download size prediction uses the patch rather
+# Make sure that the download size prediction uses the patches rather
 # than the full download.
-$nixbuild -o $RESULT binary-patching.nix --arg version 2 --dry-run 2>&1 | grep -q "0.01 MiB"
+$nixbuild -o $RESULT binary-patching.nix --arg version 3 --dry-run 2>&1 | grep -q "0.01 MiB"
 
-# Now rebuild it.  This should use the patch generated above.
-$nixbuild -o $RESULT binary-patching.nix --arg version 2
+# Now rebuild it.  This should use the two patches generated above.
+rm -f $TEST_ROOT/var/log/nix/downloads
+$nixbuild -o $RESULT binary-patching.nix --arg version 3
+rm $RESULT
+[ "$(grep ' patch ' $TEST_ROOT/var/log/nix/downloads | wc -l)" -eq 2 ]
+
+# Add a patch from version 1 directly to version 3.
+$NIX_BIN_DIR/generate-patches.pl $TEST_ROOT/cache2 $TEST_ROOT/patches \
+    file://$TEST_ROOT/patches $TEST_ROOT/manifest1 $TEST_ROOT/manifest3
+
+# Rebuild version 3.  This should use the direct patch rather than the
+# sequence of two patches.
+$nixstore --delete $out2 $out3
+clearManifests
+rm $TEST_ROOT/var/log/nix/downloads
+$NIX_BIN_DIR/nix-pull file://$TEST_ROOT/manifest3
+$nixbuild -o $RESULT binary-patching.nix --arg version 3
+[ "$(grep ' patch ' $TEST_ROOT/var/log/nix/downloads | wc -l)" -eq 1 ]