Refactor code and add tests

This commit is contained in:
Caelan Sayler
2025-05-13 20:25:11 +01:00
committed by Caelan
parent 5d99b7213b
commit 6b08ff0a21
11 changed files with 404 additions and 410 deletions

View File

@@ -111,7 +111,7 @@ namespace Velopack.Sources
protected abstract string GetAssetUrlFromName(T release, string assetName); protected abstract string GetAssetUrlFromName(T release, string assetName);
/// <summary> /// <summary>
/// Provides a wrapper around <see cref="ReleaseEntry"/> which also contains a Git Release. /// Provides a wrapper around <see cref="VelopackAsset"/> which also contains a Git Release.
/// </summary> /// </summary>
protected internal record GitBaseAsset : VelopackAsset protected internal record GitBaseAsset : VelopackAsset
{ {

View File

@@ -27,7 +27,7 @@ namespace Velopack.Sources
/// metadata from this package may be provided to the remote server (such as package id, /// metadata from this package may be provided to the remote server (such as package id,
/// or cpu architecture) to ensure that the correct package is downloaded for this user. /// or cpu architecture) to ensure that the correct package is downloaded for this user.
/// </param> /// </param>
/// <returns>An array of <see cref="ReleaseEntry"/> objects that are available for download /// <returns>An array of <see cref="VelopackAsset"/> objects that are available for download
/// and are applicable to this user.</returns> /// and are applicable to this user.</returns>
Task<VelopackAssetFeed> GetReleaseFeed(IVelopackLogger logger, string? appId, string channel, Guid? stagingId = null, VelopackAsset? latestLocalRelease = null); Task<VelopackAssetFeed> GetReleaseFeed(IVelopackLogger logger, string? appId, string channel, Guid? stagingId = null, VelopackAsset? latestLocalRelease = null);

View File

@@ -169,7 +169,6 @@ namespace Velopack
} }
EnsureInstalled(); EnsureInstalled();
var installedVer = CurrentVersion!;
var matchingRemoteDelta = feed.Where(r => r.Type == VelopackAssetType.Delta && r.Version == latestRemoteFull.Version).FirstOrDefault(); var matchingRemoteDelta = feed.Where(r => r.Type == VelopackAssetType.Delta && r.Version == latestRemoteFull.Version).FirstOrDefault();
if (matchingRemoteDelta == null) { if (matchingRemoteDelta == null) {
@@ -328,7 +327,7 @@ namespace Velopack
async x => { async x => {
var targetFile = Locator.GetLocalPackagePath(x); var targetFile = Locator.GetLocalPackagePath(x);
double component = 0; double component = 0;
Log.Debug($"Downloading delta version {x.Version}"); Log.Info($"Downloading delta {x.Version}");
await Source.DownloadReleaseEntry( await Source.DownloadReleaseEntry(
Log, Log,
x, x,
@@ -347,7 +346,8 @@ namespace Velopack
Log.Debug($"Download complete for delta version {x.Version}"); Log.Debug($"Download complete for delta version {x.Version}");
}).ConfigureAwait(false); }).ConfigureAwait(false);
Log.Info("All delta packages downloaded and verified, applying them to the base now."); Log.Info("All delta packages downloaded and verified.");
Log.Info($"Applying {releasesToDownload.Length} patches to {updates.BaseRelease?.FileName}.");
// applying deltas accounts for 70%-100% of progress // applying deltas accounts for 70%-100% of progress
var baseFile = Locator.GetLocalPackagePath(updates.BaseRelease!); var baseFile = Locator.GetLocalPackagePath(updates.BaseRelease!);
@@ -365,10 +365,10 @@ namespace Velopack
} }
var psi = new ProcessStartInfo(updateExe); var psi = new ProcessStartInfo(updateExe);
psi.AppendArgumentListSafe(args, out var _); psi.AppendArgumentListSafe(args, out _);
psi.CreateNoWindow = true; psi.CreateNoWindow = true;
var p = psi.StartRedirectOutputToILogger(Log, VelopackLogLevel.Debug); var p = psi.StartRedirectOutputToILogger(Log, VelopackLogLevel.Debug);
if (!p.WaitForExit((int)TimeSpan.FromMinutes(5).TotalMilliseconds)) { if (!p.WaitForExit((int) TimeSpan.FromMinutes(5).TotalMilliseconds)) {
p.Kill(); p.Kill();
throw new TimeoutException("patch process timed out (5min)."); throw new TimeoutException("patch process timed out (5min).");
} }

View File

