copying the latest Sys.Web.Services from trunk.
[mono.git] / mcs / class / corlib / Test / System.Reflection.Emit / ModuleBuilderTest.cs
1 //\r
2 // ModuleBuilderTest - NUnit Test Cases for the ModuleBuilder class\r
3 //\r
4 // Zoltan Varga (vargaz@freemail.hu)\r
5 //\r
6 // (C) Ximian, Inc.  http://www.ximian.com\r
7 //\r
8 //\r
9 \r
10 \r
11 using System;\r
12 using System.Threading;\r
13 using System.Reflection;\r
14 using System.Reflection.Emit;\r
15 using System.IO;\r
16 using System.Collections;\r
17 using System.Diagnostics.SymbolStore;\r
18 using System.Runtime.InteropServices;\r
19 \r
20 using NUnit.Framework;\r
21 \r
22 namespace MonoTests.System.Reflection.Emit\r
23 {\r
24 \r
25 [TestFixture]\r
26 public class ModuleBuilderTest : Assertion\r
27 {       \r
28         static string TempFolder = Path.Combine (Path.GetTempPath (), "MT.S.R.E.MBT");\r
29 \r
30         [SetUp]\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
37         }               \r
38 \r
39         [TearDown]\r
40         public void TearDown () {\r
41                 try {\r
42                         // This throws an exception under MS.NET, since the directory contains loaded\r
43                         // assemblies.\r
44                         Directory.Delete (TempFolder, true);\r
45                 }\r
46                 catch (Exception) {\r
47                 }\r
48         }\r
49 \r
50         [Test]\r
51         public void TestIsTransient () {\r
52                 AssemblyName assemblyName = new AssemblyName();\r
53                 assemblyName.Name = "foo";\r
54 \r
55                 AssemblyBuilder ab\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
62         }\r
63 \r
64         // Some of these tests overlap with the tests for Module\r
65 \r
66         [Test]\r
67         public void TestGlobalData () {\r
68 \r
69                 AssemblyName assemblyName = new AssemblyName();\r
70                 assemblyName.Name = "foo";\r
71 \r
72                 AssemblyBuilder ab\r
73                         = Thread.GetDomain().DefineDynamicAssembly(\r
74                                 assemblyName, AssemblyBuilderAccess.RunAndSave, TempFolder);\r
75 \r
76                 string resfile = Path.Combine (TempFolder, "res");\r
77                 using (StreamWriter sw = new StreamWriter (resfile)) {\r
78                         sw.WriteLine ("FOO");\r
79                 }\r
80 \r
81                 ModuleBuilder mb = ab.DefineDynamicModule("foo.dll", "foo.dll");\r
82 \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
89 \r
90                 ab.Save ("foo.dll");\r
91 \r
92                 Assembly assembly = Assembly.LoadFrom (Path.Combine (TempFolder, "foo.dll"));\r
93 \r
94                 Module module = assembly.GetLoadedModules ()[0];\r
95 \r
96                 string[] expectedFieldNames = new string [] {\r
97                         "DATA", "DATA2", "DATA3", "DATA4"\r
98                 };\r
99                 ArrayList fieldNames = new ArrayList ();\r
100                 foreach (FieldInfo fi in module.GetFields ()) {\r
101                         fieldNames.Add (fi.Name);\r
102                 }\r
103                 AssertArrayEqualsSorted (expectedFieldNames, fieldNames.ToArray (typeof (string)));\r
104 \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
111         }\r
112 \r
113         [Test]\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
123                                                                                                                   CharSet.Auto);\r
124                 method.SetImplementationFlags (MethodImplAttributes.PreserveSig | \r
125                                                                            method.GetMethodImplementationFlags());\r
126                 module.CreateGlobalFunctions();\r
127 \r
128                 Assert (module.GetMethod ("printf") != null);\r
129         }\r
130 \r
131         [Test]\r
132         public void DuplicateSymbolDocument () {\r
133                 AssemblyName assemblyName = new AssemblyName();\r
134                 assemblyName.Name = "ModuleBuilderTest.DuplicateSymbolDocument";\r
135 \r
136                 AssemblyBuilder ab\r
137                         = Thread.GetDomain().DefineDynamicAssembly(\r
138                                 assemblyName, AssemblyBuilderAccess.RunAndSave, TempFolder);\r
139 \r
140                 ModuleBuilder mb = ab.DefineDynamicModule("foo.dll", "foo.dll", true);\r
141 \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
149         }\r
150         \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
154 \r
155                 Array.Sort (s1);\r
156                 Array.Sort (s2);\r
157 \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
161         }\r
162 }\r
163 }\r
164 \r