feat(operations): add capacity and resilience gates (#18)
This commit is contained in:
@@ -411,6 +411,92 @@ public sealed class InMemoryEphemeralRendezvousStoreTests
|
||||
Assert.True(fixture.Store.CreateJoinAttempt(attempt).Succeeded);
|
||||
Assert.Equal(StoreResultCode.CapacityExceeded, fixture.Store.CreateJoinAttempt(
|
||||
fixture.AttemptCommand(listing, "client-quota-2") with { ScopeAttemptLimit = 1 }).Code);
|
||||
|
||||
fixture.Clock.Advance(TimeSpan.FromSeconds(30));
|
||||
Assert.True(fixture.Store.BindHostPresence(new(
|
||||
first.Listing.HostPresenceHandle,
|
||||
first.Listing.HostPresenceFingerprint,
|
||||
EphemeralStateFixture.PublicEndpoint(42_101),
|
||||
null)).Succeeded);
|
||||
Assert.True(fixture.Store.CreateJoinAttempt(
|
||||
fixture.AttemptCommand(listing, "client-quota-3") with { ScopeAttemptLimit = 1 }).Succeeded);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RemovingAListingReleasesItsConstantTimeOwnerQuota()
|
||||
{
|
||||
EphemeralStateFixture fixture = new();
|
||||
CreateListingCommand first = fixture.ListingCommand(owner: "publisher-quota") with
|
||||
{
|
||||
OwnerListingLimit = 1,
|
||||
};
|
||||
CreateListingCommand second = fixture.ListingCommand(owner: "publisher-quota") with
|
||||
{
|
||||
OwnerListingLimit = 1,
|
||||
};
|
||||
StoreResult<StoredListing> created = fixture.Store.CreateListing(first);
|
||||
Assert.True(created.Succeeded);
|
||||
Assert.Equal(StoreResultCode.CapacityExceeded, fixture.Store.CreateListing(second).Code);
|
||||
|
||||
Assert.True(fixture.Store.DeleteListing(new(
|
||||
first.Listing.ListingId,
|
||||
first.Listing.LeaseId,
|
||||
first.Listing.LeaseFingerprint,
|
||||
first.Listing.OwnerSubject)).Succeeded);
|
||||
Assert.True(fixture.Store.CreateListing(second).Succeeded);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RepeatedMutableDeadlineRefreshesKeepOneScheduledEntryPerKey()
|
||||
{
|
||||
EphemeralStateFixture fixture = new();
|
||||
StoredListing listing = fixture.CreateVisibleListing(out _);
|
||||
|
||||
for (int iteration = 0; iteration < 10_000; iteration++)
|
||||
{
|
||||
fixture.Clock.Advance(TimeSpan.FromTicks(1));
|
||||
StoreResult<StoredListing> renewed = fixture.Store.RenewLease(new(
|
||||
listing.Definition.ListingId,
|
||||
listing.Definition.LeaseId,
|
||||
listing.Definition.LeaseFingerprint,
|
||||
listing.Definition.OwnerSubject,
|
||||
listing.Version));
|
||||
Assert.True(renewed.Succeeded, $"Renewal {iteration} failed with {renewed.Code}.");
|
||||
listing = renewed.Value!;
|
||||
StoreResult<StoredListing> presence = fixture.Store.BindHostPresence(new(
|
||||
listing.Definition.HostPresenceHandle,
|
||||
listing.Definition.HostPresenceFingerprint,
|
||||
EphemeralStateFixture.PublicEndpoint(42_200),
|
||||
null));
|
||||
Assert.True(presence.Succeeded, $"Presence {iteration} failed with {presence.Code}.");
|
||||
StoreResult<int> revoked = fixture.Store.RevokePrincipal(
|
||||
"repeated-revocation",
|
||||
TimeSpan.FromMinutes(1));
|
||||
Assert.True(revoked.Succeeded, $"Revocation {iteration} failed with {revoked.Code}.");
|
||||
}
|
||||
|
||||
Assert.Equal(4, fixture.Store.ScheduledExpiryEntryCount);
|
||||
fixture.Clock.Advance(TimeSpan.FromSeconds(19));
|
||||
Assert.True(fixture.Store.GetListing(listing.Definition.ListingId, true).Succeeded);
|
||||
Assert.Equal(4, fixture.Store.ScheduledExpiryEntryCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RepeatedPrincipalRevocationCanExtendButCannotShortenProtection()
|
||||
{
|
||||
EphemeralStateFixture fixture = new();
|
||||
const string subject = "protected-publisher";
|
||||
|
||||
Assert.True(fixture.Store.RevokePrincipal(subject, TimeSpan.FromMinutes(10)).Succeeded);
|
||||
fixture.Clock.Advance(TimeSpan.FromSeconds(1));
|
||||
Assert.True(fixture.Store.RevokePrincipal(subject, TimeSpan.FromSeconds(1)).Succeeded);
|
||||
fixture.Clock.Advance(TimeSpan.FromSeconds(2));
|
||||
Assert.Equal(
|
||||
StoreResultCode.Revoked,
|
||||
fixture.Store.CreateListing(fixture.ListingCommand(owner: subject)).Code);
|
||||
|
||||
fixture.Clock.Advance(TimeSpan.FromSeconds(597));
|
||||
Assert.True(fixture.Store.CreateListing(fixture.ListingCommand(owner: subject)).Succeeded);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
Reference in New Issue
Block a user