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:
@@ -0,0 +1,59 @@
|
||||
using FinalFactory.Rendezvous.Client;
|
||||
using FinalFactory.Rendezvous.Contracts;
|
||||
|
||||
namespace FinalFactory.Rendezvous.Tests.Contracts;
|
||||
|
||||
public sealed class TraversalTokenCodecTests
|
||||
{
|
||||
[Fact]
|
||||
public void IntroductionTokenBindsAttemptAndRedactsTheFixedTicket()
|
||||
{
|
||||
JoinAttemptId attemptId = new(Guid.Parse("00000000-0000-0000-0000-000000000301"));
|
||||
string authenticator = Credential('T');
|
||||
|
||||
string encoded = NatIntroductionTokenCodec.Encode(attemptId, authenticator);
|
||||
|
||||
Assert.Equal(NatIntroductionTokenCodec.EncodedLength, encoded.Length);
|
||||
Assert.True(encoded.Length <= ContractLimits.LiteNetLibNatTokenMaxCharacters);
|
||||
Assert.True(NatIntroductionTokenCodec.TryDecode(encoded, out NatIntroductionToken? decoded));
|
||||
Assert.NotNull(decoded);
|
||||
Assert.Equal(attemptId, decoded.AttemptId);
|
||||
Assert.Equal(encoded, decoded.ConnectionTicket);
|
||||
Assert.DoesNotContain(encoded, decoded.ToString(), StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void IntroductionTokenRejectsNonCanonicalOrAlteredFields()
|
||||
{
|
||||
string valid = NatIntroductionTokenCodec.Encode(
|
||||
new JoinAttemptId(Guid.Parse("abcdef00-0000-0000-0000-000000000302")),
|
||||
Credential('T'));
|
||||
|
||||
Assert.False(NatIntroductionTokenCodec.TryDecode(null, out _));
|
||||
Assert.False(NatIntroductionTokenCodec.TryDecode(valid[..^1], out _));
|
||||
Assert.False(NatIntroductionTokenCodec.TryDecode(valid[..^1] + "!", out _));
|
||||
Assert.False(NatIntroductionTokenCodec.TryDecode(new string('A', 43), out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DirectConnectionRequestRoundTripsFixedBoundedPayloadAndRedactsTicket()
|
||||
{
|
||||
JoinAttemptId attemptId = new(Guid.Parse("00000000-0000-0000-0000-000000000303"));
|
||||
string ticket = Credential('D');
|
||||
|
||||
byte[] encoded = DirectConnectionRequestCodec.Encode(attemptId, ticket);
|
||||
|
||||
Assert.Equal(DirectConnectionRequestCodec.EncodedLength, encoded.Length);
|
||||
Assert.True(DirectConnectionRequestCodec.TryDecode(encoded, out DirectConnectionRequest? decoded));
|
||||
Assert.NotNull(decoded);
|
||||
Assert.Equal(attemptId, decoded.AttemptId);
|
||||
Assert.Equal(ticket, decoded.ConnectionTicket);
|
||||
Assert.DoesNotContain(ticket, decoded.ToString(), StringComparison.Ordinal);
|
||||
|
||||
encoded[0] ^= 0xff;
|
||||
Assert.False(DirectConnectionRequestCodec.TryDecode(encoded, out _));
|
||||
Assert.False(DirectConnectionRequestCodec.TryDecode(encoded.AsSpan(1), out _));
|
||||
}
|
||||
|
||||
private static string Credential(char value) => new(value, ContractLimits.DerivedCredentialCharacters);
|
||||
}
|
||||
Reference in New Issue
Block a user