package io.craft.atom.redis; import io.craft.atom.redis.api.MasterSlaveRedis; import io.craft.atom.redis.api.Redis; import io.craft.atom.redis.api.RedisFactory; import io.craft.atom.test.CaseCounter; import java.util.List; import junit.framework.Assert; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * Test for {@link MasterSlaveRedis} * * @author mindwind * @version 1.0, Dec 3, 2013 */ public class TestMasterSlaveRedis extends AbstractRedisTests { private MasterSlaveRedis masterSlaveRedis; // ~ ------------------------------------------------------------------------------------------------------------- public TestMasterSlaveRedis() { super(); } @Before public void before() { masterSlaveRedis = RedisFactory.newMasterSlaveRedis(redis1, redis2, redis3); } @After public void after() { try { redis1.slaveofnoone(); redis2.slaveofnoone(); redis3 = RedisFactory.newRedis(HOST, PORT3); redis3.slaveofnoone(); clean(); } catch (Exception e) { e.printStackTrace(); } } // ~ ------------------------------------------------------------------------------------------------------------- @Test public void testSwitchoverNormal() { masterSlaveRedis.master(1); Redis m = masterSlaveRedis.master(); Assert.assertEquals(PORT2, m.port()); List<Redis> chain = masterSlaveRedis.chain(); Assert.assertEquals(3, chain.size()); Redis s1 = chain.get(1); Redis s2 = chain.get(2); Assert.assertEquals(PORT2, chain.get(0).port()); Assert.assertEquals(PORT3, s1.port()); Assert.assertEquals(PORT1, s2.port()); String slaveof = masterSlaveRedis.configget("slaveof").get("slaveof"); Assert.assertNull(slaveof); slaveof = s1.configget("slaveof").get("slaveof"); Assert.assertEquals(m.host() + " " + m.port(), slaveof); slaveof = s2.configget("slaveof").get("slaveof"); Assert.assertEquals(s1.host() + " " + s1.port(), slaveof); System.out.println(String.format("[CRAFT-ATOM-REDIS] (^_^) <%s> Case -> test switchover normal. ", CaseCounter.incr(7))); } @Test public void testSwitchoverException() { redis3.quit(); // switch to index-2 try { masterSlaveRedis.master(2); Assert.fail(); } catch (Exception e) { } masterSlaveRedis.master(1); Redis m = masterSlaveRedis.master(); Assert.assertEquals(PORT2, m.port()); String slaveof = redis2.configget("slaveof").get("slaveof"); Assert.assertNull(slaveof); System.out.println(String.format("[CRAFT-ATOM-REDIS] (^_^) <%s> Case -> test switchover exception. ", CaseCounter.incr(3))); } @Test public void testReadSlave() throws InterruptedException { // write to master String key = "test"; String value = "123"; masterSlaveRedis.enableReadSlave(); masterSlaveRedis.set(key, value); Boolean b = masterSlaveRedis.exists(key); Assert.assertFalse(b); // wait a while for master-slave sync. Thread.sleep(2000); // read from slave b = masterSlaveRedis.exists(key); String v = masterSlaveRedis.get(key); Assert.assertTrue(b); Assert.assertEquals(value, v); System.out.println(String.format("[CRAFT-ATOM-REDIS] (^_^) <%s> Case -> test read slave. ", CaseCounter.incr(3))); } }