BUG-5619 Enable maven parallel build for bgpcep I
[bgpcep.git] / pcep / topology-provider / src / test / java / org / opendaylight / bgpcep / pcep / topology / provider / TopologyProgrammingTest.java
1 /*
2  * Copyright (c) 2014 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 package org.opendaylight.bgpcep.pcep.topology.provider;
9
10 import com.google.common.util.concurrent.ListenableFuture;
11 import java.util.concurrent.ExecutionException;
12 import java.util.concurrent.Executor;
13 import java.util.concurrent.Future;
14 import org.junit.Assert;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.mockito.Mock;
18 import org.mockito.Mockito;
19 import org.mockito.invocation.InvocationOnMock;
20 import org.mockito.stubbing.Answer;
21 import org.opendaylight.bgpcep.pcep.topology.provider.TopologyProgrammingTest.MockedTopologySessionListenerFactory;
22 import org.opendaylight.bgpcep.programming.spi.Instruction;
23 import org.opendaylight.bgpcep.programming.spi.InstructionScheduler;
24 import org.opendaylight.protocol.pcep.PCEPSession;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs1;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs1Builder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.stateful.capability.tlv.StatefulBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.InstructionStatus;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.SubmitInstructionInput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev150720.instruction.status.changed.Details;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitAddLspInputBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitEnsureLspOperationalInputBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitRemoveLspInputBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitTriggerSyncInputBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitUpdateLspInputBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.AddLspArgs;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.AddLspInput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.AddLspOutput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.EnsureLspOperationalInput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.EnsureLspOperationalOutput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.RemoveLspArgs;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.RemoveLspInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.RemoveLspOutput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.TriggerSyncArgs;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.TriggerSyncInput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.TriggerSyncOutput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.UpdateLspArgs;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.UpdateLspInput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.UpdateLspOutput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.ensure.lsp.operational.args.ArgumentsBuilder;
53 import org.opendaylight.yangtools.yang.common.RpcResult;
54
55 public class TopologyProgrammingTest extends AbstractPCEPSessionTest<MockedTopologySessionListenerFactory> {
56
57     private static final String NAME = "test-tunnel";
58     private static Stateful07TopologySessionListener listener;
59
60     @Mock
61     private InstructionScheduler scheduler;
62     @Mock
63     private ListenableFuture<Instruction> instructionFuture;
64     @Mock
65     private Instruction instruction;
66
67     private AddLspArgs addLspArgs;
68     private UpdateLspArgs updateLspArgs;
69     private RemoveLspArgs removeLspArgs;
70     private TriggerSyncArgs triggerSyncArgs;
71     private EnsureLspOperationalInput ensureLspInput;
72
73     @Mock
74     private ListenableFuture<RpcResult<AddLspOutput>> futureAddLspOutput;
75     @Mock
76     private ListenableFuture<RpcResult<UpdateLspOutput>> futureUpdateLspOutput;
77     @Mock
78     private ListenableFuture<RpcResult<RemoveLspOutput>> futureRemoveLspOutput;
79     @Mock
80     private ListenableFuture<RpcResult<TriggerSyncOutput>> futureTriggerSyncOutput;
81     @Mock
82     private ListenableFuture<RpcResult<EnsureLspOperationalOutput>> futureEnsureLspOutput;
83
84     private TopologyProgramming topologyProgramming;
85
86     private PCEPSession session;
87
88     @Override
89     @Before
90     public void setUp() throws Exception {
91         super.setUp();
92         Mockito.doReturn(true).when(this.instruction).checkedExecutionStart();
93         Mockito.doNothing().when(this.instruction).executionCompleted(InstructionStatus.Failed, null);
94         Mockito.doAnswer(new Answer<Void>() {
95             @Override
96             public Void answer(final InvocationOnMock invocation) throws Throwable {
97                 final Runnable callback = (Runnable) invocation.getArguments()[0];
98                 callback.run();
99                 return null;
100             }
101         }).when(this.instructionFuture).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
102         Mockito.doAnswer(new Answer<Void>() {
103             @Override
104             public Void answer(final InvocationOnMock invocation) throws Throwable {
105                 final Runnable callback = (Runnable) invocation.getArguments()[0];
106                 callback.run();
107                 return null;
108             }
109         }).when(this.futureAddLspOutput).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
110         Mockito.doAnswer(new Answer<Void>() {
111             @Override
112             public Void answer(final InvocationOnMock invocation) throws Throwable {
113                 final Runnable callback = (Runnable) invocation.getArguments()[0];
114                 callback.run();
115                 return null;
116             }
117         }).when(this.futureUpdateLspOutput).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
118         Mockito.doAnswer(new Answer<Void>() {
119             @Override
120             public Void answer(final InvocationOnMock invocation) throws Throwable {
121                 final Runnable callback = (Runnable) invocation.getArguments()[0];
122                 callback.run();
123                 return null;
124             }
125         }).when(this.futureRemoveLspOutput).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
126         Mockito.doAnswer(new Answer<Void>() {
127             @Override
128             public Void answer(final InvocationOnMock invocation) throws Throwable {
129                 final Runnable callback = (Runnable) invocation.getArguments()[0];
130                 callback.run();
131                 return null;
132             }
133         }).when(this.futureTriggerSyncOutput).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
134         Mockito.doAnswer(new Answer<Void>() {
135             @Override
136             public Void answer(final InvocationOnMock invocation) throws Throwable {
137                 final Runnable callback = (Runnable) invocation.getArguments()[0];
138                 callback.run();
139                 return null;
140             }
141         }).when(this.futureEnsureLspOutput).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
142         Mockito.doAnswer(new Answer<Future<RpcResult<AddLspOutput>>>() {
143             @Override
144             public Future<RpcResult<AddLspOutput>> answer(final InvocationOnMock invocation) throws Throwable {
145                 TopologyProgrammingTest.this.addLspArgs = (AddLspArgs) invocation.getArguments()[0];
146                 return TopologyProgrammingTest.this.futureAddLspOutput;
147             }
148         }).when(listener).addLsp(Mockito.any(AddLspInput.class));
149         Mockito.doAnswer(new Answer<Future<RpcResult<UpdateLspOutput>>>() {
150             @Override
151             public Future<RpcResult<UpdateLspOutput>> answer(final InvocationOnMock invocation) throws Throwable {
152                 TopologyProgrammingTest.this.updateLspArgs = (UpdateLspArgs) invocation.getArguments()[0];
153                 return TopologyProgrammingTest.this.futureUpdateLspOutput;
154             }
155         }).when(listener).updateLsp(Mockito.any(UpdateLspInput.class));
156         Mockito.doAnswer(new Answer<Future<RpcResult<RemoveLspOutput>>>() {
157             @Override
158             public Future<RpcResult<RemoveLspOutput>> answer(final InvocationOnMock invocation) throws Throwable {
159                 TopologyProgrammingTest.this.removeLspArgs = (RemoveLspArgs) invocation.getArguments()[0];
160                 return TopologyProgrammingTest.this.futureRemoveLspOutput;
161             }
162         }).when(listener).removeLsp(Mockito.any(RemoveLspInput.class));
163         Mockito.doAnswer(new Answer<Future<RpcResult<TriggerSyncOutput>>>() {
164             @Override
165             public Future<RpcResult<TriggerSyncOutput>> answer(final InvocationOnMock invocation) throws Throwable {
166                 TopologyProgrammingTest.this.triggerSyncArgs = (TriggerSyncArgs) invocation.getArguments()[0];
167                 return TopologyProgrammingTest.this.futureTriggerSyncOutput;
168             }
169         }).when(listener).triggerSync(Mockito.any(TriggerSyncInput.class));
170         Mockito.doAnswer(new Answer<Future<RpcResult<EnsureLspOperationalOutput>>>() {
171             @Override
172             public Future<RpcResult<EnsureLspOperationalOutput>> answer(final InvocationOnMock invocation) throws Throwable {
173                 TopologyProgrammingTest.this.ensureLspInput = (EnsureLspOperationalInput) invocation.getArguments()[0];
174                 return TopologyProgrammingTest.this.futureEnsureLspOutput;
175             }
176         }).when(listener).ensureLspOperational(Mockito.any(EnsureLspOperationalInput.class));
177         Mockito.doNothing().when(listener).close();
178         Mockito.doReturn(instruction).when(this.instructionFuture).get();
179         Mockito.doNothing().when(this.instruction).executionCompleted(Mockito.any(InstructionStatus.class), Mockito.any(Details.class));
180         Mockito.doReturn(this.instructionFuture).when(this.scheduler).scheduleInstruction(Mockito.any(SubmitInstructionInput.class));
181         this.topologyProgramming = new TopologyProgramming(this.scheduler, this.manager);
182         this.session = getPCEPSession(getLocalPref(), getRemotePref());
183         listener.onSessionUp(this.session);
184     }
185
186     @Test
187     public void testSubmitAddLsp() throws InterruptedException, ExecutionException {
188         final SubmitAddLspInputBuilder inputBuilder = new SubmitAddLspInputBuilder();
189         inputBuilder.setName(NAME);
190         inputBuilder.setNode(nodeId);
191         inputBuilder.setArguments(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.add.lsp.args.ArgumentsBuilder().build());
192         this.topologyProgramming.submitAddLsp(inputBuilder.build());
193         Assert.assertNotNull(this.addLspArgs);
194         Assert.assertEquals(NAME, this.addLspArgs.getName());
195         Assert.assertEquals(nodeId, this.addLspArgs.getNode());
196     }
197
198     @Test
199     public void testSubmitUpdateLsp() {
200         final SubmitUpdateLspInputBuilder inputBuilder = new SubmitUpdateLspInputBuilder();
201         inputBuilder.setName(NAME);
202         inputBuilder.setNode(nodeId);
203         this.topologyProgramming.submitUpdateLsp(inputBuilder.build());
204         Assert.assertNotNull(this.updateLspArgs);
205         Assert.assertEquals(NAME, this.updateLspArgs.getName());
206         Assert.assertEquals(nodeId, this.updateLspArgs.getNode());
207     }
208
209     @Test
210     public void testSubmitEnsureLsp() {
211         final SubmitEnsureLspOperationalInputBuilder inputBuilder = new SubmitEnsureLspOperationalInputBuilder();
212         inputBuilder.setName(NAME);
213         inputBuilder.setNode(nodeId);
214         inputBuilder.setArguments(new ArgumentsBuilder().build());
215         this.topologyProgramming.submitEnsureLspOperational(inputBuilder.build());
216         Assert.assertNotNull(this.ensureLspInput);
217         Assert.assertEquals(NAME, this.ensureLspInput.getName());
218         Assert.assertEquals(nodeId, this.ensureLspInput.getNode());
219     }
220
221     @Test
222     public void testSubmitRemoveLsp() {
223         final SubmitRemoveLspInputBuilder inputBuilder = new SubmitRemoveLspInputBuilder();
224         inputBuilder.setName(NAME);
225         inputBuilder.setNode(nodeId);
226         this.topologyProgramming.submitRemoveLsp(inputBuilder.build());
227         Assert.assertNotNull(this.removeLspArgs);
228         Assert.assertEquals(NAME, this.removeLspArgs.getName());
229         Assert.assertEquals(nodeId, this.removeLspArgs.getNode());
230     }
231
232     @Test
233     public void testSubmitTriggerSync() {
234         final SubmitTriggerSyncInputBuilder inputBuilder = new SubmitTriggerSyncInputBuilder();
235         inputBuilder.setName(NAME);
236         inputBuilder.setNode(nodeId);
237         this.topologyProgramming.submitTriggerSync(inputBuilder.build());
238         Assert.assertNotNull(this.triggerSyncArgs);
239         Assert.assertEquals(NAME, this.triggerSyncArgs.getName());
240         Assert.assertEquals(nodeId, this.triggerSyncArgs.getNode());
241     }
242
243     protected static final class MockedTopologySessionListenerFactory implements TopologySessionListenerFactory {
244         @Override
245         public TopologySessionListener createTopologySessionListener(final ServerSessionManager manager) {
246             listener = Mockito.spy(new Stateful07TopologySessionListener(manager));
247             return listener;
248         }
249     }
250
251     @Override
252     protected Open getLocalPref() {
253         return new OpenBuilder(super.getLocalPref()).setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder().addAugmentation(Tlvs1.class, new Tlvs1Builder().setStateful(new StatefulBuilder().build()).build()).build()).build();
254     }
255 }