chore: import upstream snapshot with attribution
dotnet-build-and-test / dotnet-test-functions (push) Has been cancelled
dotnet-build-and-test / paths-filter (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Debug, windows-latest, net9.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net8.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-foundry-hosted-it (push) Has been cancelled
dotnet-build-and-test / dotnet-build-and-test-check (push) Has been cancelled
dotnet-build-and-test / Integration Test Report (push) Has been cancelled
CodeQL / Analyze (csharp) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled

This commit is contained in:
wehub-resource-sync
2026-07-13 13:39:25 +08:00
commit db620d33df
5151 changed files with 925932 additions and 0 deletions
@@ -0,0 +1,48 @@
// Copyright (c) Microsoft. All rights reserved.
using Microsoft.Extensions.Logging;
namespace Microsoft.Agents.AI.DurableTask.IntegrationTests.Logging;
internal sealed class LogEntry(
string category,
LogLevel level,
EventId eventId,
Exception? exception,
string message,
object? state,
IReadOnlyList<KeyValuePair<string, object?>> contextProperties)
{
public string Category { get; } = category;
public DateTime Timestamp { get; } = DateTime.Now;
public EventId EventId { get; } = eventId;
public LogLevel LogLevel { get; } = level;
public Exception? Exception { get; } = exception;
public string Message { get; } = message;
public object? State { get; } = state;
public IReadOnlyList<KeyValuePair<string, object?>> ContextProperties { get; } = contextProperties;
public override string ToString()
{
string properties = this.ContextProperties.Count > 0
? $"[{string.Join(", ", this.ContextProperties.Select(kvp => $"{kvp.Key}={kvp.Value}"))}] "
: string.Empty;
string eventName = this.EventId.Name ?? string.Empty;
string output = $"{this.Timestamp:o} [{this.Category}] {eventName} {properties}{this.Message}";
if (this.Exception is not null)
{
output += Environment.NewLine + this.Exception;
}
return output;
}
}
@@ -0,0 +1,49 @@
// Copyright (c) Microsoft. All rights reserved.
using System.Collections.Concurrent;
using Microsoft.Extensions.Logging;
namespace Microsoft.Agents.AI.DurableTask.IntegrationTests.Logging;
internal sealed class TestLogger(string category, ITestOutputHelper output) : ILogger
{
private readonly string _category = category;
private readonly ITestOutputHelper _output = output;
private readonly ConcurrentQueue<LogEntry> _entries = new();
public IReadOnlyCollection<LogEntry> GetLogs() => this._entries;
public void ClearLogs() => this._entries.Clear();
IDisposable? ILogger.BeginScope<TState>(TState state) => null;
bool ILogger.IsEnabled(LogLevel logLevel) => true;
void ILogger.Log<TState>(
LogLevel logLevel,
EventId eventId,
TState state,
Exception? exception,
Func<TState, Exception?, string> formatter)
{
LogEntry entry = new(
category: this._category,
level: logLevel,
eventId: eventId,
exception: exception,
message: formatter(state, exception),
state: state,
contextProperties: []);
this._entries.Enqueue(entry);
try
{
this._output.WriteLine(entry.ToString());
}
catch (InvalidOperationException)
{
// Expected when tests are shutting down
}
}
}
@@ -0,0 +1,51 @@
// Copyright (c) Microsoft. All rights reserved.
using System.Collections.Concurrent;
using Microsoft.Extensions.Logging;
namespace Microsoft.Agents.AI.DurableTask.IntegrationTests.Logging;
internal sealed class TestLoggerProvider(ITestOutputHelper output) : ILoggerProvider
{
private readonly ITestOutputHelper _output = output ?? throw new ArgumentNullException(nameof(output));
private readonly ConcurrentDictionary<string, TestLogger> _loggers = new(StringComparer.OrdinalIgnoreCase);
public bool TryGetLogs(string category, out IReadOnlyCollection<LogEntry> logs)
{
if (this._loggers.TryGetValue(category, out TestLogger? logger))
{
logs = logger.GetLogs();
return true;
}
logs = [];
return false;
}
public IReadOnlyCollection<LogEntry> GetAllLogs()
{
return this._loggers.Values
.OfType<TestLogger>()
.SelectMany(logger => logger.GetLogs())
.ToList()
.AsReadOnly();
}
public void Clear()
{
foreach (TestLogger logger in this._loggers.Values.OfType<TestLogger>())
{
logger.ClearLogs();
}
}
ILogger ILoggerProvider.CreateLogger(string categoryName)
{
return this._loggers.GetOrAdd(categoryName, _ => new TestLogger(categoryName, this._output));
}
void IDisposable.Dispose()
{
// no-op
}
}