Example #1
0
        public void sequence_0em1_0em1_idempotent()
        {
            const string stream = "appending_to_implicitly_created_stream_sequence_0em1_0em1_idempotent";

            using (var store = BuildConnection(_node)) {
                store.ConnectAsync().Wait();

                var events = Enumerable.Range(0, 1).Select(x => TestEvent.NewTestEvent(Guid.NewGuid())).ToArray();
                var writer = new StreamWriter(store, stream, -1);

                Assert.DoesNotThrow(() => writer.Append(events).Then(events.First(), -1));

                var total = EventsStream.Count(store, stream);
                Assert.That(total, Is.EqualTo(events.Length));
            }
        }
        public void sequence_0em1_1e0_2e1_3e2_4e3_5e4_0e5_non_idempotent()
        {
            const string stream = "appending_to_implicitly_created_stream_sequence_0em1_1e0_2e1_3e2_4e3_5e4_0e5_non_idempotent";

            using (var store = TestConnection.Create(_node.TcpEndPoint))
            {
                store.Connect();

                var events = Enumerable.Range(0, 6).Select(x => TestEvent.NewTestEvent(Guid.NewGuid())).ToArray();
                var writer = new StreamWriter(store, stream, -1);

                Assert.DoesNotThrow(() => writer.Append(events).Then(events.First(), 5));

                var total = EventsStream.Count(store, stream);
                Assert.That(total, Is.EqualTo(events.Length + 1));
            }
        }
Example #3
0
        public async Task sequence_S_0em1_1em1_E_S_1any_E_idempotent()
        {
            const string stream = "appending_to_implicitly_created_stream_sequence_S_0em1_1em1_E_S_1any_E_idempotent";

            using (var store = BuildConnection(_node)) {
                await store.ConnectAsync();

                var events = Enumerable.Range(0, 2).Select(x => TestEvent.NewTestEvent(Guid.NewGuid())).ToArray();
                await store.AppendToStreamAsync(stream, -1, events);

                await store.AppendToStreamAsync(stream, ExpectedVersion.Any, events[1]);

                var total = await EventsStream.Count(store, stream);

                Assert.That(total, Is.EqualTo(events.Length));
            }
        }
        public void sequence_0em1_1e0_2e1_3e2_4e3_5e4_0e5_non_idempotent()
        {
            const string stream = "appending_to_implicitly_created_stream_using_transaction_sequence_0em1_1e0_2e1_3e2_4e3_5e4_0e5_non_idempotent";

            using (var store = BuildConnection())
            {
                store.ConnectAsync().Wait();

                var events = Enumerable.Range(0, 6).Select(x => TestEvent.NewTestEvent(Guid.NewGuid())).ToArray();
                var writer = new TransactionalWriter(store, stream);

                Assert.AreEqual(5, writer.StartTransaction(-1).Write(events).Commit().NextExpectedVersion);
                Assert.AreEqual(6, writer.StartTransaction(5).Write(events.First()).Commit().NextExpectedVersion);

                var total = EventsStream.Count(store, stream);
                Assert.That(total, Is.EqualTo(events.Length + 1));
            }
        }
Example #5
0
        public void sequence_0em1_1e0_2e1_1any_1any_idempotent()
        {
            const string stream = "appending_to_implicitly_created_stream_using_transaction_sequence_0em1_1e0_2e1_1any_1any_idempotent";

            using (var store = TestConnection.Create(_node.TcpEndPoint))
            {
                store.ConnectAsync().Wait();

                var events = Enumerable.Range(0, 3).Select(x => TestEvent.NewTestEvent(Guid.NewGuid())).ToArray();
                var writer = new TransactionalWriter(store, stream);

                Assert.AreEqual(2, writer.StartTransaction(-1).Write(events).Commit().NextExpectedVersion);
                Assert.AreEqual(1, writer.StartTransaction(ExpectedVersion.Any).Write(events[1]).Write(events[1]).Commit().NextExpectedVersion);

                var total = EventsStream.Count(store, stream);
                Assert.That(total, Is.EqualTo(events.Length));
            }
        }
