Skip to content

Commit 60f1460

Browse files
getsetcodeasosMikeGore
authored andcommitted
Added support for cancellation token to EventStore (#48)
1 parent 7c48972 commit 60f1460

File tree

4 files changed

+56
-8
lines changed

4 files changed

+56
-8
lines changed

src/SimpleEventStore/SimpleEventStore.Tests/EventStoreAppending.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Linq;
3+
using System.Threading;
34
using System.Threading.Tasks;
45
using NUnit.Framework;
56
using SimpleEventStore.Tests.Events;
@@ -112,5 +113,23 @@ public async Task when_appending_to_a_new_stream_the_event_metadata_is_saved()
112113
var stream = await subject.ReadStreamForwards(streamId);
113114
Assert.That(((TestMetadata)stream.Single().Metadata).Value, Is.EqualTo(metadata.Value));
114115
}
116+
117+
[Test]
118+
public async Task when_appending_to_a_stream_the_engine_honours_cancellation_token()
119+
{
120+
var streamId = Guid.NewGuid().ToString();
121+
var subject = await GetEventStore();
122+
var metadata = new TestMetadata { Value = "Hello" };
123+
var @event = new EventData(Guid.NewGuid(), new OrderCreated(streamId), metadata);
124+
125+
using (var cts = new CancellationTokenSource())
126+
{
127+
cts.Cancel();
128+
129+
AsyncTestDelegate act = () => subject.AppendToStream(streamId, 0, cts.Token, @event);
130+
131+
Assert.That(act, Throws.InstanceOf<OperationCanceledException>());
132+
}
133+
}
115134
}
116135
}

src/SimpleEventStore/SimpleEventStore.Tests/EventStoreReading.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
using System;
1+
using NUnit.Framework;
2+
using SimpleEventStore.Tests.Events;
3+
using System;
24
using System.Linq;
5+
using System.Threading;
36
using System.Threading.Tasks;
4-
using NUnit.Framework;
5-
using SimpleEventStore.Tests.Events;
67

78
namespace SimpleEventStore.Tests
89
{
@@ -63,5 +64,21 @@ public async Task when_reading_a_stream_only_the_required_events_are_returned()
6364
Assert.That(events.Count, Is.EqualTo(1));
6465
Assert.That(events.First().EventBody, Is.InstanceOf<OrderDispatched>());
6566
}
67+
68+
[Test]
69+
public async Task when_reading_a_stream_the_engine_honours_cancellation_token()
70+
{
71+
var streamId = Guid.NewGuid().ToString();
72+
var subject = await GetEventStore();
73+
74+
using (var cts = new CancellationTokenSource())
75+
{
76+
cts.Cancel();
77+
78+
AsyncTestDelegate act = () => subject.ReadStreamForwards(streamId, cts.Token);
79+
80+
Assert.That(act, Throws.InstanceOf<OperationCanceledException>());
81+
}
82+
}
6683
}
6784
}

src/SimpleEventStore/SimpleEventStore/EventStore.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Threading;
34
using System.Threading.Tasks;
45

56
namespace SimpleEventStore
@@ -14,6 +15,11 @@ public EventStore(IStorageEngine engine)
1415
}
1516

1617
public Task AppendToStream(string streamId, int expectedVersion, params EventData[] events)
18+
{
19+
return AppendToStream(streamId, expectedVersion, default, events);
20+
}
21+
22+
public Task AppendToStream(string streamId, int expectedVersion, CancellationToken cancellationToken, params EventData[] events)
1723
{
1824
Guard.IsNotNullOrEmpty(nameof(streamId), streamId);
1925

@@ -25,21 +31,21 @@ public Task AppendToStream(string streamId, int expectedVersion, params EventDat
2531
storageEvents.Add(new StorageEvent(streamId, events[i], ++eventVersion));
2632
}
2733

28-
return engine.AppendToStream(streamId, storageEvents);
34+
return engine.AppendToStream(streamId, storageEvents, cancellationToken);
2935
}
3036

31-
public Task<IReadOnlyCollection<StorageEvent>> ReadStreamForwards(string streamId)
37+
public Task<IReadOnlyCollection<StorageEvent>> ReadStreamForwards(string streamId, CancellationToken cancellationToken = default)
3238
{
3339
Guard.IsNotNullOrEmpty(nameof(streamId), streamId);
3440

35-
return engine.ReadStreamForwards(streamId, 1, Int32.MaxValue);
41+
return engine.ReadStreamForwards(streamId, 1, Int32.MaxValue, cancellationToken);
3642
}
3743

38-
public Task<IReadOnlyCollection<StorageEvent>> ReadStreamForwards(string streamId, int startPosition, int numberOfEventsToRead)
44+
public Task<IReadOnlyCollection<StorageEvent>> ReadStreamForwards(string streamId, int startPosition, int numberOfEventsToRead, CancellationToken cancellationToken = default)
3945
{
4046
Guard.IsNotNullOrEmpty(nameof(streamId), streamId);
4147

42-
return engine.ReadStreamForwards(streamId, startPosition, numberOfEventsToRead);
48+
return engine.ReadStreamForwards(streamId, startPosition, numberOfEventsToRead, cancellationToken);
4349
}
4450
}
4551
}

src/SimpleEventStore/SimpleEventStore/InMemory/InMemoryStorageEngine.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public Task AppendToStream(string streamId, IEnumerable<StorageEvent> events, Ca
2929
throw new ConcurrencyException($"Concurrency conflict when appending to stream {streamId}. Expected revision {firstEvent.EventNumber} : Actual revision {streams[streamId].Count}");
3030
}
3131

32+
cancellationToken.ThrowIfCancellationRequested();
33+
3234
streams[streamId].AddRange(events);
3335
AddEventsToAllStream(events);
3436
});
@@ -44,6 +46,8 @@ private void AddEventsToAllStream(IEnumerable<StorageEvent> events)
4446

4547
public Task<IReadOnlyCollection<StorageEvent>> ReadStreamForwards(string streamId, int startPosition, int numberOfEventsToRead, CancellationToken cancellationToken = default)
4648
{
49+
cancellationToken.ThrowIfCancellationRequested();
50+
4751
if (!streams.ContainsKey(streamId))
4852
{
4953
return Task.FromResult(EmptyStream);
@@ -55,6 +59,8 @@ public Task<IReadOnlyCollection<StorageEvent>> ReadStreamForwards(string streamI
5559

5660
public Task<IStorageEngine> Initialise(CancellationToken cancellationToken = default)
5761
{
62+
cancellationToken.ThrowIfCancellationRequested();
63+
5864
return Task.FromResult<IStorageEngine>(this);
5965
}
6066
}

0 commit comments

Comments
 (0)