2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.bgpcep.pcep.topology.provider;
11 import com.google.common.util.concurrent.ListenableFuture;
12 import java.util.concurrent.ExecutionException;
13 import java.util.concurrent.Executor;
14 import java.util.concurrent.Future;
15 import org.junit.Assert;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.mockito.Mock;
19 import org.mockito.Mockito;
20 import org.mockito.MockitoAnnotations;
21 import org.mockito.invocation.InvocationOnMock;
22 import org.mockito.stubbing.Answer;
23 import org.opendaylight.bgpcep.pcep.topology.provider.TopologyProgrammingTest.MockedTopologySessionListenerFactory;
24 import org.opendaylight.bgpcep.programming.spi.Instruction;
25 import org.opendaylight.bgpcep.programming.spi.InstructionScheduler;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.Tlvs2;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.Tlvs2Builder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.stateful.capability.tlv.StatefulBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev130930.InstructionStatus;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev130930.SubmitInstructionInput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.programming.rev130930.instruction.status.changed.Details;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitAddLspInputBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitEnsureLspOperationalInputBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.programming.rev131106.SubmitRemoveLspInputBuilder;
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.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;
52 public class TopologyProgrammingTest extends AbstractPCEPSessionTest<MockedTopologySessionListenerFactory> {
54 private static final String NAME = "test-tunnel";
55 private static Stateful02TopologySessionListener listener;
58 private InstructionScheduler scheduler;
60 private ListenableFuture<Instruction> instructionFuture;
62 private Instruction instruction;
64 private AddLspArgs addLspArgs;
65 private UpdateLspArgs updateLspArgs;
66 private RemoveLspArgs removeLspArgs;
67 private EnsureLspOperationalInput ensureLspInput;
70 private ListenableFuture<RpcResult<AddLspOutput>> futureAddLspOutput;
72 private ListenableFuture<RpcResult<UpdateLspOutput>> futureUpdateLspOutput;
74 private ListenableFuture<RpcResult<RemoveLspOutput>> futureRemoveLspOutput;
76 private ListenableFuture<RpcResult<EnsureLspOperationalOutput>> futureEnsureLspOutput;
78 private TopologyProgramming topologyProgramming;
81 public void setUp() throws Exception {
83 MockitoAnnotations.initMocks(this);
84 Mockito.doReturn(true).when(this.instruction).checkedExecutionStart();
85 Mockito.doNothing().when(this.instruction).executionCompleted(InstructionStatus.Failed, null);
86 Mockito.doAnswer(new Answer<Void>() {
88 public Void answer(InvocationOnMock invocation) throws Throwable {
89 final Runnable callback = (Runnable) invocation.getArguments()[0];
93 }).when(this.instructionFuture).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
94 Mockito.doAnswer(new Answer<Void>() {
96 public Void answer(InvocationOnMock invocation) throws Throwable {
97 final Runnable callback = (Runnable) invocation.getArguments()[0];
101 }).when(this.futureAddLspOutput).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
102 Mockito.doAnswer(new Answer<Void>() {
104 public Void answer(InvocationOnMock invocation) throws Throwable {
105 final Runnable callback = (Runnable) invocation.getArguments()[0];
109 }).when(this.futureUpdateLspOutput).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
110 Mockito.doAnswer(new Answer<Void>() {
112 public Void answer(InvocationOnMock invocation) throws Throwable {
113 final Runnable callback = (Runnable) invocation.getArguments()[0];
117 }).when(this.futureRemoveLspOutput).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
118 Mockito.doAnswer(new Answer<Void>() {
120 public Void answer(InvocationOnMock invocation) throws Throwable {
121 final Runnable callback = (Runnable) invocation.getArguments()[0];
125 }).when(this.futureEnsureLspOutput).addListener(Mockito.any(Runnable.class), Mockito.any(Executor.class));
126 Mockito.doAnswer(new Answer<Future<RpcResult<AddLspOutput>>>() {
128 public Future<RpcResult<AddLspOutput>> answer(InvocationOnMock invocation) throws Throwable {
129 TopologyProgrammingTest.this.addLspArgs = (AddLspArgs) invocation.getArguments()[0];
130 return TopologyProgrammingTest.this.futureAddLspOutput;
132 }).when(listener).addLsp(Mockito.any(AddLspInput.class));
133 Mockito.doAnswer(new Answer<Future<RpcResult<UpdateLspOutput>>>() {
135 public Future<RpcResult<UpdateLspOutput>> answer(InvocationOnMock invocation) throws Throwable {
136 TopologyProgrammingTest.this.updateLspArgs = (UpdateLspArgs) invocation.getArguments()[0];
137 return TopologyProgrammingTest.this.futureUpdateLspOutput;
139 }).when(listener).updateLsp(Mockito.any(UpdateLspInput.class));
140 Mockito.doAnswer(new Answer<Future<RpcResult<RemoveLspOutput>>>() {
142 public Future<RpcResult<RemoveLspOutput>> answer(InvocationOnMock invocation) throws Throwable {
143 TopologyProgrammingTest.this.removeLspArgs = (RemoveLspArgs) invocation.getArguments()[0];
144 return TopologyProgrammingTest.this.futureRemoveLspOutput;
146 }).when(listener).removeLsp(Mockito.any(RemoveLspInput.class));
147 Mockito.doAnswer(new Answer<Future<RpcResult<EnsureLspOperationalOutput>>>() {
149 public Future<RpcResult<EnsureLspOperationalOutput>> answer(InvocationOnMock invocation) throws Throwable {
150 TopologyProgrammingTest.this.ensureLspInput = (EnsureLspOperationalInput) invocation.getArguments()[0];
151 return TopologyProgrammingTest.this.futureEnsureLspOutput;
153 }).when(listener).ensureLspOperational(Mockito.any(EnsureLspOperationalInput.class));
154 Mockito.doNothing().when(listener).close();
155 Mockito.doReturn(instruction).when(this.instructionFuture).get();
156 Mockito.doNothing().when(this.instruction).executionCompleted(Mockito.any(InstructionStatus.class), Mockito.any(Details.class));
157 Mockito.doReturn(this.instructionFuture).when(this.scheduler).scheduleInstruction(Mockito.any(SubmitInstructionInput.class));
158 this.topologyProgramming = new TopologyProgramming(this.scheduler, this.manager);
159 listener.onSessionUp(this.session);
163 public void testSubmitAddLsp() throws InterruptedException, ExecutionException {
164 final SubmitAddLspInputBuilder inputBuilder = new SubmitAddLspInputBuilder();
165 inputBuilder.setName(NAME);
166 inputBuilder.setNode(NODE_ID);
167 inputBuilder.setArguments(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.add.lsp.args.ArgumentsBuilder().build());
168 this.topologyProgramming.submitAddLsp(inputBuilder.build());
169 Assert.assertNotNull(this.addLspArgs);
170 Assert.assertEquals(NAME, this.addLspArgs.getName());
171 Assert.assertEquals(NODE_ID, this.addLspArgs.getNode());
175 public void testSubmitUpdateLsp() {
176 final SubmitUpdateLspInputBuilder inputBuilder = new SubmitUpdateLspInputBuilder();
177 inputBuilder.setName(NAME);
178 inputBuilder.setNode(NODE_ID);
179 this.topologyProgramming.submitUpdateLsp(inputBuilder.build());
180 Assert.assertNotNull(this.updateLspArgs);
181 Assert.assertEquals(NAME, this.updateLspArgs.getName());
182 Assert.assertEquals(NODE_ID, this.updateLspArgs.getNode());
186 public void testSubmitEnsureLsp() {
187 final SubmitEnsureLspOperationalInputBuilder inputBuilder = new SubmitEnsureLspOperationalInputBuilder();
188 inputBuilder.setName(NAME);
189 inputBuilder.setNode(NODE_ID);
190 inputBuilder.setArguments(new ArgumentsBuilder().build());
191 this.topologyProgramming.submitEnsureLspOperational(inputBuilder.build());
192 Assert.assertNotNull(this.ensureLspInput);
193 Assert.assertEquals(NAME, this.ensureLspInput.getName());
194 Assert.assertEquals(NODE_ID, this.ensureLspInput.getNode());
198 public void testSubmitRemoveLsp() {
199 final SubmitRemoveLspInputBuilder inputBuilder = new SubmitRemoveLspInputBuilder();
200 inputBuilder.setName(NAME);
201 inputBuilder.setNode(NODE_ID);
202 this.topologyProgramming.submitRemoveLsp(inputBuilder.build());
203 Assert.assertNotNull(this.removeLspArgs);
204 Assert.assertEquals(NAME, this.removeLspArgs.getName());
205 Assert.assertEquals(NODE_ID, this.removeLspArgs.getNode());
208 protected static final class MockedTopologySessionListenerFactory implements TopologySessionListenerFactory {
210 public TopologySessionListener createTopologySessionListener(ServerSessionManager manager) {
211 listener = Mockito.spy(new Stateful02TopologySessionListener(manager));
217 protected Open getLocalPref() {
218 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(Tlvs2.class, new Tlvs2Builder().setStateful(new StatefulBuilder().build()).build()).build()).build();