Enable hostcontext to track auth migration. (#3776)

This commit is contained in:
Tingluo Huang
2025-03-31 15:26:56 -04:00
committed by GitHub
parent 2cb1f9431a
commit cdeec012aa
4 changed files with 253 additions and 8 deletions

View File

@@ -1,10 +1,10 @@
using GitHub.Runner.Common.Util;
using System;
using System;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Xunit;
namespace GitHub.Runner.Common.Tests
@@ -172,6 +172,133 @@ namespace GitHub.Runner.Common.Tests
}
}
[Fact]
[Trait("Level", "L0")]
[Trait("Category", "Common")]
public void AuthMigrationDisabledByDefault()
{
try
{
Environment.SetEnvironmentVariable("_GITHUB_ACTION_AUTH_MIGRATION_REFRESH_INTERVAL", "100");
// Arrange.
Setup();
// Assert.
Assert.False(_hc.AllowAuthMigration);
// Change migration state is error free.
_hc.EnableAuthMigration("L0Test");
_hc.DeferAuthMigration(TimeSpan.FromHours(1), "L0Test");
}
finally
{
Environment.SetEnvironmentVariable("_GITHUB_ACTION_AUTH_MIGRATION_REFRESH_INTERVAL", null);
// Cleanup.
Teardown();
}
}
[Fact]
[Trait("Level", "L0")]
[Trait("Category", "Common")]
public async Task AuthMigrationReenableTaskNotRunningByDefault()
{
try
{
Environment.SetEnvironmentVariable("_GITHUB_ACTION_AUTH_MIGRATION_REFRESH_INTERVAL", "50");
// Arrange.
Setup();
// Assert.
Assert.False(_hc.AllowAuthMigration);
await Task.Delay(TimeSpan.FromMilliseconds(200));
}
finally
{
Environment.SetEnvironmentVariable("_GITHUB_ACTION_AUTH_MIGRATION_REFRESH_INTERVAL", null);
// Cleanup.
Teardown();
}
var logFile = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), $"trace_{nameof(HostContextL0)}_{nameof(AuthMigrationReenableTaskNotRunningByDefault)}.log");
var logContent = await File.ReadAllTextAsync(logFile);
Assert.Contains("HostContext", logContent);
Assert.DoesNotContain("Auth migration defer timer", logContent);
}
[Fact]
[Trait("Level", "L0")]
[Trait("Category", "Common")]
public void AuthMigrationEnableDisable()
{
try
{
// Arrange.
Setup();
var eventFiredCount = 0;
_hc.AuthMigrationChanged += (sender, e) =>
{
eventFiredCount++;
Assert.Equal("L0Test", e.Trace);
};
// Assert.
_hc.EnableAuthMigration("L0Test");
Assert.True(_hc.AllowAuthMigration);
_hc.DeferAuthMigration(TimeSpan.FromHours(1), "L0Test");
Assert.False(_hc.AllowAuthMigration);
Assert.Equal(2, eventFiredCount);
}
finally
{
// Cleanup.
Teardown();
}
}
[Fact]
[Trait("Level", "L0")]
[Trait("Category", "Common")]
public async Task AuthMigrationAutoReset()
{
try
{
Environment.SetEnvironmentVariable("_GITHUB_ACTION_AUTH_MIGRATION_REFRESH_INTERVAL", "100");
// Arrange.
Setup();
var eventFiredCount = 0;
_hc.AuthMigrationChanged += (sender, e) =>
{
eventFiredCount++;
Assert.NotEmpty(e.Trace);
};
// Assert.
_hc.EnableAuthMigration("L0Test");
Assert.True(_hc.AllowAuthMigration);
_hc.DeferAuthMigration(TimeSpan.FromMilliseconds(500), "L0Test");
Assert.False(_hc.AllowAuthMigration);
await Task.Delay(TimeSpan.FromSeconds(1));
Assert.True(_hc.AllowAuthMigration);
Assert.Equal(3, eventFiredCount);
}
finally
{
Environment.SetEnvironmentVariable("_GITHUB_ACTION_AUTH_MIGRATION_REFRESH_INTERVAL", null);
// Cleanup.
Teardown();
}
}
private void Setup([CallerMemberName] string testName = "")
{
_tokenSource = new CancellationTokenSource();

View File

@@ -1,16 +1,15 @@
using GitHub.Runner.Common.Util;
using System;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Net.Http.Headers;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Loader;
using System.Threading;
using System.Threading.Tasks;
using System.Runtime.Loader;
using System.Reflection;
using System.Collections.Generic;
using GitHub.DistributedTask.Logging;
using System.Net.Http.Headers;
using GitHub.Runner.Sdk;
namespace GitHub.Runner.Common.Tests
@@ -31,6 +30,7 @@ namespace GitHub.Runner.Common.Tests
private StartupType _startupType;
public event EventHandler Unloading;
public event EventHandler<DelayEventArgs> Delaying;
public event EventHandler<AuthMigrationEventArgs> AuthMigrationChanged;
public CancellationToken RunnerShutdownToken => _runnerShutdownTokenSource.Token;
public ShutdownReason RunnerShutdownReason { get; private set; }
public ISecretMasker SecretMasker => _secretMasker;
@@ -92,6 +92,8 @@ namespace GitHub.Runner.Common.Tests
public RunnerWebProxy WebProxy => new();
public bool AllowAuthMigration { get; set; }
public async Task Delay(TimeSpan delay, CancellationToken token)
{
// Event callback
@@ -387,6 +389,18 @@ namespace GitHub.Runner.Common.Tests
{
return;
}
public void EnableAuthMigration(string trace)
{
AllowAuthMigration = true;
AuthMigrationChanged?.Invoke(this, new AuthMigrationEventArgs(trace));
}
public void DeferAuthMigration(TimeSpan deferred, string trace)
{
AllowAuthMigration = false;
AuthMigrationChanged?.Invoke(this, new AuthMigrationEventArgs(trace));
}
}
public class DelayEventArgs : EventArgs