Fix tests in Dev Container (#965)
This commit is contained in:
parent
00bb5b2678
commit
b9c9f44e06
5 changed files with 18 additions and 18 deletions
|
|
@ -19,5 +19,5 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"postCreateCommand": "dotnet --list-sdks && echo 'Available .NET SDKs installed successfully!'"
|
"postCreateCommand": "dotnet dev-certs https --trust && dotnet --list-sdks && echo 'Available .NET SDKs installed successfully!'"
|
||||||
}
|
}
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Connections;
|
using Microsoft.AspNetCore.Connections;
|
||||||
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
|
||||||
using ModelContextProtocol.Tests.Utils;
|
using ModelContextProtocol.Tests.Utils;
|
||||||
|
|
||||||
namespace ModelContextProtocol.AspNetCore.Tests.Utils;
|
namespace ModelContextProtocol.AspNetCore.Tests.Utils;
|
||||||
|
|
@ -11,11 +11,11 @@ public class KestrelInMemoryTest : LoggedTest
|
||||||
public KestrelInMemoryTest(ITestOutputHelper testOutputHelper)
|
public KestrelInMemoryTest(ITestOutputHelper testOutputHelper)
|
||||||
: base(testOutputHelper)
|
: base(testOutputHelper)
|
||||||
{
|
{
|
||||||
// Use SlimBuilder instead of EmptyBuilder to avoid having to call UseRouting() and UseEndpoints(_ => { })
|
Builder = WebApplication.CreateEmptyBuilder(new());
|
||||||
// or a helper that does the same every test. But clear out the existing socket transport to avoid potential port conflicts.
|
|
||||||
Builder = WebApplication.CreateSlimBuilder();
|
|
||||||
Builder.Services.RemoveAll<IConnectionListenerFactory>();
|
|
||||||
Builder.Services.AddSingleton<IConnectionListenerFactory>(KestrelInMemoryTransport);
|
Builder.Services.AddSingleton<IConnectionListenerFactory>(KestrelInMemoryTransport);
|
||||||
|
Builder.WebHost.UseKestrelCore();
|
||||||
|
Builder.Services.AddRoutingCore();
|
||||||
|
Builder.Services.AddLogging();
|
||||||
Builder.Services.AddSingleton(XunitLoggerProvider);
|
Builder.Services.AddSingleton(XunitLoggerProvider);
|
||||||
|
|
||||||
SocketsHttpHandler.ConnectCallback = (context, token) =>
|
SocketsHttpHandler.ConnectCallback = (context, token) =>
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,18 @@ namespace ModelContextProtocol.AspNetCore.Tests.Utils;
|
||||||
|
|
||||||
public sealed class KestrelInMemoryTransport : IConnectionListenerFactory
|
public sealed class KestrelInMemoryTransport : IConnectionListenerFactory
|
||||||
{
|
{
|
||||||
// socket accept queues keyed by listen port.
|
// Socket accept queues keyed by listen port.
|
||||||
private readonly ConcurrentDictionary<int, Channel<ConnectionContext>> _acceptQueues = [];
|
private readonly ConcurrentDictionary<int, Channel<ConnectionContext>> _acceptQueues = [];
|
||||||
|
|
||||||
public KestrelInMemoryConnection CreateConnection(EndPoint endpoint)
|
public KestrelInMemoryConnection CreateConnection(EndPoint endpoint)
|
||||||
{
|
{
|
||||||
|
if (!_acceptQueues.TryGetValue(GetEndpointPort(endpoint), out var acceptQueue))
|
||||||
|
{
|
||||||
|
throw new IOException($"No listener is bound to endpoint '{endpoint}'.");
|
||||||
|
}
|
||||||
|
|
||||||
var connection = new KestrelInMemoryConnection();
|
var connection = new KestrelInMemoryConnection();
|
||||||
if (!GetAcceptQueue(endpoint).Writer.TryWrite(connection))
|
if (!acceptQueue.Writer.TryWrite(connection))
|
||||||
{
|
{
|
||||||
throw new IOException("The KestrelInMemoryTransport has been shut down.");
|
throw new IOException("The KestrelInMemoryTransport has been shut down.");
|
||||||
};
|
};
|
||||||
|
|
@ -21,11 +26,11 @@ public sealed class KestrelInMemoryTransport : IConnectionListenerFactory
|
||||||
return connection;
|
return connection;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ValueTask<IConnectionListener> BindAsync(EndPoint endpoint, CancellationToken cancellationToken = default) =>
|
public ValueTask<IConnectionListener> BindAsync(EndPoint endpoint, CancellationToken cancellationToken = default)
|
||||||
new(new KestrelInMemoryListener(endpoint, GetAcceptQueue(endpoint)));
|
{
|
||||||
|
var acceptQueue = _acceptQueues.GetOrAdd(GetEndpointPort(endpoint), _ => Channel.CreateUnbounded<ConnectionContext>());
|
||||||
private Channel<ConnectionContext> GetAcceptQueue(EndPoint endpoint) =>
|
return new(new KestrelInMemoryListener(endpoint, acceptQueue));
|
||||||
_acceptQueues.GetOrAdd(GetEndpointPort(endpoint), _ => Channel.CreateUnbounded<ConnectionContext>());
|
}
|
||||||
|
|
||||||
private static int GetEndpointPort(EndPoint endpoint) =>
|
private static int GetEndpointPort(EndPoint endpoint) =>
|
||||||
endpoint switch
|
endpoint switch
|
||||||
|
|
|
||||||
|
|
@ -96,9 +96,6 @@ public sealed class Program
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
app.UseRouting();
|
|
||||||
app.UseEndpoints(_ => { });
|
|
||||||
|
|
||||||
// Set up the demo client
|
// Set up the demo client
|
||||||
var clientId = "demo-client";
|
var clientId = "demo-client";
|
||||||
var clientSecret = "demo-secret";
|
var clientSecret = "demo-secret";
|
||||||
|
|
|
||||||
|
|
@ -424,8 +424,6 @@ public class Program
|
||||||
.WithHttpTransport();
|
.WithHttpTransport();
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
app.UseRouting();
|
|
||||||
app.UseEndpoints(_ => { });
|
|
||||||
|
|
||||||
// Handle the /stateless endpoint if no other endpoints have been matched by the call to UseRouting above.
|
// Handle the /stateless endpoint if no other endpoints have been matched by the call to UseRouting above.
|
||||||
HandleStatelessMcp(app);
|
HandleStatelessMcp(app);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue