Skip to content

Commit 89fe0f3

Browse files
committed
[tests/ci] Add MSBuild test jobs to Azure Pipelines
* Adds new `mac_msbuild_tests` and `mac_msbuilddevice_tests` jobs to azure-pipelines.yaml to run the msbuild tests. * Attaches relevant build log file paths to the test result xml rather than dumping the full log to the test output. It's a bit painful to scroll through diagnostic build output to see which tests failed. Build logs can now be viewed directly in the 'attachments' tab of each test failure in Azure Pipelines. * Removes the dependency on the generated XABuildPaths.cs file so that test assemblies can be built and executed on different environments. * Standardizes Android SDK and NDK path and OS information lookup to reduce some code duplication and better allow for toolchain path overriding.
1 parent a3267e3 commit 89fe0f3

File tree

26 files changed

+351
-260
lines changed

26 files changed

+351
-260
lines changed

.external

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
xamarin/monodroid:master@237e0bd9f105b9842778ef82161a20c6d4497a40
1+
xamarin/monodroid:pjcollins_update-xabuildpaths@f225fadb81c781167f44d17d1b4160117ef16e2a

build-tools/automation/azure-pipelines.yaml

Lines changed: 118 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ resources:
1919
variables:
2020
BundleArtifactName: bundle
2121
InstallerArtifactName: installers
22+
NUnitTestAssembliesArtifactName: test-assemblies
2223

2324
# Stage and Job "display names" are shortened because they are combined to form the name of the corresponding GitHub check.
2425
# Check - "Xamarin.Android (Prepare bundle)"
@@ -115,6 +116,12 @@ stages:
115116
- script: make jenkins V=1 CONFIGURATION=$(XA.Build.Configuration) PREPARE_CI=1 PREPARE_AUTOPROVISION=1 PREPARE_ARGS="--bundle-path=$(System.DefaultWorkingDirectory)"
116117
displayName: make jenkins
117118

119+
- task: PublishPipelineArtifact@0
120+
displayName: upload test assemblies
121+
inputs:
122+
artifactName: $(NUnitTestAssembliesArtifactName)
123+
targetPath: bin/Test$(XA.Build.Configuration)
124+
118125
- script: make create-installers V=1 CONFIGURATION=$(XA.Build.Configuration)
119126
displayName: make create-installers
120127

@@ -304,43 +311,9 @@ stages:
304311
variables:
305312
ApkTestConfiguration: Release
306313
steps:
307-
- task: DownloadPipelineArtifact@1
308-
inputs:
309-
artifactName: $(InstallerArtifactName)
310-
itemPattern: "*.pkg"
311-
downloadPath: $(System.DefaultWorkingDirectory)
312-
313-
- template: yaml-templates/run-installer.yaml
314-
315-
- task: MSBuild@1
316-
displayName: build xaprepare
317-
inputs:
318-
solution: build-tools/xaprepare/xaprepare.sln
319-
configuration: $(ApkTestConfiguration)
320-
msbuildArguments: /t:Restore,Build
321-
322-
- script: |
323-
mono build-tools/xaprepare/xaprepare/bin/$(ApkTestConfiguration)/xaprepare.exe --s=UpdateMono --auto-provision=yes --auto-provision-uses-sudo=yes --no-emoji --run-mode=CI
324-
mono build-tools/xaprepare/xaprepare/bin/$(ApkTestConfiguration)/xaprepare.exe --s=Required --auto-provision=yes --auto-provision-uses-sudo=yes --no-emoji --run-mode=CI
325-
mono build-tools/xaprepare/xaprepare/bin/$(ApkTestConfiguration)/xaprepare.exe --s=AndroidToolchain --no-emoji --run-mode=CI
326-
displayName: provision dependencies
327-
328-
- task: NuGetCommand@2
329-
displayName: nuget restore Xamarin.Android.Tools.sln
330-
inputs:
331-
restoreSolution: external/xamarin-android-tools/Xamarin.Android.Tools.sln
332-
333-
- task: MSBuild@1
334-
displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj
335-
inputs:
336-
solution: build-tools/xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj
314+
- template: yaml-templates/mac/setup-test-environment.yaml
315+
parameters:
337316
configuration: $(ApkTestConfiguration)
338-
msbuildArguments: /bl:$(System.DefaultWorkingDirectory)/bin/Test$(ApkTestConfiguration)/BootstrapTasks.binlog
339-
340-
- task: NuGetCommand@2
341-
displayName: nuget restore Xamarin.Android-Tests.sln
342-
inputs:
343-
restoreSolution: Xamarin.Android-Tests.sln
344317

345318
- template: yaml-templates/apk-instrumentation.yaml
346319
parameters:
@@ -493,6 +466,115 @@ stages:
493466
targetPath: $(Build.ArtifactStagingDirectory)
494467
condition: always()
495468

469+
# Check - "Xamarin.Android (Test MSBuild Mac)"
470+
- job: mac_msbuild_tests
471+
displayName: MSBuild Mac
472+
pool: $(XA.Build.Mac.Pool)
473+
timeoutInMinutes: 180
474+
cancelTimeoutInMinutes: 5
475+
workspace:
476+
clean: all
477+
steps:
478+
- template: yaml-templates/mac/setup-test-environment.yaml
479+
480+
- task: DownloadPipelineArtifact@1
481+
inputs:
482+
artifactName: $(NUnitTestAssembliesArtifactName)
483+
downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)
484+
485+
- script: >
486+
mono packages/NUnit.ConsoleRunner.3.9.0/tools/nunit3-console.exe
487+
$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/Xamarin.Android.Build.Tests.dll
488+
$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/Xamarin.Android.Build.Tests.Commercial.dll
489+
--result TestResult-BuildTests-$(XA.Build.Configuration).xml
490+
displayName: run Xamarin.Android.Build.Tests
491+
492+
- task: PublishTestResults@2
493+
displayName: publish test results
494+
inputs:
495+
testResultsFormat: NUnit
496+
testResultsFiles: TestResult-BuildTests-$(XA.Build.Configuration).xml
497+
testRunTitle: BuildTestsMac
498+
condition: succeededOrFailed()
499+
500+
- task: MSBuild@1
501+
displayName: package results
502+
inputs:
503+
solution: build-tools/xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj
504+
configuration: $(XA.Build.Configuration)
505+
msbuildArguments: /t:Build,ZipBuildStatus,ZipTestResults /p:BuildStatusZipOutputPath=$(Build.ArtifactStagingDirectory) /p:TestResultZipOutputPath=$(Build.ArtifactStagingDirectory)
506+
condition: always()
507+
508+
- task: PublishPipelineArtifact@0
509+
displayName: upload artifacts
510+
inputs:
511+
artifactName: mac-buildtask-testresults
512+
targetPath: $(Build.ArtifactStagingDirectory)
513+
condition: always()
514+
515+
# Check - "Xamarin.Android (Test MSBuild Devices Mac)"
516+
- job: mac_msbuilddevice_tests
517+
displayName: MSBuild Devices Mac
518+
pool: $(XA.Build.Mac.Pool)
519+
timeoutInMinutes: 180
520+
cancelTimeoutInMinutes: 5
521+
workspace:
522+
clean: all
523+
steps:
524+
- template: yaml-templates/mac/setup-test-environment.yaml
525+
526+
- task: DownloadPipelineArtifact@1
527+
inputs:
528+
artifactName: $(NUnitTestAssembliesArtifactName)
529+
downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)
530+
531+
- task: MSBuild@1
532+
displayName: start emulator
533+
inputs:
534+
solution: src/Mono.Android/Test/Mono.Android-Tests.csproj
535+
configuration: $(XA.Build.Configuration)
536+
msbuildArguments: >
537+
/t:AcquireAndroidTarget /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/start-emulator.binlog
538+
539+
- script: >
540+
mono packages/NUnit.ConsoleRunner.3.9.0/tools/nunit3-console.exe
541+
$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/MSBuildDeviceIntegration.dll
542+
--result TestResult-DeviceBuildTests-$(XA.Build.Configuration).xml
543+
displayName: run on-device Xamarin.Android.Build.Tests
544+
545+
- task: PublishTestResults@2
546+
displayName: publish test results
547+
inputs:
548+
testResultsFormat: NUnit
549+
testResultsFiles: TestResult-DeviceBuildTests-$(XA.Build.Configuration).xml
550+
testRunTitle: DeviceBuildTestsMac
551+
condition: succeededOrFailed()
552+
553+
- task: MSBuild@1
554+
displayName: shut down emulator
555+
inputs:
556+
solution: src/Mono.Android/Test/Mono.Android-Tests.csproj
557+
configuration: $(XA.Build.Configuration)
558+
msbuildArguments: >
559+
/t:AcquireAndroidTarget,ReleaseAndroidTarget
560+
/bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/shutdown-emulator.binlog
561+
condition: always()
562+
563+
- task: MSBuild@1
564+
displayName: package results
565+
inputs:
566+
solution: build-tools/xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj
567+
configuration: $(XA.Build.Configuration)
568+
msbuildArguments: /t:Build,ZipBuildStatus,ZipTestResults /p:BuildStatusZipOutputPath=$(Build.ArtifactStagingDirectory) /p:TestResultZipOutputPath=$(Build.ArtifactStagingDirectory)
569+
condition: always()
570+
571+
- task: PublishPipelineArtifact@0
572+
displayName: upload artifacts
573+
inputs:
574+
artifactName: mac-devicebuildtask-testresults
575+
targetPath: $(Build.ArtifactStagingDirectory)
576+
condition: always()
577+
496578
# Check - "Xamarin.Android (Test Designer Mac)"
497579
- job: designer_integration_mac
498580
displayName: Designer Mac
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
parameters:
2+
configuration: $(XA.Build.Configuration)
3+
4+
steps:
5+
- task: DownloadPipelineArtifact@1
6+
inputs:
7+
artifactName: $(InstallerArtifactName)
8+
itemPattern: "*.pkg"
9+
downloadPath: $(System.DefaultWorkingDirectory)
10+
11+
- template: ../run-installer.yaml
12+
13+
- task: MSBuild@1
14+
displayName: build xaprepare
15+
inputs:
16+
solution: build-tools/xaprepare/xaprepare.sln
17+
configuration: ${{ parameters.configuration }}
18+
msbuildArguments: /t:Restore,Build
19+
20+
- script: |
21+
mono build-tools/xaprepare/xaprepare/bin/${{ parameters.configuration }}/xaprepare.exe --s=UpdateMono --auto-provision=yes --auto-provision-uses-sudo=yes --no-emoji --run-mode=CI
22+
mono build-tools/xaprepare/xaprepare/bin/${{ parameters.configuration }}/xaprepare.exe --s=Required --auto-provision=yes --auto-provision-uses-sudo=yes --no-emoji --run-mode=CI
23+
mono build-tools/xaprepare/xaprepare/bin/${{ parameters.configuration }}/xaprepare.exe --s=AndroidToolchain --no-emoji --run-mode=CI
24+
displayName: provision dependencies
25+
26+
# Restore solutions for Xamarin.Android.Tools.sln, Xamarin.Android.sln, and Xamarin.Android-Tests.sln
27+
- task: NuGetCommand@2
28+
displayName: nuget restore Xamarin.Android solutions
29+
inputs:
30+
restoreSolution: '**/Xamarin.Android*.sln'
31+
32+
- task: MSBuild@1
33+
displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj
34+
inputs:
35+
solution: build-tools/xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj
36+
configuration: ${{ parameters.configuration }}
37+
msbuildArguments: /bl:$(System.DefaultWorkingDirectory)/bin/Test${{ parameters.configuration }}/BootstrapTasks.binlog
38+

