Skip to content

Commit 5ef4b1c

Browse files
committed
chore: add eventual consistency test
1 parent acdf319 commit 5ef4b1c

File tree

2 files changed

+57
-10
lines changed

2 files changed

+57
-10
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System.Linq;
2+
using System.Threading.Tasks;
3+
4+
namespace Momento.Sdk.Tests.Integration.Cache;
5+
6+
[Collection("CacheClient")]
7+
public class ReplicaReadTest : TestBase
8+
{
9+
private new readonly ICacheClient client;
10+
public ReplicaReadTest(CacheClientFixture fixture) : base(fixture)
11+
{
12+
client = fixture.ClientWithBalancedReads;
13+
}
14+
15+
[Fact]
16+
public async Task LatestValueAfterReplicationDelay()
17+
{
18+
const int numTrials = 10;
19+
const int delayBetweenTrials = 100;
20+
const int replicationDelayMs = 1000;
21+
var random = new Random();
22+
23+
var trials = Enumerable.Range(0, numTrials).Select(async trialNumber =>
24+
{
25+
var startDelay = trialNumber * delayBetweenTrials + (random.NextDouble() - 0.5) * 10;
26+
await Task.Delay((int)startDelay);
27+
28+
var key = Utils.NewGuidString();
29+
var value = Utils.NewGuidString();
30+
31+
var setResponse = await client.SetAsync(cacheName, key, value);
32+
Assert.True(setResponse is CacheSetResponse.Success, $"Unexpected response: {setResponse}");
33+
34+
await Task.Delay(replicationDelayMs);
35+
36+
var getResponse = await client.GetAsync(cacheName, key);
37+
Assert.True(getResponse is CacheGetResponse.Hit, $"Unexpected response: {getResponse}");
38+
var hitResponse = (CacheGetResponse.Hit)getResponse;
39+
string setValue = hitResponse.ValueString;
40+
Assert.Equal(value, setValue);
41+
});
42+
43+
await Task.WhenAll(trials);
44+
}
45+
}

tests/Integration/Momento.Sdk.Tests/Fixtures.cs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ namespace Momento.Sdk.Tests.Integration;
1111
/// </summary>
1212
public class CacheClientFixture : IDisposable
1313
{
14-
public ICacheClient Client { get; private set; }
15-
public ICredentialProvider AuthProvider { get; private set; }
16-
public string CacheName { get; private set; }
14+
public ICacheClient Client { get; }
15+
public ICacheClient ClientWithConsistentReads { get; }
16+
public ICacheClient ClientWithBalancedReads { get; }
17+
public ICredentialProvider AuthProvider { get; }
18+
public string CacheName { get; }
1719

18-
public TimeSpan DefaultTtl { get; private set; } = TimeSpan.FromSeconds(10);
20+
public TimeSpan DefaultTtl { get; } = TimeSpan.FromSeconds(10);
1921

2022
public CacheClientFixture()
2123
{
@@ -35,14 +37,14 @@ public CacheClientFixture()
3537
builder.AddFilter("Grpc.Net.Client", LogLevel.Error);
3638
builder.SetMinimumLevel(LogLevel.Information);
3739
}));
38-
39-
if (consistentReads)
40-
{
41-
config = config.WithReadConcern(ReadConcern.Consistent);
42-
}
40+
var configWithConsistentReads = config.WithReadConcern(ReadConcern.Consistent);
41+
42+
ClientWithBalancedReads = new CacheClient(config, AuthProvider, defaultTtl: DefaultTtl);
43+
ClientWithConsistentReads = new CacheClient(configWithConsistentReads, AuthProvider, defaultTtl: DefaultTtl);
44+
Client = consistentReads ? ClientWithConsistentReads : ClientWithBalancedReads;
4345

4446
CacheName = $"dotnet-integration-{Utils.NewGuidString()}";
45-
Client = new CacheClient(config, AuthProvider, defaultTtl: DefaultTtl);
47+
4648
Utils.CreateCacheForTest(Client, CacheName);
4749
}
4850

0 commit comments

Comments
 (0)