mirror of
https://github.com/actions/runner.git
synced 2025-12-10 12:36:23 +00:00
* Added Snapshot TemplateToken to AgentJobRequestMessage * WIP for processing the snapshot token * Changed snapshot post job step condition to Success, added comments * Refactored snapshot post-job step * Added evaluation of snapshot token to retrieve image name * Added snapshot to workflow schema * Fixed linter error * Migrated snapshot logic to new SnapshotOperationProvider * Fixed linter error * Fixed linter errors * Fixed linter error * Fixed linter errors * Updated L0 tests * Fixed linter errors * Added new JobExtensionL0 tests for snapshot post-job step * Added JobExtensionL0 test case for snapshot mappings * Added SnapshotOperationProviderL0 tests * Enabled nullable types for SnapshotOperationProvider and its tests * Added more assertions to SnapshotOperationProviderL0 tests * Fixed linter errors * Made sure TestHostContexts are disposed of properlyh in SnapshotOperationProviderL0 tests * Resolved PR comments * Fixed formatting * Removed redundant reference * Addressed PR comments
79 lines
3.2 KiB
C#
79 lines
3.2 KiB
C#
#nullable enable
|
|
using System;
|
|
using System.IO;
|
|
using System.Runtime.CompilerServices;
|
|
using GitHub.DistributedTask.Pipelines;
|
|
using GitHub.Runner.Sdk;
|
|
using GitHub.Runner.Worker;
|
|
using Moq;
|
|
using Xunit;
|
|
|
|
namespace GitHub.Runner.Common.Tests.Worker;
|
|
|
|
public class SnapshotOperationProviderL0
|
|
{
|
|
private Mock<IExecutionContext>? _ec;
|
|
private SnapshotOperationProvider? _snapshotOperationProvider;
|
|
private string? _snapshotRequestFilePath;
|
|
private string? _snapshotRequestDirectoryPath;
|
|
|
|
[Theory]
|
|
[InlineData(true)]
|
|
[InlineData(false)]
|
|
[Trait("Level", "L0")]
|
|
[Trait("Category", "Worker")]
|
|
public async void CreateSnapshotRequestAsync(bool shouldSnapshotDirectoryAlreadyExist)
|
|
{
|
|
using (TestHostContext testHostContext = CreateTestHostContext())
|
|
{
|
|
//Arrange
|
|
Setup(testHostContext, shouldSnapshotDirectoryAlreadyExist);
|
|
var expectedSnapshot = new Snapshot(Guid.NewGuid().ToString());
|
|
|
|
//Act
|
|
await _snapshotOperationProvider!.CreateSnapshotRequestAsync(_ec!.Object, expectedSnapshot);
|
|
|
|
//Assert
|
|
var actualSnapshot = IOUtil.LoadObject<Snapshot>(_snapshotRequestFilePath);
|
|
Assert.NotNull(actualSnapshot);
|
|
Assert.Equal(expectedSnapshot.ImageName, actualSnapshot!.ImageName);
|
|
_ec.Verify(ec => ec.Write(null, $"Request written to: {_snapshotRequestFilePath}"), Times.Once);
|
|
_ec.Verify(ec => ec.Write(null, "This request will be processed after the job completes. You will not receive any feedback on the snapshot process within the workflow logs of this job."), Times.Once);
|
|
_ec.Verify(ec => ec.Write(null, "If the snapshot process is successful, you should see a new image with the requested name in the list of available custom images when creating a new GitHub-hosted Runner."), Times.Once);
|
|
_ec.VerifyNoOtherCalls();
|
|
}
|
|
}
|
|
|
|
private void Setup(IHostContext hostContext, bool shouldSnapshotDirectoryAlreadyExist)
|
|
{
|
|
_ec = new Mock<IExecutionContext>();
|
|
_snapshotOperationProvider = new SnapshotOperationProvider();
|
|
_snapshotOperationProvider.Initialize(hostContext);
|
|
_snapshotRequestFilePath = Path.Combine(hostContext.GetDirectory(WellKnownDirectory.Root), ".snapshot", "request.json");
|
|
_snapshotRequestDirectoryPath = Path.GetDirectoryName(_snapshotRequestFilePath);
|
|
|
|
if (_snapshotRequestDirectoryPath != null)
|
|
{
|
|
// Clean up any existing the snapshot directory and its contents before starting the test.
|
|
if (Directory.Exists(_snapshotRequestDirectoryPath))
|
|
{
|
|
Directory.Delete(_snapshotRequestDirectoryPath, true);
|
|
}
|
|
|
|
if (shouldSnapshotDirectoryAlreadyExist)
|
|
{
|
|
// Create a fresh snapshot directory if it's required for the test.
|
|
Directory.CreateDirectory(_snapshotRequestDirectoryPath);
|
|
}
|
|
}
|
|
}
|
|
|
|
private TestHostContext CreateTestHostContext([CallerMemberName] string testName = "")
|
|
{
|
|
var testHostContext = new TestHostContext(this, testName);
|
|
_ec = new Mock<IExecutionContext>();
|
|
_ec.Object.Initialize(testHostContext);
|
|
return testHostContext;
|
|
}
|
|
}
|