build-tools/xaprepare/xaprepare/Steps/Step_GenerateFiles.cs

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ List<GeneratedFile> GetFilesToGenerate (Context context)
4545
return new List <GeneratedFile> {
4646
Get_Configuration_OperatingSystem_props (context),
4747
Get_Ndk_projitems (context),
48-
Get_XABuildPaths_cs (context),
4948
Get_XABuildConfig_cs (context),
5049
Get_mingw_32_cmake (context),
5150
Get_mingw_64_cmake (context),
@@ -104,22 +103,6 @@ GeneratedFile Get_Configuration_OperatingSystem_props (Context context)
104103
);
105104
}
106105

107-
GeneratedFile Get_XABuildPaths_cs (Context context)
108-
{
109-
const string OutputFileName = "XABuildPaths.cs";
110-
111-
var replacements = new Dictionary<string, string> (StringComparer.Ordinal) {
112-
{ "@CONFIGURATION@", context.Configuration },
113-
{ "@TOP_DIRECTORY@", BuildPaths.XamarinAndroidSourceRoot },
114-
};
115-
116-
return new GeneratedPlaceholdersFile (
117-
replacements,
118-
Path.Combine (Configurables.Paths.BuildToolsScriptsDir, $"{OutputFileName}.in"),
119-
Path.Combine (Configurables.Paths.TestBinDir, OutputFileName)
120-
);
121-
}
122-
123106
GeneratedFile Get_XABuildConfig_cs (Context context)
124107
{
125108
const string OutputFileName = "XABuildConfig.cs";

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,7 @@ public void BuildProguardEnabledProject ([Values (true, false)] bool isRelease,
854854
"Landroid/runtime/UncaughtExceptionHandler;",
855855
};
856856
foreach (var className in classes) {
857-
Assert.IsTrue (DexUtils.ContainsClassWithMethod (className, "<init>", "()V", dexFile, b.AndroidSdkDirectory), $"`{dexFile}` should include `{className}`!");
857+
Assert.IsTrue (DexUtils.ContainsClassWithMethod (className, "<init>", "()V", dexFile, AndroidSdkPath), $"`{dexFile}` should include `{className}`!");
858858
}
859859
}
860860
}
@@ -1070,7 +1070,7 @@ public void MultiDexAndCodeShrinker ([Values ("proguard", "r8")] string linkTool
10701070
var className = "Landroid/support/multidex/MultiDexApplication;";
10711071
var dexFile = b.Output.GetIntermediaryPath (Path.Combine ("android", "bin", "classes.dex"));
10721072
FileAssert.Exists (dexFile);
1073-
Assert.IsTrue (DexUtils.ContainsClassWithMethod (className, "<init>", "()V", dexFile, b.AndroidSdkDirectory), $"`{dexFile}` should include `{className}`!");
1073+
Assert.IsTrue (DexUtils.ContainsClassWithMethod (className, "<init>", "()V", dexFile, AndroidSdkPath), $"`{dexFile}` should include `{className}`!");
10741074
}
10751075
}
10761076

