import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import io.netty.util.concurrent.DefaultPromise;
+import io.netty.util.concurrent.GlobalEventExecutor;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
-import org.opendaylight.protocol.pcep.PCEPErrors;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.KeepaliveMessage;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
+import org.opendaylight.controller.config.yang.pcep.impl.Tls;
+import org.opendaylight.protocol.pcep.spi.PCEPErrors;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Keepalive;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Open;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Pcerr;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Starttls;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.OpenMessage;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.keepalive.message.KeepaliveMessageBuilder;
-
-public class FiniteStateMachineTest {
-
- private ServerSessionMock serverSession;
-
- private final SimpleSessionListener serverListener = new SimpleSessionListener();
-
- private MockPCE client;
-
- @Before
- public void setUp() {
- this.client = new MockPCE();
- this.serverSession = new ServerSessionMock(this.serverListener, this.client);
- this.client.addSession(this.serverSession);
- }
-
- /**
- * Both PCEs accept session characteristics. Also tests KeepAliveTimer and error message and when pce attempts to
- * establish pce session for the 2nd time.
- *
- * @throws InterruptedException
- */
- @Test
- @Ignore
- public void testSessionCharsAccBoth() throws InterruptedException {
- // this.serverSession.startSession();
- assertEquals(1, this.client.getListMsg().size());
- assertTrue(this.client.getListMsg().get(0) instanceof OpenMessage);
- // this.client.sendMessage(new PCEPOpenMessage(new PCEPOpenObject(3, 9, 2)));
- assertEquals(2, this.client.getListMsg().size());
- assertTrue(this.client.getListMsg().get(1) instanceof KeepaliveMessage);
- this.client.sendMessage((Message) new KeepaliveMessageBuilder().build());
- synchronized (this.serverListener) {
- while (!this.serverListener.up) {
- try {
- this.serverListener.wait();
- } catch (final InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- assertTrue(this.serverListener.up);
- // Thread.sleep(PCEPSessionImpl.KEEP_ALIVE_TIMER_VALUE * 1000);
- // assertEquals(3, this.client.getListMsg().size());
- // assertTrue(this.client.getListMsg().get(2) instanceof PCEPKeepAliveMessage); // test of keepalive timer
- // this.client.sendMessage(new PCEPOpenMessage(new PCEPOpenObject(1, 1, 1)));
- // assertEquals(3, this.client.getListMsg().size());
- // assertTrue(this.client.getListMsg().get(2) instanceof PCEPErrorMessage);
- // for (final Message m : this.client.getListMsg()) {
- // if (m instanceof PCEPErrorMessage) {
- // final PCEPErrorObject obj = ((PCEPErrorMessage) m).getErrorObjects().get(0);
- // assertEquals(PCEPErrors.ATTEMPT_2ND_SESSION, obj.getError()); // test of error type 9
- // }
- // }
- }
-
- /**
- * Mock PCE does not accept session characteristics the first time.
- *
- * @throws InterruptedException
- */
- @Test
- @Ignore
- public void testSessionCharsAccMe() throws InterruptedException {
- // this.serverSession.startSession();
- // this.client.sendMessage(new PCEPOpenMessage(new PCEPOpenObject(4, 9, 2)));
- assertEquals(2, this.client.getListMsg().size());
- assertTrue(this.client.getListMsg().get(0) instanceof OpenMessage);
- assertTrue(this.client.getListMsg().get(1) instanceof KeepaliveMessage);
- // this.client.sendErrorMessage(PCEPErrors.NON_ACC_NEG_SESSION_CHAR, new PCEPOpenObject(3, 7, 2, null));
- assertEquals(3, this.client.getListMsg().size());
- assertTrue(this.client.getListMsg().get(2) instanceof OpenMessage);
- this.client.sendMessage((Message) new KeepaliveMessageBuilder().build());
- synchronized (this.serverListener) {
- while (!this.serverListener.up) {
- try {
- this.serverListener.wait();
- } catch (final InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- assertTrue(this.serverListener.up);
- }
-
- /**
- * Sending different PCEP Message than Open in session establishment phase.
- *
- * @throws InterruptedException
- */
- @Test
- @Ignore
- public void testErrorOneOne() throws InterruptedException {
- // this.serverSession.startSession();
- assertEquals(1, this.client.getListMsg().size());
- // assertTrue(this.client.getListMsg().get(0) instanceof OpenMessage);
- // this.client.sendMessage(new PCEPNotificationMessage(new ArrayList<CompositeNotifyObject>() {
- // private static final long serialVersionUID = 1L;
- //
- // {
- // this.add(new CompositeNotifyObject(new ArrayList<PCEPNotificationObject>() {
- // private static final long serialVersionUID = 1L;
- //
- // {
- // this.add(new PCEPNotificationObject((short) 1, (short) 1));
- // }
- // }));
- // }
- // }));
- // for (final Message m : this.client.getListMsg()) {
- // if (m instanceof PCEPErrorMessage) {
- // final PCEPErrorObject obj = ((PCEPErrorMessage) m).getErrorObjects().get(0);
- // assertEquals(PCEPErrors.NON_OR_INVALID_OPEN_MSG, obj.getError());
- // }
- // }
- }
-
- /************* Tests commented because of their long duration (tested timers) **************/
-
- /**
- * OpenWait timer expired.
- *
- * @throws InterruptedException
- */
- @Test
- @Ignore
- public void testErrorOneTwo() throws InterruptedException {
- // this.serverSession.startSession();
- assertEquals(1, this.client.getListMsg().size());
- assertTrue(this.client.getListMsg().get(0) instanceof OpenMessage);
- // Thread.sleep(60 * 1000);
- // for (final Message m : this.client.getListMsg()) {
- // if (m instanceof PcerrMessage) {
- // final PCEPErrorObject obj = ((PCEPErrorMessage) m).getErrorObjects().get(0);
- // assertEquals(PCEPErrors.NO_OPEN_BEFORE_EXP_OPENWAIT, obj.getError());
- // }
- // }
- }
-
- /**
- * KeepWaitTimer expired.
- *
- * @throws InterruptedException
- */
- @Test
- @Ignore
- public void testErrorOneSeven() throws InterruptedException {
- // // this.serverSession.startSession();
- // assertEquals(1, this.client.getListMsg().size());
- // assertTrue(this.client.getListMsg().get(0) instanceof OpenMessage);
- // this.client.sendMessage(new PCEPOpenMessage(new OpenObject(3, 9, 2)));
- // Thread.sleep(this.serverSession.getKeepAliveTimerValue() * 1000);
- // for (final Message m : this.client.getListMsg()) {
- // if (m instanceof PcerrMessage) {
- // final PCEPErrorObject obj = ((PCEPErrorMessage) m).getErrorObjects().get(0);
- // assertEquals(PCEPErrors.NO_MSG_BEFORE_EXP_KEEPWAIT, obj.getError());
- // }
- // }
- }
-
- @Test
- @Ignore
- public void testUnknownMessage() throws InterruptedException {
- this.serverSession.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
- assertEquals(1, this.serverSession.unknownMessagesTimes.size());
- Thread.sleep(10000);
- this.serverSession.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
- assertEquals(2, this.serverSession.unknownMessagesTimes.size());
- Thread.sleep(10000);
- this.serverSession.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
- assertEquals(3, this.serverSession.unknownMessagesTimes.size());
- Thread.sleep(20000);
- this.serverSession.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
- assertEquals(4, this.serverSession.unknownMessagesTimes.size());
- Thread.sleep(30000);
- this.serverSession.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
- assertEquals(3, this.serverSession.unknownMessagesTimes.size());
- Thread.sleep(10000);
- this.serverSession.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
- assertEquals(3, this.serverSession.unknownMessagesTimes.size());
- Thread.sleep(5000);
- this.serverSession.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
- assertEquals(4, this.serverSession.unknownMessagesTimes.size());
- Thread.sleep(1000);
- this.serverSession.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
- assertEquals(5, this.serverSession.unknownMessagesTimes.size());
- Thread.sleep(1000);
- this.serverSession.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
- synchronized (this.client) {
- while (!this.client.down) {
- try {
- this.client.wait();
- } catch (final InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- assertTrue(this.client.down);
- }
-
- @After
- public void tearDown() {
- this.serverSession.close();
- }
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.Errors;
+import org.opendaylight.yangtools.yang.binding.Notification;
+
+public class FiniteStateMachineTest extends AbstractPCEPSessionTest {
+
+ private DefaultPCEPSessionNegotiator serverSession;
+ private DefaultPCEPSessionNegotiator tlsSessionNegotiator;
+
+ @Before
+ public void setup() {
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open localPrefs = new OpenBuilder().setKeepalive(
+ (short) 1).build();
+ this.serverSession = new DefaultPCEPSessionNegotiator(new DefaultPromise<PCEPSessionImpl>(GlobalEventExecutor.INSTANCE),
+ this.channel, this.listener, (short) 1, 20, localPrefs);
+ this.tlsSessionNegotiator = new DefaultPCEPSessionNegotiator(new DefaultPromise<PCEPSessionImpl>(GlobalEventExecutor.INSTANCE),
+ this.channel, this.listener, (short) 1, 20, localPrefs, new Tls());
+ }
+
+ /**
+ * Both PCEs accept session characteristics. Also tests KeepAliveTimer and error message and when pce attempts to
+ * establish pce session for the 2nd time.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testSessionCharsAccBoth() throws Exception {
+ this.serverSession.channelActive(null);
+ assertEquals(1, this.msgsSend.size());
+ assertTrue(this.msgsSend.get(0) instanceof Open);
+ this.serverSession.handleMessage(this.openMsg);
+ assertEquals(2, this.msgsSend.size());
+ assertTrue(this.msgsSend.get(1) instanceof Keepalive);
+ this.serverSession.handleMessage(this.kaMsg);
+ assertEquals(this.serverSession.getState(), DefaultPCEPSessionNegotiator.State.FINISHED);
+ }
+
+ /**
+ * Establish PCEPS TLS connection with peer
+ */
+ @Test
+ public void testEstablishTLS() {
+ final DefaultPCEPSessionNegotiator negotiator = new DefaultPCEPSessionNegotiator(new DefaultPromise<PCEPSessionImpl>(GlobalEventExecutor.INSTANCE),
+ this.channel, this.listener, (short) 1, 20, new OpenBuilder().setKeepalive((short) 1).build(),
+ SslContextFactoryTest.createTlsConfig());
+ negotiator.channelActive(null);
+ assertEquals(1, this.msgsSend.size());
+ assertTrue(this.msgsSend.get(0) instanceof Starttls);
+ assertEquals(DefaultPCEPSessionNegotiator.State.START_TLS_WAIT, negotiator.getState());
+ negotiator.handleMessage(this.startTlsMsg);
+ assertEquals(DefaultPCEPSessionNegotiator.State.OPEN_WAIT, negotiator.getState());
+ assertEquals(2, this.msgsSend.size());
+ assertTrue(this.msgsSend.get(1) instanceof Open);
+ negotiator.handleMessage(this.openMsg);
+ assertEquals(DefaultPCEPSessionNegotiator.State.KEEP_WAIT, negotiator.getState());
+ }
+
+ /**
+ * As Tls is not configured properly, PCE will send error PCEPErrors.NOT_POSSIBLE_WITHOUT_TLS
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testFailedToEstablishTLS() throws Exception {
+ this.tlsSessionNegotiator.channelActive(null);
+ assertEquals(1, this.msgsSend.size());
+ assertTrue(this.msgsSend.get(0) instanceof Starttls);
+ assertEquals(DefaultPCEPSessionNegotiator.State.START_TLS_WAIT, this.tlsSessionNegotiator.getState());
+ this.tlsSessionNegotiator.handleMessage(this.startTlsMsg);
+ assertEquals(2, this.msgsSend.size());
+ assertTrue(this.msgsSend.get(1) instanceof Pcerr);
+ final Errors obj = ((Pcerr) this.msgsSend.get(1)).getPcerrMessage().getErrors().get(0);
+ assertEquals(PCEPErrors.NOT_POSSIBLE_WITHOUT_TLS.getErrorType(), obj.getErrorObject().getType().shortValue());
+ assertEquals(PCEPErrors.NOT_POSSIBLE_WITHOUT_TLS.getErrorValue(), obj.getErrorObject().getValue().shortValue());
+ assertEquals(DefaultPCEPSessionNegotiator.State.FINISHED, this.tlsSessionNegotiator.getState());
+ }
+
+ /**
+ * As PCE does not receive expected message (StartTLS), error PCEPErrors.NON_STARTTLS_MSG_RCVD is send
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testTLSUnexpectedMessage() {
+ this.tlsSessionNegotiator.channelActive(null);
+ assertEquals(1, this.msgsSend.size());
+ assertTrue(this.msgsSend.get(0) instanceof Starttls);
+ assertEquals(DefaultPCEPSessionNegotiator.State.START_TLS_WAIT, this.tlsSessionNegotiator.getState());
+ this.tlsSessionNegotiator.handleMessage(this.openMsg);
+ assertEquals(2, this.msgsSend.size());
+ assertTrue(this.msgsSend.get(1) instanceof Pcerr);
+ final Errors obj = ((Pcerr) this.msgsSend.get(1)).getPcerrMessage().getErrors().get(0);
+ assertEquals(PCEPErrors.NON_STARTTLS_MSG_RCVD.getErrorType(), obj.getErrorObject().getType().shortValue());
+ assertEquals(PCEPErrors.NON_STARTTLS_MSG_RCVD.getErrorValue(), obj.getErrorObject().getValue().shortValue());
+ assertEquals(this.tlsSessionNegotiator.getState(), DefaultPCEPSessionNegotiator.State.FINISHED);
+ }
+
+ /**
+ * Mock PCE does not accept session characteristics the first time.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testSessionCharsAccMe() throws Exception {
+ this.serverSession.channelActive(null);
+ assertEquals(1, this.msgsSend.size());
+ assertTrue(this.msgsSend.get(0) instanceof Open);
+ final Open remote = (Open) this.msgsSend.get(0);
+ this.serverSession.handleMessage(this.openMsg);
+ assertEquals(2, this.msgsSend.size());
+ assertTrue(this.msgsSend.get(1) instanceof Keepalive);
+ this.serverSession.handleMessage(Util.createErrorMessage(PCEPErrors.NON_ACC_NEG_SESSION_CHAR, remote.getOpenMessage().getOpen()));
+ assertEquals(3, this.msgsSend.size());
+ assertTrue(this.msgsSend.get(2) instanceof Open);
+ this.serverSession.handleMessage(this.kaMsg);
+ assertEquals(this.serverSession.getState(), DefaultPCEPSessionNegotiator.State.FINISHED);
+ }
+
+ /**
+ * Sending different PCEP Message than Open in session establishment phase.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testErrorOneOne() throws Exception {
+ this.serverSession.channelActive(null);
+ assertEquals(1, this.msgsSend.size());
+ assertTrue(this.msgsSend.get(0) instanceof Open);
+ this.serverSession.handleMessage(this.kaMsg);
+ for (final Notification m : this.msgsSend) {
+ if (m instanceof Pcerr) {
+ final Errors obj = ((Pcerr) m).getPcerrMessage().getErrors().get(0);
+ assertEquals(new Short((short) 1), obj.getErrorObject().getType());
+ assertEquals(new Short((short) 1), obj.getErrorObject().getValue());
+ }
+ }
+ }
+
+ /**
+ * KeepWaitTimer expired.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testErrorOneSeven() throws Exception {
+ this.serverSession.channelActive(null);
+ assertEquals(1, this.msgsSend.size());
+ assertTrue(this.msgsSend.get(0) instanceof Open);
+ this.serverSession.handleMessage(this.openMsg);
+ Thread.sleep(1000);
+ for (final Notification m : this.msgsSend) {
+ if (m instanceof Pcerr) {
+ final Errors obj = ((Pcerr) m).getPcerrMessage().getErrors().get(0);
+ assertEquals(new Short((short) 1), obj.getErrorObject().getType());
+ assertEquals(new Short((short) 7), obj.getErrorObject().getValue());
+ }
+ }
+ }
+
+ /************* Tests commented because of their long duration (tested timers) **************/
+
+ /**
+ * OpenWait timer expired.
+ *
+ * @throws InterruptedException
+ */
+ @Test
+ @Ignore
+ public void testErrorOneTwo() throws InterruptedException {
+ this.serverSession.channelActive(null);
+ assertEquals(1, this.msgsSend.size());
+ assertTrue(this.msgsSend.get(0) instanceof OpenMessage);
+ Thread.sleep(60 * 1000);
+ for (final Notification m : this.msgsSend) {
+ if (m instanceof Pcerr) {
+ final Errors obj = ((Pcerr) m).getPcerrMessage().getErrors().get(0);
+ assertEquals(new Short((short) 1), obj.getErrorObject().getType());
+ assertEquals(new Short((short) 2), obj.getErrorObject().getValue());
+ }
+ }
+ }
+
+ @Test
+ @Ignore
+ public void testUnknownMessage() throws InterruptedException {
+ final SimpleSessionListener client = new SimpleSessionListener();
+ final PCEPSessionImpl s = new PCEPSessionImpl(client, 5, this.channel, this.openMsg.getOpenMessage().getOpen(), this.openMsg.getOpenMessage().getOpen());
+ s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
+ assertEquals(1, s.getUnknownMessagesTimes().size());
+ Thread.sleep(10000);
+ s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
+ assertEquals(2, s.getUnknownMessagesTimes().size());
+ Thread.sleep(10000);
+ s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
+ assertEquals(3, s.getUnknownMessagesTimes().size());
+ Thread.sleep(20000);
+ s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
+ assertEquals(4, s.getUnknownMessagesTimes().size());
+ Thread.sleep(30000);
+ s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
+ assertEquals(3, s.getUnknownMessagesTimes().size());
+ Thread.sleep(10000);
+ s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
+ assertEquals(3, s.getUnknownMessagesTimes().size());
+ Thread.sleep(5000);
+ s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
+ assertEquals(4, s.getUnknownMessagesTimes().size());
+ Thread.sleep(1000);
+ s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
+ assertEquals(5, s.getUnknownMessagesTimes().size());
+ Thread.sleep(1000);
+ s.handleMalformedMessage(PCEPErrors.CAPABILITY_NOT_SUPPORTED);
+ synchronized (client) {
+ while (client.up) {
+ client.wait();
+ }
+ }
+ assertTrue(!client.up);
+ }
+
+ @After
+ public void tearDown() {
+ }
}