package org.webpieces.http2client;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
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.MockResponseListener;
import org.webpieces.http2client.util.Requests;
import com.webpieces.hpack.api.dto.Http2Headers;
import com.webpieces.http2engine.api.StreamWriter;
import com.webpieces.http2parser.api.dto.DataFrame;
import com.webpieces.http2parser.api.dto.lib.Http2Msg;
import com.webpieces.http2parser.api.dto.lib.PartialStream;
public class TestBasicHttp2Client extends AbstractTest {
@Test
public void testMaxConcurrentOne() throws InterruptedException, ExecutionException {
Http2Headers request1 = Requests.createRequest();
Http2Headers request2 = Requests.createRequest();
MockResponseListener respListener1 = new MockResponseListener();
respListener1.setIncomingRespDefault(CompletableFuture.completedFuture(null));
MockResponseListener respListener2 = new MockResponseListener();
CompletableFuture<StreamWriter> future = httpSocket.send(request1, respListener1);
CompletableFuture<StreamWriter> future2 = httpSocket.send(request2, respListener2);
//max concurrent only 1 so only get 1
Http2Msg req = mockChannel.getFrameAndClear();
Assert.assertEquals(1, req.getStreamId());
Assert.assertEquals(request1, req);
Assert.assertTrue(future.isDone());
Assert.assertFalse(future2.isDone());
Http2Headers resp1 = Requests.createResponse(request1.getStreamId());
mockChannel.write(resp1); //endOfStream=false
PartialStream response1 = respListener1.getSingleReturnValueIncomingResponse();
Assert.assertEquals(resp1, response1);
Assert.assertFalse(future2.isDone());
mockChannel.write(new DataFrame(request1.getStreamId(), false)); //endOfStream=false
respListener1.getSingleReturnValueIncomingResponse();
//at this point, should not have a call outstanding
mockChannel.assertNoIncomingMessages();
Assert.assertFalse(future2.isDone());
mockChannel.write(new DataFrame(request1.getStreamId(), true));//endOfStream = true
Assert.assertTrue(future2.isDone());
respListener1.getSingleReturnValueIncomingResponse();
Http2Msg frame = mockChannel.getFrameAndClear();
Assert.assertEquals(3, frame.getStreamId());
}
@Test
public void testBasicSendRespond() {
Http2Request request1 = Requests.createHttp2Request();
MockResponseListener respListener1 = new MockResponseListener();
respListener1.setIncomingRespDefault(CompletableFuture.completedFuture(null));
CompletableFuture<Http2Response> future = httpSocket.send(request1);
Assert.assertFalse(future.isDone());
}
}