Example #6
0
        public void sequence_0em1_0em1_idempotent()
        {
            const string stream = "appending_to_implicitly_created_stream_using_transaction_sequence_0em1_0em1_idempotent";

            using (var store = TestConnection.Create(_node.TcpEndPoint))
            {
                store.Connect();

                var events = Enumerable.Range(0, 1).Select(x => TestEvent.NewTestEvent(Guid.NewGuid())).ToArray();
                var writer = new TransactionalWriter(store, stream);

                Assert.DoesNotThrow(() => writer.StartTransaction(-1).Write(events).Commit());
                Assert.DoesNotThrow(() => writer.StartTransaction(-1).Write(events.First()).Commit());

                var total = EventsStream.Count(store, stream);
                Assert.That(total, Is.EqualTo(events.Length));
            }
        }
Example #7
0
        public void sequence_S_0em1_1em1_E_S_1e0_E_idempotent()
        {
            const string stream = "appending_to_implicitly_created_stream_sequence_S_0em1_1em1_E_S_1e0_E_idempotent";

            using (var store = BuildConnection(_node)) {
                store.ConnectAsync().Wait();

                var events = Enumerable.Range(0, 2).Select(x => TestEvent.NewTestEvent(Guid.NewGuid())).ToArray();
                var append = store.AppendToStreamAsync(stream, -1, events);
                Assert.DoesNotThrow(append.Wait);

                var app2 = store.AppendToStreamAsync(stream, 0, new[] { events[1] });
                Assert.DoesNotThrow(app2.Wait);

                var total = EventsStream.Count(store, stream);
                Assert.That(total, Is.EqualTo(events.Length));
            }
        }
        public async Task sequence_0em1_0em1_idempotent()
        {
            const string stream =
                "appending_to_implicitly_created_stream_using_transaction_sequence_0em1_0em1_idempotent";

            using (var store = BuildConnection(_node)) {
                await store.ConnectAsync();

                var events = Enumerable.Range(0, 1).Select(x => TestEvent.NewTestEvent(Guid.NewGuid())).ToArray();
                var writer = new TransactionalWriter(store, stream);

                Assert.AreEqual(0, (await(await(await writer.StartTransaction(-1)).Write(events)).Commit()).NextExpectedVersion);
                Assert.AreEqual(0, (await(await(await writer.StartTransaction(-1)).Write(events.First())).Commit()).NextExpectedVersion);

                var total = await EventsStream.Count(store, stream);

                Assert.That(total, Is.EqualTo(events.Length));
            }
        }
Example #9
0
        public async Task sequence_0em1_0any_idempotent()
        {
            const string stream = "appending_to_implicitly_created_stream_sequence_0em1_0any_idempotent";

            using (var store = BuildConnection(_node)) {
                await store.ConnectAsync();

                var events = Enumerable.Range(0, 1).Select(x => TestEvent.NewTestEvent(Guid.NewGuid())).ToArray();
                var writer = new StreamWriter(store, stream, -1);

                var tail = await writer.Append(events);

                await tail.Then(events.First(), ExpectedVersion.Any);

                var total = await EventsStream.Count(store, stream);

                Assert.That(total, Is.EqualTo(events.Length));
            }
        }
