From 88fa1ea93c2217b4ab2a3589422bf508a51439f8 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Wed, 19 Jul 2017 13:04:27 -0700 Subject: [PATCH] Fix races and skip NoPia test on CoreClr (#20549) Fixes #18985 --- .../Test/Symbol/Symbols/Metadata/PE/NoPia.cs | 3 +- .../Symbols/Source/SourcePlusMetadataTests.cs | 2 +- src/Test/Utilities/Portable/TestBase.cs | 66 +++++++------------ 3 files changed, 26 insertions(+), 45 deletions(-) diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/Metadata/PE/NoPia.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/Metadata/PE/NoPia.cs index 79b496f0de0..a8bcc74bb8e 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/Metadata/PE/NoPia.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/Metadata/PE/NoPia.cs @@ -6,6 +6,7 @@ using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Test.Utilities; using Microsoft.CodeAnalysis.Test.Utilities; +using Roslyn.Test.Utilities; using Xunit; namespace Microsoft.CodeAnalysis.CSharp.UnitTests.Symbols.Metadata.PE @@ -733,7 +734,7 @@ public void GenericsClosedOverLocalTypes1() Assert.IsType(localTypes3.GetMembers("Test6").OfType().Single().ReturnType); } - [Fact] + [ConditionalFact(typeof(DesktopOnly))] public void GenericsClosedOverLocalTypes2() { var mscorlibRef = TestReferences.NetFx.v4_0_21006.mscorlib; diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/SourcePlusMetadataTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/SourcePlusMetadataTests.cs index a9be81221ef..364a3584451 100644 --- a/src/Compilers/CSharp/Test/Symbol/Symbols/Source/SourcePlusMetadataTests.cs +++ b/src/Compilers/CSharp/Test/Symbol/Symbols/Source/SourcePlusMetadataTests.cs @@ -171,7 +171,7 @@ struct Name5 {} } [WorkItem(527531, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/527531")] - [Fact(Skip = "https://github.com/dotnet/roslyn/issues/18985")] + [Fact] public void InterfaceName() { var text = @" diff --git a/src/Test/Utilities/Portable/TestBase.cs b/src/Test/Utilities/Portable/TestBase.cs index 3f09ca844ce..ed44dc943bb 100644 --- a/src/Test/Utilities/Portable/TestBase.cs +++ b/src/Test/Utilities/Portable/TestBase.cs @@ -53,6 +53,19 @@ public virtual void Dispose() #region Metadata References + /// + /// Helper for atomically acquiring and saving a metadata reference. Necessary + /// if the acquired reference will ever be used in object identity comparisons. + /// + private static MetadataReference GetOrCreateMetadataReference(ref MetadataReference field, Func getReference) + { + if (field == null) + { + Interlocked.CompareExchange(ref field, getReference(), null); + } + return field; + } + private static MetadataReference[] s_lazyDefaultVbReferences; private static MetadataReference[] s_lazyLatestVbReferences; @@ -143,22 +156,10 @@ public static MetadataReference[] PortableRefsMinimal private static MetadataReference s_systemCoreRef; public static MetadataReference SystemCoreRef - { - get - { - if (s_systemCoreRef == null) - { - // We rely on reference equality in CreateSharedCompilation, so - // we must use a CompareExchange here. - Interlocked.CompareExchange( - ref s_systemCoreRef, - AssemblyMetadata.CreateFromImage(TestResources.NetFX.v4_0_30319.System_Core).GetReference(display: "System.Core.v4_0_30319.dll"), - null); - } - - return s_systemCoreRef; - } - } + // We rely on reference equality in CreateSharedCompilation, so + // we must use a CompareExchange here. + => GetOrCreateMetadataReference(ref s_systemCoreRef, + () => AssemblyMetadata.CreateFromImage(TestResources.NetFX.v4_0_30319.System_Core).GetReference(display: "System.Core.v4_0_30319.dll")); private static MetadataReference s_systemCoreRef_v4_0_30319_17929; public static MetadataReference SystemCoreRef_v4_0_30319_17929 @@ -232,17 +233,10 @@ public static MetadataReference SystemDataRef private static MetadataReference s_mscorlibRef; public static MetadataReference MscorlibRef - { - get - { - if (s_mscorlibRef == null) - { - s_mscorlibRef = AssemblyMetadata.CreateFromImage(TestResources.NetFX.v4_0_30319.mscorlib).GetReference(display: "mscorlib.v4_0_30319.dll"); - } - - return s_mscorlibRef; - } - } + // We rely on reference equality in CreateSharedCompilation, so + // we must use a CompareExchange here. + => GetOrCreateMetadataReference(ref s_mscorlibRef, + () => AssemblyMetadata.CreateFromImage(TestResources.NetFX.v4_0_30319.mscorlib).GetReference(display: "mscorlib.v4_0_30319.dll")); private static MetadataReference s_mscorlibRefPortable; public static MetadataReference MscorlibRefPortable @@ -415,22 +409,8 @@ public static MetadataReference SystemDynamicRuntimeRef private static MetadataReference s_systemRef; public static MetadataReference SystemRef - { - get - { - if (s_systemRef == null) - { - // We rely on reference equality in CreateSharedCompilation, so - // we must use a CompareExchange here. - Interlocked.CompareExchange( - ref s_systemRef, - AssemblyMetadata.CreateFromImage(TestResources.NetFX.v4_0_30319.System).GetReference(display: "System.v4_0_30319.dll"), - null); - } - - return s_systemRef; - } - } + => GetOrCreateMetadataReference(ref s_systemRef, + () => AssemblyMetadata.CreateFromImage(TestResources.NetFX.v4_0_30319.System).GetReference(display: "System.v4_0_30319.dll")); private static MetadataReference s_systemRef_v46; public static MetadataReference SystemRef_v46 -- GitLab