/**
* 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 java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.easymock.EasyMock.*;
import abs.backend.java.lib.runtime.*;
import abs.backend.java.lib.net.msg.ObjectTargetMsg;
import abs.backend.java.lib.net.msg.ObjectMsg;
import abs.backend.java.lib.net.msg.COGMsg;
import abs.backend.java.lib.net.msg.TableMsg;
import abs.backend.java.lib.net.msg.MsgQueue;
public class NodeImplTest {
private NetNode currentNode;
private NetNode otherNode;
private ABSObject object;
private NetCOG cog;
private Router currentRouter;
private Router otherRouter;
private ArcImpl arc;
private MsgQueue queue;
@Before
public void setUp() {
currentRouter = createMock(Router.class);
otherRouter = createMock(Router.class);
currentNode = new NodeImpl(0, currentRouter);
otherNode = new NodeImpl(1, otherRouter);
arc = createMock(ArcImpl.class);
Map<NetNode, ArcImpl> outArcs = new HashMap<NetNode, ArcImpl>();
outArcs.put(otherNode, arc);
currentNode.addOutArcs(outArcs);
List<ArcImpl> inArcs = new ArrayList<ArcImpl>();
inArcs.add(arc);
otherNode.addInArcs(inArcs);
queue = createMock(MsgQueue.class);
object = createMock(ABSObject.class);
cog = createMock(NetCOG.class);
}
@Test
public void getId() {
assertEquals("must have id 0", 0, currentNode.getId());
}
@Test
public void processObjectTargetMsgOnNode() {
ObjectTargetMsg msg = createMock(ObjectTargetMsg.class);
currentNode.registerObject(object);
expect(msg.getTarget()).andReturn(object);
expect(msg.getCOG()).andReturn(cog);
cog.processMsg(msg);
expectLastCall();
replay(msg);
replay(object);
replay(cog);
currentNode.processMsg(msg);
verify(msg);
verify(object);
verify(cog);
}
@Test
public void processObjectTargetMsgNotOnNode() {
ObjectTargetMsg msg = createMock(ObjectTargetMsg.class);
expect(msg.getTarget()).andReturn(object);
expect(currentRouter.getNextNode(msg)).andReturn(otherNode);
expect(arc.getQueue()).andReturn(queue);
queue.enqueue(msg);
expectLastCall();
replay(msg);
replay(currentRouter);
replay(arc);
replay(queue);
currentNode.processMsg(msg);
verify(msg);
verify(currentRouter);
verify(arc);
verify(queue);
}
@Test
public void processObjectMsgOnNode() {
ObjectMsg msg = createMock(ObjectMsg.class);
currentNode.registerCOG(cog);
expect(msg.getObject()).andReturn(object);
expect(msg.getCOG()).andReturn(cog);
currentRouter.replace(object, currentNode, 0);
expectLastCall();
replay(msg);
replay(object);
replay(currentRouter);
currentNode.processMsg(msg);
assertTrue("object must be at node", currentNode.getRegisteredObjects().contains(object));
verify(msg);
verify(cog);
verify(currentRouter);
}
@Test
public void processObjectMsgNotOnNode() {
ObjectMsg msg = createMock(ObjectMsg.class);
expect(msg.getObject()).andReturn(object);
expect(msg.getCOG()).andReturn(cog);
expect(currentRouter.getNextNode(msg)).andReturn(otherNode);
expect(arc.getQueue()).andReturn(queue);
queue.enqueue(msg);
expectLastCall();
replay(msg);
replay(object);
replay(currentRouter);
replay(arc);
replay(queue);
currentNode.processMsg(msg);
verify(msg);
verify(object);
verify(currentRouter);
verify(arc);
verify(queue);
}
@Test
public void processCOGMsg() {
COGMsg msg = createMock(COGMsg.class);
expect(msg.getCOG()).andReturn(cog);
cog.setNode(currentNode);
expectLastCall();
currentRouter.replace(cog, currentNode, 0);
expectLastCall();
replay(msg);
replay(cog);
replay(currentRouter);
currentNode.processMsg(msg);
assertTrue("cog must be at node", currentNode.getRegisteredCOGs().contains(cog));
verify(msg);
verify(cog);
verify(currentRouter);
}
@Test
public void processTableMsg() {
TableMsg msg = createMock(TableMsg.class);
expect(msg.getRouter()).andReturn(otherRouter);
currentRouter.update(otherNode, otherRouter);
expectLastCall();
replay(msg);
replay(currentRouter);
currentNode.processMsg(msg);
verify(msg);
verify(currentRouter);
}
}