public virtual async Task ReadJournal_should_deallocate_AllPersistenceIds_publisher_when_the_last_subscriber_left()
        {
            var journal = ReadJournal.AsInstanceOf <IPersistenceIdsQuery>();

            Setup("a", 1);
            Setup("b", 1);

            var source = journal.PersistenceIds();
            var probe  = source.RunWith(this.SinkProbe <string>(), Materializer);
            var probe2 = source.RunWith(this.SinkProbe <string>(), Materializer);

            var fieldInfo = journal.GetType().GetField("_persistenceIdsPublisher", BindingFlags.NonPublic | BindingFlags.Instance);

            Assert.True(fieldInfo != null);

            // Assert that publisher is running.
            probe.Within(TimeSpan.FromSeconds(10), () => probe.Request(10)
                         .ExpectNextUnordered("a", "b")
                         .ExpectNoMsg(TimeSpan.FromMilliseconds(200)));

            probe.Cancel();

            // Assert that publisher is still alive when it still have a subscriber
            Assert.True(fieldInfo.GetValue(journal) is IPublisher <string>);

            probe2.Within(TimeSpan.FromSeconds(10), () => probe2.Request(4)
                          .ExpectNextUnordered("a", "b")
                          .ExpectNoMsg(TimeSpan.FromMilliseconds(200)));

            // Assert that publisher is de-allocated when the last subscriber left
            probe2.Cancel();
            await Task.Delay(400);

            Assert.True(fieldInfo.GetValue(journal) is null);
        }
        public virtual void ReadJournal_AllPersistenceIds_should_find_events_on_both_journal_and_snapshot_store()
        {
            var queries = ReadJournal.AsInstanceOf <IPersistenceIdsQuery>();

            WriteSnapshot("a", 2);
            WriteSnapshot("b", 2);
            WriteSnapshot("c", 2);
            Setup("d", 2);
            Setup("e", 2);
            Setup("f", 2);

            var source = queries.PersistenceIds();
            var probe  = source.RunWith(this.SinkProbe <string>(), Materializer);

            var expectedUniqueList = new List <string>()
            {
                "a", "b", "c", "d", "e", "f"
            };

            probe.Within(TimeSpan.FromSeconds(10), () => probe.Request(3)
                         .ExpectNextWithinSet(expectedUniqueList)
                         .ExpectNextWithinSet(expectedUniqueList)
                         .ExpectNextWithinSet(expectedUniqueList)
                         .ExpectNoMsg(TimeSpan.FromMilliseconds(200)));

            probe.Within(TimeSpan.FromSeconds(10), () => probe.Request(3)
                         .ExpectNextWithinSet(expectedUniqueList)
                         .ExpectNextWithinSet(expectedUniqueList)
                         .ExpectNextWithinSet(expectedUniqueList)
                         .ExpectNoMsg(TimeSpan.FromMilliseconds(200)));
        }
        public virtual void ReadJournal_AllPersistenceIds_should_deliver_persistenceId_only_once_if_there_are_multiple_events()
        {
            var queries = ReadJournal.AsInstanceOf <IPersistenceIdsQuery>();

            Setup("p", 10);

            var source = queries.PersistenceIds();
            var probe  = source.RunWith(this.SinkProbe <string>(), Materializer);

            probe.Within(TimeSpan.FromSeconds(10), () =>
            {
                return(probe.Request(10)
                       .ExpectNext("p")
                       .ExpectNoMsg(TimeSpan.FromMilliseconds(200)));
            });

            Setup("q", 10);

            probe.Within(TimeSpan.FromSeconds(10), () =>
            {
                return(probe.Request(10)
                       .ExpectNext("q")
                       .ExpectNoMsg(TimeSpan.FromMilliseconds(200)));
            });
        }
        public virtual void ReadJournal_AllPersistenceIds_should_only_deliver_what_requested_if_there_is_more_in_the_buffer()
        {
            var queries = ReadJournal.AsInstanceOf <IPersistenceIdsQuery>();

            Setup("k", 1);
            Setup("l", 1);
            Setup("m", 1);
            Setup("n", 1);
            Setup("o", 1);

            var source = queries.PersistenceIds();
            var probe  = source.RunWith(this.SinkProbe <string>(), Materializer);

            probe.Within(TimeSpan.FromSeconds(10), () =>
            {
                probe.Request(2);
                probe.ExpectNext();
                probe.ExpectNext();
                probe.ExpectNoMsg(TimeSpan.FromMilliseconds(1000));

                probe.Request(2);
                probe.ExpectNext();
                probe.ExpectNext();
                probe.ExpectNoMsg(TimeSpan.FromMilliseconds(1000));

                return(probe);
            });
        }
        ReadJournal_CurrentEventsByPersistenceId_should_return_empty_stream_for_empty_journal_from_0_to_0()
        {
            var queries = ReadJournal.AsInstanceOf <ICurrentEventsByPersistenceIdQuery>();
            var pref    = SetupEmpty("k2");

            var src = queries.CurrentEventsByPersistenceId("k2", 0, 0);

            src.Select(x => x.Event).RunWith(this.SinkProbe <object>(), Materializer).Request(1).ExpectComplete();
        }
        public override void ReadJournal_CurrentEventsByPersistenceId_should_return_empty_stream_for_empty_journal()
        {
            var queries = ReadJournal.AsInstanceOf <ICurrentEventsByPersistenceIdQuery>();
            var pref    = SetupEmpty("i");

            var src = queries.CurrentEventsByPersistenceId("i", 0L, long.MaxValue);

            src.Select(x => x.Event).RunWith(this.SinkProbe <object>(), Materializer).Request(1).ExpectComplete();
        }
        ReadJournal_CurrentEventsByPersistenceId_should_return_empty_stream_for_journal_from_SequenceNr_greater_than_HighestSequenceNr()
        {
            var queries = ReadJournal.AsInstanceOf <ICurrentEventsByPersistenceIdQuery>();
            var pref    = Setup("l");

            var src = queries.CurrentEventsByPersistenceId("l", 4L, 3L);

            src.Select(x => x.Event).RunWith(this.SinkProbe <object>(), Materializer).Request(1).ExpectComplete();
        }
 ReadJournal_CurrentEventsByPersistenceId_should_find_existing_events_up_to_a_sequence_number()
 {
     var queries = ReadJournal.AsInstanceOf <ICurrentEventsByPersistenceIdQuery>();
     var pref    = Setup("b");
     var src     = queries.CurrentEventsByPersistenceId("b", 0L, 2L);
     var probe   = src.Select(x => x.Event).RunWith(this.SinkProbe <object>(), Materializer)
                   .Request(5)
                   .ExpectNext("b-1", "b-2")
                   .ExpectComplete();
 }
        ReadJournal_CurrentEventsByPersistenceId_should_return_empty_stream_for_cleaned_journal_from_0_to_MaxLong()
        {
            var queries = ReadJournal.AsInstanceOf <ICurrentEventsByPersistenceIdQuery>();
            var pref    = Setup("g1");

            pref.Tell(new TestActor.DeleteCommand(3));
            AwaitAssert(() => ExpectMsg("3-deleted"));

            var src = queries.CurrentEventsByPersistenceId("g1", 0, long.MaxValue);

            src.Select(x => x.Event).RunWith(this.SinkProbe <object>(), Materializer).Request(1).ExpectComplete();
        }
