aboutsummaryrefslogtreecommitdiffstats
path: root/messagebus/src/test/java/com/yahoo/messagebus/ConfigAgentTestCase.java
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /messagebus/src/test/java/com/yahoo/messagebus/ConfigAgentTestCase.java
Publish
Diffstat (limited to 'messagebus/src/test/java/com/yahoo/messagebus/ConfigAgentTestCase.java')
-rwxr-xr-xmessagebus/src/test/java/com/yahoo/messagebus/ConfigAgentTestCase.java199
1 files changed, 199 insertions, 0 deletions
diff --git a/messagebus/src/test/java/com/yahoo/messagebus/ConfigAgentTestCase.java b/messagebus/src/test/java/com/yahoo/messagebus/ConfigAgentTestCase.java
new file mode 100755
index 00000000000..f6b21e26030
--- /dev/null
+++ b/messagebus/src/test/java/com/yahoo/messagebus/ConfigAgentTestCase.java
@@ -0,0 +1,199 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.messagebus;
+
+import com.yahoo.config.subscription.ConfigSet;
+import com.yahoo.config.subscription.ConfigURI;
+import com.yahoo.messagebus.routing.HopSpec;
+import com.yahoo.messagebus.routing.RouteSpec;
+import com.yahoo.messagebus.routing.RoutingSpec;
+import com.yahoo.messagebus.routing.RoutingTableSpec;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.concurrent.TimeUnit;
+
+import static org.junit.Assert.*;
+
+/**
+ * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
+ */
+public class ConfigAgentTestCase {
+
+ @Rule
+ public TemporaryFolder tmpFolder = new TemporaryFolder();
+
+ @Test
+ public void testRoutingConfig() throws InterruptedException, IOException {
+ LocalHandler handler = new LocalHandler();
+ assertFalse(testHalf(handler.spec));
+ assertFalse(testFull(handler.spec));
+
+ ConfigSet set = new ConfigSet();
+ set.addBuilder("test", writeFull());
+
+ ConfigAgent agent = new ConfigAgent(ConfigURI.createFromIdAndSource("test", set), handler);
+ assertFalse(testHalf(handler.spec));
+ assertFalse(testFull(handler.spec));
+ agent.subscribe();
+ assertFalse(testHalf(handler.spec));
+ assertTrue(testFull(handler.spec));
+
+ handler.reset();
+ set.addBuilder("test", writeHalf());
+ assertTrue(handler.await(120, TimeUnit.SECONDS));
+ assertTrue(testHalf(handler.spec));
+ assertFalse(testFull(handler.spec));
+
+ handler.reset();
+ set.addBuilder("test", writeFull());
+ assertTrue(handler.await(120, TimeUnit.SECONDS));
+ assertTrue(testFull(handler.spec));
+ assertFalse(testHalf(handler.spec));
+ }
+
+ private boolean testHalf(RoutingSpec spec) {
+ if (spec.getNumTables() != 1) {
+ return false;
+ }
+ assertTables(spec, 1);
+ return true;
+ }
+
+ private boolean testFull(RoutingSpec spec) {
+ if (spec.getNumTables() != 2) {
+ return false;
+ }
+ assertTables(spec, 2);
+ return true;
+ }
+
+ private void assertTables(RoutingSpec spec, int numTables) {
+ assertEquals(numTables, spec.getNumTables());
+ if (numTables > 0) {
+ assertEquals("foo", spec.getTable(0).getProtocol());
+ assertEquals(2, spec.getTable(0).getNumHops());
+ assertEquals("foo-h1", spec.getTable(0).getHop(0).getName());
+ assertEquals("foo-h1-sel", spec.getTable(0).getHop(0).getSelector());
+ assertEquals(2, spec.getTable(0).getHop(0).getNumRecipients());
+ assertEquals("foo-h1-r1", spec.getTable(0).getHop(0).getRecipient(0));
+ assertEquals("foo-h1-r2", spec.getTable(0).getHop(0).getRecipient(1));
+ assertEquals(true, spec.getTable(0).getHop(0).getIgnoreResult());
+ assertEquals("foo-h2", spec.getTable(0).getHop(1).getName());
+ assertEquals("foo-h2-sel", spec.getTable(0).getHop(1).getSelector());
+ assertEquals(2, spec.getTable(0).getHop(1).getNumRecipients());
+ assertEquals("foo-h2-r1", spec.getTable(0).getHop(1).getRecipient(0));
+ assertEquals("foo-h2-r2", spec.getTable(0).getHop(1).getRecipient(1));
+ assertEquals(2, spec.getTable(0).getNumRoutes());
+ assertEquals("foo-r1", spec.getTable(0).getRoute(0).getName());
+ assertEquals(2, spec.getTable(0).getRoute(0).getNumHops());
+ assertEquals("foo-h1", spec.getTable(0).getRoute(0).getHop(0));
+ assertEquals("foo-h2", spec.getTable(0).getRoute(0).getHop(1));
+ assertEquals("foo-r2", spec.getTable(0).getRoute(1).getName());
+ assertEquals(2, spec.getTable(0).getRoute(1).getNumHops());
+ assertEquals("foo-h2", spec.getTable(0).getRoute(1).getHop(0));
+ assertEquals("foo-h1", spec.getTable(0).getRoute(1).getHop(1));
+ }
+ if (numTables > 1) {
+ assertEquals("bar", spec.getTable(1).getProtocol());
+ assertEquals(2, spec.getTable(1).getNumHops());
+ assertEquals("bar-h1", spec.getTable(1).getHop(0).getName());
+ assertEquals("bar-h1-sel", spec.getTable(1).getHop(0).getSelector());
+ assertEquals(2, spec.getTable(1).getHop(0).getNumRecipients());
+ assertEquals("bar-h1-r1", spec.getTable(1).getHop(0).getRecipient(0));
+ assertEquals("bar-h1-r2", spec.getTable(1).getHop(0).getRecipient(1));
+ assertEquals("bar-h2", spec.getTable(1).getHop(1).getName());
+ assertEquals("bar-h2-sel", spec.getTable(1).getHop(1).getSelector());
+ assertEquals(2, spec.getTable(1).getHop(1).getNumRecipients());
+ assertEquals("bar-h2-r1", spec.getTable(1).getHop(1).getRecipient(0));
+ assertEquals("bar-h2-r2", spec.getTable(1).getHop(1).getRecipient(1));
+ assertEquals(2, spec.getTable(1).getNumRoutes());
+ assertEquals("bar-r1", spec.getTable(1).getRoute(0).getName());
+ assertEquals(2, spec.getTable(1).getRoute(0).getNumHops());
+ assertEquals("bar-h1", spec.getTable(1).getRoute(0).getHop(0));
+ assertEquals("bar-h2", spec.getTable(1).getRoute(0).getHop(1));
+ assertEquals("bar-r2", spec.getTable(1).getRoute(1).getName());
+ assertEquals(2, spec.getTable(1).getRoute(1).getNumHops());
+ assertEquals("bar-h2", spec.getTable(1).getRoute(1).getHop(0));
+ assertEquals("bar-h1", spec.getTable(1).getRoute(1).getHop(1));
+ }
+ }
+
+ private static MessagebusConfig.Builder writeHalf() {
+ return writeTables(1);
+ }
+
+ private static MessagebusConfig.Builder writeFull() {
+ return writeTables(2);
+ }
+
+ private static MessagebusConfig.Builder writeTables(int numTables) {
+ MessagebusConfig.Builder builder = new MessagebusConfig.Builder();
+ if (numTables > 0) {
+ MessagebusConfig.Routingtable.Builder table = new MessagebusConfig.Routingtable.Builder();
+ table.protocol("foo");
+ table.hop(getHop("foo-h1", "foo-h1-sel", "foo-h1-r1", "foo-h1-r2", true));
+ table.hop(getHop("foo-h2", "foo-h2-sel", "foo-h2-r1", "foo-h2-r2", false));
+ table.route(getRoute("foo-r1", "foo-h1", "foo-h2"));
+ table.route(getRoute("foo-r2", "foo-h2", "foo-h1"));
+ builder.routingtable(table);
+ }
+ if (numTables > 1) {
+ MessagebusConfig.Routingtable.Builder table = new MessagebusConfig.Routingtable.Builder();
+ table.protocol("bar");
+ table.hop(getHop("bar-h1", "bar-h1-sel", "bar-h1-r1", "bar-h1-r2", false));
+ table.hop(getHop("bar-h2", "bar-h2-sel", "bar-h2-r1", "bar-h2-r2", false));
+ table.route(getRoute("bar-r1", "bar-h1", "bar-h2"));
+ table.route(getRoute("bar-r2", "bar-h2", "bar-h1"));
+ builder.routingtable(table);
+ }
+ return builder;
+ }
+
+ private static MessagebusConfig.Routingtable.Route.Builder getRoute(String name, String hop1, String hop2) {
+ MessagebusConfig.Routingtable.Route.Builder route = new MessagebusConfig.Routingtable.Route.Builder();
+ route.name(name);
+ route.hop(hop1);
+ route.hop(hop2);
+ return route;
+ }
+
+ private static MessagebusConfig.Routingtable.Hop.Builder getHop(String name, String selector, String recipient1, String recipient2, boolean ignoreresult) {
+ MessagebusConfig.Routingtable.Hop.Builder hop = new MessagebusConfig.Routingtable.Hop.Builder();
+ hop.name(name);
+ hop.selector(selector);
+ hop.recipient(recipient1);
+ hop.recipient(recipient2);
+ hop.ignoreresult(ignoreresult);
+ return hop;
+ }
+
+ private static class LocalHandler implements ConfigHandler {
+
+ volatile RoutingSpec spec = new RoutingSpec();
+
+ public void setupRouting(RoutingSpec spec) {
+ this.spec = spec;
+ }
+
+ public void reset() {
+ spec = null;
+ }
+
+ public boolean await(int timeout, TimeUnit unit) throws InterruptedException {
+ long millis = System.currentTimeMillis() + unit.toMillis(timeout);
+ while (spec == null) {
+ long now = System.currentTimeMillis();
+ if (now >= millis) {
+ return false;
+ }
+ Thread.sleep(1000);
+ }
+ return true;
+ }
+ }
+}