diff options
3 files changed, 171 insertions, 89 deletions
diff --git a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardStream.java b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardStream.java index 24562ed663..ff0270c54c 100644 --- a/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardStream.java +++ b/jetty-spdy/spdy-core/src/main/java/org/eclipse/jetty/spdy/StandardStream.java @@ -468,7 +468,8 @@ public class StandardStream implements IStream @Override public String toString() { - return String.format("stream=%d v%d windowSize=%db reset=%s %s %s", getId(), session.getVersion(), getWindowSize(), isReset(), openState, closeState); + return String.format("stream=%d v%d windowSize=%db reset=%s prio=%d %s %s", getId(), session.getVersion(), + getWindowSize(), isReset(), priority, openState, closeState); } private boolean canSend() diff --git a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardSessionTest.java b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardSessionTest.java index 980c649437..29309f0369 100644 --- a/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardSessionTest.java +++ b/jetty-spdy/spdy-core/src/test/java/org/eclipse/jetty/spdy/StandardSessionTest.java @@ -20,10 +20,12 @@ package org.eclipse.jetty.spdy; import java.nio.ByteBuffer; import java.nio.channels.ClosedChannelException; +import java.util.HashSet; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -47,6 +49,8 @@ import org.eclipse.jetty.spdy.generator.Generator; import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Fields; import org.eclipse.jetty.util.Promise; +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.thread.Scheduler; import org.eclipse.jetty.util.thread.TimerScheduler; import org.junit.After; @@ -71,12 +75,16 @@ import static org.mockito.Mockito.verify; @RunWith(MockitoJUnitRunner.class) public class StandardSessionTest { + private static final Logger LOG = Log.getLogger(StandardSessionTest.class); + @Mock private Controller controller; private ExecutorService threadPool; private StandardSession session; private Scheduler scheduler; private Fields headers; + private final ByteBufferPool bufferPool = new MappedByteBufferPool(); + private final Generator generator = new Generator(bufferPool, new StandardCompressionFactory.StandardCompressor()); @Before public void setUp() throws Exception @@ -84,9 +92,7 @@ public class StandardSessionTest threadPool = Executors.newCachedThreadPool(); scheduler = new TimerScheduler(); scheduler.start(); - ByteBufferPool bufferPool = new MappedByteBufferPool(); - Generator generator = new Generator(bufferPool, new StandardCompressionFactory.StandardCompressor()); - session = new StandardSession(SPDY.V2, bufferPool,threadPool,scheduler,controller,null,1,null, generator,new FlowControlStrategy.None()); + session = new StandardSession(SPDY.V2, bufferPool, threadPool, scheduler, controller, null, 1, null, generator, new FlowControlStrategy.None()); headers = new Fields(); } @@ -100,17 +106,20 @@ public class StandardSessionTest @SuppressWarnings("unchecked") private void setControllerWriteExpectationToFail(final boolean fail) { - doAnswer(new Answer() { - public Object answer(InvocationOnMock invocation) { - Object[] args = invocation.getArguments(); - Callback callback = (Callback)args[1]; - if (fail) - callback.failed(new ClosedChannelException()); - else - callback.succeeded(); - return null; - }}) - .when(controller).write(any(ByteBuffer.class),any(Callback.class)); + doAnswer(new Answer() + { + public Object answer(InvocationOnMock invocation) + { + Object[] args = invocation.getArguments(); + Callback callback = (Callback)args[1]; + if (fail) + callback.failed(new ClosedChannelException()); + else + callback.succeeded(); + return null; + } + }) + .when(controller).write(any(ByteBuffer.class), any(Callback.class)); } @Test @@ -120,8 +129,8 @@ public class StandardSessionTest IStream stream = createStream(); assertThatStreamIsInSession(stream); - assertThat("stream is not reset",stream.isReset(),is(false)); - session.rst(new RstInfo(stream.getId(),StreamStatus.STREAM_ALREADY_CLOSED)); + assertThat("stream is not reset", stream.isReset(), is(false)); + session.rst(new RstInfo(stream.getId(), StreamStatus.STREAM_ALREADY_CLOSED)); assertThatStreamIsNotInSession(stream); assertThatStreamIsReset(stream); } @@ -133,8 +142,8 @@ public class StandardSessionTest IStream stream = createStream(); assertThatStreamIsInSession(stream); - stream.updateCloseState(true,true); - session.onControlFrame(new SynReplyFrame(SPDY.V2,SynInfo.FLAG_CLOSE,stream.getId(),null)); + stream.updateCloseState(true, true); + session.onControlFrame(new SynReplyFrame(SPDY.V2, SynInfo.FLAG_CLOSE, stream.getId(), null)); assertThatStreamIsClosed(stream); assertThatStreamIsNotInSession(stream); } @@ -146,8 +155,8 @@ public class StandardSessionTest IStream stream = createStream(); assertThatStreamIsInSession(stream); - stream.updateCloseState(true,false); - stream.headers(new HeadersInfo(headers,true)); + stream.updateCloseState(true, false); + stream.headers(new HeadersInfo(headers, true)); assertThatStreamIsClosed(stream); assertThatStreamIsNotInSession(stream); } @@ -158,9 +167,9 @@ public class StandardSessionTest setControllerWriteExpectationToFail(false); IStream stream = createStream(); - assertThat("stream is not unidirectional",stream.isUnidirectional(),not(true)); + assertThat("stream is not unidirectional", stream.isUnidirectional(), not(true)); Stream pushStream = createPushStream(stream); - assertThat("pushStream is unidirectional",pushStream.isUnidirectional(),is(true)); + assertThat("pushStream is unidirectional", pushStream.isUnidirectional(), is(true)); } @Test @@ -170,8 +179,8 @@ public class StandardSessionTest Stream stream = createStream(); IStream pushStream = createPushStream(stream); - assertThat("Push stream must be associated to the first stream created",pushStream.getAssociatedStream().getId(),is(stream.getId())); - assertThat("streamIds need to be monotonic",pushStream.getId(),greaterThan(stream.getId())); + assertThat("Push stream must be associated to the first stream created", pushStream.getAssociatedStream().getId(), is(stream.getId())); + assertThat("streamIds need to be monotonic", pushStream.getId(), greaterThan(stream.getId())); } @Test @@ -186,13 +195,13 @@ public class StandardSessionTest assertThatPushStreamIsHalfClosed(pushStream); assertThatPushStreamIsNotClosed(pushStream); - stream.updateCloseState(true,true); + stream.updateCloseState(true, true); assertThatStreamIsHalfClosed(stream); assertThatStreamIsNotClosed(stream); assertThatPushStreamIsHalfClosed(pushStream); assertThatPushStreamIsNotClosed(pushStream); - session.onControlFrame(new SynReplyFrame(SPDY.V2,SynInfo.FLAG_CLOSE,stream.getId(),null)); + session.onControlFrame(new SynReplyFrame(SPDY.V2, SynInfo.FLAG_CLOSE, stream.getId(), null)); assertThatStreamIsClosed(stream); assertThatPushStreamIsNotClosed(pushStream); } @@ -203,9 +212,9 @@ public class StandardSessionTest setControllerWriteExpectationToFail(false); IStream stream = createStream(); - stream.updateCloseState(true,true); + stream.updateCloseState(true, true); assertThatStreamIsHalfClosed(stream); - stream.updateCloseState(true,false); + stream.updateCloseState(true, false); assertThatStreamIsClosed(stream); createPushStreamAndMakeSureItFails(stream); } @@ -213,8 +222,8 @@ public class StandardSessionTest private void createPushStreamAndMakeSureItFails(IStream stream) throws InterruptedException { final CountDownLatch failedLatch = new CountDownLatch(1); - SynInfo synInfo = new SynInfo(headers,false,stream.getPriority()); - stream.syn(synInfo,5,TimeUnit.SECONDS,new Promise.Adapter<Stream>() + SynInfo synInfo = new SynInfo(headers, false, stream.getPriority()); + stream.syn(synInfo, 5, TimeUnit.SECONDS, new Promise.Adapter<Stream>() { @Override public void failed(Throwable x) @@ -222,7 +231,7 @@ public class StandardSessionTest failedLatch.countDown(); } }); - assertThat("pushStream creation failed",failedLatch.await(5,TimeUnit.SECONDS),is(true)); + assertThat("pushStream creation failed", failedLatch.await(5, TimeUnit.SECONDS), is(true)); } @Test @@ -234,11 +243,11 @@ public class StandardSessionTest IStream pushStream = createPushStream(stream); assertThatPushStreamIsHalfClosed(pushStream); assertThatPushStreamIsInSession(pushStream); - assertThatStreamIsAssociatedWithPushStream(stream,pushStream); - session.data(pushStream,new StringDataInfo("close",true),5,TimeUnit.SECONDS,new Callback.Adapter()); + assertThatStreamIsAssociatedWithPushStream(stream, pushStream); + session.data(pushStream, new StringDataInfo("close", true), 5, TimeUnit.SECONDS, new Callback.Adapter()); assertThatPushStreamIsClosed(pushStream); assertThatPushStreamIsNotInSession(pushStream); - assertThatStreamIsNotAssociatedWithPushStream(stream,pushStream); + assertThatStreamIsNotAssociatedWithPushStream(stream, pushStream); } @Test @@ -249,9 +258,9 @@ public class StandardSessionTest IStream stream = createStream(); IStream pushStream = (IStream)stream.syn(new SynInfo(false)).get(); assertThatPushStreamIsInSession(pushStream); - session.rst(new RstInfo(pushStream.getId(),StreamStatus.INVALID_STREAM)); + session.rst(new RstInfo(pushStream.getId(), StreamStatus.INVALID_STREAM)); assertThatPushStreamIsNotInSession(pushStream); - assertThatStreamIsNotAssociatedWithPushStream(stream,pushStream); + assertThatStreamIsNotAssociatedWithPushStream(stream, pushStream); assertThatStreamIsReset(pushStream); } @@ -261,11 +270,11 @@ public class StandardSessionTest setControllerWriteExpectationToFail(false); IStream stream = createStream(); - SynInfo synInfo = new SynInfo(headers,true,stream.getPriority()); - IStream pushStream = (IStream)stream.syn(synInfo).get(5,TimeUnit.SECONDS); + SynInfo synInfo = new SynInfo(headers, true, stream.getPriority()); + IStream pushStream = (IStream)stream.syn(synInfo).get(5, TimeUnit.SECONDS); assertThatPushStreamIsHalfClosed(pushStream); assertThatPushStreamIsClosed(pushStream); - assertThatStreamIsNotAssociatedWithPushStream(stream,pushStream); + assertThatStreamIsNotAssociatedWithPushStream(stream, pushStream); assertThatStreamIsNotInSession(pushStream); } @@ -276,15 +285,15 @@ public class StandardSessionTest setControllerWriteExpectationToFail(false); IStream stream = createStream(); - SynInfo synInfo = new SynInfo(headers,false,stream.getPriority()); - IStream pushStream = (IStream)stream.syn(synInfo).get(5,TimeUnit.SECONDS); - assertThatStreamIsAssociatedWithPushStream(stream,pushStream); + SynInfo synInfo = new SynInfo(headers, false, stream.getPriority()); + IStream pushStream = (IStream)stream.syn(synInfo).get(5, TimeUnit.SECONDS); + assertThatStreamIsAssociatedWithPushStream(stream, pushStream); assertThatPushStreamIsInSession(pushStream); - pushStream.headers(new HeadersInfo(headers,true)); + pushStream.headers(new HeadersInfo(headers, true)); assertThatPushStreamIsNotInSession(pushStream); assertThatPushStreamIsHalfClosed(pushStream); assertThatPushStreamIsClosed(pushStream); - assertThatStreamIsNotAssociatedWithPushStream(stream,pushStream); + assertThatStreamIsNotAssociatedWithPushStream(stream, pushStream); } @Test @@ -294,11 +303,11 @@ public class StandardSessionTest final CountDownLatch createdListenerCalledLatch = new CountDownLatch(1); final CountDownLatch closedListenerCalledLatch = new CountDownLatch(1); - session.addListener(new TestStreamListener(createdListenerCalledLatch,closedListenerCalledLatch)); + session.addListener(new TestStreamListener(createdListenerCalledLatch, closedListenerCalledLatch)); IStream stream = createStream(); - session.onDataFrame(new DataFrame(stream.getId(),SynInfo.FLAG_CLOSE,128),ByteBuffer.allocate(128)); - stream.data(new StringDataInfo("close",true)); - assertThat("onStreamCreated listener has been called",createdListenerCalledLatch.await(5,TimeUnit.SECONDS),is(true)); + session.onDataFrame(new DataFrame(stream.getId(), SynInfo.FLAG_CLOSE, 128), ByteBuffer.allocate(128)); + stream.data(new StringDataInfo("close", true)); + assertThat("onStreamCreated listener has been called", createdListenerCalledLatch.await(5, TimeUnit.SECONDS), is(true)); assertThatOnStreamClosedListenerHasBeenCalled(closedListenerCalledLatch); } @@ -308,9 +317,9 @@ public class StandardSessionTest setControllerWriteExpectationToFail(false); final CountDownLatch closedListenerCalledLatch = new CountDownLatch(1); - session.addListener(new TestStreamListener(null,closedListenerCalledLatch)); + session.addListener(new TestStreamListener(null, closedListenerCalledLatch)); IStream stream = createStream(); - session.rst(new RstInfo(stream.getId(),StreamStatus.CANCEL_STREAM)); + session.rst(new RstInfo(stream.getId(), StreamStatus.CANCEL_STREAM)); assertThatOnStreamClosedListenerHasBeenCalled(closedListenerCalledLatch); } @@ -321,12 +330,12 @@ public class StandardSessionTest final CountDownLatch createdListenerCalledLatch = new CountDownLatch(2); final CountDownLatch closedListenerCalledLatch = new CountDownLatch(1); - session.addListener(new TestStreamListener(createdListenerCalledLatch,closedListenerCalledLatch)); + session.addListener(new TestStreamListener(createdListenerCalledLatch, closedListenerCalledLatch)); IStream stream = createStream(); IStream pushStream = createPushStream(stream); - session.data(pushStream,new StringDataInfo("close",true),5,TimeUnit.SECONDS,new Callback.Adapter()); + session.data(pushStream, new StringDataInfo("close", true), 5, TimeUnit.SECONDS, new Callback.Adapter()); assertThat("onStreamCreated listener has been called twice. Once for the stream and once for the pushStream", - createdListenerCalledLatch.await(5,TimeUnit.SECONDS),is(true)); + createdListenerCalledLatch.await(5, TimeUnit.SECONDS), is(true)); assertThatOnStreamClosedListenerHasBeenCalled(closedListenerCalledLatch); } @@ -336,10 +345,10 @@ public class StandardSessionTest setControllerWriteExpectationToFail(false); final CountDownLatch closedListenerCalledLatch = new CountDownLatch(1); - session.addListener(new TestStreamListener(null,closedListenerCalledLatch)); + session.addListener(new TestStreamListener(null, closedListenerCalledLatch)); IStream stream = createStream(); IStream pushStream = createPushStream(stream); - session.rst(new RstInfo(pushStream.getId(),StreamStatus.CANCEL_STREAM)); + session.rst(new RstInfo(pushStream.getId(), StreamStatus.CANCEL_STREAM)); assertThatOnStreamClosedListenerHasBeenCalled(closedListenerCalledLatch); } @@ -377,9 +386,9 @@ public class StandardSessionTest { setControllerWriteExpectationToFail(false); - IStream stream = (IStream)session.syn(new SynInfo(false),new StreamFrameListener.Adapter()).get(); - stream.updateCloseState(true,false); - assertThat("stream is half closed from remote side",stream.isHalfClosed(),is(true)); + IStream stream = (IStream)session.syn(new SynInfo(false), new StreamFrameListener.Adapter()).get(); + stream.updateCloseState(true, false); + assertThat("stream is half closed from remote side", stream.isHalfClosed(), is(true)); stream.process(new ByteBufferDataInfo(ByteBuffer.allocate(256), true)); } @@ -389,18 +398,18 @@ public class StandardSessionTest setControllerWriteExpectationToFail(false); final CountDownLatch onDataCalledLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(false),new StreamFrameListener.Adapter() + Stream stream = session.syn(new SynInfo(false), new StreamFrameListener.Adapter() { @Override public void onData(Stream stream, DataInfo dataInfo) { onDataCalledLatch.countDown(); - super.onData(stream,dataInfo); + super.onData(stream, dataInfo); } - }).get(5,TimeUnit.SECONDS); - session.onControlFrame(new SynReplyFrame(SPDY.V2,SynInfo.FLAG_CLOSE,stream.getId(),headers)); - session.onDataFrame(new DataFrame(stream.getId(),(byte)0,0),ByteBuffer.allocate(128)); - assertThat("onData is never called",onDataCalledLatch.await(1,TimeUnit.SECONDS),not(true)); + }).get(5, TimeUnit.SECONDS); + session.onControlFrame(new SynReplyFrame(SPDY.V2, SynInfo.FLAG_CLOSE, stream.getId(), headers)); + session.onDataFrame(new DataFrame(stream.getId(), (byte)0, 0), ByteBuffer.allocate(128)); + assertThat("onData is never called", onDataCalledLatch.await(1, TimeUnit.SECONDS), not(true)); } @SuppressWarnings("unchecked") @@ -424,97 +433,173 @@ public class StandardSessionTest // first data frame should fail on controller.write() stream.data(new StringDataInfo("data", false), 5, TimeUnit.SECONDS, callback); - // second data frame should fail without controller.writer() as the connection is expected to be broken after first controller.write() call failed. + // second data frame should fail without controller.write() as the connection is expected to be broken after first controller.write() call failed. stream.data(new StringDataInfo("data", false), 5, TimeUnit.SECONDS, callback); verify(controller, times(1)).write(any(ByteBuffer.class), any(Callback.class)); assertThat("Callback.failed has been called twice", failedCalledLatch.await(5, TimeUnit.SECONDS), is(true)); } + @Test + public void testHeaderFramesAreSentInTheOrderTheyAreCreated() throws ExecutionException, + TimeoutException, InterruptedException + { + testHeaderFramesAreSentInOrder((byte)0, (byte)0, (byte)0); + } + + @Test + public void testHeaderFramesAreSentInTheOrderTheyAreCreatedWithPrioritization() throws ExecutionException, + TimeoutException, InterruptedException + { + testHeaderFramesAreSentInOrder((byte)0, (byte)1, (byte)2); + } + + private void testHeaderFramesAreSentInOrder(final byte priority0, final byte priority1, final byte priority2) throws InterruptedException, ExecutionException + { + final StandardSession testLocalSession = new StandardSession(SPDY.V2, bufferPool, threadPool, scheduler, + new ControllerMock(), null, 1, null, generator, new FlowControlStrategy.None()); + HashSet<Future> tasks = new HashSet<>(); + + int numberOfTasksToRun = 128; + for (int i = 0; i < numberOfTasksToRun; i++) + { + tasks.add(threadPool.submit(new Runnable() + { + + @Override + public void run() + { + synStream(priority0); + synStream(priority1); + synStream(priority2); + } + + private void synStream(byte priority) + { + SynInfo synInfo = new SynInfo(headers, false, priority); + testLocalSession.syn(synInfo, new StreamFrameListener.Adapter()); + } + })); + } + + for (Future task : tasks) + { + task.get(); + } + + threadPool.shutdown(); + threadPool.awaitTermination(60, TimeUnit.SECONDS); + } + + private class ControllerMock implements Controller + { + long lastStreamId = 0; + + @Override + public void write(ByteBuffer buffer, Callback callback) + { + StandardSession.FrameBytes frameBytes = (StandardSession.FrameBytes)callback; + + int streamId = frameBytes.getStream().getId(); + LOG.debug("last: {}, current: {}", lastStreamId, streamId); + if (lastStreamId < streamId) + lastStreamId = streamId; + else + throw new IllegalStateException("Last streamId: " + lastStreamId + " is not smaller than current StreamId: " + + streamId); + frameBytes.succeeded(); + } + + @Override + public void close(boolean onlyOutput) + { + } + } + private IStream createStream() throws InterruptedException, ExecutionException, TimeoutException { - SynInfo synInfo = new SynInfo(headers,false,(byte)0); - return (IStream)session.syn(synInfo,new StreamFrameListener.Adapter()).get(50,TimeUnit.SECONDS); + SynInfo synInfo = new SynInfo(headers, false, (byte)0); + return (IStream)session.syn(synInfo, new StreamFrameListener.Adapter()).get(50, TimeUnit.SECONDS); } private IStream createPushStream(Stream stream) throws InterruptedException, ExecutionException, TimeoutException { - SynInfo synInfo = new SynInfo(headers,false,stream.getPriority()); - return (IStream)stream.syn(synInfo).get(5,TimeUnit.SECONDS); + SynInfo synInfo = new SynInfo(headers, false, stream.getPriority()); + return (IStream)stream.syn(synInfo).get(5, TimeUnit.SECONDS); } private void assertThatStreamIsClosed(IStream stream) { - assertThat("stream is closed",stream.isClosed(),is(true)); + assertThat("stream is closed", stream.isClosed(), is(true)); } private void assertThatStreamIsReset(IStream stream) { - assertThat("stream is reset",stream.isReset(),is(true)); + assertThat("stream is reset", stream.isReset(), is(true)); } private void assertThatStreamIsNotInSession(IStream stream) { - assertThat("stream is not in session",session.getStreams().contains(stream),not(true)); + assertThat("stream is not in session", session.getStreams().contains(stream), not(true)); } private void assertThatStreamIsInSession(IStream stream) { - assertThat("stream is in session",session.getStreams().contains(stream),is(true)); + assertThat("stream is in session", session.getStreams().contains(stream), is(true)); } private void assertThatStreamIsNotClosed(IStream stream) { - assertThat("stream is not closed",stream.isClosed(),not(true)); + assertThat("stream is not closed", stream.isClosed(), not(true)); } private void assertThatStreamIsNotHalfClosed(IStream stream) { - assertThat("stream is not halfClosed",stream.isHalfClosed(),not(true)); + assertThat("stream is not halfClosed", stream.isHalfClosed(), not(true)); } private void assertThatPushStreamIsNotClosed(Stream pushStream) { - assertThat("pushStream is not closed",pushStream.isClosed(),not(true)); + assertThat("pushStream is not closed", pushStream.isClosed(), not(true)); } private void assertThatStreamIsHalfClosed(IStream stream) { - assertThat("stream is halfClosed",stream.isHalfClosed(),is(true)); + assertThat("stream is halfClosed", stream.isHalfClosed(), is(true)); } private void assertThatStreamIsNotAssociatedWithPushStream(IStream stream, IStream pushStream) { - assertThat("pushStream is removed from parent",stream.getPushedStreams().contains(pushStream),not(true)); + assertThat("pushStream is removed from parent", stream.getPushedStreams().contains(pushStream), not(true)); } private void assertThatPushStreamIsNotInSession(Stream pushStream) { - assertThat("pushStream is not in session",session.getStreams().contains(pushStream),not(true)); + assertThat("pushStream is not in session", session.getStreams().contains(pushStream), not(true)); } private void assertThatPushStreamIsInSession(Stream pushStream) { - assertThat("pushStream is in session",session.getStreams().contains(pushStream),is(true)); + assertThat("pushStream is in session", session.getStreams().contains(pushStream), is(true)); } private void assertThatStreamIsAssociatedWithPushStream(IStream stream, Stream pushStream) { - assertThat("stream is associated with pushStream",stream.getPushedStreams().contains(pushStream),is(true)); + assertThat("stream is associated with pushStream", stream.getPushedStreams().contains(pushStream), is(true)); } private void assertThatPushStreamIsClosed(Stream pushStream) { - assertThat("pushStream is closed",pushStream.isClosed(),is(true)); + assertThat("pushStream is closed", pushStream.isClosed(), is(true)); } private void assertThatPushStreamIsHalfClosed(Stream pushStream) { - assertThat("pushStream is half closed ",pushStream.isHalfClosed(),is(true)); + assertThat("pushStream is half closed ", pushStream.isHalfClosed(), is(true)); } private void assertThatOnStreamClosedListenerHasBeenCalled(final CountDownLatch closedListenerCalledLatch) throws InterruptedException { - assertThat("onStreamClosed listener has been called",closedListenerCalledLatch.await(5,TimeUnit.SECONDS),is(true)); + assertThat("onStreamClosed listener has been called", closedListenerCalledLatch.await(5, TimeUnit.SECONDS), is(true)); } } diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/Callback.java b/jetty-util/src/main/java/org/eclipse/jetty/util/Callback.java index 065ca71cf2..a6fbfc447b 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/Callback.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/Callback.java @@ -41,8 +41,6 @@ import org.eclipse.jetty.util.log.Log; * * <p>Semantically this is equivalent to an optimise Promise<Void>, but callback is a more meaningful * name than EmptyPromise</p> - * - * @param <C> the type of the context object */ public interface Callback { @@ -61,8 +59,6 @@ public interface Callback /** * <p>Empty implementation of {@link Callback}</p> - * - * @param <C> the type of the context object */ public static class Adapter implements Callback { |