41fc394613a6cddb98fcc07ffc97095d9f273631
[ovsdb.git] / openstack / net-virt-providers / src / test / java / org / opendaylight / ovsdb / openstack / netvirt / providers / openflow13 / services / L2FowardingServiceTest.java
1 /*
2  * Copyright (c) 2015 Inocybe 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.ovsdb.openstack.netvirt.providers.openflow13.services;
10
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Matchers.anyBoolean;
13 import static org.mockito.Mockito.mock;
14 import static org.mockito.Mockito.times;
15 import static org.mockito.Mockito.verify;
16 import static org.mockito.Mockito.when;
17
18 import org.junit.Before;
19 import org.junit.Ignore;
20 import org.junit.Test;
21 import org.junit.runner.RunWith;
22 import org.mockito.InjectMocks;
23 import org.mockito.Mock;
24 import org.mockito.runners.MockitoJUnitRunner;
25 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
26 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
27 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
28 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
29 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
30 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
31 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.MdsalConsumer;
32 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.PipelineOrchestrator;
33 import org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13.Service;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
36 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
37
38 import com.google.common.base.Optional;
39 import com.google.common.util.concurrent.CheckedFuture;
40
41 /**
42  * Unit test fort {@link L2ForwardingService}
43  */
44 @Ignore // TODO SB_MIGRATION
45 @RunWith(MockitoJUnitRunner.class)
46 public class L2FowardingServiceTest {
47
48     @InjectMocks private L2ForwardingService l2ForwardingService = new L2ForwardingService(Service.ARP_RESPONDER);
49
50     @Mock private MdsalConsumer mdsalConsumer;
51     @Mock private PipelineOrchestrator orchestrator;
52
53     @Mock private ReadWriteTransaction readWriteTransaction;
54     @Mock private WriteTransaction writeTransaction;
55     @Mock private ReadOnlyTransaction readOnlyTransaction;
56     @Mock private CheckedFuture<Void, TransactionCommitFailedException> commitFuture;
57
58     private static final String SEGMENTATION_ID = "2";
59     private static final String MAC_ADDRESS = "87:1D:5E:02:40:B8";
60     private static final Long DPID = Long.valueOf(122);
61     private static final Long LOCAL_PORT = Long.valueOf(451);
62     private static final Long ETH_PORT = Long.valueOf(564);
63     private static final Long OF_PORT_OUT = Long.valueOf(5698);
64
65     @Before
66     public void setUp() throws Exception {
67         when(readWriteTransaction.submit()).thenReturn(commitFuture);
68         when(writeTransaction.submit()).thenReturn(commitFuture);
69
70         DataBroker dataBroker = mock(DataBroker.class);
71         when(dataBroker.newReadWriteTransaction()).thenReturn(readWriteTransaction);
72         when(dataBroker.newWriteOnlyTransaction()).thenReturn(writeTransaction);
73         when(dataBroker.newReadOnlyTransaction()).thenReturn(readOnlyTransaction);
74
75         CheckedFuture future = mock(CheckedFuture.class);
76         when(readOnlyTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(future);
77
78         Optional<Flow> data = mock(Optional.class);
79         when(future.get()).thenReturn(data);
80
81         when(mdsalConsumer.getDataBroker()).thenReturn(dataBroker);
82
83         when(orchestrator.getNextServiceInPipeline(any(Service.class))).thenReturn(Service.ARP_RESPONDER);
84     }
85
86     /**
87      * Test method {@link L2ForwardingService#programLocalUcastOut(Long, String, Long, String, boolean)}
88      */
89     @Test
90     public void testProgramLoacalUcastOut() throws Exception {
91         l2ForwardingService.programLocalUcastOut(DPID, SEGMENTATION_ID, LOCAL_PORT, MAC_ADDRESS, true);
92         verify(readWriteTransaction, times(2)).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(Node.class), anyBoolean());
93         verify(readWriteTransaction, times(1)).submit();
94         verify(commitFuture, times(1)).get();
95
96         l2ForwardingService.programLocalUcastOut(DPID, SEGMENTATION_ID, LOCAL_PORT, MAC_ADDRESS, false);
97         verify(writeTransaction, times(1)).delete(any(LogicalDatastoreType.class), any(InstanceIdentifier.class));
98         verify(readWriteTransaction, times(1)).submit();
99         verify(commitFuture, times(2)).get(); // 1 + 1 above
100     }
101
102     /**
103      * Test method {@link L2ForwardingService#programLocalVlanUcastOut(Long, String, Long, String, boolean)}
104      */
105     @Test
106     public void testProgramLocalVlanUcastOut() throws Exception {
107         l2ForwardingService.programLocalVlanUcastOut(DPID, SEGMENTATION_ID, Long.valueOf(124), MAC_ADDRESS, true);
108         verify(readWriteTransaction, times(2)).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(Node.class), anyBoolean());
109         verify(readWriteTransaction, times(1)).submit();
110         verify(commitFuture, times(1)).get();
111
112         l2ForwardingService.programLocalVlanUcastOut(DPID, SEGMENTATION_ID, LOCAL_PORT, MAC_ADDRESS, false);
113         verify(writeTransaction, times(1)).delete(any(LogicalDatastoreType.class), any(InstanceIdentifier.class));
114         verify(readWriteTransaction, times(1)).submit();
115         verify(commitFuture, times(2)).get(); // 1 + 1 above
116     }
117
118     /**
119      * Test method {@link L2ForwardingService#programLocalBcastOut(Long, String, Long, boolean)}
120      */
121     @Test
122     public void testProgramLocalBcastOut() throws Exception {
123         l2ForwardingService.programLocalBcastOut(DPID, SEGMENTATION_ID, LOCAL_PORT, true);
124         verify(readWriteTransaction, times(2)).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(Node.class), anyBoolean());
125         verify(readWriteTransaction, times(1)).submit();
126         verify(commitFuture, times(1)).get();
127
128         l2ForwardingService.programLocalBcastOut(DPID, SEGMENTATION_ID, LOCAL_PORT, false);
129         verify(writeTransaction, times(1)).delete(any(LogicalDatastoreType.class), any(InstanceIdentifier.class));
130         verify(readWriteTransaction, times(1)).submit();
131         verify(commitFuture, times(2)).get(); // 1 + 1 above
132     }
133
134     /**--------------------------------- TODO go deeper in test
135      * Test method {@link L2ForwardingService#programLocalVlanBcastOut(Long, String, Long, Long, boolean)}
136      */
137     @Test
138     public void testProgramLocalVlanBcastOut() throws Exception {
139         l2ForwardingService.programLocalVlanBcastOut(DPID, SEGMENTATION_ID, LOCAL_PORT, ETH_PORT, true);
140         verify(readWriteTransaction, times(2)).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(Node.class), anyBoolean());
141         verify(readWriteTransaction, times(1)).submit();
142         verify(commitFuture, times(1)).get();
143
144         l2ForwardingService.programLocalVlanBcastOut(DPID, SEGMENTATION_ID, LOCAL_PORT, ETH_PORT, false);
145         verify(writeTransaction, times(1)).delete(any(LogicalDatastoreType.class), any(InstanceIdentifier.class));
146         verify(readWriteTransaction, times(1)).submit();
147         verify(commitFuture, times(2)).get(); // 1 + 1 above
148     }
149
150     /**
151      * Test method {@link L2ForwardingService#programLocalTableMiss(Long, String, boolean)}
152      */
153     @Test
154     public void testProgramLocalTableMiss() throws Exception {
155         l2ForwardingService.programLocalTableMiss(DPID, SEGMENTATION_ID, true);
156         verify(readWriteTransaction, times(2)).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(Node.class), anyBoolean());
157         verify(readWriteTransaction, times(1)).submit();
158         verify(commitFuture, times(1)).get();
159
160         l2ForwardingService.programLocalTableMiss(DPID, SEGMENTATION_ID, false);
161         verify(writeTransaction, times(1)).delete(any(LogicalDatastoreType.class), any(InstanceIdentifier.class));
162         verify(readWriteTransaction, times(1)).submit();
163         verify(commitFuture, times(2)).get(); // 1 + 1 above
164     }
165
166     /**
167      * Test method {@link L2ForwardingService#programLocalVlanTableMiss(Long, String, boolean)}
168      */
169     @Test
170     public void testProgramLocalVlanTableMiss() throws Exception {
171         l2ForwardingService.programLocalVlanTableMiss(DPID, SEGMENTATION_ID, true);
172         verify(readWriteTransaction, times(2)).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(Node.class), anyBoolean());
173         verify(readWriteTransaction, times(1)).submit();
174         verify(commitFuture, times(1)).get();
175
176         l2ForwardingService.programLocalVlanTableMiss(DPID, SEGMENTATION_ID, false);
177         verify(writeTransaction, times(1)).delete(any(LogicalDatastoreType.class), any(InstanceIdentifier.class));
178         verify(readWriteTransaction, times(1)).submit();
179         verify(commitFuture, times(2)).get(); // 1 + 1 above
180     }
181
182     /**
183      * Test method {@link L2ForwardingService#programTunnelOut(Long, String, Long, String, boolean)}
184      */
185     @Test
186     public void testProgramTunnelOut() throws Exception {
187         l2ForwardingService.programTunnelOut(DPID, SEGMENTATION_ID, OF_PORT_OUT, MAC_ADDRESS, true);
188         verify(readWriteTransaction, times(2)).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(Node.class), anyBoolean());
189         verify(readWriteTransaction, times(1)).submit();
190         verify(commitFuture, times(1)).get();
191
192         l2ForwardingService.programTunnelOut(DPID, SEGMENTATION_ID, OF_PORT_OUT, MAC_ADDRESS, false);
193         verify(writeTransaction, times(1)).delete(any(LogicalDatastoreType.class), any(InstanceIdentifier.class));
194         verify(readWriteTransaction, times(1)).submit();
195         verify(commitFuture, times(2)).get(); // 1 + 1 above
196     }
197
198     /**
199      * Test method {@link L2ForwardingService#programVlanOut(Long, String, Long, String, boolean)}
200      */
201     @Test
202     public void testProgramVlanOut() throws Exception {
203         l2ForwardingService.programVlanOut(DPID, SEGMENTATION_ID, ETH_PORT, MAC_ADDRESS, true);
204         verify(readWriteTransaction, times(2)).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(Node.class), anyBoolean());
205         verify(readWriteTransaction, times(1)).submit();
206         verify(commitFuture, times(1)).get();
207
208         l2ForwardingService.programVlanOut(DPID, SEGMENTATION_ID, ETH_PORT, MAC_ADDRESS, false);
209         verify(writeTransaction, times(1)).delete(any(LogicalDatastoreType.class), any(InstanceIdentifier.class));
210         verify(readWriteTransaction, times(1)).submit();
211         verify(commitFuture, times(2)).get(); // 1 + 1 above
212     }
213
214     /**--------------------------------- TODO go deeper in test
215      * Test method {@link L2ForwardingService#programTunnelFloodOut(Long, String, Long, boolean)}
216      */
217     @Test
218     public void testProgramTunnelFloodOut() throws Exception {
219         l2ForwardingService.programTunnelFloodOut(DPID, SEGMENTATION_ID, OF_PORT_OUT, true);
220         verify(readWriteTransaction, times(2)).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(Node.class), anyBoolean());
221         verify(readWriteTransaction, times(1)).submit();
222         verify(commitFuture, times(1)).get();
223
224         l2ForwardingService.programTunnelFloodOut(DPID, SEGMENTATION_ID, OF_PORT_OUT, false);
225         verify(writeTransaction, times(1)).delete(any(LogicalDatastoreType.class), any(InstanceIdentifier.class));
226         verify(readWriteTransaction, times(1)).submit();
227         verify(commitFuture, times(2)).get(); // 1 + 1 above
228     }
229
230     /**
231      * Test method {@link L2ForwardingService#programVlanFloodOut(Long, String, Long, boolean)}
232      */
233     @Test
234     public void testProgramVlanFloodOut() throws Exception {
235         l2ForwardingService.programVlanFloodOut(DPID, SEGMENTATION_ID, ETH_PORT, true);
236         verify(readWriteTransaction, times(2)).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(Node.class), anyBoolean());
237         verify(readWriteTransaction, times(1)).submit();
238         verify(commitFuture, times(1)).get();
239
240         l2ForwardingService.programVlanFloodOut(DPID, SEGMENTATION_ID, ETH_PORT, false);
241         verify(writeTransaction, times(1)).delete(any(LogicalDatastoreType.class), any(InstanceIdentifier.class));
242         verify(readWriteTransaction, times(1)).submit();
243         verify(commitFuture, times(2)).get(); // 1 + 1 above
244     }
245
246     /**
247     * Test method {@link L2ForwardingService#programTunnelMiss(Long, String, boolean)}
248     */
249    @Test
250    public void testProgramTunnelMiss() throws Exception {
251        l2ForwardingService.programTunnelMiss(DPID, SEGMENTATION_ID, true);
252        verify(readWriteTransaction, times(2)).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(Node.class), anyBoolean());
253        verify(readWriteTransaction, times(1)).submit();
254        verify(commitFuture, times(1)).get();
255
256        l2ForwardingService.programTunnelMiss(DPID, SEGMENTATION_ID, false);
257        verify(writeTransaction, times(1)).delete(any(LogicalDatastoreType.class), any(InstanceIdentifier.class));
258        verify(readWriteTransaction, times(1)).submit();
259        verify(commitFuture, times(2)).get(); // 1 + 1 above
260    }
261
262    /**
263     * Test method {@link L2ForwardingService#programVlanMiss(Long, String, Long, boolean)}
264     */
265    @Test
266    public void testProgramVlanMiss() throws Exception {
267        l2ForwardingService.programTunnelMiss(DPID, SEGMENTATION_ID, true);
268        verify(readWriteTransaction, times(2)).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(Node.class), anyBoolean());
269        verify(readWriteTransaction, times(1)).submit();
270        verify(commitFuture, times(1)).get();
271
272        l2ForwardingService.programTunnelMiss(DPID, SEGMENTATION_ID, false);
273        verify(writeTransaction, times(1)).delete(any(LogicalDatastoreType.class), any(InstanceIdentifier.class));
274        verify(readWriteTransaction, times(1)).submit();
275        verify(commitFuture, times(2)).get(); // 1 + 1 above
276    }
277 }