public void ProcessSlaTimeouts_should_be_thread_safe()
        {
            var actionsCount    = 50000;
            var groupSize       = 100;
            var messagesInGroup = groupSize - 1;

            SlaDefinitionBuilder.AddSla <Request, Response>(TimeSpan.FromTicks(1), r => r.Id, r => r.Id, _slaProvider);
            _slaProcessor = new TestableSlaProcessor(_slaProvider, actionsCount);

            Action purge = () => _slaProcessor.ProcessSlaTimeouts();
            Action add   = () => _slaProcessor.ProcessOutgoingMessage(new Request {
                Id = Guid.NewGuid()
            });

            Enumerable.Range(0, actionsCount)
            .Select(index => ((index % groupSize) >= messagesInGroup) ? purge : add)
            .AsParallel()
            .WithDegreeOfParallelism(64)
            .ForAll(action => action.Invoke());

            _slaProcessor.ProcessSlaTimeouts();
            var expectedMessagesCount = messagesInGroup * actionsCount / groupSize;

            Assert.That(_slaProcessor.Timeouts.Count, Is.EqualTo(expectedMessagesCount), "Processor should timeout all messages");
        }
        public void ProcessSlaTimeouts_should_remove_requests_only_if_the_longest_sla_timed_out()
        {
            var lowerSlaInMs  = 20;
            var higherSlaInMs = 50;
            var slaMultiplier = 2;
            var lowerTimeout  = lowerSlaInMs * slaMultiplier + WaitDeltaMs;
            var higherTimeout = higherSlaInMs * slaMultiplier + WaitDeltaMs;

            SlaDefinitionBuilder
            .For <Request>(req => req.Id)
            .AddSla <Response>(TimeSpan.FromMilliseconds(lowerSlaInMs), rsp => rsp.Id)
            .AddSla <Response2>(TimeSpan.FromMilliseconds(higherSlaInMs), rsp => rsp.Id)
            .Configure(_slaProvider);

            _slaProcessor = new TestableSlaProcessor(_slaProvider);

            _slaProcessor.ProcessOutgoingMessage(new Request {
                Id = Guid.NewGuid()
            });

            Thread.Sleep(lowerTimeout);
            _slaProcessor.ProcessSlaTimeouts();
            Assert.That(_slaProcessor.Timeouts.Count, Is.EqualTo(0), "None of messages should time out yet");

            Thread.Sleep(higherTimeout - lowerSlaInMs);
            _slaProcessor.ProcessSlaTimeouts();
            Assert.That(_slaProcessor.Timeouts.Count, Is.EqualTo(1), "Message should time out now");
        }
        public void ProcessSlaTimeouts_should_remove_all_timedout_requests()
        {
            var slaInMs       = 50;
            var slaMultiplier = 2;

            SlaDefinitionBuilder.AddSla <Request, Response>(TimeSpan.FromMilliseconds(slaInMs), req => req.Id, rsp => rsp.Id, _slaProvider);
            SlaDefinitionBuilder.AddSla <Request2, Response2>(TimeSpan.FromMinutes(2), req => req.Id, rsp => rsp.Id, _slaProvider);

            _slaProcessor = new TestableSlaProcessor(_slaProvider);

            _slaProcessor.ProcessOutgoingMessage(new Request {
                Id = Guid.NewGuid()
            });
            _slaProcessor.ProcessOutgoingMessage(new Request {
                Id = Guid.NewGuid()
            });
            _slaProcessor.ProcessOutgoingMessage(new Request2 {
                Id = Guid.NewGuid()
            });
            _slaProcessor.ProcessOutgoingMessage(new Request2 {
                Id = Guid.NewGuid()
            });

            _slaProcessor.ProcessSlaTimeouts();
            Assert.That(_slaProcessor.Timeouts.Count, Is.EqualTo(0), "None of messages should time out yet");


            Thread.Sleep(TimeSpan.FromMilliseconds(slaInMs * slaMultiplier + WaitDeltaMs));
            _slaProcessor.ProcessSlaTimeouts();
            Assert.That(_slaProcessor.Timeouts.Count, Is.EqualTo(2), "Two messages should timeout");
            Assert.That(_slaProcessor.Timeouts.Count(m => m.Item1.Type == typeof(Request)), Is.EqualTo(2), "Messages of Request type should timeout");
        }
Beispiel #4
0
        public void SlaDefinition_ToString_should_return_meaningful_information()
        {
            var provider = new SlaProvider();

            SlaDefinitionBuilder.AddSla <IRequest, IResponse>(TimeSpan.FromSeconds(1), r => r.RequestId, r => r.ResponseId, provider);

            Assert.That(provider.Definitions.First().ToString(), Is.EqualTo("Wonga.SLAMonitor.Tests.Asynchronous.SlaDefinitionBuilderTests+IRequest -> Wonga.SLAMonitor.Tests.Asynchronous.SlaDefinitionBuilderTests+IResponse: 00:00:01"));
        }
Beispiel #5
0
        public void SetUp()
        {
            _provider = new SlaProvider();

            SlaDefinitionBuilder.For <Request>(r => r.Id)
            .AddSla <Response>(_sla, r => r.Id)
            .Configure(_provider);

            _appender = InjectInMemoryAppender();
        }
        private void ConfigureSla()
        {
            SlaDefinitionBuilder.For <Request>(r => r.Id)
            .AddSla <Response>(TimeSpan.FromSeconds(1), r => r.Id)
            .AddSla <ErrorResponse>(TimeSpan.FromSeconds(1), r => r.Id)
            .Configure(_slaProvider);

            SlaDefinitionBuilder.For <Request2>(r => r.Id)
            .AddSla <Response2>(TimeSpan.FromSeconds(1), r => r.Id)
            .AddSla <ErrorResponse2>(TimeSpan.FromSeconds(1), r => r.Id)
            .Configure(_slaProvider);
        }
Beispiel #7
0
        public void It_should_create_definitions()
        {
            var provider = new SlaProvider();

            SlaDefinitionBuilder.For <IRequest>(x => x.RequestId)
            .AddSla <IResponse>(TimeSpan.FromSeconds(1), x => x.ResponseId)
            .AddSla <IErrorResponse>(TimeSpan.FromSeconds(2), x => x.ResponseId)
            .Configure(provider);

            Assert.That(provider.GetRequestDefinitions(new Mock <IRequest>().Object).Count(), Is.EqualTo(1), "request mapping");

            Assert.That(provider.GetSlaDefinitionsFor(new Mock <IResponse>().Object).Single().Sla, Is.EqualTo(TimeSpan.FromSeconds(1)));
            Assert.That(provider.GetSlaDefinitionsFor(new Mock <IErrorResponse>().Object).Single().Sla, Is.EqualTo(TimeSpan.FromSeconds(2)));
        }