package com.netflix.suro; import com.fasterxml.jackson.annotation.JsonCreator; import com.google.inject.Injector; import com.netflix.governator.lifecycle.LifecycleManager; import com.netflix.suro.input.DynamicPropertyInputConfigurator; import com.netflix.suro.input.SuroInput; import com.netflix.suro.message.MessageContainer; import com.netflix.suro.routing.DynamicPropertyRoutingMapConfigurator; import com.netflix.suro.sink.DynamicPropertySinkConfigurator; import com.netflix.suro.sink.Sink; import org.junit.Test; import java.util.Properties; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import static org.junit.Assert.assertTrue; public class TestSuroService { private static final AtomicBoolean sinkOpened = new AtomicBoolean(false); private static final AtomicBoolean inputOpened = new AtomicBoolean(false); private static final CountDownLatch latch = new CountDownLatch(2); public static class TestSuroServiceSink implements Sink { @JsonCreator public TestSuroServiceSink() {} @Override public void writeTo(MessageContainer message) { } @Override public void open() { latch.countDown(); sinkOpened.set(true); } @Override public void close() { } @Override public String recvNotice() { return null; } @Override public String getStat() { return null; } @Override public long getNumOfPendingMessages() { return 0; } @Override public long checkPause() { return 0; } } public static class TestSuroServiceInput implements SuroInput { @JsonCreator public TestSuroServiceInput() {} @Override public String getId() { return "testsuroservice"; } @Override public void start() throws Exception { latch.countDown(); assertTrue(sinkOpened.get()); inputOpened.set(true); } @Override public void shutdown() { } @Override public void setPause(long ms) { } } @Test public void test() throws Exception { AtomicReference<Injector> injector = new AtomicReference<Injector>(); Properties properties = new Properties(); properties.setProperty(DynamicPropertyRoutingMapConfigurator.ROUTING_MAP_PROPERTY, "{}"); properties.setProperty(DynamicPropertySinkConfigurator.SINK_PROPERTY, "{\n" + " \"default\": {\n" + " \"type\": \"testsuroservice\"\n" + " }\n" + " }\n" + "}"); properties.setProperty(DynamicPropertyInputConfigurator.INPUT_CONFIG_PROPERTY, "[\n" + " {\n" + " \"type\": \"testsuroservice\"\n" + " }\n" + "]"); SuroServer.create(injector, properties, new SuroPlugin() { @Override protected void configure() { addInputType("testsuroservice", TestSuroServiceInput.class); addSinkType("testsuroservice", TestSuroServiceSink.class); } }); injector.get().getInstance(LifecycleManager.class).start(); latch.await(5000, TimeUnit.MILLISECONDS); assertTrue(inputOpened.get()); assertTrue(sinkOpened.get()); } }