package org.webpieces.http2client;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.junit.Assert;
import org.junit.Test;
import org.webpieces.http2client.api.dto.Http2Request;
import org.webpieces.http2client.api.dto.Http2Response;
import org.webpieces.http2client.mock.MockPushListener;
import org.webpieces.http2client.mock.MockResponseListener;
import org.webpieces.http2client.util.Requests;
import com.webpieces.hpack.api.dto.Http2Headers;
import com.webpieces.http2parser.api.dto.DataFrame;
import com.webpieces.http2parser.api.dto.lib.Http2Msg;
public class TestCBasicRequestResponse extends AbstractTest {
@Test
public void testWithNoData() throws InterruptedException, ExecutionException, TimeoutException {
Http2Request request1 = new Http2Request();
request1.setHeaders(Requests.createRequest());
CompletableFuture<Http2Response> future = httpSocket.send(request1);
Assert.assertFalse(future.isDone());
Http2Headers frame = (Http2Headers) mockChannel.getFrameAndClear();
Assert.assertEquals(1, frame.getStreamId());
Http2Headers resp = Requests.createResponse(request1.getHeaders().getStreamId());
resp.setEndOfStream(true);
mockChannel.write(resp);
Http2Response response = future.get(2, TimeUnit.SECONDS);
Assert.assertEquals(0, response.getPayload().getReadableSize());
}
@Test
public void testWithData() throws InterruptedException, ExecutionException, TimeoutException {
Http2Request request1 = Requests.createHttp2Request();
CompletableFuture<Http2Response> future = httpSocket.send(request1);
Assert.assertFalse(future.isDone());
List<Http2Msg> frames = mockChannel.getFramesAndClear();
Assert.assertEquals(2, frames.size());
Http2Headers resp = Requests.createResponse(request1.getHeaders().getStreamId());
mockChannel.write(resp);
Assert.assertFalse(future.isDone());
DataFrame data = Requests.createData(request1.getHeaders().getStreamId());
mockChannel.write(data);
Http2Response response = future.get(2, TimeUnit.SECONDS);
Assert.assertEquals(2, response.getPayload().getReadableSize());
}
@Test
public void testWithDataAndTrailingHeaders() throws InterruptedException, ExecutionException, TimeoutException {
Http2Request request1 = Requests.createHttp2Request();
Http2Headers trailing = Requests.createRequest();
request1.setTrailingHeaders(trailing);
CompletableFuture<Http2Response> future = httpSocket.send(request1);
Assert.assertFalse(future.isDone());
List<Http2Msg> frames = mockChannel.getFramesAndClear();
Assert.assertEquals(3, frames.size());
Http2Headers resp = Requests.createResponse(request1.getHeaders().getStreamId());
mockChannel.write(resp);
Assert.assertFalse(future.isDone());
DataFrame data = Requests.createData(request1.getHeaders().getStreamId());
data.setEndOfStream(false);
mockChannel.write(data);
Assert.assertFalse(future.isDone());
mockChannel.write(trailing);
Http2Response response = future.get(2, TimeUnit.SECONDS);
Assert.assertEquals(2, response.getPayload().getReadableSize());
Assert.assertNotNull(response.getTrailingHeaders());
}
@Test
public void testPushPromise() {
MockResponseListener listener1 = new MockResponseListener();
listener1.setIncomingRespDefault(CompletableFuture.<Void>completedFuture(null));
Http2Headers request = sendRequestToServer(listener1);
MockPushListener pushListener = new MockPushListener();
sendPushPromise(listener1, pushListener, request.getStreamId(), true);
sendResponseFromServer(listener1, request);
}
}