feat: integrate performance upgrade and agent inspection tooling
Validate ShrinkSDK Workspace / catalog (push) Successful in 5s
Validate ShrinkSDK Workspace / unity (push) Successful in 3m20s

This commit is contained in:
2026-09-29 10:16:02 +08:00
parent f92105c97d
commit 08246ddb01
114 changed files with 7135 additions and 87 deletions
@@ -0,0 +1,70 @@
using System.Net;
using System.Net.Sockets;
using Cysharp.Threading.Tasks;
using NUnit.Framework;
using ShrinkNetwork;
[NonParallelizable]
public class NetworkTransportTests
{
[Test]
public async Task TcpRpcRoundTripAndCanceledSendPreserveNextFrame()
{
var reservation = new TcpListener(IPAddress.Loopback, 0); reservation.Start();
var port = ((IPEndPoint)reservation.LocalEndpoint).Port; reservation.Stop();
var serverTransport = new ShrinkTcpServerTransport(IPAddress.Loopback, port);
var clientTransport = new ShrinkTcpClientTransport("127.0.0.1", port);
var server = Service(); var client = Service();
var connected = new TaskCompletionSource<ShrinkNetworkSession>(TaskCreationOptions.RunContinuationsAsynchronously);
client.OnSessionConnected += session => connected.TrySetResult(session);
server.RegisterRequestHandler<Request, Response>((_, request) => UniTask.FromResult(new Response { Text = request.Text }));
try
{
server.BindTransport(serverTransport); client.BindTransport(clientTransport);
var session = await connected.Task.WaitAsync(TimeSpan.FromSeconds(5));
using var cancellation = new CancellationTokenSource(); cancellation.Cancel();
Assert.CatchAsync<OperationCanceledException>(async () => await clientTransport.SendAsync(1, new ReadOnlyMemory<byte>(new byte[100]), cancellation.Token));
var reply = await client.CallAsync<Request, Response>(session, new Request { Text = new string('t', 32768) }).AsTask().WaitAsync(TimeSpan.FromSeconds(5));
Assert.That(reply.Text.Length, Is.EqualTo(32768));
Assert.That(client.GetDiagnosticsSnapshot().RpcCompleted, Is.EqualTo(1));
}
finally { clientTransport.Stop(); serverTransport.Stop(); }
}
[Test]
public async Task NestedRpcResponseBypassesSerialHandlerQueue()
{
var a = new ShrinkLoopbackTransport(); var b = new ShrinkLoopbackTransport(); a.LinkPeer(b);
var client = Service(); var server = Service();
client.RegisterRequestHandler<Request, Response>((_, req) => UniTask.FromResult(new Response { Text = "nested:" + req.Text }));
server.RegisterRequestHandler<Request, Response>(async (ctx, req) => await server.CallAsync<Request, Response>(ctx.Session, req));
client.BindTransport(a); server.BindTransport(b); a.OpenSession(1);
var response = await client.CallAsync<Request, Response>(client.Sessions[1], new Request { Text = "ok" }).AsTask().WaitAsync(TimeSpan.FromSeconds(3));
Assert.That(response.Text, Is.EqualTo("nested:ok"));
a.Stop(); b.Stop();
}
[Test]
public async Task CongestionDisconnectsReliablePeerAndDoesNotResurrectSession()
{
var a = new ShrinkLoopbackTransport(); var b = new ShrinkLoopbackTransport(); a.LinkPeer(b);
using var queue = new ShrinkNetworkDispatchQueue(1, byteCapacity: 1024);
var client = Service(); var server = Service(); server.DispatchScheduler = queue;
client.BindTransport(a); server.BindTransport(b); a.OpenSession(1);
var session = client.Sessions[1];
var rejected = 0; server.OnDispatchRejected += _ => rejected++;
await client.SendAsync(session, new Request());
await client.SendAsync(session, new Request());
Assert.That(rejected, Is.EqualTo(1));
Assert.That(server.Sessions, Is.Empty);
await queue.PumpAsync(1);
Assert.That(server.Sessions, Is.Empty);
a.Stop(); b.Stop();
}
private static ShrinkNetworkService Service()
{
var service = new ShrinkNetworkService(); service.RegisterMessage<Request>(1); service.RegisterMessage<Response>(2); return service;
}
public sealed class Request : IShrinkNetworkRequest { public string Text { get; set; } = ""; }
public sealed class Response : ShrinkRpcResponseBase { public string Text { get; set; } = ""; }
}