2 // ModuleBuilderTest - NUnit Test Cases for the ModuleBuilder class
\r
4 // Zoltan Varga (vargaz@freemail.hu)
\r
6 // (C) Ximian, Inc. http://www.ximian.com
\r
12 using System.Threading;
\r
13 using System.Reflection;
\r
14 using System.Reflection.Emit;
\r
16 using System.Collections;
\r
17 using System.Diagnostics.SymbolStore;
\r
18 using System.Runtime.InteropServices;
\r
20 using NUnit.Framework;
\r
22 namespace MonoTests.System.Reflection.Emit
\r
26 public class ModuleBuilderTest : Assertion
\r
28 static string TempFolder = Path.Combine (Path.GetTempPath (), "MT.S.R.E.MBT");
\r
31 public void SetUp () {
\r
32 Random AutoRand = new Random ( );
\r
33 string TempPath = TempFolder;
\r
34 while (Directory.Exists (TempFolder))
\r
35 TempFolder = Path.Combine (TempPath, AutoRand.Next ().ToString());
\r
36 Directory.CreateDirectory (TempFolder);
\r
40 public void TearDown () {
\r
42 // This throws an exception under MS.NET, since the directory contains loaded
\r
44 Directory.Delete (TempFolder, true);
\r
51 public void TestIsTransient () {
\r
52 AssemblyName assemblyName = new AssemblyName();
\r
53 assemblyName.Name = "foo";
\r
56 = Thread.GetDomain().DefineDynamicAssembly(
\r
57 assemblyName, AssemblyBuilderAccess.RunAndSave, TempFolder);
\r
58 ModuleBuilder mb1 = ab.DefineDynamicModule ("foo.dll");
\r
59 AssertEquals (true, mb1.IsTransient ());
\r
60 ModuleBuilder mb2 = ab.DefineDynamicModule ("foo2.dll", "foo2.dll");
\r
61 AssertEquals (false, mb2.IsTransient ());
\r
64 // Some of these tests overlap with the tests for Module
\r
67 public void TestGlobalData () {
\r
69 AssemblyName assemblyName = new AssemblyName();
\r
70 assemblyName.Name = "foo";
\r
73 = Thread.GetDomain().DefineDynamicAssembly(
\r
74 assemblyName, AssemblyBuilderAccess.RunAndSave, TempFolder);
\r
76 string resfile = Path.Combine (TempFolder, "res");
\r
77 using (StreamWriter sw = new StreamWriter (resfile)) {
\r
78 sw.WriteLine ("FOO");
\r
81 ModuleBuilder mb = ab.DefineDynamicModule("foo.dll", "foo.dll");
\r
83 mb.DefineInitializedData ("DATA", new byte [100], FieldAttributes.Public);
\r
84 mb.DefineInitializedData ("DATA2", new byte [100], FieldAttributes.Public);
\r
85 mb.DefineInitializedData ("DATA3", new byte [99], FieldAttributes.Public);
\r
86 mb.DefineUninitializedData ("DATA4", 101, FieldAttributes.Public);
\r
87 mb.DefineInitializedData ("DATA_PRIVATE", new byte [100], 0);
\r
88 mb.CreateGlobalFunctions ();
\r
90 ab.Save ("foo.dll");
\r
92 Assembly assembly = Assembly.LoadFrom (Path.Combine (TempFolder, "foo.dll"));
\r
94 Module module = assembly.GetLoadedModules ()[0];
\r
96 string[] expectedFieldNames = new string [] {
\r
97 "DATA", "DATA2", "DATA3", "DATA4"
\r
99 ArrayList fieldNames = new ArrayList ();
\r
100 foreach (FieldInfo fi in module.GetFields ()) {
\r
101 fieldNames.Add (fi.Name);
\r
103 AssertArrayEqualsSorted (expectedFieldNames, fieldNames.ToArray (typeof (string)));
\r
105 AssertEquals (module.GetField ("DATA") != null, true);
\r
106 AssertEquals (module.GetField ("DATA2") != null, true);
\r
107 AssertEquals (module.GetField ("DATA3") != null, true);
\r
108 AssertEquals (module.GetField ("DATA4") != null, true);
\r
109 AssertEquals (module.GetField ("DATA_PRIVATE"), null);
\r
110 AssertEquals (module.GetField ("DATA_PRIVATE", BindingFlags.NonPublic | BindingFlags.Static) != null, true);
\r
114 public void TestGlobalMethods () {
\r
115 AssemblyName an = new AssemblyName();
\r
116 an.Name = "TestGlobalMethods";
\r
117 AssemblyBuilder builder =
\r
118 AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);
\r
119 ModuleBuilder module = builder.DefineDynamicModule("MessageModule");
\r
120 MethodBuilder method = module.DefinePInvokeMethod("printf", "libc.so",
\r
121 MethodAttributes.PinvokeImpl | MethodAttributes.Static | MethodAttributes.Public,
\r
122 CallingConventions.Standard, typeof(void), new Type[]{typeof(string)}, CallingConvention.Winapi,
\r
124 method.SetImplementationFlags (MethodImplAttributes.PreserveSig |
\r
125 method.GetMethodImplementationFlags());
\r
126 module.CreateGlobalFunctions();
\r
128 Assert (module.GetMethod ("printf") != null);
\r
132 public void DuplicateSymbolDocument () {
\r
133 AssemblyName assemblyName = new AssemblyName();
\r
134 assemblyName.Name = "ModuleBuilderTest.DuplicateSymbolDocument";
\r
137 = Thread.GetDomain().DefineDynamicAssembly(
\r
138 assemblyName, AssemblyBuilderAccess.RunAndSave, TempFolder);
\r
140 ModuleBuilder mb = ab.DefineDynamicModule("foo.dll", "foo.dll", true);
\r
142 // Check that it is possible to redefine a symbol document
\r
143 ISymbolDocumentWriter doc1 =
\r
144 mb.DefineDocument("foo.il", SymDocumentType.Text,
\r
145 SymLanguageType.ILAssembly,SymLanguageVendor.Microsoft);
\r
146 ISymbolDocumentWriter doc2 =
\r
147 mb.DefineDocument("foo.il", SymDocumentType.Text,
\r
148 SymLanguageType.ILAssembly,SymLanguageVendor.Microsoft);
\r
151 private static void AssertArrayEqualsSorted (Array o1, Array o2) {
\r
152 Array s1 = (Array)o1.Clone ();
\r
153 Array s2 = (Array)o2.Clone ();
\r
158 AssertEquals (s1.Length, s2.Length);
\r
159 for (int i = 0; i < s1.Length; ++i)
\r
160 AssertEquals (s1.GetValue (i), s2.GetValue (i));
\r