blob: a874ea4d1060f8d75bb09b87e6695f12a8e42584 [file] [log] [blame]
package net.onrc.onos.core.newintent;
import net.onrc.onos.api.flowmanager.FakeFlowManagerService;
import net.onrc.onos.api.flowmanager.FlowId;
import net.onrc.onos.api.flowmanager.FlowLink;
import net.onrc.onos.api.flowmanager.FlowManagerService;
import net.onrc.onos.api.flowmanager.SingleSrcTreeFlow;
import net.onrc.onos.api.flowmanager.Tree;
import net.onrc.onos.api.newintent.IntentId;
import net.onrc.onos.core.matchaction.action.OutputAction;
import net.onrc.onos.core.matchaction.match.PacketMatchBuilder;
import net.onrc.onos.core.util.Dpid;
import net.onrc.onos.core.util.SwitchPort;
import org.apache.commons.lang3.tuple.Pair;
import org.junit.Test;
import java.util.HashSet;
import java.util.Set;
import static net.onrc.onos.api.flowmanager.FlowState.COMPILED;
import static net.onrc.onos.api.flowmanager.FlowState.INSTALLED;
import static net.onrc.onos.api.flowmanager.FlowState.SUBMITTED;
import static net.onrc.onos.api.flowmanager.FlowState.WITHDRAWING;
/**
* Suites of test of {@link SingleSrcTreeFlowIntentInstaller}.
*/
public class SingleSrcTreeFlowIntentInstallerTest {
private final FlowId flowId = new FlowId(1);
private final SwitchPort port12 = new SwitchPort(1, (short) 1);
private final SwitchPort port13 = new SwitchPort(1, (short) 3);
private final SwitchPort port21 = new SwitchPort(2, (short) 2);
private final SwitchPort port31 = new SwitchPort(3, (short) 3);
private final SwitchPort ingress1 = new SwitchPort(1, (short) 3);
private final SwitchPort egress1 = new SwitchPort(2, (short) 100);
private final SwitchPort egress2 = new SwitchPort(3, (short) 101);
/**
* Tests intent installation that the state is changed
* to SUBMITTED, COMPILED, then INSTALLED.
*/
@Test
public void testNormalStateTransition() {
FlowManagerService flowManager =
new FakeFlowManagerService(flowId, false, SUBMITTED, COMPILED, INSTALLED);
SingleSrcTreeFlowIntentInstaller sut =
new SingleSrcTreeFlowIntentInstaller(flowManager);
SingleSrcTreeFlow flow = createFlow();
SingleSrcTreeFlowIntent intent = new SingleSrcTreeFlowIntent(new IntentId(1), flow);
sut.install(intent);
}
/**
* Tests intent installation that addFlow() returns null.
*/
@Test(expected = IntentInstallationException.class)
public void testInstallationFails() {
FlowManagerService flowManager =
new FakeFlowManagerService(flowId, true, SUBMITTED);
SingleSrcTreeFlowIntentInstaller sut =
new SingleSrcTreeFlowIntentInstaller(flowManager);
SingleSrcTreeFlow flow = createFlow();
SingleSrcTreeFlowIntent intent = new SingleSrcTreeFlowIntent(new IntentId(1), flow);
sut.install(intent);
}
/**
* Tests intent removal that removeFlow() returns null.
*/
@Test(expected = IntentRemovalException.class)
public void testRemovalFails() {
FlowManagerService flowManager =
new FakeFlowManagerService(flowId, true, WITHDRAWING);
SingleSrcTreeFlowIntentInstaller sut =
new SingleSrcTreeFlowIntentInstaller(flowManager);
SingleSrcTreeFlow flow = createFlow();
SingleSrcTreeFlowIntent intent = new SingleSrcTreeFlowIntent(new IntentId(1), flow);
sut.remove(intent);
}
private SingleSrcTreeFlow createFlow() {
Tree tree = new Tree();
tree.add(new FlowLink(port12, port21));
tree.add(new FlowLink(port13, port31));
Set<Pair<Dpid, OutputAction>> actions = new HashSet<>();
actions.add(Pair.of(egress1.getDpid(), new OutputAction(egress1.getPortNumber())));
actions.add(Pair.of(egress2.getDpid(), new OutputAction(egress2.getPortNumber())));
return new SingleSrcTreeFlow(
flowId,
new PacketMatchBuilder().build(),
ingress1,
tree,
actions
);
}
}