public void ShouldRetryHandleWhenTopicNotFound()
        {
            var partitioner        = new Mock <IPartitioner <string> >();
            var config             = new ProducerConfiguration(new List <BrokerConfiguration>());
            var pool               = new Mock <ISyncProducerPool>();
            var producer           = new Mock <ISyncProducer>();
            var partitionMetadatas = new List <PartitionMetadata>()
            {
                new PartitionMetadata(0, new Broker(0, "host1", 1234), Enumerable.Empty <Broker>(),
                                      Enumerable.Empty <Broker>())
            };
            var metadatas = new List <TopicMetadata>()
            {
                new TopicMetadata("test", partitionMetadatas, ErrorMapping.NoError)
            };

            producer.SetupGet(p => p.Config)
            .Returns(
                () =>
                new SyncProducerConfiguration(new ProducerConfiguration(new List <BrokerConfiguration>()), 0,
                                              "host1", 1234));
            producer.Setup(p => p.Send(It.IsAny <TopicMetadataRequest>())).Returns(() => metadatas);
            var statuses = new Dictionary <TopicAndPartition, ProducerResponseStatus>();

            statuses[new TopicAndPartition("test", 0)] = new ProducerResponseStatus();
            producer.Setup(p => p.Send(It.IsAny <ProducerRequest>()))
            .Returns(
                () =>
                new ProducerResponse(1, statuses));
            pool.Setup(p => p.GetShuffledProducers()).Returns(() => new List <ISyncProducer>()
            {
                producer.Object
            });
            pool.Setup(p => p.GetProducer(It.IsAny <int>())).Returns(() => producer.Object);
            var mockPartitionInfo = new Mock <IBrokerPartitionInfo>();

            mockPartitionInfo.Setup(m => m.GetBrokerPartitionInfo(0, string.Empty, It.IsAny <int>(), "test"))
            .Returns(() => new List <Partition>());
            var handler = new DefaultCallbackHandler <string, Message>(config, partitioner.Object, new DefaultEncoder(), mockPartitionInfo.Object, pool.Object);

            try
            {
                handler.Handle(new List <ProducerData <string, Message> >()
                {
                    new ProducerData <string, Message>("test", new Message(new byte[100]))
                });
            }
            catch (FailedToSendMessageException <string> )
            {
                mockPartitionInfo.Verify(m => m.GetBrokerPartitionInfo(0, string.Empty, It.IsAny <int>(), "test"), Times.Exactly(3));
                return;
            }

            Assert.Fail("Should have caught exception.");
        }
        public void ShouldHandleEvents()
        {
            var partitioner        = new Mock <IPartitioner <string> >();
            var config             = new ProducerConfiguration(new List <BrokerConfiguration>());
            var pool               = new Mock <ISyncProducerPool>();
            var producer           = new Mock <ISyncProducer>();
            var partitionMetadatas = new List <PartitionMetadata>()
            {
                new PartitionMetadata(0, new Broker(0, "host1", 1234), Enumerable.Empty <Broker>(),
                                      Enumerable.Empty <Broker>())
            };
            var metadatas = new List <TopicMetadata>()
            {
                new TopicMetadata("test", partitionMetadatas, ErrorMapping.NoError)
            };

            producer.SetupGet(p => p.Config)
            .Returns(
                () =>
                new SyncProducerConfiguration(new ProducerConfiguration(new List <BrokerConfiguration>()), 0,
                                              "host1", 1234));
            producer.Setup(p => p.Send(It.IsAny <TopicMetadataRequest>())).Returns(() => metadatas);
            var statuses = new Dictionary <TopicAndPartition, ProducerResponseStatus>();

            statuses[new TopicAndPartition("test", 0)] = new ProducerResponseStatus();
            producer.Setup(p => p.Send(It.IsAny <ProducerRequest>()))
            .Returns(
                () =>
                new ProducerResponse(1, statuses));
            pool.Setup(p => p.GetShuffledProducers()).Returns(() => new List <ISyncProducer>()
            {
                producer.Object
            });
            pool.Setup(p => p.GetProducer(It.IsAny <int>())).Returns(() => producer.Object);
            var mockPartitionInfo = new Mock <IBrokerPartitionInfo>();

            mockPartitionInfo.Setup(m => m.GetBrokerPartitionInfo(0, string.Empty, It.IsAny <int>(), "test"))
            .Returns(() =>
            {
                var partition    = new Partition("test", 0);
                var replica      = new Replica(0, "test");
                partition.Leader = replica;
                return(new List <Partition>()
                {
                    partition
                });
            });
            var handler = new DefaultCallbackHandler <string, Message>(config, partitioner.Object, new DefaultEncoder(), mockPartitionInfo.Object, pool.Object);

            handler.Handle(new List <ProducerData <string, Message> >()
            {
                new ProducerData <string, Message>("test", new Message(new byte[100]))
            });
            pool.Verify(p => p.GetProducer(0));
        }
 public void ShouldHandleEvents()
 {
     var partitioner = new Mock<IPartitioner<string>>();
     var config = new ProducerConfiguration(new List<BrokerConfiguration>());
     var pool = new Mock<ISyncProducerPool>();
     var producer = new Mock<ISyncProducer>();
     var partitionMetadatas = new List<PartitionMetadata>()
     {
         new PartitionMetadata(0, new Broker(0, "host1", 1234), Enumerable.Empty<Broker>(),
             Enumerable.Empty<Broker>())
     };
     var metadatas = new List<TopicMetadata>() { new TopicMetadata("test", partitionMetadatas, ErrorMapping.NoError) };
     producer.SetupGet(p => p.Config)
             .Returns(
                 () =>
                     new SyncProducerConfiguration(new ProducerConfiguration(new List<BrokerConfiguration>()), 0,
                         "host1", 1234));
     producer.Setup(p => p.Send(It.IsAny<TopicMetadataRequest>())).Returns(() => metadatas);
     var statuses = new Dictionary<TopicAndPartition, ProducerResponseStatus>();
     statuses[new TopicAndPartition("test", 0)] = new ProducerResponseStatus();
     producer.Setup(p => p.Send(It.IsAny<ProducerRequest>()))
             .Returns(
                 () =>
                     new ProducerResponse(1, statuses));
     pool.Setup(p => p.GetShuffledProducers()).Returns(() => new List<ISyncProducer>() { producer.Object });
     pool.Setup(p => p.GetProducer(It.IsAny<int>())).Returns(() => producer.Object);
     var mockPartitionInfo = new Mock<IBrokerPartitionInfo>();
     mockPartitionInfo.Setup(m => m.GetBrokerPartitionInfo(0, string.Empty, It.IsAny<int>(), "test"))
                      .Returns(() =>
                      {
                          var partition = new Partition("test", 0);
                          var replica = new Replica(0, "test");
                          partition.Leader = replica;
                          return new List<Partition>() { partition };
                      });
     var handler = new DefaultCallbackHandler<string, Message>(config, partitioner.Object, new DefaultEncoder(), mockPartitionInfo.Object, pool.Object);
     handler.Handle(new List<ProducerData<string, Message>>() { new ProducerData<string, Message>("test", new Message(new byte[100])) });
     pool.Verify(p => p.GetProducer(0));
 }
        public void ShouldRetryHandleWhenTopicNotFound()
        {
            var partitioner = new Mock<IPartitioner<string>>();
            var config = new ProducerConfiguration(new List<BrokerConfiguration>());
            var pool = new Mock<ISyncProducerPool>();
            var producer = new Mock<ISyncProducer>();
            var partitionMetadatas = new List<PartitionMetadata>()
            {
                new PartitionMetadata(0, new Broker(0, "host1", 1234), Enumerable.Empty<Broker>(),
                    Enumerable.Empty<Broker>())
            };
            var metadatas = new List<TopicMetadata>() { new TopicMetadata("test", partitionMetadatas, ErrorMapping.NoError) };
            producer.SetupGet(p => p.Config)
                    .Returns(
                        () =>
                            new SyncProducerConfiguration(new ProducerConfiguration(new List<BrokerConfiguration>()), 0,
                                "host1", 1234));
            producer.Setup(p => p.Send(It.IsAny<TopicMetadataRequest>())).Returns(() => metadatas);
            var statuses = new Dictionary<TopicAndPartition, ProducerResponseStatus>();
            statuses[new TopicAndPartition("test", 0)] = new ProducerResponseStatus();
            producer.Setup(p => p.Send(It.IsAny<ProducerRequest>()))
                    .Returns(
                        () =>
                            new ProducerResponse(1, statuses));
            pool.Setup(p => p.GetShuffledProducers()).Returns(() => new List<ISyncProducer>() { producer.Object });
            pool.Setup(p => p.GetProducer(It.IsAny<int>())).Returns(() => producer.Object);
            var mockPartitionInfo = new Mock<IBrokerPartitionInfo>();
            mockPartitionInfo.Setup(m => m.GetBrokerPartitionInfo(0, string.Empty, It.IsAny<int>(), "test"))
                             .Returns(() => new List<Partition>());
            var handler = new DefaultCallbackHandler<string, Message>(config, partitioner.Object, new DefaultEncoder(), mockPartitionInfo.Object, pool.Object);
            try
            {
                handler.Handle(new List<ProducerData<string, Message>>()
                {
                    new ProducerData<string, Message>("test", new Message(new byte[100]))
                });
            }
            catch (FailedToSendMessageException<string>)
            {
                mockPartitionInfo.Verify(m => m.GetBrokerPartitionInfo(0, string.Empty, It.IsAny<int>(), "test"), Times.Exactly(3));
                return;
            }

            Assert.Fail("Should have caught exception.");
        }