2 // ModuleBuilderTest - NUnit Test Cases for the ModuleBuilder class
4 // Zoltan Varga (vargaz@freemail.hu)
6 // (C) Ximian, Inc. http://www.ximian.com
12 using System
.Threading
;
13 using System
.Reflection
;
14 using System
.Reflection
.Emit
;
16 using System
.Collections
;
17 using System
.Diagnostics
.SymbolStore
;
18 using System
.Runtime
.InteropServices
;
20 using NUnit
.Framework
;
22 namespace MonoTests
.System
.Reflection
.Emit
26 public class ModuleBuilderTest
: Assertion
28 static string TempFolder
= Path
.Combine (Path
.GetTempPath (), "MT.S.R.E.MBT");
31 public void SetUp () {
32 while (Directory
.Exists (TempFolder
))
33 TempFolder
= Path
.Combine (TempFolder
, "2");
34 Directory
.CreateDirectory (TempFolder
);
38 public void TearDown () {
40 // This throws an exception under MS.NET, since the directory contains loaded
42 Directory
.Delete (TempFolder
, true);
49 public void TestIsTransient () {
50 AssemblyName assemblyName
= new AssemblyName();
51 assemblyName
.Name
= "foo";
54 = Thread
.GetDomain().DefineDynamicAssembly(
55 assemblyName
, AssemblyBuilderAccess
.RunAndSave
, TempFolder
);
56 ModuleBuilder mb1
= ab
.DefineDynamicModule ("foo.dll");
57 AssertEquals (true, mb1
.IsTransient ());
58 ModuleBuilder mb2
= ab
.DefineDynamicModule ("foo2.dll", "foo2.dll");
59 AssertEquals (false, mb2
.IsTransient ());
62 // Some of these tests overlap with the tests for Module
65 public void TestGlobalData () {
67 AssemblyName assemblyName
= new AssemblyName();
68 assemblyName
.Name
= "foo";
71 = Thread
.GetDomain().DefineDynamicAssembly(
72 assemblyName
, AssemblyBuilderAccess
.RunAndSave
, TempFolder
);
74 string resfile
= Path
.Combine (TempFolder
, "res");
75 using (StreamWriter sw
= new StreamWriter (resfile
)) {
79 ModuleBuilder mb
= ab
.DefineDynamicModule("foo.dll", "foo.dll");
81 mb
.DefineInitializedData ("DATA", new byte [100], FieldAttributes
.Public
);
82 mb
.DefineInitializedData ("DATA2", new byte [100], FieldAttributes
.Public
);
83 mb
.DefineInitializedData ("DATA3", new byte [99], FieldAttributes
.Public
);
84 mb
.DefineUninitializedData ("DATA4", 101, FieldAttributes
.Public
);
85 mb
.DefineInitializedData ("DATA_PRIVATE", new byte [100], 0);
86 mb
.CreateGlobalFunctions ();
90 Assembly assembly
= Assembly
.LoadFrom (Path
.Combine (TempFolder
, "foo.dll"));
92 Module module
= assembly
.GetLoadedModules ()[0];
94 string[] expectedFieldNames
= new string [] {
95 "DATA", "DATA2", "DATA3", "DATA4"
97 ArrayList fieldNames
= new ArrayList ();
98 foreach (FieldInfo fi
in module
.GetFields ()) {
99 fieldNames
.Add (fi
.Name
);
101 AssertArrayEqualsSorted (expectedFieldNames
, fieldNames
.ToArray (typeof (string)));
103 AssertEquals (module
.GetField ("DATA") != null, true);
104 AssertEquals (module
.GetField ("DATA2") != null, true);
105 AssertEquals (module
.GetField ("DATA3") != null, true);
106 AssertEquals (module
.GetField ("DATA4") != null, true);
107 AssertEquals (module
.GetField ("DATA_PRIVATE"), null);
108 AssertEquals (module
.GetField ("DATA_PRIVATE", BindingFlags
.NonPublic
| BindingFlags
.Static
) != null, true);
112 public void TestGlobalMethods () {
113 AssemblyName an
= new AssemblyName();
114 an
.Name
= "TestGlobalMethods";
115 AssemblyBuilder builder
=
116 AppDomain
.CurrentDomain
.DefineDynamicAssembly(an
, AssemblyBuilderAccess
.Run
);
117 ModuleBuilder module
= builder
.DefineDynamicModule("MessageModule");
118 MethodBuilder method
= module
.DefinePInvokeMethod("printf", "libc.so",
119 MethodAttributes
.PinvokeImpl
| MethodAttributes
.Static
| MethodAttributes
.Public
,
120 CallingConventions
.Standard
, typeof(void), new Type
[]{typeof(string)}
, CallingConvention
.Winapi
,
122 method
.SetImplementationFlags (MethodImplAttributes
.PreserveSig
|
123 method
.GetMethodImplementationFlags());
124 module
.CreateGlobalFunctions();
126 Assert (module
.GetMethod ("printf") != null);
130 public void DuplicateSymbolDocument () {
131 AssemblyName assemblyName
= new AssemblyName();
132 assemblyName
.Name
= "ModuleBuilderTest.DuplicateSymbolDocument";
135 = Thread
.GetDomain().DefineDynamicAssembly(
136 assemblyName
, AssemblyBuilderAccess
.RunAndSave
, TempFolder
);
138 ModuleBuilder mb
= ab
.DefineDynamicModule("foo.dll", "foo.dll", true);
140 // Check that it is possible to redefine a symbol document
141 ISymbolDocumentWriter doc1
=
142 mb
.DefineDocument("foo.il", SymDocumentType
.Text
,
143 SymLanguageType
.ILAssembly
,SymLanguageVendor
.Microsoft
);
144 ISymbolDocumentWriter doc2
=
145 mb
.DefineDocument("foo.il", SymDocumentType
.Text
,
146 SymLanguageType
.ILAssembly
,SymLanguageVendor
.Microsoft
);
149 private static void AssertArrayEqualsSorted (Array o1
, Array o2
) {
150 Array s1
= (Array
)o1
.Clone ();
151 Array s2
= (Array
)o2
.Clone ();
156 AssertEquals (s1
.Length
, s2
.Length
);
157 for (int i
= 0; i
< s1
.Length
; ++i
)
158 AssertEquals (s1
.GetValue (i
), s2
.GetValue (i
));