import org.opendaylight.controller.cluster.access.ABIVersion;
import org.opendaylight.controller.cluster.access.concepts.AbstractRequestFailureProxy;
import org.opendaylight.controller.cluster.access.concepts.AbstractRequestProxy;
+import org.opendaylight.controller.cluster.access.concepts.FailureEnvelope;
import org.opendaylight.controller.cluster.access.concepts.Request;
+import org.opendaylight.controller.cluster.access.concepts.RequestEnvelope;
import org.opendaylight.controller.cluster.access.concepts.RequestException;
import org.opendaylight.controller.cluster.access.concepts.RequestFailure;
-import org.opendaylight.controller.cluster.access.concepts.Response;
import org.opendaylight.controller.cluster.common.actor.TestTicker;
import org.opendaylight.yangtools.concepts.WritableIdentifier;
import scala.concurrent.duration.FiniteDuration;
private static class MockFailure extends RequestFailure<WritableIdentifier, MockFailure> {
private static final long serialVersionUID = 1L;
- MockFailure(final WritableIdentifier target, final long sequence, final long retry, final RequestException cause) {
- super(target, sequence, retry, cause);
+ MockFailure(final WritableIdentifier target, final RequestException cause) {
+ super(target, cause);
}
@Override
private static class MockRequest extends Request<WritableIdentifier, MockRequest> {
private static final long serialVersionUID = 1L;
- MockRequest(final WritableIdentifier target, final long sequence, final ActorRef replyTo) {
- super(target, sequence, 0, replyTo);
- }
-
-
- MockRequest(final MockRequest request, final long retry) {
- super(request, retry);
+ MockRequest(final WritableIdentifier target, final ActorRef replyTo) {
+ super(target, replyTo);
}
@Override
public RequestFailure<WritableIdentifier, ?> toRequestFailure(final RequestException cause) {
- return new MockFailure(getTarget(), getSequence(), getRetry(), cause);
+ return new MockFailure(getTarget(), cause);
}
@Override
protected MockRequest cloneAsVersion(final ABIVersion version) {
return this;
}
-
- @Override
- protected MockRequest cloneAsRetry(final long retry) {
- return new MockRequest(this, retry);
- }
};
@Mock
private BackendInfo mockBackendInfo;
private MockRequest mockRequest;
private MockRequest mockRequest2;
- private Response<WritableIdentifier, ?> mockResponse;
+ private RequestFailure<WritableIdentifier, ?> mockResponse;
+ private FailureEnvelope mockResponseEnvelope;
private Long mockCookie;
private static ActorSystem actorSystem;
mockActor = TestProbe.apply(actorSystem);
mockBackendInfo = new BackendInfo(mockActor.ref(), ABIVersion.current());
- mockRequest = new MockRequest(mockIdentifier, ThreadLocalRandom.current().nextLong(), mockReplyTo);
- mockRequest2 = new MockRequest(mockIdentifier, mockRequest.getSequence() + 1, mockReplyTo);
+ mockRequest = new MockRequest(mockIdentifier, mockReplyTo);
+ mockRequest2 = new MockRequest(mockIdentifier, mockReplyTo);
mockResponse = mockRequest.toRequestFailure(mockCause);
+ mockResponseEnvelope = new FailureEnvelope(mockResponse, 0, 0);
mockCookie = ThreadLocalRandom.current().nextLong();
queue = new SequencedQueue(mockCookie, ticker);
queue.close();
// Kaboom
- queue.enqueueRequest(mockRequest, mockCallback);
+ queue.enqueueRequest(0, mockRequest, mockCallback);
}
@Test
@Test
public void testPoison() {
- queue.enqueueRequest(mockRequest, mockCallback);
+ queue.enqueueRequest(0, mockRequest, mockCallback);
queue.poison(mockCause);
final ArgumentCaptor<MockFailure> captor = ArgumentCaptor.forClass(MockFailure.class);
queue.poison(mockCause);
// Kaboom
- queue.enqueueRequest(mockRequest, mockCallback);
+ queue.enqueueRequest(0, mockRequest, mockCallback);
}
@Test
@Test
public void testEnqueueRequestNeedsBackend() {
- final Optional<FiniteDuration> ret = queue.enqueueRequest(mockRequest, mockCallback);
+ final Optional<FiniteDuration> ret = queue.enqueueRequest(0, mockRequest, mockCallback);
assertNotNull(ret);
assertFalse(ret.isPresent());
@Test
public void testSetBackendWithNoResolution() {
- queue.enqueueRequest(mockRequest, mockCallback);
+ queue.enqueueRequest(0, mockRequest, mockCallback);
final CompletableFuture<BackendInfo> proof = new CompletableFuture<>();
final Optional<FiniteDuration> ret = queue.setBackendInfo(proof, mockBackendInfo);
@Test
public void testSetBackendWithWrongProof() {
- queue.enqueueRequest(mockRequest, mockCallback);
+ queue.enqueueRequest(0, mockRequest, mockCallback);
final CompletableFuture<BackendInfo> proof = new CompletableFuture<>();
assertTrue(queue.expectProof(proof));
@Test
public void testSetbackedWithRequestsNoTimer() {
- queue.enqueueRequest(mockRequest, mockCallback);
+ queue.enqueueRequest(0, mockRequest, mockCallback);
final CompletableFuture<BackendInfo> proof = new CompletableFuture<>();
assertTrue(queue.expectProof(proof));
assertNotNull(ret);
assertTrue(ret.isPresent());
- assertTransmit(mockRequest);
+ assertTransmit(mockRequest, 0);
}
@Test
public void testEnqueueRequestNeedsTimer() {
setupBackend();
- final Optional<FiniteDuration> ret = queue.enqueueRequest(mockRequest, mockCallback);
+ final Optional<FiniteDuration> ret = queue.enqueueRequest(0, mockRequest, mockCallback);
assertNotNull(ret);
assertTrue(ret.isPresent());
- assertTransmit(mockRequest);
+ assertTransmit(mockRequest, 0);
}
@Test
setupBackend();
// First request
- Optional<FiniteDuration> ret = queue.enqueueRequest(mockRequest, mockCallback);
+ Optional<FiniteDuration> ret = queue.enqueueRequest(0, mockRequest, mockCallback);
assertNotNull(ret);
assertTrue(ret.isPresent());
- assertTransmit(mockRequest);
+ assertTransmit(mockRequest, 0);
// Second request, no timer fired
- ret = queue.enqueueRequest(mockRequest2, mockCallback);
+ ret = queue.enqueueRequest(1, mockRequest2, mockCallback);
assertNull(ret);
- assertTransmit(mockRequest2);
+ assertTransmit(mockRequest2, 1);
}
@Test
@Test
public void testRunTimeoutWithoutShift() throws NoProgressException {
- queue.enqueueRequest(mockRequest, mockCallback);
+ queue.enqueueRequest(0, mockRequest, mockCallback);
final boolean ret = queue.runTimeout();
assertFalse(ret);
}
@Test
public void testRunTimeoutWithTimeoutLess() throws NoProgressException {
- queue.enqueueRequest(mockRequest, mockCallback);
+ queue.enqueueRequest(0, mockRequest, mockCallback);
ticker.increment(SequencedQueue.REQUEST_TIMEOUT_NANOS - 1);
@Test
public void testRunTimeoutWithTimeoutExact() throws NoProgressException {
- queue.enqueueRequest(mockRequest, mockCallback);
+ queue.enqueueRequest(0, mockRequest, mockCallback);
ticker.increment(SequencedQueue.REQUEST_TIMEOUT_NANOS);
@Test
public void testRunTimeoutWithTimeoutMore() throws NoProgressException {
- queue.enqueueRequest(mockRequest, mockCallback);
+ queue.enqueueRequest(0, mockRequest, mockCallback);
ticker.increment(SequencedQueue.REQUEST_TIMEOUT_NANOS + 1);
@Test(expected=NoProgressException.class)
public void testRunTimeoutWithoutProgressExact() throws NoProgressException {
- queue.enqueueRequest(mockRequest, mockCallback);
+ queue.enqueueRequest(0, mockRequest, mockCallback);
ticker.increment(SequencedQueue.NO_PROGRESS_TIMEOUT_NANOS);
@Test(expected=NoProgressException.class)
public void testRunTimeoutWithoutProgressMore() throws NoProgressException {
- queue.enqueueRequest(mockRequest, mockCallback);
+ queue.enqueueRequest(0, mockRequest, mockCallback);
ticker.increment(SequencedQueue.NO_PROGRESS_TIMEOUT_NANOS + 1);
@Test
public void testCompleteEmpty() {
- final ClientActorBehavior ret = queue.complete(mockBehavior, mockResponse);
+ final ClientActorBehavior ret = queue.complete(mockBehavior, mockResponseEnvelope);
assertSame(mockBehavior, ret);
verifyNoMoreInteractions(mockCallback);
}
@Test
public void testCompleteSingle() {
- queue.enqueueRequest(mockRequest, mockCallback);
+ queue.enqueueRequest(0, mockRequest, mockCallback);
- ClientActorBehavior ret = queue.complete(mockBehavior, mockResponse);
+ ClientActorBehavior ret = queue.complete(mockBehavior, mockResponseEnvelope);
verify(mockCallback).complete(mockResponse);
assertSame(mockBehavior, ret);
- ret = queue.complete(mockBehavior, mockResponse);
+ ret = queue.complete(mockBehavior, mockResponseEnvelope);
assertSame(mockBehavior, ret);
verifyNoMoreInteractions(mockCallback);
}
@Test
public void testCompleteNull() {
- queue.enqueueRequest(mockRequest, mockCallback);
+ queue.enqueueRequest(0, mockRequest, mockCallback);
doReturn(null).when(mockCallback).complete(mockResponse);
- ClientActorBehavior ret = queue.complete(mockBehavior, mockResponse);
+ ClientActorBehavior ret = queue.complete(mockBehavior, mockResponseEnvelope);
verify(mockCallback).complete(mockResponse);
assertNull(ret);
}
public void testProgressRecord() throws NoProgressException {
setupBackend();
- queue.enqueueRequest(mockRequest, mockCallback);
+ queue.enqueueRequest(0, mockRequest, mockCallback);
ticker.increment(10);
- queue.enqueueRequest(mockRequest2, mockCallback);
- queue.complete(mockBehavior, mockResponse);
+ queue.enqueueRequest(1, mockRequest2, mockCallback);
+ queue.complete(mockBehavior, mockResponseEnvelope);
ticker.increment(SequencedQueue.NO_PROGRESS_TIMEOUT_NANOS - 11);
assertTrue(queue.runTimeout());
assertFalse(mockActor.msgAvailable());
}
- private void assertTransmit(final Request<?, ?> expected) {
+ private void assertTransmit(final Request<?, ?> expected, final long sequence) {
assertTrue(mockActor.msgAvailable());
- assertRequestEquals(expected, mockActor.receiveOne(FiniteDuration.apply(5, TimeUnit.SECONDS)));
+ assertRequestEquals(expected, sequence, mockActor.receiveOne(FiniteDuration.apply(5, TimeUnit.SECONDS)));
}
- private static void assertRequestEquals(final Request<?, ?> expected, final Object o) {
- final Request<?, ?> actual = (Request<?, ?>) o;
- assertEquals(expected.getRetry(), actual.getRetry());
- assertEquals(expected.getSequence(), actual.getSequence());
- assertEquals(expected.getTarget(), actual.getTarget());
+ private static void assertRequestEquals(final Request<?, ?> expected, final long sequence, final Object o) {
+ assertTrue(o instanceof RequestEnvelope);
+
+ final RequestEnvelope actual = (RequestEnvelope) o;
+ assertEquals(0, actual.getRetry());
+ assertEquals(sequence, actual.getSequence());
+ assertSame(expected, actual.getMessage());
}
}