/Test/Mono.Cecil.Tests/ImageReadTests.cs

http://github.com/jbevain/cecil · C# · 253 lines · 214 code · 39 blank · 0 comment · 11 complexity · fa93077855c7d47c2cbf8f12a7ef0c5e MD5 · raw file

  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using Mono.Cecil;
  5. using Mono.Cecil.Cil;
  6. using Mono.Cecil.PE;
  7. using Mono.Cecil.Metadata;
  8. using NUnit.Framework;
  9. namespace Mono.Cecil.Tests {
  10. [TestFixture]
  11. public class ImageReadTests : BaseTestFixture {
  12. [Test]
  13. public void ImageSections ()
  14. {
  15. using (var image = GetResourceImage ("hello.exe")) {
  16. Assert.AreEqual (3, image.Sections.Length);
  17. Assert.AreEqual (".text", image.Sections [0].Name);
  18. Assert.AreEqual (".rsrc", image.Sections [1].Name);
  19. Assert.AreEqual (".reloc", image.Sections [2].Name);
  20. }
  21. }
  22. [Test]
  23. public void ImageMetadataVersion ()
  24. {
  25. using (var image = GetResourceImage ("hello.exe"))
  26. Assert.AreEqual (TargetRuntime.Net_2_0, image.RuntimeVersion.ParseRuntime ());
  27. using (var image = GetResourceImage ("hello1.exe"))
  28. Assert.AreEqual (TargetRuntime.Net_1_1, image.RuntimeVersion.ParseRuntime ());
  29. }
  30. [Test]
  31. public void ImageModuleKind ()
  32. {
  33. using (var image = GetResourceImage ("hello.exe"))
  34. Assert.AreEqual (ModuleKind.Console, image.Kind);
  35. using (var image = GetResourceImage ("libhello.dll"))
  36. Assert.AreEqual (ModuleKind.Dll, image.Kind);
  37. using (var image = GetResourceImage ("hellow.exe"))
  38. Assert.AreEqual (ModuleKind.Windows, image.Kind);
  39. }
  40. [Test]
  41. public void MetadataHeaps ()
  42. {
  43. using (var image = GetResourceImage ("hello.exe")) {
  44. Assert.IsNotNull (image.TableHeap);
  45. Assert.IsNotNull (image.StringHeap);
  46. Assert.AreEqual (string.Empty, image.StringHeap.Read (0));
  47. Assert.AreEqual ("<Module>", image.StringHeap.Read (1));
  48. Assert.IsNotNull (image.UserStringHeap);
  49. Assert.AreEqual (string.Empty, image.UserStringHeap.Read (0));
  50. Assert.AreEqual ("Hello Cecil World !", image.UserStringHeap.Read (1));
  51. Assert.IsNotNull (image.GuidHeap);
  52. Assert.AreEqual (new Guid (), image.GuidHeap.Read (0));
  53. Assert.AreEqual (new Guid ("C3BC2BD3-2576-4D00-A80E-465B5632415F"), image.GuidHeap.Read (1));
  54. Assert.IsNotNull (image.BlobHeap);
  55. Assert.AreEqual (new byte [0], image.BlobHeap.Read (0));
  56. }
  57. }
  58. [Test]
  59. public void TablesHeap ()
  60. {
  61. using (var image = GetResourceImage ("hello.exe")) {
  62. var heap = image.TableHeap;
  63. Assert.IsNotNull (heap);
  64. Assert.AreEqual (1, heap [Table.Module].Length);
  65. Assert.AreEqual (4, heap [Table.TypeRef].Length);
  66. Assert.AreEqual (2, heap [Table.TypeDef].Length);
  67. Assert.AreEqual (0, heap [Table.Field].Length);
  68. Assert.AreEqual (2, heap [Table.Method].Length);
  69. Assert.AreEqual (4, heap [Table.MemberRef].Length);
  70. Assert.AreEqual (2, heap [Table.CustomAttribute].Length);
  71. Assert.AreEqual (1, heap [Table.Assembly].Length);
  72. Assert.AreEqual (1, heap [Table.AssemblyRef].Length);
  73. }
  74. }
  75. [Test]
  76. public void X64Module ()
  77. {
  78. TestModule ("hello.x64.exe", module => {
  79. Assert.AreEqual (TargetArchitecture.AMD64, module.Image.Architecture);
  80. Assert.AreEqual (ModuleAttributes.ILOnly, module.Image.Attributes);
  81. }, verify: !Platform.OnMono);
  82. }
  83. [Test]
  84. public void X64ModuleTextOnlySection ()
  85. {
  86. TestModule ("hello.textonly.x64.exe", module => {
  87. Assert.AreEqual (TargetArchitecture.AMD64, module.Image.Architecture);
  88. Assert.AreEqual (ModuleAttributes.ILOnly, module.Image.Attributes);
  89. }, verify: !Platform.OnMono);
  90. }
  91. [Test]
  92. public void IA64Module ()
  93. {
  94. TestModule ("hello.ia64.exe", module => {
  95. Assert.AreEqual (TargetArchitecture.IA64, module.Image.Architecture);
  96. Assert.AreEqual (ModuleAttributes.ILOnly, module.Image.Attributes);
  97. }, verify: !Platform.OnMono);
  98. }
  99. [Test]
  100. public void X86Module ()
  101. {
  102. TestModule ("hello.x86.exe", module => {
  103. Assert.AreEqual (TargetArchitecture.I386, module.Image.Architecture);
  104. Assert.AreEqual (ModuleAttributes.ILOnly | ModuleAttributes.Required32Bit, module.Image.Attributes);
  105. });
  106. }
  107. [Test]
  108. public void AnyCpuModule ()
  109. {
  110. TestModule ("hello.anycpu.exe", module => {
  111. Assert.AreEqual (TargetArchitecture.I386, module.Image.Architecture);
  112. Assert.AreEqual (ModuleAttributes.ILOnly, module.Image.Attributes);
  113. });
  114. }
  115. [Test]
  116. public void DelaySignedAssembly ()
  117. {
  118. TestModule ("delay-signed.dll", module => {
  119. Assert.IsNotNull (module.Assembly.Name.PublicKey);
  120. Assert.AreNotEqual (0, module.Assembly.Name.PublicKey.Length);
  121. Assert.AreNotEqual (ModuleAttributes.StrongNameSigned, module.Attributes & ModuleAttributes.StrongNameSigned);
  122. Assert.AreNotEqual (0, module.Image.StrongName.VirtualAddress);
  123. Assert.AreNotEqual (0, module.Image.StrongName.Size);
  124. });
  125. }
  126. [Test]
  127. public void WindowsPhoneNonSignedAssembly ()
  128. {
  129. TestModule ("wp7.dll", module => {
  130. Assert.AreEqual (0, module.Assembly.Name.PublicKey.Length);
  131. Assert.AreNotEqual (ModuleAttributes.StrongNameSigned, module.Attributes & ModuleAttributes.StrongNameSigned);
  132. Assert.AreEqual (0, module.Image.StrongName.VirtualAddress);
  133. Assert.AreEqual (0, module.Image.StrongName.Size);
  134. }, verify: false);
  135. }
  136. [Test]
  137. public void MetroAssembly ()
  138. {
  139. if (Platform.OnMono)
  140. return;
  141. TestModule ("metro.exe", module => {
  142. Assert.AreEqual (ModuleCharacteristics.AppContainer, module.Characteristics & ModuleCharacteristics.AppContainer);
  143. }, verify: false);
  144. }
  145. #if !NET_CORE
  146. [Test]
  147. public void WindowsRuntimeComponentAssembly ()
  148. {
  149. var resolver = WindowsRuntimeAssemblyResolver.CreateInstance ();
  150. if (resolver == null)
  151. return;
  152. TestModule("winrtcomp.winmd", module => {
  153. Assert.IsTrue (module.Assembly.Name.IsWindowsRuntime);
  154. Assert.AreEqual (6, module.Image.SubSystemMajor);
  155. Assert.AreEqual (2, module.Image.SubSystemMinor);
  156. }, verify: false, assemblyResolver: resolver);
  157. }
  158. #endif
  159. [Test]
  160. public void DeterministicAssembly ()
  161. {
  162. TestModule ("Deterministic.dll", module => {
  163. Assert.IsTrue (module.HasDebugHeader);
  164. var header = module.GetDebugHeader ();
  165. Assert.AreEqual (1, header.Entries.Length);
  166. Assert.IsTrue (header.Entries.Any (e => e.Directory.Type == ImageDebugType.Deterministic));
  167. });
  168. }
  169. [Test]
  170. public void Net471TargetingAssembly ()
  171. {
  172. TestModule ("net471.exe", module => {
  173. Assert.AreEqual (6, module.Image.SubSystemMajor);
  174. Assert.AreEqual (0, module.Image.SubSystemMinor);
  175. });
  176. }
  177. [Test]
  178. public void LocallyScopedConstantArray ()
  179. {
  180. TestModule ("LocallyScopedConstantArray.dll", module => {
  181. Assert.IsTrue (module.HasDebugHeader);
  182. var method = module.Types
  183. .Single (x => x.Name == "TestClass")
  184. .Methods
  185. .Single (x => x.Name == "TestMethod");
  186. var debugInformation = method.DebugInformation;
  187. Assert.IsNull (debugInformation.Scope.Constants.Single ().Value);
  188. }, symbolReaderProvider: typeof (PortablePdbReaderProvider), symbolWriterProvider: typeof (PortablePdbWriterProvider));
  189. }
  190. [Test]
  191. public void ExternalPdbDeterministicAssembly ()
  192. {
  193. TestModule ("ExternalPdbDeterministic.dll", module => {
  194. Assert.IsTrue (module.HasDebugHeader);
  195. var header = module.GetDebugHeader ();
  196. Assert.AreEqual (2, header.Entries.Length);
  197. Assert.IsTrue (header.Entries.Any (e => e.Directory.Type == ImageDebugType.CodeView));
  198. Assert.IsTrue (header.Entries.Any (e => e.Directory.Type == ImageDebugType.Deterministic));
  199. }, symbolReaderProvider: typeof (PortablePdbReaderProvider), symbolWriterProvider: typeof (PortablePdbWriterProvider));
  200. }
  201. [Test]
  202. public void EmbeddedPdbDeterministicAssembly ()
  203. {
  204. TestModule ("EmbeddedPdbDeterministic.dll", module => {
  205. Assert.IsTrue (module.HasDebugHeader);
  206. var header = module.GetDebugHeader ();
  207. Assert.AreEqual (3, header.Entries.Length);
  208. Assert.IsTrue (header.Entries.Any (e => e.Directory.Type == ImageDebugType.CodeView));
  209. Assert.IsTrue (header.Entries.Any (e => e.Directory.Type == ImageDebugType.Deterministic));
  210. Assert.IsTrue (header.Entries.Any (e => e.Directory.Type == ImageDebugType.EmbeddedPortablePdb));
  211. }, symbolReaderProvider: typeof (EmbeddedPortablePdbReaderProvider), symbolWriterProvider: typeof (EmbeddedPortablePdbWriterProvider));
  212. }
  213. }
  214. }