| 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.FlowBatchId; |
| import net.onrc.onos.api.flowmanager.FlowBatchOperation; |
| import net.onrc.onos.api.flowmanager.FlowBatchState; |
| import net.onrc.onos.api.flowmanager.FlowId; |
| import net.onrc.onos.api.flowmanager.FlowLink; |
| 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; |
| |
| public class SharedFlowBatchMapTest { |
| private ISharedCollectionsService scs; |
| private FlowBatchOperation flowOp; |
| |
| @Before |
| public void setUp() throws Exception { |
| scs = new DummySharedCollectionsService(); |
| |
| Path 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)); |
| PacketMatch match1 = builder.build(); |
| |
| builder = new PacketMatchBuilder(); |
| builder.setDstMac(MACAddress.valueOf(12345)); |
| PacketMatch match2 = builder.build(); |
| |
| List<Action> actions1 = Arrays.asList( |
| new ModifyDstMacAction(MACAddress.valueOf(12345)), |
| new OutputAction(PortNumber.uint16((short) 101))); |
| |
| List<Action> actions2 = Arrays.asList( |
| new ModifyDstMacAction(MACAddress.valueOf(54321)), |
| new OutputAction(PortNumber.uint16((short) 101))); |
| |
| PacketPathFlow flow1 = new PacketPathFlow(new FlowId(1L), match1, |
| PortNumber.uint32(12345), path, actions1, 0, 0); |
| |
| PacketPathFlow flow2 = new PacketPathFlow(new FlowId(2L), match2, |
| PortNumber.uint32(54321), path, actions2, 0, 0); |
| |
| flowOp = new FlowBatchOperation(); |
| flowOp.addAddFlowOperation(flow1); |
| flowOp.addAddFlowOperation(flow2); |
| } |
| |
| /** |
| * Tests if the constructor initializes its field correctly. |
| */ |
| @Test |
| public void testConstructor() { |
| SharedFlowBatchMap map = new SharedFlowBatchMap(scs); |
| Set<FlowBatchOperation> flowOps = map.getAll(); |
| assertNotNull(flowOps); |
| assertTrue(flowOps.isEmpty()); |
| } |
| |
| /** |
| * Tests the basic functionality of the flow batch map. This test puts gets |
| * and removes a batch operation and checks these operations are executed |
| * properly. |
| */ |
| @Test |
| public void testAddGetRemoveFlowOp() { |
| SharedFlowBatchMap map = new SharedFlowBatchMap(scs); |
| final FlowBatchId id = new FlowBatchId(100L); |
| |
| // Check if the stored flow batch operation can be retrieved its ID |
| assertTrue(map.put(id, flowOp)); |
| final FlowBatchOperation obtainedFlowOp = map.get(id); |
| assertNotNull(obtainedFlowOp); |
| assertEquals(2, obtainedFlowOp.size()); |
| |
| // Check if it will not return flow with nonexistent ID |
| FlowBatchId nonexistentId = new FlowBatchId(99999L); |
| assertFalse(nonexistentId.equals(id)); |
| assertNull(map.get(nonexistentId)); |
| |
| // Check if it will remove the operation and it will not return the |
| // operation after the removal |
| final FlowBatchOperation removedFlowOp = map.remove(id); |
| assertNotNull(removedFlowOp); |
| assertEquals(2, removedFlowOp.size()); |
| final FlowBatchOperation nullFlowOp = map.get(id); |
| assertNull(nullFlowOp); |
| } |
| |
| @Test |
| public void testChangeStateOfFlowOp() { |
| SharedFlowBatchMap map = new SharedFlowBatchMap(scs); |
| |
| final FlowBatchId id = new FlowBatchId(100L); |
| |
| // Check if the state of nonexistent flow is not exist |
| assertNull(map.getState(id)); |
| |
| // Check if it won't change the state of nonexistent flow |
| assertFalse(map.setState(id, FlowBatchState.EXECUTING, FlowBatchState.SUBMITTED)); |
| assertNull(map.getState(id)); |
| |
| // Check if the initial state is SUBMITTED |
| assertTrue(map.put(id, flowOp)); |
| assertEquals(FlowBatchState.SUBMITTED, map.getState(id)); |
| |
| // Check if it won't change the state if the expected state was wrong |
| assertFalse(map.setState(id, FlowBatchState.COMPLETED, FlowBatchState.EXECUTING)); |
| assertEquals(FlowBatchState.SUBMITTED, map.getState(id)); |
| |
| // Check if it changes the state if the expected state was correct |
| assertTrue(map.setState(id, FlowBatchState.EXECUTING, FlowBatchState.SUBMITTED)); |
| assertEquals(FlowBatchState.EXECUTING, map.getState(id)); |
| |
| // Check if it won't return the state if the flow was removed |
| assertEquals(flowOp, map.remove(id)); |
| assertNull(map.getState(id)); |
| } |
| } |