Example #10
0
        public async Task detect_existing_streams_flush()
        {
            void CreateNode()
            {
                _node = new MiniNode <TLogFormat, TStreamId>(
                    pathname: PathName,
                    dbPath: Path.Combine(PathName, "mini-node-db"),
                    inMemDb: false,
                    streamExistenceFilterSize: 10_000,
                    streamExistenceFilterCheckpointIntervalMs: 100,
                    streamExistenceFilterCheckpointDelayMs: 0);
            }

            CreateNode();
            await _node.Start();

            // GIVEN some streams
            var normal      = "detect_existing_streams_normal";
            var meta        = "detect_existing_streams_meta";
            var committed   = "detect_existing_streams_commited_transaction";
            var uncommitted = "detect_existing_streams_uncommited_transaction";

            EventData[] GenEvents() => Enumerable.Range(0, 10).Select(x => TestEvent.NewTestEvent(Guid.NewGuid())).ToArray();

            var eventsByStream = new Dictionary <string, EventData[]>()
            {
                { normal, GenEvents() },
                { committed, GenEvents() },
                { uncommitted, GenEvents() },
            };

            var uncommittedTransId = 0L;

            using (var store = BuildConnection(_node)) {
                await store.ConnectAsync();

                // normal
                Assert.AreEqual(9, await store
                                .Apply(x => x.AppendToStreamAsync(normal, ExpectedVersion.NoStream, eventsByStream[normal]))
                                .Apply(x => x.NextExpectedVersion));

                // meta
                Assert.AreEqual(0, await store
                                .Apply(x => x.SetStreamMetadataAsync("meta", ExpectedVersion.NoStream, StreamMetadata.Create(maxCount: 5)))
                                .Apply(x => x.NextExpectedVersion));

                if (LogFormatHelper <TLogFormat, TStreamId> .IsV2)
                {
                    // committed
                    Assert.AreEqual(9, await new TransactionalWriter(store, committed)
                                    .Apply(x => x.StartTransaction(-1))
                                    .Apply(x => x.Write(eventsByStream[committed]))
                                    .Apply(x => x.Commit())
                                    .Apply(x => x.NextExpectedVersion));

                    // uncommitted
                    uncommittedTransId = await new TransactionalWriter(store, uncommitted)
                                         .Apply(x => x.StartTransaction(-1))
                                         .Apply(x => x.Write(eventsByStream[committed]))
                                         .Apply(x => x.TransactionId);
                }

                // append an event to another stream because the last event is always going to get reinitialised
                Assert.AreEqual(0, await store
                                .Apply(x => x.AppendToStreamAsync("another-stream", ExpectedVersion.NoStream, TestEvent.NewTestEvent(Guid.NewGuid())))
                                .Apply(x => x.NextExpectedVersion));
            }

            // WHEN flush and restart
            await Task.Delay(500);

            await _node.Shutdown(keepDb : true);

            CreateNode();
            await _node.Start();

            // THEN the streams all exist
            using (var store = BuildConnection(_node)) {
                await store.ConnectAsync();

                // normal
                Assert.AreEqual(10, await store
                                .Apply(x => x.AppendToStreamAsync(normal, 9, TestEvent.NewTestEvent(Guid.NewGuid())))
                                .Apply(x => x.NextExpectedVersion));

                Assert.AreEqual(
                    eventsByStream[normal].Length + 1,
                    await EventsStream.Count(store, normal));

                // meta
                Assert.AreEqual(1, await store
                                .Apply(x => x.SetStreamMetadataAsync("meta", 0, StreamMetadata.Create(maxCount: 6)))
                                .Apply(x => x.NextExpectedVersion));

                Assert.AreEqual(0, await EventsStream.Count(store, meta));

                if (LogFormatHelper <TLogFormat, TStreamId> .IsV2)
                {
                    // committed
                    Assert.AreEqual(10, await store
                                    .Apply(x => x.AppendToStreamAsync(committed, 9, TestEvent.NewTestEvent(Guid.NewGuid())))
                                    .Apply(x => x.NextExpectedVersion));

                    Assert.AreEqual(
                        eventsByStream[committed].Length + 1,
                        await EventsStream.Count(store, committed));

                    // uncommitted
                    Assert.AreEqual(9, await new TransactionalWriter(store, uncommitted)
                                    .Apply(x => x.ContinueTransaction(uncommittedTransId))
                                    .Apply(x => x.Commit())
                                    .Apply(x => x.NextExpectedVersion));

                    Assert.AreEqual(
                        eventsByStream[uncommitted].Length,
                        await EventsStream.Count(store, uncommitted));
                }
            }
        }