Beispiel #10
0
        public void Bug80_CurrentEventsByTag_should_Recover_until_end()
        {
            var actor    = Sys.ActorOf(TagActor.Props("y"));
            var msgCount = 1200;

            actor.Tell(msgCount);
            ExpectMsg($"{msgCount}-done", TimeSpan.FromSeconds(20));

            var eventsByTag = ReadJournal.CurrentEventsByTag(typeof(RealMsg).Name)
                              .RunForeach(e => TestActor.Tell(e), Materializer);

            ReceiveN(msgCount);
        }
Beispiel #11
0
        public void Bug80_CurrentEventsByTag_should_Recover_until_end()
        {
            var actor = Sys.ActorOf(TagActor.Props("y"));
            //increased this to test for non-collision with the generated timestamps
            var msgCount = 5000;

            actor.Tell(msgCount);
            ExpectMsg($"{msgCount}-done", TimeSpan.FromSeconds(20));

            var eventsByTag = ReadJournal.CurrentEventsByTag(typeof(RealMsg).Name)
                              .RunForeach(e => TestActor.Tell(e), Materializer);

            ReceiveN(msgCount);
        }
        ReadJournal_CurrentEventsByPersistenceId_should_return_remaining_values_after_partial_journal_cleanup()
        {
            var queries = ReadJournal.AsInstanceOf <ICurrentEventsByPersistenceIdQuery>();
            var pref    = Setup("h");

            pref.Tell(new TestActor.DeleteCommand(2));
            AwaitAssert(() => ExpectMsg("2-deleted"));

            var src = queries.CurrentEventsByPersistenceId("h", 0L, long.MaxValue);

            src.Select(x => x.Event).RunWith(this.SinkProbe <object>(), Materializer)
            .Request(1)
            .ExpectNext("h-3")
            .ExpectComplete();
        }
        public virtual void ReadJournal_AllPersistenceIds_should_find_new_events()
        {
            var queries = ReadJournal.AsInstanceOf <IPersistenceIdsQuery>();

            Setup("e", 1);
            Setup("f", 1);

            var source = queries.PersistenceIds();
            var probe  = source.RunWith(this.SinkProbe <string>(), Materializer);

            probe.Within(TimeSpan.FromSeconds(10), () => probe.Request(5).ExpectNextUnordered("e", "f"));

            Setup("g", 1);
            probe.ExpectNext("g", TimeSpan.FromSeconds(10));
        }
        public override void ReadJournal_CurrentEventsByPersistenceId_should_find_existing_events()
        {
            var queries = ReadJournal.AsInstanceOf <ICurrentEventsByPersistenceIdQuery>();
            var pref    = Setup("a");

            var src   = queries.CurrentEventsByPersistenceId("a", 0, long.MaxValue);
            var probe = src.Select(x => x.Event).RunWith(this.SinkProbe <object>(), Materializer);

            probe.Request(2)
            .ExpectNext("a-1", "a-2")
            .ExpectNoMsg(TimeSpan.FromMilliseconds(500));
            probe.Request(2)
            .ExpectNext("a-3")
            .ExpectComplete();
        }
        public override void ReadJournal_CurrentEventsByPersistenceId_should_not_see_new_events_after_completion()
        {
            var queries = ReadJournal.AsInstanceOf <ICurrentEventsByPersistenceIdQuery>();
            var pref    = Setup("f");
            var src     = queries.CurrentEventsByPersistenceId("f", 0L, long.MaxValue);
            var probe   = src.Select(x => x.Event).RunWith(this.SinkProbe <object>(), Materializer)
                          .Request(2)
                          .ExpectNext("f-1", "f-2")
                          .ExpectNoMsg(TimeSpan.FromMilliseconds(100)) as TestSubscriber.Probe <object>;

            pref.Tell("f-4");
            ExpectMsg("f-4-done");

            probe.ExpectNoMsg(TimeSpan.FromMilliseconds(100));
            probe.Request(5)
            .ExpectNext("f-3")
            .ExpectComplete();      // f-4 not seen
        }
