/*
* Copyright (c) 2016 Cisco Systems, Inc. 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.groupbasedpolicy.renderer.ofoverlay.mapper.portsecurity;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Mockito;
import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfContext;
import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfWriter;
import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.PolicyManager;
import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.EndpointManager;
import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.mapper.MapperUtilsTest;
import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.SwitchManager;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeVxlan;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeVxlanGpe;
import java.util.HashSet;
import java.util.Set;
import static org.mockito.Mockito.*;
public class PortSecurityTest extends MapperUtilsTest {
@Before
public void init() {
ctx = mock(OfContext.class);
tableId = 1;
policyManager = mock(PolicyManager.class);
switchManager = mock(SwitchManager.class);
endpointManager = mock(EndpointManager.class);
ofWriter = mock(OfWriter.class);
}
@Test
public void testSyncFlows() throws Exception {
// Node connectors
Set<NodeConnectorId> connectors = new HashSet<>();
connectors.add(new NodeConnectorId(CONNECTOR_0));
// Prepare endpoint
EndpointBuilder endpointBuilder = new EndpointBuilder(buildEndpoint(IPV4_0, MAC_0, CONNECTOR_0)
.build());
endpointBuilder.setTenant(getTestIndexedTenant().getTenant().getId());
Endpoint endpoint = endpointBuilder.build();
when(ctx.getEndpointManager()).thenReturn(endpointManager);
when(ctx.getSwitchManager()).thenReturn(switchManager);
when(ctx.getPolicyManager()).thenReturn(policyManager);
when(ctx.getTenant(Mockito.any(TenantId.class))).thenReturn(getTestIndexedTenant());
when(endpointManager.getEndpointNodeConnectorId(Mockito.any(Endpoint.class)))
.thenReturn(new NodeConnectorId(CONNECTOR_0));
when(switchManager.getTunnelPort(NODE_ID, TunnelTypeVxlan.class)).thenReturn(new NodeConnectorId(CONNECTOR_0));
when(switchManager.getTunnelPort(NODE_ID, TunnelTypeVxlanGpe.class)).thenReturn(new NodeConnectorId(CONNECTOR_1));
when(switchManager.getExternalPorts(Mockito.any(NodeId.class))).thenReturn(connectors);
PortSecurityFlows flows = mock(PortSecurityFlows.class);
PortSecurity portSecurity = new PortSecurity(ctx, tableId);
portSecurity.syncFlows(flows, NODE_ID, endpoint, ofWriter);
// Verify usage
verify(flows, times(4)).dropFlow(Mockito.anyInt(), Mockito.anyLong(), eq(ofWriter));
verify(flows, times(2)).allowFromTunnelFlow(Mockito.anyShort(), Mockito.anyInt(),
Mockito.any(NodeConnectorId.class), eq(ofWriter));
verify(flows, times(2)).allowFromTunnelFlow(Mockito.anyShort(), Mockito.anyInt(),
Mockito.any(NodeConnectorId.class), eq(ofWriter));
verify(flows, times(2)).l3Flow(Mockito.anyShort(), Mockito.any(Endpoint.class), Mockito.any(NodeConnectorId.class),
Mockito.any(MacAddress.class), Mockito.anyInt(), Mockito.anyBoolean(), eq(ofWriter));
verify(flows, times(1)).l3DhcpDoraFlow(Mockito.anyShort(), Mockito.any(NodeConnectorId.class),
Mockito.any(MacAddress.class), Mockito.anyInt(), eq(ofWriter));
verify(flows, times(1)).l2flow(Mockito.anyShort(), Mockito.any(NodeConnectorId.class),
Mockito.any(MacAddress.class), Mockito.anyInt(), eq(ofWriter));
verify(flows, times(1)).popVlanTagsOnExternalPortFlows(Mockito.anyShort(), Mockito.any(NodeConnectorId.class),
eq(getL2FloodDomainList(false)), Mockito.anyInt(), eq(ofWriter));
verify(flows, times(1)).allowFromExternalPortFlow(Mockito.anyShort(), Mockito.any(NodeConnectorId.class),
Mockito.anyInt(), eq(ofWriter));
// Verify order
InOrder order = inOrder(ctx, flows);
order.verify(flows, times(4)).dropFlow(Mockito.anyInt(), Mockito.anyLong(), eq(ofWriter));
order.verify(ctx, times(1)).getPolicyManager();
order.verify(ctx, times(1)).getSwitchManager();
order.verify(flows, times(1)).allowFromTunnelFlow(Mockito.anyShort(), Mockito.anyInt(),
Mockito.any(NodeConnectorId.class), eq(ofWriter));
order.verify(ctx, times(1)).getSwitchManager();
order.verify(flows, times(1)).allowFromTunnelFlow(Mockito.anyShort(), Mockito.anyInt(),
Mockito.any(NodeConnectorId.class), eq(ofWriter));
order.verify(ctx, times(1)).getEndpointManager();
order.verify(flows, times(1)).l3Flow(Mockito.anyShort(), Mockito.any(Endpoint.class), Mockito.any(NodeConnectorId.class),
Mockito.any(MacAddress.class), Mockito.anyInt(), eq(false), eq(ofWriter));
order.verify(flows, times(1)).l3Flow(Mockito.anyShort(), Mockito.any(Endpoint.class), Mockito.any(NodeConnectorId.class),
Mockito.any(MacAddress.class), Mockito.anyInt(), eq(true), eq(ofWriter));
order.verify(flows, times(1)).l3DhcpDoraFlow(Mockito.anyShort(), Mockito.any(NodeConnectorId.class),
Mockito.any(MacAddress.class), Mockito.anyInt(), eq(ofWriter));
order.verify(flows, times(1)).l2flow(Mockito.anyShort(), Mockito.any(NodeConnectorId.class),
Mockito.any(MacAddress.class), Mockito.anyInt(), eq(ofWriter));
order.verify(ctx, times(1)).getPolicyManager();
order.verify(ctx, times(1)).getSwitchManager();
order.verify(ctx, times(2)).getTenant(Mockito.any(TenantId.class));
order.verify(flows, times(1)).popVlanTagsOnExternalPortFlows(Mockito.anyShort(), Mockito.any(NodeConnectorId.class),
eq(getL2FloodDomainList(false)), Mockito.anyInt(), eq(ofWriter));
order.verify(flows, times(1)).allowFromExternalPortFlow(Mockito.anyShort(), Mockito.any(NodeConnectorId.class),
Mockito.anyInt(), eq(ofWriter));
}
}