/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/Core/CodeAnalysisTest/MetadataReferences/AssemblyIdentityComparerTests.cs
826 строк
41 KB
Jared Parsons
generated move
28 сен 2020, 19:36
28 сен 2020, 19:36
1cca63b
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System.IO; using Roslyn.Test.Utilities; using Xunit; namespace Microsoft.CodeAnalysis.UnitTests { public class AssemblyIdentityComparerTests : AssemblyIdentityTestBase { private void TestMatch( string displayName1, string displayName2, AssemblyIdentityComparer.ComparisonResult match, AssemblyIdentityComparer.ComparisonResult? fusionMatch = null, bool ignoreVersion = false, bool partial = false, bool unificationApplied = false, bool? fusionUnificationApplied = null, string policyPath = null) { if (fusionMatch == null) { fusionMatch = match; } using (var fusionPolicy = policyPath != null ? FusionAssemblyPortabilityPolicy.LoadFromFile(policyPath) : null) { var comparer = DesktopAssemblyIdentityComparer.Default; var policy = default(AssemblyPortabilityPolicy); if (policyPath != null) { using (var policyStream = new FileStream(policyPath, FileMode.Open, FileAccess.Read)) { policy = AssemblyPortabilityPolicy.LoadFromXml(policyStream); comparer = new DesktopAssemblyIdentityComparer(policy); } } bool fusionUnificationApplied1; var fusionResult1 = FusionAssemblyIdentityComparer.CompareAssemblyIdentity(displayName1, displayName2, ignoreVersion, policy: fusionPolicy, unificationApplied: out fusionUnificationApplied1); Assert.Equal(fusionMatch, fusionResult1); Assert.Equal(fusionUnificationApplied ?? unificationApplied, fusionUnificationApplied1); AssemblyIdentity id1, id2; AssemblyIdentityParts parts1, parts2; Assert.True(AssemblyIdentity.TryParseDisplayName(displayName1, out id1, out parts1)); Assert.Equal(partial, !AssemblyIdentity.IsFullName(parts1)); Assert.True(AssemblyIdentity.TryParseDisplayName(displayName2, out id2, out parts2)); Assert.True(AssemblyIdentity.IsFullName(parts2), "Expected full name"); bool unificationApplied1; var actual1 = comparer.Compare(null, displayName1, id2, out unificationApplied1, ignoreVersion); Assert.Equal(match, actual1); Assert.Equal(unificationApplied, unificationApplied1); if (!partial && id1 != null) { bool unificationApplied2; var actual2 = comparer.Compare(id1, null, id2, out unificationApplied2, ignoreVersion); Assert.Equal(match, actual2); Assert.Equal(unificationApplied, unificationApplied2); } } } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.TestExecutionNeedsFusion)] public void Mscorlib() { // mscorlib is special - all identities with simple name "mscorlib" are considered equivalent TestMatch( "mscorlib, Culture=neutral, PublicKeyToken=0123456789ABCDEF", "mscorlib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=FEFEFEFEFEFEFEFE", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "mscorlib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", "mscorlib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=FEFEFEFEFEFEFEFE", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: false); TestMatch( "mscorlib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", "mscorlib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=FEFEFEFEFEFEFEFE", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, fusionMatch: AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: false); TestMatch( "mscorlib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", "mscorlib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=FEFEFEFEFEFEFEFE, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, fusionMatch: AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: false); TestMatch( "mscorlib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", "mscorlib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=FEFEFEFEFEFEFEFE, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, fusionMatch: AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: false); TestMatch( "mscorlib, Version=1.0.0.0, PublicKeyToken=0123456789ABCDEF", "mscorlib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=FEFEFEFEFEFEFEFE, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, fusionMatch: AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "mscorlib, Version=1.0.0.0, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", "mscorlib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=FEFEFEFEFEFEFEFE", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, fusionMatch: AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "mscorlib, ContentType=WindowsRuntime", "mscorlib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=FEFEFEFEFEFEFEFE, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.TestExecutionNeedsFusion)] public void SimpleName() { TestMatch( "Goo", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo2", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); TestMatch( "Goo1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", "Goo2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: false); } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.TestExecutionNeedsFusion)] public void Version_StrongDefinition() { TestMatch( "Goo, Version=1.0", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); TestMatch( "Goo, Version=1.0.0", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); TestMatch( "Goo, Version=1.0", "Goo, Version=1.0.65535.65535, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); TestMatch( "Goo, Version=1.0.0", "Goo, Version=1.0.0.65535, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); TestMatch( "Goo, Version=1.0.0.65535", "Goo, Version=1.0.0.65535, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.65535.65535", "Goo, Version=1.0.65535.65535, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, PublicKeyToken=0123456789ABCDEF", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.0.0, PublicKeyToken=0123456789ABCDEF", "Goo, Version=1.0.0.1, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); TestMatch( "Goo, Version=1.0.0.0, PublicKeyToken=0123456789ABCDEF", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: false); } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.TestExecutionNeedsFusion)] public void Version_WeakDefinition() { // if the reference is partial version is ignored TestMatch( "Goo, Version=1.0", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0", "Goo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.0", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.0.", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0..0", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0..0", "Goo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0", "Goo, Version=1.0.65535.65535, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.0", "Goo, Version=1.0.0.65535, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.0.65535", "Goo, Version=1.0.0.65535, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.65535.65535", "Goo, Version=1.0.65535.65535, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, PublicKeyToken=null", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.0.0, PublicKeyToken=null", "Goo, Version=1.0.0.1, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.0.0, PublicKeyToken=null", "Goo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0, Culture=neutral, PublicKeyToken=null", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.0, Culture=neutral, PublicKeyToken=null", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Goo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: false); TestMatch( "Goo, Version=., Culture=neutral, PublicKeyToken=null", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.TestExecutionNeedsFusion)] public void Culture_StrongDefinition() { TestMatch( "Goo, Culture=en-US, PublicKeyToken=0123456789ABCDEF", "Goo, Version=1.0.0.0, Culture=en-US, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Culture=en-US, PublicKeyToken=0123456789ABCDEF", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); TestMatch( "Goo, Culture=neutral, PublicKeyToken=0123456789ABCDEF", "Goo, Version=1.0.0.0, Culture=en-US, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.TestExecutionNeedsFusion)] public void Culture_WeakDefinition() { TestMatch( "Goo, Version=1.0.0.0, Culture=en-US, PublicKeyToken=null", "Goo, Version=1.0.0.0, Culture=en-US, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: false); TestMatch( "Goo, Version=1.0.0.0, Culture=en-US, PublicKeyToken=null", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: false); TestMatch( "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Goo, Version=1.0.0.0, Culture=en-US, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: false); TestMatch( "Goo, Culture=en-US, PublicKeyToken=null", "Goo, Version=1.0.0.0, Culture=en-US, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Culture=en-US, PublicKeyToken=null", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); TestMatch( "Goo, Culture=neutral, PublicKeyToken=null", "Goo, Version=1.0.0.0, Culture=en-US, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.TestExecutionNeedsFusion)] public void PublicKeyToken() { TestMatch( "Goo", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, PublicKeyToken=0123456789ABCDEF", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); TestMatch( "Goo, PublicKeyToken=null", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); TestMatch( "Goo, PublicKeyToken=1111111111111111", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2222222222222222", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); TestMatch( "Goo, PublicKeyToken=null", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: false); TestMatch( "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: false); TestMatch( "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1111111111111111", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2222222222222222", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: false); TestMatch( "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: false); } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.TestExecutionNeedsFusion)] public void IgnoreOrFwUnifyVersion() { TestMatch( "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", "Goo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.EquivalentIgnoringVersion, ignoreVersion: true); TestMatch( "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", "Goo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.EquivalentIgnoringVersion, ignoreVersion: true); TestMatch( "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Goo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null", AssemblyIdentityComparer.ComparisonResult.Equivalent, ignoreVersion: true); TestMatch( "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime", "Goo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.Equivalent, ignoreVersion: true); TestMatch( "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", AssemblyIdentityComparer.ComparisonResult.Equivalent, unificationApplied: true); // Fx assemblies aren't WinRT TestMatch( "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, ContentType=WindowsRuntime", "System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, fusionMatch: AssemblyIdentityComparer.ComparisonResult.Equivalent, fusionUnificationApplied: true); TestMatch( "System.Net, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", AssemblyIdentityComparer.ComparisonResult.Equivalent, unificationApplied: true); TestMatch( "System.Net, Version=2.0.0.0, Culture=en-US, PublicKeyToken=b03f5f7f11d50a3a", "System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", AssemblyIdentityComparer.ComparisonResult.NotEquivalent); TestMatch( "System.Net, Version=2.0.0.0, Culture=en-US, PublicKeyToken=b03f5f7f11d50a3a", "System.Net, Version=4.0.0.0, Culture=en-US, PublicKeyToken=b03f5f7f11d50a3a", AssemblyIdentityComparer.ComparisonResult.Equivalent, unificationApplied: true); // build and revision numbers are ignored TestMatch( "System.Net, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Net, Version=4.0.0.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", AssemblyIdentityComparer.ComparisonResult.Equivalent, unificationApplied: true); // build and revision numbers are ignored TestMatch( "System.Net, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Net, Version=4.0.2.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", AssemblyIdentityComparer.ComparisonResult.Equivalent, unificationApplied: true); TestMatch( "System.Net, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Net, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", AssemblyIdentityComparer.ComparisonResult.NotEquivalent); // lesser version than FW version (4.0) TestMatch( "System.Net, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Net, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", AssemblyIdentityComparer.ComparisonResult.Equivalent, unificationApplied: true); TestMatch( "System.Runtime.Handles, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Runtime.Handles, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", AssemblyIdentityComparer.ComparisonResult.Equivalent, unificationApplied: true); TestMatch( "System.Numerics.Vectors, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Numerics.Vectors, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", AssemblyIdentityComparer.ComparisonResult.Equivalent, unificationApplied: true); // greater version than FW version (4.0) TestMatch( "System.Net, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Net, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", AssemblyIdentityComparer.ComparisonResult.NotEquivalent); TestMatch( "System.Runtime.Handles, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Runtime.Handles, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", AssemblyIdentityComparer.ComparisonResult.NotEquivalent); TestMatch( "System.Numerics.Vectors, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Numerics.Vectors, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", AssemblyIdentityComparer.ComparisonResult.NotEquivalent); // works correctly for names with CLR invalid characters: foreach (var c in AssemblyIdentityTests.ClrInvalidCharacters) { string name = "x" + c + "x"; TestMatch( name + ", Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", name + ", Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: false); } } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.TestExecutionNeedsFusion)] public void AsymmetricUnification() { // Note: // System.Numerics.Vectors, Version=4.0 is an FX assembly // System.Numerics.Vectors, Version=4.1+ is not an FX assembly // // It seems like a bug in fusion: it only determines whether the definition is an FX assembly // and calculates the result based upon that, regardless of whether the reference is an FX assembly or not. // We do replicate that behavior. TestMatch( "System.Numerics.Vectors, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Numerics.Vectors, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", AssemblyIdentityComparer.ComparisonResult.NotEquivalent); TestMatch( "System.Numerics.Vectors, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Numerics.Vectors, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", AssemblyIdentityComparer.ComparisonResult.Equivalent, unificationApplied: true); } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.TestExecutionNeedsFusion)] public void Portability() { TestMatch( "System, Version=5.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e", "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: false); // WinRT should not be ported TestMatch( "System, Version=5.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, ContentType=WindowsRuntime", "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, fusionMatch: AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: false); var appConfig = Temp.CreateFile().WriteAllText( @"<?xml version=""1.0"" encoding=""utf-8"" ?> <configuration> <runtime> <assemblyBinding xmlns=""urn:schemas-microsoft-com:asm.v1""> <supportPortability PKT=""7cec85d7bea7798e"" enable=""false""/> </assemblyBinding> </runtime> </configuration> "); // Checks all types of equivalence TestMatch( "System, Version=5.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e", "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: false, policyPath: appConfig.Path); } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.TestExecutionNeedsFusion)] public void Retargetable_Reference() { TestMatch( "System.Windows.Forms.DataGrid, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=969db8053d3322ac", "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", AssemblyIdentityComparer.ComparisonResult.NotEquivalent); TestMatch( "System.Windows.Forms.DataGrid, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=969db8053d3322ac, Retargetable=Yes", "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", AssemblyIdentityComparer.ComparisonResult.Equivalent); TestMatch( "System.Windows.Forms.DataGrid, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=null, Retargetable=Yes", "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", AssemblyIdentityComparer.ComparisonResult.NotEquivalent); } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.TestExecutionNeedsFusion)] public void Retargetable_Reference_Partial() { TestMatch( "System.Windows.Forms.DataGrid, Version=1.0.5000.0, PublicKeyToken=969db8053d3322ac, Retargetable=Yes", "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); TestMatch( "System.Windows.Forms.DataGrid, Culture=neutral, PublicKeyToken=969db8053d3322ac, Retargetable=Yes", "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.TestExecutionNeedsFusion)] public void Retargetable_Reference_Portable() { TestMatch( "System.ComponentModel.DataAnnotations, Version=2.0.5.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217, Retargetable=Yes", "System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", AssemblyIdentityComparer.ComparisonResult.Equivalent); // the reference is first retargeted to (4.0.0.0, 31bf3856ad364e35) and then unified with V2.0.5.0. TestMatch( "System.ComponentModel.DataAnnotations, Version=2.0.5.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217, Retargetable=Yes", "System.ComponentModel.DataAnnotations, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", AssemblyIdentityComparer.ComparisonResult.Equivalent, unificationApplied: true); TestMatch( "System.ComponentModel.DataAnnotations, Version=2.0.5.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217, Retargetable=Yes", "System.ComponentModel.DataAnnotations, Version=2.0.5.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217", AssemblyIdentityComparer.ComparisonResult.Equivalent); TestMatch( "System.ComponentModel.DataAnnotations, Version=2.0.5.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217, Retargetable=Yes", "System.ComponentModel.DataAnnotations, Version=2.0.5.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217", AssemblyIdentityComparer.ComparisonResult.Equivalent); TestMatch( "System.ComponentModel.DataAnnotations, Version=2.0.5.0, PublicKeyToken=ddd0da4d3e678217, Retargetable=Yes", "System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); TestMatch( "System.ComponentModel.DataAnnotations, Version=2.0.5.0, PublicKeyToken=ddd0da4d3e678217, Retargetable=Yes", "System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.TestExecutionNeedsFusion)] public void Retargetable_RefAndDef() { TestMatch( "System.Windows.Forms.DataGrid, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=969db8053d3322ac, Retargetable=Yes", "System.Windows.Forms.DataGrid, Version=1.0.5500.0, Culture=neutral, PublicKeyToken=969db8053d3322ac, Retargetable=Yes", AssemblyIdentityComparer.ComparisonResult.Equivalent, unificationApplied: true); } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.TestExecutionNeedsFusion)] public void WinRT_Basic() { TestMatch( "Goo, ContentType=WindowsRuntime", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, ContentType=WindowsRuntime", "Goo2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); TestMatch( "Goo, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.0.0, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.0.0, PublicKeyToken=1123456789ABCDEF, ContentType=WindowsRuntime", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2123456789ABCDEF, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: true); TestMatch( "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: false); TestMatch( "Goo, Version=1.0.0.0, Culture=en-US, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: false); TestMatch( "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", "Goo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, partial: false); // comparing WinRT with Default or vice versa: TestMatch( "Goo", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, fusionMatch: AssemblyIdentityComparer.ComparisonResult.Equivalent, partial: true); TestMatch( "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", "Goo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, fusionMatch: AssemblyIdentityComparer.ComparisonResult.Equivalent); TestMatch( "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, ContentType=WindowsRuntime", "System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.EquivalentIgnoringVersion, fusionMatch: AssemblyIdentityComparer.ComparisonResult.Equivalent, fusionUnificationApplied: true, ignoreVersion: true); TestMatch( "Windows, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", "Windows, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.NotEquivalent); TestMatch( "Windows, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", "Windows, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.EquivalentIgnoringVersion, ignoreVersion: true); TestMatch( "Windows, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", "Windows, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.NotEquivalent); TestMatch( "Windows, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", "Windows, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.EquivalentIgnoringVersion, ignoreVersion: true); TestMatch( "Windows.Foundation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", "Windows.Foundation, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, fusionMatch: AssemblyIdentityComparer.ComparisonResult.Equivalent); TestMatch( "Windows.Foundation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", "Windows.Foundation, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0123456789ABCDEF, ContentType=WindowsRuntime", AssemblyIdentityComparer.ComparisonResult.NotEquivalent, fusionMatch: AssemblyIdentityComparer.ComparisonResult.Equivalent); } } }