/** * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. * This file is licensed under the terms of the Modified BSD License. */ package abs.backend.java.lib.net; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; import static org.easymock.EasyMock.*; import abs.backend.java.lib.runtime.ABSObject; import abs.backend.java.lib.net.msg.Msg; import abs.backend.java.lib.net.msg.ObjectTargetMsg; import abs.backend.java.lib.net.msg.ObjectMsg; public class DefaultRouterTest { private NetNode node1; private NetNode node2; private NetNode node3; private NetNode node4; private NetCOG cog1; private NetCOG cog2; private ABSObject obj1; private ABSObject obj2; private Router currentRouter; private Router otherRouter; @Before public void setUp() { node1 = createMock(NetNode.class); node2 = createMock(NetNode.class); node3 = createMock(NetNode.class); node4 = createMock(NetNode.class); cog1 = createMock(NetCOG.class); cog2 = createMock(NetCOG.class); obj1 = createMock(ABSObject.class); obj2 = createMock(ABSObject.class); currentRouter = new DefaultRouter(node1); otherRouter = new DefaultRouter(node2); } @Test public void updateExchange() { currentRouter.register(cog1); currentRouter.register(obj1); otherRouter.register(cog2); otherRouter.register(obj2); currentRouter.update(node2, otherRouter); assertEquals("cog1 must be at zero hop distance", 0, currentRouter.getRouteEntry(cog1).getHops()); assertEquals("cog2 must be at one hop distance", 1, currentRouter.getRouteEntry(cog2).getHops()); assertEquals("obj1 must be at zero hop distance", 0, currentRouter.getRouteEntry(obj1).getHops()); assertEquals("obj2 must be at one hop distance", 1, currentRouter.getRouteEntry(obj2).getHops()); assertEquals("next node for cog1 must be current node", node1, currentRouter.getRouteEntry(cog1).getNextNode()); assertEquals("next node for cog2 must be at other node", node2, currentRouter.getRouteEntry(cog2).getNextNode()); assertEquals("next node for obj1 must be current node", node1, currentRouter.getRouteEntry(obj1).getNextNode()); assertEquals("next node for obj2 must be at other node", node2, currentRouter.getRouteEntry(obj2).getNextNode()); } @Test public void updateWithBetterAtSame() { otherRouter.register(obj1); currentRouter.replace(obj1, node3, 3); currentRouter.update(node2, otherRouter); assertEquals("route to object must be 1 hop", 1, currentRouter.getRouteEntry(obj1).getHops()); assertEquals("route must be other node", node2, currentRouter.getRouteEntry(obj1).getNextNode()); } @Test public void updateWithBetterAtOther() { otherRouter.replace(obj1, node3, 1); currentRouter.replace(obj1, node4, 3); currentRouter.update(node2, otherRouter); assertEquals("route to obj1 must be 2 hops", 2, currentRouter.getRouteEntry(obj1).getHops()); assertEquals("route must be node2", node2, currentRouter.getRouteEntry(obj1).getNextNode()); } @Test public void notUpdateWorse() { otherRouter.replace(obj1, node4, 5); currentRouter.replace(obj1, node3, 3); currentRouter.update(node2, otherRouter); assertEquals("route to obj1 must be 3 hops", 3, currentRouter.getRouteEntry(obj1).getHops()); assertEquals("next node for obj1 must be node3", node3, currentRouter.getRouteEntry(obj1).getNextNode()); } @Test public void updateWorseSameSource() { otherRouter.register(obj1); currentRouter.replace(obj1, node3, 3); currentRouter.update(node2, otherRouter); otherRouter.replace(obj1, node4, 1); currentRouter.update(node2, otherRouter); assertEquals("route to object must be 2 hops", 2, currentRouter.getRouteEntry(obj1).getHops()); assertEquals("next node t must be 2 hops", 2, currentRouter.getRouteEntry(obj1).getHops()); } @Test public void registerObject() { currentRouter.register(obj1); assertTrue("object must be among registered objects", currentRouter.getRegisteredObjects().contains(obj1)); assertEquals("route to obj1 must be 0 hops", 0, currentRouter.getRouteEntry(obj1).getHops()); assertEquals("route to obj1 must node1", node1, currentRouter.getRouteEntry(obj1).getNextNode()); } @Test(expected=IllegalArgumentException.class) public void registerObjectAgain() { currentRouter.register(obj1); currentRouter.register(obj1); } @Test public void registerCOG() { currentRouter.register(cog1); assertTrue("object must be among registered objects", currentRouter.getRegisteredCOGs().contains(cog1)); assertEquals("route to cog1 must be 0 hops", 0, currentRouter.getRouteEntry(cog1).getHops()); assertEquals("route to cog1 must node1", node1, currentRouter.getRouteEntry(cog1).getNextNode()); } @Test(expected=IllegalArgumentException.class) public void registerCOGAgain() { currentRouter.register(cog1); currentRouter.register(cog1); } @Test public void replaceExistingObject() { currentRouter.register(obj1); currentRouter.replace(obj1, node2, 1); assertEquals("route to cog1 must be 1 hops", 1, currentRouter.getRouteEntry(obj1).getHops()); assertEquals("route to cog1 must node2", node2, currentRouter.getRouteEntry(obj1).getNextNode()); } @Test public void replaceNonexistentObject() { currentRouter.replace(obj1, node2, 1); assertEquals("route to obj1 must be 1 hops", 1, currentRouter.getRouteEntry(obj1).getHops()); assertEquals("route to obj1 must node2", node2, currentRouter.getRouteEntry(obj1).getNextNode()); } @Test public void replaceExistingCOG() { currentRouter.register(cog1); currentRouter.replace(cog1, node2, 1); assertEquals("route to cog1 must be 1 hops", 1, currentRouter.getRouteEntry(cog1).getHops()); assertEquals("route to cog1 must node2", node2, currentRouter.getRouteEntry(cog1).getNextNode()); } @Test public void replaceNonexistentCOG() { currentRouter.replace(cog1, node2, 1); assertEquals("route to cog1 must be 1 hops", 1, currentRouter.getRouteEntry(cog1).getHops()); assertEquals("route to cog1 must node2", node2, currentRouter.getRouteEntry(cog1).getNextNode()); } @Test public void noRegisteredObjects() { assertTrue("there exists registered objects", currentRouter.getRegisteredObjects().isEmpty()); } @Test public void noRegisteredCOGs() { assertTrue("there exists registered cogs", currentRouter.getRegisteredCOGs().isEmpty()); } @Test public void nextNodeIsSelf() { ObjectTargetMsg msg = createMock(ObjectTargetMsg.class); currentRouter.register(obj1); expect(msg.getTarget()).andReturn(obj1); replay(msg); assertEquals("next node must be node1", node1, currentRouter.getNextNode(msg)); verify(msg); } @Test public void nextNodeIsSelectedNeighbour() { ObjectTargetMsg msg = createMock(ObjectTargetMsg.class); currentRouter.replace(obj1, node2, 1); expect(msg.getTarget()).andReturn(obj1); replay(msg); assertEquals("next node must be node2", node2, currentRouter.getNextNode(msg)); verify(msg); } @Test public void nextNodeIsDefaultNeighbour() { Msg msg = createMock(Msg.class); expect(node1.defaultRoute()).andReturn(node2); replay(node1); assertEquals("next node must be node2", node2, currentRouter.getNextNode(msg)); verify(node1); } @Test public void hasNoRoutEntryForTarget() { ObjectTargetMsg msg = createMock(ObjectTargetMsg.class); expect(msg.getTarget()).andReturn(obj1); expect(node1.defaultRoute()).andReturn(node2); replay(msg); replay(node1); assertEquals("next node must be node2", node2, currentRouter.getNextNode(msg)); verify(msg); verify(node1); } @Test public void nextNodeBasedOnCOG() { ObjectMsg msg = createMock(ObjectMsg.class); currentRouter.replace(cog1, node2, 1); expect(msg.getCOG()).andReturn(cog1); replay(msg); assertEquals("next node must be node2", node2, currentRouter.getNextNode(msg)); verify(msg); } }