@@ -10,7 +10,7 @@ using Task = System.Threading.Tasks.Task;
namespace Velopack.Build; namespace Velopack.Build;
public class MSBuildLogger(TaskLoggingHelper loggingHelper) : ILogger, IFancyConsole, IFancyConsoleProgress public class MSBuildLogger(TaskLoggingHelper loggingHelper) : ILogger
{ {
private TaskLoggingHelper LoggingHelper { get; } = loggingHelper; private TaskLoggingHelper LoggingHelper { get; } = loggingHelper;
@@ -19,31 +19,6 @@ public class MSBuildLogger(TaskLoggingHelper loggingHelper) : ILogger, IFancyCon
throw new NotImplementedException(); throw new NotImplementedException();
} }
public async Task ExecuteProgressAsync(Func<IFancyConsoleProgress, Task> action)
{
await action(this).ConfigureAwait(false);
}
public async Task RunTask(string name, Func<Action<int>, Task> fn)
{
try {
await fn(x => { }).ConfigureAwait(false);
} catch (Exception ex) {
this.LogError(ex, "Error running task {taskName}", name);
throw;
}
}
public async Task<T> RunTask<T>(string name, Func<Action<int>, Task<T>> fn)
{
try {
return await fn(x => { }).ConfigureAwait(false);
} catch (Exception ex) {
this.LogError(ex, "Error running task {taskName}", name);
throw;
}
}
public bool IsEnabled(LogLevel logLevel) public bool IsEnabled(LogLevel logLevel)
{ {
return logLevel switch { return logLevel switch {
@@ -60,6 +35,7 @@ public class MSBuildLogger(TaskLoggingHelper loggingHelper) : ILogger, IFancyCon
if (exception != null) { if (exception != null) {
message += " " + exception.Message; message += " " + exception.Message;
} }
switch (logLevel) { switch (logLevel) {
case LogLevel.Trace: case LogLevel.Trace:
LoggingHelper.LogMessage(MessageImportance.Low, message); LoggingHelper.LogMessage(MessageImportance.Low, message);
@@ -79,27 +55,4 @@ public class MSBuildLogger(TaskLoggingHelper loggingHelper) : ILogger, IFancyCon
break; break;
} }
} }
}
public void WriteTable(string tableName, IEnumerable<IEnumerable<string>> rows, bool hasHeaderRow = true)
{
LoggingHelper.LogMessage(tableName);
foreach (var row in rows) {
LoggingHelper.LogMessage(" " + String.Join(" ", row));
}
}
public System.Threading.Tasks.Task<bool> PromptYesNo(string prompt, bool? defaultValue = null, TimeSpan? timeout = null)
{
return Task.FromResult(true);
}
public void WriteLine(string text = "")
{
Log(LogLevel.Information, 0, null, null, (object? state, Exception? exception) => text);
}
public string EscapeMarkup(string text)
{
return text;
}
}

View File

