Example #1
0
        public void Given_a_timed_out_instance_When_sending_messages_to_it_Then_messages_are_forwarded_to_deadLetter()
        {
            var deadLetterActor  = A.Fake <ActorRef>();
            var testBootstrapper = new TestBootstrapper()
            {
                DeadLetterActorCreator = (path, system) => deadLetterActor
            };
            var actorSystem = testBootstrapper.CreateSystem();


            var promiseActorRef = PromiseActorRef.Create(actorSystem, 10, "target");

            try{ promiseActorRef.Future.Wait(); }
            catch (Exception) {}

            var fakeSender = A.Fake <ActorRef>();
            var message1   = new object();
            var message2   = new object();

            promiseActorRef.Send(message1, fakeSender);
            promiseActorRef.Send(message2, fakeSender);

            A.CallTo(() => deadLetterActor.Send(message1, fakeSender)).MustHaveHappened(Repeated.Exactly.Once);
            A.CallTo(() => deadLetterActor.Send(message2, fakeSender)).MustHaveHappened(Repeated.Exactly.Once);
        }
Example #2
0
        public void Given_a_stopped_Then_it_is_terminated()
        {
            var actorRef = new PromiseActorRef(A.Fake <ActorPath>(), A.Fake <IPromise <object> >(), A.Fake <ActorRef>(), A.Fake <TestActorSystem>());

            actorRef.Stop();
            actorRef.IsTerminated.Should().BeTrue();
        }
Example #3
0
        public void When_timing_out_Then_AskTimeoutException_is_thrown()
        {
            var actorSystem     = new TestBootstrapper().CreateSystem();
            var promiseActorRef = PromiseActorRef.Create(actorSystem, 10, "target");

            Assert.Throws <AggregateException>(() => promiseActorRef.Future.Wait()).ContainsException <AskTimeoutException>().Should().BeTrue();
        }
Example #4
0
        public static AskResult <TResponse> Ask <TResponse>(this ActorRef actor, object message, ActorRef sender, int timeoutMilliseconds = Timeout.Infinite)
        {
            var intActor = actor as InternalActorRef;

            if (intActor == null)
            {
                return(new AskResult <TResponse>(Promise.Failed <TResponse>(new ArgumentException("Unsupported recipient ActorRef type, question not sent to " + actor, "actor")), actor));
            }
            if (intActor.IsTerminated)
            {
                intActor.Send(message, sender);
                return(new AskResult <TResponse>(Promise.Failed <TResponse>(new AskTimeoutException("Recipient " + actor + " had already been terminated.")), actor));
            }
            if (timeoutMilliseconds < 0 && timeoutMilliseconds != Timeout.Infinite)
            {
                return(new AskResult <TResponse>(Promise.Failed <TResponse>(new ArgumentOutOfRangeException("timeoutMilliseconds", timeoutMilliseconds, "Timeout must be positive or Infinite=" + Timeout.Infinite + ", question not sent to " + actor)), actor));
            }
            var system       = intActor.System;
            var promiseActor = PromiseActorRef.Create <TResponse>(system, timeoutMilliseconds, actor.ToString());

            actor.Send(message, promiseActor);                  //Send to actor and expect response to promiseActor
            if (system.Settings.DebugMessages)
            {
                system.EventStream.Publish(new DebugLogEvent(actor.Path.ToString(), intActor.SafeGetTypeForLogging(), "Ask: " + Envelope.ToString(sender, actor, message)));
            }

            return(new AskResult <TResponse>(promiseActor.Future, actor));
        }
Example #5
0
        public void Given_a_non_stopped_When_sending_Success_Then_promise_success_is_called()
        {
            var promise  = A.Fake <IPromise <object> >();
            var actorRef = new PromiseActorRef(A.Fake <ActorPath>(), promise, A.Fake <ActorRef>(), A.Fake <TestActorSystem>());

            var sender = A.Fake <ActorRef>();

            actorRef.Send(new Status.Success("test"), sender);

            A.CallTo(() => promise.TrySuccess("test")).MustHaveHappened();
        }
Example #6
0
        public void Given_a_non_stopped_When_sending_Failure_Then_promise_failure_is_called()
        {
            var promise  = A.Fake <IPromise <object> >();
            var actorRef = new PromiseActorRef(A.Fake <ActorPath>(), promise, A.Fake <ActorRef>(), A.Fake <TestActorSystem>());

            var sender    = A.Fake <ActorRef>();
            var exception = new Exception("test");

            actorRef.Send(new Status.Failure(exception), sender);

            A.CallTo(() => promise.TryFailure(exception)).MustHaveHappened();
        }
Example #7
0
        public void Given_a_stopped_When_sending_message_Then_it_is_forwarded_to_DeadLetter()
        {
            var deadLetters = A.Fake <ActorRef>();
            var actorRef    = new PromiseActorRef(A.Fake <ActorPath>(), A.Fake <IPromise <object> >(), deadLetters, A.Fake <TestActorSystem>());

            actorRef.Stop();

            var sender = A.Fake <ActorRef>();

            actorRef.Send("test", sender);
            A.CallTo(() => deadLetters.Send("test", sender)).MustHaveHappened();
        }
Example #8
0
        public void Given_a_completed_promise_When_sending_Then_message_is_forwarded_to_deadletters()
        {
            var promise     = A.Fake <IPromise <object> >();
            var deadLetters = A.Fake <ActorRef>();
            var actorRef    = new PromiseActorRef(A.Fake <ActorPath>(), promise, deadLetters, A.Fake <TestActorSystem>());

            A.CallTo(() => promise.TrySuccess("test")).Returns(false);
            var sender = A.Fake <ActorRef>();

            actorRef.Send("test", sender);

            A.CallTo(() => deadLetters.Send("test", sender)).MustHaveHappened();
        }