/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/Core/CodeAnalysisTest/MetadataReferences/AssemblyMetadataTests.cs
153 строки
8 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; using System.Collections.Immutable; using Roslyn.Test.Utilities; using Xunit; using System.Collections.Generic; namespace Microsoft.CodeAnalysis.UnitTests { public class AssemblyMetadataTests : TestBase { [Fact] public void Ctor_Errors() { Assert.Throws<ArgumentNullException>(() => AssemblyMetadata.CreateFromImage(default(ImmutableArray<byte>))); IEnumerable<byte> enumerableImage = null; Assert.Throws<ArgumentNullException>(() => AssemblyMetadata.CreateFromImage(enumerableImage)); byte[] arrayImage = null; Assert.Throws<ArgumentNullException>(() => AssemblyMetadata.CreateFromImage(arrayImage)); Assert.Throws<ArgumentNullException>(() => AssemblyMetadata.Create((ModuleMetadata)null)); Assert.Throws<ArgumentException>(() => AssemblyMetadata.Create(default(ImmutableArray<ModuleMetadata>))); Assert.Throws<ArgumentException>(() => AssemblyMetadata.Create(ImmutableArray.Create<ModuleMetadata>())); var m1 = ModuleMetadata.CreateFromImage(TestResources.SymbolsTests.MultiModule.MultiModuleDll); var m2 = ModuleMetadata.CreateFromImage(TestResources.SymbolsTests.MultiModule.mod2); var m3 = ModuleMetadata.CreateFromImage(TestResources.SymbolsTests.MultiModule.mod3); Assert.Throws<ArgumentException>(() => AssemblyMetadata.Create(m1, m2.Copy(), m3)); Assert.Throws<ArgumentException>(() => AssemblyMetadata.Create(new List<ModuleMetadata>(new ModuleMetadata[] { m1.Copy(), m2.Copy(), m3.Copy() }))); Assert.Throws<ArgumentNullException>(() => AssemblyMetadata.Create(ImmutableArray.Create(m1, m2, null))); Assert.Throws<ArgumentNullException>(() => AssemblyMetadata.Create(ImmutableArray.Create((ModuleMetadata)null))); Assert.Throws<ArgumentNullException>(() => AssemblyMetadata.CreateFromFile((string)null)); } [Fact] public void CreateFromBytes() { using (var a = AssemblyMetadata.CreateFromImage(TestResources.SymbolsTests.MultiModule.MultiModuleDll)) { // even though the image refers to other modules only the manifest module is loaded: Assert.Equal(1, a.GetModules().Length); Assert.Equal("MultiModule.dll", a.GetModules()[0].Name); } } [Fact] public void CreateFromFile() { var dir = Temp.CreateDirectory(); var mm = dir.CreateFile("MultiModule.dll").WriteAllBytes(TestResources.SymbolsTests.MultiModule.MultiModuleDll).Path; dir.CreateFile("mod2.netmodule").WriteAllBytes(TestResources.SymbolsTests.MultiModule.mod2); dir.CreateFile("mod3.netmodule").WriteAllBytes(TestResources.SymbolsTests.MultiModule.mod3); using (var a = AssemblyMetadata.CreateFromFile(mm)) { Assert.Equal(3, a.GetModules().Length); Assert.Equal("MultiModule.dll", a.GetModules()[0].Name); Assert.Equal("mod2.netmodule", a.GetModules()[1].Name); Assert.Equal("mod3.netmodule", a.GetModules()[2].Name); } } [Fact] public void Disposal() { ModuleMetadata m1, m2, m3; var md = AssemblyMetadata.Create( m1 = ModuleMetadata.CreateFromImage(TestResources.SymbolsTests.MultiModule.MultiModuleDll), m2 = ModuleMetadata.CreateFromImage(TestResources.SymbolsTests.MultiModule.mod2), m3 = ModuleMetadata.CreateFromImage(TestResources.SymbolsTests.MultiModule.mod3)); md.Dispose(); Assert.Throws<ObjectDisposedException>(() => m1.Module); Assert.Throws<ObjectDisposedException>(() => m2.Module); Assert.Throws<ObjectDisposedException>(() => m3.Module); md.Dispose(); } [Fact] public void ImageOwnership() { ModuleMetadata m1, m2, m3; var a = AssemblyMetadata.Create( m1 = ModuleMetadata.CreateFromImage(TestResources.SymbolsTests.MultiModule.MultiModuleDll), m2 = ModuleMetadata.CreateFromImage(TestResources.SymbolsTests.MultiModule.mod2), m3 = ModuleMetadata.CreateFromImage(TestResources.SymbolsTests.MultiModule.mod3)); Assert.True(a.IsImageOwner, "Assembly should own the image"); Assert.True(m1.IsImageOwner, "Module should own the image"); Assert.True(m2.IsImageOwner, "Module should own the image"); Assert.True(m3.IsImageOwner, "Module should own the image"); var copy1 = a.Copy(); Assert.False(copy1.IsImageOwner, "Assembly should not own the image"); Assert.False(copy1.GetModules()[0].IsImageOwner, "Module should not own the image"); Assert.False(copy1.GetModules()[1].IsImageOwner, "Module should not own the image"); Assert.False(copy1.GetModules()[2].IsImageOwner, "Module should not own the image"); Assert.Equal(m1.Module, copy1.GetModules()[0].Module); Assert.Equal(m2.Module, copy1.GetModules()[1].Module); Assert.Equal(m3.Module, copy1.GetModules()[2].Module); var copy2 = copy1.Copy(); Assert.False(copy2.IsImageOwner, "Assembly should not own the image"); Assert.False(copy2.GetModules()[0].IsImageOwner, "Module should not own the image"); Assert.False(copy2.GetModules()[1].IsImageOwner, "Module should not own the image"); Assert.False(copy2.GetModules()[2].IsImageOwner, "Module should not own the image"); Assert.Equal(m1.Module, copy2.GetModules()[0].Module); Assert.Equal(m2.Module, copy2.GetModules()[1].Module); Assert.Equal(m3.Module, copy2.GetModules()[2].Module); copy1.Dispose(); Assert.Throws<ObjectDisposedException>(() => copy1.GetModules()[0].Module); Assert.Throws<ObjectDisposedException>(() => copy1.GetModules()[1].Module); Assert.Throws<ObjectDisposedException>(() => copy1.GetModules()[2].Module); Assert.NotNull(a.GetModules()[0].Module); Assert.NotNull(a.GetModules()[1].Module); Assert.NotNull(a.GetModules()[2].Module); a.Dispose(); Assert.Throws<ObjectDisposedException>(() => a.GetModules()[0].Module); Assert.Throws<ObjectDisposedException>(() => a.GetModules()[1].Module); Assert.Throws<ObjectDisposedException>(() => a.GetModules()[2].Module); } [Fact] public void BadImageFormat() { var invalidModuleName = Temp.CreateFile().WriteAllBytes(TestResources.MetadataTests.Invalid.InvalidModuleName); var metadata = AssemblyMetadata.CreateFromFile(invalidModuleName.Path); Assert.Throws<BadImageFormatException>(() => metadata.GetModules()); } [Fact, WorkItem(547015, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/547015")] public void IncorrectCustomAssemblyTableSize_TooManyMethodSpecs() { var metadata = AssemblyMetadata.CreateFromImage(TestResources.MetadataTests.Invalid.IncorrectCustomAssemblyTableSize_TooManyMethodSpecs); Assert.Throws<BadImageFormatException>(() => metadata.GetModules()); } } }