Merge pull request #5198 from BrzVlad/fix-binprot-stats
[mono.git] / mcs / class / corlib / Test / System.Reflection.Emit / AssemblyBuilderTest.cs
index 6e75b960cbaac8f981ad7e7cdc359fc517152035..c0991986673aa34a50baef44bbd59d064feb10f8 100644 (file)
@@ -78,12 +78,16 @@ public class AssemblyBuilderTest
                return assemblyName;
        }
 
-       private AssemblyBuilder genAssembly ()
+       private AssemblyBuilder genAssembly (AssemblyBuilderAccess access)
        {
                return domain.DefineDynamicAssembly (genAssemblyName (),
-                                                    AssemblyBuilderAccess.RunAndSave,
+                                                    access,
                                                     tempDir);
        }
+       private AssemblyBuilder genAssembly ()
+       {
+               return genAssembly (AssemblyBuilderAccess.RunAndSave);
+       }
 
        private MethodInfo genEntryFunction (AssemblyBuilder assembly)
        {
@@ -95,7 +99,13 @@ public class AssemblyBuilderTest
                return mb;
        }
 
-#if NET_2_0
+       [Test]
+       [Category ("MobileNotWorking")]
+       public void DefaultCtor ()
+       {
+               Assert.IsNotNull (ab.Evidence, "#1");
+       }
+
        [Test]
        [Category ("NotWorking")]
        public void ManifestModule ()
@@ -120,7 +130,6 @@ public class AssemblyBuilderTest
                Assert.AreSame (mb2, ab.ManifestModule, "#C3");
                Assert.AreSame (mb1, mb2, "#C4");
        }
-#endif
 
        [Test]
        [ExpectedException (typeof (NotSupportedException))]
@@ -408,6 +417,7 @@ public class AssemblyBuilderTest
        }
 
        [Test]
+       [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,8 +597,13 @@ public class AssemblyBuilderTest
        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);
        }
 
@@ -779,19 +794,8 @@ public class AssemblyBuilderTest
                try {
                        ab.Save ("lib.dll");
                        Assert.Fail ("#A1");
-#if NET_4_0
                } catch (CultureNotFoundException ex) {
                }
-#else
-               } catch (ArgumentException ex) {
-                       // Culture name doesnotexist is not supported
-                       Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
-                       Assert.IsNull (ex.InnerException, "#A3");
-                       Assert.IsNotNull (ex.Message, "#A4");
-                       Assert.IsTrue (ex.Message.IndexOf ("doesnotexist") != -1, "#A5");
-                       Assert.AreEqual ("name", ex.ParamName, "#A6");
-               }
-#endif
 
                ab = AppDomain.CurrentDomain.DefineDynamicAssembly (aname,
                        AssemblyBuilderAccess.RunAndSave, tempDir);
@@ -807,19 +811,8 @@ public class AssemblyBuilderTest
                try {
                        ab.Save ("lib.dll");
                        Assert.Fail ("#B1");
-#if NET_4_0
                } catch (CultureNotFoundException ex) {
                }
-#else
-               } catch (ArgumentException ex) {
-                       // Culture name neutral is not supported
-                       Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
-                       Assert.IsNull (ex.InnerException, "#B3");
-                       Assert.IsNotNull (ex.Message, "#B4");
-                       Assert.IsTrue (ex.Message.IndexOf ("neutral") != -1, "#B5");
-                       Assert.AreEqual ("name", ex.ParamName, "#B6");
-               }
-#endif
        }
 
        [Test] // DefineVersionInfoResource ()
@@ -901,19 +894,8 @@ public class AssemblyBuilderTest
                try {
                        ab.Save ("lib.dll");
                        Assert.Fail ("#A1");
-#if NET_4_0
                } catch (CultureNotFoundException ex) {
                }
-#else
-               } catch (ArgumentException ex) {
-                       // Culture name doesnotexist is not supported
-                       Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
-                       Assert.IsNull (ex.InnerException, "#A3");
-                       Assert.IsNotNull (ex.Message, "#A4");
-                       Assert.IsTrue (ex.Message.IndexOf ("doesnotexist") != -1, "#A5");
-                       Assert.AreEqual ("name", ex.ParamName, "#A6");
-               }
-#endif
 
                ab = AppDomain.CurrentDomain.DefineDynamicAssembly (aname,
                        AssemblyBuilderAccess.RunAndSave, tempDir);
