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
14 changes: 14 additions & 0 deletions Xamarin.Android.sln
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Android.Sdk.Trimm
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestFixtures", "tests\Microsoft.Android.Sdk.TrimmableTypeMap.Tests\TestFixtures\TestFixtures.csproj", "{C5A44686-3469-45A7-B6AB-2798BA0625BC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests", "tests\Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests\Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests.csproj", "{A14CB0A1-7A05-4F27-88B2-383798CE1DEE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UserTypesFixture", "tests\Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests\UserTypesFixture\UserTypesFixture.csproj", "{2498F8A0-AA04-40EF-8691-59BBD2396B4D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "class-parse", "external\Java.Interop\tools\class-parse\class-parse.csproj", "{38C762AB-8FD1-44DE-9855-26AAE7129DC3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "logcat-parse", "external\Java.Interop\tools\logcat-parse\logcat-parse.csproj", "{7387E151-48E3-4885-B2CA-A74434A34045}"
Expand Down Expand Up @@ -249,6 +253,14 @@ Global
{C5A44686-3469-45A7-B6AB-2798BA0625BC}.Debug|AnyCPU.Build.0 = Debug|Any CPU
{C5A44686-3469-45A7-B6AB-2798BA0625BC}.Release|AnyCPU.ActiveCfg = Release|Any CPU
{C5A44686-3469-45A7-B6AB-2798BA0625BC}.Release|AnyCPU.Build.0 = Release|Any CPU
{A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
{A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Debug|AnyCPU.Build.0 = Debug|Any CPU
{A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Release|AnyCPU.ActiveCfg = Release|Any CPU
{A14CB0A1-7A05-4F27-88B2-383798CE1DEE}.Release|AnyCPU.Build.0 = Release|Any CPU
{2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
{2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Debug|AnyCPU.Build.0 = Debug|Any CPU
{2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Release|AnyCPU.ActiveCfg = Release|Any CPU
{2498F8A0-AA04-40EF-8691-59BBD2396B4D}.Release|AnyCPU.Build.0 = Release|Any CPU
{38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
{38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Debug|AnyCPU.Build.0 = Debug|Any CPU
{38C762AB-8FD1-44DE-9855-26AAE7129DC3}.Release|AnyCPU.ActiveCfg = Release|Any CPU
Expand Down Expand Up @@ -418,6 +430,8 @@ Global
{53E4ABF0-1085-45F9-B964-DCAE4B819998} = {CAB438D8-B0F5-4AF0-BEBD-9E2ADBD7B483}
{F9CD012E-67AC-4A4E-B2A7-252387F91256} = {CAB438D8-B0F5-4AF0-BEBD-9E2ADBD7B483}
{C5A44686-3469-45A7-B6AB-2798BA0625BC} = {CAB438D8-B0F5-4AF0-BEBD-9E2ADBD7B483}
{A14CB0A1-7A05-4F27-88B2-383798CE1DEE} = {CAB438D8-B0F5-4AF0-BEBD-9E2ADBD7B483}
{2498F8A0-AA04-40EF-8691-59BBD2396B4D} = {CAB438D8-B0F5-4AF0-BEBD-9E2ADBD7B483}
{38C762AB-8FD1-44DE-9855-26AAE7129DC3} = {864062D3-A415-4A6F-9324-5820237BA058}
{7387E151-48E3-4885-B2CA-A74434A34045} = {864062D3-A415-4A6F-9324-5820237BA058}
{8A6CB07C-E493-4A4F-AB94-038645A27118} = {E351F97D-EA4F-4E7F-AAA0-8EBB1F2A4A62}
Expand Down
15 changes: 15 additions & 0 deletions build-tools/automation/yaml-templates/build-windows-steps.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,21 @@ steps:
testResultsFiles: "$(Agent.TempDirectory)/trimmable-typemap-tests/*.trx"
testRunTitle: Microsoft.Android.Sdk.TrimmableTypeMap.Tests

- template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self
parameters:
command: test
project: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)/Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests.dll
arguments: --logger trx --results-directory $(Agent.TempDirectory)/trimmable-typemap-integration-tests
displayName: Test Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests $(XA.Build.Configuration)

- task: PublishTestResults@2
displayName: publish Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests results
condition: always()
inputs:
testResultsFormat: VSTest
testResultsFiles: "$(Agent.TempDirectory)/trimmable-typemap-integration-tests/*.trx"
testRunTitle: Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests
continueOnError: true
- task: BatchScript@1
displayName: Test dotnet-local.cmd - create template
inputs:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo ("Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")]
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@

[assembly: InternalsVisibleTo ("Xamarin.Android.Build.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")]
[assembly: InternalsVisibleTo ("MSBuildDeviceIntegration, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")]
[assembly: InternalsVisibleTo ("Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")]
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
using System.Collections.Generic;
using System.Linq;

namespace Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests;

static class ComparisonDiffHelper
{
public static List<string> CompareBaseJavaNames (
Dictionary<string, TypeComparisonData> legacyData,
Dictionary<string, TypeComparisonData> newData)
{
var allManagedNames = new HashSet<string> (legacyData.Keys);
allManagedNames.IntersectWith (newData.Keys);

var mismatches = new List<string> ();

foreach (var managedName in allManagedNames.OrderBy (n => n, System.StringComparer.Ordinal)) {
var legacy = legacyData [managedName];
var newInfo = newData [managedName];

if (legacy.BaseJavaName == newInfo.BaseJavaName) {
continue;
}

if (legacy.BaseJavaName == null && newInfo.BaseJavaName != null && managedName.Contains ('`')) {
continue;
}

if (legacy.BaseJavaName == null && newInfo.BaseJavaName != null && newInfo.DoNotGenerateAcw) {
continue;
}

if (legacy.BaseJavaName != null && newInfo.BaseJavaName == null &&
legacy.BaseJavaName == legacy.JavaName) {
continue;
}

mismatches.Add ($"{managedName}: legacy='{legacy.BaseJavaName ?? "(null)"}' new='{newInfo.BaseJavaName ?? "(null)"}'");
}

return mismatches;
}

public static (List<string> missingInterfaces, List<string> extraInterfaces) CompareImplementedInterfaces (
Dictionary<string, TypeComparisonData> legacyData,
Dictionary<string, TypeComparisonData> newData)
{
var allManagedNames = new HashSet<string> (legacyData.Keys);
allManagedNames.IntersectWith (newData.Keys);

var missingInterfaces = new List<string> ();
var extraInterfaces = new List<string> ();

foreach (var managedName in allManagedNames.OrderBy (n => n, System.StringComparer.Ordinal)) {
var legacy = legacyData [managedName];
var newInfo = newData [managedName];

var legacySet = new HashSet<string> (legacy.ImplementedInterfaces, System.StringComparer.Ordinal);
var newSet = new HashSet<string> (newInfo.ImplementedInterfaces, System.StringComparer.Ordinal);

foreach (var iface in legacySet.Except (newSet)) {
missingInterfaces.Add ($"{managedName}: missing '{iface}'");
}

foreach (var iface in newSet.Except (legacySet)) {
extraInterfaces.Add ($"{managedName}: extra '{iface}'");
}
}

return (missingInterfaces, extraInterfaces);
}

public static (List<string> presenceMismatches, List<string> declaringTypeMismatches, List<string> styleMismatches) CompareActivationCtors (
Dictionary<string, TypeComparisonData> legacyData,
Dictionary<string, TypeComparisonData> newData)
{
var allManagedNames = new HashSet<string> (legacyData.Keys);
allManagedNames.IntersectWith (newData.Keys);

var presenceMismatches = new List<string> ();
var declaringTypeMismatches = new List<string> ();
var styleMismatches = new List<string> ();

foreach (var managedName in allManagedNames.OrderBy (n => n, System.StringComparer.Ordinal)) {
var legacy = legacyData [managedName];
var newInfo = newData [managedName];

if (legacy.HasActivationCtor != newInfo.HasActivationCtor) {
presenceMismatches.Add ($"{managedName}: legacy.has={legacy.HasActivationCtor} new.has={newInfo.HasActivationCtor}");
continue;
}

if (!legacy.HasActivationCtor) {
continue;
}

if (legacy.ActivationCtorDeclaringType != newInfo.ActivationCtorDeclaringType) {
declaringTypeMismatches.Add ($"{managedName}: legacy='{legacy.ActivationCtorDeclaringType}' new='{newInfo.ActivationCtorDeclaringType}'");
}

if (legacy.ActivationCtorStyle != newInfo.ActivationCtorStyle) {
styleMismatches.Add ($"{managedName}: legacy='{legacy.ActivationCtorStyle}' new='{newInfo.ActivationCtorStyle}'");
}
}

return (presenceMismatches, declaringTypeMismatches, styleMismatches);
}

public static (List<string> missingCtors, List<string> extraCtors) CompareJavaConstructors (
Dictionary<string, TypeComparisonData> legacyData,
Dictionary<string, TypeComparisonData> newData)
{
var allManagedNames = new HashSet<string> (legacyData.Keys);
allManagedNames.IntersectWith (newData.Keys);

var missingCtors = new List<string> ();
var extraCtors = new List<string> ();

foreach (var managedName in allManagedNames.OrderBy (n => n, System.StringComparer.Ordinal)) {
var legacy = legacyData [managedName];
var newInfo = newData [managedName];

var legacySet = new HashSet<string> (legacy.JavaConstructorSignatures, System.StringComparer.Ordinal);
var newSet = new HashSet<string> (newInfo.JavaConstructorSignatures, System.StringComparer.Ordinal);

foreach (var sig in legacySet.Except (newSet)) {
missingCtors.Add ($"{managedName}: missing '<init>{sig}'");
}

foreach (var sig in newSet.Except (legacySet)) {
extraCtors.Add ($"{managedName}: extra '<init>{sig}'");
}
}

return (missingCtors, extraCtors);
}

public static (List<string> interfaceMismatches, List<string> abstractMismatches, List<string> genericMismatches, List<string> acwMismatches) CompareTypeFlags (
Dictionary<string, TypeComparisonData> legacyData,
Dictionary<string, TypeComparisonData> newData)
{
var allManagedNames = new HashSet<string> (legacyData.Keys);
allManagedNames.IntersectWith (newData.Keys);

var interfaceMismatches = new List<string> ();
var abstractMismatches = new List<string> ();
var genericMismatches = new List<string> ();
var acwMismatches = new List<string> ();

foreach (var managedName in allManagedNames.OrderBy (n => n, System.StringComparer.Ordinal)) {
var legacy = legacyData [managedName];
var newInfo = newData [managedName];

if (legacy.IsInterface != newInfo.IsInterface) {
interfaceMismatches.Add ($"{managedName}: legacy={legacy.IsInterface} new={newInfo.IsInterface}");
}

if (legacy.IsAbstract != newInfo.IsAbstract) {
abstractMismatches.Add ($"{managedName}: legacy={legacy.IsAbstract} new={newInfo.IsAbstract}");
}

if (legacy.IsGenericDefinition != newInfo.IsGenericDefinition) {
genericMismatches.Add ($"{managedName}: legacy={legacy.IsGenericDefinition} new={newInfo.IsGenericDefinition}");
}

if (legacy.DoNotGenerateAcw != newInfo.DoNotGenerateAcw) {
acwMismatches.Add ($"{managedName}: legacy={legacy.DoNotGenerateAcw} new={newInfo.DoNotGenerateAcw}");
}
}

return (interfaceMismatches, abstractMismatches, genericMismatches, acwMismatches);
}
}
Loading
Loading