blob: a910969de670a002f1b5a0fed009d76a9f3f552e [file] [log] [blame]
package net.onrc.onos.core.flowmanager;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import net.floodlightcontroller.util.MACAddress;
import net.onrc.onos.api.flowmanager.Flow;
import net.onrc.onos.api.flowmanager.FlowId;
import net.onrc.onos.api.flowmanager.FlowLink;
import net.onrc.onos.api.flowmanager.FlowState;
import net.onrc.onos.api.flowmanager.PacketPathFlow;
import net.onrc.onos.api.flowmanager.Path;
import net.onrc.onos.core.datagrid.ISharedCollectionsService;
import net.onrc.onos.core.datastore.hazelcast.DummySharedCollectionsService;
import net.onrc.onos.core.matchaction.action.Action;
import net.onrc.onos.core.matchaction.action.ModifyDstMacAction;
import net.onrc.onos.core.matchaction.action.OutputAction;
import net.onrc.onos.core.matchaction.match.PacketMatch;
import net.onrc.onos.core.matchaction.match.PacketMatchBuilder;
import net.onrc.onos.core.util.PortNumber;
import net.onrc.onos.core.util.SwitchPort;
import org.junit.Before;
import org.junit.Test;
/**
* Unit test for {@link SharedFlowMap}.
*/
public class SharedFlowMapTest {
private ISharedCollectionsService scs;
private Path path;
private PacketMatch match;
private List<Action> actions;
private Flow flow;
@Before
public void setUp() throws Exception {
scs = new DummySharedCollectionsService();
path = new Path();
path.add(new FlowLink(
new SwitchPort(1, (short) 10), new SwitchPort(2, (short) 11)));
PacketMatchBuilder builder = new PacketMatchBuilder();
builder.setDstMac(MACAddress.valueOf(54321));
match = builder.build();
actions = Arrays.asList(
new ModifyDstMacAction(MACAddress.valueOf(12345)),
new OutputAction(PortNumber.uint16((short) 101)));
flow = new PacketPathFlow(new FlowId(1L), match, PortNumber.uint32(12345), path,
actions, 0, 0);
}
/**
* Tests if the constructor initializes its field correctly.
*/
@Test
public void testConstructor() {
SharedFlowMap map = new SharedFlowMap(scs);
Set<Flow> flows = map.getAll();
assertNotNull(flows);
assertTrue(flows.isEmpty());
}
/**
* Tests the basic functionality of the flow map. This test puts, gets and
* removes a flow and checks these operations are executed properly.
*/
@Test
public void testAddGetRemoveFlow() {
SharedFlowMap map = new SharedFlowMap(scs);
// Check if the stored flow can be retrieved its ID
assertTrue(map.put(flow));
final Flow obtainedFlow = map.get(flow.getId());
assertNotNull(obtainedFlow);
assertEquals(flow.getId(), obtainedFlow.getId());
assertEquals(match, obtainedFlow.getMatch());
// Check if it will not return flow with nonexistent ID
FlowId nonexistentId = new FlowId(99999L);
assertFalse(nonexistentId.equals(flow.getId()));
assertNull(map.get(nonexistentId));
// Check if it will remove the flow and it will not return the flow
// after the removal
final Flow removedFlow = map.remove(flow.getId());
assertNotNull(removedFlow);
assertEquals(flow.getId(), removedFlow.getId());
final Flow nullFlow = map.get(flow.getId());
assertNull(nullFlow);
}
/**
* Tests the basic functionality of the flow state on the map. This test put
* the flow and changes state of it.
*/
@Test
public void testStateChangeOfFlow() {
SharedFlowMap map = new SharedFlowMap(scs);
// Check if the state of nonexistent flow is not exist
assertNull(map.getState(flow.getId()));
// Check if it won't change the state of nonexistent flow
assertFalse(map.setState(flow.getId(), FlowState.COMPILED, FlowState.SUBMITTED));
assertNull(map.getState(flow.getId()));
// Check if the initial state is SUBMITTED
assertTrue(map.put(flow));
assertEquals(FlowState.SUBMITTED, map.getState(flow.getId()));
// Check if it won't change the state if the expected state was wrong
assertFalse(map.setState(flow.getId(), FlowState.INSTALLED, FlowState.COMPILED));
assertEquals(FlowState.SUBMITTED, map.getState(flow.getId()));
// Check if it changes the state if the expected state was correct
assertTrue(map.setState(flow.getId(), FlowState.COMPILED, FlowState.SUBMITTED));
assertEquals(FlowState.COMPILED, map.getState(flow.getId()));
// Check if it won't return the state if the flow was removed
assertEquals(flow, map.remove(flow.getId()));
assertNull(map.getState(flow.getId()));
}
}