b4241cfe7ee27099863a470094273ae0e09e4172
[groupbasedpolicy.git] / renderers / ofoverlay / src / test / java / org / opendaylight / groupbasedpolicy / renderer / ofoverlay / mapper / external / ExternalMapperTest.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.mapper.external;
10
11         import static org.mockito.Matchers.any;
12         import static org.mockito.Mockito.mock;
13         import static org.mockito.Mockito.times;
14         import static org.mockito.Mockito.verify;
15         import static org.mockito.Mockito.when;
16
17         import org.junit.Assert;
18         import org.junit.Before;
19         import org.junit.Test;
20         import org.junit.runner.RunWith;
21         import org.opendaylight.groupbasedpolicy.dto.IndexedTenant;
22         import org.opendaylight.groupbasedpolicy.dto.PolicyInfo;
23         import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.MockOfContext;
24         import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.MockPolicyManager;
25         import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfContext;
26         import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfWriter;
27         import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.PolicyManager;
28         import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.EndpointManager;
29         import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.MockEndpointManager;
30         import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.mapper.MapperUtilsTest;
31         import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.MockSwitchManager;
32         import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.SwitchManager;
33         import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
34         import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
35         import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
36         import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
37         import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
38         import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
39         import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;
40         import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
41         import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Builder;
42         import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.l3endpoint.rev151217.NatAddress;
43         import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.l3endpoint.rev151217.NatAddressBuilder;
44         import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;
45         import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextBuilder;
46         import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
47         import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantBuilder;
48         import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.ForwardingContextBuilder;
49         import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
50         import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
51         import org.powermock.api.mockito.PowerMockito;
52         import org.powermock.core.classloader.annotations.PrepareForTest;
53         import org.powermock.modules.junit4.PowerMockRunner;
54
55         import com.google.common.collect.ImmutableSet;
56
57         import java.util.Collection;
58         import java.util.HashSet;
59         import java.util.Set;
60
61 @RunWith(PowerMockRunner.class)
62 @PrepareForTest({PolicyManager.class})
63 public class ExternalMapperTest extends MapperUtilsTest {
64
65     private ExternalMapper mapper;
66
67     private short tableId;
68     private Ipv4Address natAddr = new Ipv4Address("192.168.111.52");
69
70
71     @Before
72     public void initialisation() {
73         PowerMockito.stub(PowerMockito.method(PolicyManager.class, "setSfcTableOffset")).toReturn(true);
74
75         endpointManager = mock(EndpointManager.class);
76         policyManager = mock(PolicyManager.class);
77         switchManager = mock(SwitchManager.class);
78         policyInfo = mock(PolicyInfo.class);
79         ctx = mock(OfContext.class);
80         tableId = 6;
81         ofWriter = mock(OfWriter.class);
82         mapper = new ExternalMapper(ctx, tableId);
83     }
84
85     @Test
86     public void constructorTest() {
87         Assert.assertEquals(tableId, mapper.getTableId());
88     }
89
90     @Test
91     public void testSync() throws Exception {
92         //External Ports
93         Set<Long> externalPorts = new HashSet<>();
94         externalPorts.add(Long.valueOf(CONNECTOR_1.getValue()));
95         // Modified tenant
96         TenantBuilder tenantBuilder = buildTenant();
97         tenantBuilder.setForwardingContext(new ForwardingContextBuilder()
98                 .setL2FloodDomain(getL2FloodDomainList(true))
99                 .setL2BridgeDomain(getL2BridgeDomainList())
100                 .setL3Context(getL3ContextList())
101                 .setSubnet(getSubnetList()).build())
102                 .build().getId();
103         Tenant tenant = tenantBuilder.build();
104         // L2 Endpoint
105         EndpointBuilder endpointBuilder = buildEndpoint(IPV4_0, MAC_0, CONNECTOR_0)
106                 .setL2Context(L2BD_ID);
107         // L3 Endpoint with Nat
108         EndpointL3Builder endpointL3Builder = buildL3Endpoint(natAddr, IPV4_1, MAC_0, null)
109                 .setL2Context(L2BD_ID);
110         endpointL3Builder.setTenant(tenant.getId());
111         Collection<EndpointL3> l3EndpointsWithNat = new HashSet<>();
112         l3EndpointsWithNat.add(endpointL3Builder.build());
113
114         when(ctx.getTenant(any(TenantId.class))).thenReturn(new IndexedTenant(tenant));
115         when(ctx.getEndpointManager()).thenReturn(endpointManager);
116         when(ctx.getSwitchManager()).thenReturn(switchManager);
117         when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
118         when(endpointManager.getEndpointNodeId(any(Endpoint.class))).thenReturn(NODE_ID);
119         when(endpointManager.getL3EndpointsWithNat()).thenReturn(l3EndpointsWithNat);
120         when(switchManager.getExternalPortNumbers(any(NodeId.class))).thenReturn(externalPorts);
121
122         mapper.sync(endpointBuilder.build(), ofWriter);
123
124         verify(ofWriter, times(3)).writeFlow(any(NodeId.class), any(Short.class), any(Flow.class));
125     }
126
127     @Test
128     public void testSync_NoExternalPorts() throws Exception {
129         // we still need ExternalMapper flows (default output and default drop) to be generated
130         EndpointBuilder endpointBuilder = buildEndpoint(IPV4_0, MAC_0, CONNECTOR_0);
131
132         when(ctx.getEndpointManager()).thenReturn(endpointManager);
133         when(ctx.getTenant(any(TenantId.class))).thenReturn(getTestIndexedTenant());
134         when(ctx.getCurrentPolicy()).thenReturn(policyInfo);
135         when(ctx.getSwitchManager()).thenReturn(switchManager);
136         when(endpointManager.getEndpointNodeId(any(Endpoint.class))).thenReturn(NODE_ID);
137
138         mapper.sync(endpointBuilder.build(), ofWriter);
139         verify(ofWriter, times(2)).writeFlow(any(NodeId.class), any(Short.class), any(Flow.class));
140     }
141 }