diff --git a/src/Framework/test/SharedFxTests.cs b/src/Framework/test/SharedFxTests.cs index 35955630c82f..52d89ea938da 100644 --- a/src/Framework/test/SharedFxTests.cs +++ b/src/Framework/test/SharedFxTests.cs @@ -2,8 +2,12 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.IO; using System.Linq; +using System.Reflection; +using System.Reflection.Metadata; +using System.Reflection.PortableExecutable; using Newtonsoft.Json.Linq; using Xunit; using Xunit.Abstractions; @@ -81,7 +85,7 @@ public void SharedFrameworkContainsExpectedFiles() } [Fact] - public void ItContainsValidRuntimeConfigFile() + public void SharedFrameworkContainsValidRuntimeConfigFile() { var runtimeConfigFilePath = Path.Combine(_sharedFxRoot, "Microsoft.AspNetCore.App.runtimeconfig.json"); @@ -98,7 +102,7 @@ public void ItContainsValidRuntimeConfigFile() } [Fact] - public void ItContainsValidDepsJson() + public void SharedFrameworkContainsValidDepsJson() { var depsFilePath = Path.Combine(_sharedFxRoot, "Microsoft.AspNetCore.App.deps.json"); @@ -155,6 +159,46 @@ public void ItContainsValidDepsJson() } } + [Fact] + public void SharedFrameworkAssembliesHaveExpectedAssemblyVersions() + { + // Only test managed assemblies + IEnumerable dlls = Directory.GetFiles(_sharedFxRoot, "*.dll", SearchOption.AllDirectories).Where(i => !i.Contains("aspnetcorev2_inprocess")); + Assert.NotEmpty(dlls); + + Assert.All(dlls, path => + { + using var fileStream = File.OpenRead(path); + using var peReader = new PEReader(fileStream, PEStreamOptions.Default); + var reader = peReader.GetMetadataReader(MetadataReaderOptions.Default); + var assemblyDefinition = reader.GetAssemblyDefinition(); + + // Assembly versions should all match Major.Minor.0.0 + Assert.Equal(0, assemblyDefinition.Version.Build); + Assert.Equal(0, assemblyDefinition.Version.Revision); + }); + } + + [Fact] + public void SharedFrameworkAssemblyReferencesHaveExpectedAssemblyVersions() + { + IEnumerable dlls = Directory.GetFiles(_sharedFxRoot, "*.dll", SearchOption.AllDirectories).Where(i => !i.Contains("aspnetcorev2_inprocess") && !i.Contains("System.Security.Cryptography.Xml", StringComparison.OrdinalIgnoreCase)); + Assert.NotEmpty(dlls); + + Assert.All(dlls, path => + { + using var fileStream = File.OpenRead(path); + using var peReader = new PEReader(fileStream, PEStreamOptions.Default); + var reader = peReader.GetMetadataReader(MetadataReaderOptions.Default); + + Assert.All(reader.AssemblyReferences, handle => + { + var reference = reader.GetAssemblyReference(handle); + Assert.Equal(0, reference.Version.Revision); + }); + }); + } + [Fact] public void ItContainsVersionFile() { diff --git a/src/Framework/test/TargetingPackTests.cs b/src/Framework/test/TargetingPackTests.cs index d0396314927e..519681e80c9a 100644 --- a/src/Framework/test/TargetingPackTests.cs +++ b/src/Framework/test/TargetingPackTests.cs @@ -89,6 +89,31 @@ public void RefAssembliesHaveExpectedAssemblyVersions() }); } + [Fact] + public void RefAssemblyReferencesHaveExpectedAssemblyVersions() + { + if (!_isTargetingPackBuilding) + { + return; + } + + IEnumerable dlls = Directory.GetFiles(Path.Combine(_targetingPackRoot, "ref", _targetingPackTfm), "*.dll", SearchOption.AllDirectories); + Assert.NotEmpty(dlls); + + Assert.All(dlls, path => + { + using var fileStream = File.OpenRead(path); + using var peReader = new PEReader(fileStream, PEStreamOptions.Default); + var reader = peReader.GetMetadataReader(MetadataReaderOptions.Default); + + Assert.All(reader.AssemblyReferences, handle => + { + var reference = reader.GetAssemblyReference(handle); + Assert.Equal(0, reference.Version.Revision); + }); + }); + } + [Fact] public void PackageOverridesContainsCorrectEntries() {