about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--tests/Makefile.am3
-rw-r--r--tests/binary-patching.nix15
-rw-r--r--tests/binary-patching.sh33
-rw-r--r--tests/init.sh6
-rw-r--r--tests/nix-push.sh2
5 files changed, 56 insertions, 3 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index beb7852db31c..88925fbd9065 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -7,7 +7,8 @@ TESTS = init.sh hash.sh lang.sh add.sh simple.sh dependencies.sh \
   fallback.sh nix-push.sh gc.sh gc-concurrent.sh verify.sh nix-pull.sh \
   referrers.sh user-envs.sh logging.sh nix-build.sh misc.sh fixed.sh \
   gc-runtime.sh install-package.sh check-refs.sh filter-source.sh \
-  remote-store.sh export.sh export-graph.sh negative-caching.sh
+  remote-store.sh export.sh export-graph.sh negative-caching.sh \
+  binary-patching.sh
 
 XFAIL_TESTS =
 
diff --git a/tests/binary-patching.nix b/tests/binary-patching.nix
new file mode 100644
index 000000000000..781bd76eba60
--- /dev/null
+++ b/tests/binary-patching.nix
@@ -0,0 +1,15 @@
+{ version }:
+
+with import ./config.nix;
+
+mkDerivation {
+  name = "foo-${toString version}";
+  builder = builtins.toFile "builder.sh"
+    ''
+      mkdir $out
+      seq 1 1000000 > $out/foo
+      ${if version == 2 then ''
+        echo bla >> $out/foo
+      '' else ""}
+    '';
+}
diff --git a/tests/binary-patching.sh b/tests/binary-patching.sh
new file mode 100644
index 000000000000..8d7788fb614f
--- /dev/null
+++ b/tests/binary-patching.sh
@@ -0,0 +1,33 @@
+source common.sh
+
+mkdir -p $TEST_ROOT/cache2 $TEST_ROOT/patches
+
+RESULT=$TEST_ROOT/result
+
+# Build version 1 and 2 of the "foo" package.
+$NIX_BIN_DIR/nix-push --copy $TEST_ROOT/cache2 $TEST_ROOT/manifest1 \
+    $($nixbuild -o $RESULT binary-patching.nix --arg version 1)
+
+out2=$($nixbuild -o $RESULT binary-patching.nix --arg version 2)
+$NIX_BIN_DIR/nix-push --copy $TEST_ROOT/cache2 $TEST_ROOT/manifest2 $out2
+rm $RESULT
+
+# Generate a binary patch.
+$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
+
+# Get rid of version 2.
+$nixstore --delete $out2
+! test -e $out2
+
+# Pull the manifest containing the patch.
+clearManifests
+$NIX_BIN_DIR/nix-pull file://$TEST_ROOT/manifest2
+
+# To make sure that we're using the patch, delete the full NARs.
+rm -f $TEST_ROOT/cache2/*
+
+# Now rebuild it.  This should use the patch generated above.
+$nixbuild -o $RESULT binary-patching.nix --arg version 2
diff --git a/tests/init.sh b/tests/init.sh
index 64947031bfe7..cdc7aca834e8 100644
--- a/tests/init.sh
+++ b/tests/init.sh
@@ -23,6 +23,8 @@ ln -s $nixinstantiate $NIX_BIN_DIR/
 ln -s $nixhash $NIX_BIN_DIR/
 ln -s $nixenv $NIX_BIN_DIR/
 ln -s $nixworker $NIX_BIN_DIR/
+ln -s $TOP/src/bsdiff-*/bsdiff $NIX_BIN_DIR/
+ln -s $TOP/src/bsdiff-*/bspatch $NIX_BIN_DIR/
 ln -s $TOP/scripts/nix-prefetch-url $NIX_BIN_DIR/
 ln -s $TOP/scripts/nix-collect-garbage $NIX_BIN_DIR/
 ln -s $TOP/scripts/nix-build $NIX_BIN_DIR/
@@ -34,6 +36,7 @@ ln -s $bzip2_bin_test/bzip2 $NIX_BIN_DIR/nix/
 ln -s $bzip2_bin_test/bunzip2 $NIX_BIN_DIR/nix/
 ln -s $TOP/scripts/copy-from-other-stores.pl $NIX_BIN_DIR/nix/
 ln -s $TOP/scripts/download-using-manifests.pl $NIX_BIN_DIR/nix/
+ln -s $TOP/scripts/generate-patches.pl $NIX_BIN_DIR/
 ln -s $TOP/scripts/readmanifest.pm $NIX_BIN_DIR/nix/
 
 cat > "$NIX_CONF_DIR"/nix.conf <<EOF
@@ -45,7 +48,7 @@ EOF
 
 mkdir $NIX_DATA_DIR/nix
 cp -pr $TOP/corepkgs $NIX_DATA_DIR/nix/
-# Bah, script has the prefix hard-coded.  This is really messy stuff
+# Bah, scripts have the prefix hard-coded.  This is really messy stuff
 # (and likely to fail).
 for i in \
     $NIX_DATA_DIR/nix/corepkgs/nar/nar.sh \
@@ -58,6 +61,7 @@ for i in \
     $NIX_BIN_DIR/nix-push \
     $NIX_BIN_DIR/nix-pull \
     $NIX_BIN_DIR/nix/readmanifest.pm \
+    $NIX_BIN_DIR/generate-patches.pl \
     ; do
     sed < $i > $i.tmp \
         -e "s^$REAL_BIN_DIR/nix-store^$NIX_BIN_DIR/nix-store^" \
diff --git a/tests/nix-push.sh b/tests/nix-push.sh
index a9a2f5f9c06a..0a35e3b97ab7 100644
--- a/tests/nix-push.sh
+++ b/tests/nix-push.sh
@@ -5,7 +5,7 @@ outPath=$($nixstore -r $drvPath)
 
 echo "pushing $drvPath"
 
-mkdir $TEST_ROOT/cache
+mkdir -p $TEST_ROOT/cache
 
 $NIX_BIN_DIR/nix-push \
     --copy $TEST_ROOT/cache $TEST_ROOT/manifest $drvPath