@@ -4,6 +4,7 @@ using System.Reflection;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Build.Framework; using Microsoft.Build.Framework;
using Velopack.Core;
using Velopack.Packaging; using Velopack.Packaging;
using Velopack.Packaging.Unix.Commands; using Velopack.Packaging.Unix.Commands;
using Velopack.Packaging.Windows.Commands; using Velopack.Packaging.Windows.Commands;
@@ -105,6 +106,7 @@ public class PackTask : MSBuildAsyncTask
{ {
//System.Diagnostics.Debugger.Launch(); //System.Diagnostics.Debugger.Launch();
try { try {
var console = new LoggerConsole(Logger);
HelperFile.ClearSearchPaths(); HelperFile.ClearSearchPaths();
var searchPath = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!, "..", "..", "vendor")); var searchPath = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!, "..", "..", "vendor"));
HelperFile.AddSearchPath(searchPath); HelperFile.AddSearchPath(searchPath);
@@ -132,15 +134,15 @@ public class PackTask : MSBuildAsyncTask
#pragma warning restore CS0618 // Type or member is obsolete #pragma warning restore CS0618 // Type or member is obsolete
} }
var runner = new WindowsPackCommandRunner(Logger, Logger); var runner = new WindowsPackCommandRunner(Logger, console);
await runner.Run(options).ConfigureAwait(false); await runner.Run(options).ConfigureAwait(false);
} else if (VelopackRuntimeInfo.IsOSX) { } else if (VelopackRuntimeInfo.IsOSX) {
var options = this.ToOsxPackOptions(); var options = this.ToOsxPackOptions();
var runner = new OsxPackCommandRunner(Logger, Logger); var runner = new OsxPackCommandRunner(Logger, console);
await runner.Run(options).ConfigureAwait(false); await runner.Run(options).ConfigureAwait(false);
} else if (VelopackRuntimeInfo.IsLinux) { } else if (VelopackRuntimeInfo.IsLinux) {
var options = this.ToLinuxPackOptions(); var options = this.ToLinuxPackOptions();
var runner = new LinuxPackCommandRunner(Logger, Logger); var runner = new LinuxPackCommandRunner(Logger, console);
await runner.Run(options).ConfigureAwait(false); await runner.Run(options).ConfigureAwait(false);
} else { } else {
throw new NotSupportedException("Unsupported OS platform: " + VelopackRuntimeInfo.SystemOs.GetOsLongName()); throw new NotSupportedException("Unsupported OS platform: " + VelopackRuntimeInfo.SystemOs.GetOsLongName());

View File

@@ -3,6 +3,7 @@ using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Build.Framework; using Microsoft.Build.Framework;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Velopack.Core;
using Velopack.Flow; using Velopack.Flow;
namespace Velopack.Build; namespace Velopack.Build;
@@ -44,7 +45,8 @@ public class PublishTask : MSBuildAsyncTask
AllowInteractiveLogin = false, AllowInteractiveLogin = false,
}; };
var client = new VelopackFlowServiceClient(options, Logger, Logger); var console = new LoggerConsole(Logger);
var client = new VelopackFlowServiceClient(options, Logger, console);
if (!await client.LoginAsync(loginOptions, false, cancellationToken).ConfigureAwait(false)) { if (!await client.LoginAsync(loginOptions, false, cancellationToken).ConfigureAwait(false)) {
Logger.LogWarning("Not logged into Velopack Flow service, skipping publish. Please run vpk login."); Logger.LogWarning("Not logged into Velopack Flow service, skipping publish. Please run vpk login.");
return true; return true;

View File

@@ -0,0 +1,55 @@
using Microsoft.Extensions.Logging;
using Velopack.Core.Abstractions;
namespace Velopack.Core;
public class LoggerConsole(ILogger log) : IFancyConsole, IFancyConsoleProgress
{
public async Task ExecuteProgressAsync(Func<IFancyConsoleProgress, Task> action)
{
await action(this).ConfigureAwait(false);
}
public async Task RunTask(string name, Func<Action<int>, Task> fn)
{
try {
await fn(x => { }).ConfigureAwait(false);
} catch (Exception ex) {
log.LogError(ex, "Error running task {taskName}", name);
throw;
}
}
public async Task<T> RunTask<T>(string name, Func<Action<int>, Task<T>> fn)
{
try {
return await fn(x => { }).ConfigureAwait(false);
} catch (Exception ex) {
log.LogError(ex, "Error running task {taskName}", name);
throw;
}
}
public void WriteTable(string tableName, IEnumerable<IEnumerable<string>> rows, bool hasHeaderRow = true)
{
log.LogInformation(tableName);
foreach (var row in rows) {
log.LogInformation(" " + String.Join(" ", row));
}
}
public Task<bool> PromptYesNo(string prompt, bool? defaultValue = null, TimeSpan? timeout = null)
{
return Task.FromResult(true);
}
public void WriteLine(string text = "")
{
log.LogInformation(text);
}
public string EscapeMarkup(string text)
{
return text;
}
}

View File

@@ -13,7 +13,7 @@ using System.Threading.Tasks;
using NuGet.Versioning; using NuGet.Versioning;
using Velopack.Util; using Velopack.Util;
namespace Velopack namespace Velopack.Core
{ {
/// <summary> /// <summary>
/// Describes the requested release notes text format. /// Describes the requested release notes text format.
@@ -146,7 +146,7 @@ namespace Velopack
/// <summary> /// <summary>
/// Create a new instance of <see cref="ReleaseEntry"/>. /// Create a new instance of <see cref="ReleaseEntry"/>.
/// </summary> /// </summary>
protected internal ReleaseEntry(string sha1, string filename, long filesize, string baseUrl = null, string query = null, float? stagingPercentage = null) public ReleaseEntry(string sha1, string filename, long filesize, string baseUrl = null, string query = null, float? stagingPercentage = null)
{ {
Contract.Requires(sha1 != null && sha1.Length == 40); Contract.Requires(sha1 != null && sha1.Length == 40);
Contract.Requires(filename != null); Contract.Requires(filename != null);

View File

@@ -1,6 +1,7 @@
#nullable enable #nullable enable
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Velopack.Core;
using Velopack.Exceptions; using Velopack.Exceptions;
using Velopack.Logging; using Velopack.Logging;
using Velopack.Util; using Velopack.Util;

View File

@@ -1,347 +1,327 @@
//using System; using Velopack.Core;
//using System.Collections.Generic; using Velopack.Packaging.Commands;
//using System.IO; using Velopack.Util;
//using System.Linq;
//using System.Threading.Tasks; namespace Velopack.Packaging.Tests;
//using Squirrel.NuGet;
//using Squirrel; public class ApplyDeltaPackageTests(ITestOutputHelper output)
//using Squirrel.SimpleSplat; {
//using Squirrel.Tests.TestHelpers; // [Fact]
//using Xunit; // public void ApplyDeltaPackageSmokeTest()
//using Xunit.Abstractions; // {
//using NuGet.Versioning; // var basePackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Core.1.0.0.0-full.nupkg");
//using Squirrel.CommandLine; // var deltaPackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Core.1.1.0.0-delta.nupkg");
// var expectedPackageFile = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Core.1.1.0.0-full.nupkg");
//namespace Squirrel.Tests // var outFile = Path.GetTempFileName() + ".nupkg";
//{ //
// public class ApplyDeltaPackageTests : TestLoggingBase // try {
// { // var deltaBuilder = new DeltaPackage();
// public ApplyDeltaPackageTests(ITestOutputHelper log) : base(log) // deltaBuilder.ApplyDeltaPackage(basePackage, deltaPackage, outFile);
// { //
// } // var result = new ZipPackage(outFile);
// var expected = new ZipPackage(expectedPackageFile);
// [Fact] //
// public void ApplyDeltaPackageSmokeTest() // result.Id.ShouldEqual(expected.Id);
// { // result.Version.ShouldEqual(expected.Version);
// var basePackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Core.1.0.0.0-full.nupkg"); //
// var deltaPackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Core.1.1.0.0-delta.nupkg"); // this.Log().Info("Expected file list:");
// var expectedPackageFile = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Core.1.1.0.0-full.nupkg"); // var expectedList = expected.Files.Select(x => x.Path).OrderBy(x => x).ToList();
// var outFile = Path.GetTempFileName() + ".nupkg"; // expectedList.ForEach(x => this.Log().Info(x));
//
// try { // this.Log().Info("Actual file list:");
// var deltaBuilder = new DeltaPackage(); // var actualList = result.Files.Select(x => x.Path).OrderBy(x => x).ToList();
// deltaBuilder.ApplyDeltaPackage(basePackage, deltaPackage, outFile); // actualList.ForEach(x => this.Log().Info(x));
//
// var result = new ZipPackage(outFile); // Enumerable.Zip(expectedList, actualList, (e, a) => e == a)
// var expected = new ZipPackage(expectedPackageFile); // .All(x => x != false)
// .ShouldBeTrue();
// result.Id.ShouldEqual(expected.Id); // } finally {
// result.Version.ShouldEqual(expected.Version); // if (File.Exists(outFile)) {
// File.Delete(outFile);
// this.Log().Info("Expected file list:"); // }
// var expectedList = expected.Files.Select(x => x.Path).OrderBy(x => x).ToList(); // }
// expectedList.ForEach(x => this.Log().Info(x)); // }
//
// this.Log().Info("Actual file list:"); // [Fact]
// var actualList = result.Files.Select(x => x.Path).OrderBy(x => x).ToList(); // public void ApplyDeltaWithBothBsdiffAndNormalDiffDoesntFail()
// actualList.ForEach(x => this.Log().Info(x)); // {
// var basePackage = IntegrationTestHelper.GetPath("fixtures", "slack-1.1.8-full.nupkg");
// Enumerable.Zip(expectedList, actualList, (e, a) => e == a) // var deltaPackage = IntegrationTestHelper.GetPath("fixtures", "slack-1.2.0-delta.nupkg");
// .All(x => x != false) // var outFile = Path.GetTempFileName() + ".nupkg";
// .ShouldBeTrue(); //
// } finally { // try {
// if (File.Exists(outFile)) { // var deltaBuilder = new DeltaPackage();
// File.Delete(outFile); // deltaBuilder.ApplyDeltaPackage(basePackage, deltaPackage, outFile);
// } //
// } // var result = new ZipPackage(outFile);
// } //
// result.Id.ShouldEqual("slack");
// [Fact] // result.Version.ShouldEqual(SemanticVersion.Parse("1.2.0"));
// public void ApplyDeltaWithBothBsdiffAndNormalDiffDoesntFail() // } finally {
// { // if (File.Exists(outFile)) {
// var basePackage = IntegrationTestHelper.GetPath("fixtures", "slack-1.1.8-full.nupkg"); // File.Delete(outFile);
// var deltaPackage = IntegrationTestHelper.GetPath("fixtures", "slack-1.2.0-delta.nupkg"); // }
// var outFile = Path.GetTempFileName() + ".nupkg"; // }
// }
// try {
// var deltaBuilder = new DeltaPackage(); [Fact]
// deltaBuilder.ApplyDeltaPackage(basePackage, deltaPackage, outFile); public async Task ApplyMultipleDeltasFast()
{
// var result = new ZipPackage(outFile); var basePackage = PathHelper.GetFixture("Clowd-3.4.287-full.nupkg");
var deltaPackage1 = PathHelper.GetFixture("Clowd-3.4.288-delta.nupkg");
// result.Id.ShouldEqual("slack"); var deltaPackage2 = PathHelper.GetFixture("Clowd-3.4.291-delta.nupkg");
// result.Version.ShouldEqual(SemanticVersion.Parse("1.2.0")); var deltaPackage3 = PathHelper.GetFixture("Clowd-3.4.292-delta.nupkg");
// } finally {
// if (File.Exists(outFile)) { using var t2 = TempUtil.GetTempDirectory(out var temp);
// File.Delete(outFile); using var logger = output.BuildLoggerFor<GithubDeploymentTests>();
// } var console = new LoggerConsole(logger);
// }
// } var runner = new DeltaPatchCommandRunner(logger, console);
await runner.Run(
// [Fact] new DeltaPatchOptions() {
// public void ApplyMultipleDeltasFast() BasePackage = basePackage,
// { OutputFile = Path.Combine(temp, "Clowd-3.4.292-full.nupkg"),
// var basePackage = IntegrationTestHelper.GetPath("fixtures", "Clowd-3.4.287-full.nupkg"); PatchFiles = [
// var deltaPackage1 = IntegrationTestHelper.GetPath("fixtures", "Clowd-3.4.288-delta.nupkg"); new FileInfo(deltaPackage1),
// var deltaPackage2 = IntegrationTestHelper.GetPath("fixtures", "Clowd-3.4.291-delta.nupkg"); new FileInfo(deltaPackage2),
// var deltaPackage3 = IntegrationTestHelper.GetPath("fixtures", "Clowd-3.4.292-delta.nupkg"); new FileInfo(deltaPackage3),
]
// using var t1 = Utility.GetTempDirectory(out var appDir); });
// using var t2 = Utility.GetTempDirectory(out var updateDir);
// var newEntry = um.createFullPackagesFromDeltas(toApply, baseEntry, progress.Add);
// using var um = UpdateManagerTestImpl.FromLocalPackageTempDir(updateDir, "theApp", appDir); //
// var pkgDir = um.Config.PackagesDir; // var outFile = Path.Combine(pkgDir, newEntry.Filename);
// var result = new ZipPackage(outFile);
// File.Copy(basePackage, Path.Combine(pkgDir, Path.GetFileName(basePackage))); // result.Id.ShouldEqual("Clowd");
// File.Copy(deltaPackage1, Path.Combine(pkgDir, Path.GetFileName(deltaPackage1))); // result.Version.ShouldEqual(SemanticVersion.Parse("3.4.292"));
// File.Copy(deltaPackage2, Path.Combine(pkgDir, Path.GetFileName(deltaPackage2))); }
// File.Copy(deltaPackage3, Path.Combine(pkgDir, Path.GetFileName(deltaPackage3)));
// [Fact(Skip = "Rewrite this test, the original uses too many heavyweight fixtures")]
// var baseEntry = ReleaseEntry.GenerateFromFile(basePackage); // public void ApplyMultipleDeltaPackagesGeneratesCorrectHash()
// {
// var toApply = new [] { // Assert.Fail("Rewrite this test, the original uses too many heavyweight fixtures");
// ReleaseEntry.GenerateFromFile(deltaPackage1), // }
// ReleaseEntry.GenerateFromFile(deltaPackage2), }
// ReleaseEntry.GenerateFromFile(deltaPackage3),
// }; // public class CreateDeltaPackageTests : IEnableLogger
// {
// List<int> progress = new List<int>(); // [Fact]
// public void CreateDeltaPackageIntegrationTest()
// var newEntry = um.createFullPackagesFromDeltas(toApply, baseEntry, progress.Add); // {
// var basePackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.1.0-pre.nupkg");
// var outFile = Path.Combine(pkgDir, newEntry.Filename); // var newPackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.2.0-pre.nupkg");
// var result = new ZipPackage(outFile); //
// result.Id.ShouldEqual("Clowd"); // var baseFixture = new ReleasePackageBuilder(basePackage);
// result.Version.ShouldEqual(SemanticVersion.Parse("3.4.292")); // var fixture = new ReleasePackageBuilder(newPackage);
// } //
// var tempFiles = Enumerable.Range(0, 3)
// [Fact(Skip = "Rewrite this test, the original uses too many heavyweight fixtures")] // .Select(_ => Path.GetTempPath() + Guid.NewGuid().ToString() + ".nupkg")
// public void ApplyMultipleDeltaPackagesGeneratesCorrectHash() // .ToArray();
// { //
// Assert.Fail("Rewrite this test, the original uses too many heavyweight fixtures"); // try {
// } // baseFixture.CreateReleasePackage(tempFiles[0]);
// } // fixture.CreateReleasePackage(tempFiles[1]);
//
// public class CreateDeltaPackageTests : IEnableLogger // (new FileInfo(baseFixture.ReleasePackageFile)).Exists.ShouldBeTrue();
// { // (new FileInfo(fixture.ReleasePackageFile)).Exists.ShouldBeTrue();
// [Fact] //
// public void CreateDeltaPackageIntegrationTest() // var deltaBuilder = new DeltaPackageBuilder();
// { // deltaBuilder.CreateDeltaPackage(baseFixture, fixture, tempFiles[2]);
// var basePackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.1.0-pre.nupkg"); //
// var newPackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.2.0-pre.nupkg"); // var fullPkg = new ZipPackage(tempFiles[1]);
// var deltaPkg = new ZipPackage(tempFiles[2]);
// var baseFixture = new ReleasePackageBuilder(basePackage); //
// var fixture = new ReleasePackageBuilder(newPackage); // //
// // Package Checks
// var tempFiles = Enumerable.Range(0, 3) // //
// .Select(_ => Path.GetTempPath() + Guid.NewGuid().ToString() + ".nupkg") //
// .ToArray(); // fullPkg.Id.ShouldEqual(deltaPkg.Id);
// fullPkg.Version.CompareTo(deltaPkg.Version).ShouldEqual(0);
// try { //
// baseFixture.CreateReleasePackage(tempFiles[0]); // // Delta packages should be smaller than the original!
// fixture.CreateReleasePackage(tempFiles[1]); // var fileInfos = tempFiles.Select(x => new FileInfo(x)).ToArray();
// this.Log().Info("Base Size: {0}, Current Size: {1}, Delta Size: {2}",
// (new FileInfo(baseFixture.ReleasePackageFile)).Exists.ShouldBeTrue(); // fileInfos[0].Length, fileInfos[1].Length, fileInfos[2].Length);
// (new FileInfo(fixture.ReleasePackageFile)).Exists.ShouldBeTrue(); //
// (fileInfos[2].Length - fileInfos[1].Length).ShouldBeLessThan(0);
// var deltaBuilder = new DeltaPackageBuilder(); //
// deltaBuilder.CreateDeltaPackage(baseFixture, fixture, tempFiles[2]); // //
// // File Checks
// var fullPkg = new ZipPackage(tempFiles[1]); // ///
// var deltaPkg = new ZipPackage(tempFiles[2]); //
// var deltaPkgFiles = deltaPkg.Files.ToList();
// // // deltaPkgFiles.Count.ShouldBeGreaterThan(0);
// // Package Checks //
// // // this.Log().Info("Files in delta package:");
// deltaPkgFiles.ForEach(x => this.Log().Info(x.Path));
// fullPkg.Id.ShouldEqual(deltaPkg.Id); //
// fullPkg.Version.CompareTo(deltaPkg.Version).ShouldEqual(0); // var newFilesAdded = new[] {
// "Newtonsoft.Json.dll",
// // Delta packages should be smaller than the original! // //"Refit.dll",
// var fileInfos = tempFiles.Select(x => new FileInfo(x)).ToArray(); // //"Refit-Portable.dll",
// this.Log().Info("Base Size: {0}, Current Size: {1}, Delta Size: {2}", // //"Castle.Core.dll",
// fileInfos[0].Length, fileInfos[1].Length, fileInfos[2].Length); // }.Select(x => x.ToLowerInvariant());
//
// (fileInfos[2].Length - fileInfos[1].Length).ShouldBeLessThan(0); // // vNext adds a dependency on Refit
// newFilesAdded
// // // .All(x => deltaPkgFiles.Any(y => y.Path.ToLowerInvariant().Contains(x)))
// // File Checks // .ShouldBeTrue();
// /// //
// // All the other files should be diffs and shasums
// var deltaPkgFiles = deltaPkg.Files.ToList(); // deltaPkgFiles
// deltaPkgFiles.Count.ShouldBeGreaterThan(0); // .Where(x => !newFilesAdded.Any(y => x.Path.ToLowerInvariant().Contains(y)))
// .All(x => x.Path.ToLowerInvariant().EndsWith("bsdiff") || x.Path.ToLowerInvariant().EndsWith("shasum"))
// this.Log().Info("Files in delta package:"); // .ShouldBeTrue();
// deltaPkgFiles.ForEach(x => this.Log().Info(x.Path)); //
// // Every .diff file should have a shasum file
// var newFilesAdded = new[] { // deltaPkg.Files.Any(x => x.Path.ToLowerInvariant().EndsWith(".bsdiff")).ShouldBeTrue();
// "Newtonsoft.Json.dll", // deltaPkg.Files
// //"Refit.dll", // .Where(x => x.Path.ToLowerInvariant().EndsWith(".bsdiff"))
// //"Refit-Portable.dll", // .ForEach(x => {
// //"Castle.Core.dll", // var lookingFor = x.Path.Replace(".bsdiff", ".shasum");
// }.Select(x => x.ToLowerInvariant()); // this.Log().Info("Looking for corresponding shasum file: {0}", lookingFor);
// deltaPkg.Files.Any(y => y.Path == lookingFor).ShouldBeTrue();
// // vNext adds a dependency on Refit // });
// newFilesAdded // } finally {
// .All(x => deltaPkgFiles.Any(y => y.Path.ToLowerInvariant().Contains(x))) // tempFiles.ForEach(File.Delete);
// .ShouldBeTrue(); // }
// }
// // All the other files should be diffs and shasums //
// deltaPkgFiles // [Fact]
// .Where(x => !newFilesAdded.Any(y => x.Path.ToLowerInvariant().Contains(y))) // public void WhenBasePackageIsNewerThanNewPackageThrowException()
// .All(x => x.Path.ToLowerInvariant().EndsWith("bsdiff") || x.Path.ToLowerInvariant().EndsWith("shasum")) // {
// .ShouldBeTrue(); // var basePackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.2.0-pre.nupkg");
// var newPackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.1.0-pre.nupkg");
// // Every .diff file should have a shasum file //
// deltaPkg.Files.Any(x => x.Path.ToLowerInvariant().EndsWith(".bsdiff")).ShouldBeTrue(); // var baseFixture = new ReleasePackageBuilder(basePackage);
// deltaPkg.Files // var fixture = new ReleasePackageBuilder(newPackage);
// .Where(x => x.Path.ToLowerInvariant().EndsWith(".bsdiff")) //
// .ForEach(x => { // var tempFiles = Enumerable.Range(0, 3)
// var lookingFor = x.Path.Replace(".bsdiff", ".shasum"); // .Select(_ => Path.GetTempPath() + Guid.NewGuid().ToString() + ".nupkg")
// this.Log().Info("Looking for corresponding shasum file: {0}", lookingFor); // .ToArray();
// deltaPkg.Files.Any(y => y.Path == lookingFor).ShouldBeTrue(); //
// }); // try {
// } finally { // baseFixture.CreateReleasePackage(tempFiles[0]);
// tempFiles.ForEach(File.Delete); // fixture.CreateReleasePackage(tempFiles[1]);
// } //
// } // (new FileInfo(baseFixture.ReleasePackageFile)).Exists.ShouldBeTrue();
// (new FileInfo(fixture.ReleasePackageFile)).Exists.ShouldBeTrue();
// [Fact] //
// public void WhenBasePackageIsNewerThanNewPackageThrowException() // Assert.Throws<InvalidOperationException>(() => {
// { // var deltaBuilder = new DeltaPackageBuilder();
// var basePackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.2.0-pre.nupkg"); // deltaBuilder.CreateDeltaPackage(baseFixture, fixture, tempFiles[2]);
// var newPackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.1.0-pre.nupkg"); // });
// } finally {
// var baseFixture = new ReleasePackageBuilder(basePackage); // tempFiles.ForEach(File.Delete);
// var fixture = new ReleasePackageBuilder(newPackage); // }
// }
// var tempFiles = Enumerable.Range(0, 3) //
// .Select(_ => Path.GetTempPath() + Guid.NewGuid().ToString() + ".nupkg") // [Fact]
// .ToArray(); // public void WhenBasePackageReleaseIsNullThrowsException()
// {
// try { // var basePackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Core.1.0.0.0.nupkg");
// baseFixture.CreateReleasePackage(tempFiles[0]); // var newPackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Core.1.1.0.0.nupkg");
// fixture.CreateReleasePackage(tempFiles[1]); //
// var sourceDir = IntegrationTestHelper.GetPath("fixtures", "packages");
// (new FileInfo(baseFixture.ReleasePackageFile)).Exists.ShouldBeTrue(); // (new DirectoryInfo(sourceDir)).Exists.ShouldBeTrue();
// (new FileInfo(fixture.ReleasePackageFile)).Exists.ShouldBeTrue(); //
// var baseFixture = new ReleasePackageBuilder(basePackage);
// Assert.Throws<InvalidOperationException>(() => { // var fixture = new ReleasePackageBuilder(newPackage);
// var deltaBuilder = new DeltaPackageBuilder(); //
// deltaBuilder.CreateDeltaPackage(baseFixture, fixture, tempFiles[2]); // var tempFile = Path.GetTempPath() + Guid.NewGuid() + ".nupkg";
// }); //
// } finally { // try {
// tempFiles.ForEach(File.Delete); // Assert.Throws<ArgumentException>(() => {
// } // var deltaBuilder = new DeltaPackageBuilder();
// } // deltaBuilder.CreateDeltaPackage(baseFixture, fixture, tempFile);
// });
// [Fact] // } finally {
// public void WhenBasePackageReleaseIsNullThrowsException() // File.Delete(tempFile);
// { // }
// var basePackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Core.1.0.0.0.nupkg"); // }
// var newPackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Core.1.1.0.0.nupkg"); //
// [Fact]
// var sourceDir = IntegrationTestHelper.GetPath("fixtures", "packages"); // public void WhenBasePackageDoesNotExistThrowException()
// (new DirectoryInfo(sourceDir)).Exists.ShouldBeTrue(); // {
// var basePackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.1.0-pre.nupkg");
// var baseFixture = new ReleasePackageBuilder(basePackage); // var newPackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.2.0-pre.nupkg");
// var fixture = new ReleasePackageBuilder(newPackage); //
// var baseFixture = new ReleasePackageBuilder(basePackage);
// var tempFile = Path.GetTempPath() + Guid.NewGuid() + ".nupkg"; // var fixture = new ReleasePackageBuilder(newPackage);
//
// try { // var tempFiles = Enumerable.Range(0, 3)
// Assert.Throws<ArgumentException>(() => { // .Select(_ => Path.GetTempPath() + Guid.NewGuid().ToString() + ".nupkg")
// var deltaBuilder = new DeltaPackageBuilder(); // .ToArray();
// deltaBuilder.CreateDeltaPackage(baseFixture, fixture, tempFile); //
// }); // try {
// } finally { // baseFixture.CreateReleasePackage(tempFiles[0]);
// File.Delete(tempFile); // fixture.CreateReleasePackage(tempFiles[1]);
// } //
// } // (new FileInfo(baseFixture.ReleasePackageFile)).Exists.ShouldBeTrue();
// (new FileInfo(fixture.ReleasePackageFile)).Exists.ShouldBeTrue();
// [Fact] //
// public void WhenBasePackageDoesNotExistThrowException() // // NOW WATCH AS THE FILE DISAPPEARS
// { // File.Delete(baseFixture.ReleasePackageFile);
// var basePackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.1.0-pre.nupkg"); //
// var newPackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.2.0-pre.nupkg"); // Assert.Throws<FileNotFoundException>(() => {
// var deltaBuilder = new DeltaPackageBuilder();
// var baseFixture = new ReleasePackageBuilder(basePackage); // deltaBuilder.CreateDeltaPackage(baseFixture, fixture, tempFiles[2]);
// var fixture = new ReleasePackageBuilder(newPackage); // });
// } finally {
// var tempFiles = Enumerable.Range(0, 3) // tempFiles.ForEach(File.Delete);
// .Select(_ => Path.GetTempPath() + Guid.NewGuid().ToString() + ".nupkg") // }
// .ToArray(); // }
//
// try { // [Fact]
// baseFixture.CreateReleasePackage(tempFiles[0]); // public void WhenNewPackageDoesNotExistThrowException()
// fixture.CreateReleasePackage(tempFiles[1]); // {
// var basePackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.1.0-pre.nupkg");
// (new FileInfo(baseFixture.ReleasePackageFile)).Exists.ShouldBeTrue(); // var newPackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.2.0-pre.nupkg");
// (new FileInfo(fixture.ReleasePackageFile)).Exists.ShouldBeTrue(); //
// var baseFixture = new ReleasePackageBuilder(basePackage);
// // NOW WATCH AS THE FILE DISAPPEARS // var fixture = new ReleasePackageBuilder(newPackage);
// File.Delete(baseFixture.ReleasePackageFile); //
// var tempFiles = Enumerable.Range(0, 3)
// Assert.Throws<FileNotFoundException>(() => { // .Select(_ => Path.GetTempPath() + Guid.NewGuid().ToString() + ".nupkg")
// var deltaBuilder = new DeltaPackageBuilder(); // .ToArray();
// deltaBuilder.CreateDeltaPackage(baseFixture, fixture, tempFiles[2]); //
// }); // try {
// } finally { // baseFixture.CreateReleasePackage(tempFiles[0]);
// tempFiles.ForEach(File.Delete); // fixture.CreateReleasePackage(tempFiles[1]);
// } //
// } // (new FileInfo(baseFixture.ReleasePackageFile)).Exists.ShouldBeTrue();
// (new FileInfo(fixture.ReleasePackageFile)).Exists.ShouldBeTrue();
// [Fact] //
// public void WhenNewPackageDoesNotExistThrowException() // // NOW WATCH AS THE FILE DISAPPEARS
// { // File.Delete(fixture.ReleasePackageFile);
// var basePackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.1.0-pre.nupkg"); //
// var newPackage = IntegrationTestHelper.GetPath("fixtures", "Squirrel.Tests.0.2.0-pre.nupkg"); // Assert.Throws<FileNotFoundException>(() => {
// var deltaBuilder = new DeltaPackageBuilder();
// var baseFixture = new ReleasePackageBuilder(basePackage); // deltaBuilder.CreateDeltaPackage(baseFixture, fixture, tempFiles[2]);
// var fixture = new ReleasePackageBuilder(newPackage); // });
// } finally {
// var tempFiles = Enumerable.Range(0, 3) // tempFiles.ForEach(File.Delete);
// .Select(_ => Path.GetTempPath() + Guid.NewGuid().ToString() + ".nupkg") // }
// .ToArray(); // }
//
// try { // [Fact]
// baseFixture.CreateReleasePackage(tempFiles[0]); // public void HandleBsDiffWithoutExtraData()
// fixture.CreateReleasePackage(tempFiles[1]); // {
// var baseFileData = new byte[] { 1, 1, 1, 1 };
// (new FileInfo(baseFixture.ReleasePackageFile)).Exists.ShouldBeTrue(); // var newFileData = new byte[] { 2, 1, 1, 1 };
// (new FileInfo(fixture.ReleasePackageFile)).Exists.ShouldBeTrue(); //
// byte[] patchData;
// // NOW WATCH AS THE FILE DISAPPEARS //
// File.Delete(fixture.ReleasePackageFile); // using (var patchOut = new MemoryStream()) {
// Bsdiff.BinaryPatchUtility.Create(baseFileData, newFileData, patchOut);
// Assert.Throws<FileNotFoundException>(() => { // patchData = patchOut.ToArray();
// var deltaBuilder = new DeltaPackageBuilder(); // }
// deltaBuilder.CreateDeltaPackage(baseFixture, fixture, tempFiles[2]); //
// }); // using (var toPatch = new MemoryStream(baseFileData))
// } finally { // using (var patched = new MemoryStream()) {
// tempFiles.ForEach(File.Delete); // Bsdiff.BinaryPatchUtility.Apply(toPatch, () => new MemoryStream(patchData), patched);
// } //
// } // Assert.Equal(newFileData, patched.ToArray());
// }
// [Fact] // }
// public void HandleBsDiffWithoutExtraData() // }
// {
// var baseFileData = new byte[] { 1, 1, 1, 1 };
// var newFileData = new byte[] { 2, 1, 1, 1 };
// byte[] patchData;
// using (var patchOut = new MemoryStream()) {
// Bsdiff.BinaryPatchUtility.Create(baseFileData, newFileData, patchOut);
// patchData = patchOut.ToArray();
// }
// using (var toPatch = new MemoryStream(baseFileData))
// using (var patched = new MemoryStream()) {
// Bsdiff.BinaryPatchUtility.Apply(toPatch, () => new MemoryStream(patchData), patched);
// Assert.Equal(newFileData, patched.ToArray());
// }
// }
// }
//}

View File

@@ -1,6 +1,7 @@
#pragma warning disable CS0618 // Type or member is obsolete #pragma warning disable CS0618 // Type or member is obsolete
using System.Text; using System.Text;
using NuGet.Versioning; using NuGet.Versioning;
using Velopack.Core;
using OldReleaseEntry = Velopack.Tests.OldSquirrel.ReleaseEntry; using OldReleaseEntry = Velopack.Tests.OldSquirrel.ReleaseEntry;
using OldSemanticVersion = Velopack.Tests.OldSquirrel.SemanticVersion; using OldSemanticVersion = Velopack.Tests.OldSquirrel.SemanticVersion;