public void ReadOnlyConnectionSlavesTest()
        {
            var slaves = Server26379.SentinelSlaves(ServiceName);
            var config = new ConfigurationOptions
            {
                TieBreaker  = "",
                ServiceName = TestConfig.Current.SentinelSeviceName,
            };

            foreach (var kv in slaves)
            {
                Assert.Equal("slave", kv.ToDictionary()["flags"]);
                config.EndPoints.Add(kv.ToDictionary()["name"]);
            }

            var readonlyConn = ConnectionMultiplexer.Connect(config);

            Thread.Sleep(5000);
            Assert.True(readonlyConn.IsConnected);
            var db = readonlyConn.GetDatabase();
            var s  = db.StringGet("test");

            Assert.True(s.IsNullOrEmpty);
            //var ex = Assert.Throws<RedisConnectionException>(() => db.StringSet("test", "try write to read only instance"));
            //Assert.StartsWith("No connection is available to service this operation", ex.Message);
        }
        public void GetSentinelMasterConnectionWriteReadFailover()
        {
            var conn = Conn.GetSentinelMasterConnection(new ConfigurationOptions {
                ServiceName = ServiceName
            });
            var       s        = conn.currentSentinelMasterEndPoint.ToString();
            IDatabase db       = conn.GetDatabase();
            var       expected = DateTime.Now.Ticks.ToString();

            db.StringSet("beforeFailOverValue", expected);

            Server26379.SentinelFailover(ServiceName);
            Thread.Sleep(3000);

            var conn1 = Conn.GetSentinelMasterConnection(new ConfigurationOptions {
                ServiceName = ServiceName
            });
            var s1 = conn1.currentSentinelMasterEndPoint.ToString();

            var db1    = conn1.GetDatabase();
            var actual = db1.StringGet("beforeFailOverValue");

            Assert.NotNull(s);
            Assert.NotNull(s1);
            Assert.NotEmpty(s);
            Assert.NotEmpty(s1);
            Assert.NotEqual(s, s1);
            Assert.Equal(expected, actual);
        }
        public void PingTest()
        {
            var test = Server26379.Ping();

            Log("ping to sentinel {0}:{1} took {2} ms", TestConfig.Current.SentinelServer,
                TestConfig.Current.SentinelPort, test.TotalMilliseconds);
            test = Server26380.Ping();
            Log("ping to sentinel {0}:{1} took {1} ms", TestConfig.Current.SentinelServer,
                TestConfig.Current.SentinelPort1, test.TotalMilliseconds);
            test = Server26381.Ping();
            Log("ping to sentinel {0}:{1} took {1} ms", TestConfig.Current.SentinelServer,
                TestConfig.Current.SentinelPort2, test.TotalMilliseconds);
        }
        public async Task SentinelSentinelsAsyncTest()
        {
            var sentinels = await Server26379.SentinelSentinelsAsync(ServiceName).ForAwait();

            var expected = new List <string> {
                Server26380.EndPoint.ToString(),
                Server26381.EndPoint.ToString()
            };

            var actual = new List <string>();

            foreach (var kv in sentinels)
            {
                actual.Add(kv.ToDictionary()["name"]);
            }
            Assert.All(expected, ep => Assert.NotEqual(ep, Server26379.EndPoint.ToString()));
            Assert.True(sentinels.Length == 2);
            Assert.All(expected, ep => Assert.Contains(ep, actual));


            sentinels = await Server26380.SentinelSentinelsAsync(ServiceName).ForAwait();

            expected = new List <string> {
                Server26379.EndPoint.ToString(),
                    Server26381.EndPoint.ToString()
            };

            actual = new List <string>();
            foreach (var kv in sentinels)
            {
                actual.Add(kv.ToDictionary()["name"]);
            }
            Assert.All(expected, ep => Assert.NotEqual(ep, Server26380.EndPoint.ToString()));
            Assert.True(sentinels.Length == 2);
            Assert.All(expected, ep => Assert.Contains(ep, actual));

            sentinels = await Server26381.SentinelSentinelsAsync(ServiceName).ForAwait();

            expected = new List <string> {
                Server26379.EndPoint.ToString(),
                    Server26380.EndPoint.ToString()
            };
            actual = new List <string>();
            foreach (var kv in sentinels)
            {
                actual.Add(kv.ToDictionary()["name"]);
            }
            Assert.All(expected, ep => Assert.NotEqual(ep, Server26381.EndPoint.ToString()));
            Assert.True(sentinels.Length == 2);
            Assert.All(expected, ep => Assert.Contains(ep, actual));
        }
        public async Task SentinelSlavesAsyncTest()
        {
            var slaveConfigs = await Server26379.SentinelSlavesAsync(ServiceName).ForAwait();

            Assert.True(slaveConfigs.Length > 0);
            Assert.True(slaveConfigs[0].ToDictionary().ContainsKey("name"));
            Assert.Equal("slave", slaveConfigs[0].ToDictionary()["flags"]);
            foreach (var config in slaveConfigs)
            {
                foreach (var kvp in config)
                {
                    Log("{0}:{1}", kvp.Key, kvp.Value);
                }
            }
        }
        public async Task SentinelMastersAsyncTest()
        {
            var masterConfigs = await Server26379.SentinelMastersAsync().ForAwait();

            Assert.Single(masterConfigs);
            Assert.True(masterConfigs[0].ToDictionary().ContainsKey("name"));
            Assert.Equal(ServiceName, masterConfigs[0].ToDictionary()["name"]);
            Assert.Equal("master", masterConfigs[0].ToDictionary()["flags"]);
            foreach (var config in masterConfigs)
            {
                foreach (var kvp in config)
                {
                    Log("{0}:{1}", kvp.Key, kvp.Value);
                }
            }
        }
        public async Task SentinelGetSentinelAddressesTest()
        {
            var addresses = await Server26379.SentinelGetSentinelAddresses(ServiceName).ForAwait();

            Assert.Contains(Server26380.EndPoint, addresses);
            Assert.Contains(Server26381.EndPoint, addresses);

            addresses = await Server26380.SentinelGetSentinelAddresses(ServiceName).ForAwait();

            Assert.Contains(Server26379.EndPoint, addresses);
            Assert.Contains(Server26381.EndPoint, addresses);

            addresses = await Server26381.SentinelGetSentinelAddresses(ServiceName).ForAwait();

            Assert.Contains(Server26379.EndPoint, addresses);
            Assert.Contains(Server26380.EndPoint, addresses);
        }
        public async Task GetSentinelMasterConnectionFailoverAsyncTest()
        {
            var conn = Conn.GetSentinelMasterConnection(new ConfigurationOptions {
                ServiceName = ServiceName
            });
            var endpoint = conn.currentSentinelMasterEndPoint.ToString();

            await Server26379.SentinelFailoverAsync(ServiceName).ForAwait();

            Thread.Sleep(5000);
            var conn1 = Conn.GetSentinelMasterConnection(new ConfigurationOptions {
                ServiceName = ServiceName
            });
            var endpoint1 = conn1.currentSentinelMasterEndPoint.ToString();

            Assert.NotEqual(endpoint, endpoint1);
        }
        public void GetSentinelMasterConnectionFailoverTest()
        {
            var conn = Conn.GetSentinelMasterConnection(new ConfigurationOptions {
                ServiceName = ServiceName
            });
            var endpoint = conn.currentSentinelMasterEndPoint.ToString();

            Server26379.SentinelFailover(ServiceName);
            Thread.Sleep(3000);

            var conn1 = Conn.GetSentinelMasterConnection(new ConfigurationOptions {
                ServiceName = ServiceName
            });
            var endpoint1 = conn1.currentSentinelMasterEndPoint.ToString();

            Assert.NotEqual(endpoint, endpoint1);
        }