--- /dev/null
+/*
+ * 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);
+}
--- /dev/null
+/*
+ * 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;
+ }
+
+ }
+
+}
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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