Skip to content
Merged
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 @@ -2300,6 +2300,79 @@ public void CheckLintResourceFileReferencesAreFixed ([Values (AndroidRuntime.Cor
}
}

[Test]
public void BuildDoesNotModifyNuGetPackageCache ()
{
var proj = new XamarinAndroidApplicationProject {
IsRelease = true,
GlobalPackagesFolder = Path.Combine (Root, TestName, "packages"),
Imports = {
new Import (() => "EnableMarshalMethodsForPostLink.targets") {
TextContent = () =>
"""
<Project>
<!-- Exercise the in-place post-link path without enabling marshal methods for later CoreCLR targets. -->
<Target Name="_EnableMarshalMethodsForPostLink"
BeforeTargets="_RunAfterILLinkAdditionalSteps"
Condition=" '$(TestEnableMarshalMethodsForPostLink)' == 'true' ">
<PropertyGroup>
<_AndroidUseMarshalMethods>true</_AndroidUseMarshalMethods>
</PropertyGroup>
</Target>
</Project>
"""
},
},
PackageReferences = {
new Package { Id = "Humanizer.Core", Version = "2.14.1" },
new Package { Id = "Humanizer.Core.es", Version = "2.14.1" },
},
};
proj.SetRuntime (AndroidRuntime.CoreCLR);
proj.SetProperty ("AndroidTypeMapImplementation", "llvm-ir");
proj.SetProperty (KnownProperties.PublishTrimmed, true.ToString ());
proj.MainActivity = proj.DefaultMainActivity
.Replace ("//${USINGS}", "using Humanizer;")
.Replace ("//${AFTER_ONCREATE}", "System.Console.WriteLine (System.DateTime.UtcNow.Humanize ());");

using var builder = CreateApkBuilder ();
var buildParameters = new [] { $"RestorePackagesPath={proj.GlobalPackagesFolder}" };
Assert.IsTrue (builder.Restore (proj, parameters: buildParameters), "Package restore should have succeeded.");
Assert.IsTrue (builder.Build (proj, doNotCleanupOnUpdate: true, saveProject: false, parameters: buildParameters),
"Initial build should have succeeded.");

var satelliteAssemblies = Directory.GetFiles (proj.GlobalPackagesFolder, "*.resources.dll", SearchOption.AllDirectories);
Assert.IsNotEmpty (satelliteAssemblies, "The NuGet package should contain satellite assemblies.");

var originalWriteTimes = new Dictionary<string, DateTime> ();
foreach (string assembly in satelliteAssemblies) {
File.SetLastWriteTimeUtc (assembly, new DateTime (2000, 1, 1, 0, 0, 0, DateTimeKind.Utc));
originalWriteTimes.Add (assembly, File.GetLastWriteTimeUtc (assembly));
}

var postLinkStamp = Path.Combine (Root, builder.ProjectDirectory, proj.IntermediateOutputPath, "stamp", "_AdditionalPostLinkerSteps.stamp");
FileAssert.Exists (postLinkStamp);
File.Delete (postLinkStamp);

// A package cache is immutable: deny write sharing and verify timestamps remain unchanged.
var packageLocks = satelliteAssemblies
.Select (assembly => File.Open (assembly, FileMode.Open, FileAccess.Read, FileShare.Read))
.ToList ();
try {
var postLinkParameters = buildParameters.Append ("TestEnableMarshalMethodsForPostLink=true").ToArray ();
Assert.IsTrue (builder.RunTarget (proj, "_PrepareAssemblies", doNotCleanupOnUpdate: true, saveProject: false, parameters: postLinkParameters),
"Preparing assemblies should have succeeded.");
Comment thread
jonathanpeppers marked this conversation as resolved.
FileAssert.Exists (postLinkStamp);
foreach (string assembly in satelliteAssemblies) {
Assert.AreEqual (originalWriteTimes [assembly], File.GetLastWriteTimeUtc (assembly), $"Build should not modify '{assembly}'.");
}
} finally {
foreach (var packageLock in packageLocks) {
packageLock.Dispose ();
}
}
}

[Test]
[TestCase (true, AndroidRuntime.CoreCLR)]
[TestCase (false, AndroidRuntime.CoreCLR)]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1472,8 +1472,10 @@ because xbuild doesn't support framework reference assemblies.
Outputs="$(_AdditionalPostLinkerStepsFlag)">
<MakeDir Directories="$(_AfterILLinkOutputDir)" Condition=" '$(_AndroidUseMarshalMethods)' != 'True' " />
<ItemGroup>
<_AfterILLinkDestFiles Condition=" '$(_AndroidUseMarshalMethods)' != 'True' " Include="@(ResolvedAssemblies->'$(_AfterILLinkOutputDir)%(DestinationSubPath)')" />
<_AfterILLinkDestFiles Condition=" '$(_AndroidUseMarshalMethods)' == 'True' " Include="@(ResolvedAssemblies)" />
<_AfterILLinkSourceFiles Include="@(ResolvedAssemblies)"
Condition=" '$(_AndroidUseMarshalMethods)' != 'True' or !$([System.String]::Copy('%(ResolvedAssemblies.Filename)').ToLowerInvariant().EndsWith('.resources')) " />
<_AfterILLinkDestFiles Condition=" '$(_AndroidUseMarshalMethods)' != 'True' " Include="@(_AfterILLinkSourceFiles->'$(_AfterILLinkOutputDir)%(DestinationSubPath)')" />
<_AfterILLinkDestFiles Condition=" '$(_AndroidUseMarshalMethods)' == 'True' " Include="@(_AfterILLinkSourceFiles)" />
</ItemGroup>
<AssemblyModifierPipeline
ApplicationJavaClass="$(AndroidApplicationJavaClass)"
Expand All @@ -1487,11 +1489,12 @@ because xbuild doesn't support framework reference assemblies.
ReadSymbols="$(_AndroidLinkAssembliesReadSymbols)"
ResolvedAssemblies="@(_AllResolvedAssemblies)"
ResolvedUserAssemblies="@(ResolvedUserAssemblies)"
SourceFiles="@(ResolvedAssemblies)"
SourceFiles="@(_AfterILLinkSourceFiles)"
TargetName="$(TargetName)">
</AssemblyModifierPipeline>
<Touch Files="$(_AdditionalPostLinkerStepsFlag)" AlwaysCreate="true" />
<ItemGroup>
<_AfterILLinkSourceFiles Remove="@(_AfterILLinkSourceFiles)" />
<_AfterILLinkDestFiles Remove="@(_AfterILLinkDestFiles)" />
</ItemGroup>
<ItemGroup Condition=" '$(_AndroidUseMarshalMethods)' != 'True' ">
Expand Down
Loading