From 0b1f60f64ea5b69ff4a00a4438568491009ee0da Mon Sep 17 00:00:00 2001 From: Andrej Mak Date: Thu, 2 Mar 2017 08:49:45 +0100 Subject: [PATCH] Add unit tests for Envelope classes Change-Id: I9d4c1034ae4bbb6531b27fa60e83d545a0d88eb9 Signed-off-by: Andrej Mak --- .../access/concepts/AbstractEnvelopeTest.java | 51 ++++++++++++ .../access/concepts/FailureEnvelopeTest.java | 81 +++++++++++++++++++ .../access/concepts/RequestEnvelopeTest.java | 63 +++++++++++++++ .../access/concepts/SuccessEnvelopeTest.java | 26 ++++++ 4 files changed, 221 insertions(+) create mode 100644 opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/AbstractEnvelopeTest.java create mode 100644 opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/FailureEnvelopeTest.java create mode 100644 opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/RequestEnvelopeTest.java create mode 100644 opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/SuccessEnvelopeTest.java diff --git a/opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/AbstractEnvelopeTest.java b/opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/AbstractEnvelopeTest.java new file mode 100644 index 0000000000..43746cef15 --- /dev/null +++ b/opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/AbstractEnvelopeTest.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.cluster.access.concepts; + +import org.apache.commons.lang.SerializationUtils; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public abstract class AbstractEnvelopeTest { + private static final FrontendIdentifier FRONTEND = + new FrontendIdentifier(MemberName.forName("test"), FrontendIdentifierTest.ONE_FRONTEND_TYPE); + private static final ClientIdentifier CLIENT = new ClientIdentifier(FRONTEND, 0); + private static final LocalHistoryIdentifier HISTORY = new LocalHistoryIdentifier(CLIENT, 0); + protected static final TransactionIdentifier OBJECT = new TransactionIdentifier(HISTORY, 0); + + private E envelope; + + @Before + public void setUp() throws Exception { + envelope = createEnvelope(); + } + + @Test + public void testProxySerializationDeserialization() throws Exception { + final byte[] serializedBytes = SerializationUtils.serialize(envelope); + final Object deserialize = SerializationUtils.deserialize(serializedBytes); + checkDeserialized((E) deserialize); + } + + private void checkDeserialized(final E deserializedEnvelope) { + Assert.assertEquals(envelope.getSessionId(), deserializedEnvelope.getSessionId()); + Assert.assertEquals(envelope.getTxSequence(), deserializedEnvelope.getTxSequence()); + final Message expectedMessage = envelope.getMessage(); + final Message actualMessage = deserializedEnvelope.getMessage(); + Assert.assertEquals(expectedMessage.getSequence(), actualMessage.getSequence()); + Assert.assertEquals(expectedMessage.getTarget(), actualMessage.getTarget()); + Assert.assertEquals(expectedMessage.getVersion(), actualMessage.getVersion()); + Assert.assertEquals(expectedMessage.getClass(), actualMessage.getClass()); + doAdditionalAssertions(envelope, deserializedEnvelope); + } + + protected abstract E createEnvelope(); + + protected abstract void doAdditionalAssertions(E envelope, E resolvedObject); +} diff --git a/opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/FailureEnvelopeTest.java b/opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/FailureEnvelopeTest.java new file mode 100644 index 0000000000..2f56dd4aab --- /dev/null +++ b/opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/FailureEnvelopeTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.cluster.access.concepts; + +import java.io.DataInput; +import java.io.IOException; +import javax.annotation.Nonnull; +import org.junit.Assert; +import org.opendaylight.controller.cluster.access.ABIVersion; +import org.opendaylight.yangtools.concepts.WritableIdentifier; + +public class FailureEnvelopeTest extends AbstractEnvelopeTest { + + @Override + protected FailureEnvelope createEnvelope() { + final RequestFailure message = + new MockFailure(OBJECT, new RuntimeRequestException("msg", new RuntimeException()), 42); + return new FailureEnvelope(message, 1L, 2L, 11L); + } + + @Override + protected void doAdditionalAssertions(final FailureEnvelope envelope, final FailureEnvelope resolvedObject) { + Assert.assertEquals(envelope.getExecutionTimeNanos(), resolvedObject.getExecutionTimeNanos()); + final RequestException expectedCause = envelope.getMessage().getCause(); + final RequestException actualCause = resolvedObject.getMessage().getCause(); + Assert.assertEquals(expectedCause.getMessage(), actualCause.getMessage()); + Assert.assertEquals(expectedCause.isRetriable(), actualCause.isRetriable()); + } + + private static class MockRequestFailureProxy extends AbstractRequestFailureProxy { + + @SuppressWarnings("checkstyle:RedundantModifier") + public MockRequestFailureProxy() { + //For Externalizable + } + + private MockRequestFailureProxy(final MockFailure mockFailure) { + super(mockFailure); + } + + @Nonnull + @Override + protected MockFailure createFailure(@Nonnull final WritableIdentifier target, final long sequence, + @Nonnull final RequestException failureCause) { + return new MockFailure(target, failureCause, sequence); + } + + @Nonnull + @Override + protected WritableIdentifier readTarget(@Nonnull final DataInput in) throws IOException { + return TransactionIdentifier.readFrom(in); + } + + } + + private static class MockFailure extends RequestFailure { + private static final long serialVersionUID = 1L; + + MockFailure(final WritableIdentifier target, final RequestException cause, final long sequence) { + super(target, sequence, cause); + } + + @Override + protected AbstractRequestFailureProxy externalizableProxy( + final ABIVersion version) { + return new MockRequestFailureProxy(this); + } + + @Override + protected MockFailure cloneAsVersion(final ABIVersion version) { + return this; + } + + } + +} diff --git a/opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/RequestEnvelopeTest.java b/opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/RequestEnvelopeTest.java new file mode 100644 index 0000000000..d270a0c423 --- /dev/null +++ b/opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/RequestEnvelopeTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.cluster.access.concepts; + +import akka.actor.ActorRef; +import akka.actor.ActorSystem; +import akka.actor.ExtendedActorSystem; +import akka.serialization.JavaSerializer; +import akka.testkit.TestProbe; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.opendaylight.controller.cluster.access.commands.TransactionPurgeRequest; +import org.opendaylight.controller.cluster.access.commands.TransactionPurgeResponse; + +public class RequestEnvelopeTest extends AbstractEnvelopeTest { + + private ActorSystem system; + private ActorRef replyTo; + private TestProbe replyToProbe; + + @Override + @Before + public void setUp() throws Exception { + system = ActorSystem.apply(); + JavaSerializer.currentSystem().value_$eq((ExtendedActorSystem) system); + super.setUp(); + } + + @Override + protected RequestEnvelope createEnvelope() { + replyToProbe = new TestProbe(system); + replyTo = replyToProbe.ref(); + final TransactionPurgeRequest message = new TransactionPurgeRequest(OBJECT, 2L, replyTo); + return new RequestEnvelope(message, 1L, 2L); + } + + @Override + protected void doAdditionalAssertions(final RequestEnvelope envelope, final RequestEnvelope resolvedObject) { + final Request actual = resolvedObject.getMessage(); + Assert.assertTrue(actual instanceof TransactionPurgeRequest); + final TransactionPurgeRequest purgeRequest = (TransactionPurgeRequest) actual; + Assert.assertEquals(replyTo, purgeRequest.getReplyTo()); + final TransactionPurgeResponse response = new TransactionPurgeResponse(OBJECT, 2L); + resolvedObject.sendSuccess(response, 11L); + final SuccessEnvelope successEnvelope = replyToProbe.expectMsgClass(SuccessEnvelope.class); + Assert.assertEquals(response, successEnvelope.getMessage()); + final RuntimeRequestException failResponse = new RuntimeRequestException("fail", new RuntimeException()); + resolvedObject.sendFailure(failResponse, 11L); + final FailureEnvelope failureEnvelope = replyToProbe.expectMsgClass(FailureEnvelope.class); + Assert.assertEquals(failResponse, failureEnvelope.getMessage().getCause()); + } + + @After + public void tearDown() throws Exception { + system.terminate(); + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/SuccessEnvelopeTest.java b/opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/SuccessEnvelopeTest.java new file mode 100644 index 0000000000..30d9e98636 --- /dev/null +++ b/opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/SuccessEnvelopeTest.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.cluster.access.concepts; + +import org.junit.Assert; +import org.opendaylight.controller.cluster.access.commands.TransactionAbortSuccess; + +public class SuccessEnvelopeTest extends AbstractEnvelopeTest { + + @Override + protected SuccessEnvelope createEnvelope() { + final RequestSuccess message = new TransactionAbortSuccess(OBJECT, 2L); + return new SuccessEnvelope(message, 1L, 2L, 11L); + } + + @Override + protected void doAdditionalAssertions(final SuccessEnvelope envelope, + final SuccessEnvelope resolvedObject) { + Assert.assertEquals(envelope.getExecutionTimeNanos(), resolvedObject.getExecutionTimeNanos()); + } +} \ No newline at end of file -- 2.36.6