diff --git a/reactivesocket-core/build.gradle b/reactivesocket-core/build.gradle index 60fb959de..1d7bce7b9 100644 --- a/reactivesocket-core/build.gradle +++ b/reactivesocket-core/build.gradle @@ -1,3 +1,4 @@ dependencies { testCompile 'io.reactivex:rxjava:2.0.0-DP0-20151003.214425-143' + testCompile 'io.netty:netty-codec-http:4.1.0.Final' } \ No newline at end of file diff --git a/reactivesocket-core/src/test/java/io/reactivesocket/FrameTest.java b/reactivesocket-core/src/test/java/io/reactivesocket/FrameTest.java index 5ee274b4c..4b3cfa684 100644 --- a/reactivesocket-core/src/test/java/io/reactivesocket/FrameTest.java +++ b/reactivesocket-core/src/test/java/io/reactivesocket/FrameTest.java @@ -1,12 +1,12 @@ /** * Copyright 2015 Netflix, Inc. - * + *
* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + *
* http://www.apache.org/licenses/LICENSE-2.0 - * + *
* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,39 +15,33 @@ */ package io.reactivesocket; -import static org.junit.Assert.*; - -import java.nio.ByteBuffer; -import java.util.concurrent.TimeUnit; - +import io.netty.buffer.ByteBufUtil; import io.reactivesocket.exceptions.Exceptions; import io.reactivesocket.exceptions.RejectedException; import io.reactivesocket.internal.frame.SetupFrameFlyweight; - +import org.agrona.concurrent.UnsafeBuffer; import org.junit.Test; import org.junit.experimental.theories.DataPoint; import org.junit.experimental.theories.Theories; import org.junit.experimental.theories.Theory; import org.junit.runner.RunWith; -import org.agrona.concurrent.UnsafeBuffer; -import static io.reactivesocket.internal.frame.ErrorFrameFlyweight.*; +import java.nio.ByteBuffer; +import java.util.concurrent.TimeUnit; + +import static io.reactivesocket.internal.frame.ErrorFrameFlyweight.REJECTED; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.Assert.assertEquals; @RunWith(Theories.class) -public class FrameTest -{ - private static Payload createPayload(final ByteBuffer metadata, final ByteBuffer data) - { - return new Payload() - { - public ByteBuffer getData() - { +public class FrameTest { + private static Payload createPayload(final ByteBuffer metadata, final ByteBuffer data) { + return new Payload() { + public ByteBuffer getData() { return data; } - public ByteBuffer getMetadata() - { + public ByteBuffer getMetadata() { return metadata; } }; @@ -59,12 +53,13 @@ public ByteBuffer getMetadata() @DataPoint public static final int NON_ZERO_OFFSET = 127; - private static final UnsafeBuffer reusableMutableDirectBuffer = new UnsafeBuffer(ByteBuffer.allocate(1024)); + private static final UnsafeBuffer reusableMutableDirectBuffer = + new UnsafeBuffer(ByteBuffer.allocate(1024)); private static final Frame reusableFrame = Frame.allocate(reusableMutableDirectBuffer); @Test public void testWriteThenRead() { - final ByteBuffer helloBuffer = TestUtil.byteBufferFromUtf8String("hello"); + final ByteBuffer helloBuffer = TestUtil.byteBufferFromUtf8String("hello"); final Payload payload = createPayload(Frame.NULL_BYTEBUFFER, helloBuffer); Frame f = Frame.Request.from(1, FrameType.REQUEST_RESPONSE, payload, 1); @@ -83,7 +78,7 @@ public void testWriteThenRead() { @Test public void testWrapMessage() { - final ByteBuffer helloBuffer = TestUtil.byteBufferFromUtf8String("hello"); + final ByteBuffer helloBuffer = TestUtil.byteBufferFromUtf8String("hello"); final ByteBuffer doneBuffer = TestUtil.byteBufferFromUtf8String("done"); final Payload payload = createPayload(Frame.NULL_BYTEBUFFER, helloBuffer); @@ -97,7 +92,7 @@ public void testWrapMessage() { @Test public void testWrapBytes() { - final ByteBuffer helloBuffer = TestUtil.byteBufferFromUtf8String("hello"); + final ByteBuffer helloBuffer = TestUtil.byteBufferFromUtf8String("hello"); final ByteBuffer anotherBuffer = TestUtil.byteBufferFromUtf8String("another"); final Payload payload = createPayload(Frame.NULL_BYTEBUFFER, helloBuffer); final Payload anotherPayload = createPayload(Frame.NULL_BYTEBUFFER, anotherBuffer); @@ -115,8 +110,7 @@ public void testWrapBytes() { @Test @Theory - public void shouldReturnCorrectDataPlusMetadataForRequestResponse(final int offset) - { + public void shouldReturnCorrectDataPlusMetadataForRequestResponse(final int offset) { final ByteBuffer requestData = TestUtil.byteBufferFromUtf8String("request data"); final ByteBuffer requestMetadata = TestUtil.byteBufferFromUtf8String("request metadata"); final Payload payload = createPayload(requestMetadata, requestData); @@ -129,12 +123,15 @@ public void shouldReturnCorrectDataPlusMetadataForRequestResponse(final int offs assertEquals(1, reusableFrame.getStreamId()); assertEquals("request data", TestUtil.byteToString(reusableFrame.getData())); assertEquals("request metadata", TestUtil.byteToString(reusableFrame.getMetadata())); + + assertEquals( + "0000002c0004400000000001", + ByteBufUtil.hexDump(encodedFrame.getByteBuffer().array(), 0, 12)); } @Test @Theory - public void shouldReturnCorrectDataPlusMetadataForFireAndForget(final int offset) - { + public void shouldReturnCorrectDataPlusMetadataForFireAndForget(final int offset) { final ByteBuffer requestData = TestUtil.byteBufferFromUtf8String("request data"); final ByteBuffer requestMetadata = TestUtil.byteBufferFromUtf8String("request metadata"); final Payload payload = createPayload(requestMetadata, requestData); @@ -147,12 +144,15 @@ public void shouldReturnCorrectDataPlusMetadataForFireAndForget(final int offset assertEquals("request metadata", TestUtil.byteToString(reusableFrame.getMetadata())); assertEquals(FrameType.FIRE_AND_FORGET, reusableFrame.getType()); assertEquals(1, reusableFrame.getStreamId()); + + assertEquals( + "0000002c0005400000000001", + ByteBufUtil.hexDump(encodedFrame.getByteBuffer().array(), 0, 12)); } @Test @Theory - public void shouldReturnCorrectDataPlusMetadataForRequestStream(final int offset) - { + public void shouldReturnCorrectDataPlusMetadataForRequestStream(final int offset) { final ByteBuffer requestData = TestUtil.byteBufferFromUtf8String("request data"); final ByteBuffer requestMetadata = TestUtil.byteBufferFromUtf8String("request metadata"); final Payload payload = createPayload(requestMetadata, requestData); @@ -166,12 +166,15 @@ public void shouldReturnCorrectDataPlusMetadataForRequestStream(final int offset assertEquals(FrameType.REQUEST_STREAM, reusableFrame.getType()); assertEquals(1, reusableFrame.getStreamId()); assertEquals(128, Frame.Request.initialRequestN(reusableFrame)); + + assertEquals( + "000000300006480000000001", + ByteBufUtil.hexDump(encodedFrame.getByteBuffer().array(), 0, 12)); } @Test @Theory - public void shouldReturnCorrectDataPlusMetadataForRequestSubscription(final int offset) - { + public void shouldReturnCorrectDataPlusMetadataForRequestSubscription(final int offset) { final ByteBuffer requestData = TestUtil.byteBufferFromUtf8String("request data"); final ByteBuffer requestMetadata = TestUtil.byteBufferFromUtf8String("request metadata"); final Payload payload = createPayload(requestMetadata, requestData); @@ -185,12 +188,15 @@ public void shouldReturnCorrectDataPlusMetadataForRequestSubscription(final int assertEquals(FrameType.REQUEST_SUBSCRIPTION, reusableFrame.getType()); assertEquals(1, reusableFrame.getStreamId()); assertEquals(128, Frame.Request.initialRequestN(reusableFrame)); + + assertEquals( + "000000300007480000000001", + ByteBufUtil.hexDump(encodedFrame.getByteBuffer().array(), 0, 12)); } @Test @Theory - public void shouldReturnCorrectDataPlusMetadataForResponse(final int offset) - { + public void shouldReturnCorrectDataPlusMetadataForResponse(final int offset) { final ByteBuffer requestData = TestUtil.byteBufferFromUtf8String("response data"); final ByteBuffer requestMetadata = TestUtil.byteBufferFromUtf8String("response metadata"); final Payload payload = createPayload(requestMetadata, requestData); @@ -203,12 +209,15 @@ public void shouldReturnCorrectDataPlusMetadataForResponse(final int offset) assertEquals("response metadata", TestUtil.byteToString(reusableFrame.getMetadata())); assertEquals(FrameType.NEXT, reusableFrame.getType()); assertEquals(1, reusableFrame.getStreamId()); + + assertEquals( + "0000002e000b400000000001", + ByteBufUtil.hexDump(encodedFrame.getByteBuffer().array(), 0, 12)); } @Test @Theory - public void shouldReturnCorrectDataWithoutMetadataForRequestResponse(final int offset) - { + public void shouldReturnCorrectDataWithoutMetadataForRequestResponse(final int offset) { final ByteBuffer requestData = TestUtil.byteBufferFromUtf8String("request data"); final Payload payload = createPayload(Frame.NULL_BYTEBUFFER, requestData); @@ -226,8 +235,7 @@ public void shouldReturnCorrectDataWithoutMetadataForRequestResponse(final int o @Test @Theory - public void shouldReturnCorrectDataWithoutMetadataForFireAndForget(final int offset) - { + public void shouldReturnCorrectDataWithoutMetadataForFireAndForget(final int offset) { final ByteBuffer requestData = TestUtil.byteBufferFromUtf8String("request data"); final Payload payload = createPayload(Frame.NULL_BYTEBUFFER, requestData); @@ -245,8 +253,7 @@ public void shouldReturnCorrectDataWithoutMetadataForFireAndForget(final int off @Test @Theory - public void shouldReturnCorrectDataWithoutMetadataForRequestStream(final int offset) - { + public void shouldReturnCorrectDataWithoutMetadataForRequestStream(final int offset) { final ByteBuffer requestData = TestUtil.byteBufferFromUtf8String("request data"); final Payload payload = createPayload(Frame.NULL_BYTEBUFFER, requestData); @@ -265,8 +272,7 @@ public void shouldReturnCorrectDataWithoutMetadataForRequestStream(final int off @Test @Theory - public void shouldReturnCorrectDataWithoutMetadataForRequestSubscription(final int offset) - { + public void shouldReturnCorrectDataWithoutMetadataForRequestSubscription(final int offset) { final ByteBuffer requestData = TestUtil.byteBufferFromUtf8String("request data"); final Payload payload = createPayload(Frame.NULL_BYTEBUFFER, requestData); @@ -285,8 +291,7 @@ public void shouldReturnCorrectDataWithoutMetadataForRequestSubscription(final i @Test @Theory - public void shouldReturnCorrectDataWithoutMetadataForResponse(final int offset) - { + public void shouldReturnCorrectDataWithoutMetadataForResponse(final int offset) { final ByteBuffer requestData = TestUtil.byteBufferFromUtf8String("response data"); final Payload payload = createPayload(Frame.NULL_BYTEBUFFER, requestData); @@ -304,9 +309,9 @@ public void shouldReturnCorrectDataWithoutMetadataForResponse(final int offset) @Test @Theory - public void shouldReturnCorrectDataPlusMetadataForSetup(final int offset) - { - final int flags = SetupFrameFlyweight.FLAGS_WILL_HONOR_LEASE | SetupFrameFlyweight.FLAGS_STRICT_INTERPRETATION; + public void shouldReturnCorrectDataPlusMetadataForSetup(final int offset) { + final int flags = SetupFrameFlyweight.FLAGS_WILL_HONOR_LEASE + | SetupFrameFlyweight.FLAGS_STRICT_INTERPRETATION; final int version = SetupFrameFlyweight.CURRENT_VERSION; final int keepaliveInterval = 1001; final int maxLifetime = keepaliveInterval * 5; @@ -315,18 +320,17 @@ public void shouldReturnCorrectDataPlusMetadataForSetup(final int offset) final ByteBuffer setupData = TestUtil.byteBufferFromUtf8String("setup data"); final ByteBuffer setupMetadata = TestUtil.byteBufferFromUtf8String("setup metadata"); - Frame encodedFrame = Frame.Setup.from(flags, keepaliveInterval, maxLifetime, metadataMimeType, dataMimeType, new Payload() - { - public ByteBuffer getData() - { - return setupData; - } - - public ByteBuffer getMetadata() - { - return setupMetadata; - } - }); + Frame encodedFrame = + Frame.Setup.from(flags, keepaliveInterval, maxLifetime, metadataMimeType, dataMimeType, + new Payload() { + public ByteBuffer getData() { + return setupData; + } + + public ByteBuffer getMetadata() { + return setupMetadata; + } + }); TestUtil.copyFrame(reusableMutableDirectBuffer, offset, encodedFrame); reusableFrame.wrap(reusableMutableDirectBuffer, offset); @@ -343,9 +347,9 @@ public ByteBuffer getMetadata() @Test @Theory - public void shouldReturnCorrectDataWithoutMetadataForSetup(final int offset) - { - final int flags = SetupFrameFlyweight.FLAGS_WILL_HONOR_LEASE | SetupFrameFlyweight.FLAGS_STRICT_INTERPRETATION; + public void shouldReturnCorrectDataWithoutMetadataForSetup(final int offset) { + final int flags = SetupFrameFlyweight.FLAGS_WILL_HONOR_LEASE + | SetupFrameFlyweight.FLAGS_STRICT_INTERPRETATION; final int version = SetupFrameFlyweight.CURRENT_VERSION; final int keepaliveInterval = 1001; final int maxLifetime = keepaliveInterval * 5; @@ -353,18 +357,17 @@ public void shouldReturnCorrectDataWithoutMetadataForSetup(final int offset) final String dataMimeType = "application/cbor"; final ByteBuffer setupData = TestUtil.byteBufferFromUtf8String("setup data"); - Frame encodedFrame = Frame.Setup.from(flags, keepaliveInterval, maxLifetime, metadataMimeType, dataMimeType, new Payload() - { - public ByteBuffer getData() - { - return setupData; - } - - public ByteBuffer getMetadata() - { - return Frame.NULL_BYTEBUFFER; - } - }); + Frame encodedFrame = + Frame.Setup.from(flags, keepaliveInterval, maxLifetime, metadataMimeType, dataMimeType, + new Payload() { + public ByteBuffer getData() { + return setupData; + } + + public ByteBuffer getMetadata() { + return Frame.NULL_BYTEBUFFER; + } + }); TestUtil.copyFrame(reusableMutableDirectBuffer, offset, encodedFrame); reusableFrame.wrap(reusableMutableDirectBuffer, offset); @@ -381,27 +384,26 @@ public ByteBuffer getMetadata() @Test @Theory - public void shouldFormCorrectlyWithoutDataNorMetadataForSetup(final int offset) - { - final int flags = SetupFrameFlyweight.FLAGS_WILL_HONOR_LEASE | SetupFrameFlyweight.FLAGS_STRICT_INTERPRETATION; + public void shouldFormCorrectlyWithoutDataNorMetadataForSetup(final int offset) { + final int flags = SetupFrameFlyweight.FLAGS_WILL_HONOR_LEASE + | SetupFrameFlyweight.FLAGS_STRICT_INTERPRETATION; final int version = SetupFrameFlyweight.CURRENT_VERSION; final int keepaliveInterval = 1001; final int maxLifetime = keepaliveInterval * 5; final String metadataMimeType = "application/json"; final String dataMimeType = "application/cbor"; - Frame encodedFrame = Frame.Setup.from(flags, keepaliveInterval, maxLifetime, metadataMimeType, dataMimeType, new Payload() - { - public ByteBuffer getData() - { - return Frame.NULL_BYTEBUFFER; - } - - public ByteBuffer getMetadata() - { - return Frame.NULL_BYTEBUFFER; - } - }); + Frame encodedFrame = + Frame.Setup.from(flags, keepaliveInterval, maxLifetime, metadataMimeType, dataMimeType, + new Payload() { + public ByteBuffer getData() { + return Frame.NULL_BYTEBUFFER; + } + + public ByteBuffer getMetadata() { + return Frame.NULL_BYTEBUFFER; + } + }); TestUtil.copyFrame(reusableMutableDirectBuffer, offset, encodedFrame); reusableFrame.wrap(reusableMutableDirectBuffer, offset); @@ -414,12 +416,15 @@ public ByteBuffer getMetadata() assertEquals(dataMimeType, Frame.Setup.dataMimeType(reusableFrame)); assertEquals(Frame.NULL_BYTEBUFFER, reusableFrame.getData()); assertEquals(Frame.NULL_BYTEBUFFER, reusableFrame.getMetadata()); + + assertEquals( + "0000003a000130000000000000000000000003e90000138d", + ByteBufUtil.hexDump(encodedFrame.getByteBuffer().array(), 0, 24)); } @Test @Theory - public void shouldReturnCorrectDataPlusMetadataForError(final int offset) - { + public void shouldReturnCorrectDataPlusMetadataForError(final int offset) { final int streamId = 24; final Throwable exception = new RejectedException("test"); final String data = "error data"; @@ -435,20 +440,23 @@ public void shouldReturnCorrectDataPlusMetadataForError(final int offset) assertEquals(REJECTED, Frame.Error.errorCode(reusableFrame)); assertEquals(data, TestUtil.byteToString(reusableFrame.getData())); assertEquals(metadata, TestUtil.byteToString(reusableFrame.getMetadata())); + + assertEquals( + "0000002c000c40000000001800000202", + ByteBufUtil.hexDump(encodedFrame.getByteBuffer().array(), 0, 16)); } @Test @Theory - public void shouldReturnCorrectDataWithThrowableForError(final int offset) - { + public void shouldReturnCorrectDataWithThrowableForError(final int offset) { final int errorCode = 42; final String metadata = "my metadata"; final String exMessage = "exception message"; Frame encodedFrame = Frame.Error.from( - errorCode, - new Exception(exMessage), - TestUtil.byteBufferFromUtf8String(metadata) + errorCode, + new Exception(exMessage), + TestUtil.byteBufferFromUtf8String(metadata) ); TestUtil.copyFrame(reusableMutableDirectBuffer, offset, encodedFrame); reusableFrame.wrap(reusableMutableDirectBuffer, offset); @@ -463,17 +471,16 @@ public void shouldReturnCorrectDataWithThrowableForError(final int offset) @Test @Theory - public void shouldReturnCorrectDataWithoutMetadataForError(final int offset) - { + public void shouldReturnCorrectDataWithoutMetadataForError(final int offset) { final int errorCode = 42; final String metadata = "metadata"; final String data = "error data"; Frame encodedFrame = Frame.Error.from( - errorCode, - new Exception("my exception"), - TestUtil.byteBufferFromUtf8String(metadata), - TestUtil.byteBufferFromUtf8String(data) + errorCode, + new Exception("my exception"), + TestUtil.byteBufferFromUtf8String(metadata), + TestUtil.byteBufferFromUtf8String(data) ); TestUtil.copyFrame(reusableMutableDirectBuffer, offset, encodedFrame); reusableFrame.wrap(reusableMutableDirectBuffer, offset); @@ -485,8 +492,7 @@ public void shouldReturnCorrectDataWithoutMetadataForError(final int offset) @Test @Theory - public void shouldFormCorrectlyForRequestN(final int offset) - { + public void shouldFormCorrectlyForRequestN(final int offset) { final int n = 128; final Frame encodedFrame = Frame.RequestN.from(1, n); TestUtil.copyFrame(reusableMutableDirectBuffer, offset, encodedFrame); @@ -496,13 +502,16 @@ public void shouldFormCorrectlyForRequestN(final int offset) assertEquals(n, Frame.RequestN.requestN(reusableFrame)); assertEquals(Frame.NULL_BYTEBUFFER, reusableFrame.getData()); assertEquals(Frame.NULL_BYTEBUFFER, reusableFrame.getMetadata()); + + assertEquals( + "00000010000900000000000100000080", + ByteBufUtil.hexDump(encodedFrame.getByteBuffer().array(), 0, 16)); } @Test @Theory - public void shouldFormCorrectlyWithoutMetadataForLease(final int offset) - { - final int ttl = (int)TimeUnit.SECONDS.toMillis(8); + public void shouldFormCorrectlyWithoutMetadataForLease(final int offset) { + final int ttl = (int) TimeUnit.SECONDS.toMillis(8); final int numberOfRequests = 16; final Frame encodedFrame = Frame.Lease.from(ttl, numberOfRequests, Frame.NULL_BYTEBUFFER); TestUtil.copyFrame(reusableMutableDirectBuffer, offset, encodedFrame); @@ -514,13 +523,16 @@ public void shouldFormCorrectlyWithoutMetadataForLease(final int offset) assertEquals(numberOfRequests, Frame.Lease.numberOfRequests(reusableFrame)); assertEquals(Frame.NULL_BYTEBUFFER, reusableFrame.getData()); assertEquals(Frame.NULL_BYTEBUFFER, reusableFrame.getMetadata()); + + assertEquals( + "00000014000200000000000000001f4000000010", + ByteBufUtil.hexDump(encodedFrame.getByteBuffer().array(), 0, 20)); } @Test @Theory - public void shouldFormCorrectlyWithMetadataForLease(final int offset) - { - final int ttl = (int)TimeUnit.SECONDS.toMillis(8); + public void shouldFormCorrectlyWithMetadataForLease(final int offset) { + final int ttl = (int) TimeUnit.SECONDS.toMillis(8); final int numberOfRequests = 16; final ByteBuffer leaseMetadata = TestUtil.byteBufferFromUtf8String("lease metadata");