Add unit tests for Envelope classes 15/52615/7
authorAndrej Mak <andrej.mak@pantheon.tech>
Thu, 2 Mar 2017 07:49:45 +0000 (08:49 +0100)
committerAndrej Mak <andrej.mak@pantheon.tech>
Tue, 7 Mar 2017 07:07:42 +0000 (08:07 +0100)
Change-Id: I9d4c1034ae4bbb6531b27fa60e83d545a0d88eb9
Signed-off-by: Andrej Mak <andrej.mak@pantheon.tech>
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/AbstractEnvelopeTest.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/FailureEnvelopeTest.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/RequestEnvelopeTest.java [new file with mode: 0644]
opendaylight/md-sal/cds-access-api/src/test/java/org/opendaylight/controller/cluster/access/concepts/SuccessEnvelopeTest.java [new file with mode: 0644]

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 (file)
index 0000000..43746ce
--- /dev/null
@@ -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<E extends Envelope> {
+    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 (file)
index 0000000..2f56dd4
--- /dev/null
@@ -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<FailureEnvelope> {
+
+    @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<WritableIdentifier, MockFailure> {
+
+        @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<WritableIdentifier, MockFailure> {
+        private static final long serialVersionUID = 1L;
+
+        MockFailure(final WritableIdentifier target, final RequestException cause, final long sequence) {
+            super(target, sequence, cause);
+        }
+
+        @Override
+        protected AbstractRequestFailureProxy<WritableIdentifier, MockFailure> 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 (file)
index 0000000..d270a0c
--- /dev/null
@@ -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<RequestEnvelope> {
+
+    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 (file)
index 0000000..30d9e98
--- /dev/null
@@ -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<SuccessEnvelope> {
+
+    @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