diff --git a/tests/binary-patching.nix b/tests/binary-patching.nix index afa0a0fb3f..0de3028bd6 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 26a499727f..c320dccc79 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. +# Get rid of versions 2 and 3. +$nixstore --delete $out2 $out3 + +# Pull the manifest containing the patches. clearManifests -$NIX_BIN_DIR/nix-pull file://$TEST_ROOT/manifest2 +$NIX_BIN_DIR/nix-pull file://$TEST_ROOT/manifest3 -# To make sure that we're using the patch, delete the full NARs. -rm -f $TEST_ROOT/cache2/* - -# 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 ]