@@ -929,19 +911,8 @@ public class AssemblyBuilderTest
                try {
                        ab.Save ("lib.dll");
                        Assert.Fail ("#B1");
-#if NET_4_0
                } catch (CultureNotFoundException ex) {
                }
-#else
-               } catch (ArgumentException ex) {
-                       // Culture name neutral is not supported
-                       Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
-                       Assert.IsNull (ex.InnerException, "#B3");
-                       Assert.IsNotNull (ex.Message, "#B4");
-                       Assert.IsTrue (ex.Message.IndexOf ("neutral") != -1, "#B5");
-                       Assert.AreEqual ("name", ex.ParamName, "#B6");
-               }
-#endif
        }
 
        [Test] // DefineVersionInfoResource (String, String, String, String, String)
@@ -1076,28 +1047,14 @@ public class AssemblyBuilderTest
                filename = Path.Combine (tempDir, "TestSetCustomAttributeA.dll");
                check = AssemblyName.GetAssemblyName (filename);
                Assert.AreEqual (CultureInfo.InvariantCulture, check.CultureInfo, "#A1");
-#if NET_2_0
                Assert.AreEqual (AssemblyNameFlags.None, check.Flags, "#A2");
-#else
-               Assert.AreEqual (AssemblyNameFlags.PublicKey, check.Flags, "#A2");
-#endif
                Assert.AreEqual ("TestSetCustomAttributeA, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", check.FullName, "#A3");
-#if NET_2_0
                Assert.IsNull (check.GetPublicKey (), "#A4");
-#else
-               Assert.AreEqual (new byte [0], check.GetPublicKey (), "#A4");
-#endif
-#if NET_2_0
                Assert.AreEqual (new byte [0], check.GetPublicKeyToken (), "#A5");
-#else
-               Assert.IsNull (check.GetPublicKeyToken (), "#A5");
-#endif
                Assert.AreEqual (AssemblyHashAlgorithm.SHA1, check.HashAlgorithm, "#A6");
                Assert.IsNull (check.KeyPair, "#A7");
                Assert.AreEqual ("TestSetCustomAttributeA", check.Name, "#A8");
-#if NET_2_0
                //Assert.AreEqual (ProcessorArchitecture.MSIL, check.ProcessorArchitecture, "#A9");
-#endif
                Assert.AreEqual (new Version (0, 0, 0, 0), check.Version, "#A10");
                Assert.AreEqual (AssemblyVersionCompatibility.SameMachine, check.VersionCompatibility, "#A11");
 
@@ -1126,9 +1083,7 @@ public class AssemblyBuilderTest
                an.CultureInfo = new CultureInfo ("nl-BE");
                an.Flags = AssemblyNameFlags.Retargetable;
                an.Name = "TestSetCustomAttributeB";
-#if NET_2_0
                an.ProcessorArchitecture = ProcessorArchitecture.IA64;
-#endif
                an.Version = new Version (1, 3, 5, 7);
                an.VersionCompatibility = AssemblyVersionCompatibility.SameDomain;
 
@@ -1151,28 +1106,14 @@ public class AssemblyBuilderTest
                filename = Path.Combine (tempDir, "TestSetCustomAttributeB.dll");
                check = AssemblyName.GetAssemblyName (filename);
                Assert.AreEqual ("nl-BE", check.CultureInfo.Name, "#B1");
-#if NET_2_0
                Assert.AreEqual (AssemblyNameFlags.Retargetable, check.Flags, "#B2");
-#else
-               Assert.AreEqual (AssemblyNameFlags.PublicKey | AssemblyNameFlags.Retargetable, check.Flags, "#B2");
-#endif
                Assert.AreEqual ("TestSetCustomAttributeB, Version=1.3.5.7, Culture=nl-BE, PublicKeyToken=null, Retargetable=Yes", check.FullName, "#B3");
-#if NET_2_0
                Assert.IsNull (check.GetPublicKey (), "#B4");
-#else
-               Assert.AreEqual (new byte [0], check.GetPublicKey (), "#B4");
-#endif
-#if NET_2_0
                Assert.AreEqual (new byte [0], check.GetPublicKeyToken (), "#B5");
