Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -154,11 +154,17 @@ public void UserLayout ()
Assert.True (mainText.Contains ("FixedWidth"), "'FixedWidth' was converted to 'fixedwidth'");
Directory.Delete (path, recursive: true);
}

[Test]
public void AdaptiveIcon ()
public void AdaptiveIcon ([Values] AndroidRuntime runtime)
{
bool isRelease = runtime == AndroidRuntime.NativeAOT;
if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) {
return;
}

var proj = new XamarinAndroidApplicationProject {
IsRelease = isRelease,
SupportedOSPlatformVersion = "26",
AndroidResources = {
new AndroidItem.AndroidResource ("Resources\\values\\colors.xml") {
Expand Down Expand Up @@ -193,6 +199,7 @@ public void AdaptiveIcon ()
},
}
};
proj.SetRuntime (runtime);

using var b = CreateApkBuilder ();
Assert.IsTrue (b.Build (proj), "Build should have succeeded.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,44 @@ namespace Xamarin.Android.Build.Tests
{
public class CheckClientHandlerTypeTests : BaseTest
{
static IEnumerable<object[]> Get_ErrorIsNotRaised_Data ()
{
var ret = new List<object[]> ();

foreach (AndroidRuntime runtime in Enum.GetValues (typeof (AndroidRuntime))) {
AddTestData ("Xamarin.Android.Net.AndroidMessageHandler", runtime);
AddTestData ("System.Net.Http.SocketsHttpHandler, System.Net.Http", runtime);
}

return ret;

void AddTestData (string handler, AndroidRuntime runtime)
{
ret.Add (new object[] {
handler,
runtime,
});
}
}

[Test]
[TestCase ("Xamarin.Android.Net.AndroidMessageHandler")]
[TestCase ("System.Net.Http.SocketsHttpHandler, System.Net.Http")]
public void ErrorIsNotRaised (string handler)
[TestCaseSource (nameof (Get_ErrorIsNotRaised_Data))]
public void ErrorIsNotRaised (string handler, AndroidRuntime runtime)
{
const bool isRelease = false;
if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) {
return;
}

string path = Path.Combine (Root, "temp", TestName);
Directory.CreateDirectory (path);
string intermediatePath;
bool shouldSkip = handler.Contains ("Xamarin.Android.Net.AndroidMessageHandler");
bool targetSkipped;
var proj = new XamarinAndroidApplicationProject () {
IsRelease = false,
IsRelease = isRelease,
};
proj.SetRuntime (runtime);
proj.SetProperty ("AndroidHttpClientHandlerType", handler);
using (var b = CreateApkBuilder (path)) {
b.Verbosity = LoggerVerbosity.Detailed;
Expand Down Expand Up @@ -56,16 +81,41 @@ public void ErrorIsNotRaised (string handler)
Assert.True (task.Execute (), $"task should have succeeded. {string.Join (";", errors.Select (x => x.Message))}");
}

static IEnumerable<object[]> Get_ErrorIsRaised_Data ()
{
var ret = new List<object[]> ();

foreach (AndroidRuntime runtime in Enum.GetValues (typeof (AndroidRuntime))) {
AddTestData ("Xamarin.Android.Net.AndroidClientHandler", runtime);
}

return ret;

void AddTestData (string handler, AndroidRuntime runtime)
{
ret.Add (new object[] {
handler,
runtime,
});
}
}

[Test]
[TestCase ("Xamarin.Android.Net.AndroidClientHandler")]
public void ErrorIsRaised (string handler)
[TestCaseSource (nameof (Get_ErrorIsRaised_Data))]
public void ErrorIsRaised (string handler, AndroidRuntime runtime)
{
const bool isRelease = false;
if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) {
return;
}

var path = Path.Combine (Root, "temp", TestName);
Directory.CreateDirectory (path);
string intermediatePath;
var proj = new XamarinAndroidApplicationProject () {
IsRelease = false,
IsRelease = isRelease,
};
proj.SetRuntime (runtime);
proj.PackageReferences.Add (new Package() { Id = "System.Net.Http", Version = "*" });
using (var b = CreateApkBuilder ()) {
b.ThrowOnBuildFailure = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,12 +167,17 @@ private void PreserveCustomHttpClientHandler (
string handlerAssembly,
string testProjectName,
string assemblyPath,
TrimMode trimMode)
TrimMode trimMode,
AndroidRuntime runtime)
{
const bool isRelease = true;
if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) {
return;
}
testProjectName += trimMode.ToString ();

var class_library = new XamarinAndroidLibraryProject {
IsRelease = true,
IsRelease = isRelease,
ProjectName = "MyClassLibrary",
Sources = {
new BuildItem.Source ("MyCustomHandler.cs") {
Expand All @@ -189,20 +194,22 @@ class MyCustomHandler : System.Net.Http.HttpMessageHandler
}
}
};
class_library.SetRuntime (runtime);
using (var libBuilder = CreateDllBuilder ($"{testProjectName}/{class_library.ProjectName}")) {
Assert.IsTrue (libBuilder.Build (class_library), $"Build for {class_library.ProjectName} should have succeeded.");
}

var proj = new XamarinAndroidApplicationProject {
ProjectName = "MyApp",
IsRelease = true,
IsRelease = isRelease,
TrimModeRelease = trimMode,
Sources = {
new BuildItem.Source ("Foo.cs") {
TextContent = () => "public class Foo : Bar { }",
}
}
};
proj.SetRuntime (runtime);
proj.AddReference (class_library);
proj.AddReferences ("System.Net.Http");
string handlerTypeFullName = string.IsNullOrEmpty(handlerAssembly) ? handlerType : handlerType + ", " + handlerAssembly;
Expand All @@ -218,19 +225,22 @@ class MyCustomHandler : System.Net.Http.HttpMessageHandler
}

[Test]
public void PreserveCustomHttpClientHandlers ([Values (TrimMode.Partial, TrimMode.Full)] TrimMode trimMode)
public void PreserveCustomHttpClientHandlers ([Values (TrimMode.Partial, TrimMode.Full)] TrimMode trimMode, [Values] AndroidRuntime runtime)
{
PreserveCustomHttpClientHandler ("Xamarin.Android.Net.AndroidMessageHandler", "",
"temp/PreserveAndroidMessageHandler", "android-arm64/linked/Mono.Android.dll", trimMode);
$"temp/PreserveAndroidMessageHandler{trimMode}{runtime}", "android-arm64/linked/Mono.Android.dll", trimMode, runtime);
PreserveCustomHttpClientHandler ("System.Net.Http.SocketsHttpHandler", "System.Net.Http",
"temp/PreserveSocketsHttpHandler", "android-arm64/linked/System.Net.Http.dll", trimMode);
$"temp/PreserveSocketsHttpHandler{trimMode}{runtime}", "android-arm64/linked/System.Net.Http.dll", trimMode, runtime);
PreserveCustomHttpClientHandler ("MyCustomHandler", "MyClassLibrary",
"temp/MyCustomHandler", "android-arm64/linked/MyClassLibrary.dll", trimMode);
$"temp/MyCustomHandler{trimMode}{runtime}", "android-arm64/linked/MyClassLibrary.dll", trimMode, runtime);
}

