public async Task Subscribe_HandlerThrows_DisposesReader(
            string topic,
            byte[] message,
            IDisposableBlockingRawMessageReader <IPollingOptions> reader,
            [Frozen] IPollingOptions options,
            [Frozen] IRawMessageHandler rawMessageHandler,
            [Frozen] IBlockingRawMessageReaderFactory <IPollingOptions> factory,
            BlockingReaderRawMessageHandlerSubscriber <IPollingOptions> sut)
        {
            // Arrange
            factory.Create(topic, options).Returns(reader);

            var disposeEvent = new ManualResetEventSlim();

            reader.When(r => r.Dispose()).Do(r => disposeEvent.Set());

            reader.TryGetMessage(out var _, options)
            .Returns(r =>
            {
                r[0] = message;
                return(true);
            });

            rawMessageHandler.Handle(topic, message, Arg.Any <CancellationToken>())
            .Throws <ArgumentNullException>();

            // Act
            await sut.Subscribe(topic, rawMessageHandler, None);

            // Assert
            Assert.True(disposeEvent.Wait(1000));
        }
 public void Handle(IRawMessage rawMessage)
 {
     try
     {
         _rawMessageHandler.Handle(rawMessage);
     }
     catch (Exception ex)
     {
         var encodedMessage = Convert.ToBase64String(rawMessage.Payload);
         var format         = "Failed to process message: {message}";
         _logger.LogError(0, ex, format, encodedMessage);
     }
 }
예제 #3
0
        /// <summary>
        /// Starts receiving syslog messages
        /// </summary>
        /// <param name="token">CancellationToken to stop the server</param>
        /// <returns></returns>
        public Task Start(CancellationToken token)
        {
            return(Task.Run(async() =>
            {
                using (var udpClient = _updClientFactory())
                {
                    while (!token.IsCancellationRequested)
                    {
                        var received = await udpClient.ReceiveAsync()
                                       .WithCancellation(token)
                                       .ConfigureAwait(false);

                        _rawMessageHandler.Handle(
                            new RawMessage(received.RemoteEndPoint, received.Buffer));
                    }
                    token.ThrowIfCancellationRequested();
                }
            }, token));
        }