@@ -1532,8 +1532,8 @@ public void DuplicateValuesInResourceCaseMap ()
15321532
void FixLintOnWindows ()
15331533
{
15341534
if (Environment.OSVersion.Platform == PlatformID.Win32NT) {
1535-
var userProfile = Environment.GetFolderPath (Environment.SpecialFolder.UserProfile);
1536-
var androidSdkTools = Path.Combine (userProfile, "android-toolchain", "sdk", "tools");
1535+
var androidSdk = AndroidSdkResolver.GetAndroidSdkPath ();
1536+
var androidSdkTools = Path.Combine (androidSdk, "tools");
15371537
if (Directory.Exists (androidSdkTools)) {
15381538
Environment.SetEnvironmentVariable ("JAVA_OPTS", $"\"-Dcom.android.tools.lint.bindir={androidSdkTools}\"", EnvironmentVariableTarget.Process);
15391539
}
@@ -2075,8 +2075,8 @@ public void BuildWithExternalJavaLibrary ()
20752075
AndroidClassParser = "class-parse",
20762076
};
20772077
using (var bbuilder = CreateDllBuilder (Path.Combine (path, "BuildWithExternalJavaLibraryBinding"))) {
2078-
string multidex_path = bbuilder.RunningMSBuild ? @"$(MSBuildExtensionsPath)" : @"$(MonoDroidInstallDirectory)\lib\xamarin.android\xbuild";
2079-
string multidex_jar = $@"{multidex_path}\Xamarin\Android\android-support-multidex.jar";
2078+
string multidex_path = bbuilder.RunningMSBuild ? TestEnvironment.MonoAndroidToolsDirectory : @"$(MonoDroidInstallDirectory)\lib\xamarin.android\xbuild\Xamarin\Android";
2079+
string multidex_jar = $@"{multidex_path}\android-support-multidex.jar";
20802080
binding.Jars.Add (new AndroidItem.InputJar (() => multidex_jar));
20812081

20822082
Assert.IsTrue (bbuilder.Build (binding));
@@ -2502,7 +2502,7 @@ public void BuildApplicationWithSpacesInPath ([Values (true, false)] bool enable
25022502
var className = "Lmono/MonoRuntimeProvider;";
25032503
var dexFile = b.Output.GetIntermediaryPath (Path.Combine ("android", "bin", "classes.dex"));
25042504
FileAssert.Exists (dexFile);
2505-
Assert.IsTrue (DexUtils.ContainsClass (className, dexFile, b.AndroidSdkDirectory), $"`{dexFile}` should include `{className}`!");
2505+
Assert.IsTrue (DexUtils.ContainsClass (className, dexFile, AndroidSdkPath), $"`{dexFile}` should include `{className}`!");
25062506
}
25072507
}
25082508

@@ -3485,7 +3485,7 @@ public void foo()
34853485
var className = "Lmono/MonoRuntimeProvider;";
34863486
var dexFile = builder.Output.GetIntermediaryPath (Path.Combine ("android", "bin", "classes.dex"));
34873487
FileAssert.Exists (dexFile);
3488-
Assert.IsTrue (DexUtils.ContainsClass (className, dexFile, builder.AndroidSdkDirectory), $"`{dexFile}` should include `{className}`!");
3488+
Assert.IsTrue (DexUtils.ContainsClass (className, dexFile, AndroidSdkPath), $"`{dexFile}` should include `{className}`!");
34893489
}
34903490
}
34913491

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/ManagedResourceParserTests.cs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using NUnit.Framework;
44
using Xamarin.ProjectTools;
@@ -151,16 +151,8 @@ int styleable MultiSelectListPreference_entries 2
151151
int styleable MultiSelectListPreference_entryValues 3
152152
int transition transition 0x7f0f0000
153153
";
154-
[OneTimeSetUp]
155-
public void Setup ()
156-
{
157-
using (var builder = new Builder ()) {
158-
builder.ResolveSdks ();
159-
AndroidSdkDirectory = builder.AndroidSdkDirectory;
160-
}
161-
}
162154

163-
public string AndroidSdkDirectory { get; set; }
155+
public string AndroidSdkDirectory { get; set; } = AndroidSdkResolver.GetAndroidSdkPath ();
164156

165157
public void CreateResourceDirectory (string path)
166158
{

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/NdkUtilTests.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Microsoft.Build.Framework;
1+
using Microsoft.Build.Framework;
22
using Microsoft.Build.Utilities;
33
using NUnit.Framework;
44
using System;
@@ -30,9 +30,8 @@ public void TestNdkUtil ()
3030
{
3131
var log = new TaskLoggingHelper (engine, TestName);
3232
using (var builder = new Builder ()) {
33-
builder.ResolveSdks ();
34-
var ndkDir = builder.AndroidNdkDirectory;
35-
var sdkDir = builder.AndroidSdkDirectory;
33+
var ndkDir = AndroidNdkPath;
34+
var sdkDir = AndroidSdkPath;
3635
MonoAndroidHelper.AndroidSdk = new AndroidSdkInfo ((arg1, arg2) => { }, sdkDir, ndkDir);
3736
NdkUtil.Init (log, ndkDir);
3837
var platforms = NdkUtil.GetSupportedPlatforms (ndkDir);

0 commit comments

Comments
 (0)