Пример #1
0
        public void Run(string args, OctodiffAppVariant octodiff)
        {
            var stdErrBuilder = new StringBuilder();
            var stdOutBuilder = new StringBuilder();
            var outputBuilder = new StringBuilder();
            var path          = octodiff == OctodiffAppVariant.Sync ?
                                new Uri(typeof(OctodiffProgram).Assembly.CodeBase).LocalPath
                : new Uri(typeof(OctodiffAsyncProgram).Assembly.CodeBase).LocalPath;

            var exit = SilentProcessRunner.ExecuteCommand(path,
                                                          args,
                                                          TestContext.CurrentContext.TestDirectory,
                                                          output =>
            {
                stdOutBuilder.AppendLine(output);
                outputBuilder.AppendLine(output);
                Trace.WriteLine(output);
            },
                                                          output =>
            {
                stdErrBuilder.AppendLine(output);
                outputBuilder.AppendLine(output);
                Trace.WriteLine(output);
            });

            StdErr   = stdErrBuilder.ToString();
            StdOut   = stdOutBuilder.ToString();
            Output   = outputBuilder.ToString();
            ExitCode = exit;
        }
Пример #2
0
        public void ExecuteWithTimings(string name, int numberOfFiles, OctodiffAppVariant octodiff)
        {
            var newName  = Path.ChangeExtension(name, "2.zip");
            var copyName = Path.ChangeExtension(name, "2_out.zip");

            Time("Package creation", () => PackageGenerator.GeneratePackage(name, numberOfFiles));
            Time("Package modification", () => PackageGenerator.ModifyPackage(name, newName, (int)(0.33 * numberOfFiles), (int)(0.10 * numberOfFiles)));
            Time("Signature creation", () => Run("signature " + name + " " + name + ".sig", octodiff));
            Time("Delta creation", () => Run("delta " + name + ".sig " + newName + " " + name + ".delta", octodiff));
            Time("Patch application", () => Run("patch " + name + " " + name + ".delta" + " " + copyName, octodiff));
            Time("Patch application (no verify)", () => Run("patch " + name + " " + name + ".delta" + " " + copyName + " --skip-verification", octodiff));
        }
Пример #3
0
        public void ShouldCreateSignature(string name, int numberOfFiles, OctodiffAppVariant octodiff)
        {
            PackageGenerator.GeneratePackage(name, numberOfFiles);

            Run("signature " + name + " " + name + ".sig", octodiff);
            Assert.That(ExitCode, Is.EqualTo(0));

            var basisSize     = new FileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, name)).Length;
            var signatureSize = new FileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, name) + ".sig").Length;
            var signatureSizePercentageOfBasis = signatureSize / (double)basisSize;

            Trace.WriteLine(string.Format("Basis size: {0:n0}", basisSize));
            Trace.WriteLine(string.Format("Signature size: {0:n0}", signatureSize));
            Trace.WriteLine(string.Format("Signature ratio: {0:n3}", signatureSizePercentageOfBasis));
            Assert.IsTrue(0.006 <= signatureSizePercentageOfBasis && signatureSizePercentageOfBasis <= 0.014);
        }
Пример #4
0
        public void PatchVerificationCanBeSkipped(string name, int numberOfFiles, OctodiffAppVariant octodiff)
        {
            var newBasis = Path.ChangeExtension(Path.Combine(TestContext.CurrentContext.TestDirectory, name), "1.zip");
            var newName  = Path.ChangeExtension(Path.Combine(TestContext.CurrentContext.TestDirectory, name), "2.zip");
            var copyName = Path.ChangeExtension(Path.Combine(TestContext.CurrentContext.TestDirectory, name), "2_out.zip");

            PackageGenerator.GeneratePackage(name, numberOfFiles);
            PackageGenerator.ModifyPackage(name, newBasis, (int)(0.33 * numberOfFiles), (int)(0.10 * numberOfFiles));
            PackageGenerator.ModifyPackage(name, newName, (int)(0.33 * numberOfFiles), (int)(0.10 * numberOfFiles));

            Run("signature " + name + " " + name + ".sig", octodiff);
            Run("delta " + name + ".sig " + newName + " " + name + ".delta", octodiff);
            Run("patch " + newBasis + " " + name + ".delta" + " " + copyName + " --skip-verification", octodiff);
            Assert.That(ExitCode, Is.EqualTo(0));
            Assert.That(Sha1(newName), Is.Not.EqualTo(Sha1(copyName)));
        }
Пример #5
0
        public void DeltaOfChangedFileShouldResultInNewDataSegments(string name, int numberOfFiles, OctodiffAppVariant octodiff)
        {
            PackageGenerator.GeneratePackage(name, numberOfFiles);

            Run("signature " + name + " " + name + ".sig", octodiff);
            Assert.That(ExitCode, Is.EqualTo(0));

            var newName = Path.ChangeExtension(name, "2.zip");

            PackageGenerator.ModifyPackage(name, newName, (int)(0.33 * numberOfFiles), (int)(0.10 * numberOfFiles));

            Run("delta " + name + ".sig " + newName + " " + name + ".delta", octodiff);
            Assert.That(ExitCode, Is.EqualTo(0));

            Run("explain-delta " + name + ".delta", octodiff);
            Assert.That(Regex.IsMatch(Output, "Copy: ([0-9A-F]+) to ([0-9A-F]+)\r\n"));
            Assert.That(Regex.IsMatch(Output, "Data: \\(([0-9]+) bytes\\)"));

            var originalSize       = new FileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, name)).Length;
            var newSize            = new FileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, newName)).Length;
            var deltaSize          = new FileInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, name + ".delta")).Length;
            var actualDifference   = Math.Abs(newSize - originalSize);
            var deltaToActualRatio = (double)deltaSize / actualDifference;

            Trace.WriteLine(string.Format("Delta ratio: {0:n3}", deltaToActualRatio));
            Assert.IsTrue(deltaSize * 2 < newSize, "Delta should be at least half the new file size");
            Assert.IsTrue(0.80 <= deltaToActualRatio && deltaToActualRatio <= 1.60, "Delta should be pretty close to the actual file differences");
        }
