Merge pull request #5198 from BrzVlad/fix-binprot-stats
[mono.git] / mcs / class / corlib / Test / System.Reflection.Emit / AssemblyBuilderTest.cs
index 0a06a7e4231420b0ba2c62fc047fa93ace9770f8..c0991986673aa34a50baef44bbd59d064feb10f8 100644 (file)
@@ -99,6 +99,13 @@ public class AssemblyBuilderTest
                return mb;
        }
 
+       [Test]
+       [Category ("MobileNotWorking")]
+       public void DefaultCtor ()
+       {
+               Assert.IsNotNull (ab.Evidence, "#1");
+       }
+
        [Test]
        [Category ("NotWorking")]
        public void ManifestModule ()
@@ -410,7 +417,7 @@ public class AssemblyBuilderTest
        }
 
        [Test]
-       [Category ("AndroidNotWorking")] // DefineResource doesn't allow path in its fileName parameter and the test attempts to write to / in effect
+       [Category ("MobileNotWorking")] // DefineResource doesn't allow path in its fileName parameter and the test attempts to write to / in effect
        public void TestDefineResource ()
        {
                ab.DefineResource ("foo", "FOO", "foo.txt", ResourceAttributes.Public);
@@ -587,12 +594,16 @@ public class AssemblyBuilderTest
        }
 
        [Test]
-       [Category ("AndroidNotWorking")] // Missing Mono.Compilerservices.SymbolWriter assembly
        public void TestDefineDynamicModule ()
        {
                ab.DefineDynamicModule ("foo", "foo.dll");
-               ab.DefineDynamicModule ("foo2", true);
                ab.DefineDynamicModule ("foo3", "foo3.dll");
+       }
+
+       [Category ("MobileNotWorking")] //XA doesn't ship SymbolWriter. https://bugzilla.xamarin.com/show_bug.cgi?id=53038
+       public void TestDefineDynamicModuleWithSymbolWriter ()
+       {
+               ab.DefineDynamicModule ("foo2", true);
                ab.DefineDynamicModule ("foo4", "foo4.dll", true);
        }
 
@@ -1833,5 +1844,68 @@ public class AssemblyBuilderTest
                } catch (NotSupportedException e) {
                }
      }
+
+       class AssemblyBuilderResolver {
+               private Assembly mock;
+               private ResolveEventHandler d;
+               private string theName;
+
+               public AssemblyBuilderResolver (string theName) {
+                       mock = CreateMock (theName);
+                       d = new ResolveEventHandler (HandleResolveEvent);
+                       this.theName = theName;
+               }
+
+               public void StartHandling () {
+                       AppDomain.CurrentDomain.AssemblyResolve += d;
+               }
+
+               public void StopHandling () {
+                       AppDomain.CurrentDomain.AssemblyResolve -= d;
+               }
+
+               public Assembly HandleResolveEvent (Object sender, ResolveEventArgs args) {
+                       if (args.Name.StartsWith (theName))
+                               return mock;
+                       else
+                               return null;
+               }
+
+               private static Assembly CreateMock (string name) {
+                       var an = new AssemblyName (name);
+                       var ab = AssemblyBuilder.DefineDynamicAssembly (an, AssemblyBuilderAccess.ReflectionOnly);
+                       var mb = ab.DefineDynamicModule (an.Name);
+
+                       // Just make some content for the assembly
+                       var tb = mb.DefineType ("Foo", TypeAttributes.Public);
+                       tb.DefineDefaultConstructor (MethodAttributes.Public);
+
+                       tb.CreateType ();
+
+                       return ab;
+               }
+       }
+
+       [Test]
+       public void ResolveEventHandlerReflectionOnlyError ()
+       {
+               // Regression test for 57850.
+
+               // If a ResolveEventHandler returns a reflection-only
+               // AssemblyBuilder, we should throw a FileNotFoundException.
+               var s = "ResolveEventHandlerReflectionOnlyErrorAssembly";
+               var h = new AssemblyBuilderResolver (s);
+               Assert.Throws<FileNotFoundException>(() => {
+                               h.StartHandling ();
+                               var aName = new AssemblyName (s);
+                               try {
+                                       AppDomain.CurrentDomain.Load (aName);
+                               } finally {
+                                       h.StopHandling ();
+                               }
+                       });
+       }
+
+
 }
 }