[Blazor] Fix manifest integrity computation (#22771)
* [Blazor] Fix manifest integrity computation * Add a couple of tests to validate incrementalism
This commit is contained in:
parent
ce533485f0
commit
9d7018544a
|
|
@ -163,7 +163,7 @@
|
||||||
|
|
||||||
<WriteLinesToFile
|
<WriteLinesToFile
|
||||||
File="$(_CombinedHashIntermediatePath)"
|
File="$(_CombinedHashIntermediatePath)"
|
||||||
Lines="@(_ServiceWorkerAssetsManifestItemWithHash->'%(FileHash)')"
|
Lines="@(_ServiceWorkerAssetsManifestItemWithHash->'%(Integrity)')"
|
||||||
WriteOnlyWhenDifferent="true"
|
WriteOnlyWhenDifferent="true"
|
||||||
Overwrite="true" />
|
Overwrite="true" />
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
|
|
@ -41,5 +42,77 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Build
|
||||||
var entries = assets.EnumerateArray().Select(e => e.GetProperty("url").GetString()).OrderBy(e => e).ToArray();
|
var entries = assets.EnumerateArray().Select(e => e.GetProperty("url").GetString()).OrderBy(e => e).ToArray();
|
||||||
Assert.All(entries, e => expectedExtensions.Contains(Path.GetExtension(e)));
|
Assert.All(entries, e => expectedExtensions.Contains(Path.GetExtension(e)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Publish_UpdatesServiceWorkerVersionHash_WhenSourcesChange()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
using var project = ProjectDirectory.Create("standalone", additionalProjects: new[] { "razorclasslibrary" });
|
||||||
|
var result = await MSBuildProcessManager.DotnetMSBuild(project, "Publish", args: "/bl:initial.binlog /p:ServiceWorkerAssetsManifest=service-worker-assets.js");
|
||||||
|
|
||||||
|
Assert.BuildPassed(result);
|
||||||
|
|
||||||
|
var publishOutputDirectory = project.PublishOutputDirectory;
|
||||||
|
|
||||||
|
var serviceWorkerFile = Assert.FileExists(result, publishOutputDirectory, "wwwroot", "serviceworkers", "my-service-worker.js");
|
||||||
|
var version = File.ReadAllLines(serviceWorkerFile).Last();
|
||||||
|
var match = Regex.Match(version, "\\/\\* Manifest version: (.{8}) \\*\\/");
|
||||||
|
Assert.True(match.Success);
|
||||||
|
Assert.Equal(2, match.Groups.Count);
|
||||||
|
Assert.NotNull(match.Groups[1].Value);
|
||||||
|
var capture = match.Groups[1].Value;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var cssFile = Path.Combine(project.DirectoryPath, "LinkToWebRoot", "css", "app.css");
|
||||||
|
File.WriteAllText(cssFile, ".updated { }");
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
var updatedResult = await MSBuildProcessManager.DotnetMSBuild(project, "Publish", args: "/bl:updated.binlog /p:ServiceWorkerAssetsManifest=service-worker-assets.js");
|
||||||
|
|
||||||
|
Assert.BuildPassed(result);
|
||||||
|
|
||||||
|
var updatedVersion = File.ReadAllLines(serviceWorkerFile).Last();
|
||||||
|
var updatedMatch = Regex.Match(updatedVersion, "\\/\\* Manifest version: (.{8}) \\*\\/");
|
||||||
|
Assert.True(updatedMatch.Success);
|
||||||
|
Assert.Equal(2, updatedMatch.Groups.Count);
|
||||||
|
Assert.NotNull(updatedMatch.Groups[1].Value);
|
||||||
|
var updatedCapture = updatedMatch.Groups[1].Value;
|
||||||
|
|
||||||
|
Assert.NotEqual(capture, updatedCapture);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Publish_DeterministicAcrossBuilds_WhenNoSourcesChange()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
using var project = ProjectDirectory.Create("standalone", additionalProjects: new[] { "razorclasslibrary" });
|
||||||
|
var result = await MSBuildProcessManager.DotnetMSBuild(project, "Publish", args: "/bl:initial.binlog /p:ServiceWorkerAssetsManifest=service-worker-assets.js");
|
||||||
|
|
||||||
|
Assert.BuildPassed(result);
|
||||||
|
|
||||||
|
var publishOutputDirectory = project.PublishOutputDirectory;
|
||||||
|
|
||||||
|
var serviceWorkerFile = Assert.FileExists(result, publishOutputDirectory, "wwwroot", "serviceworkers", "my-service-worker.js");
|
||||||
|
var version = File.ReadAllLines(serviceWorkerFile).Last();
|
||||||
|
var match = Regex.Match(version, "\\/\\* Manifest version: (.{8}) \\*\\/");
|
||||||
|
Assert.True(match.Success);
|
||||||
|
Assert.Equal(2, match.Groups.Count);
|
||||||
|
Assert.NotNull(match.Groups[1].Value);
|
||||||
|
var capture = match.Groups[1].Value;
|
||||||
|
|
||||||
|
// Act && Assert
|
||||||
|
var updatedResult = await MSBuildProcessManager.DotnetMSBuild(project, "Publish", args: "/bl:updated.binlog /p:ServiceWorkerAssetsManifest=service-worker-assets.js");
|
||||||
|
|
||||||
|
Assert.BuildPassed(result);
|
||||||
|
|
||||||
|
var updatedVersion = File.ReadAllLines(serviceWorkerFile).Last();
|
||||||
|
var updatedMatch = Regex.Match(updatedVersion, "\\/\\* Manifest version: (.{8}) \\*\\/");
|
||||||
|
Assert.True(updatedMatch.Success);
|
||||||
|
Assert.Equal(2, updatedMatch.Groups.Count);
|
||||||
|
Assert.NotNull(updatedMatch.Groups[1].Value);
|
||||||
|
var updatedCapture = updatedMatch.Groups[1].Value;
|
||||||
|
|
||||||
|
Assert.Equal(capture, updatedCapture);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue