package org.greencheek.elasticacheconfig.client; import org.greencheek.elasticacheconfig.annotations.ConfigMessage; import org.greencheek.elasticacheconfig.annotations.DelayConfigResponse; import org.greencheek.elasticacheconfig.confighandler.ConfigInfoProcessor; import org.greencheek.elasticacheconfig.domain.ConfigInfo; import org.greencheek.elasticacheconfig.server.StringServer; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import java.util.HashSet; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import static org.junit.Assert.*; /** * Created by dominictootell on 20/07/2014. */ public class PeriodicConfigRetrievalClientTest { String message = new String("CONFIG cluster 0 147\r\n" + "12\r\n" + "myCluster.pc4ldq.0001.use1.cache.amazonaws.com|10.82.235.120|11211 myCluster.pc4ldq.0002.use1.cache.amazonaws.com|10.80.249.27|11211\r\n" + "\n"+ "END\r\n"); @Rule public StringServer server = new StringServer(message); PeriodicConfigRetrievalClient client; @Before public void setUp() { } @Test public void testConfigInfoIsReturned() { ConfigRetrievalSettingsBuilder builder = new ConfigRetrievalSettingsBuilder(); final CountDownLatch latch = new CountDownLatch(2); ConfigInfoProcessor processor = new ConfigInfoProcessor() { @Override public void processConfig(ConfigInfo info) { System.out.println(info); latch.countDown(); } }; builder.setConfigInfoProcessor(processor); builder.setConfigPollingTime(0,5, TimeUnit.SECONDS); builder.setIdleReadTimeout(70,TimeUnit.SECONDS); builder.addElastiCacheHost(new ElastiCacheServerConnectionDetails("localhost",server.getPort())); client = new PeriodicConfigRetrievalClient(builder.build()); client.start(); boolean ok=false; try { ok = latch.await(20,TimeUnit.SECONDS); } catch(InterruptedException e) { fail("problem waiting for config retrieval"); } assertTrue(ok); } @Test @ConfigMessage(message = {"CONFIG cluster 0 147\r\n" + "INVALID_VERSION\r\n" + "myCluster.pc4ldq.0001.use1.cache.amazonaws.com|10.82.235.120|11211 myCluster.pc4ldq.0002.use1.cache.amazonaws.com|10.80.249.27|11211\r\n" + "\nEND\r\n","CONFIG cluster 0 147\r\n" + "12\r\n" + "myCluster.pc4ldq.0001.use1.cache.amazonaws.com|10.82.235.120|11211 myCluster.pc4ldq.0002.use1.cache.amazonaws.com|10.80.249.27|11211\r\n" + "\nEND\r\n"}) public void testInvalidConfigInfoIsNotReturned() { ConfigRetrievalSettingsBuilder builder = new ConfigRetrievalSettingsBuilder(); final CountDownLatch latch = new CountDownLatch(2); final AtomicInteger invalid = new AtomicInteger(0); ConfigInfoProcessor processor = new ConfigInfoProcessor() { @Override public void processConfig(ConfigInfo info) { System.out.println(info); latch.countDown(); if(!info.isValid()) invalid.incrementAndGet(); } }; builder.setConfigInfoProcessor(processor); builder.setConfigPollingTime(0,5, TimeUnit.SECONDS); builder.setIdleReadTimeout(70,TimeUnit.SECONDS); builder.addElastiCacheHost(new ElastiCacheServerConnectionDetails("localhost",server.getPort())); client = new PeriodicConfigRetrievalClient(builder.build()); client.start(); boolean ok=false; try { ok = latch.await(15,TimeUnit.SECONDS); } catch(InterruptedException e) { fail("problem waiting for config retrieval"); } assertTrue(ok); assertEquals(1,invalid.get()); } @Test @ConfigMessage(message = {"CONFIG cluster 0 147\r\n" + "1.5\r\n" + "myCluster.pc4ldq.0001.use1.cache.amazonaws.com|10.82.235.120|11211 myCluster.pc4ldq.0002.use1.cache.amazonaws.com|10.80.249.27|11211\r\n" + "END\r\n", "CONFIG cluster 0 147\r\n" + "-1.5\r\n" + "myCluster.pc4ldq.0001.use1.cache.amazonaws.com|10.82.235.120|11211 myCluster.pc4ldq.0002.use1.cache.amazonaws.com|10.80.249.27|11211\r\n" + "\nEND\r\n", "CONFIG cluster 0 147\r\n" + "0xf\r\n" + "myCluster.pc4ldq.0001.use1.cache.amazonaws.com|10.82.235.120|11211 myCluster.pc4ldq.0002.use1.cache.amazonaws.com|10.80.249.27|11211\r\n" + "\nEND\r\n", "CONFIG cluster 0 147\r\n" + "-\r\n" + "myCluster.pc4ldq.0001.use1.cache.amazonaws.com|10.82.235.120|11211 myCluster.pc4ldq.0002.use1.cache.amazonaws.com|10.80.249.27|11211\r\n" + "\nEND\r\n", "CONFIG cluster 0 147\r\n" + ".\r\n" + "myCluster.pc4ldq.0001.use1.cache.amazonaws.com|10.82.235.120|11211 myCluster.pc4ldq.0002.use1.cache.amazonaws.com|10.80.249.27|11211\r\n" + "\nEND\r\n", "CONFIG cluster 0 147\r\n" + " \r\n" + "myCluster.pc4ldq.0001.use1.cache.amazonaws.com|10.82.235.120|11211 myCluster.pc4ldq.0002.use1.cache.amazonaws.com|10.80.249.27|11211\r\n" + "\nEND\r\n", "CONFIG cluster 0 147\r\n" + (char)1+"\r\n" + "myCluster.pc4ldq.0001.use1.cache.amazonaws.com|10.82.235.120|11211 myCluster.pc4ldq.0002.use1.cache.amazonaws.com|10.80.249.27|11211\r\n" + "\nEND\r\n" }) public void testVersionConfigInfo() { ConfigRetrievalSettingsBuilder builder = new ConfigRetrievalSettingsBuilder(); final CountDownLatch latch = new CountDownLatch(7); final AtomicInteger invalid = new AtomicInteger(0); ConfigInfoProcessor processor = new ConfigInfoProcessor() { @Override public void processConfig(ConfigInfo info) { System.out.println(info); latch.countDown(); if(!info.isValid()) invalid.incrementAndGet(); } }; builder.setConfigInfoProcessor(processor); builder.setConfigPollingTime(0,2, TimeUnit.SECONDS); builder.setIdleReadTimeout(70,TimeUnit.SECONDS); builder.addElastiCacheHost(new ElastiCacheServerConnectionDetails("localhost",server.getPort())); builder.setNumberOfInvalidConfigsBeforeReconnect(10); client = new PeriodicConfigRetrievalClient(builder.build()); client.start(); boolean ok=false; try { ok = latch.await(30,TimeUnit.SECONDS); } catch(InterruptedException e) { fail("problem waiting for config retrieval"); } assertTrue(ok); assertEquals(7,invalid.get()); } @Test @ConfigMessage(message = {"CONFIG cluster 0 147\r\n" + "INVALID_VERSION\r\n" + "myCluster.pc4ldq.0001.use1.cache.amazonaws.com|10.82.235.120|11211 myCluster.pc4ldq.0002.use1.cache.amazonaws.com|10.80.249.27|11211${REMOTE_ADDR}\r\n" + "\nEND\r\n" ,"bob\nbob\nbob\n\nbob\n" ,"bob\r\nbob\nbob\n\nbob\n" ,"bob\r\nbob\nbob\n\nbob\n" ,"bob\r\nbob\nbob\n\nbob\n", "CONFIG cluster 0 147\r\n" + "12\r\n" + "myCluster.pc4ldq.0001.use1.cache.amazonaws.com|10.82.235.120|11211 myCluster.pc4ldq.0002.use1.cache.amazonaws.com|10.80.249.27|11211${REMOTE_ADDR}\r\n" + "\nEND\r\n"}) public void testReconnectAfterInvalidConfigInfoIsReturned() { ConfigRetrievalSettingsBuilder builder = new ConfigRetrievalSettingsBuilder(); final CountDownLatch latch = new CountDownLatch(6); final AtomicInteger invalid = new AtomicInteger(0); final Set<String> addresses = new HashSet<String>(); ConfigInfoProcessor processor = new ConfigInfoProcessor() { @Override public void processConfig(ConfigInfo info) { System.out.println(info); int index = info.getServers().indexOf("/127.0.0.1"); if(index>-1) { addresses.add(info.getServers().substring(index + 11)); } latch.countDown(); if(!info.isValid()) invalid.incrementAndGet(); } }; builder.setConfigInfoProcessor(processor); builder.setConfigPollingTime(0,1, TimeUnit.SECONDS); builder.setIdleReadTimeout(70,TimeUnit.SECONDS); builder.addElastiCacheHost(new ElastiCacheServerConnectionDetails("localhost",server.getPort())); builder.setNumberOfInvalidConfigsBeforeReconnect(5); client = new PeriodicConfigRetrievalClient(builder.build()); client.start(); boolean ok=false; try { ok = latch.await(15,TimeUnit.SECONDS); } catch(InterruptedException e) { fail("problem waiting for config retrieval"); } assertTrue(ok); assertEquals(5,invalid.get()); assertEquals(2,addresses.size()); } @Test @DelayConfigResponse(delayedForTimeUnit = TimeUnit.SECONDS,delayFor = 20) @ConfigMessage(message = { "CONFIG cluster 0 147\r\n" + "12\r\n" + "myCluster.pc4ldq.0001.use1.cache.amazonaws.com|10.82.235.120|11211 myCluster.pc4ldq.0002.use1.cache.amazonaws.com|10.80.249.27|11211${REMOTE_ADDR}\r\n" + "\nEND\r\n"}) public void testIdleTimeout() { ConfigRetrievalSettingsBuilder builder = new ConfigRetrievalSettingsBuilder(); final CountDownLatch latch = new CountDownLatch(2); final AtomicInteger invalid = new AtomicInteger(0); final Set<String> addresses = new HashSet<String>(); ConfigInfoProcessor processor = new ConfigInfoProcessor() { @Override public void processConfig(ConfigInfo info) { System.out.println(info); int index = info.getServers().indexOf("/127.0.0.1"); if(index>-1) { addresses.add(info.getServers().substring(index+11)); } latch.countDown(); if(!info.isValid()) invalid.incrementAndGet(); } }; builder.setConfigInfoProcessor(processor); builder.setConfigPollingTime(0, 20, TimeUnit.SECONDS); builder.setIdleReadTimeout(10, TimeUnit.SECONDS); builder.addElastiCacheHost(new ElastiCacheServerConnectionDetails("localhost",server.getPort())); builder.setNumberOfInvalidConfigsBeforeReconnect(5); client = new PeriodicConfigRetrievalClient(builder.build()); client.start(); boolean ok=false; try { ok = latch.await(25,TimeUnit.SECONDS); } catch(InterruptedException e) { fail("problem waiting for config retrieval"); } assertFalse(ok); assertEquals(0,invalid.get()); assertEquals(0,addresses.size()); } @After public void tearDown() { client.stop(); } }