Пример #6
0
        public void DeltaOfUnchangedFileShouldResultInJustCopySegment(string name, int numberOfFiles, OctodiffAppVariant octodiff)
        {
            PackageGenerator.GeneratePackage(name, numberOfFiles);

            Run("signature " + name + " " + name + ".sig", octodiff);
            Assert.That(ExitCode, Is.EqualTo(0));

            Run("delta " + name + ".sig " + name + " " + name + ".delta", octodiff);
            Assert.That(ExitCode, Is.EqualTo(0));

            Run("explain-delta " + name + ".delta", octodiff);
            Assert.That(Regex.IsMatch(Output, "^Copy: 0 to ([0-9A-F]+)\r\n$"));
            Assert.That(Output, Does.Not.Contains("Data:"));
        }
Пример #7
0
        public void ShouldCreateDifferentSignaturesBasedOnChunkSize(string name, int numberOfFiles, OctodiffAppVariant octodiff)
        {
            PackageGenerator.GeneratePackage(name, numberOfFiles);

            Run("signature " + name + " " + name + ".sig.1 --chunk-size=128", octodiff);
            Run("signature " + name + " " + name + ".sig.2 --chunk-size=256", octodiff);
            Run("signature " + name + " " + name + ".sig.3 --chunk-size=1024", octodiff);
            Run("signature " + name + " " + name + ".sig.4 --chunk-size=2048", octodiff);
            Run("signature " + name + " " + name + ".sig.5 --chunk-size=31744", octodiff);

            Assert.That(Length(Path.Combine(TestContext.CurrentContext.TestDirectory, name) + ".sig.1")
                        > Length(Path.Combine(TestContext.CurrentContext.TestDirectory, name) + ".sig.2"));
            Assert.That(Length(Path.Combine(TestContext.CurrentContext.TestDirectory, name) + ".sig.2")
                        > Length(Path.Combine(TestContext.CurrentContext.TestDirectory, name) + ".sig.3"));
            Assert.That(Length(Path.Combine(TestContext.CurrentContext.TestDirectory, name) + ".sig.3")
                        > Length(Path.Combine(TestContext.CurrentContext.TestDirectory, name) + ".sig.4"));
            Assert.That(Length(Path.Combine(TestContext.CurrentContext.TestDirectory, name) + ".sig.4")
                        > Length(Path.Combine(TestContext.CurrentContext.TestDirectory, name) + ".sig.5"));
        }
Пример #8
0
        public void PatchVerificationShouldFailWhenFilesModified(string name, int numberOfFiles, OctodiffAppVariant octodiff)
        {
            var newBasis = Path.ChangeExtension(Path.Combine(TestContext.CurrentContext.TestDirectory, name), "1.zip");
            var newName  = Path.ChangeExtension(Path.Combine(TestContext.CurrentContext.TestDirectory, name), "2.zip");
            var copyName = Path.ChangeExtension(Path.Combine(TestContext.CurrentContext.TestDirectory, name), "2_out.zip");

            PackageGenerator.GeneratePackage(name, numberOfFiles);
            PackageGenerator.ModifyPackage(name, newBasis, numberOfFiles, (int)(0.5 * numberOfFiles));
            PackageGenerator.ModifyPackage(name, newName, (int)(0.33 * numberOfFiles), (int)(0.10 * numberOfFiles));

            Run("signature " + name + " " + name + ".sig", octodiff);
            Run("delta " + name + ".sig " + newName + " " + name + ".delta", octodiff);
            Run("patch " + newBasis + " " + name + ".delta" + " " + copyName, octodiff);
            Assert.That(ExitCode, Is.EqualTo(2));
            Assert.That(Output, Does.Contain("Error: Verification of the patched file failed"));
        }
Пример #9
0
        public void PatchingShouldResultInPerfectCopy(string name, int numberOfFiles, OctodiffAppVariant octodiff)
        {
            var newName  = Path.ChangeExtension(Path.Combine(TestContext.CurrentContext.TestDirectory, name), "2.zip");
            var copyName = Path.ChangeExtension(Path.Combine(TestContext.CurrentContext.TestDirectory, name), "2_out.zip");

            PackageGenerator.GeneratePackage(name, numberOfFiles);
            PackageGenerator.ModifyPackage(name, newName, (int)(0.33 * numberOfFiles), (int)(0.10 * numberOfFiles));

            Run("signature " + name + " " + name + ".sig", octodiff);
            Run("delta " + name + ".sig " + newName + " " + name + ".delta", octodiff);
            Run("patch " + name + " " + name + ".delta" + " " + copyName, octodiff);
            Assert.That(ExitCode, Is.EqualTo(0));

            Assert.That(Sha1(newName), Is.EqualTo(Sha1(copyName)));
        }