Example #1
0
        public void BinaryDeltaReader_ReadsLegacyDelta()
        {
            // Arrange
            var deltaStream = new MemoryStream(FastRsyncLegacyMetadataDelta);

            // Act
            IDeltaReader target = new BinaryDeltaReader(deltaStream, null);

            // Assert
            Assert.AreEqual(RsyncFormatType.FastRsync, target.Type);
            Assert.AreEqual(new XxHashAlgorithm().Name, target.HashAlgorithm.Name);
            Assert.AreEqual(new XxHashAlgorithm().HashLength, target.HashAlgorithm.HashLength);
            Assert.AreEqual(FastRsyncLegacyDeltaExpectedFileHash, target.Metadata.ExpectedFileHash);
            Assert.AreEqual("MD5", target.Metadata.ExpectedFileHashAlgorithm);
            Assert.AreEqual(new XxHashAlgorithm().Name, target.Metadata.HashAlgorithm);
            Assert.Null(target.Metadata.BaseFileHash);
            Assert.Null(target.Metadata.BaseFileHashAlgorithm);
        }
Example #2
0
        public int Execute(string[] commandLineArguments)
        {
            options.Parse(commandLineArguments);

            if (string.IsNullOrWhiteSpace(deltaFilePath))
            {
                throw new OptionException("No delta file was specified", "delta-file");
            }

            deltaFilePath = Path.GetFullPath(deltaFilePath);

            if (!File.Exists(deltaFilePath))
            {
                throw new FileNotFoundException("File not found: " + deltaFilePath, deltaFilePath);
            }

            using (var deltaStream = new FileStream(deltaFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                var reader = new BinaryDeltaReader(deltaStream, null);

                reader.ApplyAsync(data =>
                {
                    if (data.Length > 20)
                    {
                        Console.WriteLine("Data: ({0} bytes): {1}...", data.Length,
                                          BitConverter.ToString(data.Take(20).ToArray()));
                    }
                    else
                    {
                        Console.WriteLine("Data: ({0} bytes): {1}", data.Length, BitConverter.ToString(data.ToArray()));
                    }

                    return(Task.CompletedTask);
                },
                                  (start, offset) =>
                {
                    Console.WriteLine("Copy: {0:X} to {1:X}", start, offset);
                    return(Task.CompletedTask);
                }).GetAwaiter().GetResult();
            }

            return(0);
        }
Example #3
0
        public void GZip_CompressData_RsyncSignatureAndPatch(int dataLength)
        {
            // Arrange
            var dataBasis = new byte[dataLength];

            new Random().NextBytes(dataBasis);
            var basisStream                    = new MemoryStream(dataBasis);
            var basisStreamCompressed          = new MemoryStream();
            var basisStreamCompressedSignature = new MemoryStream();

            var newFileStream = new MemoryStream();

            newFileStream.Write(dataBasis, 10, dataLength * 4 / 5);
            var newRandomData = new byte[dataLength * 2 / 5];

            new Random().NextBytes(newRandomData);
            newFileStream.Write(newRandomData, 0, newRandomData.Length);
            newFileStream.Seek(0, SeekOrigin.Begin);

            var newFileStreamCompressed = new MemoryStream();
            var deltaStream             = new MemoryStream();
            var patchedCompressedStream = new MemoryStream();

            // Act
            GZip.Compress(basisStream, basisStreamCompressed);
            basisStreamCompressed.Seek(0, SeekOrigin.Begin);

            var signatureBuilder = new SignatureBuilder();

            signatureBuilder.Build(basisStreamCompressed, new SignatureWriter(basisStreamCompressedSignature));
            basisStreamCompressedSignature.Seek(0, SeekOrigin.Begin);

            GZip.Compress(newFileStream, newFileStreamCompressed);
            newFileStreamCompressed.Seek(0, SeekOrigin.Begin);

            var deltaBuilder = new DeltaBuilder();

            deltaBuilder.BuildDelta(newFileStreamCompressed, new SignatureReader(basisStreamCompressedSignature, null),
                                    new AggregateCopyOperationsDecorator(new BinaryDeltaWriter(deltaStream)));
            deltaStream.Seek(0, SeekOrigin.Begin);

            var deltaApplier = new DeltaApplier
            {
                SkipHashCheck = true
            };
            var deltaReader = new BinaryDeltaReader(deltaStream, null);

            deltaApplier.Apply(basisStreamCompressed, deltaReader, patchedCompressedStream);
            deltaApplier.HashCheck(deltaReader, patchedCompressedStream);

            // Assert
            Assert.AreEqual(newFileStreamCompressed.ToArray(), patchedCompressedStream.ToArray());

            patchedCompressedStream.Seek(0, SeekOrigin.Begin);
            var decompressedStream = new MemoryStream();

            using (var gz = new GZipStream(patchedCompressedStream, CompressionMode.Decompress))
            {
                gz.CopyTo(decompressedStream);
            }

            var dataOutput = decompressedStream.ToArray();

            Assert.AreEqual(newFileStream.ToArray(), dataOutput);
        }