Beispiel #16
0
        public async Task Bug61_Events_Recovered_By_Id_Should_Match_Tag()
        {
            var actor = Sys.ActorOf(TagActor.Props("x"));

            actor.Tell(MessageCount);
            ExpectMsg($"{MessageCount}-done", TimeSpan.FromSeconds(20));

            var eventsById = await ReadJournal.CurrentEventsByPersistenceId("x", 0L, long.MaxValue)
                             .RunAggregate(ImmutableHashSet <EventEnvelope> .Empty, (agg, e) => agg.Add(e), Materializer);

            eventsById.Count.Should().Be(MessageCount);

            var eventsByTag = await ReadJournal.CurrentEventsByTag(typeof(RealMsg).Name)
                              .RunAggregate(ImmutableHashSet <EventEnvelope> .Empty, (agg, e) => agg.Add(e), Materializer);

            eventsByTag.Count.Should().Be(MessageCount);

            eventsById.All(x => x.Event is RealMsg).Should().BeTrue("Expected all events by id to be RealMsg");
            eventsByTag.All(x => x.Event is RealMsg).Should().BeTrue("Expected all events by tag to be RealMsg");
        }
Beispiel #17
0
        public void Bug80_AllEventsByTag_should_Recover_all_messages()
        {
            var actor    = Sys.ActorOf(TagActor.Props("y"));
            var msgCount = 1200;

            actor.Tell(msgCount);
            ExpectMsg($"{msgCount}-done", TimeSpan.FromSeconds(20));

            var eventsByTag = ReadJournal.EventsByTag(typeof(RealMsg).Name)
                              .RunForeach(e => TestActor.Tell(e), Materializer);

            // can't do this because Offset isn't IComparable
            // ReceiveN(msgCount).Cast<EventEnvelope>().Select(x => x.Offset).Should().BeInAscendingOrder();
            ReceiveN(msgCount);

            // should receive more messages after the fact
            actor.Tell(msgCount);
            ExpectMsg($"{msgCount}-done", TimeSpan.FromSeconds(20));
            ReceiveN(msgCount);
        }
        public override void ReadJournal_query_CurrentPersistenceIds_should_not_see_new_events_after_complete()
        {
            var queries = ReadJournal.AsInstanceOf <ICurrentPersistenceIdsQuery>();

            Setup("a", 1);
            Setup("b", 1);
            Setup("c", 1);

            var greenSrc = queries.CurrentPersistenceIds();
            var probe    = greenSrc.RunWith(this.SinkProbe <string>(), Materializer);
            var firstTwo = probe.Request(2).ExpectNextN(2);

            Assert.Empty(firstTwo.Except(new[] { "a", "b", "c" }).ToArray());

            var last = new[] { "a", "b", "c" }.Except(firstTwo).First();

            Setup("d", 1);

            probe.ExpectNoMsg(TimeSpan.FromMilliseconds(100));
            probe.Request(5)
            .ExpectNext(last)
            .ExpectComplete();
        }
        public virtual void ReadJournal_AllPersistenceIds_should_find_new_events_after_demand_request()
        {
            var queries = ReadJournal.AsInstanceOf <IPersistenceIdsQuery>();

            Setup("h", 1);
            Setup("i", 1);

            var source = queries.PersistenceIds();
            var probe  = source.RunWith(this.SinkProbe <string>(), Materializer);

            probe.Within(TimeSpan.FromSeconds(10), () =>
            {
                probe.Request(1).ExpectNext();
                return(probe.ExpectNoMsg(TimeSpan.FromMilliseconds(100)));
            });

            Setup("j", 1);
            probe.Within(TimeSpan.FromSeconds(10), () =>
            {
                probe.Request(5).ExpectNext();
                return(probe.ExpectNext());
            });
        }
        public override void ReadJournal_query_CurrentPersistenceIds_should_not_see_new_events_after_complete()
        {
            var queries = ReadJournal.AsInstanceOf <ICurrentPersistenceIdsQuery>();

            Setup("a", 1);
            Setup("b", 1);
            Setup("c", 1);

            var greenSrc = queries.CurrentPersistenceIds();
            var probe    = greenSrc.RunWith(this.SinkProbe <string>(), Materializer);

            probe.Request(2)
            .ExpectNext("a")
            .ExpectNext("b")
            .ExpectNoMsg(TimeSpan.FromMilliseconds(100));

            Setup("d", 1);

            probe.ExpectNoMsg(TimeSpan.FromMilliseconds(100));
            probe.Request(5)
            .ExpectNext("c")
            .ExpectNext("d")
            .ExpectComplete();
        }