feat(client): add rendezvous traversal coordinators (#12)
quality-gate / quality (push) Successful in 56s
quality-gate / quality (push) Successful in 56s
This commit is contained in:
@@ -91,14 +91,16 @@ public sealed class JoinAttemptHttpEndpointTests
|
||||
using HttpResponseMessage cancelled = await host.HttpClient.SendAsync(cancelRequest);
|
||||
Assert.Equal(HttpStatusCode.NoContent, cancelled.StatusCode);
|
||||
|
||||
using HttpRequestMessage emptyPollRequest = new(
|
||||
using HttpRequestMessage cancelledPollRequest = new(
|
||||
HttpMethod.Get,
|
||||
$"v1/sessions/{session.ListingId}/join-attempts?contractVersion=1&pageSize=10");
|
||||
emptyPollRequest.Headers.Add("X-Rendezvous-Lease-Token", session.LeaseToken);
|
||||
using HttpResponseMessage emptyPollResponse = await host.HttpClient.SendAsync(emptyPollRequest);
|
||||
BrowseHostJoinAttemptsResponse empty = Assert.IsType<BrowseHostJoinAttemptsResponse>(
|
||||
await emptyPollResponse.Content.ReadFromJsonAsync<BrowseHostJoinAttemptsResponse>(ContractJson.Options));
|
||||
Assert.Empty(empty.Items);
|
||||
cancelledPollRequest.Headers.Add("X-Rendezvous-Lease-Token", session.LeaseToken);
|
||||
using HttpResponseMessage cancelledPollResponse = await host.HttpClient.SendAsync(cancelledPollRequest);
|
||||
BrowseHostJoinAttemptsResponse cancelledPoll = Assert.IsType<BrowseHostJoinAttemptsResponse>(
|
||||
await cancelledPollResponse.Content.ReadFromJsonAsync<BrowseHostJoinAttemptsResponse>(ContractJson.Options));
|
||||
HostJoinAttempt cancelledAttempt = Assert.Single(cancelledPoll.Items);
|
||||
Assert.Equal(created.AttemptId, cancelledAttempt.AttemptId);
|
||||
Assert.True(cancelledAttempt.IsCancelled);
|
||||
}
|
||||
|
||||
private static T AssertSuccess<T>(RendezvousClientResult<T> result)
|
||||
|
||||
@@ -152,12 +152,47 @@ public sealed class JoinAttemptServiceTests
|
||||
Assert.True(fixture.Service.Cancel(
|
||||
created.AttemptId,
|
||||
created.ClientPunchCapability).Succeeded);
|
||||
Assert.Empty(fixture.Service.BrowseForHost(
|
||||
Assert.True(fixture.Service.Cancel(
|
||||
created.AttemptId,
|
||||
created.ClientPunchCapability).Succeeded);
|
||||
HostJoinAttempt cancelled = Assert.Single(fixture.Service.BrowseForHost(
|
||||
registration.ListingId,
|
||||
ContractLimits.ContractVersion,
|
||||
registration.LeaseToken,
|
||||
10,
|
||||
null).Value!.Items);
|
||||
Assert.Equal(created.AttemptId, cancelled.AttemptId);
|
||||
Assert.True(cancelled.IsCancelled);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CancellationAfterIntroductionRevokesTicketIssuanceAndConsumption()
|
||||
{
|
||||
using JoinAttemptFixture fixture = new();
|
||||
(RegisterSessionResponse registration, _) = fixture.CreateHost();
|
||||
CreateJoinAttemptResponse created = fixture.Create(registration.ListingId);
|
||||
IntroductionEndpoints introduction = fixture.Introduce(registration, created);
|
||||
JoinAttemptServiceResult<ConnectionTicketGrant> issued =
|
||||
fixture.Service.IssueConnectionTicket(introduction.Attempt);
|
||||
Assert.True(issued.Succeeded);
|
||||
Assert.True(fixture.Sessions.Capabilities.TryFingerprint(
|
||||
issued.Value!.Ticket,
|
||||
out SecretFingerprint ticketFingerprint));
|
||||
|
||||
Assert.True(fixture.Service.Cancel(
|
||||
created.AttemptId,
|
||||
created.ClientPunchCapability).Succeeded);
|
||||
|
||||
StoredJoinAttempt cancelled = fixture.GetAttempt(registration, created.AttemptId);
|
||||
Assert.True(cancelled.IsCancelled);
|
||||
Assert.Equal(
|
||||
RendezvousErrorCode.Conflict,
|
||||
fixture.Service.IssueConnectionTicket(cancelled).Error);
|
||||
Assert.Equal(
|
||||
StoreResultCode.Conflict,
|
||||
fixture.Sessions.Store.ConsumeConnectionTicket(new(
|
||||
created.AttemptId,
|
||||
ticketFingerprint)).Code);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
Reference in New Issue
Block a user