-#else
-               Assert.IsNull (check.GetPublicKeyToken (), "#B5");
-#endif
                Assert.AreEqual (AssemblyHashAlgorithm.SHA1, check.HashAlgorithm, "#B6");
                Assert.IsNull (check.KeyPair, "#B7");
                Assert.AreEqual ("TestSetCustomAttributeB", check.Name, "#B8");
-#if NET_2_0
                //Assert.AreEqual (ProcessorArchitecture.MSIL, check.ProcessorArchitecture, "#B9");
-#endif
                Assert.AreEqual (new Version (1, 3, 5, 7), check.Version, "#B10");
                Assert.AreEqual (AssemblyVersionCompatibility.SameMachine, check.VersionCompatibility, "#B11");
 
@@ -1264,17 +1205,10 @@ public class AssemblyBuilderTest
                AssemblyName check = AssemblyName.GetAssemblyName (filename);
                // no exception is thrown (file not found)
                // because it's not AssemblyBuilder.Save job to do the signing :-/
-#if NET_2_0
                Assert.AreEqual (AssemblyNameFlags.None, check.Flags, "#1");
                Assert.IsNull (check.GetPublicKey (), "#2");
                Assert.IsNotNull (check.GetPublicKeyToken (), "#3a");
                Assert.AreEqual (0, check.GetPublicKeyToken ().Length, "#3b");
-#else
-               Assert.AreEqual (AssemblyNameFlags.PublicKey, check.Flags, "#1");
-               Assert.IsNotNull (check.GetPublicKey (), "#2a");
-               Assert.AreEqual (0, check.GetPublicKey ().Length, "#2b");
-               Assert.IsNull (check.GetPublicKeyToken (), "#3");
-#endif
                Assert.IsTrue (check.FullName.IndexOf ("Version=0.0.0.0") != -1, "#4");
                Assert.IsTrue (check.FullName.IndexOf ("Culture=neutral") != -1, "#5");
                Assert.IsTrue (check.FullName.IndexOf ("PublicKeyToken=null") != -1, "#6");
@@ -1296,17 +1230,10 @@ public class AssemblyBuilderTest
                AssemblyName check = AssemblyName.GetAssemblyName (filename);
                // no public key is inserted into the assembly
                // because it's not AssemblyBuilder.Save job to do the signing :-/
-#if NET_2_0
                Assert.AreEqual (AssemblyNameFlags.None, check.Flags, "#1");
                Assert.IsNull (check.GetPublicKey (), "#2");
                Assert.IsNotNull (check.GetPublicKeyToken (), "#3a");
                Assert.AreEqual (0, check.GetPublicKeyToken ().Length, "#3b");
-#else
-               Assert.AreEqual (AssemblyNameFlags.PublicKey, check.Flags, "#1");
-               Assert.IsNotNull (check.GetPublicKey (), "#2a");
-               Assert.AreEqual (0, check.GetPublicKey ().Length, "#2b");
-               Assert.IsNull (check.GetPublicKeyToken (), "#3");
-#endif
                Assert.IsTrue (check.FullName.IndexOf ("Version=0.0.0.0") != -1, "#4");
                Assert.IsTrue (check.FullName.IndexOf ("Culture=neutral") != -1, "#5");
                Assert.IsTrue (check.FullName.IndexOf ("PublicKeyToken=null") != -1, "#6");
@@ -1464,17 +1391,13 @@ public class AssemblyBuilderTest
                        Assert.AreEqual (AssemblyHashAlgorithm.SHA1, refs [0].HashAlgorithm, "#D2:HashAlgorithm");
                        Assert.IsNull (refs [0].KeyPair, "#D2:KeyPair");
                        Assert.AreEqual ("mscorlib", refs [0].Name, "#D2:Name");
-#if NET_2_0
                        Assert.AreEqual (ProcessorArchitecture.None, refs [0].ProcessorArchitecture, "#D2:PA");
-#endif
 
                        string FxVersion;
 #if MOBILE
                        FxVersion = "2.0.5.0;";
-#elif NET_4_0
-                       FxVersion = "4.0.0.0;";
 #else
