/**
* Licensed to JumpMind Inc under one or more contributor
* license agreements. See the NOTICE file distributed
* with this work for additional information regarding
* copyright ownership. JumpMind Inc licenses this file
* to you under the GNU General Public License, version 3.0 (GPLv3)
* (the "License"); you may not use this file except in compliance
* with the License.
*
* You should have received a copy of the GNU General Public License,
* version 3.0 (GPLv3) along with this library; if not, see
* <http://www.gnu.org/licenses/>.
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jumpmind.symmetric.route;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.junit.Assert.*;
import org.jumpmind.db.model.Table;
import org.jumpmind.symmetric.io.data.DataEventType;
import org.jumpmind.symmetric.model.Data;
import org.jumpmind.symmetric.model.DataMetaData;
import org.jumpmind.symmetric.model.NetworkedNode;
import org.jumpmind.symmetric.model.Node;
import org.jumpmind.symmetric.model.NodeGroupLink;
import org.jumpmind.symmetric.model.TriggerHistory;
import org.junit.Test;
public class ConfigurationChangedDataRouterTest {
private static List<NodeGroupLink> THREE_TIER_LINKS;
private static NetworkedNode THREE_TIER_NETWORKED_ROOT;
private static List<NodeGroupLink> MULTIPLE_GROUPS_PLUS_REG_SVR_LINKS;
private static NetworkedNode MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT;
static {
THREE_TIER_LINKS = new ArrayList<NodeGroupLink>();
THREE_TIER_LINKS.add(new NodeGroupLink("corp", "region"));
THREE_TIER_LINKS.add(new NodeGroupLink("region", "corp"));
THREE_TIER_LINKS.add(new NodeGroupLink("region", "laptop"));
THREE_TIER_LINKS.add(new NodeGroupLink("laptop", "region"));
THREE_TIER_NETWORKED_ROOT = new NetworkedNode(new Node("corp", "corp"));
Node rgn1 = new Node("rgn1", "region");
rgn1.setCreatedAtNodeId("corp");
THREE_TIER_NETWORKED_ROOT.addChild(new NetworkedNode(rgn1));
Node rgn2 = new Node("rgn2", "region");
rgn2.setCreatedAtNodeId("corp");
THREE_TIER_NETWORKED_ROOT.addChild(new NetworkedNode(rgn2));
Node laptop1 = new Node("laptop1", "laptop");
laptop1.setCreatedAtNodeId("rgn1");
THREE_TIER_NETWORKED_ROOT.findNetworkedNode(laptop1.getCreatedAtNodeId()).addChild(
new NetworkedNode(laptop1));
Node laptop2 = new Node("laptop2", "laptop");
laptop2.setCreatedAtNodeId("rgn2");
THREE_TIER_NETWORKED_ROOT.findNetworkedNode(laptop2.getCreatedAtNodeId()).addChild(
new NetworkedNode(laptop2));
MULTIPLE_GROUPS_PLUS_REG_SVR_LINKS = new ArrayList<NodeGroupLink>();
MULTIPLE_GROUPS_PLUS_REG_SVR_LINKS.add(new NodeGroupLink("regsvr", "s1"));
MULTIPLE_GROUPS_PLUS_REG_SVR_LINKS.add(new NodeGroupLink("regsvr", "s2"));
MULTIPLE_GROUPS_PLUS_REG_SVR_LINKS.add(new NodeGroupLink("regsvr", "dw"));
MULTIPLE_GROUPS_PLUS_REG_SVR_LINKS.add(new NodeGroupLink("s1", "regsvr"));
MULTIPLE_GROUPS_PLUS_REG_SVR_LINKS.add(new NodeGroupLink("s2", "regsvr"));
MULTIPLE_GROUPS_PLUS_REG_SVR_LINKS.add(new NodeGroupLink("dw", "regsvr"));
MULTIPLE_GROUPS_PLUS_REG_SVR_LINKS.add(new NodeGroupLink("s1", "dw"));
MULTIPLE_GROUPS_PLUS_REG_SVR_LINKS.add(new NodeGroupLink("s2", "dw"));
MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT = new NetworkedNode(new Node("regsvr", "regsvr"));
Node node = null;
node = new Node("s1", "s1");
node.setCreatedAtNodeId("regsvr");
MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT.addChild(new NetworkedNode(node));
node = new Node("s2", "s2");
node.setCreatedAtNodeId("regsvr");
MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT.addChild(new NetworkedNode(node));
node = new Node("dw", "dw");
node.setCreatedAtNodeId("regsvr");
MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT.addChild(new NetworkedNode(node));
}
@Test
public void testRouteHeartbeatToParent() {
IDataRouter router = buildTestableRouter(
THREE_TIER_NETWORKED_ROOT.findNetworkedNode("laptop1").getNode(), THREE_TIER_LINKS,
THREE_TIER_NETWORKED_ROOT);
Set<Node> nodes = new HashSet<Node>();
nodes.add(THREE_TIER_NETWORKED_ROOT.findNetworkedNode("rgn1").getNode());
Collection<String> nodeIds = router.routeToNodes(new SimpleRouterContext(), buildDataMetaData("SYM_NODE", "laptop1"), nodes, false, false, null);
assertNotNull(nodeIds);
assertEquals(1, nodeIds.size());
assertEquals("rgn1", nodeIds.iterator().next());
}
@Test
public void testRouteLaptop1FromRgn1() {
IDataRouter router = buildTestableRouter(
THREE_TIER_NETWORKED_ROOT.findNetworkedNode("corp").getNode(), THREE_TIER_LINKS,
THREE_TIER_NETWORKED_ROOT);
Set<Node> nodes = new HashSet<Node>();
nodes.add(THREE_TIER_NETWORKED_ROOT.findNetworkedNode("laptop1").getNode());
Collection<String> nodeIds = router.routeToNodes(new SimpleRouterContext(), buildDataMetaData("SYM_NODE", "laptop1"), nodes, false, false, null);
assertNotNull(nodeIds);
assertEquals(1, nodeIds.size());
assertEquals("laptop1", nodeIds.iterator().next());
}
@Test
public void testRouteRgn2FromCorp() {
IDataRouter router = buildTestableRouter(
THREE_TIER_NETWORKED_ROOT.findNetworkedNode("corp").getNode(), THREE_TIER_LINKS,
THREE_TIER_NETWORKED_ROOT);
Set<Node> nodes = new HashSet<Node>();
nodes.add(THREE_TIER_NETWORKED_ROOT.findNetworkedNode("rgn1").getNode());
nodes.add(THREE_TIER_NETWORKED_ROOT.findNetworkedNode("rgn2").getNode());
Collection<String> nodeIds = router.routeToNodes(new SimpleRouterContext(), buildDataMetaData("SYM_NODE", "rgn2"), nodes, false, false, null);
assertNotNull(nodeIds);
assertEquals(1, nodeIds.size());
assertEquals("rgn2", nodeIds.iterator().next());
}
@Test
public void testConfigurationExtract() {
IDataRouter router = buildTestableRouter(
THREE_TIER_NETWORKED_ROOT.findNetworkedNode("corp").getNode(), THREE_TIER_LINKS,
THREE_TIER_NETWORKED_ROOT);
Set<Node> nodes = new HashSet<Node>();
nodes.add(THREE_TIER_NETWORKED_ROOT.findNetworkedNode("corp").getNode());
Collection<String> nodeIds = router.routeToNodes(new SimpleRouterContext(), buildDataMetaData("SYM_NODE", "corp"), nodes, true, false, null);
assertNotNull(nodeIds);
assertEquals(1, nodeIds.size());
assertEquals("corp", nodeIds.iterator().next());
}
@Test
public void testRouteRgn1FromCorp() {
IDataRouter router = buildTestableRouter(
THREE_TIER_NETWORKED_ROOT.findNetworkedNode("corp").getNode(), THREE_TIER_LINKS,
THREE_TIER_NETWORKED_ROOT);
Set<Node> nodes = new HashSet<Node>();
nodes.add(THREE_TIER_NETWORKED_ROOT.findNetworkedNode("rgn1").getNode());
nodes.add(THREE_TIER_NETWORKED_ROOT.findNetworkedNode("rgn2").getNode());
Collection<String> nodeIds = router.routeToNodes(new SimpleRouterContext(), buildDataMetaData("SYM_NODE", "rgn1"), nodes, false, false, null);
assertNotNull(nodeIds);
assertEquals(1, nodeIds.size());
assertEquals("rgn1", nodeIds.iterator().next());
}
@Test
public void testRouteLaptop1FromCorp() {
IDataRouter router = buildTestableRouter(
THREE_TIER_NETWORKED_ROOT.findNetworkedNode("corp").getNode(), THREE_TIER_LINKS,
THREE_TIER_NETWORKED_ROOT);
Set<Node> nodes = new HashSet<Node>();
nodes.add(THREE_TIER_NETWORKED_ROOT.findNetworkedNode("rgn1").getNode());
nodes.add(THREE_TIER_NETWORKED_ROOT.findNetworkedNode("rgn2").getNode());
Collection<String> nodeIds = router.routeToNodes(new SimpleRouterContext(), buildDataMetaData("SYM_NODE", "laptop1"), nodes, false, false, null);
assertNotNull(nodeIds);
assertEquals(1, nodeIds.size());
assertEquals("rgn1", nodeIds.iterator().next());
}
@Test
public void testRouteS1ToDWFromRegsvr() {
IDataRouter router = buildTestableRouter(
MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT.findNetworkedNode("regsvr").getNode(), MULTIPLE_GROUPS_PLUS_REG_SVR_LINKS,
MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT);
Set<Node> nodes = new HashSet<Node>();
nodes.add(MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT.findNetworkedNode("s1").getNode());
nodes.add(MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT.findNetworkedNode("s2").getNode());
nodes.add(MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT.findNetworkedNode("dw").getNode());
Collection<String> nodeIds = router.routeToNodes(new SimpleRouterContext(), buildDataMetaData("SYM_NODE", "s1"), nodes, false, false, null);
assertNotNull(nodeIds);
assertEquals(2, nodeIds.size());
assertTrue(nodeIds.contains("s1"));
assertTrue(nodeIds.contains("dw"));
}
@Test
public void testRouteDWToS1andS2FromRegsvr() {
IDataRouter router = buildTestableRouter(
MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT.findNetworkedNode("regsvr").getNode(), MULTIPLE_GROUPS_PLUS_REG_SVR_LINKS,
MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT);
Set<Node> nodes = new HashSet<Node>();
nodes.add(MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT.findNetworkedNode("s1").getNode());
nodes.add(MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT.findNetworkedNode("s2").getNode());
nodes.add(MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT.findNetworkedNode("dw").getNode());
Collection<String> nodeIds = router.routeToNodes(new SimpleRouterContext(), buildDataMetaData("SYM_NODE", "dw"), nodes, false, false, null);
assertNotNull(nodeIds);
assertEquals(3, nodeIds.size());
assertTrue(nodeIds.contains("s1"));
assertTrue(nodeIds.contains("s2"));
assertTrue(nodeIds.contains("dw"));
}
@Test
public void testRouteS1toRegsvrFromS1() {
IDataRouter router = buildTestableRouter(
MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT.findNetworkedNode("s1").getNode(), MULTIPLE_GROUPS_PLUS_REG_SVR_LINKS,
MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT);
Set<Node> nodes = new HashSet<Node>();
nodes.add(MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT.findNetworkedNode("s1").getNode());
nodes.add(MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT.findNetworkedNode("dw").getNode());
nodes.add(MULTIPLE_GROUPS_PLUS_REG_SVR_NETWORKED_ROOT.findNetworkedNode("regsvr").getNode());
Collection<String> nodeIds = router.routeToNodes(new SimpleRouterContext(), buildDataMetaData("SYM_NODE", "s1"), nodes, false, false, null);
assertNotNull(nodeIds);
assertEquals(1, nodeIds.size());
assertTrue(nodeIds.contains("regsvr"));
}
protected DataMetaData buildDataMetaData(String tableName, String nodeId) {
Data data = new Data();
data.setTableName(tableName);
data.setDataEventType(DataEventType.UPDATE);
data.setTriggerHistory(new TriggerHistory(tableName, "NODE_ID", "NODE_ID"));
data.setPkData(nodeId);
data.setRowData(nodeId);
return new DataMetaData(data, new Table(tableName), null, null);
}
protected IDataRouter buildTestableRouter(final Node nodeThatIsRouting,
final List<NodeGroupLink> links, final NetworkedNode root) {
ConfigurationChangedDataRouter router = new ConfigurationChangedDataRouter() {
@Override
protected Node findIdentity() {
return nodeThatIsRouting;
}
@Override
protected List<NodeGroupLink> getNodeGroupLinksFromContext(SimpleRouterContext routingContext) {
return links;
}
@Override
protected NetworkedNode getRootNetworkNodeFromContext(SimpleRouterContext routingContext) {
return root;
}
};
return router;
}
}