public async Task Should_RetryOnNextHost_When_SendFailsOnCurrentHostRetryPolicy(bool async)
        {
            using (var simulacronCluster = SimulacronCluster.CreateNew(3))
            {
                var contactPoint = simulacronCluster.InitialContactPoint;
                var nodes        = simulacronCluster.GetNodes().ToArray();
                var queryPlan    = new List <SimulacronNode>
                {
                    nodes[1],
                    nodes[2],
                    nodes[0]
                };
                await queryPlan[0].Stop().ConfigureAwait(false);
                var   currentHostRetryPolicy = new CurrentHostRetryPolicy(10, null);
                var   loadBalancingPolicy    = new CustomLoadBalancingPolicy(
                    queryPlan.Select(n => n.ContactPoint).ToArray());
                var builder = Cluster.Builder()
                              .AddContactPoint(contactPoint)
                              .WithSocketOptions(new SocketOptions()
                                                 .SetConnectTimeoutMillis(10000)
                                                 .SetReadTimeoutMillis(5000))
                              .WithLoadBalancingPolicy(loadBalancingPolicy)
                              .WithRetryPolicy(currentHostRetryPolicy);
                using (var cluster = builder.Build())
                {
                    var          session = (Session)cluster.Connect();
                    const string cql     = "select * from table2";

                    queryPlan[1].PrimeFluent(
                        b => b.WhenQuery(cql).
                        ThenRowsSuccess(new[] { ("text", DataType.Ascii) }, rows => rows.WithRow("test1").WithRow("test2")));
        public async Task Should_RetryOnNextHost_When_SendFailsOnCurrentHostRetryPolicy(bool async)
        {
            using (var simulacronCluster = SimulacronCluster.CreateNew(3))
            {
                var contactPoint = simulacronCluster.InitialContactPoint;
                var nodes        = simulacronCluster.GetNodes().ToArray();
                var queryPlan    = new List <SimulacronNode>
                {
                    nodes[1],
                    nodes[2],
                    nodes[0]
                };
                var currentHostRetryPolicy = new CurrentHostRetryPolicy(10, i => queryPlan[0].Stop());
                var loadBalancingPolicy    = new CustomLoadBalancingPolicy(
                    queryPlan.Select(n => n.ContactPoint).ToArray());
                var builder = Cluster.Builder()
                              .AddContactPoint(contactPoint)
                              .WithSocketOptions(new SocketOptions()
                                                 .SetConnectTimeoutMillis(10000)
                                                 .SetReadTimeoutMillis(5000))
                              .WithLoadBalancingPolicy(loadBalancingPolicy)
                              .WithRetryPolicy(currentHostRetryPolicy);
                using (var cluster = builder.Build())
                {
                    var          session = (Session)cluster.Connect();
                    const string cql     = "select * from table2";

                    var primeQueryFirstNode = new
                    {
                        when = new { query = cql },
                        then = new
                        {
                            result            = "overloaded",
                            delay_in_ms       = 0,
                            message           = "overloaded",
                            ignore_on_prepare = false
                        }
                    };

                    var primeQuerySecondNode = new
                    {
                        when = new { query = cql },
                        then = new
                        {
                            result            = "success",
                            delay_in_ms       = 0,
                            rows              = new[] { "test1", "test2" }.Select(v => new { text = v }).ToArray(),
                            column_types      = new { text = "ascii" },
                            ignore_on_prepare = false
                        }
                    };

                    queryPlan[0].Prime(primeQueryFirstNode);
                    queryPlan[1].Prime(primeQuerySecondNode);

                    if (async)
                    {
                        await session.ExecuteAsync(
                            new SimpleStatement(cql).SetConsistencyLevel(ConsistencyLevel.One)).ConfigureAwait(false);
                    }
                    else
                    {
                        session.Execute(new SimpleStatement(cql).SetConsistencyLevel(ConsistencyLevel.One));
                    }

                    Assert.AreEqual(1, currentHostRetryPolicy.RequestErrorCounter);
                    Assert.AreEqual(1, (await queryPlan[0].GetQueriesAsync(cql).ConfigureAwait(false)).Count);
                    Assert.AreEqual(1, (await queryPlan[1].GetQueriesAsync(cql).ConfigureAwait(false)).Count);
                    Assert.AreEqual(0, (await queryPlan[2].GetQueriesAsync(cql).ConfigureAwait(false)).Count);
                }
            }
        }