409796 fix and cleanup ReferrerPushStrategy. There's more work to do here, so it remains @Ignore for now

This commit is contained in:
Thomas Becker 2013-06-07 18:12:00 +02:00
parent 2ff8962f9f
commit 654dc1e007
1 changed files with 96 additions and 38 deletions

View File

@ -70,6 +70,8 @@ import static org.junit.Assert.assertThat;
@Ignore @Ignore
public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest
{ {
private static final Logger LOG = Log.getLogger(ReferrerPushStrategyTest.class);
private final int referrerPushPeriod = 1000; private final int referrerPushPeriod = 1000;
private final String mainResource = "/index.html"; private final String mainResource = "/index.html";
private final String cssResource = "/style.css"; private final String cssResource = "/style.css";
@ -111,42 +113,42 @@ public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest
@Test @Test
public void testPushHeadersAreValid() throws Exception public void testPushHeadersAreValid() throws Exception
{ {
sendMainRequestAndCSSRequest(null); sendMainRequestAndCSSRequest(null, false);
run2ndClientRequests(true, true); run2ndClientRequests(true, true);
} }
@Test @Test
public void testClientResetsPushStreams() throws Exception public void testClientResetsPushStreams() throws Exception
{ {
sendMainRequestAndCSSRequest(null); sendMainRequestAndCSSRequest(null, false);
final CountDownLatch pushDataLatch = new CountDownLatch(1); final CountDownLatch pushDataLatch = new CountDownLatch(1);
final CountDownLatch pushSynHeadersValid = new CountDownLatch(1); final CountDownLatch pushSynHeadersValid = new CountDownLatch(1);
Session session = startClient(version, serverAddress, null); Session session = startClient(version, serverAddress, null);
// Send main request. That should initiate the push push's which get reset by the client // Send main request. That should initiate the push push's which get reset by the client
sendRequest(session, mainRequestHeaders, pushSynHeadersValid, pushDataLatch); sendRequest(session, mainRequestHeaders, pushSynHeadersValid, pushDataLatch, true);
assertThat("No push data is received", pushDataLatch.await(1, TimeUnit.SECONDS), is(false)); assertThat("No push data is received", pushDataLatch.await(1, TimeUnit.SECONDS), is(false));
assertThat("Push push headers valid", pushSynHeadersValid.await(5, TimeUnit.SECONDS), is(true)); assertThat("Push push headers valid", pushSynHeadersValid.await(5, TimeUnit.SECONDS), is(true));
sendRequest(session, associatedCSSRequestHeaders, pushSynHeadersValid, pushDataLatch); sendRequest(session, associatedCSSRequestHeaders, pushSynHeadersValid, pushDataLatch, true);
} }
@Test @Test
public void testUserAgentBlackList() throws Exception public void testUserAgentBlackList() throws Exception
{ {
pushStrategy.setUserAgentBlacklist(Arrays.asList(".*(?i)firefox/16.*")); pushStrategy.setUserAgentBlacklist(Arrays.asList(".*(?i)firefox/16.*"));
sendMainRequestAndCSSRequest(null); sendMainRequestAndCSSRequest(null, false);
run2ndClientRequests(false, false); run2ndClientRequests(false, false);
} }
@Test @Test
public void testReferrerPushPeriod() throws Exception public void testReferrerPushPeriod() throws Exception
{ {
Session session = sendMainRequestAndCSSRequest(null); Session session = sendMainRequestAndCSSRequest(null, false);
// Sleep for pushPeriod This should prevent application.js from being mapped as pushResource // Sleep for pushPeriod This should prevent application.js from being mapped as pushResource
Thread.sleep(referrerPushPeriod + 1); Thread.sleep(referrerPushPeriod + 1);
sendRequest(session, associatedJSRequestHeaders, null, null); sendRequest(session, associatedJSRequestHeaders, null, null, false);
run2ndClientRequests(false, true); run2ndClientRequests(false, true);
} }
@ -155,14 +157,69 @@ public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest
public void testMaxAssociatedResources() throws Exception public void testMaxAssociatedResources() throws Exception
{ {
pushStrategy.setMaxAssociatedResources(1); pushStrategy.setMaxAssociatedResources(1);
connector.addConnectionFactory(defaultFactory); Session session = sendMainRequestAndCSSRequest(null, false);
connector.setDefaultProtocol(defaultFactory.getProtocol()); // TODO I don't think this is right sendRequest(session, associatedJSRequestHeaders, null, null, false);
Session session = sendMainRequestAndCSSRequest(null); final CountDownLatch mainStreamLatch = new CountDownLatch(2);
final CountDownLatch pushDataLatch = new CountDownLatch(2);
final CountDownLatch pushSynHeadersValid = new CountDownLatch(1);
final CountDownLatch pushResponseHeaders = new CountDownLatch(1);
Session session2 = startClient(version, serverAddress, null);
session2.syn(new SynInfo(mainRequestHeaders, true), new StreamFrameListener.Adapter()
{
@Override
public StreamFrameListener onPush(Stream stream, PushInfo pushInfo)
{
validateHeaders(pushInfo.getHeaders(), pushSynHeadersValid);
sendRequest(session, associatedJSRequestHeaders, null, null); assertThat("Stream is unidirectional", stream.isUnidirectional(), is(true));
assertThat("URI header ends with css", pushInfo.getHeaders().get(HTTPSPDYHeader.URI.name(version))
.value().endsWith
("" +
".css"),
is(true));
return new StreamFrameListener.Adapter()
{
@Override
public void onHeaders(Stream stream, HeadersInfo headersInfo)
{
Fields headers = headersInfo.getHeaders();
if (validateHeader(headers, HTTPSPDYHeader.STATUS.name(version), "200 OK")
&& validateHeader(headers, HTTPSPDYHeader.VERSION.name(version),
"HTTP/1.1") && validateHeader(headers, "content-encoding", "gzip"))
pushResponseHeaders.countDown();
}
run2ndClientRequests(false, true); @Override
public void onData(Stream stream, DataInfo dataInfo)
{
dataInfo.consume(dataInfo.length());
if (dataInfo.isClose())
pushDataLatch.countDown();
}
};
}
@Override
public void onReply(Stream stream, ReplyInfo replyInfo)
{
assertThat("replyInfo.isClose() is false", replyInfo.isClose(), is(false));
mainStreamLatch.countDown();
}
@Override
public void onData(Stream stream, DataInfo dataInfo)
{
dataInfo.consume(dataInfo.length());
if (dataInfo.isClose())
mainStreamLatch.countDown();
}
});
assertThat("Main request reply and/or data received", mainStreamLatch.await(5, TimeUnit.SECONDS), is(true));
assertThat("Not more than one push is received", pushDataLatch.await(1, TimeUnit.SECONDS), is(false));
assertThat("Push push headers valid", pushSynHeadersValid.await(5, TimeUnit.SECONDS), is(true));
assertThat("Push response headers are valid", pushResponseHeaders.await(5, TimeUnit.SECONDS), is(true));
} }
@Test @Test
@ -206,11 +263,11 @@ public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest
Session pushCacheBuildSession = startClient(version, serverAddress, null); Session pushCacheBuildSession = startClient(version, serverAddress, null);
sendRequest(pushCacheBuildSession, mainRequestHeaders, null, null); sendRequest(pushCacheBuildSession, mainRequestHeaders, null, null, false);
sendRequest(pushCacheBuildSession, associatedCSSRequestHeaders, null, null); sendRequest(pushCacheBuildSession, associatedCSSRequestHeaders, null, null, false);
sendRequest(pushCacheBuildSession, associatedJSRequestHeaders, null, null); sendRequest(pushCacheBuildSession, associatedJSRequestHeaders, null, null, false);
sendRequest(pushCacheBuildSession, createHeaders("/image1.jpg", mainResource), null, null); sendRequest(pushCacheBuildSession, createHeaders("/image1.jpg", mainResource), null, null, false);
sendRequest(pushCacheBuildSession, createHeaders("/image2.jpg", mainResource), null, null); sendRequest(pushCacheBuildSession, createHeaders("/image2.jpg", mainResource), null, null, false);
Session session = startClient(version, serverAddress, null); Session session = startClient(version, serverAddress, null);
@ -251,8 +308,8 @@ public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest
public void testThatPushResourcesAreUnique() throws Exception public void testThatPushResourcesAreUnique() throws Exception
{ {
final CountDownLatch pushReceivedLatch = new CountDownLatch(2); final CountDownLatch pushReceivedLatch = new CountDownLatch(2);
sendMainRequestAndCSSRequest(null); sendMainRequestAndCSSRequest(null, false);
sendMainRequestAndCSSRequest(null); sendMainRequestAndCSSRequest(null, false);
Session session = startClient(version, serverAddress, null); Session session = startClient(version, serverAddress, null);
@ -271,6 +328,7 @@ public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest
} }
@Test @Test
@Ignore
public void testPushResourceAreSentNonInterleaved() throws Exception public void testPushResourceAreSentNonInterleaved() throws Exception
{ {
final CountDownLatch allExpectedPushesReceivedLatch = new CountDownLatch(4); final CountDownLatch allExpectedPushesReceivedLatch = new CountDownLatch(4);
@ -292,11 +350,11 @@ public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest
Session pushCacheBuildSession = startClient(version, bigResponseServerAddress, null); Session pushCacheBuildSession = startClient(version, bigResponseServerAddress, null);
Fields mainResourceHeaders = createHeadersWithoutReferrer(mainResource); Fields mainResourceHeaders = createHeadersWithoutReferrer(mainResource);
sendRequest(pushCacheBuildSession, mainResourceHeaders, null, null); sendRequest(pushCacheBuildSession, mainResourceHeaders, null, null, false);
sendRequest(pushCacheBuildSession, createHeaders("/style.css", mainResource), null, null); sendRequest(pushCacheBuildSession, createHeaders("/style.css", mainResource), null, null, false);
sendRequest(pushCacheBuildSession, createHeaders("/javascript.js", mainResource), null, null); sendRequest(pushCacheBuildSession, createHeaders("/javascript.js", mainResource), null, null, false);
sendRequest(pushCacheBuildSession, createHeaders("/image1.jpg", mainResource), null, null); sendRequest(pushCacheBuildSession, createHeaders("/image1.jpg", mainResource), null, null, false);
sendRequest(pushCacheBuildSession, createHeaders("/image2.jpg", mainResource), null, null); sendRequest(pushCacheBuildSession, createHeaders("/image2.jpg", mainResource), null, null, false);
Session session = startClient(version, bigResponseServerAddress, null); Session session = startClient(version, bigResponseServerAddress, null);
@ -377,21 +435,24 @@ public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest
return startHTTPServer(version, gzipHandler); return startHTTPServer(version, gzipHandler);
} }
private Session sendMainRequestAndCSSRequest(SessionFrameListener sessionFrameListener) throws Exception private Session sendMainRequestAndCSSRequest(SessionFrameListener sessionFrameListener, boolean awaitPush) throws Exception
{ {
Session session = startClient(version, serverAddress, sessionFrameListener); Session session = startClient(version, serverAddress, sessionFrameListener);
sendRequest(session, mainRequestHeaders, null, null); CountDownLatch pushDataLatch = new CountDownLatch(2);
sendRequest(session, associatedCSSRequestHeaders, null, null); sendRequest(session, mainRequestHeaders, null, pushDataLatch, false);
sendRequest(session, associatedCSSRequestHeaders, null, pushDataLatch, false);
if (awaitPush)
assertThat("pushes have been received", pushDataLatch.await(5, TimeUnit.SECONDS), is(true));
return session; return session;
} }
private void sendRequest(Session session, Fields requestHeaders, final CountDownLatch pushSynHeadersValid, private void sendRequest(Session session, Fields requestHeaders, final CountDownLatch pushSynHeadersValid,
final CountDownLatch pushDataLatch) throws InterruptedException final CountDownLatch pushDataLatch, final boolean resetPush) throws InterruptedException
{ {
LOG.info("sendRequest. headers={},resetPush={}", requestHeaders, resetPush);
final CountDownLatch dataReceivedLatch = new CountDownLatch(1); final CountDownLatch dataReceivedLatch = new CountDownLatch(1);
final CountDownLatch received200OKLatch = new CountDownLatch(1);
session.syn(new SynInfo(requestHeaders, true), new StreamFrameListener.Adapter() session.syn(new SynInfo(requestHeaders, true), new StreamFrameListener.Adapter()
{ {
@Override @Override
@ -406,6 +467,7 @@ public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest
("" + ("" +
".css"), ".css"),
is(true)); is(true));
if (resetPush)
stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), new Callback.Adapter()); stream.getSession().rst(new RstInfo(stream.getId(), StreamStatus.REFUSED_STREAM), new Callback.Adapter());
return new StreamFrameListener.Adapter() return new StreamFrameListener.Adapter()
{ {
@ -422,9 +484,7 @@ public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest
@Override @Override
public void onReply(Stream stream, ReplyInfo replyInfo) public void onReply(Stream stream, ReplyInfo replyInfo)
{ {
if ("200 OK".equals(replyInfo.getHeaders().get(HTTPSPDYHeader.STATUS.name(version)).value())) assertThat(replyInfo.getHeaders().get(HTTPSPDYHeader.STATUS.name(version)).value(), is("200 OK"));
received200OKLatch.countDown();
super.onReply(stream, replyInfo);
} }
@Override @Override
@ -435,8 +495,8 @@ public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest
dataReceivedLatch.countDown(); dataReceivedLatch.countDown();
} }
}, new Promise.Adapter<Stream>()); }, new Promise.Adapter<Stream>());
Assert.assertTrue(received200OKLatch.await(5, TimeUnit.SECONDS)); assertThat(dataReceivedLatch.await(5, TimeUnit.SECONDS), is(true));
Assert.assertTrue(dataReceivedLatch.await(5, TimeUnit.SECONDS)); LOG.info("sendRequest done");
} }
private void run2ndClientRequests(final boolean validateHeaders, private void run2ndClientRequests(final boolean validateHeaders,
@ -511,8 +571,6 @@ public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest
} }
} }
private static final Logger LOG = Log.getLogger(ReferrerPushStrategyTest.class);
@Test @Test
public void testAssociatedResourceIsPushed() throws Exception public void testAssociatedResourceIsPushed() throws Exception
{ {
@ -547,7 +605,7 @@ public class ReferrerPushStrategyTest extends AbstractHTTPSPDYTest
}); });
Assert.assertTrue(mainResourceLatch.await(5, TimeUnit.SECONDS)); Assert.assertTrue(mainResourceLatch.await(5, TimeUnit.SECONDS));
sendRequest(session1, createHeaders(cssResource), null, null); sendRequest(session1, createHeaders(cssResource), null, null, false);
// Create another client, and perform the same request for the main resource, we expect the css being pushed // Create another client, and perform the same request for the main resource, we expect the css being pushed