|
1 | 1 | using System; |
| 2 | +using System.Collections.Generic; |
2 | 3 | using System.Diagnostics; |
3 | 4 | using System.IO; |
4 | 5 | using System.Linq; |
@@ -411,41 +412,58 @@ public AttributedButtonStub (Context context) : base (context) |
411 | 412 | } |
412 | 413 | } |
413 | 414 |
|
414 | | - static readonly object [] AndroidAddKeepAlivesSource = new object [] { |
415 | | - // Debug configuration |
416 | | - new object [] { |
417 | | - /* isRelease */ false, |
418 | | - /* AndroidAddKeepAlives=true */ false, |
419 | | - /* AndroidLinkMode=None */ false, |
420 | | - /* should add KeepAlives */ false, |
421 | | - }, |
422 | | - // Debug configuration, AndroidAddKeepAlives=true |
423 | | - new object [] { |
424 | | - /* isRelease */ false, |
425 | | - /* AndroidAddKeepAlives=true */ true, |
426 | | - /* AndroidLinkMode=None */ false, |
427 | | - /* should add KeepAlives */ true, |
428 | | - }, |
429 | | - // Release configuration |
430 | | - new object [] { |
431 | | - /* isRelease */ true, |
432 | | - /* AndroidAddKeepAlives=true */ false, |
433 | | - /* AndroidLinkMode=None */ false, |
434 | | - /* should add KeepAlives */ true, |
435 | | - }, |
436 | | - // Release configuration, AndroidLinkMode=None |
437 | | - new object [] { |
438 | | - /* isRelease */ true, |
439 | | - /* AndroidAddKeepAlives=true */ false, |
440 | | - /* AndroidLinkMode=None */ true, |
441 | | - /* should add KeepAlives */ true, |
442 | | - }, |
443 | | - }; |
| 415 | + static IEnumerable<object[]> Get_AndroidAddKeepAlivesData () |
| 416 | + { |
| 417 | + var ret = new List<object[]> (); |
| 418 | + |
| 419 | + foreach (AndroidRuntime runtime in new[] { AndroidRuntime.MonoVM, AndroidRuntime.CoreCLR }) { |
| 420 | + // Debug configuration |
| 421 | + AddTestData (isRelease: false, setAndroidAddKeepAlivesTrue: false, setLinkModeNone: false, shouldAddKeepAlives: false, runtime); |
| 422 | + |
| 423 | + // Debug configuration, AndroidAddKeepAlives=true |
| 424 | + AddTestData (isRelease: false, setAndroidAddKeepAlivesTrue: true, setLinkModeNone: false, shouldAddKeepAlives: true, runtime); |
| 425 | + |
| 426 | + // Release configuration |
| 427 | + AddTestData (isRelease: true, setAndroidAddKeepAlivesTrue: false, setLinkModeNone: false, shouldAddKeepAlives: true, runtime); |
| 428 | + |
| 429 | + // Release configuration, AndroidLinkMode=None |
| 430 | + AddTestData (isRelease: true, setAndroidAddKeepAlivesTrue: false, setLinkModeNone: true, shouldAddKeepAlives: true, runtime); |
| 431 | + } |
| 432 | + |
| 433 | + return ret; |
| 434 | + |
| 435 | + void AddTestData (bool isRelease, bool setAndroidAddKeepAlivesTrue, bool setLinkModeNone, bool shouldAddKeepAlives, AndroidRuntime runtime) |
| 436 | + { |
| 437 | + ret.Add (new object[] { |
| 438 | + isRelease, |
| 439 | + setAndroidAddKeepAlivesTrue, |
| 440 | + setLinkModeNone, |
| 441 | + shouldAddKeepAlives, |
| 442 | + runtime |
| 443 | + }); |
| 444 | + } |
| 445 | + } |
444 | 446 |
|
445 | 447 | [Test] |
446 | | - [TestCaseSource (nameof (AndroidAddKeepAlivesSource))] |
447 | | - public void AndroidAddKeepAlives (bool isRelease, bool setAndroidAddKeepAlivesTrue, bool setLinkModeNone, bool shouldAddKeepAlives) |
| 448 | + [TestCaseSource (nameof (Get_AndroidAddKeepAlivesData))] |
| 449 | + public void AndroidAddKeepAlives (bool isRelease, bool setAndroidAddKeepAlivesTrue, bool setLinkModeNone, bool shouldAddKeepAlives, AndroidRuntime runtime) |
448 | 450 | { |
| 451 | + if (runtime == AndroidRuntime.CoreCLR && isRelease && !setAndroidAddKeepAlivesTrue && setLinkModeNone && shouldAddKeepAlives) { |
| 452 | + // This currently fails with the following exception: |
| 453 | + // |
| 454 | + // error XALNS7015: System.NotSupportedException: Writing mixed-mode assemblies is not supported |
| 455 | + // at Mono.Cecil.ModuleWriter.Write(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters) |
| 456 | + // at Mono.Cecil.ModuleWriter.WriteModule(ModuleDefinition module, Disposable`1 stream, WriterParameters parameters) |
| 457 | + // at Mono.Cecil.ModuleDefinition.Write(String fileName, WriterParameters parameters) |
| 458 | + // at Mono.Cecil.AssemblyDefinition.Write(String fileName, WriterParameters parameters) |
| 459 | + // at Xamarin.Android.Tasks.SaveChangedAssemblyStep.ProcessAssembly(AssemblyDefinition assembly, StepContext context) in src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs:line 197 |
| 460 | + // at Xamarin.Android.Tasks.AssemblyPipeline.Run(AssemblyDefinition assembly, StepContext context) in src/Xamarin.Android.Build.Tasks/Utilities/AssemblyPipeline.cs:line 26 |
| 461 | + // at Xamarin.Android.Tasks.AssemblyModifierPipeline.RunPipeline(AssemblyPipeline pipeline, ITaskItem source, ITaskItem destination) in src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs:line 175 |
| 462 | + // at Xamarin.Android.Tasks.AssemblyModifierPipeline.RunTask() in src/Xamarin.Android.Build.Tasks/Tasks/AssemblyModifierPipeline.cs:line 123 |
| 463 | + Assert.Ignore ("CoreCLR: fails because of a Mono.Cecil lack of support"); |
| 464 | + return; |
| 465 | + }; |
| 466 | + |
449 | 467 | var proj = new XamarinAndroidApplicationProject { |
450 | 468 | IsRelease = isRelease, |
451 | 469 | OtherBuildItems = { |
@@ -475,6 +493,7 @@ public unsafe bool MyMethod (Android.OS.IBinder windowToken, [global::Android.Ru |
475 | 493 | } |
476 | 494 | }; |
477 | 495 |
|
| 496 | + proj.SetRuntime (runtime); |
478 | 497 | proj.SetProperty ("AllowUnsafeBlocks", "True"); |
479 | 498 |
|
480 | 499 | // We don't want `[TargetPlatform ("android35")]` to get set because we don't do AddKeepAlives on .NET for Android assemblies |
|
0 commit comments