diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageAssetsTask.cs b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageAssetsTask.cs index 9e511c166fe7..fd3883014733 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageAssetsTask.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageAssetsTask.cs @@ -4,6 +4,8 @@ using FluentAssertions; using Microsoft.Build.Framework; using System; +using System.Collections; +using System.Collections.Generic; using System.Linq; using System.Reflection; using Xunit; @@ -15,27 +17,9 @@ public class GivenAResolvePackageAssetsTask [Fact] public void ItHashesAllParameters() { - var inputProperties = typeof(ResolvePackageAssets) - .GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public) - .Where(p => !p.IsDefined(typeof(OutputAttribute)) && - p.Name != nameof(ResolvePackageAssets.DesignTimeBuild)) - .OrderBy(p => p.Name, StringComparer.Ordinal); + IEnumerable inputProperties; - var requiredProperties = inputProperties - .Where(p => p.IsDefined(typeof(RequiredAttribute))); - - var task = new ResolvePackageAssets(); - - // Initialize all required properties as a genuine task invocation would. We do this - // because HashSettings need not defend against required parameters being null. - foreach (var property in requiredProperties) - { - property.PropertyType.Should().Be( - typeof(string), - because: $"this test hasn't been updated to handle non-string required task parameters like {property.Name}"); - - property.SetValue(task, "_"); - } + var task = InitializeTask(out inputProperties); byte[] oldHash; try @@ -80,6 +64,50 @@ public void ItHashesAllParameters() oldHash = newHash; } } + + [Fact] + public void ItDoesNotHashDesignTimeBuild() + { + var task = InitializeTask(out _); + + task.DesignTimeBuild = false; + + byte[] oldHash = task.HashSettings(); + + task.DesignTimeBuild = true; + + byte[] newHash = task.HashSettings(); + + newHash.Should().BeEquivalentTo(oldHash, + because: $"{nameof(task.DesignTimeBuild)} should not be included in hash."); + } + + private ResolvePackageAssets InitializeTask(out IEnumerable inputProperties) + { + inputProperties = typeof(ResolvePackageAssets) + .GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public) + .Where(p => !p.IsDefined(typeof(OutputAttribute)) && + p.Name != nameof(ResolvePackageAssets.DesignTimeBuild)) + .OrderBy(p => p.Name, StringComparer.Ordinal); + + var requiredProperties = inputProperties + .Where(p => p.IsDefined(typeof(RequiredAttribute))); + + var task = new ResolvePackageAssets(); + + // Initialize all required properties as a genuine task invocation would. We do this + // because HashSettings need not defend against required parameters being null. + foreach (var property in requiredProperties) + { + property.PropertyType.Should().Be( + typeof(string), + because: $"this test hasn't been updated to handle non-string required task parameters like {property.Name}"); + + property.SetValue(task, "_"); + } + + return task; + } } } diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageAssets.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageAssets.cs index 6a5b461ad4af..fb105165560c 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageAssets.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageAssets.cs @@ -373,7 +373,6 @@ internal byte[] HashSettings() { using (var writer = new BinaryWriter(stream, TextEncoding, leaveOpen: true)) { - writer.Write(DesignTimeBuild); writer.Write(DisablePackageAssetsCache); writer.Write(DisableFrameworkAssemblies); writer.Write(CopyLocalRuntimeTargetAssets);