From f8c42606a6ebeef15a120fd8ae56789c187ce43d Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Wed, 2 Aug 2017 10:02:29 +0100 Subject: [PATCH] [Xamarin.Android.Build.Tests] Fix DesignTimeBuild Test The test was using the global cache to store the downloaded files. As a result if we get multiple tests/commits building at the same time we end up deleting files half way through a test run. So lets make use of a local cache for the test by using the `XAMARIN_CACHEPATH` environment variable. --- .../AndroidUpdateResourcesTest.cs | 24 +++++++++++++------ .../Utilities/BaseTest.cs | 7 ++++++ .../Xamarin.ProjectTools/Common/Builder.cs | 9 ++++++- .../Common/ProjectBuilder.cs | 8 +++---- .../Xamarin.Android.Common.targets | 6 +++++ 5 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidUpdateResourcesTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidUpdateResourcesTest.cs index 82f3e1dbfba..1d2651cae24 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidUpdateResourcesTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidUpdateResourcesTest.cs @@ -1,4 +1,4 @@ -using System; +using System; using Xamarin.ProjectTools; using NUnit.Framework; using System.Linq; @@ -37,14 +37,19 @@ public void RepetitiveBuild () [Test] public void DesignTimeBuild ([Values(false, true)] bool isRelease) { + var path = Path.Combine (Root, "temp", $"DesignTimeBuild_{isRelease}"); + var cachePath = Path.Combine (path, "Cache"); + var envVar = new Dictionary () { + { "XAMARIN_CACHEPATH", cachePath }, + }; var url = "http://dl-ssl.google.com/android/repository/build-tools_r24-macosx.zip"; var md5 = MD5.Create (); var hash = string.Concat (md5.ComputeHash (Encoding.UTF8.GetBytes (url)).Select (b => b.ToString ("X02"))); - var zipPath = Path.Combine (CachePath, "zips", $"{hash}.zip"); + var zipPath = Path.Combine (cachePath, "zips", $"{hash}.zip"); if (File.Exists (zipPath)) File.Delete (zipPath); - var extractedDir = Path.Combine (CachePath, "Lib1"); + var extractedDir = Path.Combine (cachePath, "Lib1"); if (Directory.Exists (extractedDir)) Directory.Delete (extractedDir, recursive: true); @@ -65,19 +70,24 @@ public void DesignTimeBuild ([Values(false, true)] bool isRelease) new BuildItem.ProjectReference (@"..\Lib1\Lib1.csproj", lib.ProjectName, lib.ProjectGuid), }, }; - var path = Path.Combine (Root, "temp", $"DesignTimeBuild_{isRelease}"); + using (var l = CreateDllBuilder (Path.Combine (path, lib.ProjectName))) { using (var b = CreateApkBuilder (Path.Combine (path, proj.ProjectName))) { l.Verbosity = LoggerVerbosity.Diagnostic; + Assert.IsTrue(l.Clean(lib), "Lib1 should have cleaned successfully"); Assert.IsTrue (l.Build (lib), "Lib1 should have built successfully"); b.Verbosity = LoggerVerbosity.Diagnostic; b.ThrowOnBuildFailure = false; - Assert.IsTrue (b.UpdateAndroidResources (proj, parameters: new string [] { "DesignTimeBuild=true" }), + Assert.IsTrue (b.Clean(proj), "App should have cleaned successfully"); + Assert.IsTrue (b.UpdateAndroidResources (proj, doNotCleanupOnUpdate: true, parameters: new string [] { "DesignTimeBuild=true" }, environmentVariables: envVar), "first build failed"); Assert.IsTrue (b.LastBuildOutput.Contains ("Skipping download of "), "failed to skip the downloading of files."); - Assert.IsTrue (b.Build (proj), "second build failed"); - Assert.IsTrue (File.Exists (zipPath), $"Zip should have been downloaded to {zipPath}"); + WaitFor (1000); + b.Target = "Build"; + Assert.IsTrue (b.Build (proj, doNotCleanupOnUpdate: true, parameters: new string [] { "DesignTimeBuild=false" }, environmentVariables: envVar), "second build failed"); + Assert.IsFalse(b.Output.IsTargetSkipped ("_BuildAdditionalResourcesCache"), "_BuildAdditionalResourcesCache should have run."); + Assert.IsTrue (b.LastBuildOutput.Contains($"Downloading {url}") || b.LastBuildOutput.Contains ($"reusing existing archive: {zipPath}"), $"{url} should have been downloaded."); Assert.IsTrue (File.Exists (Path.Combine (extractedDir, "1", "content", "android-N", "aapt")), $"Files should have been extracted to {extractedDir}"); } } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs index 54490a01ddf..89387830a95 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs @@ -5,6 +5,7 @@ using Xamarin.ProjectTools; using NUnit.Framework; using System.Linq; +using System.Threading; namespace Xamarin.Android.Build.Tests { @@ -51,6 +52,12 @@ public string Root { } } + protected void WaitFor(int milliseconds) + { + var pause = new ManualResetEvent(false); + pause.WaitOne(milliseconds); + } + protected static string RunAdbCommand (string command, bool ignoreErrors = true) { string ext = Environment.OSVersion.Platform != PlatformID.Unix ? ".exe" : ""; diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs index dbab6120a03..d3f2eebeb10 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using Microsoft.Build.Framework; using System.Text; +using System.Collections.Generic; namespace Xamarin.ProjectTools { @@ -97,7 +98,7 @@ string GetPathFromRegistry (string valueName) return null; } - protected bool BuildInternal (string projectOrSolution, string target, string [] parameters = null) + protected bool BuildInternal (string projectOrSolution, string target, string [] parameters = null, Dictionary environmentVariables = null) { string buildLogFullPath = (!string.IsNullOrEmpty (BuildLogFile)) ? Path.GetFullPath (Path.Combine (Root, Path.GetDirectoryName (projectOrSolution), BuildLogFile)) @@ -154,7 +155,13 @@ protected bool BuildInternal (string projectOrSolution, string target, string [] args.AppendFormat (" /p:{0}", param); } } + if (environmentVariables != null) { + foreach (var kvp in environmentVariables) { + psi.EnvironmentVariables[kvp.Key] = kvp.Value; + } + } psi.Arguments = args.ToString (); + psi.CreateNoWindow = true; psi.UseShellExecute = false; psi.RedirectStandardOutput = true; diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/ProjectBuilder.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/ProjectBuilder.cs index e0f5e50e2fe..8354b9bca94 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/ProjectBuilder.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/ProjectBuilder.cs @@ -54,7 +54,7 @@ public void Save (XamarinProject project, bool doNotCleanupOnUpdate = false, boo project.UpdateProjectFiles (ProjectDirectory, files, doNotCleanupOnUpdate); } - public bool Build (XamarinProject project, bool doNotCleanupOnUpdate = false, string [] parameters = null, bool saveProject = true) + public bool Build (XamarinProject project, bool doNotCleanupOnUpdate = false, string [] parameters = null, bool saveProject = true, Dictionary environmentVariables = null) { Save (project, doNotCleanupOnUpdate, saveProject); @@ -62,7 +62,7 @@ public bool Build (XamarinProject project, bool doNotCleanupOnUpdate = false, st project.NuGetRestore (ProjectDirectory, PackagesDirectory); - bool result = BuildInternal (Path.Combine (ProjectDirectory, project.ProjectFilePath), Target, parameters); + bool result = BuildInternal (Path.Combine (ProjectDirectory, project.ProjectFilePath), Target, parameters, environmentVariables); built_before = true; if (CleanupAfterSuccessfulBuild) @@ -83,12 +83,12 @@ public bool Clean (XamarinProject project, bool doNotCleanupOnUpdate = false) } } - public bool UpdateAndroidResources (XamarinProject project, bool doNotCleanupOnUpdate = false, string [] parameters = null) + public bool UpdateAndroidResources (XamarinProject project, bool doNotCleanupOnUpdate = false, string [] parameters = null, Dictionary environmentVariables = null) { var oldTarget = Target; Target = "UpdateAndroidResources"; try { - return Build (project, doNotCleanupOnUpdate: doNotCleanupOnUpdate, parameters: parameters); + return Build (project, doNotCleanupOnUpdate: doNotCleanupOnUpdate, parameters: parameters, environmentVariables: environmentVariables); } finally { Target = oldTarget; diff --git a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets index 89f5ed0e3e9..c3127c71ea7 100755 --- a/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets +++ b/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets @@ -377,6 +377,12 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved. + + <_BeforeBuildAdditionalResourcesCache> + _CreatePropertiesCache; + + +