[Test]
public void WarnAboutAppDomains ([Values (true, false)] bool isRelease)
public void WarnAboutAppDomains ([Values] bool isRelease, [Values] AndroidRuntime runtime)
{
if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) {
return;
}
if (isRelease) {
// NOTE: trimmer warnings are hidden by default in .NET 7 rc1
Assert.Ignore("https://github.com/dotnet/linker/issues/2982");
Expand All @@ -246,8 +256,10 @@ public void WarnAboutAppDomains ([Values (true, false)] bool isRelease)
}
}
};
lib.SetRuntime (runtime);

var app = new XamarinAndroidApplicationProject { IsRelease = isRelease };
app.SetRuntime (runtime);
app.SetAndroidSupportedAbis ("arm64-v8a");
app.AddReference (lib);
using var libBuilder = CreateDllBuilder (Path.Combine (path, lib.ProjectName));
Expand Down Expand Up @@ -366,10 +378,14 @@ public void LinkDescription ([Values (true, false)] bool useAssemblyStore, [Valu
}

[Test]
public void LinkWithNullAttribute ()
public void LinkWithNullAttribute ([Values] AndroidRuntime runtime)
{
const bool isRelease = true;
if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) {
return;
}
var proj = new XamarinAndroidApplicationProject {
IsRelease = true,
IsRelease = isRelease,
OtherBuildItems = {
new BuildItem ("Compile", "NullAttribute.cs") { TextContent = () => @"
using System;
Expand Down Expand Up @@ -402,6 +418,7 @@ public AttributedButtonStub (Context context) : base (context)
}
};

proj.SetRuntime (runtime);
proj.MainActivity = proj.DefaultMainActivity.Replace ("//${AFTER_ONCREATE}",
$@" var myButton = new AttributedButtonStub (this);
myButton.Text = ""Bug #35710"";
Expand All @@ -416,7 +433,7 @@ static IEnumerable<object[]> Get_AndroidAddKeepAlivesData ()
{
var ret = new List<object[]> ();

foreach (AndroidRuntime runtime in new[] { AndroidRuntime.MonoVM, AndroidRuntime.CoreCLR }) {
foreach (AndroidRuntime runtime in Enum.GetValues (typeof (AndroidRuntime))) {
// Debug configuration
AddTestData (isRelease: false, setAndroidAddKeepAlivesTrue: false, setLinkModeNone: false, shouldAddKeepAlives: false, runtime);

Expand Down Expand Up @@ -448,6 +465,10 @@ void AddTestData (bool isRelease, bool setAndroidAddKeepAlivesTrue, bool setLink
[TestCaseSource (nameof (Get_AndroidAddKeepAlivesData))]
public void AndroidAddKeepAlives (bool isRelease, bool setAndroidAddKeepAlivesTrue, bool setLinkModeNone, bool shouldAddKeepAlives, AndroidRuntime runtime)
{
if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) {
return;
}

if (runtime == AndroidRuntime.CoreCLR && isRelease && !setAndroidAddKeepAlivesTrue && setLinkModeNone && shouldAddKeepAlives) {
// This currently fails with the following exception:
//
Expand Down Expand Up @@ -512,7 +533,12 @@ public unsafe bool MyMethod (Android.OS.IBinder windowToken, [global::Android.Ru
var assemblyFile = "UnnamedProject.dll";
if (!isRelease || setLinkModeNone) {
foreach (string abi in proj.GetRuntimeIdentifiersAsAbis ()) {
CheckAssembly (b.Output.GetIntermediaryPath (Path.Combine ("android", "assets", abi, assemblyFile)), projectDir);
string assemblyDir = runtime switch {
AndroidRuntime.NativeAOT => Path.Combine (MonoAndroidHelper.AbiToRid (abi), "linked"),
_ => Path.Combine ("android", "assets", abi)
};

CheckAssembly (b.Output.GetIntermediaryPath (Path.Combine (assemblyDir, assemblyFile)), projectDir);
}
} else {
CheckAssembly (BuildTest.GetLinkedPath (b, true, assemblyFile), projectDir);
Expand Down Expand Up @@ -553,9 +579,15 @@ void CheckAssembly (string assemblyPath, string projectDir)
}

[Test]
public void AndroidUseNegotiateAuthentication ([Values (true, false, null)] bool? useNegotiateAuthentication)
public void AndroidUseNegotiateAuthentication ([Values (true, false, null)] bool? useNegotiateAuthentication, [Values] AndroidRuntime runtime)
{
bool isRelease = runtime == AndroidRuntime.NativeAOT;
if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) {
return;
}

var proj = new XamarinAndroidApplicationProject { IsRelease = true };
proj.SetRuntime (runtime);
proj.AddReferences ("System.Net.Http");
proj.MainActivity = proj.DefaultMainActivity.Replace (
"base.OnCreate (bundle);",
Expand Down Expand Up @@ -585,9 +617,14 @@ public void AndroidUseNegotiateAuthentication ([Values (true, false, null)] bool
}

[Test]
public void PreserveIX509TrustManagerSubclasses ([Values(true, false)] bool hasServerCertificateCustomValidationCallback)
public void PreserveIX509TrustManagerSubclasses ([Values] bool hasServerCertificateCustomValidationCallback, [Values] AndroidRuntime runtime)
{
var proj = new XamarinAndroidApplicationProject { IsRelease = true };
const bool isRelease = true;
if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) {
return;
}
var proj = new XamarinAndroidApplicationProject { IsRelease = isRelease };
proj.SetRuntime (runtime);
proj.AddReferences ("System.Net.Http");
proj.MainActivity = proj.DefaultMainActivity.Replace (
"base.OnCreate (bundle);",
Expand Down Expand Up @@ -619,15 +656,21 @@ public void PreserveIX509TrustManagerSubclasses ([Values(true, false)] bool hasS
}

[Test]
public void PreserveServices ()
public void PreserveServices ([Values] AndroidRuntime runtime)
{
const bool isRelease = true;
if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) {
return;
}

var proj = new XamarinAndroidApplicationProject {
IsRelease = true,
IsRelease = isRelease,
TrimModeRelease = TrimMode.Full,
PackageReferences = {
new Package { Id = "Plugin.Firebase.CloudMessaging", Version = "3.0.0" },
}
};
proj.SetRuntime (runtime);
proj.MainActivity = proj.DefaultMainActivity
.Replace ("//${FIELDS}",
"""
Expand Down Expand Up @@ -759,9 +802,15 @@ void Assert64Bit(string rid, bool expected64)
}

[Test]
public void WarnWithReferenceToPreserveAttribute ()
public void WarnWithReferenceToPreserveAttribute ([Values] AndroidRuntime runtime)
{
var proj = new XamarinAndroidApplicationProject { IsRelease = true };
const bool isRelease = true;
if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) {
return;
}

var proj = new XamarinAndroidApplicationProject { IsRelease = isRelease };
proj.SetRuntime (runtime);
proj.AddReferences ("System.Net.Http");
proj.MainActivity = proj.DefaultMainActivity.Replace (
"protected override void OnCreate",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -299,11 +299,18 @@ public void CreateResourceDirectory (string path)
File.WriteAllText (Path.Combine (Root, path, "lp", "__res_name_case_map.txt"), "menu/Options.xml;menu/options.xml");
}

void BuildLibraryWithResources (string path)
void BuildLibraryWithResources (string path, AndroidRuntime runtime)
{
bool isRelease = runtime == AndroidRuntime.NativeAOT;
if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) {
return;
}

var library = new XamarinAndroidLibraryProject () {
IsRelease = isRelease,
ProjectName = "Library",
};
library.SetRuntime (runtime);

var libraryStrings = library.AndroidResources.FirstOrDefault (r => r.Include () == @"Resources\values\Strings.xml");

Expand Down Expand Up @@ -425,8 +432,15 @@ public void GenerateDesignerFileWithÜmläüts ()
}

[Test]
public void GenerateDesignerFileFromRtxt ([Values (false, true)] bool withLibraryReference)
public void GenerateDesignerFileFromRtxt ([Values] bool withLibraryReference, [Values] AndroidRuntime runtime)
{
// TODO: fix NativeAOT, it currently fails with:
//
// bin/TestDebug/temp/GenerateDesignerFileFromRtxtTrueNativeAOT Some Space/Resource.designer.cs and bin/TestDebug/Expected/GenerateDesignerFileWithLibraryReferenceExpected.cs do not match.
if (runtime == AndroidRuntime.NativeAOT) {
Assert.Ignore ("NativeAOT currently doesn't work with this test.");
}

var path = Path.Combine ("temp", TestName + " Some Space");
CreateResourceDirectory (path);
var mapTask = CreateCaseMapTask (path);
Expand All @@ -436,7 +450,7 @@ public void GenerateDesignerFileFromRtxt ([Values (false, true)] bool withLibrar
File.WriteAllText (task.RTxtFile, Rtxt);
if (withLibraryReference) {
var libraryPath = Path.Combine (path, "Library");
BuildLibraryWithResources (libraryPath);
BuildLibraryWithResources (libraryPath, runtime);
task.References = new TaskItem [] {
new TaskItem (Path.Combine (Root, libraryPath, "bin", "Debug", "Library.dll"))
};
Expand Down
Loading
Loading