2 * Copyright (c) 2013 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
8 package org.opendaylight.protocol.pcep.impl;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
13 import io.netty.util.concurrent.DefaultPromise;
14 import io.netty.util.concurrent.GlobalEventExecutor;
15 import org.junit.After;
16 import org.junit.Before;
17 import org.junit.Ignore;
18 import org.junit.Test;
19 import org.opendaylight.controller.config.yang.pcep.impl.Tls;
20 import org.opendaylight.protocol.pcep.impl.spi.Util;
21 import org.opendaylight.protocol.pcep.spi.PCEPErrors;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Keepalive;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Open;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Pcerr;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Starttls;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenMessage;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.Errors;
29 import org.opendaylight.yangtools.yang.binding.Notification;
31 public class FiniteStateMachineTest extends AbstractPCEPSessionTest {
33 private DefaultPCEPSessionNegotiator serverSession;
34 private DefaultPCEPSessionNegotiator tlsSessionNegotiator;
38 final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open localPrefs = new OpenBuilder().setKeepalive(
40 this.serverSession = new DefaultPCEPSessionNegotiator(new DefaultPromise<PCEPSessionImpl>(GlobalEventExecutor.INSTANCE),
41 this.channel, this.listener, (short) 1, 20, localPrefs);
42 this.tlsSessionNegotiator = new DefaultPCEPSessionNegotiator(new DefaultPromise<PCEPSessionImpl>(GlobalEventExecutor.INSTANCE),
43 this.channel, this.listener, (short) 1, 20, localPrefs, new Tls());
47 * Both PCEs accept session characteristics. Also tests KeepAliveTimer and error message and when pce attempts to
48 * establish pce session for the 2nd time.
53 public void testSessionCharsAccBoth() throws Exception {
54 this.serverSession.channelActive(null);
55 assertEquals(1, this.msgsSend.size());
56 assertTrue(this.msgsSend.get(0) instanceof Open);
57 this.serverSession.handleMessage(this.openMsg);
58 assertEquals(2, this.msgsSend.size());
59 assertTrue(this.msgsSend.get(1) instanceof Keepalive);
60 this.serverSession.handleMessage(this.kaMsg);
61 assertEquals(this.serverSession.getState(), DefaultPCEPSessionNegotiator.State.FINISHED);
65 * Establish PCEPS TLS connection with peer
68 public void testEstablishTLS() {
69 final DefaultPCEPSessionNegotiator negotiator = new DefaultPCEPSessionNegotiator(new DefaultPromise<PCEPSessionImpl>(GlobalEventExecutor.INSTANCE),
70 this.channel, this.listener, (short) 1, 20, new OpenBuilder().setKeepalive((short) 1).build(),
71 SslContextFactoryTest.createTlsConfig());
72 negotiator.channelActive(null);
73 assertEquals(1, this.msgsSend.size());
74 assertTrue(this.msgsSend.get(0) instanceof Starttls);
75 assertEquals(DefaultPCEPSessionNegotiator.State.START_TLS_WAIT, negotiator.getState());
76 negotiator.handleMessage(this.startTlsMsg);
77 assertEquals(DefaultPCEPSessionNegotiator.State.OPEN_WAIT, negotiator.getState());
78 assertEquals(2, this.msgsSend.size());
79 assertTrue(this.msgsSend.get(1) instanceof Open);
80 negotiator.handleMessage(this.openMsg);
81 assertEquals(DefaultPCEPSessionNegotiator.State.KEEP_WAIT, negotiator.getState());
85 * As Tls is not configured properly, PCE will send error PCEPErrors.NOT_POSSIBLE_WITHOUT_TLS
90 public void testFailedToEstablishTLS() throws Exception {
91 this.tlsSessionNegotiator.channelActive(null);
92 assertEquals(1, this.msgsSend.size());
93 assertTrue(this.msgsSend.get(0) instanceof Starttls);
94 assertEquals(DefaultPCEPSessionNegotiator.State.START_TLS_WAIT, this.tlsSessionNegotiator.getState());
95 this.tlsSessionNegotiator.handleMessage(this.startTlsMsg);
96 assertEquals(2, this.msgsSend.size());
97 assertTrue(this.msgsSend.get(1) instanceof Pcerr);
98 final Errors obj = ((Pcerr) this.msgsSend.get(1)).getPcerrMessage().getErrors().get(0);
99 assertEquals(PCEPErrors.NOT_POSSIBLE_WITHOUT_TLS.getErrorType(), obj.getErrorObject().getType().shortValue());
100 assertEquals(PCEPErrors.NOT_POSSIBLE_WITHOUT_TLS.getErrorValue(), obj.getErrorObject().getValue().shortValue());
101 assertEquals(DefaultPCEPSessionNegotiator.State.FINISHED, this.tlsSessionNegotiator.getState());
105 * As PCE does not receive expected message (StartTLS), error PCEPErrors.NON_STARTTLS_MSG_RCVD is send
110 public void testTLSUnexpectedMessage() {
111 this.tlsSessionNegotiator.channelActive(null);
112 assertEquals(1, this.msgsSend.size());
113 assertTrue(this.msgsSend.get(0) instanceof Starttls);
114 assertEquals(DefaultPCEPSessionNegotiator.State.START_TLS_WAIT, this.tlsSessionNegotiator.getState());
115 this.tlsSessionNegotiator.handleMessage(this.openMsg);
116 assertEquals(2, this.msgsSend.size());
117 assertTrue(this.msgsSend.get(1) instanceof Pcerr);
118 final Errors obj = ((Pcerr) this.msgsSend.get(1)).getPcerrMessage().getErrors().get(0);
119 assertEquals(PCEPErrors.NON_STARTTLS_MSG_RCVD.getErrorType(), obj.getErrorObject().getType().shortValue());
120 assertEquals(PCEPErrors.NON_STARTTLS_MSG_RCVD.getErrorValue(), obj.getErrorObject().getValue().shortValue());
121 assertEquals(this.tlsSessionNegotiator.getState(), DefaultPCEPSessionNegotiator.State.FINISHED);
125 * Mock PCE does not accept session characteristics the first time.
130 public void testSessionCharsAccMe() throws Exception {
131 this.serverSession.channelActive(null);
132 assertEquals(1, this.msgsSend.size());
133 assertTrue(this.msgsSend.get(0) instanceof Open);
134 final Open remote = (Open) this.msgsSend.get(0);
135 this.serverSession.handleMessage(this.openMsg);
136 assertEquals(2, this.msgsSend.size());
137 assertTrue(this.msgsSend.get(1) instanceof Keepalive);
138 this.serverSession.handleMessage(Util.createErrorMessage(PCEPErrors.NON_ACC_NEG_SESSION_CHAR, remote.getOpenMessage().getOpen()));
139 assertEquals(3, this.msgsSend.size());
140 assertTrue(this.msgsSend.get(2) instanceof Open);
141 this.serverSession.handleMessage(this.kaMsg);
142 assertEquals(this.serverSession.getState(), DefaultPCEPSessionNegotiator.State.FINISHED);
146 * Sending different PCEP Message than Open in session establishment phase.
151 public void testErrorOneOne() throws Exception {
152 this.serverSession.channelActive(null);
153 assertEquals(1, this.msgsSend.size());
154 assertTrue(this.msgsSend.get(0) instanceof Open);
155 this.serverSession.handleMessage(this.kaMsg);
156 for (final Notification m : this.msgsSend) {
157 if (m instanceof Pcerr) {
158 final Errors obj = ((Pcerr) m).getPcerrMessage().getErrors().get(0);
159 assertEquals(new Short((short) 1), obj.getErrorObject().getType());
160 assertEquals(new Short((short) 1), obj.getErrorObject().getValue());
166 * KeepWaitTimer expired.
171 public void testErrorOneSeven() throws Exception {
172 this.serverSession.channelActive(null);
173 assertEquals(1, this.msgsSend.size());
174 assertTrue(this.msgsSend.get(0) instanceof Open);
175 this.serverSession.handleMessage(this.openMsg);
177 for (final Notification m : this.msgsSend) {
178 if (m instanceof Pcerr) {
179 final Errors obj = ((Pcerr) m).getPcerrMessage().getErrors().get(0);
180 assertEquals(new Short((short) 1), obj.getErrorObject().getType());
181 assertEquals(new Short((short) 7), obj.getErrorObject().getValue());
186 /************* Tests commented because of their long duration (tested timers) **************/
189 * OpenWait timer expired.
191 * @throws InterruptedException
195 public void testErrorOneTwo() throws InterruptedException {
196 this.serverSession.channelActive(null);
197 assertEquals(1, this.msgsSend.size());
198 assertTrue(this.msgsSend.get(0) instanceof OpenMessage);
199 Thread.sleep(60 * 1000);
200 for (final Notification m : this.msgsSend) {
201 if (m instanceof Pcerr) {
202 final Errors obj = ((Pcerr) m).getPcerrMessage().getErrors().get(0);
203 assertEquals(new Short((short) 1), obj.getErrorObject().getType());
204 assertEquals(new Short((short) 2), obj.getErrorObject().getValue());
211 public void testUnknownMessage() throws InterruptedException {
212 final SimpleSessionListener client = new SimpleSessionListener();
213 final PCEPSessionImpl s = new PCEPSessionImpl(client, 5, this.channel, this.openMsg.getOpenMessage().getOpen(), this.openMsg.getOpenMessage().getOpen());
214 s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
215 assertEquals(1, s.getUnknownMessagesTimes().size());
217 s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
218 assertEquals(2, s.getUnknownMessagesTimes().size());
220 s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
221 assertEquals(3, s.getUnknownMessagesTimes().size());
223 s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
224 assertEquals(4, s.getUnknownMessagesTimes().size());
226 s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
227 assertEquals(3, s.getUnknownMessagesTimes().size());
229 s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
230 assertEquals(3, s.getUnknownMessagesTimes().size());
232 s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
233 assertEquals(4, s.getUnknownMessagesTimes().size());
235 s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
236 assertEquals(5, s.getUnknownMessagesTimes().size());
238 s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
239 synchronized (client) {
244 assertTrue(!client.up);
248 public void tearDown() {