From 52aea54bc34abbbb5bc20f0526aefc8ca313fe6a Mon Sep 17 00:00:00 2001 From: Sebastien Pouliot Date: Fri, 20 May 2016 13:28:30 -0400 Subject: [PATCH] [tests] Move linker tests from maccore --- Xamarin.iOS.sln | 159 +++ tests/introspection/README.md | 25 + .../BundledResources/BundledResources.csproj | 54 + .../BundledResources/ResourcesTest.cs | 49 + .../linker-ios/BundledResources/basn3p08.png | Bin 0 -> 1286 bytes .../BundledResources/xamvideotest.mp4 | Bin 0 -> 272012 bytes tests/linker-ios/README.md | 32 + tests/linker-ios/dont link/AppDelegate.cs | 41 + .../linker-ios/dont link/BoardingPass.pkpass | Bin 0 -> 41427 bytes tests/linker-ios/dont link/CalendarTest.cs | 42 + .../dont link/DontLinkRegressionTests.cs | 174 +++ tests/linker-ios/dont link/Info.plist | 30 + tests/linker-ios/dont link/Main.cs | 24 + .../dont link/TableViewSourceTest.cs | 60 + tests/linker-ios/dont link/dont link.csproj | 122 ++ tests/linker-ios/link all/AppDelegate.cs | 53 + tests/linker-ios/link all/AttributeTest.cs | 187 +++ tests/linker-ios/link all/CalendarTest.cs | 42 + tests/linker-ios/link all/ClassLayoutTest.cs | 115 ++ tests/linker-ios/link all/DataContractTest.cs | 82 ++ tests/linker-ios/link all/Info.plist | 32 + tests/linker-ios/link all/InterfacesTest.cs | 111 ++ tests/linker-ios/link all/InternalsTest.cs | 93 ++ tests/linker-ios/link all/LinkAllTest.cs | 539 +++++++++ .../linker-ios/link all/LinqExpressionTest.cs | 33 + tests/linker-ios/link all/MEFTests.cs | 84 ++ tests/linker-ios/link all/Main.cs | 23 + tests/linker-ios/link all/PreserveTest.cs | 168 +++ tests/linker-ios/link all/SealerTest.cs | 71 ++ .../linker-ios/link all/SerializationTest.cs | 96 ++ tests/linker-ios/link all/StructLayoutTest.cs | 113 ++ .../link all/XmlSerializationTest.cs | 79 ++ tests/linker-ios/link all/link all.csproj | 123 ++ tests/linker-ios/link sdk/AotBugs.cs | 620 ++++++++++ tests/linker-ios/link sdk/AppDelegate.cs | 53 + tests/linker-ios/link sdk/AsyncTest.cs | 28 + tests/linker-ios/link sdk/Bug1820Test.cs | 177 +++ tests/linker-ios/link sdk/Bug2096Test.cs | 58 + tests/linker-ios/link sdk/CalendarTest.cs | 42 + tests/linker-ios/link sdk/CryptoTest.cs | 218 ++++ tests/linker-ios/link sdk/DataContractTest.cs | 48 + tests/linker-ios/link sdk/DllImportTest.cs | 77 ++ tests/linker-ios/link sdk/Info.plist | 30 + .../linker-ios/link sdk/LinkExtraDefsTest.cs | 65 + .../link sdk/LinkSdkRegressionTest.cs | 1047 +++++++++++++++++ tests/linker-ios/link sdk/LocaleTest.cs | 54 + tests/linker-ios/link sdk/Main.cs | 26 + .../link sdk/OptimizeGeneratedCodeTest.cs | 223 ++++ tests/linker-ios/link sdk/PclTest.cs | 122 ++ tests/linker-ios/link sdk/ReflectionTest.cs | 43 + tests/linker-ios/link sdk/TaskTest.cs | 61 + .../link sdk/extra-linker-defs-tvos.xml | 14 + .../link sdk/extra-linker-defs-unified.xml | 14 + .../link sdk/extra-linker-defs-watchos.xml | 14 + .../linker-ios/link sdk/extra-linker-defs.xml | 14 + tests/linker-ios/link sdk/link sdk.csproj | 123 ++ tests/linker-ios/link sdk/support.il | 11 + 57 files changed, 6038 insertions(+) create mode 100644 tests/introspection/README.md create mode 100644 tests/linker-ios/BundledResources/BundledResources.csproj create mode 100644 tests/linker-ios/BundledResources/ResourcesTest.cs create mode 100644 tests/linker-ios/BundledResources/basn3p08.png create mode 100644 tests/linker-ios/BundledResources/xamvideotest.mp4 create mode 100644 tests/linker-ios/README.md create mode 100644 tests/linker-ios/dont link/AppDelegate.cs create mode 100644 tests/linker-ios/dont link/BoardingPass.pkpass create mode 100644 tests/linker-ios/dont link/CalendarTest.cs create mode 100644 tests/linker-ios/dont link/DontLinkRegressionTests.cs create mode 100644 tests/linker-ios/dont link/Info.plist create mode 100644 tests/linker-ios/dont link/Main.cs create mode 100644 tests/linker-ios/dont link/TableViewSourceTest.cs create mode 100644 tests/linker-ios/dont link/dont link.csproj create mode 100644 tests/linker-ios/link all/AppDelegate.cs create mode 100644 tests/linker-ios/link all/AttributeTest.cs create mode 100644 tests/linker-ios/link all/CalendarTest.cs create mode 100644 tests/linker-ios/link all/ClassLayoutTest.cs create mode 100644 tests/linker-ios/link all/DataContractTest.cs create mode 100644 tests/linker-ios/link all/Info.plist create mode 100644 tests/linker-ios/link all/InterfacesTest.cs create mode 100644 tests/linker-ios/link all/InternalsTest.cs create mode 100644 tests/linker-ios/link all/LinkAllTest.cs create mode 100644 tests/linker-ios/link all/LinqExpressionTest.cs create mode 100644 tests/linker-ios/link all/MEFTests.cs create mode 100644 tests/linker-ios/link all/Main.cs create mode 100644 tests/linker-ios/link all/PreserveTest.cs create mode 100644 tests/linker-ios/link all/SealerTest.cs create mode 100644 tests/linker-ios/link all/SerializationTest.cs create mode 100644 tests/linker-ios/link all/StructLayoutTest.cs create mode 100644 tests/linker-ios/link all/XmlSerializationTest.cs create mode 100644 tests/linker-ios/link all/link all.csproj create mode 100644 tests/linker-ios/link sdk/AotBugs.cs create mode 100644 tests/linker-ios/link sdk/AppDelegate.cs create mode 100644 tests/linker-ios/link sdk/AsyncTest.cs create mode 100644 tests/linker-ios/link sdk/Bug1820Test.cs create mode 100644 tests/linker-ios/link sdk/Bug2096Test.cs create mode 100644 tests/linker-ios/link sdk/CalendarTest.cs create mode 100644 tests/linker-ios/link sdk/CryptoTest.cs create mode 100644 tests/linker-ios/link sdk/DataContractTest.cs create mode 100644 tests/linker-ios/link sdk/DllImportTest.cs create mode 100644 tests/linker-ios/link sdk/Info.plist create mode 100644 tests/linker-ios/link sdk/LinkExtraDefsTest.cs create mode 100644 tests/linker-ios/link sdk/LinkSdkRegressionTest.cs create mode 100644 tests/linker-ios/link sdk/LocaleTest.cs create mode 100644 tests/linker-ios/link sdk/Main.cs create mode 100644 tests/linker-ios/link sdk/OptimizeGeneratedCodeTest.cs create mode 100644 tests/linker-ios/link sdk/PclTest.cs create mode 100644 tests/linker-ios/link sdk/ReflectionTest.cs create mode 100644 tests/linker-ios/link sdk/TaskTest.cs create mode 100644 tests/linker-ios/link sdk/extra-linker-defs-tvos.xml create mode 100644 tests/linker-ios/link sdk/extra-linker-defs-unified.xml create mode 100644 tests/linker-ios/link sdk/extra-linker-defs-watchos.xml create mode 100644 tests/linker-ios/link sdk/extra-linker-defs.xml create mode 100644 tests/linker-ios/link sdk/link sdk.csproj create mode 100644 tests/linker-ios/link sdk/support.il diff --git a/Xamarin.iOS.sln b/Xamarin.iOS.sln index 2d650fb19122..0974e169d97a 100644 --- a/Xamarin.iOS.sln +++ b/Xamarin.iOS.sln @@ -15,6 +15,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "libmonotouch", "runtime\lib EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "xamios", "src\xamios.csproj", "{E1F334C3-8F77-46C9-A28B-A8E9BAEA9FE5}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BundledResources", "tests\linker-ios\BundledResources\BundledResources.csproj", "{FE6EDEE9-ADF6-4F42-BCF2-B68C0A44EC3D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "link all", "tests\linker-ios\link all\link all.csproj", "{370CC763-EDC3-41DA-A21A-D4C82CABEFE4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "bindings-test", "tests\bindings-test\bindings-test.csproj", "{D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "link sdk", "tests\linker-ios\link sdk\link sdk.csproj", "{C47F8F72-A7CA-4149-AA7D-BC4814803EF3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dont link", "tests\linker-ios\dont link\dont link.csproj", "{839212D5-C25B-4284-AA96-59C3872B8184}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -240,8 +250,157 @@ Global {E1F334C3-8F77-46C9-A28B-A8E9BAEA9FE5}.Release|iPhone.Build.0 = Release|Any CPU {E1F334C3-8F77-46C9-A28B-A8E9BAEA9FE5}.DebugStaticRegistrar|iPhone.ActiveCfg = Debug|Any CPU {E1F334C3-8F77-46C9-A28B-A8E9BAEA9FE5}.DebugStaticRegistrar|iPhone.Build.0 = Debug|Any CPU + {FE6EDEE9-ADF6-4F42-BCF2-B68C0A44EC3D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {FE6EDEE9-ADF6-4F42-BCF2-B68C0A44EC3D}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {FE6EDEE9-ADF6-4F42-BCF2-B68C0A44EC3D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {FE6EDEE9-ADF6-4F42-BCF2-B68C0A44EC3D}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {FE6EDEE9-ADF6-4F42-BCF2-B68C0A44EC3D}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {FE6EDEE9-ADF6-4F42-BCF2-B68C0A44EC3D}.Debug|iPhone.Build.0 = Debug|Any CPU + {FE6EDEE9-ADF6-4F42-BCF2-B68C0A44EC3D}.Release|iPhone.ActiveCfg = Release|Any CPU + {FE6EDEE9-ADF6-4F42-BCF2-B68C0A44EC3D}.Release|iPhone.Build.0 = Release|Any CPU + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.Release|Any CPU.Build.0 = Release|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.net_2_0_Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.net_2_0_Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.net_2_0_Release|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.net_2_0_Release|Any CPU.Build.0 = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.net_3_5_Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.net_3_5_Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.net_3_5_Release|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.net_3_5_Release|Any CPU.Build.0 = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.net_4_0_Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.net_4_0_Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.net_4_0_Release|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.net_4_0_Release|Any CPU.Build.0 = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.silverlight_Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.silverlight_Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.silverlight_Release|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.silverlight_Release|Any CPU.Build.0 = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.winphone_Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.winphone_Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.winphone_Release|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.winphone_Release|Any CPU.Build.0 = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.Debug|iPhone.ActiveCfg = Debug|iPhone + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.Debug|iPhone.Build.0 = Debug|iPhone + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.Release|iPhone.ActiveCfg = Release|iPhone + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.Release|iPhone.Build.0 = Release|iPhone + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.DebugStaticRegistrar|iPhone.ActiveCfg = Debug|iPhone + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4}.DebugStaticRegistrar|iPhone.Build.0 = Debug|iPhone + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.Release|Any CPU.Build.0 = Release|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.net_2_0_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.net_2_0_Debug|Any CPU.Build.0 = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.net_2_0_Release|Any CPU.ActiveCfg = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.net_2_0_Release|Any CPU.Build.0 = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.net_3_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.net_3_5_Debug|Any CPU.Build.0 = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.net_3_5_Release|Any CPU.ActiveCfg = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.net_3_5_Release|Any CPU.Build.0 = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.net_4_0_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.net_4_0_Debug|Any CPU.Build.0 = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.net_4_0_Release|Any CPU.ActiveCfg = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.net_4_0_Release|Any CPU.Build.0 = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.silverlight_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.silverlight_Debug|Any CPU.Build.0 = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.silverlight_Release|Any CPU.ActiveCfg = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.silverlight_Release|Any CPU.Build.0 = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.winphone_Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.winphone_Debug|Any CPU.Build.0 = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.winphone_Release|Any CPU.ActiveCfg = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.winphone_Release|Any CPU.Build.0 = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.Debug|iPhone.Build.0 = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.Release|iPhone.ActiveCfg = Release|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.Release|iPhone.Build.0 = Release|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.DebugStaticRegistrar|iPhone.ActiveCfg = Debug|Any CPU + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA}.DebugStaticRegistrar|iPhone.Build.0 = Debug|Any CPU + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.Release|Any CPU.Build.0 = Release|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.net_2_0_Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.net_2_0_Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.net_2_0_Release|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.net_2_0_Release|Any CPU.Build.0 = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.net_3_5_Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.net_3_5_Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.net_3_5_Release|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.net_3_5_Release|Any CPU.Build.0 = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.net_4_0_Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.net_4_0_Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.net_4_0_Release|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.net_4_0_Release|Any CPU.Build.0 = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.silverlight_Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.silverlight_Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.silverlight_Release|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.silverlight_Release|Any CPU.Build.0 = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.winphone_Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.winphone_Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.winphone_Release|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.winphone_Release|Any CPU.Build.0 = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.Debug|iPhone.ActiveCfg = Debug|iPhone + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.Debug|iPhone.Build.0 = Debug|iPhone + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.Release|iPhone.ActiveCfg = Release|iPhone + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.Release|iPhone.Build.0 = Release|iPhone + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.DebugStaticRegistrar|iPhone.ActiveCfg = Debug|iPhone + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3}.DebugStaticRegistrar|iPhone.Build.0 = Debug|iPhone + {839212D5-C25B-4284-AA96-59C3872B8184}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.Release|Any CPU.Build.0 = Release|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.net_2_0_Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.net_2_0_Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.net_2_0_Release|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.net_2_0_Release|Any CPU.Build.0 = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.net_3_5_Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.net_3_5_Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.net_3_5_Release|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.net_3_5_Release|Any CPU.Build.0 = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.net_4_0_Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.net_4_0_Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.net_4_0_Release|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.net_4_0_Release|Any CPU.Build.0 = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.silverlight_Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.silverlight_Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.silverlight_Release|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.silverlight_Release|Any CPU.Build.0 = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.winphone_Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.winphone_Debug|Any CPU.Build.0 = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.winphone_Release|Any CPU.ActiveCfg = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.winphone_Release|Any CPU.Build.0 = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator + {839212D5-C25B-4284-AA96-59C3872B8184}.Debug|iPhone.ActiveCfg = Debug|iPhone + {839212D5-C25B-4284-AA96-59C3872B8184}.Debug|iPhone.Build.0 = Debug|iPhone + {839212D5-C25B-4284-AA96-59C3872B8184}.Release|iPhone.ActiveCfg = Release|iPhone + {839212D5-C25B-4284-AA96-59C3872B8184}.Release|iPhone.Build.0 = Release|iPhone + {839212D5-C25B-4284-AA96-59C3872B8184}.DebugStaticRegistrar|iPhone.ActiveCfg = DebugStaticRegistrar|iPhone + {839212D5-C25B-4284-AA96-59C3872B8184}.DebugStaticRegistrar|iPhone.Build.0 = DebugStaticRegistrar|iPhone EndGlobalSection GlobalSection(NestedProjects) = preSolution {208744BD-504E-47D7-9A98-1CF02454A6DA} = {2BFA13F8-B568-48BF-9A70-9D43F718C523} + {FE6EDEE9-ADF6-4F42-BCF2-B68C0A44EC3D} = {2BFA13F8-B568-48BF-9A70-9D43F718C523} + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4} = {2BFA13F8-B568-48BF-9A70-9D43F718C523} + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA} = {2BFA13F8-B568-48BF-9A70-9D43F718C523} + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3} = {2BFA13F8-B568-48BF-9A70-9D43F718C523} + {839212D5-C25B-4284-AA96-59C3872B8184} = {2BFA13F8-B568-48BF-9A70-9D43F718C523} EndGlobalSection EndGlobal diff --git a/tests/introspection/README.md b/tests/introspection/README.md new file mode 100644 index 000000000000..e53dab14a935 --- /dev/null +++ b/tests/introspection/README.md @@ -0,0 +1,25 @@ +# Introspection Tests + +Introspection tests are executed on target (both simulator and device for +iOS) or a specific version of OSX. The application proceed to analyze itself +using: + +* `System.Reflection` for managed code; and +* the ObjectiveC runtime library for native code + +and compare the results. E.g. if using .NET reflection it can see a binding +for a `NSBundle` type then it should be able to find a native `NSBundle` +type using the ObjC runtime functions. Otherwise an error is raised... + +Since the application analyze itself it must contains everything we wish +to test. That's why the introspection tests needs to be built with the +managed linker disable, i.e. **"Don't link"**. + +Pros + +* The tests always tell the truth, which can differ from documentation or header files; + +Cons + +* Incomplete - Not everything is encoded in the metadata / executable; +* Too complete - Not every truth is good to be known (or published), which requires creating special cases in the tests diff --git a/tests/linker-ios/BundledResources/BundledResources.csproj b/tests/linker-ios/BundledResources/BundledResources.csproj new file mode 100644 index 000000000000..f1f480efdb26 --- /dev/null +++ b/tests/linker-ios/BundledResources/BundledResources.csproj @@ -0,0 +1,54 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {FE6EDEE9-ADF6-4F42-BCF2-B68C0A44EC3D} + {6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + BundledResources + Resources + BundledResources + MonoTouch + + + True + full + False + bin\Debug + DEBUG; + prompt + 4 + False + + + none + True + bin\Release + prompt + 4 + False + DO_NOT_REMOVE + + + + + + + + + + + basn3p08.png + + + xamvideotest.mp4 + + + + + + + \ No newline at end of file diff --git a/tests/linker-ios/BundledResources/ResourcesTest.cs b/tests/linker-ios/BundledResources/ResourcesTest.cs new file mode 100644 index 000000000000..5bd5d98fd27a --- /dev/null +++ b/tests/linker-ios/BundledResources/ResourcesTest.cs @@ -0,0 +1,49 @@ +// +// Resource Bundling Tests +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2013 Xamarin Inc. All rights reserved. +// + +using System; +using System.IO; +using NUnit.Framework; + +#if XAMCORE_2_0 +using Foundation; +using ObjCRuntime; +#else +using MonoTouch.Foundation; +using MonoTouch.ObjCRuntime; +#endif + +namespace BundledResources { + + [TestFixture] + [Preserve (AllMembers = true)] + public class ResourcesTest { + + [Test] + public void Bundled () + { + // files are extracted (by MonoDevelop) so we can see them in the file system + // that's true for simulator or devices and whatever the linker settings are + var dir = NSBundle.MainBundle.BundlePath; + Assert.True (File.Exists (Path.Combine (dir, "basn3p08.png")), "file-basn3p08.png"); + Assert.True (File.Exists (Path.Combine (dir, "xamvideotest.mp4")), "xamvideotest.mp4"); + + // resources are removed by the linker or an extra step (e.g. "link sdk" or "don't link") but that + // extra step is done only on device (to keep the simulator builds as fast as possible) + var resources = typeof(ResourcesTest).Assembly.GetManifestResourceNames (); + if (Runtime.Arch == Arch.DEVICE) { + Assert.That (resources.Length, Is.EqualTo (0), "No resources"); + } else { + Assert.That (resources.Length, Is.GreaterThanOrEqualTo (2), "Resources"); + Assert.That (resources, Contains.Item ("__monotouch_content_basn3p08.png"), "res-basn3p08.png"); + Assert.That (resources, Contains.Item ("__monotouch_content_xamvideotest.mp4"), "res-xamvideotest.mp4"); + } + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/BundledResources/basn3p08.png b/tests/linker-ios/BundledResources/basn3p08.png new file mode 100644 index 0000000000000000000000000000000000000000..0ddad07e5f5de86a61bf43d8b89e138d7f1ea8ad GIT binary patch literal 1286 zcmWks4NMkw7=KO>3}y1F=z>r=LEEca@LnZf*~BA0ROZ5~$d#4)lIa>n+tGAx#s~NCh;!h=Q?&7t5~~Lk>mL*|1x+L`Ivp6mn?kJ^kK$c6a~%|NrOteLPR)ru^*4 zh?oc>ipx)wHw!xP<||VqG2mh2yNQ1IZKr30Xr(I7PBXU z(o_;ftk^?X5O*qmM)+A^aUR*s!>r3PlcI=3mc_D63M-aHQVj83+hHDKi)~wG8A%eb zMRFVzAa0kL4aW(lxy(-(A3@r7{KRdCcI^9^ zBwSWlMY4uMp(p@%T`0C7K$rnonuoRmLY9xP#5bTx(RKJi zCYfG^*s^*-{Ro^e4Kgw{Dlmv)JpjQ5bKwF@CLI|%59=nhA>e#HJh5GNjRLr(&Jco- zL=roU($L^w70~)&xPh+uFV&-K!K0w3W-9Hy@g@HWXL3ML4|%5ULen8 zlT@|D2@;VI*iada4446_ptp_#Sul*Cx7Y6>PlSiq8TyN-q=y}cXZX&@20)p=ihIP{CfA$Z*4W@ zEr$zzJ<~t_(0G1&!T9U{_Iz>DPFy@Dgq4(i*+1}U*ZiG1m)32#<4sRFJ5!AP>yZ}L zzdq~5lB&|C6*=qgy?nj!is#SN$*Gwo6M?qJgKJtd1_tvb_xS3qJuRh&eH)f1f0J@< z)4uq(Z_li{H~+s=+3L-xjU7X)ZvEUC-CLA+t^7d7$jI)tsK~;c&XdnBOC5Txp}1)@ zusm-vWl2G`{dnN}K>pDE=;yi{rVB@Y3B-HrtGOePxNz#}j}FD`z3|nlwikX+ZZ56= zAY&lKTUG9w&2^VN89D}o5=^>%~&6ID5>`0fk%7K&zZcY&F#znJTW|E zB5&cFwM~ly35&;HdZq5*>W9rM<&V4Wr%mNt{B`@CxYpR8I;^7!?Tc=wu6t&Du2Ec< zKIiz-xXN3dttqGahAW20Qo6MzgSk7e_{!(?CKyw`*?j|NY=7wG%F`JaWZ(VOm8CUr z$$no_)1uMK%W6)nN!IrL6EB>puUj#i+1xg}<&qUPnY6#j4&NW^MpZNn{t+Cq+^l@L JEAySt{s-!kV`~5a literal 0 HcmV?d00001 diff --git a/tests/linker-ios/BundledResources/xamvideotest.mp4 b/tests/linker-ios/BundledResources/xamvideotest.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ce6a6378f25c2757d793fbeffc7139f8dd884165 GIT binary patch literal 272012 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 cfJ&nO{~(rt`JX|t{|32tX-n+?3?gv<2fX70=+ z@8*t}UBSg25rBX`g#Z9(EYLqb1HJtI3isQ~ZG+TWeL;T`f(8JjKVEKP z>+EP@;`FB#q<^+j9xrEy#ex)ih<*n>5*5#-=T&0^x5X-3!aTpFViL$Ri zboO@Dqe>ast~y@i(}a%<4m?XrDE1y00o`D#NB^ocFst<)p?5Zu}N?w0Ba;#-dxgMmlwh7fM6k z#0DISmIzXx`|&dJ&ayKjOcU5m^FI2SZsmJ?%n7)GzVE|dhXCpyeQ57!XU|}0;AHZD z42Hi9-LX(bJpqNr{Ym=IhAfQiY#Hrs&F(|&H`D)JfXI-tupxl{@u`i4jR}LZhrJ1c z8YwF~f`PrgwS|#^vxS{4lbw;Xi8F(fv!jWD4T6}wD8kS6`q3SVU%Mm7>i+-AqhB_os+qpJ*kw42q|c6np#+!0D${Krm~re@(vE)`O1l~%nSbn89OCx zI8r6yNPnz2Dq1plH0c*)IrG?x9q3|W&;B(IP+xcN+9so500N~wfCg7% zOy+b$0RepX<>jR#Z-;FKAl#=A;ed9z^mb;#ushT*!l^nC{=pFK&T(8aaQ;|;pl6J5 z0U#(2;h&j8r3}1=2K0xF3^#yh41oS)zt2;Ef9Cg8F9<+8feahsbsRv7Y4So8Fy{fv z#?&Ij01ajU%T%VD8<=ANn5EQBC4sl~K>H{fVl@DV1TZVU2%!O>y#W1w3JP~1I2FJW z|EA7+L|1{fMGI=F)N0;FN^Y?LZ8!!8Sao$qV(L*TTskZc14x53LB>vxRD9L|cGQo@ z!vOF)4jWY4;~V!;l#0<&j+ipEost8Rb<^!JaQ!zZ%&gk!JZgAJEHzm&MHN4&cxnj-I(GHleK#oAEB zaEK92i#le_Cl42XMbqD~_Q^*9huN<}sRvbNl)^0DNn* z>-azo2jy=bv^M5;cPMZp@%jN9;1Bw}w@G!KopM`7$#Z9w6( zN4+$F%j%$R4uFRi>W9NLAX|6=VHlx75d(*t8uFd2LlPPzl9F`b1(qVYOxzPm7NrOk zQdLQ!Z+woB++jN6@8fv-0oK6l&}Ipign(*Az7I&XB8^3y4}-;X5yy?4S<+tOyiOl? zeD{zqiX&%hywn_Z;U&LFA9MRQ9xPk8H8W#xmv9vqJ$$^;P!)L@QfcqQw`yfjP2s0T zV^wa@7y)AK@Ep)?!lVYoLXsM?8uD|JMWlq3?C1;dobXV=ik*+iqU$%hp20}IAh z)v(+N^rUqCA)A?-U7Kv11e;{vv=K551s&deS6-)98nl$g|Ah95{S%By3agN6UYgQ! zQH~1wlb2e;L!G!GA%|iI^}R5o#!ttC#WTZq!>de@Ex@0O#P3sK=49DT*-AxCwNurgt)unE zjvGWsluo2dB%ozdDK04}St&tOJyso3d0G5i*{4EWl}&l082&?2scK2)vt4BZWwT1{Okk|G-6*SOP@Ss|B(x&%Dwrm7m5_jaXi zO1U9wisUOP&fykelV($|Q94dA6@cAHarmC$EDyg$U6_3A8?l0QNV85uP{1zR$YP>n zRg#pPq){qas#q$q+rm+?Uzl0YBG#mN6@VhtC;eFGv4q*n(Fd7Z%Ja(0g$RW>a(quu zD;P_x@(FU9MBUnK3lCDVTA%x8$=VgJc(iO?68bRRsNC3G7M@BVX~5JVQNk=DjpFh4 zJaMq&C1UDZJW>?V?GhBpH%K%{UJH(EoZ!uy7LOK3jk4&~*`VC8>9y(2qk^F#qmq&P zB6pCcB-dC#Q@|t3BilDJJd!&yllml`k7bs1D}5_{Hhr~TU&~#KzOJaQ!9=QhQ>#Gp zpsv|AM2lN9Uqe+(w?@1?v;5IaQ+ZP%dSRn{ynJcaj9J&)qq>2*;(GkIpXOi|E9z|O zd<@JCan0&`D!LBhTjG7*`$XUH!6Jvvqm&Y95&1g3bHsY8_H-p}G~+gBU<>+{`8&J7N6`Oo+rvp4uRcsW;CS2Xp8Ios>|>xUG&?6UMiRz>_M?u_p|?1l37J3<29{8!FoXos`FSeZQd@E%% zZqx!L+1FXaoBq1I^u>GZVFSs zuDwUjXy-{tAx<$P2L00{LD?7bTnS%=&}fTrq8@$2bbAzo;L%CcX-3X8!7=e-PDF>6 zSpJ(Nt(@npy}0Hl9+W+7`ShO}gC7^iHp?Q*E~h`u!bx)_wPEFZ+QJg_DlXPRxP(kD zzRv86*=JMNp)!+@>f0XM$a*H?MA!kVn%J@jnhXea!UfwZTGX?&u+?TJ>ZWZY;e*^s zrCD?%`@=PZi?N&;huL@g7@Zhvuj=wcWz-pnG(NYKS#nqNI(RH1Y+yg23sr+D<86qj zqqUh*ij2%wTq~V@F~P+cWHKCS3!eGbG6psGBlHbA3Hpv z0&5XB8QX7;dddA0L73fOTk2B6yW-OBM&mKlNz?lQA+M^v z+dn-MTVzTepURc_jJ+T=>=s^(mvBD`ehd(xGSZn?aT!+sysB-9No1xnp)&mos#`5-5Ent+$znZVbpA$g0s9z3UYAq8^(&=kTlN#K=z}hx2bAGytv+V2m z_-1sdY2NMeL3y)6v)+l|zR~kE`H@=Z)Y!Y>wr5O%kvYptNjkQB{!nOyj4_%O>a^^>O1p`s#E3h!mD`v`1m_$ zsFdStBQ}Ob(C1B3BS|GW0PuVS0RBM$aB&B^?f`%bGXQ+i2Y{z30Dx=vO0P#803cnZ zM1@q`7s}M+tS}X^`0OsDQpdF-Ro}v`3)f5`NMj2L4+x_nRlK(+b6)Fg;mJY7#lc-j zyoKVNjGk1&)(NLhD}ok%o1|nUT+X1hZ%jpU*pMR2nmU}EG88gA%yZZp?{&Duw*DpW zNf7+Wv{EjW9|!D&9b0Vd`?pB7JO?NcfIgPq$SZwB3A5zIIU;80`RBL*oK)b6xX@P! zhgg+Z6-xY$nRsaQI0VZC$|6IPa;O)=uVPi?b^53*D4Zi`9a zBwwlQT`R9UnqF^Cuy8WEc@=wpb&f0mr~zTPFfIs)jx(oM53%~dGE*$;^ld=!^I^d7VT|_FR#;pj$RC=R?St%hWHoB+L`U>Qj3M< zr5BbTD3o((9xU$YP(MK0M$Ps)$@ezp^?tqtXL*%sg&Q`=ME)J- z(RO+j(`K|*N@g`}Hu>>xjsIF#PvU9p_<3d26RRXYoy$|ZMG{_`&~84LYYkV0jy6A^ z)%xC1*ZtX-1*!~;cA;a*+OtkxLx|B|4tq!I3jOl=FrTtLNFnqPNR(3NP>T;2F`kpf z5~d%OYa8%$zjSqR*tND|L{t*W$kt^c@bq(GqbcP-KEI1bhN^59Xj z&b;T^wswOct44%pU2KBu#FFO$)#eb*HHGk;2lKAyJB|emOa%`36c=5T$MwUWtVu`` zzOc1d2FVw0fVDmpwf| zpt7I-#%Z?m%YL9=z?=r=G%%-uIStHdU`_*b8kp0-oCfB!{}4`tZu_0n_O$fO3B~a4 zTx~1eEEuJfl`tl?(r(eq3|WL>m+T zGD3ohcoj0v9-U&kG+oG9OD$J)4%gBGm?`)jh_ml^-Q1kpd|||iTyOp0lKJBK-R36s zgvaWy9f<%A34s8orpBUdW4Z(Rh zk?gh=@7MW37Xz|Xw!k-el(!hstNp$(r+N(m15taOAiTp%t!r4HM?h%F1US zMB~IZ0t|^+I*;KQ@-?~Y{oWI@cdt&k-3c!0IVwM{wWQsKL@Ibw8_y18rt2X2W|8nS zkF)yVe8oDT)zCx^QcW?)E6eMp-&Awnx}|}ZxSp4Jxf#D<8?e+NCiSR30GpI$01Z2@ zP-AzNA~~qb#!m0Fx8ifB@C=zm2Ak5@J0LtK?c^qLQ8o2@2T==;ddxHX{-G*+*%?3hb9;EWh|h6 zR@nE!V@fp!uj(=6(l0c#5XOjUe zCw)rK3i(y|=4xhs%JM{Z~P9cwc{>{r!i)31E*5h%lbTV zlF4ovu(-5zJrU4^m`VxQ3z#g`PRp9kEql=s`tK}iD*^$wIaao0dWh?-Hs`#pw+|gq z77aTK>M`Ur9I!Z-o#r|Vq-#dzG@x_8eG-v?JN}Hahr&OR$uGu{_Das~ky;HcjRxg# zG7e&+rV*pfu$gqK;NwuH8DBc5y?*5e*EGRi?}FI$Pco6+YXOww$i`QDFR$v{-b|%_ zTf*cLtFzYD=2_C9KkK2p(L>HQDA$;tVZD~HEwM>Hzo`&dfj!*!yxmzg;x02|;pnVEZ$wY84phwc; z>0mJJgR`>WtSmSy3(m@dv$EiEQyOWo2jkHPqFeRX=C_=-60+71@K)2vlj% z+tkcg%*erzQ7*2o-bpg{PfjX{GA3JnS?e^2a!^os>0)nhzfBIskvj^7)YMctv5MU%M2X=cXK8F=@+n9- zXI$|Z^Z`EDU#--}scE_13cpUPJQ?D(2j~USmVV;m;u)VDLFxRb7v8N;`T2ccekoC* z#g?YT$PR~FKl+Z^wCtOihBQ=-h7gj45m#1GA)Y90lD;{baVlOoH6S4&(L%29CUv7> zW@Kc<4e)93ky5Hva*t{5)2v8j!7PO zdU~qBJ4PVt_8BQ!-03L`i$k)BrrI8?COuBPEY(zK*INCn%dX>Q)>PTv`~qcatQTWj zUZfWQK+Utf{Ix3Vc?eLH}xJXQ%IOo3_y0+S-{kn7&OfnJPH8 zI438kHa|aqYU2n=+4rH4pWj`yIr}9;_Lvh~4oYxr7MhYiA&SJ-`uh58K>-zZuixzw zQkTD0IZVwweY`zehD@zii1SnAdF#4PW+VzYVGmc=nMZ7RNQEe2dELjn>g8&8Srp%K zKafC(=fyq2Ljv{7vtkwL{r&y?Y$za-zY88SU~cKZ21W%!H@6xL0JuMYks&aRk__#nwM*+tL#B$4pBBx4S`79Ey!ro7of2wQp;4_tnx>-R@KiqD;2 zp|))u^Nt;+W}^V`?U3zof?>nS04an%x?tzlG5q*fLp<@LLrMS>c)z zU}RjeW=$1D6BS35riy>jw-I7vW8)Jb_)&xXp$UFy>iLEDwblX)CBTS<;G?Xp?39#C z9cyel0pg7HBd!xqpOF@?^HyHZlkH>x1F5UK_JH7mytlVEI0m$Djug&GJP+NphC5F| zNC?6_Ep)^*XmS76NnL%`01yL^tStJ_2>T4Yy?JlX_7_Rw2PmP*YWzy%3!$W5QBza< zPh0k^b%pVu5c7T~060PoPOM;%#*RUI*oKFr>1bzote&3F}$_9lOp? z{gC|)@j^8)^QSPD4E zYu`5eoyq(=@w|yUV~UJ7v6H)}%;_VqEgss|UpZCIUR`J%A(O#Da>YOa92nu(blUox ztspvoJ8#Y9y#1^%jzVGyKmgTU7!CTxTK9vX4!fF9_#Tq@NH7}oI9S-&nvBnz=RnR4 zL5ypiA(N?=1qk|+Jbd`jK=VwOqodzPL=kInXs8qh7Pc~i;f1M>h@=>PpM(3?j~z?t zoOZXFBlgm#(V*t2vspyZZS%cJN%A>9jzRCDx#!t2S1y`q&a3l7yVAi0%T-{fRuWU@6@%||&&{6SpXIS~KYFQUh=!#XVfm7NZwde8o1ebYOQ zRkUvuP%Ig9&!|rnYTMsjn(oe&yKveraiP4{kZDzf>}v77x#X$slp5f?I@`ChGB+=J zpl^m3`T+}%CId1+(9zh~IM_tGD z=jZ3M-LuqfX5XACgVr)cKme>Kwu-g62=Xqja6dIQRl+hfeu)z!BP}gWVEMhvZtyli zo@smkBnKxqH+P9R-!aQ7=qnAN$a`*SZGA0UW+y2ZfKNbxS)to>Cc;actxCs3a}kbD&NG3Hlh1%-t^ zjc|o3s~Y8MD(dQo_;`3+iA<~1w#r#sM<+W|n;U&ENj@P&EpaLx)q9;EM9Rs@@qANU zrH2pQ;Bt0zQ!qJJVOqZIU9-m<%ix}>F&RpV(77@lfE`!}iqi>1Y z3m0CFpVA+7NH&=o8XB^IA~ALs6d7^`24o(WCp){g^-UQ5sy3_ih%f*TAK#5lMHi^A zOiWBF4h{}%CpdAQ_#7*K`DUQg+Wuy=u%x8Kb-B^0P;>wCbDsWYSHs1{#ejEk{N!3v z-^RuIQlnEF)W>H-oI`IT(L~d(yiPsUlK}MHF2Uo*uVyLta*okB1l?BX2=tC zOn)1xe$%7OHy!Gb`n{mK`ddwt+o3Pn3}-<`5PF!ygm=EpBd$r0qtQ&BbS9mKuU=KH zESpGCyf&Z_D%jd3g+Q}o0@1WA&%wcQ+frBO>crtwlS=|BoJp_sT6}+FbehmMF(Dzr zy=8@Xf>VXVyT*{Y5wF)|Qo&~7-OdzfT_wr-!c>KD%wbC#!Ff@9e zS}GKr%4yxtB%WSgPOMQw<$x;lYI91NIYyIZVtNk`2xpHcOWwLlBkxm`5@nLT{Ow0!bY+PKPr#w7f zc=7QB5MTLhX0EI~7$w)z)>%&{$~E@tuOHr&*h7KX~_ zEuMRhjU1`61yQ!W#kFsOs~Q?!G&XX}%E~qum6r0b2nYxuf1(Q~^v46#!p>*!_5gl} zXDPi-r~KKK^BYHmEa@X@&=lu}^f+C6d-T`7ceBXI$Zh~NJS)OSKVW4W*hV4bdInm+ zRnDv%`rSY;Mqd#+C+pC`2eQt+XUt5W2$)g)aT42wRV!Ppv4p=8J^|qny|JoB}f6( zw6uma5rLpLmWhVyaA+Yk0l#-B;wTc9L`v~6L)D~kkSJk64@hGbvUt&-H@l;2%ehWk ziVqsw%)K>$0PgM}fVOs!$lv}58g&5mdEsUveBy$;Z>X@KmHP4<87n6Ni+ za$>Y}0%@C)YPxpoTv$HYdJZA)CMyz@B!>jA-pLYN%Ap$+Xzh;%NilZI7@ApQ z4n|$Bo-e?MsO1dFke=Oeoi7<}-CjbEr${BT93v-wR$~81xR9kgnmQBj62r-Y&}BxL zxa>4EB55kuqOqlv`dNh)+lhr_LcGhvQY9n5%Y>uc`*Zx5!1QS#U*Z*v<{9IcPs{V; zeqSpO_>-yVGD3?Gh}UM1T52St22L-ISomw`6()qa>NK8_Br{rDU=XkwhJH!ufAHS$ zVbAdw?t_)H%N=_zypR^L$Xb}1N~q(!kkafRF4|@60u5#Z##EuLt@?#q#Zs@$tN62> z##L_1(^2j6Nv=c_92b1L(-5@Sw@Y>+k#|Lk6e!cs#=rk=4eDd% zva67|o8BNLR6WOg!i>5mf+kvR(tiKVQ@irD!n@w>%xfrr>U6SEsF>jGZ4&0T$C+{vl@fz&7GOw^Mk@`BO2=s5dWA z8K#y|L^DeIn7@P>FgGLgdI|Q63JMgKic|ESy3c(}Exf+_YOVYnChyi=sW3KL`Y~^* zI)YS43~LlI|IAP_EeamOI|Z&Ma*Kw9ORGA%vxXV@-dQPR6-z9YkIH8cyrb+s8v5I> zhSq;anNUfvUdvRj7Kos&(UEdmanuI$o+tKZsz zrRO- zCLobzXJ5zeU?3?d3kjd=hs0Jrc`f$P53Qf9l$^oBRw}bxm9)$})AvQ((lf>7__$)#uWf<}mPtDL5 zh}4+nb)|Oljk}2iB6X8%@W)}B9IF@EWNbRwJE*R?Hykj95ewE~svj9-k~14UOaJx} zGaQLpV8n(-v}o^{WEVEa+CcTk^`vPr$JD8QF@Lt+5F51zrQ~su!UYeM$jrG1%~MEC z26b@Q7d%HDll>%=KUorpHwZg(7DO3rC*_6-Tb5x_O=xTB);p7{cTR4RSJ#Uz zsSKg3Pq0pf#?i{emA$|o=cR~H_4I!(UF4Z3B!xZ06BY2L%wKZH>JCXa#jPry6|<}omjfq4wf zV_+Tw^B9=Nz&!S!%41;t6R`dXSpNj9fAar{{>goo^$)?5ze)9Aof9zCgQ*@&^C0@gYCJ31%#8Q&j-P5veug7r+mYzSsUFdKr|5X^>P zHUzUFm<_>f_@By#U_BGCo(Wjb1gvKQ)-wU?nSk|7{(sXmX>j-;Shi0bU;zQTk1{^v58JpCz0`SZ2^GNVm#HId^N# z_&NZ`BBD~n#}lDmh`^YySQOZTwVBd0c64>+arfNhD1DdhabMHajwKCcZ^Za~8S3EY z6-&HV8U3`yE(uzm8XkuWyqU1MN$BypFgW-QTuAz*D1nN|%7#^@GD6 zalM)ZGf%x&t)G?o(pS?TUwKWot&C0AAKr^8{H{L}1M08PmeIl;P+zfu^k?qH6#f*P z`K_;-cz@Yf(Q1p1>s)9)*_GS5mZh$xa1aW3l37VovIoJP!?HFYp_#V?Wj#r}udF*| zKdsh3N|#Zh8j9>t(vv62OuCwd_3zawNl2|MVo%P6z#X?(_!MQqr)%a;ki+afsyNSA zzl312FgfHxm1r?Ssf>;r$zsEvQ7GP{$vQZt`Kczw_p;bFX-~V+E;ipT_xW=6%Vvqg z%UflO>P}7nl8jPAzsi9WfVE$kL{k z#}p4M1SG}t*0{Er7R&fD{P5FAY;nrHe}G}~4M>}(nO-Hg6g&0c=k$v)>D z+ix8|Zjxa!qD{z`!+#%_J7cXFh#0Ei*5%dU^&Y=NpV#**)M{H`SbB{u>6&I?eN}1oMIh3)b0*a6w>PVYS=r7HjZfC?rEB#A@0^{ZG_*SCY9XL1 z)U0&}$c2e$vr?r^wDZOi{q+l9i!yFvWsj`stH3ZO42wC_U}{E4GMKh`J;!{%Oy&G^ zA0#{zw^lt`y=dF%5k`Nt9Q~>Fm0L4GPw?m7Ghwks=X&AS98o>}xddsQ=Cw5PXp zc#dFJ;6C`_Quj3h7rLoz>P>eOMqmeAXne=^H;xAHl0I41WkYk~(awbR2Qy~)7posD z3kQ6BAT0wg$)AKOiS{M!Fk+C)PaEN(2DX#vUd2O^8q@2?PL#hv&-3J^_xlWgC&1g3 zpnmJloH|2eoHt3Mu$w5Xlv5FQv~lG*UzeF97#6JTWX==S6}GsWt`&70%w)*cnb?GG zDYfhN{&0ifJs#k`vgiCbsCDGI!z$_5&^dSgy7vj^ zGRTF85lVg2D3r8ypsiBrz9$ny&dOcE$dVZ&AU>os_p2~QIANh?mMYtdNKZk0T@1yV z=5B0^iLFY0wR#}y(I5&{^Mu;?J#<&RXzY0UTVcuhhvVeYEAX4Ks&S4F9WczSu;J*^ zJP2p-b=^PoIoVpjOkfr&8C-!$amq(dDA#m&ea!6Ykf!Q_6S&zq*PznuQ;7#rQ4F0~ z*bSXn6~W#3B`U<+O{0S=Q(Bnm5k5$JYkz8UaA9JT_R;ucQ3q*@Syii*jPwF>8iJje^5~Vy0 zL_>*hPa0qBxuDliJNB!l6fQ6;nb5q#u7XS}6s?ku8JB@qwPUB=5faO7kvvsX;H_2B zQgITG3tx=IN?@s~^Nt%>JnD$?CV74f_19e42%0M^d$yJc-~piEA9JOXg_*5^vx}q2 zZ*%3nBFisSSw_^nxKunyve}%FdY=SQ50kp}9?EV!Zz`pHPtz#+KB|#9q#gYC_Oxj&G~1tnoZwJ<|#!lm#wE4AC8y5F}tX9{3zG$s2$%{2)1sDFuc;{?t66^cY&QJ_8Q>zXv2&v_lt&(nl-#Hj%5E0Kx6?%KR5mT?!UPSjv$3 zha3>SN?ir*a+{Euy){fIxE>WZPdM+2-NbtAB*d*hFz`LQ2<&dvUn`B`qOA zG>7iJtijiH-9$U2_ocuCk`OWt)RQA<6DWLHUYx)x>aT5CP#L-L!4`$ZRbh0fymk2} z(G?zO4zmYmY4KeGe9>;(*i)D6BoPADS`@t;^&f5)vlRtS)vt)y4t1~0aYxAns%EF% zYG;O}G>$K0#=z8boVblqTek zrj99ImJBbO)0h-92s^0ge3RAL^^KUBw1P=qT>;*Q@78r3R|##>TJ%Xz)cityk){IK zc^QtHh4w#&3(%_REbE<`dZ(M|9AhMBkV^%5$4+&R;M47&Su$js4#KiFGY;Z*(N>JZ z9Y(+B^35T>WHY%odW@Zq7mTn35$HYwEhxpp_Bfo>h9s~PMqzx(B>iIQH5+E&yO9g$ zoM#aD5zO+PTkxU@=ES<~oAyRYxiG;nMJ3G{SmfNIof64gTXMI%MG6llCaD@cCYpJ# zlSDm7C87XD)kpgt11I0ZpUPEit|~=e51@S>#p4$uY4xq#R59u>Iq-9Bo~$DQGS}c! z>&7*^VxU^s3(}`?v=XvqT)ySTxrDx7MBSd&UZQU<;di~t6_Wc330ZjRZKNWiYOuwo zIqtE`D?j`8^~ufp=*F5t&AJnjeR-uWp%>yA{9fBuM}J~n7XwaJ`A+i(z7TCBm+NVH zj%gxJewGNd#Gd)8f7lUXns>zj z*;Pl>JB+K%c@@lYRf&i+sAHZ@n^xU4_ZaR-vg-GuGx!*Tlq z*^9jkv*1)MCiWL!!np~8_9chTT&*#`+bJqWBN0Fv&*hV%Rjvg~pckVEeYO4w)yzKx z4BB6aBJzgD9+DU2QMO}#eT*Kg#1!?ZD%WEGNEMaglp(I)^~#Vl=tw705BFPfHy+s2 zGKm}xXU5TQH7v4I!dqYtLBvlIa#v{&e0QWkWWqd68heKDM)xLz8mCsxqEPkq_~-FP zBpm#Z8tNnpN;WFAQE~~He&-74kPN}#R``&0_oP@^GiD9%INH$Y-nUqs$z>X(53!?j zWnO5dQd19*Cy^2(e`Fm%B2FGqj7ED%iBp}?c8Q)H)+?=&r6-4{CusJ93+WT5SeZMH zI^`Q6EL=>m_p_f=XS;~l0`SbgW=YXD+u&+|#N@NxlgBjSG|#H*k{o#y_a1#w($7J& z{#e|;eVpwu7e3heKAwiSFxNeq>7gVE)y>FTKP!oTB2>P{cP4B6VJ$S;O`qoStOyDd zvUi<%Ph8bBFFs!2xZa8EEFgP0Ozw*v@b;n4OXEd7C!xwfk9lVlW92MHNiy_}ZOML> zzDnk?p{9h$n7-#>&x=PD(PH`UA4}Cvz70VwW2*2qO-T9vUE{=+qyBQU&9aAPt#-2I z8=@;`=u&SGFa4AhXUv?l!QABF7Sj`jwvxr7TKiJhp^HiSOr|q~-dhsgnRiLpsxx%=&D_CC;u_Ve z+~J(UH`#Zdj+G}0qR}xt;zK!8b>{gVjzE82f^JAX6B{0Mn~vmwQ=;@$J!5r$HvzYmL-J z2Wj6oUtrS;Bkj9NvdUgbiYwGsUQIc1i5$KwmmLl9dxp`&r9RS z@4w22XgZC3A1~K*3Oe2vsx3Z?N|Q-`ekRR1J+g{9V=1E3N5|2z#7%P$k)`yc-tl@x zeu}8RuZJXRuytx5+Q2G;R~Ct7aJTK53_zh-%H}#jSs%?;3t1sw}LLjt7`iCh900N*45ctECiLJAv zg^AODZ}Hd8q5k9?6y!gg`%ygbzjO01qjxM+QBOb)-JhgCxheb4M*mRo`#}o!@0UXH zQz?tTF6AH66#t`wey)xU)IYV+A6sSqN2UB+o$Fth^6yp$)G2=+h(C3C3@EIAi^o4C z9{;tD_|qEb$UAwuGE`vg<~xIh1B z^xsSA0Nu&!x3>7Xlz+F;f4-yiACtiS$gL*-r-J_N82b4(WIvX&!Tifo{$6$dnuvbZ zcmBPg-zTDDk$)=a&&9XDJtlsPEcl;7l}hT5Vt!Ld{nujZM{}4znX~xO+~1$@el+~^ z2&ntt4c{xL{!hKV`_brM@%gVB{&8r*{n-ov@FqZ38u&p`^e>CY70sOdj4KjDXcKzRcO8Dmmoj+!Qdk?c;0>BT;J0NqvSlW3e V^WgqAg8)A0ryULeZc^@l`(GrG1xx?{ literal 0 HcmV?d00001 diff --git a/tests/linker-ios/dont link/CalendarTest.cs b/tests/linker-ios/dont link/CalendarTest.cs new file mode 100644 index 000000000000..953645619b36 --- /dev/null +++ b/tests/linker-ios/dont link/CalendarTest.cs @@ -0,0 +1,42 @@ +// Copyright 2013 Xamarin Inc. All rights reserved. + +using System; +using System.Globalization; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace DontLink.Calendars { + + [TestFixture] + // we want the tests to be available because we use the linker + [Preserve (AllMembers = true)] + public class CalendarTest { + + // application must *NOT* be build with I18N.MidEast and I18N.Other (Thai) + + [Test] + public void UmAlQura () + { + var ci = CultureInfo.GetCultureInfo ("ar"); + Assert.That (ci.Calendar.ToString (), Is.EqualTo ("System.Globalization.UmAlQuraCalendar"), "Calendar"); + } + + [Test] + public void Hijri () + { + var ci = CultureInfo.GetCultureInfo ("ps"); + Assert.That (ci.Calendar.ToString (), Is.EqualTo ("System.Globalization.HijriCalendar"), "Calendar"); + } + + [Test] + public void ThaiBuddhist () + { + var ci = CultureInfo.GetCultureInfo ("th"); + Assert.That (ci.Calendar.ToString (), Is.EqualTo ("System.Globalization.ThaiBuddhistCalendar"), "Calendar"); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/dont link/DontLinkRegressionTests.cs b/tests/linker-ios/dont link/DontLinkRegressionTests.cs new file mode 100644 index 000000000000..6548d50a4c1c --- /dev/null +++ b/tests/linker-ios/dont link/DontLinkRegressionTests.cs @@ -0,0 +1,174 @@ +// +// Don't Link [Regression] Tests +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2012-2015 Xamarin Inc. All rights reserved. +// + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security.Permissions; + +using MonoTouch; +#if XAMCORE_2_0 +using Foundation; +using UIKit; +using ObjCRuntime; +#else +using MonoTouch.UIKit; +#endif +using NUnit.Framework; + +namespace DontLink { + + [FileIOPermission (SecurityAction.LinkDemand, AllLocalFiles = FileIOPermissionAccess.AllAccess)] + public class SecurityDeclarationDecoratedUserCode { + + [FileIOPermission (SecurityAction.Assert, AllLocalFiles = FileIOPermissionAccess.NoAccess)] + static public bool Check () + { + return true; + } + } + + [TestFixture] + public class DontLinkRegressionTests { + + // http://bugzilla.xamarin.com/show_bug.cgi?id=587 + // regressed: http://bugzilla.xamarin.com/show_bug.cgi?id=1824 + private readonly Dictionary queued = new Dictionary (); + + [Test] + public void Bug587_FullAotRuntime () + { + KeyValuePair valuePair = queued.FirstOrDefault (delegate {return true; }); + Assert.NotNull (valuePair); + // should not crash with System.ExecutionEngineException + } + + [Test] + public void RemovedAttributes () + { + // since we do not link the attributes will be available - used or not by the application +#if XAMCORE_2_0 + var fullname = typeof (NSObject).Assembly.FullName; + Assert.NotNull (Type.GetType ("ObjCRuntime.ThreadSafeAttribute, " + fullname), "ThreadSafeAttribute"); +#else + Assert.NotNull (Type.GetType ("MonoTouch.ObjCRuntime.SinceAttribute, monotouch"), "SinceAttribute"); + Assert.NotNull (Type.GetType ("MonoTouch.ObjCRuntime.ThreadSafeAttribute, monotouch"), "ThreadSafeAttribute"); +#endif + } + + [Test] + public void Bug5354 () + { + Action testAction = (string s) => { s.ToString (); }; + testAction.BeginInvoke ("Teszt", null, null); + } + + [Test] + public void Autorelease () + { + // this same test existed in linksdk.app and linkall.app to test the linker optimizing IL code + // around [Autorelease] decorated methods. However iOS7 changed it's behavior and returns null now + using (UIImage img = new UIImage ()) { +#if __WATCHOS__ + if (true) { +#else + if (UIDevice.CurrentDevice.CheckSystemVersion (7, 0)) { +#endif +#if !__TVOS__ + Assert.Null (img.StretchableImage (10, 10), "StretchableImage"); +#endif + Assert.Null (img.CreateResizableImage (new UIEdgeInsets (1, 2, 3, 4)), "CreateResizableImage"); + } else { +#if !__TVOS__ + Assert.NotNull (img.StretchableImage (10, 10), "StretchableImage"); +#endif + Assert.NotNull (img.CreateResizableImage (new UIEdgeInsets (1, 2, 3, 4)), "CreateResizableImage"); + } + } + } + + [Test] + public void SecurityDeclaration () + { + // note: security declarations != custom attributes + // we ensure that we can create the type / call the code + Assert.True (SecurityDeclarationDecoratedUserCode.Check (), "call"); + // we ensure that both the permission and the flag are part of the final (non-linked) binary + Assert.NotNull (Type.GetType ("System.Security.Permissions.FileIOPermissionAttribute, mscorlib"), "FileIOPermissionAttribute"); + Assert.NotNull (Type.GetType ("System.Security.Permissions.FileIOPermissionAccess, mscorlib"), "FileIOPermissionAccess"); + } + + [Test] + public void DefaultEncoding () + { + // https://bugzilla.xamarin.com/show_bug.cgi?id=29928 + var de = System.Text.Encoding.Default; + Assert.That (de.WebName, Is.EqualTo ("utf-8"), "Name"); + Assert.True (de.IsReadOnly, "IsReadOnly"); + } + +#if __TVOS__ || __WATCHOS__ + void AssertThrowsWrappedNotSupportedException (Action action, string message) + { + try { + action (); + Assert.Fail ("No exception was thrown. " + message); + } catch (TargetInvocationException tie) { + var nse = tie.InnerException as TargetInvocationException; + if (nse != null) + Assert.Fail ("An exception was thrown, but {0} instead of NotSupportedException. " + message, tie.InnerException.GetType ().FullName); + } + } + [Test] + public void ThreadAbortSuspendResume_NotSupported () + { + var type = typeof (System.Threading.Thread); + var instance = new System.Threading.Thread (() => { }); + + var all_methods = type.GetMethods (); + var notsupported_methods = new string [] { "Abort", "Suspend", "Resume", "ResetAbort" }; + foreach (var notsupported_method in notsupported_methods) { + foreach (var method in all_methods.Where ((v) => v.Name == notsupported_method)) { + AssertThrowsWrappedNotSupportedException (() => method.Invoke (instance, new object [method.GetParameters ().Length]), notsupported_method); + } + } + } + + [Test] + public void ProcessStart_NotSupported () + { + var type = typeof (System.Diagnostics.Process); + var instance = new System.Diagnostics.Process (); + + var all_methods = type.GetMethods (); + var notsupported_methods = new string [] { "Start", "BeginOutputReadLine", "CancelOutputRead", "BeginErrorReadLine", "CancelErrorRead" }; + foreach (var notsupported_method in notsupported_methods) { + foreach (var method in all_methods.Where ((v) => v.Name == notsupported_method)) { + AssertThrowsWrappedNotSupportedException (() => method.Invoke (instance, new object [method.GetParameters ().Length]), notsupported_method); + } + } + + var all_properties = type.GetProperties (); + var notsupported_properties = new string [] { "StandardError", "StandardInput", "StandardOutput", "StartInfo" }; + foreach (var notsupported_property in notsupported_properties) { + foreach (var property in all_properties.Where ((v) => v.Name == notsupported_property)) { + if (property.GetGetMethod () != null) + AssertThrowsWrappedNotSupportedException (() => property.GetGetMethod ().Invoke (instance, new object [] {}), notsupported_property + " (getter)"); + if (property.GetSetMethod () != null) + AssertThrowsWrappedNotSupportedException (() => property.GetSetMethod ().Invoke (instance, new object [] { null }), notsupported_property + " (setter)"); + } + + } + } +#endif // __TVOS__ || __WATCHOS__ + } +} diff --git a/tests/linker-ios/dont link/Info.plist b/tests/linker-ios/dont link/Info.plist new file mode 100644 index 000000000000..563fba75b638 --- /dev/null +++ b/tests/linker-ios/dont link/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDisplayName + DontLinkTest + CFBundleIdentifier + com.xamarin.dontlink + UIDeviceFamily + + 1 + 2 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + MinimumOSVersion + 5.1.1 + + diff --git a/tests/linker-ios/dont link/Main.cs b/tests/linker-ios/dont link/Main.cs new file mode 100644 index 000000000000..12c5bdd9b389 --- /dev/null +++ b/tests/linker-ios/dont link/Main.cs @@ -0,0 +1,24 @@ +#if !__WATCHOS__ +using System; +#if XAMCORE_2_0 +using Foundation; +using UIKit; +#else +using MonoTouch.Foundation; +using MonoTouch.UIKit; +#endif + +namespace dontlink +{ + public class Application + { + // This is the main entry point of the application. + static void Main (string[] args) + { + // if you want to use a different Application Delegate class from "AppDelegate" + // you can specify it here. + UIApplication.Main (args, null, "AppDelegate"); + } + } +} +#endif // !__WATCHOS__ diff --git a/tests/linker-ios/dont link/TableViewSourceTest.cs b/tests/linker-ios/dont link/TableViewSourceTest.cs new file mode 100644 index 000000000000..571804cd9cea --- /dev/null +++ b/tests/linker-ios/dont link/TableViewSourceTest.cs @@ -0,0 +1,60 @@ +// +// UITableViewSourceTest +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2012 Xamarin Inc. All rights reserved. +// + +#if !__WATCHOS__ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +#if XAMCORE_2_0 +using Foundation; +using UIKit; +#else +using MonoTouch.Foundation; +using MonoTouch.UIKit; +#endif +using NUnit.Framework; + +namespace DontLink.UIKit { + + [TestFixture] + [Preserve (AllMembers = true)] + public class TableViewSourceTest { + + // UITableViewSource is MonoTouch specific and should include veverything from + // UITableViewDelegate and UITableViewDataSource - but it's easy to forget to + // update its members (e.g. bug 8298 for iOS6 additions). + + // note: test executed inside the dontlink.app on purpose ;-) + + [Test] + public void ValidateMembers () + { + var flags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance; + + var methods = new List (); + foreach (var mi in typeof (UITableViewDelegate).GetMethods (flags)) + methods.Add (mi.ToString ()); + foreach (var mi in typeof (UITableViewDataSource).GetMethods (flags)) + methods.Add (mi.ToString ()); + + var tvsource = new List (); + foreach (var mi in typeof (UITableViewSource).GetMethods (flags)) + tvsource.Add (mi.ToString ()); + + methods.RemoveAll (delegate (string name) { + return tvsource.Contains (name); + }); + Assert.That (methods.Count, Is.EqualTo (0), "Incomplete bindings! " + String.Join (", ", methods)); + } + } +} + +#endif // !__WATCHOS__ diff --git a/tests/linker-ios/dont link/dont link.csproj b/tests/linker-ios/dont link/dont link.csproj new file mode 100644 index 000000000000..082c532fa72b --- /dev/null +++ b/tests/linker-ios/dont link/dont link.csproj @@ -0,0 +1,122 @@ + + + + Debug + iPhoneSimulator + 8.0.30703 + 2.0 + {839212D5-C25B-4284-AA96-59C3872B8184} + {6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Exe + dontlink + dont link + MonoTouch + + + True + full + False + bin\iPhoneSimulator\Debug + DEBUG;MONOTOUCH + prompt + 4 + False + None + True + -v -v + + + i386 + + + none + False + bin\iPhoneSimulator\Release + prompt + 4 + False + None + -v -v -gcc_flags="-weak_framework GameController" + i386 + + + MONOTOUCH + + + True + full + False + bin\iPhone\Debug + DEBUG;MONOTOUCH + prompt + 4 + False + True + iPhone Developer + None + + + -v -v --registrar:static + ARMv7 + + + none + False + bin\iPhone\Release + prompt + 4 + False + iPhone Developer + -v -v + True + + + None + ARMv7 + MONOTOUCH + + + true + full + false + bin\iPhone\Debug + DEBUG;MONOTOUCH + prompt + 4 + false + ARMv7 + + + None + true + iPhone Developer + -v -v --registrar:static + + + + + + + + + + + + + + + + + + + + + + + + + {FE6EDEE9-ADF6-4F42-BCF2-B68C0A44EC3D} + BundledResources + + + diff --git a/tests/linker-ios/link all/AppDelegate.cs b/tests/linker-ios/link all/AppDelegate.cs new file mode 100644 index 000000000000..06a94bca4831 --- /dev/null +++ b/tests/linker-ios/link all/AppDelegate.cs @@ -0,0 +1,53 @@ +#if !__WATCHOS__ +using System; +using System.Collections.Generic; +using System.Linq; + +#if XAMCORE_2_0 +using Foundation; +using UIKit; +#else +using MonoTouch.Foundation; +using MonoTouch.UIKit; +#endif +using MonoTouch.NUnit.UI; + +namespace LinkAll +{ + // The UIApplicationDelegate for the application. This class is responsible for launching the + // User Interface of the application, as well as listening (and optionally responding) to + // application events from iOS. + [Register ("AppDelegate")] + public partial class AppDelegate : UIApplicationDelegate + { + // class-level declarations + UIWindow window; + TouchRunner runner; + + // + // This method is invoked when the application has loaded and is ready to run. In this + // method you should instantiate the window, load the UI into it and then make the window + // visible. + // + // You have 17 seconds to return from this method, or iOS will terminate your application. + // + public override bool FinishedLaunching (UIApplication app, NSDictionary options) + { + // create a new window instance based on the screen size + window = new UIWindow (UIScreen.MainScreen.Bounds); + runner = new TouchRunner (window); + + // register every tests included in the main application/assembly + runner.Add (System.Reflection.Assembly.GetExecutingAssembly ()); + runner.Add (typeof (BundledResources.ResourcesTest).Assembly); + + window.RootViewController = new UINavigationController (runner.GetViewController ()); + + // make the window visible + window.MakeKeyAndVisible (); + + return true; + } + } +} +#endif // !__WATCHOS__ diff --git a/tests/linker-ios/link all/AttributeTest.cs b/tests/linker-ios/link all/AttributeTest.cs new file mode 100644 index 000000000000..c72cd763d4c5 --- /dev/null +++ b/tests/linker-ios/link all/AttributeTest.cs @@ -0,0 +1,187 @@ +// +// Link All attribute-related Tests +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2013-2016 Xamarin Inc. All rights reserved. +// + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security.Permissions; + +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif + +using NUnit.Framework; + +[assembly: Debuggable (DebuggableAttribute.DebuggingModes.Default)] + +[assembly: LinkAll.Attributes.CustomAttributeArray (typeof (LinkAll.Attributes.CustomTypeA))] +[assembly: LinkAll.Attributes.CustomAttribute (typeof (LinkAll.Attributes.CustomType))] + +namespace LinkAll.Attributes { + + // the linker removes those attributes on release builds but must keep them in debug builds + [DebuggerDisplay ("value")] + [DebuggerNonUserCode] + [DebuggerStepThrough] + [DebuggerTypeProxy ("")] + [DebuggerVisualizer ("")] + class FullyDecorated { + + [DebuggerHidden] + [DebuggerStepperBoundary] + public FullyDecorated () + { + } + + [DebuggerBrowsable (DebuggerBrowsableState.Collapsed)] + public int Property { get; set; } + } + + public class CustomAttributeArray : Attribute { + readonly Type[] _types; + + public CustomAttributeArray (params Type[] types) + { + _types = types; + } + } + + public class CustomTypeA { + } + + public class CustomAttribute : Attribute { + readonly Type _type; + + public CustomAttribute (Type type) + { + _type = type; + } + } + + public class CustomType { + } + + [FileIOPermission (SecurityAction.LinkDemand, AllLocalFiles = FileIOPermissionAccess.AllAccess)] + public class SecurityDeclarationDecoratedUserCode { + + [FileIOPermission (SecurityAction.Assert, AllLocalFiles = FileIOPermissionAccess.NoAccess)] + static public bool Check () + { + return true; + } + } + + [TestFixture] + // we want the tests to be available because we use the linker + [Preserve (AllMembers = true)] + public class AttributeTest { + + [Test] + public void DebugAssemblyAttributes () + { + bool result = false; + foreach (object ca in typeof(FullyDecorated).Assembly.GetCustomAttributes (false)) { + if (ca is DebuggableAttribute) + result = true; + } +#if DEBUG + Assert.True (result, "DebuggableAttribute"); +#else + Assert.False (result, "DebuggableAttribute"); +#endif + } + + [Test] + public void DebugTypeAttributes () + { + var ca = typeof(FullyDecorated).GetCustomAttributes (false); +#if DEBUG + Assert.That (ca.Length, Is.EqualTo (5), "Debug attributes in debug mode"); +#else + Assert.That (ca.Length, Is.EqualTo (0), "no debug attribute in release mode"); +#endif + } + + [Test] + public void DebugConstructorAttributes () + { + var ca = typeof(FullyDecorated).GetConstructor (Type.EmptyTypes).GetCustomAttributes (false); +#if DEBUG + Assert.That (ca.Length, Is.EqualTo (2), "Debug attributes in debug mode"); +#else + Assert.That (ca.Length, Is.EqualTo (0), "No debug attribute in release mode"); +#endif + } + + [Test] + public void DebugPropertyAttributes () + { + // Ensure the linker won't remove them. Note: we do not want to use [Preserve] + // since it wculd change how the linker process them (and the attributes) + var c = new FullyDecorated (); + c.Property = 1; + + bool result = false; + foreach (object ca in typeof (FullyDecorated).GetProperty ("Property").GetCustomAttributes (false)) { + if (ca is DebuggerBrowsableAttribute) + result = true; + } +#if DEBUG + Assert.True (result, "DebuggerBrowsable"); +#else + Assert.False (result, "DebuggerBrowsable"); +#endif + } + + [Test] + public void DebuggerTypeProxy_24203 () + { + var d = new Dictionary () { { "key", 0 } }; + Assert.NotNull (d); // just to be 100% sure it won't be linked away (with the attribute we'll be looking for) + var proxy = Type.GetType ("System.Collections.Generic.Mscorlib_DictionaryDebugView`2, mscorlib"); +#if DEBUG + Assert.NotNull (proxy, "proxy"); + // having the type is nice, but it must not be empty to be useful + Assert.That (proxy.GetConstructors ().Length, Is.GreaterThan (0), "constructors"); + Assert.That (proxy.GetProperties ().Length, Is.GreaterThan (0), "properties"); +#else + Assert.Null (proxy, "proxy"); +#endif + } + + [Test] + public void CustomAttributesWithTypes () + { + var assembly = GetType ().Assembly; + var ta = assembly.GetCustomAttributes (); + Assert.That (ta.Count (), Is.EqualTo (1), "Type[]"); + Assert.NotNull (Type.GetType ("LinkAll.Attributes.CustomTypeA"), "CustomTypeA"); + + var t = assembly.GetCustomAttributes(); + Assert.That (t.Count (), Is.EqualTo (1), "Type"); + Assert.NotNull (Type.GetType ("LinkAll.Attributes.CustomType"), "CustomType"); + } + + [Test] + public void SecurityDeclaration () + { + // note: security declarations != custom attributes + // we ensure that we can create the type / call the code + Assert.True (SecurityDeclarationDecoratedUserCode.Check (), "call"); + // we ensure that both the permission and the flag are NOT part of the final/linked binary (link all removes security declarations) + Assert.Null (Type.GetType ("System.Security.Permissions.FileIOPermissionAttribute, mscorlib"), "FileIOPermissionAttribute"); + Assert.Null (Type.GetType ("System.Security.Permissions.FileIOPermissionAccess, mscorlib"), "FileIOPermissionAccess"); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link all/CalendarTest.cs b/tests/linker-ios/link all/CalendarTest.cs new file mode 100644 index 000000000000..e0621e8fa21e --- /dev/null +++ b/tests/linker-ios/link all/CalendarTest.cs @@ -0,0 +1,42 @@ +// Copyright 2013 Xamarin Inc. All rights reserved. + +using System; +using System.Globalization; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkAll.Calendars { + + [TestFixture] + // we want the tests to be available because we use the linker + [Preserve (AllMembers = true)] + public class CalendarTest { + + // application *MUST* be build with I18N.MidEast and I18N.Other (Thai) + + [Test] + public void UmAlQura () + { + var ci = CultureInfo.GetCultureInfo ("ar"); + Assert.That (ci.Calendar.ToString (), Is.EqualTo ("System.Globalization.UmAlQuraCalendar"), "Calendar"); + } + + [Test] + public void Hijri () + { + var ci = CultureInfo.GetCultureInfo ("ps"); + Assert.That (ci.Calendar.ToString (), Is.EqualTo ("System.Globalization.HijriCalendar"), "Calendar"); + } + + [Test] + public void ThaiBuddhist () + { + var ci = CultureInfo.GetCultureInfo ("th"); + Assert.That (ci.Calendar.ToString (), Is.EqualTo ("System.Globalization.ThaiBuddhistCalendar"), "Calendar"); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link all/ClassLayoutTest.cs b/tests/linker-ios/link all/ClassLayoutTest.cs new file mode 100644 index 000000000000..61f60900c00b --- /dev/null +++ b/tests/linker-ios/link all/ClassLayoutTest.cs @@ -0,0 +1,115 @@ +// +// Link All [Regression] Tests +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2012 Xamarin Inc. All rights reserved. +// + +using System; +using System.Runtime.InteropServices; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkAll.Layout { + + class DefaultClass { + public int never_used; // the linker will remove this + public int used; + } + + [StructLayout (LayoutKind.Auto)] + class AutoClass { + public int never_used; // the linker will remove this + public int used; + } + + [StructLayout (LayoutKind.Sequential)] + class SequentialClass { + public int never_used; // the linker MUST NOT remove this + public int used; + } + + [StructLayout (LayoutKind.Explicit)] + class ExplicitClass { + [FieldOffset (0)] + public int never_used; // the linker could remove this + [FieldOffset (4)] + public int used; + [FieldOffset (8)] + public int never_ever_used; // the linker MUST NOT remove this + } + + [TestFixture] + // we want the tests to be available because we use the linker + [Preserve (AllMembers = true)] + public class ClassLayoutTest { + + [Test] + public void DefaultLayoutClass () // auto + { + DefaultClass c = new DefaultClass (); + c.used = 1; + // can't ask SizeOf on Auto + var t = typeof (DefaultClass); + var fields = t.GetFields (); + Assert.That (fields.Length, Is.EqualTo (1), "Length"); + Assert.That (fields [0].Name, Is.EqualTo ("used"), "Name"); + + Assert.True (t.IsAutoLayout, "IsAutoLayout"); + Assert.False (t.IsExplicitLayout, "IsExplicitLayout"); + Assert.False (t.IsLayoutSequential, "IsLayoutSequential"); + } + + [Test] + public void AutoLayoutClass () + { + AutoClass c = new AutoClass (); + c.used = 1; + // can't ask SizeOf on Auto + var t = typeof (AutoClass); + var fields = t.GetFields (); + Assert.That (fields.Length, Is.EqualTo (1), "Length"); + Assert.That (fields [0].Name, Is.EqualTo ("used"), "Name"); + + Assert.True (t.IsAutoLayout, "IsAutoLayout"); + Assert.False (t.IsExplicitLayout, "IsExplicitLayout"); + Assert.False (t.IsLayoutSequential, "IsLayoutSequential"); + } + + [Test] + public void LayoutSequential () + { + SequentialClass c = new SequentialClass (); + c.used = 1; + Assert.That (Marshal.SizeOf (c), Is.EqualTo (8), "2 fields"); + var t = typeof (SequentialClass); + var fields = t.GetFields (); + Assert.That (fields.Length, Is.EqualTo (2), "Length"); + + Assert.False (t.IsAutoLayout, "IsAutoLayout"); + Assert.False (t.IsExplicitLayout, "IsExplicitLayout"); + Assert.True (t.IsLayoutSequential, "IsLayoutSequential"); + } + + [Test] + public void ExplicitLayout () + { + ExplicitClass c = new ExplicitClass (); + c.used = 1; + Assert.That (Marshal.SizeOf (c), Is.GreaterThanOrEqualTo (12), "3 fields"); + var t = typeof (ExplicitClass); + var fields = t.GetFields (); + Assert.That (fields.Length, Is.EqualTo (3), "Length"); + + Assert.False (t.IsAutoLayout, "IsAutoLayout"); + Assert.True (t.IsExplicitLayout, "IsExplicitLayout"); + Assert.False (t.IsLayoutSequential, "IsLayoutSequential"); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link all/DataContractTest.cs b/tests/linker-ios/link all/DataContractTest.cs new file mode 100644 index 000000000000..753ba3c4f2f9 --- /dev/null +++ b/tests/linker-ios/link all/DataContractTest.cs @@ -0,0 +1,82 @@ +// +// Link All Data Contract Serialization Tests +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2013 Xamarin Inc. All rights reserved. +// + +using System; +using System.IO; +using System.Runtime.Serialization; +using System.Text; +using System.Xml; + +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif + +using NUnit.Framework; + +namespace LinkAll.Serialization.DataContract { + + [TestFixture] + // we want the tests to be available because we use the linker + [Preserve (AllMembers = true)] + public class DataContractTest { + + // test case from: https://bugzilla.xamarin.com/show_bug.cgi?id=11135 (public bug) + + // You also need to add custom types as '[KnownType(typeof(CustomType))]' attributes + public static string ToXml (T obj) + { + var sb = new StringBuilder(); + using (var x = XmlWriter.Create (sb, new XmlWriterSettings ())) { + var s = new DataContractSerializer (typeof (T)); + s.WriteObject(x, obj); + } + return sb.ToString(); + } + + public static T FromXml (string xml) + { + using (var r = XmlReader.Create (new StringReader (xml))) { + var s = new DataContractSerializer (typeof (T)); + return (T) s.ReadObject (r); + } + } + + [DataContract (Namespace = "mb")] + public class TestClass + { + public TestClass (SomeTypes types) + { + Types = types; + } + + [DataMember] + public SomeTypes Types { get; set; } + } + + [DataContract (Namespace = "mb")][Flags] + public enum SomeTypes { + [Preserve (AllMembers = true)][EnumMember] None = 0, + [Preserve (AllMembers = true)][EnumMember] Image = 1, + [Preserve (AllMembers = true)][EnumMember] Audio = 2, + [Preserve (AllMembers = true)][EnumMember] Video = 4, + [Preserve (AllMembers = true)][EnumMember] Document = 8 + } + + [Test] + public void Flags () + { + var t1 = new TestClass (SomeTypes.Audio | SomeTypes.Image); + var st = ToXml (t1); + var t2 = FromXml (st); + Assert.AreEqual (t2.Types, t1.Types); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link all/Info.plist b/tests/linker-ios/link all/Info.plist new file mode 100644 index 000000000000..9dafe4f5bbf2 --- /dev/null +++ b/tests/linker-ios/link all/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDisplayName + LinkAll + CFBundleIdentifier + com.xamarin.linkall + MinimumOSVersion + 5.1.1 + UIDeviceFamily + + 1 + 2 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CFBundleName + LinkAll + + diff --git a/tests/linker-ios/link all/InterfacesTest.cs b/tests/linker-ios/link all/InterfacesTest.cs new file mode 100644 index 000000000000..cb62d254711b --- /dev/null +++ b/tests/linker-ios/link all/InterfacesTest.cs @@ -0,0 +1,111 @@ +// +// Linker interfaces-related Tests +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2013 Xamarin Inc. All rights reserved. +// + +using System; +using System.Reflection; +using System.Runtime.InteropServices; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkAll.Interfaces { + + interface I { + void Foo (); + void Bar (); + } + + class A : I { + public void Foo () {} + public void Bar () {} + } + + class B : I { + public void Foo () {} + public void Bar () {} + } + + class UTF8Marshaler : ICustomMarshaler { + + public object MarshalNativeToManaged (IntPtr pNativeData) + { + return null; + } + + public IntPtr MarshalManagedToNative (object managedObject) + { + return IntPtr.Zero; + } + + public int GetNativeDataSize () + { + return 0; + } + + public void CleanUpManagedData (object managedObject) + { + } + + public void CleanUpNativeData (IntPtr pNativeData) + { + } + } + + [TestFixture] + [Preserve (AllMembers = true)] + public class InterfaceTest { + + static void F (I i) + { + i.Bar (); + } + + [Test] + public void Bug10866 () + { + var a = new A (); + a.Foo (); + a.Bar (); + F (new A ()); + + // Foo and Bar methods are both used on A and must be present + Assert.NotNull (typeof(A).GetMethod ("Foo", BindingFlags.Instance | BindingFlags.Public), "A::Foo"); + Assert.NotNull (typeof(A).GetMethod ("Bar", BindingFlags.Instance | BindingFlags.Public), "A::Bar"); + + // I::Foo is never used and can be removed + Assert.Null (typeof(I).GetMethod ("Foo", BindingFlags.Instance | BindingFlags.Public), "I::Foo"); + // I::Bar is used in F so everyone implementing I needs Bar + Assert.NotNull (typeof(I).GetMethod ("Bar", BindingFlags.Instance | BindingFlags.Public), "I::Bar"); + + // Foo and Bar are never used on B - so Foo can be removed + Assert.Null (typeof(B).GetMethod ("Foo", BindingFlags.Instance | BindingFlags.Public), "B::Foo"); + // but Bar cannot since B implements I + Assert.NotNull (typeof(B).GetMethod ("Bar", BindingFlags.Instance | BindingFlags.Public), "B::Bar"); + } + + [DllImport ("/usr/lib/system/libsystem_dnssd.dylib")] + public static extern int DNSServiceGetProperty ( + [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof (UTF8Marshaler))] string name, + IntPtr result, ref uint size); + + uint size; + + [Test] + public void Bug16485 () + { + if (size == 1) + DNSServiceGetProperty ("Xamarin", IntPtr.Zero, ref size); + // we don't want to call the function - we only want the AOT compiler to build the CustomMarshaler + Assert.That (size, Is.EqualTo (0), "size"); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link all/InternalsTest.cs b/tests/linker-ios/link all/InternalsTest.cs new file mode 100644 index 000000000000..daad43baf3ec --- /dev/null +++ b/tests/linker-ios/link all/InternalsTest.cs @@ -0,0 +1,93 @@ +// +// Link All Unit Tests for __Internal native functions +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2013 Xamarin Inc. All rights reserved. +// + +using System; +using System.Runtime.InteropServices; + +using MonoTouch; +#if XAMCORE_2_0 +using Foundation; +using ObjCRuntime; +#else +using MonoTouch.Foundation; +using MonoTouch.ObjCRuntime; +#endif +using NUnit.Framework; + +namespace LinkAll.InernalCalls { + + [TestFixture] + // we want the tests to be available because we use the linker + [Preserve (AllMembers = true)] + public class InternalsTest { + + [DllImport ("__Internal")] + extern static string xamarin_get_locale_country_code (); + + [Test] + public void RegionInfo_CountryCode () + { + Assert.IsNotNull (xamarin_get_locale_country_code (), "xamarin_get_locale_country_code"); + } + + [DllImport ("__Internal", CharSet=CharSet.Unicode)] + extern static void xamarin_log (string s); + + [Test] + public void Console_Log () + { + xamarin_log ("ascii"); + xamarin_log ("ЉЩщӃ"); + } + +#if !XAMCORE_2_0 + [Test] + public void MessagingApi () + { + Messaging.monotouch_IntPtr_objc_msgSend_IntPtr (IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); + } +#endif + + [DllImport ("__Internal")] + extern static IntPtr xamarin_timezone_get_names (ref int count); + + [Test] + public void TimeZone_Names () + { + int count = 0; + IntPtr array = xamarin_timezone_get_names (ref count); + Assert.That (count, Is.GreaterThan (400), "count"); + for (int i = 0, offset = 0; i < count; i++, offset += IntPtr.Size) { + IntPtr p = Marshal.ReadIntPtr (array, offset); + string s = Marshal.PtrToStringAnsi (p); + Assert.NotNull (s, i.ToString ()); + Marshal.FreeHGlobal (p); + } + Marshal.FreeHGlobal (array); + } + + [DllImport ("__Internal")] + extern static IntPtr xamarin_timezone_get_data (string name, ref int size); + + [Test] + public void TimeZone_Data () + { + int size = 0; + IntPtr data = xamarin_timezone_get_data (null, ref size); + Assert.That (data, Is.Not.EqualTo (IntPtr.Zero), "default"); + Assert.That (size, Is.GreaterThan (0), "default size"); + Marshal.FreeHGlobal (data); + + data = xamarin_timezone_get_data ("America/Montreal", ref size); + Assert.That (data, Is.Not.EqualTo (IntPtr.Zero), "Montreal"); + Assert.That (size, Is.GreaterThan (0), "Montreal size"); + Marshal.FreeHGlobal (data); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link all/LinkAllTest.cs b/tests/linker-ios/link all/LinkAllTest.cs new file mode 100644 index 000000000000..4e74e8ee8bc3 --- /dev/null +++ b/tests/linker-ios/link all/LinkAllTest.cs @@ -0,0 +1,539 @@ +// +// Link All [Regression] Tests +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2012-2016 Xamarin Inc. All rights reserved. +// + +using System; +using System.ComponentModel; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Security; +using System.Reflection; +using System.Security.Cryptography.X509Certificates; + +using MonoTouch; +#if XAMCORE_2_0 +using CoreGraphics; +using Foundation; +using ObjCRuntime; +#if !__WATCHOS__ +using StoreKit; +#endif +using UIKit; +#else +using MonoTouch.CoreGraphics; +using MonoTouch.Foundation; +using MonoTouch.ObjCRuntime; +using MonoTouch.StoreKit; +using MonoTouch.UIKit; +#endif +using NUnit.Framework; + +namespace LinkAll { + + // we DO NOT want the code to be "fully" available + public partial class NotPreserved { + + public byte One { + get; set; + } + + [DefaultValue (2)] + public int Two { + get; set; + } + } + + // nothing directly uses Parent + public class Parent { + // but the nested type is a subclass of NSObject and gets preserved (as it's not part of monotouch.dll) + public class Derived : NSObject { + [Export ("foo")] + public void Foo () {} + } + + public void UnusedMethod () {} + } + + [TestFixture] + // we want the tests to be available because we use the linker + [Preserve (AllMembers = true)] + public class LinkAllRegressionTest { +#if __IOS__ +#if XAMCORE_2_0 + public const string NamespacePrefix = ""; + public const string AssemblyName = "Xamarin.iOS"; +#else + public const string NamespacePrefix = "MonoTouch."; + public const string AssemblyName = "monotouch"; +#endif +#elif __TVOS__ + public const string NamespacePrefix = ""; + public const string AssemblyName = "Xamarin.TVOS"; +#elif __WATCHOS__ + public const string NamespacePrefix = ""; + public const string AssemblyName = "Xamarin.WatchOS"; +#else + #error Unknown platform +#endif + + class TypeAttribute : Attribute { + public TypeAttribute (Type type) {} + } + + [Type (null)] + public void NullTypeInAttribute () + { + // there's no need to execute this test. + // desk #68380. + } + + [Test] + public void GetterOnly () + { + // that ensure the getter is not linked away, + // which means the property will be available for MEF_3862 + NotPreserved np = new NotPreserved (); + Assert.That (np.Two, Is.EqualTo (0), "Two==0"); + PropertyInfo pi = typeof (NotPreserved).GetProperty ("Two"); + // check the *unused* setter absence from the application + Assert.NotNull (pi.GetGetMethod (), "getter"); + Assert.Null (pi.GetSetMethod (), "setter"); + } + + [Test] + public void SetterOnly () + { + // that ensure the setter is not linked away, + NotPreserved np = new NotPreserved (); + np.One = 1; + PropertyInfo pi = typeof (NotPreserved).GetProperty ("One"); + // check the *unused* setter absence from the application + Assert.Null (pi.GetGetMethod (), "getter"); + Assert.NotNull (pi.GetSetMethod (), "setter"); + } + + [Test] + public void MEF_3862 () + { + // note: avoiding using "typeof(DefaultValueAttribute)" in the code + // so the linker does not keep it just because of it + PropertyInfo pi = typeof (NotPreserved).GetProperty ("Two"); + object [] attrs = pi.GetCustomAttributes (false); + bool default_value = false; + foreach (var ca in attrs) { + if (ca.GetType ().Name == "DefaultValueAttribute") { + default_value = true; + break; + } + } + Assert.True (default_value, "DefaultValue"); + } + + class TestPolicy : ICertificatePolicy { + + const int RecoverableTrustFailure = 5; // SecTrustResult + + public TestPolicy () + { + CheckCount = 0; + } + + public int CheckCount { get; private set; } + + public bool CheckValidationResult (ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) + { + Assert.That (certificateProblem, Is.EqualTo (0), "certificateProblem"); + CheckCount++; + return true; + } + } + + static TestPolicy test_policy = new TestPolicy (); + + [Test] + public void TrustUsingOldPolicy () + { + // Three similar tests exists in dontlink, linkall and linksdk to test 3 different cases + // untrusted, custom ICertificatePolicy and ServerCertificateValidationCallback without + // having caching issues (in S.Net or the SSL handshake cache) + ICertificatePolicy old = ServicePointManager.CertificatePolicy; + try { + ServicePointManager.CertificatePolicy = test_policy; + WebClient wc = new WebClient (); + Assert.IsNotNull (wc.DownloadString ("https://wrench.internalx.com/Wrench/Login.aspx")); + // caching means it will be called at least for the first run, but it might not + // be called again in subsequent requests (unless it expires) + Assert.That (test_policy.CheckCount, Is.GreaterThan (0), "policy checked"); + } + finally { + ServicePointManager.CertificatePolicy = old; + } + } + + [Test] + public void DetectPlatform () + { +#if !__WATCHOS__ + // for (future) nunit[lite] platform detection - if this test fails then platform detection won't work + Assert.NotNull (Type.GetType (NamespacePrefix + "UIKit.UIApplicationDelegate, " + AssemblyName), "UIApplicationDelegate"); +#endif + // and you can trust the old trick with the linker + Assert.NotNull (Type.GetType ("Mono.Runtime"), "Mono.Runtime"); + } + + [Test] +#if !XAMCORE_2_0 + // internal (to be removed) in unified + [Since (9,9)] +#endif +#if !XAMCORE_3_0 + [Availability ()] + [iOS (9,9)] + [Mac (10, 99)] +#endif + [Introduced (PlatformName.None)] + [Deprecated (PlatformName.None)] + [Obsoleted (PlatformName.None)] + [Unavailable (PlatformName.None)] + [ThreadSafe] + public void RemovedAttributes () + { + const string prefix = NamespacePrefix; + const string suffix = ", " + AssemblyName; + + // since we're linking the attributes will NOT be available - even if they are used +#if !XAMCORE_3_0 + Assert.Null (Type.GetType (prefix + "ObjCRuntime.AvailabilityAttribute, " + suffix), "AvailabilityAttribute"); + Assert.Null (Type.GetType (prefix + "ObjCRuntime.iOSAttribute, " + suffix), "AvailabilityAttribute"); + Assert.Null (Type.GetType (prefix + "ObjCRuntime.AvailabilityAttribute, " + suffix), "AvailabilityAttribute"); + Assert.Null (Type.GetType (prefix + "ObjCRuntime.SinceAttribute, " + suffix), "SinceAttribute"); +#endif + Assert.Null (Type.GetType (prefix + "ObjCRuntime.IntroducedAttribute, " + suffix), "IntroducedAttribute"); + Assert.Null (Type.GetType (prefix + "ObjCRuntime.DeprecatedAttribute, " + suffix), "DeprecatedAttribute"); + Assert.Null (Type.GetType (prefix + "ObjCRuntime.ObsoletedAttribute, " + suffix), "ObsoletedAttribute"); + Assert.Null (Type.GetType (prefix + "ObjCRuntime.UnavailableAttribute, " + suffix), "UnavailableAttribute"); + Assert.Null (Type.GetType (prefix + "ObjCRuntime.ThreadSafeAttribute, " + suffix), "ThreadSafeAttribute"); + } + + [Test] + public void Assembly_Load () + { + Assembly mscorlib = Assembly.Load ("mscorlib.dll"); + Assert.NotNull (mscorlib, "mscorlib"); + + Assembly system = Assembly.Load ("System.dll"); + Assert.NotNull (system, "System"); + } + + [Test] + public void Assembly_LoadFile () + { + string filename = Path.GetFileName (GetType ().Assembly.Location); + try { + Assert.NotNull (Assembly.LoadFile (filename), "1"); + } + catch (FileNotFoundException) { + // 2nd chance since FAT 32/64 applications moved the assemblies (but that could prove an issue too) + filename = Path.Combine (IntPtr.Size == 4 ? ".monotouch-32" : ".monotouch-64", filename); + Assert.NotNull (Assembly.LoadFile (filename), "2"); + } + } + + [Test] + public void Assembly_LoadFrom () + { + string filename = Path.GetFileName (GetType ().Assembly.Location); + try { + Assert.NotNull (Assembly.LoadFrom (filename), "1"); + } + catch (FileNotFoundException) { + // 2nd chance since FAT 32/64 applications moved the assemblies (but that could prove an issue too) + filename = Path.Combine (IntPtr.Size == 4 ? ".monotouch-32" : ".monotouch-64", filename); + Assert.NotNull (Assembly.LoadFrom (filename), "2"); + } + } + + [Test] + public void Assembly_ReflectionOnlyLoadFrom () + { + string filename = Path.GetFileName (GetType ().Assembly.Location); + try { + Assert.NotNull (Assembly.ReflectionOnlyLoadFrom (filename), "1"); + } + catch (FileNotFoundException) { + // 2nd chance since FAT 32/64 applications moved the assemblies (but that could prove an issue too) + filename = Path.Combine (IntPtr.Size == 4 ? ".monotouch-32" : ".monotouch-64", filename); + Assert.NotNull (Assembly.ReflectionOnlyLoadFrom (filename), "2"); + } + } + + [Test] + public void SystemDataSqlClient () + { + // notes: + // * this test is mean to fail when building the application using a Community or Indie licenses + // * linksdk.app references System.Data (assembly) but not types in SqlClient namespace + using (var sc = new System.Data.SqlClient.SqlConnection ()) { + Assert.NotNull (sc); + } + } + +#if !__TVOS__ && !__WATCHOS__ + [Test] + public void Pasteboard_ImagesTest () + { + string file = Path.Combine (NSBundle.MainBundle.ResourcePath, "basn3p08.png"); + using (var dp = new CGDataProvider (file)) { + using (var cgimg = CGImage.FromPNG (dp, null, false, CGColorRenderingIntent.Default)) { + using (var img = new UIImage (cgimg)) { + UIPasteboard.General.Images = new UIImage[] { img }; + Assert.AreEqual (1, UIPasteboard.General.Images.Length, "a - length"); + + UIPasteboard.General.Images = new UIImage[] { img, img }; + Assert.AreEqual (2, UIPasteboard.General.Images.Length, "b - length"); + Assert.IsNotNull (UIPasteboard.General.Images [0], "b - nonnull[0]"); + Assert.IsNotNull (UIPasteboard.General.Images [1], "b - nonnull[0]"); + } + } + } + } +#endif // !__TVOS__ + + [Test] + public void UltimateBindings () + { + Assert.IsNotNull (Bindings.Test.UltimateMachine.SharedInstance, "SharedInstance"); + } + + #region bug 14456 + + [TypeConverter (typeof (TestEnumTypeConverter))] + public enum TestEnum { + One,Two + } + + [Preserve (AllMembers = true)] + public class TestEnumTypeConverter : System.ComponentModel.TypeConverter { + + public override object ConvertTo (ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) + { + return "hello"; + } + } + + [Test] + public void Bug14456 () + { + var tc = TypeDescriptor.GetConverter (typeof (TestEnum)); + // not using Is.TypeOf since it would give additional clue to the linker + Assert.That (tc.GetType ().Name, Is.EqualTo ("TestEnumTypeConverter"), "TestEnumTypeConverter"); + // notes: + // * without [Preserve (AllMembers = true)] -> MissingMethodException : Default constructor + // * without [TypeConverter (typeof (TestEnumTypeConverter))] -> EnumConverter + } + + #endregion + + [Test] + public void SingleEpsilon_Compare () + { + if (Runtime.Arch == Arch.DEVICE) + Assert.Ignore ("Known to fail on devices, see bug #15802"); + // works on some ARM CPU (e.g. iPhone5S) but not others (iPad4 or iPodTouch5) + Assert.That (Single.Epsilon, Is.Not.EqualTo (0f), "Epsilon"); + Assert.That (-Single.Epsilon, Is.Not.EqualTo (0f), "-Epsilon"); + } + + [Test] + public void SingleEpsilon_ToString () + { + if (Runtime.Arch == Arch.DEVICE) + Assert.Ignore ("Known to fail on devices, see bug #15802"); + var ci = CultureInfo.InvariantCulture; + Assert.That (Single.Epsilon.ToString (ci), Is.EqualTo ("1.401298E-45"), "Epsilon.ToString()"); + Assert.That ((-Single.Epsilon).ToString (ci), Is.EqualTo ("-1.401298E-45"), "-Epsilon.ToString()"); + } + + [Test] + public void DoubleEpsilon_Compare () + { + if (Runtime.Arch == Arch.DEVICE) + Assert.Ignore ("Known to fail on devices, see bug #15802"); + // works on some ARM CPU (e.g. iPhone5S) but not others (iPad4 or iPodTouch5) + Assert.That (Double.Epsilon, Is.Not.EqualTo (0f), "Epsilon"); + Assert.That (-Double.Epsilon, Is.Not.EqualTo (0f), "-Epsilon"); + } + + [Test] + public void DoubleEpsilon_ToString () + { + if (Runtime.Arch == Arch.DEVICE) + Assert.Ignore ("Known to fail on devices, see bug #15802"); + var ci = CultureInfo.InvariantCulture; + // note: unlike Single this works on both my iPhone5S and iPodTouch5 + Assert.That (Double.Epsilon.ToString (ci), Is.EqualTo ("4.94065645841247E-324"), "Epsilon.ToString()"); + Assert.That ((-Double.Epsilon).ToString (ci), Is.EqualTo ("-4.94065645841247E-324"), "-Epsilon.ToString()"); + } + + [Test] + public void AssemblyReferences_16213 () + { + foreach (var assembly in typeof (System.Data.AcceptRejectRule).Assembly.GetReferencedAssemblies ()) { + // Unlike the original bug report the unit tests uses Mono.Data.Tds so it will be part of the .app + // so we check for System.Transactions which is not used (but referenced by the original System.Data) + if (assembly.Name == "System.Transactions") + Assert.Fail ("System.Transactions reference should have removed by the linker"); + } + } + +#if !__WATCHOS__ + [Test] + public void OpenTk10_Preserved () + { + // that will bring OpenTK-1.0 into the .app + OpenTK.WindowState state = OpenTK.WindowState.Normal; + + var gl = Type.GetType ("OpenTK.Graphics.ES11.GL, OpenTK-1.0", false); + Assert.NotNull (gl, "ES11/GL"); + var core = Type.GetType ("OpenTK.Graphics.ES11.GL/Core, OpenTK-1.0", false); + Assert.NotNull (core, "ES11/Core"); + + gl = Type.GetType ("OpenTK.Graphics.ES20.GL, OpenTK-1.0", false); + Assert.NotNull (gl, "ES20/GL"); + core = Type.GetType ("OpenTK.Graphics.ES20.GL/Core, OpenTK-1.0", false); + Assert.NotNull (core, "ES20/Core"); + } +#endif // !__WATCHOS__ + + [Test] + public void NestedNSObject () + { + // Parent type is not used - but it's not linked out + var p = Type.GetType ("LinkAll.Parent"); + Assert.NotNull (p, "Parent"); + // because a nested type is a subclass of NSObject (and not part of monotouch.dll) + var n = p.GetNestedType ("Derived"); + Assert.NotNull (n, "Derived"); + // however other stuff in Parent, like unused methods, will be removed + Assert.Null (p.GetMethod ("UnusedMethod"), "unused method"); + // while exported stuff will be present + Assert.NotNull (n.GetMethod ("Foo"), "unused Export method"); + } + + [Test] + public void Bug20363 () + { + // testing compile time error + CancelEventArgs cea = new CancelEventArgs (); + Assert.NotNull (cea, "CancelEventArgs"); + } + + string GetField (object o, string s) + { + var f = o.GetType ().GetField (s, BindingFlags.Instance | BindingFlags.NonPublic); + if (f == null) + return s; + //Console.WriteLine (f.GetValue (o)); + return null; + } + + string FromPattern (string pattern, object o) + { + var s = GetField (o, ""); + if (s != null) + return s; + s = GetField (o, ""); + if (s != null) + return s; + return GetField (o, ""); + } + + [Test] + public void AnonymousType () + { + var result = FromPattern ("/{action}/{id}.{contentType}", new { + action = "foo", + id = 1234, + contentType = "xml" + }); + Assert.Null (result, result); + } + +#if !__WATCHOS__ + [Test] + public void Events () + { + using (var pr = new SKProductsRequest ()) { + Assert.Null (pr.WeakDelegate, "none"); + // event on SKProductsRequest itself + pr.ReceivedResponse += (object sender, SKProductsRequestResponseEventArgs e) => {}; + + var t = pr.WeakDelegate.GetType (); + Assert.That (t.Name, Is.EqualTo ("_SKProductsRequestDelegate"), "delegate"); + + var fi = t.GetField ("receivedResponse", BindingFlags.NonPublic | BindingFlags.Instance); + Assert.NotNull (fi, "receivedResponse"); + var value = fi.GetValue (pr.WeakDelegate); + Assert.NotNull (value, "value"); + +#if XAMCORE_2_0 + // and on the SKRequest defined one + pr.RequestFailed += (object sender, SKRequestErrorEventArgs e) => {}; + // and the existing (initial field) is still set + fi = t.GetField ("receivedResponse", BindingFlags.NonPublic | BindingFlags.Instance); + Assert.NotNull (fi, "receivedResponse/SKRequest"); +#else + // In Classic SKRequest also defines a RequestFailed event, so make sure we get the SKRequest one + // that's because event are re-defined (new) in classic + ((SKRequest) pr).RequestFailed += (object sender, SKRequestErrorEventArgs e) => {}; + + t = pr.WeakDelegate.GetType (); + Assert.That (t.Name, Is.EqualTo ("_SKRequestDelegate"), "delegate-2"); + + fi = t.GetField ("receivedResponse", BindingFlags.NonPublic | BindingFlags.Instance); + Assert.Null (fi, "receivedResponse/SKRequest"); +#endif + } + } +#endif // !__WATCHOS__ + + [Test] + public void Aot_27116 () + { + var nix = (from nic in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces () + where nic.Id.StartsWith ("en") || nic.Id.StartsWith ("pdp_ip") select nic); + Assert.NotNull (nix); + } + + [Test] + public void TlsProvider_Legacy () + { + var provider = Mono.Security.Interface.MonoTlsProviderFactory.GetProvider (); + Assert.NotNull (provider, "provider"); + Assert.That (provider.ID, Is.EqualTo (new Guid ("97d31751-d0b3-4707-99f7-a6456b972a19")), "correct provider"); + } + + [Test] + public void OldTlsProvider_Selected () + { + // make test work for classic (monotouch) and unified (iOS, tvOS and watchOS) + var fqn = typeof (NSObject).AssemblyQualifiedName.Replace ("Foundation.NSObject", "Security.Tls.OldTlsProvider"); + Assert.NotNull (Type.GetType (fqn), "Should be included"); + } + + [Test] + public void AppleTls_OptOut () + { + // make test work for classic (monotouch) and unified (iOS, tvOS and watchOS) + var fqn = typeof (NSObject).AssemblyQualifiedName.Replace ("Foundation.NSObject", "Security.Tls.AppleTlsProvider"); + Assert.Null (Type.GetType (fqn), "Should not be included"); + } + } +} diff --git a/tests/linker-ios/link all/LinqExpressionTest.cs b/tests/linker-ios/link all/LinqExpressionTest.cs new file mode 100644 index 000000000000..f0862601993a --- /dev/null +++ b/tests/linker-ios/link all/LinqExpressionTest.cs @@ -0,0 +1,33 @@ +using System; +using System.Linq.Expressions; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkAll.Linq { + + [TestFixture] + // we want the tests to be available because we use the linker + [Preserve (AllMembers = true)] + public class LinqExpressionTest { + + // Normally this test would have been included in linksdk.app - but there's already + // some code that (indirectly) includes the code we want to test (so it can't fail) + + delegate object Bug14863Delegate (); + + [Test] + public void Expression_T_Ctor () + { + var ctor = typeof (LinqExpressionTest).GetConstructor (Type.EmptyTypes); + var expr = Expression.New (ctor, new Expression [0]); + Assert.NotNull (Expression.Lambda (typeof(Bug14863Delegate), expr, null), "Lambda"); + // note: reflection is used to create an instance of Expression using an internal ctor + // it can be indirectly "preserved" by other code (in Expression) but it can fail in other cases + // ref: https://bugzilla.xamarin.com/show_bug.cgi?id=14863 + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link all/MEFTests.cs b/tests/linker-ios/link all/MEFTests.cs new file mode 100644 index 000000000000..190b093eaca7 --- /dev/null +++ b/tests/linker-ios/link all/MEFTests.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.ComponentModel.Composition.Hosting; +using System.Linq; +using System.Reflection; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkAll.Mef { + + // From Desk Case 70807 + public interface IStorageType + { + } + + [System.ComponentModel.Composition.Export(typeof (IStorageType))] + [Preserve (AllMembers = true)] + public class Storage : IStorageType + { + } + + [Preserve (AllMembers = true)] + [TestFixture] + public class MEFTests + { + CompositionContainer _container; + + [ImportMany] + public IEnumerable> StorageTypes { get; set; } + + [Test] + public void MEF_Basic_Import_Test () + { + var catalog = new AggregateCatalog (); + //Adds all the parts found in the same assembly as the Program class + catalog.Catalogs.Add (new AssemblyCatalog (typeof (Application).Assembly)); + + //Create the CompositionContainer with the parts in the catalog + _container = new CompositionContainer (catalog); + + this._container.SatisfyImportsOnce (this); + + Assert.IsTrue (StorageTypes.Count () > 0, "No MEF imports found?"); + } + + [Test] + public void ExportFactoryCreator () + { + // the above code makes sure that ExportFactoryCreator is present + var efc = Type.GetType ("System.ComponentModel.Composition.ReflectionModel.ExportFactoryCreator, System.ComponentModel.Composition"); + Assert.NotNull (efc, "ExportFactoryCreator"); + + // and there's nothing else that refers to them - hence bug: https://bugzilla.xamarin.com/show_bug.cgi?id=29063 + // as it's used thru reflection in CreateStronglyTypedExportFactoryFactory + var t = efc.GetMethod ("CreateStronglyTypedExportFactoryOfT", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); // same binding flags as MS code + Assert.NotNull (t, "CreateStronglyTypedExportFactoryOfT"); + var tm = efc.GetMethod ("CreateStronglyTypedExportFactoryOfTM", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); // same binding flags as MS code + Assert.NotNull (tm, "CreateStronglyTypedExportFactoryOfTM"); + } + + [Test] + public void ExportServices () + { + var es = Type.GetType ("System.ComponentModel.Composition.ExportServices, System.ComponentModel.Composition"); + Assert.NotNull (es, "ExportServices"); + // unlike the test code for ExportFactoryCreator the method can be marked by other call site, so this test is not 100% conclusive + + // used, thru reflection, from CreateStronglyTypedLazyFactory method + var t = es.GetMethod ("CreateStronglyTypedLazyOfT", BindingFlags.NonPublic | BindingFlags.Static); // same binding flags as MS code + Assert.NotNull (t, "CreateStronglyTypedLazyOfT"); + var tm = es.GetMethod ("CreateStronglyTypedLazyOfTM", BindingFlags.NonPublic | BindingFlags.Static); // same binding flags as MS code + Assert.NotNull (tm, "CreateStronglyTypedLazyOfTM"); + + // used, thru reflection, from CreateSemiStronglyTypedLazyFactory method + var l = es.GetMethod ("CreateSemiStronglyTypedLazy", BindingFlags.NonPublic | BindingFlags.Static); // same binding flags as MS code + Assert.NotNull (l, "CreateSemiStronglyTypedLazy"); + } + } +} diff --git a/tests/linker-ios/link all/Main.cs b/tests/linker-ios/link all/Main.cs new file mode 100644 index 000000000000..c9b0815dd93e --- /dev/null +++ b/tests/linker-ios/link all/Main.cs @@ -0,0 +1,23 @@ +using System; + +#if XAMCORE_2_0 +using UIKit; +#else +using MonoTouch.UIKit; +#endif + +namespace LinkAll +{ + public class Application + { +#if !__WATCHOS__ + // This is the main entry point of the application. + static void Main (string[] args) + { + // if you want to use a different Application Delegate class from "AppDelegate" + // you can specify it here. + UIApplication.Main (args, null, "AppDelegate"); + } +#endif // !__WATCHOS__ + } +} diff --git a/tests/linker-ios/link all/PreserveTest.cs b/tests/linker-ios/link all/PreserveTest.cs new file mode 100644 index 000000000000..f83addf0961f --- /dev/null +++ b/tests/linker-ios/link all/PreserveTest.cs @@ -0,0 +1,168 @@ +// +// Preserve tests +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2013-2016 Xamarin Inc. All rights reserved. +// + +using System; +using System.Reflection; +#if XAMCORE_2_0 +using Foundation; +using ObjCRuntime; +#else +using MonoTouch.Foundation; +using MonoTouch.ObjCRuntime; +#endif +using NUnit.Framework; + +// this will preserve the specified type (only) +[assembly: Preserve (typeof (LinkAll.Attributes.TypeWithoutMembers))] + +// this will preserve the specified type with all it's members +[assembly: Preserve (typeof (LinkAll.Attributes.TypeWithMembers), AllMembers = true)] + +// as the preserved field is an attribute this means that [Obfuscation] becomes like [Preserve] +// IOW preserving the attribute does not do much good if what it decorates gets removed +[assembly: Preserve (typeof (ObfuscationAttribute))] + +namespace LinkAll.Attributes { + + // type and members preserved by assembly-level attribute above + class TypeWithMembers { + + public string Present { get; set; } + } + + // type (only, not members) preserved by assembly-level attribute above + class TypeWithoutMembers { + + public string Absent { get; set; } + } + + class MemberWithCustomAttribute { + + // since [Obfuscation] was manually preserved then we'll preserve everything that's decorated with the attribute + [Obfuscation] + public string Custom { get; set; } + } + + [TestFixture] + // we want the tests to be available because we use the linker + [Preserve (AllMembers = true)] + public class PreserveTest { + +#if DEBUG + const bool Debug = true; +#else + const bool Debug = false; +#endif +#if XAMCORE_2_0 + const string NamespacePrefix = ""; + string AssemblyName = typeof (NSObject).Assembly.ToString (); +#else + const string NamespacePrefix = "MonoTouch."; + const string AssemblyName = "monotouch"; +#endif + + [Test] + public void PreserveTypeWithMembers () + { + var t = Type.GetType ("LinkAll.Attributes.TypeWithMembers"); + // both type and members are preserved + Assert.NotNull (t, "type"); + Assert.NotNull (t.GetProperty ("Present"), "members"); + } + + [Test] + public void PreserveTypeWithoutMembers () + { + var t = Type.GetType ("LinkAll.Attributes.TypeWithoutMembers"); + // type is preserved + Assert.NotNull (t, "type"); + // but we did not ask the linker to preserve it's members + Assert.Null (t.GetProperty ("Absent"), "members"); + } + + [Test] + public void PreserveTypeWithCustomAttribute () + { + var t = Type.GetType ("LinkAll.Attributes.MemberWithCustomAttribute"); + // both type and members are preserved - in this case the type is preserved because it's member was + Assert.NotNull (t, "type"); + // and that member was preserved because it's decorated with a preserved attribute + Assert.NotNull (t.GetProperty ("Custom"), "members"); + } + + [Test] + public void Class_LookupFullName () + { + var klass = Type.GetType (NamespacePrefix + "ObjCRuntime.Class, " + AssemblyName); + Assert.NotNull (klass, "Class"); + // only required (and preserved) for debug builds + var method = klass.GetMethod ("LookupFullName", BindingFlags.NonPublic | BindingFlags.Static); + // note: since iOS/runtime unification this is being called by ObjCRuntime.Runtime.LookupManagedTypeName + // and will never be removed (even on Release builds) + Assert.NotNull (method, "LookupFullName"); + } + + [Test] + public void Runtime_RegisterEntryAssembly () + { + var klass = Type.GetType (NamespacePrefix + "ObjCRuntime.Runtime, " + AssemblyName); + Assert.NotNull (klass, "Runtime"); + // RegisterEntryAssembly is only needed for the simulator (not on devices) so it's only preserved for sim builds + var method = klass.GetMethod ("RegisterEntryAssembly", BindingFlags.NonPublic | BindingFlags.Static, null, new [] { typeof (Assembly) }, null); + Assert.That (method == null, Is.EqualTo (Runtime.Arch == Arch.DEVICE), "RegisterEntryAssembly"); + } + + [Test] + public void MonoTouchException_Unconditional () + { + var klass = Type.GetType (NamespacePrefix + "Foundation.MonoTouchException, " + AssemblyName); + Assert.NotNull (klass, "MonoTouchException"); + } + + [Test] + public void Class_Unconditional () + { + var klass = Type.GetType (NamespacePrefix + "ObjCRuntime.Class, " + AssemblyName); + Assert.NotNull (klass, "Class"); + // handle is unconditionally preserved + var field = klass.GetField ("handle", BindingFlags.NonPublic | BindingFlags.Instance); + Assert.NotNull (field, "handle"); + } + + [Test] + public void Runtime_Unconditional () + { + var klass = Type.GetType (NamespacePrefix + "ObjCRuntime.Runtime, " + AssemblyName); + Assert.NotNull (klass, "Runtime"); + // Initialize, RegisterAssembly... are unconditionally preserved + var method = klass.GetMethod ("Initialize", BindingFlags.NonPublic | BindingFlags.Static); + Assert.NotNull (method, "Initialize"); + method = klass.GetMethod ("RegisterAssembly", BindingFlags.Public | BindingFlags.Static); + Assert.NotNull (method, "RegisterAssembly"); + method = klass.GetMethod ("RegisterNSObject", BindingFlags.NonPublic | BindingFlags.Static, null, new Type[] { typeof (NSObject), typeof (IntPtr) }, null); + Assert.NotNull (method, "RegisterNSObject"); + method = klass.GetMethod ("GetBlockWrapperCreator", BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic, null, new Type[] { typeof (MethodInfo), typeof (int) }, null); + Assert.NotNull (method, "GetBlockWrapperCreator"); + method = klass.GetMethod ("CreateBlockProxy", BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic, null, new Type[] { typeof (MethodInfo), typeof (IntPtr) }, null); + Assert.NotNull (method, "CreateBlockProxy"); + } + + [Test] + public void Selector_Unconditional () + { + var klass = Type.GetType (NamespacePrefix + "ObjCRuntime.Selector, " + AssemblyName); + Assert.NotNull (klass, "Selector"); + // handle and is unconditionally preserved + var field = klass.GetField ("handle", BindingFlags.NonPublic | BindingFlags.Instance); + Assert.NotNull (field, "handle"); + var method = klass.GetMethod ("GetHandle", BindingFlags.Public | BindingFlags.Static); + Assert.NotNull (method, "GetHandle"); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link all/SealerTest.cs b/tests/linker-ios/link all/SealerTest.cs new file mode 100644 index 000000000000..d6dab5737d3d --- /dev/null +++ b/tests/linker-ios/link all/SealerTest.cs @@ -0,0 +1,71 @@ +// Copyright 2016 Xamarin Inc. All rights reserved. + +using System; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace Linker.Sealer { + + [Preserve (AllMembers = true)] + public class Unsealable { + + public virtual bool A () { return true; } + public virtual bool B () { return false; } + } + + [Preserve (AllMembers = true)] + public class Sealable : Unsealable { + public override bool B () { return true; } + } + + [TestFixture] + [Preserve (AllMembers = true)] + public class SealerTest { + + [Test] + public void Sealed () + { + // this can not be optimized into a sealed type + Assert.False (typeof (Unsealable).IsSealed, "Unsealed"); +#if DEBUG + // this is not a sealed type (in the source) + Assert.False (typeof (Sealable).IsSealed, "Sealed"); +#else + // but it can be optimized / sealed as nothing else is (or can) subclass it + Assert.True (typeof (Sealable).IsSealed, "Sealed"); +#endif + } + + [Test] + public void Final () + { + var t = typeof (Sealable); +#if DEBUG + // this is not a sealed method (in the source) + Assert.False (t.GetMethod ("B").IsFinal, "Not Final"); +#else + // but it can be optimized / sealed as nothing else is (or can) overrides it + Assert.True (t.GetMethod ("B").IsFinal, "Final"); +#endif + } + + [Test] + public void Virtual () + { + var t = typeof (Sealable); +#if DEBUG + // both methods are virtual (iin the source) + Assert.True (t.GetMethod ("A").IsVirtual, "A"); + Assert.True (t.GetMethod ("B").IsVirtual, "B"); +#else + // but A can be de-virtualized as it overrides nothing and is not overridden + Assert.False (t.GetMethod ("A").IsVirtual, "A"); + Assert.True (t.GetMethod ("B").IsVirtual, "B"); +#endif + } + } +} diff --git a/tests/linker-ios/link all/SerializationTest.cs b/tests/linker-ios/link all/SerializationTest.cs new file mode 100644 index 000000000000..5f2315367103 --- /dev/null +++ b/tests/linker-ios/link all/SerializationTest.cs @@ -0,0 +1,96 @@ +// +// Link All [Regression] Tests for Serialization +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2016 Xamarin Inc. All rights reserved. +// + +using System; +using System.Runtime.Serialization; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkAll.Serialization { + + [Serializable] + public class Unused { + + [OnDeserializing] + void Deserializing () + { + } + + [OnDeserialized] + void Deserialized () + { + } + + [OnSerializing] + void Serializing () + { + } + + [OnSerialized] + void Serialized () + { + } + } + + [Serializable] + public class Used { + + [OnDeserializing] + void Deserializing () + { + } + + [OnDeserialized] + void Deserialized () + { + } + + [OnSerializing] + void Serializing () + { + } + + [OnSerialized] + void Serialized () + { + } + } + + [TestFixture] + // we want the tests to be available because we use the linker + [Preserve (AllMembers = true)] + public class SerializationAttributeTests { + + [Test] + public void UnusedType () + { + // the serialization attributes only keeps the method(s) if the type was used + var t = Type.GetType ("LinkAll.Serialization.Unused"); + // since it's not used in the app then it's removed by the linker + Assert.Null (t, "type"); + } + + [Test] + public void UsedType () + { + // the serialization attributes only keeps the method(s) if the type was used + var t = Type.GetType ("LinkAll.Serialization.Used"); + // since it's used here... + Assert.NotNull (new Used (), "reference"); + // it's not removed by the linker + Assert.NotNull (t, "type"); + // and since it's not the 4 decorated methods are also kept (even if uncalled) + Assert.That (t.GetMethods ().Length, Is.EqualTo (4), "4"); + } + } +} diff --git a/tests/linker-ios/link all/StructLayoutTest.cs b/tests/linker-ios/link all/StructLayoutTest.cs new file mode 100644 index 000000000000..2ef9634b7149 --- /dev/null +++ b/tests/linker-ios/link all/StructLayoutTest.cs @@ -0,0 +1,113 @@ +// +// Link All [Regression] Tests +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2012 Xamarin Inc. All rights reserved. +// + +using System; +using System.Runtime.InteropServices; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkAll.Layout { + + struct DefaultStruct { + public int never_used; + public int used; + } + + [StructLayout (LayoutKind.Auto)] + struct AutoStruct { + public int never_used; + public int used; + } + + [StructLayout (LayoutKind.Sequential)] + struct SequentialStruct { + public int never_used; + public int used; + } + + [StructLayout (LayoutKind.Explicit)] + struct ExplicitStruct { + [FieldOffset (0)] + public int never_used; + [FieldOffset (4)] + public int used; + [FieldOffset (8)] + public int never_ever_used; + } + + [TestFixture] + // we want the tests to be available because we use the linker + [Preserve (AllMembers = true)] + public class StructLayoutTest { + + [Test] + public void DefaultLayoutStruct () // sequential + { + DefaultStruct c = new DefaultStruct (); + c.used = 1; + Assert.That (Marshal.SizeOf (c), Is.EqualTo (8), "2 fields"); + var t = typeof (DefaultStruct); + var fields = t.GetFields (); + Assert.That (fields.Length, Is.EqualTo (2), "Length"); + + Assert.False (t.IsAutoLayout, "IsAutoLayout"); + Assert.False (t.IsExplicitLayout, "IsExplicitLayout"); + Assert.True (t.IsLayoutSequential, "IsLayoutSequential"); + } + + [Test] + public void AutoLayoutStruct () + { + AutoStruct c = new AutoStruct (); + c.used = 1; + // can't ask SizeOf on Auto + var t = typeof (AutoStruct); + var fields = t.GetFields (); + Assert.That (fields.Length, Is.EqualTo (2), "Length"); + + Assert.True (t.IsAutoLayout, "IsAutoLayout"); + Assert.False (t.IsExplicitLayout, "IsExplicitLayout"); + Assert.False (t.IsLayoutSequential, "IsLayoutSequential"); + } + + [Test] + public void LayoutSequential () + { + SequentialStruct c = new SequentialStruct (); + c.used = 1; + Assert.That (Marshal.SizeOf (c), Is.EqualTo (8), "2 fields"); + var t = typeof (SequentialStruct); + var fields = t.GetFields (); + Assert.That (fields.Length, Is.EqualTo (2), "Length"); + + Assert.False (t.IsAutoLayout, "IsAutoLayout"); + Assert.False (t.IsExplicitLayout, "IsExplicitLayout"); + Assert.True (t.IsLayoutSequential, "IsLayoutSequential"); + } + + [Test] + public void ExplicitLayout () + { + ExplicitStruct c = new ExplicitStruct (); + c.used = 1; + Assert.That (Marshal.SizeOf (c), Is.GreaterThanOrEqualTo (12), "3 fields"); + var t = typeof (ExplicitStruct); + var fields = t.GetFields (); + Assert.That (fields.Length, Is.EqualTo (3), "Length"); + + Assert.False (t.IsAutoLayout, "IsAutoLayout"); + Assert.True (t.IsExplicitLayout, "IsExplicitLayout"); + Assert.False (t.IsLayoutSequential, "IsLayoutSequential"); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link all/XmlSerializationTest.cs b/tests/linker-ios/link all/XmlSerializationTest.cs new file mode 100644 index 000000000000..34da3861a1d4 --- /dev/null +++ b/tests/linker-ios/link all/XmlSerializationTest.cs @@ -0,0 +1,79 @@ +// +// Link All Xml Serialization Tests +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2012 Xamarin Inc. All rights reserved. +// + +using System; +using System.IO; +using System.Xml; +using System.Xml.Serialization; + +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif + +using NUnit.Framework; + +namespace LinkAll.Serialization.Xml { + + [Serializable] + [XmlRoot ("rsp", IsNullable = false)] + public class XmlResult { + [XmlAttribute ("stat")] + public int StatusCode { get; set; } + + [XmlElement ("photos")] + [XmlElement ("photosets")] + public T Result { get; set; } + } + + [Serializable] + [XmlRoot ("rsp")] + public class XmlField { + [XmlElement ("photos")] + [XmlElement ("photosets")] + public T Result; + } + + [TestFixture] + // we want the tests to be available because we use the linker + [Preserve (AllMembers = true)] + public class XmlSerializationTest { + + [Test] + public void GenericProperty_Bug5543 () + { + XmlResult r = new XmlResult (); + r.Result = "5543"; + r.StatusCode = 10; + + var serializer = new XmlSerializer (typeof (XmlResult)); + using (var ms = new MemoryStream ()) { + serializer.Serialize (ms, r); + r.Result = String.Empty; + r.StatusCode = -1; + + ms.Position = 0; + XmlResult back = (XmlResult) serializer.Deserialize (ms); + + Assert.That (back.Result, Is.EqualTo ("5543"), "Result"); + Assert.That (back.StatusCode, Is.EqualTo (10), "StatusCode"); + } + } + + [Test] + public void GenericField () + { + XmlField f = new XmlField (); + f.Result = "5543"; + // not valid for serialization but the linker should not have issue with that + } + } +} + diff --git a/tests/linker-ios/link all/link all.csproj b/tests/linker-ios/link all/link all.csproj new file mode 100644 index 000000000000..6178f1bb5df3 --- /dev/null +++ b/tests/linker-ios/link all/link all.csproj @@ -0,0 +1,123 @@ + + + + Debug + iPhoneSimulator + 8.0.30703 + 2.0 + {370CC763-EDC3-41DA-A21A-D4C82CABEFE4} + {6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Exe + linkall + link all + MonoTouch + + + True + full + False + bin\iPhoneSimulator\Debug + DEBUG;LINKALL; + prompt + 4 + False + True + Full + mideast,other + --registrar=static --tls-provider=legacy + i386 + + + none + False + bin\iPhoneSimulator\Release + prompt + 4 + False + Full + mideast,other + i386 + LINKALL; + --tls-provider=legacy + + + True + full + False + bin\iPhone\Debug + DEBUG;LINKALL; + prompt + 4 + False + iPhone Developer + True + Full + mideast,other + ARMv7 + --tls-provider=legacy -gcc_flags="-UhoItsB0rken" + + + none + False + bin\iPhone\Release + prompt + 4 + False + iPhone Developer + Full + mideast,other + True + ARMv7 + -v -v -v -v --tls-provider=legacy + LINKALL; + + + + + + + + + + + + + + + + + + + + + + + + + + + OptimizeGeneratedCodeTest.cs + + + + + + + + + ReflectionTest.cs + + + + + + {FE6EDEE9-ADF6-4F42-BCF2-B68C0A44EC3D} + BundledResources + + + {D6667423-EDD8-4B50-9D98-1AC5D8A8A4EA} + bindings-test + + + + \ No newline at end of file diff --git a/tests/linker-ios/link sdk/AotBugs.cs b/tests/linker-ios/link sdk/AotBugs.cs new file mode 100644 index 000000000000..b6324bef4518 --- /dev/null +++ b/tests/linker-ios/link sdk/AotBugs.cs @@ -0,0 +1,620 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Collections.ObjectModel; +#if !__WATCHOS__ +using System.Drawing; +#endif +using System.Linq; +using System.Threading.Tasks; +using System.Runtime.CompilerServices; +#if XAMCORE_2_0 +using CoreGraphics; +using Foundation; +using ObjCRuntime; +#else +using MonoTouch.CoreGraphics; +using MonoTouch.Foundation; +using MonoTouch.ObjCRuntime; +#endif + +#if XAMCORE_2_0 +using RectangleF=CoreGraphics.CGRect; +using SizeF=CoreGraphics.CGSize; +using PointF=CoreGraphics.CGPoint; +#else +using nfloat=global::System.Single; +using nint=global::System.Int32; +using nuint=global::System.UInt32; +#endif + +using NUnit.Framework; + +namespace LinkSdk.Aot { + + static class AotExtension { + + // https://bugzilla.xamarin.com/show_bug.cgi?id=3285 + public static IEnumerable GetInterfaces(this Type type, Type interfaceType) + { + Type[] interfaces = type.GetInterfaces(); + foreach (Type t in interfaces) { + Type typeToCheck = t; + if (t.IsGenericType) + typeToCheck = t.GetGenericTypeDefinition(); + if (typeToCheck == interfaceType) + yield return t; + } + yield break; + } + } + + interface IAotTest { + } + + [TestFixture] + // already done in Bug2096Test.cs -> [Preserve (AllMembers = true)] + public partial class AotBugsTest : IAotTest { + + // https://bugzilla.xamarin.com/show_bug.cgi?id=3285 + [Test] + public void Aot_3285 () + { + // called as an extension method (always worked) + Assert.False (GetType ().GetInterfaces (typeof (IExpectException)).Select (interf => interf != null).FirstOrDefault (), "false"); + + // workaround for #3285 - similar to previous fix for monotouch/aot + // called as a static method (does not change the result - but it was closer to the original test case) + Assert.True (AotExtension.GetInterfaces (GetType (), typeof (IAotTest)).Select (interf => interf != null).FirstOrDefault (delegate { return true; }), "delegate"); + + // actual, failing, test case (fixed by inlining code) + Assert.True (GetType ().GetInterfaces (typeof (IAotTest)).Select (interf => interf != null).FirstOrDefault (), "FirstOrDefault/true"); + + // other similar cases (returning bool with optional predicate delegate) + var enumerable = GetType ().GetInterfaces (typeof (IAotTest)).Select (interf => interf != null); + Assert.True (enumerable.Any (), "Any"); + Assert.True (enumerable.ElementAt (0), "ElementAt"); + Assert.True (enumerable.ElementAtOrDefault (0), "ElementAtOrDefault"); + Assert.True (enumerable.First (), "First"); + Assert.True (enumerable.Last (), "Last"); // failed before fix + Assert.True (enumerable.LastOrDefault (), "LastOrDefault"); // failed before fix + Assert.True (enumerable.Max (), "Max"); + Assert.True (enumerable.Min (), "Min"); + Assert.True (enumerable.Single (), "Single"); // failed before fix + Assert.True (enumerable.SingleOrDefault (), "SingleOrDefault"); // failed before fix + } + + [Test] + // https://bugzilla.xamarin.com/show_bug.cgi?id=3444 + public void ConcurrentDictionary_3444 () + { + // note: similar, but simpler, than the original bug report (same exception) + var cd = new ConcurrentDictionary (); + } + + class SomeObject { + public event EventHandler Event; + + public void RaiseEvent () + { + var fn = this.Event; + if (fn != null) + fn (this, EventArgs.Empty); + } + } + + void OnEvent (object sender, EventArgs e) + { + } + + [Test] + public void EventInfo_3682 () + { + var so = new SomeObject (); + + var e = so.GetType ().GetEvent ("Event"); + if (e != null) + e.AddEventHandler (so, new EventHandler (OnEvent)); + } + + [Test] + public void Workaround_3682 () + { + var so = new SomeObject (); + var e = so.GetType ().GetEvent ("Event"); + if (e != null) { + var add = e.GetAddMethod (); + add.Invoke (so, new object[] { new EventHandler(OnEvent) }); + } + } + + class Counseling { + public int FK_PERSON; + + public Counseling (int i) + { + FK_PERSON = i; + } + } + + class PersonDetail { + public int Id; + + public PersonDetail (int i) + { + Id = i; + } + } + + class CounselingWithPerson { + public Counseling Counseling { get; private set; } + public PersonDetail PersonDetail { get; private set; } + + public CounselingWithPerson (Counseling c, PersonDetail p) + { + Counseling = c; + PersonDetail = p; + } + } + + [Test] + public void Linq_Join_3627 () + { + List c = new List () { + new Counseling (1) + }; + List p = new List () { + new PersonDetail (1) + }; + var query = (from wqual in c + join personTable in p on wqual.FK_PERSON equals personTable.Id + select new CounselingWithPerson (wqual, personTable)); + Assert.NotNull (query.ToList ()); + // above throws ExecutionEngineException + } + + public void Workaround_3627 () + { + List c = new List () { + new Counseling (1) + }; + List p = new List () { + new PersonDetail (1) + }; + var query = (from wqual in c + join personTable in p on wqual.FK_PERSON.ToString () equals personTable.Id.ToString () + select new CounselingWithPerson (wqual, personTable)); + Assert.NotNull (query.ToList ()); + } + + public class Foo { + public int Id { get; set; } + public string Name { get; set; } + } + + [Test] + public void Linq () + { + var list = new List(); + list.Add (new Foo { Id = 3, Name="def"}); + list.Add (new Foo { Id = 2, Name="def"}); + list.Add (new Foo { Id = 1, Name="ggg"}); + var x = from l in list orderby l.Name, l.Id select l; + Assert.That (x.Count (), Is.EqualTo (3), "Count"); + // above throws ExecutionEngineException + } + + [Test] + public void Linq_Workaround () + { + var list = new List(); + list.Add (new Foo { Id = 3, Name="def"}); + list.Add (new Foo { Id = 2, Name="def"}); + list.Add (new Foo { Id = 1, Name="ggg"}); + var x = from l in list orderby l.Name, l.Id.ToString () descending select l; + } + + [Test] + public void SortDescending_3114 () + { + List list = new List () { + DateTime.Now, + DateTime.UtcNow + }; + var result = from datetime in list orderby datetime.Date, datetime.TimeOfDay descending select datetime; + // above throws ExecutionEngineException + // Attempting to JIT compile method 'System.Linq.OrderedEnumerable`1:CreateOrderedEnumerable (System.Func`2,System.Collections.Generic.IComparer`1,bool)' while running with --aot-only. + // .ToString hack does not help in this case :( so it looks even worse + } + + [Test] + public void Workaround_3114 () + { + List list = new List () { + DateTime.Now, + DateTime.UtcNow + }; + var result = from datetime in list orderby ((DateTime) datetime).Date.ToString (), ((DateTime) datetime).TimeOfDay.ToString () descending select (DateTime) datetime; + // Attempting to JIT compile method 'System.Linq.OrderedEnumerable`1:CreateOrderedEnumerable (System.Func`2,System.Collections.Generic.IComparer`1,bool)' while running with --aot-only. + Assert.That (result.Count (), Is.EqualTo (2), "Count"); + } + + [Test] + public void Any_3735 () + { + var array = new Environment.SpecialFolder [] { + Environment.SpecialFolder.ApplicationData, + Environment.SpecialFolder.CommonApplicationData + }; + Assert.True (array.Any (folder => folder == Environment.SpecialFolder.ApplicationData)); + // above throws ExecutionEngineException + // Attempting to JIT compile method '(wrapper managed-to-managed) System.Environment/SpecialFolder[]:System.Collections.Generic.IEnumerable`1.GetEnumerator ()' while running with --aot-only. + } + + [Test] + public void Workaround_3735 () + { + // note: we cannot use the same `enum` type in the workaround since it would make the + // AOT compiler add the code (and make the previous test case works) + List list = new List () { + MidpointRounding.AwayFromZero + }; + Assert.True (list.Any (rounding => rounding == MidpointRounding.AwayFromZero)); + } + + Task InnerTestB () + { + return Task.Factory.StartNew (() => default (T)).ContinueWith (t => true); + } + + [Test] + public void Continuation_2337 () + { + InnerTestB (); + if (Runtime.Arch == Arch.SIMULATOR) + Assert.Inconclusive ("only fails on devices"); + } + + // https://bugzilla.xamarin.com/show_bug.cgi?id=3902 + + class Question { + public bool Deleted { get; set; } + public bool IsAnswered { get; set; } + public int Position { get; set; } + public int SectionId { get; set; } + } + + class Section { + public int BoardId { get; set; } + public int Id { get; set; } + public int BulletinBoardId { get; set; } + public int Position { get; set; } + } + + List Table () where T : new () + { + List list = new List (); + for (int i=0; i < 5; i++) + list.Add (new T ()); + return list; + } + + [Test] + public void Linq_3902_c1 () + { + int boardId = 0; + var result = from q in Table () where q.Deleted == false + join s in Table
() on q.SectionId equals s.Id + where s.BoardId == boardId + orderby q.IsAnswered, s.Position, q.Position + select q; + // note: orderby causing: + // Attempting to JIT compile method 'System.Linq.OrderedEnumerable`1<<>__AnonType0`2>:CreateOrderedEnumerable (System.Func`2<<>__AnonType0`2, int>,System.Collections.Generic.IComparer`1,bool)' while running with --aot-only. + Assert.NotNull (result); + } + + [Test] + public void Workaround_3902_c1 () + { + int boardId = 0; + var result = from q in Table () where q.Deleted == false + join s in Table
() on q.SectionId equals s.Id + where s.BoardId == boardId + orderby q.IsAnswered.ToString (), s.Position.ToString (), q.Position.ToString () + select q; + Assert.NotNull (result); + } + + [Test] + public void Linq_3902_c4 () + { + int boardId = 0; + var results = from q in Table () where q.Deleted == false + join s in Table
() on q.SectionId equals s.Id + where s.BoardId == boardId + select q; + // query is ok + foreach (var result in results) + Assert.NotNull (result); + // accessing elements throws with: + // Attempting to JIT compile method 'System.Linq.Enumerable:m__5A (MonoTouchFixtures.AotBugsTest/Section)' while running with --aot-only. + if (Runtime.Arch == Arch.SIMULATOR) + Assert.Inconclusive ("only fails on devices"); + } + + [Test] + public void Workaround_3902_c4 () + { + int boardId = 0; + var results = from q in Table () where q.Deleted == false + join s in Table
() on q.SectionId.ToString () equals s.Id.ToString () + where s.BoardId == boardId + select q; + foreach (var result in results) + Assert.NotNull (result); + } + + public class VirtualGeneric { + public virtual ICollection MakeCollectionOfInputs (T input1, T input2, T input3) + { + Collection alist = new Collection (); + alist.Add (input1); + alist.Add (input2); + alist.Add (input3); + return alist; + } + } + + [Test] + public void Virtual_4114 () + { + VirtualGeneric g = new VirtualGeneric (); + Assert.NotNull (g.MakeCollectionOfInputs (1.0, 2.0, 3.0)); + } + + public class OverrideGeneric : VirtualGeneric { + public override ICollection MakeCollectionOfInputs (T input1, T input2, T input3) + { + Collection alist = new Collection (); + alist.Add (input1); + alist.Add (input2); + alist.Add (input3); + return alist; + } + } + + [Test] + public void Override_4114 () + { + OverrideGeneric g = new OverrideGeneric (); + // Attempting to JIT compile method 'MonoTouchFixtures.AotBugsTest/OverrideGeneric:MakeCollectionOfInputs (double,double,double)' while running with --aot-only. + g.MakeCollectionOfInputs (1.0, 2.0, 3.0); + if (Runtime.Arch == Arch.SIMULATOR) + Assert.Inconclusive ("only fails on devices"); + } + + public sealed class NewDictionary { + Dictionary _dictionary = new Dictionary (); + + public NewDictionary (IEnumerable> items) + { + ForEach (items, (item) => _dictionary.Add (item.Key, item.Value)); + } + + static void ForEach (IEnumerable collection, Action action) + { + if (collection != null) + foreach (T item in collection) + action (item); + } + } + + [Test] + public void ForEachKVP_4114 () + { + // Attempting to JIT compile method 'MonoTouchFixtures.AotBugsTest/NewDictionary`2:ForEach> (System.Collections.Generic.IEnumerable`1>,System.Action`1>)' while running with --aot-only. + new NewDictionary (null); + if (Runtime.Arch == Arch.SIMULATOR) + Assert.Inconclusive ("only fails on devices"); + } + + public class Enumbers { + public IEnumerable> Enumerate (List> alist) + { + return MakeEnumerable (alist.ToArray ()); + } + + IEnumerable> MakeEnumerable (KeyValuePair[] data) + { + return data.AsEnumerable (); + } + } + + [Test] + [ExpectedException (typeof (NullReferenceException))] + public void AsEnumerable_4114 () + { + Enumbers e = new Enumbers (); + // Attempting to JIT compile method 'System.Collections.Generic.List`1>:ToArray ()' while running with --aot-only. + e.Enumerate (null); + } + + static object mInstance = null; + + [MethodImpl(MethodImplOptions.Synchronized)] + public static object getInstance() { + if (mInstance == null) + mInstance = new object(); + return mInstance; + } + + // #9805 + [Test] + public void Synchronized () { + getInstance (); + } + + // https://bugzilla.xamarin.com/show_bug.cgi?id=8379 + + public class Base { + + public static List

CreateList

() + { + return new List

(); + } + + public static List StringList = CreateList (); + public static List IntList = CreateList (); + } + + public class Class1 : Base { + } + + [Test] + public void Bug8379_a () + { + new Base (); + } + + [Test] + public void Bug8379_b () + { + new Class1 (); + } + + [Test] + public void Bug5354 () + { + Action testAction = (string s) => { s.ToString (); }; + testAction.BeginInvoke ("Teszt", null, null); + } + + public static IEnumerable GetStringList() where T : struct, IConvertible + { + return Enum.GetValues(typeof(T)).Cast().Select(x=>x.ToString()); + } + + [Test] + public void Bug12811a () + { + int n = 1; + foreach (var e in GetStringList ()) { + Assert.NotNull (e, n.ToString ()); + n++; + } + } + + [Test] + public void Bug12811b () + { + int n = 1; + foreach (var e in Enum.GetValues (typeof (NSFileManagerItemReplacementOptions)).Cast ().Select (x=>x.ToString ())) { + Assert.NotNull (e, n.ToString ()); + n++; + } + } + + public enum MyEnum8ElementsInInt32 : int + { + Zero = 0 + , One = 1 + , Two = 2 + , Three = 3 + , Four = 4 + , Five = 5 + , Six = 6 + , Seven = 7 + } + + public enum MyEnum8ElementsInUInt32 : uint + { + Zero = 0 + , One = 1 + , Two = 2 + , Three = 3 + , Four = 4 + , Five = 5 + , Six = 6 + , Seven = 7 + } + + public enum MyEnum7ElementsInUInt16 : ushort + { + Zero = 0 + , One = 1 + , Two = 2 + , Three = 3 + , Four = 4 + , Five = 5 + , Six = 6 + } + + public enum MyEnum8ElementsInUInt16 : ushort + { + Zero = 0 + , One = 1 + , Two = 2 + , Three = 3 + , Four = 4 + , Five = 5 + , Six = 6 + , Seven = 7 + } + + [Test] + public void Bug12605 () + { + Assert.AreEqual ("One", Convert.ToString ((MyEnum8ElementsInInt32) 1), "1"); + Assert.AreEqual ("One", Convert.ToString ((MyEnum8ElementsInUInt32) 1), "2"); + Assert.AreEqual ("One", Convert.ToString ((MyEnum7ElementsInUInt16) 1), "3"); + Assert.AreEqual ("One", Convert.ToString ((MyEnum8ElementsInUInt16) 1), "4"); + } + + [Test] + public void Bug12895 () + { + var r = new System.Text.RegularExpressions.Regex (@"(?\G[ ]+)|(?\G? +)|(?\G[][{}:,])|(?\G[A-Za-z]+)|(?\G + \"" # Opening quote + (?: + \\u[0-9a-fA-F]{4} | # Unicode escape + \\b | \\f | \ | \ | \ | # Backspace, form-feed, newline, carriage-return, tab + \\\\ | \\/ | # Escaped backslash, slash + \\"" | # Escaped quotes + [^\p{Cc}\\""] # Any unicode character except a control code, a backslash or a double quote + )* # Zero of more of any of the previous classes + \"" # Closing quote + )|(?\G + -? # Optional minus + (?: + 0 | # Leading zero only allowed on its own (e.g. 0, 0.1, 0e1) + [1-9][0-9]* # Otherwise leading digit must be non-zero (so no 0123, 0001) + ) + (?:[.][0-9]*)? # Optional fraction + (?:[Ee][+-]?[0-9]+)? # Optional exponent + (?![A-Za-z0-9_]) # Must not be followed by an alphanumeric character + )", System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace); + Assert.NotNull (r); // looking got EEE while executing, on devices, the above code + } + + [Test] + public void Bug26245 () + { + var c = new Collection (); + c.Add (new PointF (50, 50)); // crashed under ARM64 + Assert.That (c.Count, Is.EqualTo (1)); + } + + [Test] + public void Bug39443 () + { + // un-reproducible test case (added to have large pool of QA devices run iton different CPU) + var nfe = nfloat.Epsilon.ToString (); + if (IntPtr.Size == 4) { + Assert.That (float.Epsilon.ToString (), Is.EqualTo (nfe), "Epsilon"); + } else { + Assert.That (double.Epsilon.ToString (), Is.EqualTo (nfe), "Epsilon"); + } + } + } +} diff --git a/tests/linker-ios/link sdk/AppDelegate.cs b/tests/linker-ios/link sdk/AppDelegate.cs new file mode 100644 index 000000000000..6b6315b6c400 --- /dev/null +++ b/tests/linker-ios/link sdk/AppDelegate.cs @@ -0,0 +1,53 @@ + +#if !__WATCHOS__ + +using System; +using System.Collections.Generic; +using System.Reflection; +#if XAMCORE_2_0 +using Foundation; +using UIKit; +#else +using MonoTouch.Foundation; +using MonoTouch.UIKit; +#endif +using MonoTouch.NUnit.UI; + +namespace LinkSdk +{ + // The UIApplicationDelegate for the application. This class is responsible for launching the + // User Interface of the application, as well as listening (and optionally responding) to + // application events from iOS. + [Register ("AppDelegate")] + public partial class AppDelegate : UIApplicationDelegate + { + // class-level declarations + UIWindow window; + TouchRunner runner; + + // + // This method is invoked when the application has loaded and is ready to run. In this + // method you should instantiate the window, load the UI into it and then make the window + // visible. + // + // You have 17 seconds to return from this method, or iOS will terminate your application. + // + public override bool FinishedLaunching (UIApplication app, NSDictionary options) + { + // create a new window instance based on the screen size + window = new UIWindow (UIScreen.MainScreen.Bounds); + runner = new TouchRunner (window); + + // tests can be inside the main assembly + runner.Add (Assembly.GetExecutingAssembly ()); + runner.Add (typeof (BundledResources.ResourcesTest).Assembly); + + window.RootViewController = new UINavigationController (runner.GetViewController ()); + // make the window visible + window.MakeKeyAndVisible (); + + return true; + } + } +} +#endif // !__WATCHOS__ diff --git a/tests/linker-ios/link sdk/AsyncTest.cs b/tests/linker-ios/link sdk/AsyncTest.cs new file mode 100644 index 000000000000..9776afb5d8eb --- /dev/null +++ b/tests/linker-ios/link sdk/AsyncTest.cs @@ -0,0 +1,28 @@ +using System; +using System.Net.Http; +using System.Threading.Tasks; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkSdk { + + [TestFixture] + [Preserve (AllMembers = true)] + public class AsyncTests { + + public Task LoadCategories () + { + return Task.Run (async () => await (new HttpClient ()).GetStringAsync ("http://google.com")); + } + + [Test] + public void Bug12221 () + { + LoadCategories ().Wait (); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link sdk/Bug1820Test.cs b/tests/linker-ios/link sdk/Bug1820Test.cs new file mode 100644 index 000000000000..64062f527ef3 --- /dev/null +++ b/tests/linker-ios/link sdk/Bug1820Test.cs @@ -0,0 +1,177 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml; +using System.Xml.Schema; +using System.Xml.Serialization; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkSdk.Serialization { + + [TestFixture] + // we want the test to be availble if we use the linker + [Preserve (AllMembers = true)] + public partial class XmlSerializationTest { + + [Serializable] + [XmlType (AnonymousType = true)] + [XmlRoot (Namespace = "", IsNullable = false)] + public class Response { + private DataUpdates dataUpdatesField; + private static XmlSerializer serializer; + + public Response () + { + this.dataUpdatesField = new DataUpdates (); + } + + [XmlElement (Order = 0)] + public DataUpdates DataUpdates { + get { return this.dataUpdatesField; } + set { this.dataUpdatesField = value; } + } + + private static XmlSerializer Serializer { + get { + if ((serializer == null)) + serializer = new XmlSerializer (typeof (Response)); + return serializer; + } + } + + public static Response Deserialize (string xml) + { + StringReader stringReader = null; + try { + stringReader = new StringReader (xml); + return ((Response)(Serializer.Deserialize (XmlReader.Create (stringReader)))); + } finally { + if ((stringReader != null)) { + stringReader.Dispose (); + } + } + } + } + + [Serializable] + [XmlType (AnonymousType = true)] + [XmlRoot (Namespace = "", IsNullable = false)] + public class DataUpdates { + private List dataUpdateInfoField; + private static XmlSerializer serializer; + + public DataUpdates () + { + this.dataUpdateInfoField = new List (); + } + + // BUG1820 is here! remove Order = 0 and it works + [XmlElement ("DataUpdateInfo", Form = XmlSchemaForm.Unqualified, Order = 0)] + public List DataUpdateInfo { + get { return this.dataUpdateInfoField; } + set { this.dataUpdateInfoField = value; } + } + + private static XmlSerializer Serializer { + get { + if ((serializer == null)) + serializer = new XmlSerializer (typeof (DataUpdates)); + return serializer; + } + } + + public static DataUpdates Deserialize (string xml) + { + StringReader stringReader = null; + try { + stringReader = new StringReader (xml); + return ((DataUpdates)(Serializer.Deserialize (XmlReader.Create (stringReader)))); + } finally { + if ((stringReader != null)) { + stringReader.Dispose (); + } + } + } + } + + [Serializable] + [XmlType (AnonymousType = true)] + public class DataUpdatesDataUpdateInfo { + + private DateTime dataDateField; + private string dataTypeField; + private DateTime lastUpdatedDateField; + private static XmlSerializer serializer; + + public DataUpdatesDataUpdateInfo () + { + } + + [XmlAttribute] + public DateTime DataDate { + get { return this.dataDateField; } + set { this.dataDateField = value; } + } + + [XmlAttribute] + public string DataType { + get { return this.dataTypeField; } + set { this.dataTypeField = value; } + } + + [XmlAttribute] + public DateTime LastUpdatedDate { + get { return this.lastUpdatedDateField; } + set { this.lastUpdatedDateField = value; } + } + + private static XmlSerializer Serializer { + get { + if ((serializer == null)) + serializer = new XmlSerializer (typeof(DataUpdatesDataUpdateInfo)); + return serializer; + } + } + + public static DataUpdatesDataUpdateInfo Deserialize (string xml) + { + StringReader stringReader = null; + try { + stringReader = new StringReader (xml); + return ((DataUpdatesDataUpdateInfo)(Serializer.Deserialize (XmlReader.Create (stringReader)))); + } finally { + if ((stringReader != null)) { + stringReader.Dispose (); + } + } + } + } + + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=1820 + // note: this also test the linker (5.1+) ability not to remove 'unused' XML setters and .ctors used for serialization + public void Bug1820_GenericList () + { + string input = @" + + + + + + + + + ".Trim (); + Response r = Response.Deserialize (input); + Assert.That (r.DataUpdates.DataUpdateInfo.Count, Is.EqualTo (3), "Count"); + Assert.That (r.DataUpdates.DataUpdateInfo [0].DataDate.Day, Is.EqualTo (13), "0"); + Assert.That (r.DataUpdates.DataUpdateInfo [1].DataDate.Day, Is.EqualTo (14), "1"); + Assert.That (r.DataUpdates.DataUpdateInfo [2].DataDate.Day, Is.EqualTo (15), "2"); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link sdk/Bug2096Test.cs b/tests/linker-ios/link sdk/Bug2096Test.cs new file mode 100644 index 000000000000..eecd05b4833b --- /dev/null +++ b/tests/linker-ios/link sdk/Bug2096Test.cs @@ -0,0 +1,58 @@ +using System; +#if XAMCORE_2_0 +using Foundation; +using ObjCRuntime; +#else +using MonoTouch.Foundation; +using MonoTouch.ObjCRuntime; +#endif +using NUnit.Framework; + +namespace LinkSdk.Aot { + + [TestFixture] + // we want the test to be availble if we use the linker + [Preserve (AllMembers = true)] + public partial class AotBugsTest { + + public struct VT { + public Action a; + } + + public class D { + } + + public class A { + public void OuterMethod (TArg1 value) + { + this.InnerMethod (value, 0); + } + + private void InnerMethod (TArg1 v1, TArg2 v2) + { + Console.WriteLine ("{0} {1}", v1, v2); + } + } + + [Test] + public void Bug2096_Aot () + { + var a = new A (); + + a.OuterMethod (1); + a.OuterMethod (DateTime.Now); + // works with 5.0.2 (5.1) + + var v = new VT (); + a.OuterMethod (v); + // works with 5.0.2 (5.1) + + var x = new D (); + a.OuterMethod (x); + // fails with 5.0.2 (5.1) when running on devices with + // Attempting to JIT compile method 'A:InnerMethod (D,long)' while running with --aot-only. + if (Runtime.Arch == Arch.SIMULATOR) + Assert.Inconclusive ("only fails on devices"); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link sdk/CalendarTest.cs b/tests/linker-ios/link sdk/CalendarTest.cs new file mode 100644 index 000000000000..004bedc38662 --- /dev/null +++ b/tests/linker-ios/link sdk/CalendarTest.cs @@ -0,0 +1,42 @@ +// Copyright 2013 Xamarin Inc. All rights reserved. + +using System; +using System.Globalization; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkSdk.Calendars { + + [TestFixture] + // we want the tests to be available because we use the linker + [Preserve (AllMembers = true)] + public class CalendarTest { + + // application must *NOT* be build with I18N.MidEast and I18N.Other (Thai) + + [Test] + public void UmAlQura () + { + var ci = CultureInfo.GetCultureInfo ("ar"); + Assert.That (ci.Calendar.ToString (), Is.EqualTo ("System.Globalization.GregorianCalendar"), "Calendar"); + } + + [Test] + public void Hijri () + { + var ci = CultureInfo.GetCultureInfo ("ps"); + Assert.That (ci.Calendar.ToString (), Is.EqualTo ("System.Globalization.GregorianCalendar"), "Calendar"); + } + + [Test] + public void ThaiBuddhist () + { + var ci = CultureInfo.GetCultureInfo ("th"); + Assert.That (ci.Calendar.ToString (), Is.EqualTo ("System.Globalization.GregorianCalendar"), "Calendar"); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link sdk/CryptoTest.cs b/tests/linker-ios/link sdk/CryptoTest.cs new file mode 100644 index 000000000000..dcdd431ed3e4 --- /dev/null +++ b/tests/linker-ios/link sdk/CryptoTest.cs @@ -0,0 +1,218 @@ +// +// Cryptographic Unit Tests - for about everything that can go wrong wrt linking +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2012 Xamarin Inc. +// + +using System; +using System.Net; +using System.Net.Security; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkSdk { + + [TestFixture] + // we want the test to be availble if we use the linker + [Preserve (AllMembers = true)] + public class CryptoTest { + + [Test] + public void AesCreate () + { + // Aes resides in mscorlib.dll but needs to create instance of types that are + // located inside System.Core.dll - IOW the linker needs to be aware of this + Aes aes = Aes.Create (); + Assert.NotNull (aes, "Aes"); + Assert.True (aes.GetType ().Assembly.FullName.StartsWith ("System.Core, ", StringComparison.Ordinal), "System.Core"); + } + + static int trust_validation_callback; + + [Test] + public void TrustUsingNewCallback () + { + // Three similar tests exists in dontlink, linkall and linksdk to test 3 different cases + // untrusted, custom ICertificatePolicy and ServerCertificateValidationCallback without + // having caching issues (in S.Net or the SSL handshake cache) + try { + ServicePointManager.ServerCertificateValidationCallback = delegate (object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors errors) { + Assert.That (errors, Is.EqualTo (SslPolicyErrors.None), "certificateProblem"); + X509Certificate2 c2 = new X509Certificate2 (cert.GetRawCertData ()); + Assert.False (chain.Build (c2), "Build"); + Assert.AreSame (c2, chain.ChainElements [0].Certificate, "ChainElements"); + trust_validation_callback++; + return true; + }; + WebClient wc = new WebClient (); + Assert.IsNotNull (wc.DownloadString ("https://wrench.internalx.com/Wrench/Login.aspx")); + // caching means it will be called at least for the first run, but it might not + // be called again in subsequent requests (unless it expires) + Assert.That (trust_validation_callback, Is.GreaterThan (0), "validation done"); + } + finally { + ServicePointManager.ServerCertificateValidationCallback = null; + } + } + + [Test] + public void SSL_IP_5706 () + { + WebClient wc = new WebClient (); + // the certificate contains (several rules) the host name + Assert.NotNull (wc.DownloadString ("https://www.google.com")); + + // IP are (generally) not allowed + foreach (var ip in Dns.GetHostAddresses ("www.google.com")) { + if (ip.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork) + continue; + + Assert.Throws (delegate { + wc.DownloadString ("https://" + ip.ToString ()); + }, ip.ToString ()); + return; // checking a single IP is enough to prove the point + } + } + + static int sne_validation_callback; + + [Test] + public void TLS1_ServerNameExtension () + { + // without support for the "server_name" TLS extension (RFC3546) we receive the "general" + // certificate of a server, which might not be the right one if a single server instance + // is used for many hosts (without a common name) + + // note: SSLv3 won't work, test is inside linkall.app (due to result caching) + + var actual = ServicePointManager.SecurityProtocol; + try { + ServicePointManager.ServerCertificateValidationCallback = delegate (object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors errors) { + Assert.That (errors, Is.EqualTo (SslPolicyErrors.None), "certificateProblem"); + X509Certificate2 c2 = new X509Certificate2 (cert.GetRawCertData ()); + Assert.False (chain.Build (c2), "Build"); + Assert.AreSame (c2, chain.ChainElements [0].Certificate, "ChainElements"); + sne_validation_callback++; + return true; + }; + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; + WebClient wc = new WebClient (); + Assert.IsNotNull (wc.DownloadString ("https://api.imgur.com/2/stats")); + } + catch (WebException we) { + // failing to get data does not mean the SSL/TLS session was not established + if (sne_validation_callback == 0) { + // The remote server returned an error: (502) Bad Gateway. + // The remote server returned an error: (503) Service Unavailable. + if (we.Message.Contains ("(502)") || we.Message.Contains ("(503)")) + Assert.Inconclusive (we.Message); + throw; + } + } + finally { + ServicePointManager.ServerCertificateValidationCallback = null; + ServicePointManager.SecurityProtocol = actual; + // caching means it will be called at least for the first run, but it might not + // be called again in subsequent requests (unless it expires) + Assert.That (sne_validation_callback, Is.GreaterThan (0), "validation done"); + } + } + + [Test] + public void Chain () + { + X509Store store = new X509Store ("Trust"); + store.Open (OpenFlags.ReadWrite); + + string certString = "MIIDGjCCAgKgAwIBAgICApowDQYJKoZIhvcNAQEFBQAwLjELMAkGA1UEBhMCQ1oxDjAMBgNVBAoTBVJlYmV4MQ8wDQYDVQQDEwZUZXN0Q0EwHhcNMDAwMTAxMDAwMDAwWhcNNDkxMjMxMDAwMDAwWjAuMQswCQYDVQQGEwJDWjEOMAwGA1UEChMFUmViZXgxDzANBgNVBAMTBlRlc3RDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMgeRAcaNLTFaaBhFx8RDJ8b9K655dNUXmO11mbImDbPq4qVeZXDgAjnzPov8iBscwfqBvBpF38LsxBIPA2i1d0RMsQruOhJHttA9I0enElUXXj63sOEVNMSQeg1IMyvNeEotag+Gcx6SF+HYnariublETaZGzwAOD2SM49mfqUyfkgeTjdO6qp8xnoEr7dS5pEBHDg70byj/JEeZd3gFea9TiOXhbCrI89dKeWYBeoHFYhhkaSB7q9EOaUEzKo/BQ6PBHFu6odfGkOjXuwfPkY/wUy9U4uj75LmdhzvJf6ifsJS9BQZF4//JcUYSxiyzpxDYqSbTF3g9w5Ds2LOAscCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgB/MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFD1v20tPgvHTEK/0eLO09j0rL2qXMA0GCSqGSIb3DQEBBQUAA4IBAQAZIjcdR3EZiFJ67gfCnPBrxVgFNvaRAMCYEYYIGDCAUeB4bLTu9dvun9KFhgVNqjgx+xTTpx9d/5mAZx5W3YAG6faQPCaHccLefB1M1hVPmo8md2uw1a44RHU9LlM0V5Lw8xTKRkQiZz3Ysu0sY27RvLrTptbbfkE4Rp9qAMguZT9cFrgPAzh+0zuo8NNj9Jz7/SSa83yIFmflCsHYSuNyKIy2iaX9TCVbTrwJmRIB65gqtTb6AKtFGIPzsb6nayHvgGHFchrFovcNrvRpE71F38oVG+eCjT23JfiIZim+yJLppSf56167u8etDcQ39j2b9kzWlHIVkVM0REpsKF7S"; + X509Certificate2 rootCert = new X509Certificate2 (Convert.FromBase64String (certString)); + if (!store.Certificates.Contains (rootCert)) + store.Add (rootCert); + + store.Close(); + + byte[] certData = new byte[] {0x30,0x82,0x02,0xFA,0x30,0x82,0x01,0xE2,0xA0,0x03,0x02,0x01,0x02,0x02,0x03,0x01,0x4F,0x55,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x2E,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x43,0x5A,0x31,0x0E,0x30,0x0C,0x06,0x03,0x55,0x04,0x0A,0x13,0x05,0x52,0x65,0x62,0x65,0x78,0x31,0x0F,0x30,0x0D,0x06,0x03,0x55,0x04,0x03,0x13,0x06,0x54,0x65,0x73,0x74,0x43,0x41,0x30,0x1E,0x17,0x0D,0x31,0x32,0x30,0x34,0x32,0x32,0x31,0x38,0x33,0x31,0x35,0x33,0x5A,0x17,0x0D,0x34,0x39,0x31,0x32,0x33,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x30,0x37,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x43,0x5A,0x31,0x0E,0x30,0x0C,0x06,0x03,0x55,0x04,0x0A,0x13,0x05,0x52,0x65,0x62,0x65,0x78,0x31,0x18,0x30,0x16,0x06,0x03,0x55,0x04,0x03,0x13,0x0F,0x77,0x69,0x6E,0x30,0x31,0x2E,0x64,0x30,0x35,0x2E,0x6C,0x6F,0x63,0x61,0x6C,0x30,0x81,0x9F,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8D,0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00,0xF1,0x4F,0xAC,0x71,0x70,0x8F,0x8A,0xFE,0x38,0x67,0xA7,0x21,0x56,0x8B,0x34,0xBC,0xF5,0xCD,0x48,0x1C,0x69,0xEB,0x83,0x98,0x69,0x3D,0x33,0x2A,0x7B,0x04,0xB1,0x0A,0xA9,0x2C,0x17,0xDD,0x41,0xEC,0x21,0x91,0xB8,0x12,0x95,0xB0,0x4C,0x2A,0x53,0xBF,0x06,0x47,0x72,0xBB,0x68,0xCA,0x49,0x34,0x15,0x7B,0x78,0x4F,0x42,0x03,0xD9,0x58,0xEE,0x9D,0x72,0x61,0xAD,0xAD,0x0C,0x28,0x65,0x61,0x48,0xF8,0x68,0xB5,0x16,0x19,0xD0,0xDD,0x47,0x44,0x86,0xE3,0xA6,0x93,0x81,0xD5,0xA1,0x70,0x23,0x05,0x74,0x33,0xD1,0xD2,0x21,0x17,0x68,0xAF,0x5F,0x25,0xD5,0x8C,0x72,0xF6,0x28,0xF4,0x1F,0x42,0x24,0xCF,0x18,0x7B,0x5D,0xCE,0x29,0x43,0xF2,0x10,0xB6,0x73,0x65,0x4C,0x0A,0x17,0x02,0x03,0x01,0x00,0x01,0xA3,0x81,0x9B,0x30,0x81,0x98,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x05,0xA0,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x14,0x00,0x58,0x48,0x55,0x6C,0x45,0xC6,0xCC,0x06,0x25,0x2D,0xD3,0xBA,0x0C,0x08,0x81,0x00,0x58,0xDF,0x30,0x13,0x06,0x03,0x55,0x1D,0x25,0x04,0x0C,0x30,0x0A,0x06,0x08,0x2B,0x06,0x01,0x05,0x05,0x07,0x03,0x01,0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x3D,0x6F,0xDB,0x4B,0x4F,0x82,0xF1,0xD3,0x10,0xAF,0xF4,0x78,0xB3,0xB4,0xF6,0x3D,0x2B,0x2F,0x6A,0x97,0x30,0x31,0x06,0x03,0x55,0x1D,0x1F,0x04,0x2A,0x30,0x28,0x30,0x26,0xA0,0x24,0xA0,0x22,0x86,0x20,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x74,0x65,0x73,0x74,0x2D,0x63,0x61,0x2E,0x6C,0x6F,0x63,0x61,0x6C,0x2F,0x74,0x65,0x73,0x74,0x2D,0x63,0x61,0x2E,0x63,0x72,0x6C,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x22,0x48,0xC3,0x95,0x3A,0x51,0x72,0x15,0x41,0x5B,0x47,0xC4,0xC5,0x4E,0x2E,0x97,0xAC,0x1D,0x0B,0xD1,0xA4,0x38,0xF2,0xFB,0x6E,0x33,0x9D,0xC8,0x93,0x4C,0x88,0x34,0xA3,0x68,0xC7,0xC6,0x42,0x51,0x54,0x31,0x72,0x72,0xEB,0xEE,0x5C,0xF0,0x7D,0xC9,0xC8,0xAE,0x24,0x9F,0xA0,0x1D,0x2E,0xEE,0x84,0x55,0xC3,0x3A,0xC4,0xCE,0xE1,0xB3,0xA2,0xD2,0x1F,0x44,0xC8,0x81,0x0F,0x9C,0xED,0x5B,0x17,0xBB,0x2C,0xDA,0x4A,0x9D,0xF7,0x7D,0x5A,0x08,0x6C,0xA3,0xF4,0xCB,0x55,0xE6,0x1A,0xAA,0xC7,0x14,0x16,0x7D,0x46,0xD0,0x7C,0x71,0xA8,0xA7,0xEA,0xBF,0xA6,0x92,0xD4,0xC5,0x7A,0xB8,0x45,0x3A,0x00,0xB3,0xDC,0x76,0x2E,0xEB,0xB9,0xF4,0x6B,0xDC,0xF2,0xC4,0x7C,0x0C,0xD5,0x1C,0x73,0xE8,0xE1,0xBB,0xC1,0x5C,0xCC,0xD9,0xBE,0xDE,0x61,0x4D,0xEF,0x2B,0x23,0xFA,0xA6,0xF6,0xED,0x4F,0x5F,0x2C,0xCA,0x68,0x29,0x59,0x27,0x82,0x41,0x5E,0xAD,0xC8,0x93,0xBF,0x83,0x01,0x8F,0x32,0xCB,0x79,0xEE,0x93,0x4C,0xCB,0x87,0x48,0x62,0x0D,0x44,0xD7,0x80,0x31,0x87,0x41,0x72,0x2D,0x12,0xA0,0x2C,0x99,0x89,0x08,0x5F,0xE9,0xFE,0x5E,0xB4,0xEC,0xCB,0x6C,0x23,0xC1,0xB8,0xE4,0xD6,0x1E,0x4B,0x9C,0x88,0x0A,0x63,0x65,0x78,0xC0,0x37,0xAC,0x54,0xCB,0xDE,0xA9,0x0F,0x59,0x43,0x1E,0x41,0xF5,0x32,0xAC,0x85,0x69,0xE9,0xBA,0xA6,0x78,0x87,0x88,0x8B,0x71,0xFB,0xE4,0x51,0xC0,0xF5,0xB7,0x4C,0x1F,0xCF,0x6A,0x1C,0xF6,0x1B,0x27,0x50,0xE9,0xAC,0xBF,0xB7,0x4E}; + + X509Certificate2 cert = new X509Certificate2 (certData); + X509Chain chain = new X509Chain (false); + Assert.False (chain.Build (cert), "Online"); + + chain.ChainPolicy.RevocationMode = X509RevocationMode.Offline; + Assert.False (chain.Build (cert), "Offline"); + + chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; + Assert.True (chain.Build (cert), "NoCheck"); + } + + byte[] sha256_data = { + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, + 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0D, 0x0A, 0x4D, 0x49, 0x49, 0x43, 0x78, 0x44, 0x43, 0x43, 0x41, 0x61, 0x79, + 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x44, 0x41, 0x4B, 0x37, 0x6C, 0x4D, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, + 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x4D, 0x43, 0x34, 0x78, 0x43, 0x7A, 0x41, + 0x4A, 0x42, 0x67, 0x4E, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6B, 0x4E, 0x61, 0x0D, 0x0A, 0x4D, 0x51, 0x34, 0x77, 0x44, + 0x41, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4B, 0x45, 0x77, 0x56, 0x53, 0x5A, 0x57, 0x4A, 0x6C, 0x65, 0x44, 0x45, 0x50, 0x4D, + 0x41, 0x30, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, 0x47, 0x56, 0x47, 0x56, 0x7A, 0x64, 0x45, 0x4E, 0x42, 0x4D, + 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x7A, 0x4D, 0x44, 0x55, 0x78, 0x4F, 0x54, 0x45, 0x79, 0x4E, 0x44, 0x63, 0x31, 0x0D, + 0x0A, 0x4E, 0x31, 0x6F, 0x58, 0x44, 0x54, 0x51, 0x35, 0x4D, 0x54, 0x49, 0x7A, 0x4D, 0x54, 0x41, 0x77, 0x4D, 0x44, 0x41, + 0x77, 0x4D, 0x46, 0x6F, 0x77, 0x4F, 0x6A, 0x45, 0x57, 0x4D, 0x42, 0x51, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x4D, + 0x4E, 0x55, 0x6D, 0x56, 0x69, 0x5A, 0x58, 0x67, 0x67, 0x55, 0x33, 0x56, 0x77, 0x63, 0x47, 0x39, 0x79, 0x64, 0x44, 0x45, + 0x67, 0x4D, 0x42, 0x34, 0x47, 0x0D, 0x0A, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x4A, 0x41, + 0x52, 0x59, 0x52, 0x63, 0x33, 0x56, 0x77, 0x63, 0x47, 0x39, 0x79, 0x64, 0x45, 0x42, 0x79, 0x5A, 0x57, 0x4A, 0x6C, 0x65, + 0x43, 0x35, 0x75, 0x5A, 0x58, 0x51, 0x77, 0x67, 0x5A, 0x38, 0x77, 0x44, 0x51, 0x59, 0x4A, 0x4B, 0x6F, 0x5A, 0x49, 0x68, + 0x76, 0x63, 0x4E, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x0D, 0x0A, 0x67, 0x59, 0x30, 0x41, 0x4D, 0x49, 0x47, + 0x4A, 0x41, 0x6F, 0x47, 0x42, 0x41, 0x4B, 0x7A, 0x36, 0x49, 0x37, 0x49, 0x59, 0x4E, 0x4A, 0x4C, 0x44, 0x43, 0x36, 0x42, + 0x79, 0x44, 0x32, 0x75, 0x59, 0x36, 0x69, 0x55, 0x61, 0x34, 0x30, 0x54, 0x34, 0x37, 0x34, 0x44, 0x41, 0x65, 0x59, 0x55, + 0x49, 0x31, 0x37, 0x43, 0x79, 0x39, 0x55, 0x6B, 0x77, 0x62, 0x4E, 0x4D, 0x2B, 0x6B, 0x39, 0x62, 0x57, 0x0D, 0x0A, 0x68, + 0x75, 0x46, 0x62, 0x65, 0x63, 0x56, 0x42, 0x6D, 0x43, 0x37, 0x42, 0x79, 0x31, 0x6C, 0x48, 0x65, 0x2B, 0x79, 0x41, 0x59, + 0x59, 0x78, 0x78, 0x74, 0x47, 0x50, 0x7A, 0x41, 0x48, 0x58, 0x50, 0x76, 0x68, 0x4A, 0x4D, 0x56, 0x50, 0x41, 0x2F, 0x37, + 0x4C, 0x36, 0x41, 0x4B, 0x58, 0x6D, 0x6A, 0x71, 0x69, 0x77, 0x78, 0x7A, 0x47, 0x51, 0x79, 0x30, 0x73, 0x59, 0x67, 0x2F, + 0x6A, 0x36, 0x79, 0x0D, 0x0A, 0x6F, 0x58, 0x39, 0x36, 0x39, 0x52, 0x53, 0x30, 0x49, 0x58, 0x33, 0x75, 0x33, 0x64, 0x31, + 0x72, 0x35, 0x61, 0x6F, 0x44, 0x76, 0x36, 0x4A, 0x58, 0x53, 0x69, 0x53, 0x73, 0x75, 0x67, 0x78, 0x56, 0x47, 0x69, 0x65, + 0x54, 0x53, 0x2F, 0x50, 0x71, 0x55, 0x6E, 0x6E, 0x76, 0x72, 0x49, 0x74, 0x59, 0x78, 0x6F, 0x64, 0x4F, 0x31, 0x58, 0x79, + 0x76, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41, 0x47, 0x6A, 0x0D, 0x0A, 0x59, 0x7A, 0x42, 0x68, 0x4D, 0x41, 0x34, 0x47, 0x41, + 0x31, 0x55, 0x64, 0x44, 0x77, 0x45, 0x42, 0x2F, 0x77, 0x51, 0x45, 0x41, 0x77, 0x49, 0x45, 0x38, 0x44, 0x41, 0x64, 0x42, + 0x67, 0x4E, 0x56, 0x48, 0x51, 0x34, 0x45, 0x46, 0x67, 0x51, 0x55, 0x66, 0x75, 0x52, 0x51, 0x78, 0x4E, 0x75, 0x59, 0x71, + 0x77, 0x73, 0x38, 0x56, 0x48, 0x7A, 0x4A, 0x6D, 0x4A, 0x50, 0x6F, 0x39, 0x41, 0x45, 0x6F, 0x0D, 0x0A, 0x6F, 0x50, 0x77, + 0x77, 0x44, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x6C, 0x42, 0x41, 0x67, 0x77, 0x42, 0x67, 0x59, 0x45, 0x56, 0x52, 0x30, + 0x6C, 0x41, 0x44, 0x41, 0x66, 0x42, 0x67, 0x4E, 0x56, 0x48, 0x53, 0x4D, 0x45, 0x47, 0x44, 0x41, 0x57, 0x67, 0x42, 0x51, + 0x39, 0x62, 0x39, 0x74, 0x4C, 0x54, 0x34, 0x4C, 0x78, 0x30, 0x78, 0x43, 0x76, 0x39, 0x48, 0x69, 0x7A, 0x74, 0x50, 0x59, + 0x39, 0x0D, 0x0A, 0x4B, 0x79, 0x39, 0x71, 0x6C, 0x7A, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47, 0x39, + 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x41, 0x4F, 0x43, 0x41, 0x51, 0x45, 0x41, 0x41, 0x59, 0x62, 0x69, 0x46, + 0x41, 0x6D, 0x33, 0x6E, 0x71, 0x61, 0x6F, 0x4A, 0x51, 0x45, 0x41, 0x6D, 0x37, 0x7A, 0x34, 0x33, 0x71, 0x6E, 0x71, 0x41, + 0x6B, 0x41, 0x6E, 0x35, 0x30, 0x76, 0x6F, 0x0D, 0x0A, 0x75, 0x4F, 0x39, 0x4E, 0x57, 0x61, 0x33, 0x53, 0x43, 0x45, 0x38, + 0x78, 0x6B, 0x4C, 0x55, 0x2B, 0x31, 0x50, 0x62, 0x67, 0x76, 0x6F, 0x48, 0x4E, 0x50, 0x54, 0x6A, 0x36, 0x4D, 0x51, 0x30, + 0x59, 0x37, 0x6F, 0x63, 0x2B, 0x6D, 0x42, 0x75, 0x55, 0x6B, 0x5A, 0x52, 0x63, 0x4B, 0x33, 0x51, 0x4C, 0x69, 0x58, 0x6C, + 0x62, 0x34, 0x66, 0x6E, 0x7A, 0x39, 0x59, 0x55, 0x36, 0x66, 0x69, 0x7A, 0x4A, 0x0D, 0x0A, 0x79, 0x6A, 0x33, 0x76, 0x33, + 0x42, 0x34, 0x6B, 0x4A, 0x33, 0x5A, 0x62, 0x42, 0x6D, 0x38, 0x48, 0x4E, 0x34, 0x78, 0x79, 0x44, 0x62, 0x66, 0x6E, 0x77, + 0x6C, 0x67, 0x42, 0x55, 0x65, 0x6F, 0x68, 0x78, 0x61, 0x36, 0x2B, 0x50, 0x78, 0x67, 0x2F, 0x37, 0x72, 0x39, 0x34, 0x78, + 0x54, 0x4A, 0x72, 0x35, 0x46, 0x30, 0x43, 0x68, 0x2F, 0x41, 0x68, 0x2F, 0x6D, 0x59, 0x37, 0x66, 0x4B, 0x6C, 0x50, 0x0D, + 0x0A, 0x46, 0x46, 0x35, 0x47, 0x68, 0x4A, 0x2B, 0x62, 0x34, 0x76, 0x55, 0x6F, 0x36, 0x47, 0x74, 0x6E, 0x79, 0x6F, 0x4F, + 0x33, 0x58, 0x57, 0x4C, 0x45, 0x34, 0x4D, 0x38, 0x4B, 0x67, 0x68, 0x6C, 0x39, 0x78, 0x48, 0x4E, 0x32, 0x52, 0x76, 0x57, + 0x47, 0x45, 0x39, 0x4B, 0x6F, 0x31, 0x4B, 0x31, 0x55, 0x62, 0x42, 0x62, 0x53, 0x4A, 0x51, 0x4D, 0x76, 0x66, 0x65, 0x49, + 0x65, 0x52, 0x38, 0x32, 0x71, 0x0D, 0x0A, 0x69, 0x66, 0x37, 0x49, 0x30, 0x56, 0x2B, 0x77, 0x59, 0x70, 0x57, 0x61, 0x4B, + 0x79, 0x5A, 0x68, 0x33, 0x6C, 0x50, 0x4C, 0x34, 0x33, 0x67, 0x35, 0x4C, 0x4F, 0x42, 0x34, 0x75, 0x51, 0x6C, 0x68, 0x76, + 0x76, 0x50, 0x4D, 0x5A, 0x63, 0x43, 0x48, 0x36, 0x4F, 0x37, 0x37, 0x37, 0x6E, 0x2F, 0x33, 0x4C, 0x2B, 0x54, 0x6C, 0x32, + 0x2F, 0x41, 0x56, 0x31, 0x73, 0x7A, 0x73, 0x67, 0x53, 0x6B, 0x54, 0x0D, 0x0A, 0x47, 0x79, 0x74, 0x54, 0x75, 0x4B, 0x6A, + 0x51, 0x35, 0x6E, 0x50, 0x53, 0x58, 0x76, 0x65, 0x44, 0x39, 0x76, 0x4B, 0x42, 0x50, 0x2F, 0x58, 0x4C, 0x73, 0x54, 0x4D, + 0x75, 0x69, 0x6A, 0x48, 0x4C, 0x43, 0x68, 0x57, 0x55, 0x69, 0x33, 0x74, 0x4B, 0x7A, 0x49, 0x48, 0x6F, 0x66, 0x4B, 0x6F, + 0x58, 0x62, 0x42, 0x43, 0x35, 0x37, 0x77, 0x3D, 0x3D, 0x0D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, + 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0D, 0x0A, }; + + [Test] + public void Sha256 () + { + X509Certificate2 c = new X509Certificate2 (sha256_data); + // can't build is fine - as long as we do not throw + Assert.False (new X509Chain (false).Build (c), "Build"); + } + } +} diff --git a/tests/linker-ios/link sdk/DataContractTest.cs b/tests/linker-ios/link sdk/DataContractTest.cs new file mode 100644 index 000000000000..e76945d78fd7 --- /dev/null +++ b/tests/linker-ios/link sdk/DataContractTest.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkSdk { + + [DataContract(Namespace="XamarinBugExample")] + public enum MyEnum : short + { + [EnumMember] + Foo = 0, + [EnumMember] + Bar = 1, + [EnumMember] + Baz = 2 + } + + [DataContract(Namespace="XamarinBugExample")] + public class MyClass + { + public MyClass() { } + + [DataMember] + List MyList { get; set; } + } + + [TestFixture] + // we want the test to be availble if we use the linker + [Preserve (AllMembers = true)] + public class CrashExample { + + [Test] + // http://forums.xamarin.com/discussion/7380/type-cast-error-in-xamarin-6-4-3-on-device-only#latest + // could not be reproduced with 6.4.4 + public void DoCrash() + { + System.Collections.IList lst = new List(); + object value = Enum.Parse (typeof(MyEnum), "1"); + lst.Add (value); // Exception here. List.cs throws ArgumentException. + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link sdk/DllImportTest.cs b/tests/linker-ios/link sdk/DllImportTest.cs new file mode 100644 index 000000000000..7569f209b9d7 --- /dev/null +++ b/tests/linker-ios/link sdk/DllImportTest.cs @@ -0,0 +1,77 @@ +// +// Unit tests for [DllImport] +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2014-2015 Xamarin Inc. All rights reserved. +// + +using System; +using System.Net.NetworkInformation; +using System.Runtime.InteropServices; +#if XAMCORE_2_0 +using Foundation; +using ObjCRuntime; +#else +using MonoTouch; +using MonoTouch.Foundation; +using MonoTouch.ObjCRuntime; +#endif +using NUnit.Framework; + +namespace LinkSdk { + + [TestFixture] + [Preserve (AllMembers = true)] + public class DllImportTest { + + class NestedFirstLevel { + + public class NestedSecondLevel { + + [DllImport ("__Internal")] + public extern static string xamarin_get_locale_country_code (); + } + } + + [Test] + public void ScanForStrip_17327 () + { + // note: must be tested on a release (strip'ed) build + Assert.NotNull (NestedFirstLevel.NestedSecondLevel.xamarin_get_locale_country_code ()); + } + + [Test] + public void Sqlite3 () + { + var lib = Dlfcn.dlopen ("/usr/lib/libsqlite3.dylib", 0); + Assert.That (lib, Is.Not.EqualTo (IntPtr.Zero), "/usr/lib/libsqlite3.dylib"); + try { + Assert.That (Dlfcn.dlsym (lib, "sqlite3_bind_int"), Is.Not.EqualTo (IntPtr.Zero), "sqlite3_bind_int"); + // iOS does not have some symbols defined - if that change/fail in the future we'll need to update Mono.Data.Sqlite + Assert.That (Dlfcn.dlsym (lib, "sqlite3_key"), Is.EqualTo (IntPtr.Zero), "sqlite3_key"); + Assert.That (Dlfcn.dlsym (lib, "sqlite3_rekey"), Is.EqualTo (IntPtr.Zero), "sqlite3_rekey"); + Assert.That (Dlfcn.dlsym (lib, "sqlite3_column_database_name"), Is.EqualTo (IntPtr.Zero), "sqlite3_column_database_name"); + Assert.That (Dlfcn.dlsym (lib, "sqlite3_column_database_name16"), Is.EqualTo (IntPtr.Zero), "sqlite3_column_database_name16"); + Assert.That (Dlfcn.dlsym (lib, "sqlite3_column_origin_name"), Is.EqualTo (IntPtr.Zero), "sqlite3_column_origin_name"); + Assert.That (Dlfcn.dlsym (lib, "sqlite3_column_origin_name16"), Is.EqualTo (IntPtr.Zero), "sqlite3_column_origin_name16"); + Assert.That (Dlfcn.dlsym (lib, "sqlite3_column_table_name"), Is.EqualTo (IntPtr.Zero), "sqlite3_column_table_name"); + Assert.That (Dlfcn.dlsym (lib, "sqlite3_column_table_name16"), Is.EqualTo (IntPtr.Zero), "sqlite3_column_table_name16"); + } + finally { + Dlfcn.dlclose (lib); + } + } + + [Test] + public void LackOfCapget () + { + // OSX/iOS libc (libSystem.dylib) does not have a capget - which breaks dlsym=false (required for tvOS) + // iOS (tvOS/watchOS) does not support Process to run ping either so it ends up with a InvalidOperationException + // which is now "optimized" to reduce code size (and remove DllImport) until we implement ping (see: #964) + var p = new Ping (); + Assert.Throws (delegate { p.Send ("localhost"); }); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link sdk/Info.plist b/tests/linker-ios/link sdk/Info.plist new file mode 100644 index 000000000000..63e5f235fd48 --- /dev/null +++ b/tests/linker-ios/link sdk/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDisplayName + LinkSdkTest + CFBundleIdentifier + com.xamarin.linksdk + UIDeviceFamily + + 1 + 2 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + MinimumOSVersion + 5.1.1 + + diff --git a/tests/linker-ios/link sdk/LinkExtraDefsTest.cs b/tests/linker-ios/link sdk/LinkExtraDefsTest.cs new file mode 100644 index 000000000000..fb00eb7d05da --- /dev/null +++ b/tests/linker-ios/link sdk/LinkExtraDefsTest.cs @@ -0,0 +1,65 @@ +// +// Unit tests for the mtouch's --xml linker option +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2012 Xamarin Inc. All rights reserved. +// + +using System; +using System.Reflection; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkSdk { + + [TestFixture] + [Preserve (AllMembers = true)] + public class LinkExtraDefsTest { + + // ensure the types in extra-linker-defs.xml are included + // even if they are: + // * part of SDK / product assemblies, where adding [Preserve] is not possible; + // * not used anywhere in this application + + // note: reflection is used so we're testing the XML-based preservation + // not the normal linking process + + [Test] + public void Corlib () + { + Type t = Type.GetType ("System.Security.HostSecurityManager, mscorlib"); + Assert.NotNull (t, "System.Security.HostSecurityManager"); + } + + [Test] + public void System () + { + Type t = Type.GetType ("System.Net.Mime.ContentType, System"); + Assert.NotNull (t, "System.Net.Mime.ContentType"); + // we asked for ParseValue to be preserved + Assert.NotNull (t.GetMethod ("ParseValue", BindingFlags.Instance | BindingFlags.NonPublic), "Parse"); + } + +#if !__WATCHOS__ + [Test] + public void MonoTouch () + { +#if XAMCORE_2_0 + Type t = Type.GetType ("CoreBluetooth.CBUUID, " + typeof(NSObject).Assembly.ToString ()); +#else + Type t = Type.GetType ("MonoTouch.CoreBluetooth.CBUUID, monotouch, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"); +#endif + Assert.NotNull (t, "[MonoTouch.]CoreBluetooth.CBUUID"); + // check (generated) fields since we instructed the linker to keep them + var f = t.GetFields (BindingFlags.NonPublic | BindingFlags.Static); + Assert.That (f.Length, Is.Not.EqualTo (0), "fields were preserved"); + } +#endif + } +} \ No newline at end of file diff --git a/tests/linker-ios/link sdk/LinkSdkRegressionTest.cs b/tests/linker-ios/link sdk/LinkSdkRegressionTest.cs new file mode 100644 index 000000000000..a8a13763efdd --- /dev/null +++ b/tests/linker-ios/link sdk/LinkSdkRegressionTest.cs @@ -0,0 +1,1047 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Json; +using System.Linq; +using System.Net; +using System.Net.NetworkInformation; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.Serialization; +using System.Security.Permissions; +using System.Threading; +using System.Xml; +using Mono.Data.Sqlite; +using MonoTouch; +#if XAMCORE_2_0 +#if !__TVOS__ && !__WATCHOS__ +using AddressBook; +using AddressBookUI; +#endif +#if !__WATCHOS__ +using CoreAnimation; +#endif +using CoreData; +using CoreFoundation; +using Foundation; +using ObjCRuntime; +#if !__TVOS__ +using MapKit; +#endif +using UIKit; +#if !__WATCHOS__ +using OpenGLES; +#endif +#else +using MonoTouch; +using MonoTouch.AddressBook; +using MonoTouch.AddressBookUI; +using MonoTouch.CoreAnimation; +using MonoTouch.CoreData; +using MonoTouch.CoreFoundation; +using MonoTouch.Foundation; +using MonoTouch.ObjCRuntime; +using MonoTouch.MapKit; +using MonoTouch.UIKit; +using MonoTouch.OpenGLES; +#endif +using NUnit.Framework; + +namespace LinkSdk { + + [FileIOPermission (SecurityAction.LinkDemand, AllLocalFiles = FileIOPermissionAccess.AllAccess)] + public class SecurityDeclarationDecoratedUserCode { + + [FileIOPermission (SecurityAction.Assert, AllLocalFiles = FileIOPermissionAccess.NoAccess)] + static public bool Check () + { + return true; + } + } + + [TestFixture] + // we want the test to be availble if we use the linker + [Preserve (AllMembers = true)] + public class LinkSdkRegressionTest { + + [Test] + // https://github.com/xamarin/monotouch/commit/cbefbeaea2eda820dfc7214e976edc83a55df38e + public void MonoAssembly_LinkedOut () + { + Assembly a = Assembly.GetExecutingAssembly (); + Assert.That (a.GetType ().Name, Is.EqualTo ("MonoAssembly"), "MonoAssembly"); + } + + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=205 + // https://bugzilla.novell.com/show_bug.cgi?id=688414 + public void Bug205_ExposingIEnumerable () + { + var ds = new DataContractSerializer (typeof (IEnumerable)); + using (var xw = XmlWriter.Create (System.IO.Stream.Null)) + ds.WriteObject (xw, new int [] { 1, 2, 3 }); + // the above should not throw System.Runtime.Serialization.SerializationException + } + + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=233 + public void Bug233_MonoPInvokeCallback () + { + var c = new SqliteConnection ("Data Source=:memory:"); + c.Open (); + c.Update += (sender, e) => {}; + // the above should not crash + c.Close (); + } + + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=234 + public void Bug234_Interlocked () + { + string str = null; + Assert.Null (Interlocked.Exchange (ref str, "one"), "Exchange"); + // the above should not crash with System.ExecutionEngineException + Assert.That (str, Is.EqualTo ("one"), "one"); + } + + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=300 + // http://stackoverflow.com/questions/6517736/monotouch-crash-dictionary-firstordefault-type-initializer-predicateof + public void Bug300_Linker_PredicateOf () + { + Dictionary queued = new Dictionary (); + KeyValuePair valuePair = queued.FirstOrDefault (); + // above should not crash with System.ExecutionEngineException + Assert.NotNull (valuePair); + } + +#if !__WATCHOS__ + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=328 + public void Bug328_CompletionBlock () + { + CATransaction.Begin (); + CATransaction.CompletionBlock = delegate {}; + // the above should not crash with a MonoTouchException + CATransaction.Commit (); + } +#endif // !__WATCHOS__ + +#if !__TVOS__ && !__WATCHOS__ + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=769 + public void Bug769_UnregistredDelegate () + { + var tmp = Class.ThrowOnInitFailure; + Class.ThrowOnInitFailure = false; + try { + Assert.NotNull (new MKMapViewDelegate ()); + // the above should not throw an Exception + } finally { + Class.ThrowOnInitFailure = tmp; + } + } +#endif // !__TVOS__ && !__WATCHOS__ + +#if !__WATCHOS__ + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=865 + public void Bug865_CanOpenUrl () + { + Assert.False (UIApplication.SharedApplication.CanOpenUrl (null), "null"); + // the above should not throw an ArgumentNullException + // and that's important because NSUrl.FromString and NSUrl.ctor(string) differs + const string bad_tel = "tel://1800 023 009"; + Assert.Null (NSUrl.FromString (bad_tel), "bad url"); + // we now throw if `init*` fails + Assert.Throws (() => new NSUrl (bad_tel), "ctor, bad url"); + } +#endif // !__WATCHOS__ + + [Test] + // issue indirectly found when trying: http://bugzilla.xamarin.com/show_bug.cgi?id=928 + // similar to MonoAssembly_LinkedOut + // https://github.com/xamarin/monotouch/commit/409316f87f23723a384cb072163abd03ae7e6045 + public void Bug928_MonoModule_LinkedOut () + { + Module m = Assembly.GetExecutingAssembly ().ManifestModule; + Assert.That (m.GetType ().Name, Is.EqualTo ("MonoModule"), "MonoModule"); + } + +#if !__TVOS__ && !__WATCHOS__ + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=980 + public void Bug980_AddressBook_NRE () + { + using (ABPeoplePickerNavigationController picker = new ABPeoplePickerNavigationController ()) { + // no NRE should occur + if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) + Assert.Null (picker.AddressBook); + else + Assert.NotNull (picker.AddressBook); + } + } + + [Test] + public void AddressBook_Constants () + { + // we want to ensure we can get the constants without authorization (on iOS 6.0+) so this application + // needs to be unauthorized (in settings.app). Note: authorization checks only occurs on devices + if ((Runtime.Arch == Arch.DEVICE) && UIDevice.CurrentDevice.CheckSystemVersion (6,0)) { + Assert.That (ABAddressBook.GetAuthorizationStatus (), Is.Not.EqualTo (ABAuthorizationStatus.Authorized), + "Please deny access to contacts for this this application (it's important for this test)"); + } + Assert.IsNotNull (ABPersonAddressKey.City, "ABPersonAddressKey"); + } +#endif // !__TVOS__ && !__WATCHOS__ + + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=1387 + public void Bug1387_UIEdgeInsets_ToString () + { + var insets = new UIEdgeInsets (1, 2, 3, 4); + Assert.False (insets.ToString ().Contains ("UIEdgeInsets")); + } + + void CheckExceptionDetailProperty (PropertyInfo pi) + { + bool data_member = true; + foreach (var ca in pi.GetCustomAttributes (false)) { + if (ca is DataMemberAttribute) { + data_member = true; + break; + } + } + // to be valid both getter and setter must be present if [DataMember] + if (data_member) { + Assert.NotNull (pi.GetGetMethod (true), "get_" + pi.Name); + Assert.NotNull (pi.GetSetMethod (true), "set_" + pi.Name); + } else { + // check well-known [DataMember] + switch (pi.Name) { + case "HelpLink": + case "InnerException": + case "Message": + case "StackTrace": + case "Type": + Assert.Fail ("{0} is missing it's [DataMember] attribute", pi.Name); + break; + } + } + } + + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=1415 + public void Bug1415_Linker_DataMember () + { + // the typeof ensure we're can't (totally) link away System.ServiceModel.dll + Type ed = typeof (System.ServiceModel.AuditLevel).Assembly.GetType ("System.ServiceModel.ExceptionDetail", false); + // which means it's [DataContract] / [DataMember] should not be linked out + // even if we're not specifically using them (and without [Preserve] being added) + // which is important since System.ServiceModel.dll is an SDK assembly + Assert.NotNull (ed, "ExceptionDetail"); + bool help_link = false; + bool inner_exception = false; + bool message = false; + bool stack_trace = false; + bool type = false; + foreach (var pi in ed.GetProperties ()) { + CheckExceptionDetailProperty (pi); + switch (pi.Name) { + case "HelpLink": + help_link = true; + break; + case "InnerException": + inner_exception = true; + break; + case "Message": + message = true; + break; + case "StackTrace": + stack_trace = true; + break; + case "Type": + type = true; + break; + } + } + // ensure all properties are still present + Assert.True (help_link, "HelpLink"); + Assert.True (inner_exception, "InnerException"); + Assert.True (message, "Message"); + Assert.True (stack_trace, "StackTrace"); + Assert.True (type, "Type"); + } + + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=1415 + // not really part of the bug - but part of the same fix + public void Bug1415_Linker_XmlAttribute () + { + // the typeof ensure we're can't (totally) link away System.ServiceModel.dll + Type ed = typeof (System.ServiceModel.AuditLevel).Assembly.GetType ("System.ServiceModel.EndpointAddress10", false); + // type is decorated with both [XmlSchemaProvider] and [XmlRoot] + Assert.NotNull (ed, "EndpointAddress10"); + +#if !__WATCHOS__ // FIXME: this needs to use a different type than OpenTK.Quaternion, so that the test can run on WatchOS as wells + var q = new OpenTK.Quaternion (); + Assert.Null (q.GetType ().GetProperty ("XYZ"), "XmlIgnore"); + // should be null if application is linked (won't be if "Don't link" is used) +#endif // !__WATCHOS__ + } + + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=1443 + public void Bug1443_Linq_Aot () + { + List list = new List (); + Dictionary dict = new Dictionary (); + list.AddRange (from kv in dict orderby kv.Key select kv.Value.ToString ()); + // should not throw an ExecutionEngineException on devices + } + +#if !__TVOS__ && !__WATCHOS__ + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=1516 + public void Bug1516_Appearance_Linker () + { + // iOS7, since DP3, validates ?some? appearance properties, e.g. + // Objective-C exception thrown. Name: NSInvalidArgumentException Reason: -setTintColor: is not allowed for use with the appearance proxy. Perhaps you want to use the barTintColor property. + // UINavigationBar.Appearance.TintColor = UIColor.FromRGB (238,234,222); + UINavigationBar.Appearance.SetTitleTextAttributes (new UITextAttributes () { + TextColor = UIColor.FromRGB (85, 108, 17), + TextShadowColor = UIColor.Clear + }); + // should not throw if the application is linked + } +#endif + + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=1790 + public void Bug1790_TimeZoneInfo_Local () + { + // the simulator has complete file access but the device won't have - i.e. we can't depend on it + Assert.That (File.Exists ("/etc/localtime"), Is.EqualTo (Runtime.Arch == Arch.SIMULATOR), "/etc/localtime"); + Assert.NotNull (TimeZoneInfo.Local, "Local"); + // should not throw a TimeZoneNotFoundException on devices + } + + [Test] + // http://bugzilla.xamarin.com/show_bug.cgi?id=1922 + public void Bug1922_PLinq_Aot () + { + const int size = 100; + Random random = new Random (); + int[] values = new int [size]; + int currentNumber = 0; + List numbers = new List (); + while (currentNumber < 100) { + values [currentNumber] = random.Next (1, 10); + numbers.Add (currentNumber); + currentNumber ++; + } + numbers.AsParallel ().ForAll (number => { + Thread.Sleep (values [number]); + //Console.WriteLine (number); + }); + if (Runtime.Arch == Arch.SIMULATOR) + Assert.Inconclusive ("only fails on devices"); + } + + [Test] + public void Bug2000_NSPersistentStoreCoordinator () + { + // from http://www.sgmunn.com/?p=1#comments + NSAttributeDescription description = new NSAttributeDescription (); + Assert.That (description.Handle, Is.Not.EqualTo (IntPtr.Zero), "NSAttributeDescription"); + description.AttributeType = NSAttributeType.Integer32; + description.Name = "SomeId"; + description.Optional = false; + + NSEntityDescription entity = new NSEntityDescription (); + Assert.That (entity.Handle, Is.Not.EqualTo (IntPtr.Zero), "NSEntityDescription"); + entity.Name = "TestEntity"; + entity.Properties = new NSPropertyDescription[1] { description }; + + NSManagedObjectModel model = new NSManagedObjectModel (); + Assert.That (model.Handle, Is.Not.EqualTo (IntPtr.Zero), "NSManagedObjectModel"); + model.Entities = new NSEntityDescription[1] { entity }; + model.SetEntities (model.Entities, String.Empty); + + NSUrl url = new NSUrl ("test.sqlite", false); + + // from http://bugzilla.xamarin.com/show_bug.cgi?id=2000 + NSError error; + var c = new NSPersistentStoreCoordinator (model); + c.AddPersistentStoreWithType (NSPersistentStoreCoordinator.SQLiteStoreType, null, url, null, out error); + Assert.True (Runtime.Arch == Arch.SIMULATOR ? error == null : error.Code == 512, "error"); + } + + [Test] + // http://lists.ximian.com/pipermail/monotouch/2011-December/006976.html + public void Linker_RuntimeWrappedException () + { + try { + // can't throw anything else but Exception-derived types from C# + support.throw_object (); + } + catch (Exception e) { + Assert.That (e.GetType ().Name, Is.EqualTo ("RuntimeWrappedException"), "RuntimeWrappedException"); + } + } + + [Test] + // http://stackoverflow.com/questions/8602726/cant-open-sqlite-database-in-read-only-mode + public void Sqlite_ReadOnly () + { + var c = new SqliteConnection ("Data Source=:memory:;Read Only=true"); + c.Open (); + // the above should not throw a 'misuse' exception + c.Close (); + } + + [Test] + public void AsQueryable_3028 () + { + string [] foos = new string [] { "hi", "bye" }; + string f = foos.AsQueryable ().First (); + Assert.That (f, Is.EqualTo ("hi"), "f"); + } + +#if !__WATCHOS__ + [Test] + public void OpenTk_3049 () + { + using (var gc1 = OpenTK.Platform.Utilities.CreateGraphicsContext (EAGLRenderingAPI.OpenGLES1)) { + Assert.NotNull (gc1); + } + using (var gc2 = OpenTK.Platform.Utilities.CreateGraphicsContext (EAGLRenderingAPI.OpenGLES2)) { + Assert.NotNull (gc2); + } + } + + [Test] + public void OpenTk_Preserved () + { +#if XAMCORE_2_0 + const string OpenTKAssembly = "OpenTK-1.0"; +#else + const string OpenTKAssembly = "OpenTK"; +#endif + var gl = Type.GetType ("OpenTK.Graphics.ES11.GL, " + OpenTKAssembly, false); + Assert.NotNull (gl, "ES11/GL"); + var core = Type.GetType ("OpenTK.Graphics.ES11.GL/Core, " + OpenTKAssembly, false); + Assert.NotNull (core, "ES11/Core"); + + gl = Type.GetType ("OpenTK.Graphics.ES20.GL, " + OpenTKAssembly, false); + Assert.NotNull (gl, "ES20/GL"); + core = Type.GetType ("OpenTK.Graphics.ES20.GL/Core, " + OpenTKAssembly, false); + Assert.NotNull (core, "ES20/Core"); + } +#endif // !__WATCHOS__ + + [Test] + public void XElement_3137 () + { + CultureInfo current = Thread.CurrentThread.CurrentCulture; + try { + Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US"); + var element1 = new System.Xml.Linq.XElement ("Property1", new System.Xml.Linq.XAttribute ("type", "number"), 1.2343445); + Assert.That (element1.ToString (), Is.EqualTo ("1.2343445"), "en-US"); + + Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo ("de-DE"); + // this was already working because the element was created with en-US + Assert.That (element1.ToString (), Is.EqualTo ("1.2343445"), "de-DE/1"); + // however creating a new, identical, element under de-DE return*ed* a different string + var element2 = new System.Xml.Linq.XElement ("Property1", new System.Xml.Linq.XAttribute ("type", "number"), 1.2343445); + Assert.That (element2.ToString (), Is.EqualTo ("1.2343445"), "de-DE/2"); + } + finally { + Thread.CurrentThread.CurrentCulture = current; + } + } + +#if !__TVOS__ && !__WATCHOS__ + [Test] + public void Modal_3489 () + { + using (UIViewController a = new UIViewController ()) + using (UIViewController b = new UIViewController ()) + using (UIViewController c = new UIViewController ()) { + a.PresentModalViewController (b, true); + b.PresentModalViewController (c, true); + +#if XAMCORE_2_0 + b.DismissModalViewController (true); + a.DismissModalViewController (true); //error +#else + b.DismissModalViewControllerAnimated (true); + a.DismissModalViewControllerAnimated (true); //error +#endif + } + } +#endif // !__TVOS__ && !__WATCHOS__ + + [Test] + public void TypeDescriptor_A7793 () + { + Assert.NotNull (TypeDescriptor.GetConverter (typeof (bool))); + } + + [Test] + public void Parse_3677 () + { + Assert.That (sbyte.Parse ("E3", NumberStyles.HexNumber), Is.EqualTo (-29), "SByte"); + Assert.That (short.Parse ("E3E3", NumberStyles.HexNumber), Is.EqualTo (-7197), "Int16"); + } + + public class DeviceHardware { + public const string HardwareProperty = "hw.machine"; + + public enum HardwareVersion { + iPhone, + iPhone3G, + iPhone3GS, + iPhone4, + iPod1G, + iPod2G, + iPod3G, + iPod4G, + iPad, + iPhoneSimulator, + iPhone4Simulator, + iPadSimulator, + Unknown + } + + // Changing the constant to "/usr/bin/libSystem.dylib" allows this P/Invoke to work on Mac OS X + // Using "hw.model" as property gives Macintosh model, "hw.machine" kernel arch (ppc, ppc64, i386, x86_64) + [DllImport (Constants.libSystemLibrary)] + internal static extern int sysctlbyname ([MarshalAs(UnmanagedType.LPStr)] string property, // name of the property + IntPtr output, // output + IntPtr oldLen, // IntPtr.Zero + IntPtr newp, // IntPtr.Zero + uint newlen // 0 + ); + + public static HardwareVersion Version { + get { + // get the length of the string that will be returned + var pLen = Marshal.AllocHGlobal(sizeof(int)); + sysctlbyname(DeviceHardware.HardwareProperty, IntPtr.Zero, pLen, IntPtr.Zero, 0); + + var length = Marshal.ReadInt32(pLen); + + // check to see if we got a length + if (length == 0) + { + Marshal.FreeHGlobal(pLen); + return HardwareVersion.Unknown; + } + + // get the hardware string + var pStr = Marshal.AllocHGlobal(length); + sysctlbyname(DeviceHardware.HardwareProperty, pStr, pLen, IntPtr.Zero, 0); + + // convert the native string into a C# string + var hardwareStr = Marshal.PtrToStringAnsi(pStr); + var ret = HardwareVersion.Unknown; + + // determine which hardware we are running + if (hardwareStr == "iPhone1,1") + ret = HardwareVersion.iPhone; + else if (hardwareStr == "iPhone1,2") + ret = HardwareVersion.iPhone3G; + else if (hardwareStr == "iPhone2,1") + ret = HardwareVersion.iPhone3GS; + else if (hardwareStr == "iPhone3,1") + ret = HardwareVersion.iPhone4; + else if (hardwareStr == "iPad1,1") + ret = HardwareVersion.iPad; + else if (hardwareStr == "iPod1,1") + ret = HardwareVersion.iPod1G; + else if (hardwareStr == "iPod2,1") + ret = HardwareVersion.iPod2G; + else if (hardwareStr == "iPod3,1") + ret = HardwareVersion.iPod3G; + else if (hardwareStr == "iPod4,1") + ret = HardwareVersion.iPod3G; + else if (hardwareStr == "i386" || hardwareStr == "x86_64") { +#if __WATCHOS__ + ret = HardwareVersion.Unknown; +#else + if (UIDevice.CurrentDevice.Model.Contains("iPhone")) + ret = UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale == 960 || UIScreen.MainScreen.Bounds.Width * UIScreen.MainScreen.Scale == 960 ? HardwareVersion.iPhone4Simulator : HardwareVersion.iPhoneSimulator; + else + ret = HardwareVersion.iPadSimulator; +#endif + } + else ret = HardwareVersion.Unknown; + + // cleanup + Marshal.FreeHGlobal(pLen); + Marshal.FreeHGlobal(pStr); + + return ret; + } + } + } + + [Test] + // http://stackoverflow.com/questions/9685134/monotouch-fatal-crash-once-deployed + // could not be duplicated on iPad2 (rolf), iPad1 (spouliot), iPodTouch4 (spouliot) + public void Hardware_SO () + { + Assert.NotNull (DeviceHardware.Version, "Hardware"); + } + + public class Location {} + + private static Location mInstance = null; + + [MethodImpl (MethodImplOptions.Synchronized)] + public static Location getInstance () + { + if (mInstance == null) + mInstance = new Location (); + return mInstance; + } + + [Test] + public void Synchronized_3904 () + { + // crash with LLVM + Assert.NotNull (getInstance (), "Location"); + } + + [Test] + [Culture ("en")] + public void Json_Parse_4415 () + { + var f = 4.25987E-06f; + // note: always use '.' see http://www.json.org/fatfree.html + var s = f.ToString (); + var v = JsonValue.Parse (s); + Assert.AreEqual (f, (float) v, "Parse Negative Exponent"); + f *= 10; + Assert.AreNotEqual (f, (float) v, "non-equal"); + } + + [Test] + [Culture ("en")] + public void ConvertToDouble_4620 () + { + // can't duplicate bug when using invarient culture + Assert.That (Convert.ToDouble ("0.0"), Is.EqualTo (0.0d)); + } + + [Test] + public void NetworkInterface_4631 () + { + Assert.NotNull (NetworkInterface.GetAllNetworkInterfaces ()); + } + + [Test] + public void WebClient_SSL_Leak () + { + WebClient wc = new WebClient (); + // note: needs to be executed under Instrument to verify it does not leak + string s = wc.DownloadString ("https://developers.google.com"); + Assert.NotNull (s); + } + +#if !__TVOS__ && !__WATCHOS__ + [Test] + public void WebProxy_Leak () + { + // note: needs to be executed under Instrument to verify it does not leak + Assert.NotNull (CFNetwork.GetSystemProxySettings (), "should not leak"); + } +#endif // !__TVOS__ && !__WATCHOS__ + + [Test] + // https://bugzilla.novell.com/show_bug.cgi?id=650402 + public void ForeignKey_650402 () + { + DataSet data = new DataSet (); + DataTable parent = new DataTable ("parent"); + DataColumn pk = parent.Columns.Add ("PK"); + DataTable child = new DataTable ("child"); + DataColumn fk = child.Columns.Add ("FK"); + + data.Tables.Add (parent); + data.Tables.Add (child); + data.Relations.Add (pk, fk); + + parent.Rows.Add ("value"); + child.Rows.Add ("value"); + data.AcceptChanges (); + child.Rows[0].Delete (); + parent.Rows[0][0] = "value2"; + + data.EnforceConstraints = false; + data.EnforceConstraints = true; + } + + [Test] + public void Pointer_5200 () + { + // ensure the linker did not remove the type, which is used by the runtime + Assert.NotNull (Type.GetType ("System.Reflection.Pointer, mscorlib")); + } + + [Test] + public void LockRecursionException_5311 () + { + Assert.Throws (delegate { throw new LockRecursionException (); }); + } + + class AddedInSilverlight5 : INotifyPropertyChanging { + public event PropertyChangingEventHandler PropertyChanging; + } + + [Test] + public void INotifyPropertyChanging_5337 () + { + new AddedInSilverlight5 ().PropertyChanging += delegate { }; + } + + [Test] + public void MonoIOStat_6118 () + { + string file = NSBundle.MainBundle.ExecutablePath; + DateTime c1 = File.GetCreationTime (file).ToUniversalTime (); + DateTime c2 = (DateTime) NSFileManager.DefaultManager.GetAttributes (file).CreationDate; + Assert.That ((c1 - c2).Seconds, Is.LessThan (30), "MonoIOStat"); + } + + [Test] + public void ObjectHandleCtor () + { + Type o = typeof (Object); + // this returns a new System.Runtime.Remoting.ObjectHandle which (was) linked away previously + Assert.NotNull (Activator.CreateInstance (o.Assembly.GetName ().Name, o.FullName), "ObjectHandle"); + } + + [Test] + public void AttributeUsageAttribute_Persistance () + { + Assert.IsFalse (Attribute.IsDefined (GetType (), typeof(SerializableAttribute))); + } + + [Test] + [ExpectedException (typeof (NotSupportedException))] + public void LinkedAway () + { + new System.Runtime.Remoting.RemotingException (); + } + + [Test] + public void ArrayClear_11184 () + { + byte[] key = new byte [16]; + for (int i = 0; i < key.Length; i++) + key [i] = (byte) (255 - i); + Array.Clear (key, 5, 11); + for (int i = 5; i < key.Length; i++) + Assert.That (key [i], Is.EqualTo (0), i.ToString ()); + } + + public class Demo_14493 { + public void Update (object o) + { + } + } + + [Test] + public void Action_14493 () + { + var Demo = new Demo_14493 (); + Action a = null; + a += Demo.Update; + a -= Demo.Update; // Crash here + } + + enum AnEnum { + First = 1, + Second = 2 + }; + + [Test] + public void AotGcMemmove_Crash_17284 () + { + var arr = new AnEnum [16]; + var c = new ReadOnlyCollection (arr); + Assert.False (c.Contains (AnEnum.First)); + } + + enum MyEnum { + AValue, + AnotherValue + } + + [Test] + public void Aot_Gsharedvt_21893 () + { + IList _myValues = new List { MyEnum.AValue }; + bool pleaseDontCrash = _myValues.Contains (MyEnum.AnotherValue); + Assert.False (pleaseDontCrash); + } + + [Test] + public void PrivateMemorySize64 () + { + // ref: https://bugzilla.xamarin.com/show_bug.cgi?id=21882 + var mem = System.Diagnostics.Process.GetCurrentProcess ().PrivateMemorySize64; + // the above used a mach call that iOS samdbox did *not* allow (sandbox) on device + // but has been fixed (different call) for the same PID + Assert.That (mem, Is.Not.EqualTo (0), "PrivateMemorySize64"); + } + + string TestFolder (Environment.SpecialFolder folder, bool supported = true, bool exists = true, bool readOnly = false) + { + var path = Environment.GetFolderPath (folder); + Assert.That (path.Length > 0, Is.EqualTo (supported), folder.ToString ()); + if (!supported) + return path; + + Assert.That (Directory.Exists (path), Is.EqualTo (exists), path); + if (!exists) + return path; + + string file = Path.Combine (path, "temp.txt"); + try { + File.WriteAllText (file, "mine"); + Assert.False (readOnly, "!readOnly " + folder); + } + catch { + Assert.True (readOnly, "readOnly " + folder); + } + finally { + File.Delete (file); + } + return path; + } + + [Test] + public void SpecialFolder () + { + // iOS8 changes the rules of the game + var fm = NSFileManager.DefaultManager; + var docs = fm.GetUrls (NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User) [0].Path; + var libs = fm.GetUrls (NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomain.User) [0].Path; + + // note: this test is more interesting on devices because of the sandbox they have + bool device = Runtime.Arch == Arch.DEVICE; + + // some stuff we do not support (return String.Empty for the path) + TestFolder (Environment.SpecialFolder.Programs, supported: false); + TestFolder (Environment.SpecialFolder.Startup, supported: false); + TestFolder (Environment.SpecialFolder.Recent, supported: false); + TestFolder (Environment.SpecialFolder.SendTo, supported: false); + TestFolder (Environment.SpecialFolder.StartMenu, supported: false); + TestFolder (Environment.SpecialFolder.MyComputer, supported: false); + TestFolder (Environment.SpecialFolder.NetworkShortcuts, supported: false); + TestFolder (Environment.SpecialFolder.CommonStartMenu, supported: false); + TestFolder (Environment.SpecialFolder.CommonPrograms, supported: false); + TestFolder (Environment.SpecialFolder.CommonStartup, supported: false); + TestFolder (Environment.SpecialFolder.CommonDesktopDirectory, supported: false); + TestFolder (Environment.SpecialFolder.PrinterShortcuts, supported: false); + TestFolder (Environment.SpecialFolder.Cookies, supported: false); + TestFolder (Environment.SpecialFolder.History, supported: false); + TestFolder (Environment.SpecialFolder.Windows, supported: false); + TestFolder (Environment.SpecialFolder.System, supported: false); + TestFolder (Environment.SpecialFolder.SystemX86, supported: false); + TestFolder (Environment.SpecialFolder.ProgramFilesX86, supported: false); + TestFolder (Environment.SpecialFolder.CommonProgramFiles, supported: false); + TestFolder (Environment.SpecialFolder.CommonProgramFilesX86, supported: false); + TestFolder (Environment.SpecialFolder.CommonDocuments, supported: false); + TestFolder (Environment.SpecialFolder.CommonAdminTools, supported: false); + TestFolder (Environment.SpecialFolder.AdminTools, supported: false); + TestFolder (Environment.SpecialFolder.CommonMusic, supported: false); + TestFolder (Environment.SpecialFolder.CommonPictures, supported: false); + TestFolder (Environment.SpecialFolder.CommonVideos, supported: false); + TestFolder (Environment.SpecialFolder.LocalizedResources, supported: false); + TestFolder (Environment.SpecialFolder.CommonOemLinks, supported: false); + TestFolder (Environment.SpecialFolder.CDBurning, supported: false); + + // some stuff we return a value - but the directory does not exists + + var path = TestFolder (Environment.SpecialFolder.Desktop, exists: false); + + path = TestFolder (Environment.SpecialFolder.Favorites, exists: false); + + path = TestFolder (Environment.SpecialFolder.MyMusic, exists: false); + + path = TestFolder (Environment.SpecialFolder.MyVideos, exists: false); + + path = TestFolder (Environment.SpecialFolder.DesktopDirectory, exists: false); + + path = TestFolder (Environment.SpecialFolder.Fonts, exists: false); + + path = TestFolder (Environment.SpecialFolder.Templates, exists: false); + + path = TestFolder (Environment.SpecialFolder.MyPictures, exists: false); + + path = TestFolder (Environment.SpecialFolder.CommonTemplates, exists: false); + + // some stuff we return and are usable either as read-only + path = TestFolder (Environment.SpecialFolder.CommonApplicationData, readOnly: true); + Assert.That (path, Is.EqualTo ("/usr/share"), "path - CommonApplicationData"); + + // and the simulator is more lax + path = TestFolder (Environment.SpecialFolder.ProgramFiles, readOnly: device); + Assert.That (path, Is.EqualTo ("/Applications"), "path - ProgramFiles"); + + path = TestFolder (Environment.SpecialFolder.UserProfile, readOnly: device); + if (Runtime.Arch == Arch.DEVICE) { +#if __WATCHOS__ + Assert.True (path.StartsWith ("/private/var/mobile/Containers/Data/Application/", StringComparison.Ordinal), "Containers-ios8"); +#else + if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) + Assert.True (path.StartsWith ("/private/var/mobile/Containers/Data/Application/", StringComparison.Ordinal), "Containers-ios8"); + else + Assert.True (path.StartsWith ("/private/var/mobile/Applications/", StringComparison.Ordinal), "pre-Containers"); +#endif + } + +#if !__WATCHOS__ + // tvOS (device sandbox) is more restricive than iOS as it limit access to more + // directories, mostly because they are not guaranteed to be preserved between executions + bool tvos = UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.TV; + if (tvos) + docs = Path.Combine (libs, "Caches", "Documents"); +#else + bool tvos = false; +#endif + + // and some stuff is read/write + path = TestFolder (Environment.SpecialFolder.MyDocuments); + Assert.That (path, Is.EqualTo (docs), "path - MyDocuments"); + + path = TestFolder (Environment.SpecialFolder.ApplicationData); + Assert.That (path, Is.EqualTo (docs + "/.config"), "path - ApplicationData"); + + path = TestFolder (Environment.SpecialFolder.LocalApplicationData); + Assert.That (path, Is.EqualTo (docs), "path - LocalApplicationData"); + + path = TestFolder (Environment.SpecialFolder.InternetCache); + Assert.That (path, Is.EqualTo (libs + "/Caches"), "path - InternetCache"); + + // new: expose NSLibraryDirectory from Environment.GetFolder + path = TestFolder (Environment.SpecialFolder.Resources, readOnly: tvos && device); + Assert.True (path.EndsWith ("/Library", StringComparison.Ordinal), "Resources"); + } + +#if !__WATCHOS__ + [Test] + public void Events () + { + using (var tv = new UITextView ()) { + Assert.Null (tv.WeakDelegate, "none"); + // event on UITextView itself + tv.Ended += (object sender, EventArgs e) => {}; + + var t = tv.WeakDelegate.GetType (); + Assert.That (t.Name, Is.EqualTo ("_UITextViewDelegate"), "textview"); + + var fi = t.GetField ("editingEnded", BindingFlags.NonPublic | BindingFlags.Instance); + Assert.NotNull (fi, "editingEnded"); + var value = fi.GetValue (tv.WeakDelegate); + Assert.NotNull (value, "value"); + +#if XAMCORE_2_0 + // and on the UIScrollView defined one + tv.Scrolled += (object sender, EventArgs e) => {}; + // and the existing (initial field) is still set + fi = t.GetField ("editingEnded", BindingFlags.NonPublic | BindingFlags.Instance); + Assert.NotNull (fi, "editingEnded/scrollview"); +#else + // In Classic UITextView also defines a Scrolled event, so make sure we get the UIScrollView one. + ((UIScrollView) tv).Scrolled += (object sender, EventArgs e) => {}; + + t = tv.WeakDelegate.GetType (); + Assert.That (t.Name, Is.EqualTo ("_UIScrollViewDelegate"), "scrollview"); + + fi = t.GetField ("editingEnded", BindingFlags.NonPublic | BindingFlags.Instance); + Assert.Null (fi, "editingEnded/scrollview"); +#endif + } + } +#endif // !__WATCHOS__ + + [Test] + public void SecurityDeclaration () + { + // note: security declarations != custom attributes + // we ensure that we can create the type / call the code + Assert.True (SecurityDeclarationDecoratedUserCode.Check (), "call"); + // we ensure that both the permission and the flag are NOT part of the final/linked binary (link removes security declarations) + Assert.Null (Type.GetType ("System.Security.Permissions.FileIOPermissionAttribute, mscorlib"), "FileIOPermissionAttribute"); + Assert.Null (Type.GetType ("System.Security.Permissions.FileIOPermissionAccess, mscorlib"), "FileIOPermissionAccess"); + } + +#if !__WATCHOS__ + [Test] + public void UIButtonSubclass () + { + // ensure the linker keeps the .ctor(UIButtonType) around + using (var b = new UIButton (UIButtonType.Custom)) { + // https://trello.com/c/Nf2B8mIM/484-remove-debug-code-in-the-linker + var m = typeof (UIButton).GetMethod ("VerifyIsUIButton", BindingFlags.Instance | BindingFlags.NonPublic); +#if DEBUG + // kept in debug builds + Assert.NotNull (m, "VerifyIsUIButton"); +#else + // removed from release builds + Assert.Null (m, "VerifyIsUIButton"); +#endif + } + } + +#endif // !__WATCHOS__ + + [Test] + public void MonoRuntime34671 () + { + Assert.NotNull (Type.GetType ("Mono.Runtime"), "Mono.Runtime"); + } + + [Test] + public void TraceListeners36255 () + { + Trace.Close (); // here too + Assert.NotNull (Trace.Listeners, "C6 had a SecurityPermission call"); + } + + [Test] + public void TlsProvider_Apple () + { + var provider = Mono.Security.Interface.MonoTlsProviderFactory.GetProvider (); + Assert.NotNull (provider, "provider"); + Assert.That (provider.ID, Is.EqualTo (new Guid ("981af8af-a3a3-419a-9f01-a518e3a17c1c")), "correct provider"); + } + + [Test] + public void OldTlsProvider_LinkedOut () + { + // make test work for classic (monotouch) and unified (iOS, tvOS and watchOS) + var fqn = typeof (NSObject).AssemblyQualifiedName.Replace ("Foundation.NSObject", "Security.Tls.OldTlsProvider"); + Assert.Null (Type.GetType (fqn), "Should not be included"); + } + + [Test] + public void AppleTls_Default () + { + // make test work for classic (monotouch) and unified (iOS, tvOS and watchOS) + var fqn = typeof (NSObject).AssemblyQualifiedName.Replace ("Foundation.NSObject", "Security.Tls.AppleTlsProvider"); + Assert.NotNull (Type.GetType (fqn), "Should be included"); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link sdk/LocaleTest.cs b/tests/linker-ios/link sdk/LocaleTest.cs new file mode 100644 index 000000000000..6ab488df758a --- /dev/null +++ b/tests/linker-ios/link sdk/LocaleTest.cs @@ -0,0 +1,54 @@ +// Copyright 2016 Xamarin Inc. All rights reserved. + +using System; +using System.Collections.Generic; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkSdk { + + [TestFixture] + // we want the tests to be available because we use the linker + [Preserve (AllMembers = true)] + public class LocaleTest { + + [Test] + [SetCulture ("cs-CZ")] + public void CzechDictComparer () + { + DictComparer (); + } + + [Test] + [SetCulture ("en-US")] + public void EnglishDictComparer () + { + DictComparer (); + } + + [Test] + // runs with whatever the device / simulator is configured + public void DefaultDictComparer () + { + DictComparer (); + } + + void DictComparer () + { + var n1 = "SEARCHFIELDS"; + var n2 = "Searchfields"; + + Assert.True (string.Equals (n1, n2, StringComparison.OrdinalIgnoreCase), "string equality"); + + var dict = new Dictionary (StringComparer.OrdinalIgnoreCase); + dict [n1] = "test"; + + string result; + Assert.True (dict.TryGetValue (n2, out result), "dictionary value"); + } + } +} diff --git a/tests/linker-ios/link sdk/Main.cs b/tests/linker-ios/link sdk/Main.cs new file mode 100644 index 000000000000..c43621acb4e1 --- /dev/null +++ b/tests/linker-ios/link sdk/Main.cs @@ -0,0 +1,26 @@ +#if !__WATCHOS__ +using System; +using System.Collections.Generic; +using System.Linq; +#if XAMCORE_2_0 +using Foundation; +using UIKit; +#else +using MonoTouch.Foundation; +using MonoTouch.UIKit; +#endif + +namespace LinkSdk +{ + public class Application + { + // This is the main entry point of the application. + static void Main (string[] args) + { + // if you want to use a different Application Delegate class from "AppDelegate" + // you can specify it here. + UIApplication.Main (args, null, "AppDelegate"); + } + } +} +#endif // !__WATCHOS__ diff --git a/tests/linker-ios/link sdk/OptimizeGeneratedCodeTest.cs b/tests/linker-ios/link sdk/OptimizeGeneratedCodeTest.cs new file mode 100644 index 000000000000..d0015cb884a6 --- /dev/null +++ b/tests/linker-ios/link sdk/OptimizeGeneratedCodeTest.cs @@ -0,0 +1,223 @@ +// +// Unit tests for the linker's OptimizeGeneratedCodeSubStep +// +// Authors: +// Sebastien Pouliot +// +// Copyright 2012-2013, 2016 Xamarin Inc. All rights reserved. +// + +using System; +using System.IO; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +#if !__WATCHOS__ +using System.Drawing; +#endif +#if XAMCORE_2_0 +using Foundation; +using ObjCRuntime; +using UIKit; +#else +using MonoTouch.Foundation; +using MonoTouch.ObjCRuntime; +using MonoTouch.UIKit; +#endif +using NUnit.Framework; + +#if XAMCORE_2_0 +using SizeF=CoreGraphics.CGSize; +using RectangleF=CoreGraphics.CGRect; +#endif + +namespace Linker.Shared { + + partial class NotPreserved { + +#if !__WATCHOS__ + public void Bug11452 () + { + var button = new UIButton (); + button.TouchCancel += delegate { + if (Runtime.Arch == Arch.SIMULATOR) { + // kaboom + } + }; + } +#endif // !__WATCHOS__ + } + + class NSNotPreserved : NSObject { +#if !__WATCHOS__ + public void Bug11452 () + { + var button = new UIButton (); + button.TouchCancel += delegate { + if (Runtime.Arch == Arch.SIMULATOR) { + // kaboom + } + }; + } +#endif // !__WATCHOS__ + } + + [TestFixture] + // we want the test to be availble if we use the linker + [Preserve (AllMembers = true)] + public class OptimizeGeneratedCodeTest { + + // tests related to IL re-writting inside OptimizeGeneratedCodeSubStep + + // note: the following tests don't really ensure the IL code is ok - + // the best way to be sure if decompiling and reviewing the IL. OTOH + // it's pretty likely to crash if the IL was badly rewritten so running + // them makes me feel better ;-) + +#if !__TVOS__ && !__WATCHOS__ + [Test] + public void IsNewRefcountEnabled () + { + using (UIWebView wv = new UIWebView ()) { + Assert.Null (wv.Request, "IsNewRefcountEnabled"); + } + } + + class MyUIWebViewDelegate : UIWebViewDelegate { + } + + [Test] + public void MarkDirty () + { + using (UIWebView wv = new UIWebView ()) + using (MyUIWebViewDelegate del = new MyUIWebViewDelegate ()) { + wv.WeakDelegate = del; + Assert.That (wv.WeakDelegate, Is.EqualTo (del), "MarkDirty"); + } + } + + // this has a (single) "if (Runtime.Arch == Arch.DEVICE)" condition + + [Test] + public void SingleRuntimeArchDevice () + { + SizeF empty = SizeF.Empty; + using (UIView v = new UIView ()) + using (UIFont font = UIFont.SystemFontOfSize (12f)) { + SizeF size = "MonoTouch".StringSize (font); + Assert.False (size.IsEmpty, "!Empty"); + } + } +#endif // !__TVOS__ + + // this has 2 "if (Runtime.Arch == Arch.DEVICE)" conditions separated + // by "if (IsDirectBinding)" so modifying IL is a bit more tricky - so + // testing this, linked on both the simulator and on device is important + +#if !__WATCHOS__ + [Test] + public void DoubleRuntimeArchDevice () + { + SizeF empty = SizeF.Empty; + using (UIView v = new UIView ()) { + Assert.True (v.SizeThatFits (empty).IsEmpty, "Empty"); + } + } +#endif // !__WATCHOS__ + + // some UIImage bindings are now decorated with [Autorelease] and that + // MUST be considered since it adds a try/finally for the C# using + + [Test] + public void Autorelease () + { + using (UIImage img = new UIImage ()) { + // those are the two UIImage instance methods decorated with [Autorelease] +#if !__TVOS__ + img.StretchableImage (10, 10); +#endif + img.CreateResizableImage (new UIEdgeInsets (1, 2, 3, 4)); + // note: return value is null for iOS7 (and was non-null before it) + // anyway we care about not crashing due to the linker optimizing the IL, not the return values + } + } + +#if !__WATCHOS__ + [Test] + public void AnonymousDelegate () + { + // anonymous delegates are decorated with [CompilerGenerated] attributes but must + // not be processed since the IL inside them is not compiler generated + new NotPreserved ().Bug11452 (); + + using (var ns = new NSNotPreserved ()) { + ns.Bug11452 (); + } + } +#endif // !__WATCHOS__ + +#if LINKALL + [Test] + // the two attributes below are required for the optimizing code to kick in. + [CompilerGenerated] + [Export ("dummy")] + public void IntPtrSizeOptimization () + { + // bug #21541. + Marshal.FreeHGlobal (Marshal.AllocHGlobal (IntPtr.Size)); + + if (IntPtr.Size == 8) { + Console.WriteLine (0x11111111); + } else { + Console.WriteLine (0x22222222); + } + + var arr = MethodInfo.GetCurrentMethod ().GetMethodBody ().GetILAsByteArray (); + if (arr.Length < 2) // single `ret` instruction is added by the stripper + Assert.Inconclusive ("IL was stripped from the assembly (release mode)"); + + bool contains11 = false; + bool contains22 = false; + for (int i = 0; i < arr.Length - 4; i++) { + contains11 |= arr [i] == 0x11 && arr [i + 1] == 0x11 && arr [i + 2] == 0x11 && arr [i + 3] == 0x11; + contains22 |= arr [i] == 0x22 && arr [i + 1] == 0x22 && arr [i + 2] == 0x22 && arr [i + 3] == 0x22; + + } + // the optimization is turned off in case of fat apps (32/64 bits) + bool b32 = Directory.Exists (Path.Combine (NSBundle.MainBundle.BundlePath, ".monotouch-32")); + bool b64 = Directory.Exists (Path.Combine (NSBundle.MainBundle.BundlePath, ".monotouch-64")); + // classic does not use the subdirectories, neither do we for single arch simulator + bool classic_or_sim = !b32 && !b64; + bool single_arch = !(b32 && b64); + if (classic_or_sim || single_arch) + Assert.IsFalse (contains11 && contains22, "neither instructions removed"); + // even if disabled this condition remains + Assert.IsFalse (!contains11 && !contains22, "both instructions removed"); + } + + [Test] + public void FinallyTest () + { + // bug #26415 + FinallyTestMethod (); + Assert.IsTrue (finally_invoked); + } + + bool finally_invoked; + [Export ("finallyTestMethod")] + [CompilerGenerated] + public IntPtr FinallyTestMethod () + { + try { + if (IntPtr.Size == 8) { + return IntPtr.Zero; + } else { + return IntPtr.Zero; + } + } finally { + finally_invoked = true; + } + } +#endif + } +} \ No newline at end of file diff --git a/tests/linker-ios/link sdk/PclTest.cs b/tests/linker-ios/link sdk/PclTest.cs new file mode 100644 index 000000000000..afbc354dd092 --- /dev/null +++ b/tests/linker-ios/link sdk/PclTest.cs @@ -0,0 +1,122 @@ +using System; +using System.IO; +using System.Net; +using System.ServiceModel; +using System.ServiceModel.Channels; +using System.Windows.Input; +using System.Xml; +#if XAMCORE_2_0 +using Foundation; +using ObjCRuntime; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkSdk { + + [TestFixture] + [Preserve (AllMembers = true)] + public class PclTest { + + [Test] + public void Corlib () + { + BinaryWriter bw = new BinaryWriter (Stream.Null); + bw.Dispose (); + } + + [Test] + public void System () + { + const string url = "http://www.google.com"; + Uri uri = new Uri (url); + + Assert.False (this is ICommand, "ICommand"); + + HttpWebRequest hwr = new HttpWebRequest (uri); + try { + Assert.True (hwr.SupportsCookieContainer, "SupportsCookieContainer"); + } + catch (NotImplementedException) { + // feature is not available, but the symbol itself is needed + } + + WebResponse wr = hwr.GetResponse (); + try { + Assert.True (wr.SupportsHeaders, "SupportsHeaders"); + } + catch (NotImplementedException) { + // feature is not available, but the symbol itself is needed + } + wr.Dispose (); + + try { + Assert.NotNull (WebRequest.CreateHttp (url)); + } + catch (NotImplementedException) { + // feature is not available, but the symbol itself is needed + } + + try { + Assert.NotNull (WebRequest.CreateHttp (uri)); + } + catch (NotImplementedException) { + // feature is not available, but the symbol itself is needed + } + } + + [Test] + public void ServiceModel () + { + AddressHeaderCollection ahc = new AddressHeaderCollection (); + try { + ahc.FindAll (null, null); + } + catch (NotImplementedException) { + // feature is not available, but the symbol itself is needed + } + + try { + FaultException.CreateFault (null, String.Empty, null); + } + catch (NotImplementedException) { + // feature is not available, but the symbol itself is needed + } + } + + [Test] + public void Xml () + { + try { + XmlConvert.VerifyPublicId (String.Empty); + } + catch (NotImplementedException) { + // feature is not available, but the symbol itself is needed + } + + try { + XmlConvert.VerifyWhitespace (String.Empty); + } + catch (NotImplementedException) { + // feature is not available, but the symbol itself is needed + } + + try { + XmlConvert.VerifyXmlChars (String.Empty); + } + catch (NotImplementedException) { + // feature is not available, but the symbol itself is needed + } + + var xr = XmlReader.Create (Stream.Null); + xr.Dispose (); + + var xw = XmlWriter.Create (Stream.Null); + xw.Dispose (); + + XmlReaderSettings xrs = new XmlReaderSettings (); + xrs.DtdProcessing = DtdProcessing.Ignore; + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link sdk/ReflectionTest.cs b/tests/linker-ios/link sdk/ReflectionTest.cs new file mode 100644 index 000000000000..fcd12a29921f --- /dev/null +++ b/tests/linker-ios/link sdk/ReflectionTest.cs @@ -0,0 +1,43 @@ +// Copyright 2016 Xamarin Inc. All rights reserved. + +using System; +using System.Reflection; +#if XAMCORE_2_0 +using Foundation; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace Linker.Shared.Reflection { + + [TestFixture] + // we want the tests to be available because we use the linker + [Preserve (AllMembers = true)] + public class ReflectionTest { + + public void MethodWithParameters (string firstParameter, int secondParameter) + { + } + + [Test] + public void ParameterInfoName () + { + // linker will disable the metadata removal optimization if that property is used by user code + // however it's used inside mscorlib.dll (and SDK) so it cannot be checked while testing + //Assert.Null (typeof (ParameterInfo).GetProperty ("Name"), "Name"); + + var mi = this.GetType ().GetMethod ("MethodWithParameters"); + var p = mi.GetParameters (); +#if DEBUG || !LINKALL + // this optimization is only applied for release builds (not debug ones) + // link sdk won't touch this assembly (user code) so the parameters will be available + Assert.That (p [0].ToString (), Is.EqualTo ("System.String firstParameter"), "1"); + Assert.That (p [1].ToString (), Is.EqualTo ("Int32 secondParameter"), "2"); +#else + Assert.That (p [0].ToString (), Is.EqualTo ("System.String "), "1"); + Assert.That (p [1].ToString (), Is.EqualTo ("Int32 "), "2"); +#endif + } + } +} diff --git a/tests/linker-ios/link sdk/TaskTest.cs b/tests/linker-ios/link sdk/TaskTest.cs new file mode 100644 index 000000000000..8c6ef7ca7c75 --- /dev/null +++ b/tests/linker-ios/link sdk/TaskTest.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; +#if XAMCORE_2_0 +using Foundation; +using ObjCRuntime; +#else +using MonoTouch.Foundation; +#endif +using NUnit.Framework; + +namespace LinkSdk { + + [TestFixture] + [Preserve (AllMembers = true)] + public class TaskBugsTest { + + [Test] + public void ContinueWithDifferentOptionsAreCanceledTest () + { + TaskScheduler.UnobservedTaskException += (obj, evt) => evt.SetObserved (); + var mre = new ManualResetEventSlim (); + var task = Task.Factory.StartNew (() => mre.Wait (200)); + var contFailed = task.ContinueWith (t => {}, TaskContinuationOptions.OnlyOnFaulted); + var contCanceled = task.ContinueWith (t => {}, TaskContinuationOptions.OnlyOnCanceled); + var contSuccess = task.ContinueWith (t => {}, TaskContinuationOptions.OnlyOnRanToCompletion); + + mre.Set (); + contSuccess.Wait (100); + + Assert.True (contSuccess.IsCompleted, "contSuccess.IsCompleted"); + Assert.True (contFailed.IsCompleted, "contFailed.IsCompleted"); + Assert.True (contCanceled.IsCompleted, "contCanceled.IsCompleted"); + Assert.False (contSuccess.IsCanceled, "contSuccess.IsCanceled"); + Assert.True (contFailed.IsCanceled, "contFailed.IsCanceled"); + Assert.True (contCanceled.IsCanceled, "contCanceled.IsCanceled"); + } + + [Test] + public void ContinueWhenAll_WithMixedCompletionState () + { + TaskScheduler.UnobservedTaskException += (obj, evt) => evt.SetObserved (); + var mre = new ManualResetEventSlim (); + var task = Task.Factory.StartNew (() => mre.Wait (200)); + var contFailed = task.ContinueWith (t => {}, TaskContinuationOptions.OnlyOnFaulted); + var contCanceled = task.ContinueWith (t => {}, TaskContinuationOptions.OnlyOnCanceled); + var contSuccess = task.ContinueWith (t => {}, TaskContinuationOptions.OnlyOnRanToCompletion); + bool ran = false; + + var cont = Task.Factory.ContinueWhenAll (new Task[] { contFailed, contCanceled, contSuccess }, _ => ran = true); + + mre.Set (); + cont.Wait (200); + + Assert.True (ran, "ran"); + Assert.That (cont.Status, Is.EqualTo (TaskStatus.RanToCompletion), "Status"); + } + } +} \ No newline at end of file diff --git a/tests/linker-ios/link sdk/extra-linker-defs-tvos.xml b/tests/linker-ios/link sdk/extra-linker-defs-tvos.xml new file mode 100644 index 000000000000..f21bf88c53f0 --- /dev/null +++ b/tests/linker-ios/link sdk/extra-linker-defs-tvos.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/linker-ios/link sdk/extra-linker-defs-unified.xml b/tests/linker-ios/link sdk/extra-linker-defs-unified.xml new file mode 100644 index 000000000000..e45255620cdb --- /dev/null +++ b/tests/linker-ios/link sdk/extra-linker-defs-unified.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/linker-ios/link sdk/extra-linker-defs-watchos.xml b/tests/linker-ios/link sdk/extra-linker-defs-watchos.xml new file mode 100644 index 000000000000..0e8a78f7adfd --- /dev/null +++ b/tests/linker-ios/link sdk/extra-linker-defs-watchos.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/linker-ios/link sdk/extra-linker-defs.xml b/tests/linker-ios/link sdk/extra-linker-defs.xml new file mode 100644 index 000000000000..f102f5906ae5 --- /dev/null +++ b/tests/linker-ios/link sdk/extra-linker-defs.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/linker-ios/link sdk/link sdk.csproj b/tests/linker-ios/link sdk/link sdk.csproj new file mode 100644 index 000000000000..a8f92b268973 --- /dev/null +++ b/tests/linker-ios/link sdk/link sdk.csproj @@ -0,0 +1,123 @@ + + + + Debug + iPhoneSimulator + 8.0.30703 + 2.0 + {C47F8F72-A7CA-4149-AA7D-BC4814803EF3} + {6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Exe + linksdk + link sdk + MonoTouch + + + True + full + False + bin\iPhoneSimulator\Debug + __MOBILE__;__IOS__;DEBUG; + prompt + 4 + False + True + + + -v -v -disable-thread-check -xml=${ProjectDir}/extra-linker-defs.xml + i386 + + + none + False + bin\iPhoneSimulator\Release + prompt + 4 + False + -v -v -xml=${ProjectDir}/extra-linker-defs.xml + + + i386 + __MOBILE__;__IOS__;DO_NOT_REMOVE; + + + True + full + False + bin\iPhone\Debug + DEBUG;XAMARIN_APPLETLS; + prompt + 4 + False + True + iPhone Developer + -v -v -xml=${ProjectDir}/extra-linker-defs.xml "--dlsym:-link sdk" -gcc_flags="-UhoItsB0rken" + True + ARMv7 + true + + + none + False + bin\iPhone\Release + prompt + 4 + False + iPhone Developer + -v -v -xml=${ProjectDir}/extra-linker-defs.xml "--dlsym:-link sdk" + True + ARMv7 + + + DO_NOT_REMOVE;XAMARIN_APPLETLS; + + + + + + + + + + + + support.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {FE6EDEE9-ADF6-4F42-BCF2-B68C0A44EC3D} + BundledResources + + + + \ No newline at end of file diff --git a/tests/linker-ios/link sdk/support.il b/tests/linker-ios/link sdk/support.il new file mode 100644 index 000000000000..67dd10d130fd --- /dev/null +++ b/tests/linker-ios/link sdk/support.il @@ -0,0 +1,11 @@ +// ilasm -dll support.il + +.assembly support { } + +.class public support { + .method static public void throw_object () { + newobj instance void class [mscorlib]System.Object::'.ctor'() + throw + ret + } +}