aboutsummaryrefslogtreecommitdiff
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 afa0a0fb3..0de3028bd 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 26a499727..c320dccc7 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 ]