-                       FxVersion = "2.0.0.0;";
+                       FxVersion = "4.0.0.0;";
 #endif
                        Assert.AreEqual (new Version (FxVersion), refs [0].Version, "#D2:Version");
                        Assert.AreEqual (AssemblyVersionCompatibility.SameMachine,
@@ -1503,9 +1426,7 @@ public class AssemblyBuilderTest
                        Assert.AreEqual (AssemblyHashAlgorithm.SHA1, refs [0].HashAlgorithm, "#E2:HashAlgorithm");
                        Assert.IsNull (refs [0].KeyPair, "#E2:KeyPair");
                        Assert.AreEqual (an1.Name, refs [0].Name, "#E2:Name");
-#if NET_2_0
                        Assert.AreEqual (ProcessorArchitecture.None, refs [0].ProcessorArchitecture, "#E2:PA");
-#endif
                        Assert.AreEqual (new Version (3, 0, 0, 0), refs [0].Version, "#E2:Version");
                        Assert.AreEqual (AssemblyVersionCompatibility.SameMachine,
                                refs [0].VersionCompatibility, "#E2:VersionCompatibility");
@@ -1533,9 +1454,7 @@ public class AssemblyBuilderTest
                        Assert.AreEqual (AssemblyHashAlgorithm.SHA1, refs [0].HashAlgorithm, "#F2:HashAlgorithm");
                        Assert.IsNull (refs [0].KeyPair, "#F2:KeyPair");
                        Assert.AreEqual (an1.Name, refs [0].Name, "#F2:Name");
-#if NET_2_0
                        Assert.AreEqual (ProcessorArchitecture.None, refs [0].ProcessorArchitecture, "#F2:PA");
-#endif
                        Assert.AreEqual (new Version (3, 0, 0, 0), refs [0].Version, "#F2:Version");
                        Assert.AreEqual (AssemblyVersionCompatibility.SameMachine,
                                refs [0].VersionCompatibility, "#F2:VersionCompatibility");
@@ -1553,9 +1472,7 @@ public class AssemblyBuilderTest
                        Assert.AreEqual (AssemblyHashAlgorithm.SHA1, refs [1].HashAlgorithm, "#F3:HashAlgorithm");
                        Assert.IsNull (refs [1].KeyPair, "#F3:KeyPair");
                        Assert.AreEqual (an2.Name, refs [1].Name, "#F3:Name");
-#if NET_2_0
                        Assert.AreEqual (ProcessorArchitecture.None, refs [1].ProcessorArchitecture, "#F3:PA");
-#endif
                        Assert.AreEqual (new Version (1, 2, 3, 4), refs [1].Version, "#F3:Version");
                        Assert.AreEqual (AssemblyVersionCompatibility.SameMachine,
                                refs [1].VersionCompatibility, "#F3:VersionCompatibility");
@@ -1612,13 +1529,7 @@ public class AssemblyBuilderTest
                Assert.IsTrue (abName.GetPublicKey ().Length > 0, "#B3b");
                Assert.IsNotNull (abName.GetPublicKeyToken (), "#B4a");
                Assert.IsTrue (abName.GetPublicKeyToken ().Length > 0, "#B4b");
-#if NET_2_0
                Assert.AreEqual (fullName, abName.FullName, "#B5");
-#else
-               //Assert.AreEqual ("AssemblyNameTest_PublicKey, Version=1.2.3.4, PublicKeyToken=0eea7ce65f35f2d8", abName.FullName, "#B5");
-               Assert.IsTrue (abName.FullName.IndexOf ("AssemblyNameTest_PublicKey, Version=1.2.3.4") != -1, "#B5a");
-               Assert.IsTrue (abName.FullName.IndexOf ("PublicKeyToken=0eea7ce65f35f2d8") != -1, "#B5b");
-#endif
 
                ab.Save ("AssemblyNameTest_PublicKey.dll");
                AssemblyName bakedName = AssemblyName.GetAssemblyName (Path.Combine(
@@ -1649,18 +1560,10 @@ public class AssemblyBuilderTest
 
                AssemblyName abName = ab.GetName ();
                Assert.IsNotNull (abName.CultureInfo != null, "#B1");
-#if NET_2_0
                Assert.IsTrue (abName.CultureInfo != CultureInfo.InvariantCulture, "#B2a");
                Assert.AreEqual (CultureInfo.InvariantCulture.LCID, abName.CultureInfo.LCID, "#B2a");
                Assert.AreEqual (AssemblyNameFlags.PublicKey, abName.Flags, "#B3");
                Assert.AreEqual (fullName, abName.FullName, "#B4");
-#else
-               Assert.AreEqual (CultureInfo.InvariantCulture, abName.CultureInfo, "#B2");
-               Assert.AreEqual (AssemblyNameFlags.PublicKey, abName.Flags, "#B3");
-               //Assert.AreEqual ("AssemblyNameTest_MoreCultureInfo, Version=1.2.3.4, PublicKeyToken=0eea7ce65f35f2d8", abName.FullName, "#B4");
-               Assert.IsTrue (abName.FullName.IndexOf ("AssemblyNameTest_MoreCultureInfo, Version=1.2.3.4") != -1, "#B4a");
-               Assert.IsTrue (abName.FullName.IndexOf ("PublicKeyToken=0eea7ce65f35f2d8") != -1, "#B4b");
-#endif
 
                ab.Save ("AssemblyNameTest_MoreCultureInfo.dll");
 
@@ -1669,12 +1572,8 @@ public class AssemblyBuilderTest
 
                Assert.IsNotNull (bakedName.CultureInfo, "#C1");
 
-#if NET_2_0
                Assert.IsTrue (abName.CultureInfo != CultureInfo.InvariantCulture, "#C2a");
                Assert.AreEqual (CultureInfo.InvariantCulture.LCID, abName.CultureInfo.LCID, "#C2b");
-#else
-               Assert.AreEqual (CultureInfo.InvariantCulture, bakedName.CultureInfo, "#C2");
-#endif
                Assert.AreEqual (fullName, bakedName.FullName, "#C3");
        }
 
@@ -1876,25 +1775,17 @@ public class AssemblyBuilderTest
                                assemblyName, AssemblyBuilderAccess.Save, tempDir);
                        ab.Save (assemblyName.Name + ".dll");
 
-#if NET_2_0
                        // on .NET 2.0, the full name of the AssemblyBuilder matches the
                        // fully qualified assembly name
                        Assert.AreEqual (fullName, ab.FullName, "#1");
-#else
-                       //Assert.AreEqual (abName, ab.FullName, "#1");
-#endif
 
                        AssemblyName an = ab.GetName ();
 
                        Assert.AreEqual (AssemblyNameFlags.PublicKey, an.Flags, "#2");
                        Assert.IsNotNull (an.GetPublicKey (), "#3a");
                        Assert.AreEqual (0, an.GetPublicKey ().Length, "#3b");
-#if NET_2_0
                        Assert.IsNotNull (an.GetPublicKeyToken (), "#4a");
                        Assert.AreEqual (0, an.GetPublicKeyToken ().Length, "#4b");
-#else
-                       Assert.IsNull (an.GetPublicKeyToken (), "#4");
-#endif
 
                        // load assembly in separate domain, so we can clean-up after the 
                        // test
@@ -1905,9 +1796,13 @@ public class AssemblyBuilderTest
                                fullName);
                        newDomain.DoCallBack (new CrossAppDomainDelegate (helper.Test));
                } finally {
+#if !MONODROID
+                       // RUNTIME: crash
+                       // AppDomain unloading crashes the runtime on Android
                        if (newDomain != null) {
                                AppDomain.Unload (newDomain);
                        }
+#endif
                }
        }
 
@@ -1929,5 +1824,88 @@ public class AssemblyBuilderTest
                        Assert.AreEqual (_assemblyName, assemblyName.ToString ());
                }
        }
+
+
+       [Test]//Bug #7126
+       public void CannotCreateInstanceOfSaveOnlyAssembly ()
+       {
+               var asm_builder = genAssembly (AssemblyBuilderAccess.Save);
+        var mod_builder = asm_builder.DefineDynamicModule("Foo", "Foo.dll");
+
+        var type_builder = mod_builder.DefineType("Foo",
+                TypeAttributes.Public | TypeAttributes.Sealed |
+                TypeAttributes.Class | TypeAttributes.BeforeFieldInit);
+
+        var type = type_builder.CreateType();
+
+               try {
+                       Activator.CreateInstance(type);
+                       Assert.Fail ("Cannot create instance of save only type");
+               } 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 ();
+                               }
+                       });
+       }
+
+
 }
 }