/*
* Copyright (c) 2015 Inocybe Technologies and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.nic.of.renderer.impl;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyShort;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.nic.of.renderer.utils.MatchUtils;
import org.opendaylight.nic.pipeline_manager.PipelineManager;
import org.opendaylight.nic.utils.FlowAction;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.intent.rev150122.intent.actions.action.Allow;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.api.support.membermodification.MemberMatcher;
import org.powermock.api.support.membermodification.MemberModifier;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@PrepareForTest({MatchUtils.class, MplsIntentFlowManager.class})
@RunWith(PowerMockRunner.class)
public class MplsIntentFlowManagerTest {
private static final String MPLS_INTENT_EXPECTED_STRING = "MPLS_Rule_";
private static final String EPG_SRC = "Site Src";
private static final String EPG_DST = "Site Dst";
private static final String MPLS_LABEL_KEY = "mpls_label";
private static final String IP_PREFIX_KEY = "ip_prefix";
private static final String SWITCH_PORT_KEY = "switch_port";
private List<String> endPointGroups = null;
private Map<String, Map<String, String>> subjectsMapping = null;
@Mock private Allow action;
private MplsIntentFlowManager mplsIntentFlowManager;
@SuppressWarnings("unchecked")
@Before
public void setUp() throws Exception {
mplsIntentFlowManager = mock(MplsIntentFlowManager.class, Mockito.CALLS_REAL_METHODS);
endPointGroups = new ArrayList<>();
endPointGroups.add(EPG_SRC);
endPointGroups.add(EPG_DST);
subjectsMapping = new HashMap<>();
Map<String, String> srcMapping = new HashMap<>();
srcMapping.put(MPLS_LABEL_KEY, "15");
srcMapping.put(IP_PREFIX_KEY, "10.0.0.1/32");
srcMapping.put(SWITCH_PORT_KEY, "openflow:1:2");
subjectsMapping.put(EPG_SRC, srcMapping);
Map<String, String> dstMapping = new HashMap<>();
dstMapping.put(MPLS_LABEL_KEY, "1");
dstMapping.put(IP_PREFIX_KEY, "10.0.0.2/32");
dstMapping.put(SWITCH_PORT_KEY, "openflow:2:2");
subjectsMapping.put(EPG_DST, dstMapping);
MemberModifier.field(MplsIntentFlowManager.class, "endPointGroups").set(mplsIntentFlowManager, endPointGroups);
MemberModifier.field(MplsIntentFlowManager.class, "subjectsMapping").set(mplsIntentFlowManager, subjectsMapping);
MemberModifier.field(MplsIntentFlowManager.class, "action").set(mplsIntentFlowManager, action);
PowerMockito.whenNew(MatchBuilder.class).withNoArguments().thenReturn(mock(MatchBuilder.class));
FlowBuilder flowBldr = mock(FlowBuilder.class);
PowerMockito.whenNew(FlowBuilder.class).withNoArguments().thenReturn(flowBldr);
PowerMockito.whenNew(Ipv4Prefix.class).withAnyArguments().thenReturn(mock(Ipv4Prefix.class));
PowerMockito.mockStatic(MatchUtils.class);
PowerMockito.doReturn(null).when(MatchUtils.class, "createIPv4PrefixMatch", any(Ipv4Prefix.class), any(Ipv4Prefix.class), any(MatchBuilder.class));
Instructions buildedInstructions = mock(Instructions.class);
MemberModifier.suppress(MemberMatcher.method(MplsIntentFlowManager.class, "createMPLSIntentInstructions", List.class, boolean.class, Short.class, String.class, boolean.class));
PowerMockito.when(mplsIntentFlowManager.createMPLSIntentInstructions(any(List.class), anyBoolean(), anyShort(), anyString(), anyBoolean())).thenReturn(buildedInstructions);
when(flowBldr.setInstructions(any(Instructions.class))).thenReturn(flowBldr);
MemberModifier.suppress(MemberMatcher.method(MplsIntentFlowManager.class, "writeDataTransaction", NodeId.class, FlowBuilder.class, FlowAction.class));
when(mplsIntentFlowManager.writeDataTransaction(any(NodeId.class), any(FlowBuilder.class), any(FlowAction.class))).thenReturn(true);
}
@Test
public void testPushMplsFlow() {
mplsIntentFlowManager.pushMplsFlow(mock(NodeId.class), FlowAction.ADD_FLOW, "openflow:1:2");
verify(mplsIntentFlowManager).writeDataTransaction(any(NodeId.class), any(FlowBuilder.class), any(FlowAction.class));
}
@Test
public void testPopMplsFlow() {
//FIXME
//NodeId mockNode = new NodeId("openflow:1");
//MatchBuilder mockMatchBuilder = mock(MatchBuilder.class);
//when(MatchUtils.createMplsLabelBosMatch(5L, false)).thenReturn(mockMatchBuilder);
//mplsIntentFlowManager.popMplsFlow(mockNode, FlowAction.ADD_FLOW, "openflow:1:1");
//verify(mplsIntentFlowManager).writeDataTransaction(any(NodeId.class), any(FlowBuilder.class), any(FlowAction.class));
}
@Test
public void testForwardMplsFlow() throws Exception {
//FIXME
//NodeId mockNode = new NodeId("openflow:1");
//mplsIntentFlowManager.forwardMplsFlow(mockNode, FlowAction.ADD_FLOW, "openflow:1:2");
//verify(mplsIntentFlowManager).writeDataTransaction(any(NodeId.class), any(FlowBuilder.class), any(FlowAction.class));
}
@Test
public void testCreateFlowName() {
MplsIntentFlowManager mplsIntentFlowManager = new MplsIntentFlowManager(mock(DataBroker.class), mock(PipelineManager.class));
mplsIntentFlowManager.setEndPointGroups(endPointGroups);
String flowName = mplsIntentFlowManager.createFlowName();
assertTrue(flowName.contains(MPLS_INTENT_EXPECTED_STRING));
}
}