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