package cc.blynk.integration.http;
import cc.blynk.integration.BaseTest;
import cc.blynk.server.api.http.HttpAPIServer;
import cc.blynk.server.core.BaseServer;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.List;
import static org.junit.Assert.assertEquals;
/**
* The Blynk Project.
* Created by Dmitriy Dumanskiy.
* Created on 07.01.16.
*/
@RunWith(MockitoJUnitRunner.class)
public class HttpAPIKeepAliveServerTest extends BaseTest {
private BaseServer httpServer;
private CloseableHttpClient httpclient;
private String httpServerUrl;
@After
public void shutdown() throws Exception {
httpclient.close();
httpServer.close();
}
@Before
public void init() throws Exception {
httpServer = new HttpAPIServer(holder).start();
httpServerUrl = String.format("http://localhost:%s/", httpPort);
//this http client doesn't close HTTP connection.
httpclient = HttpClients.custom()
.setConnectionReuseStrategy((response, context) -> true)
.setKeepAliveStrategy((response, context) -> 10000000).build();
}
@Override
public String getDataFolder() {
return getRelativeDataFolder("/profiles");
}
@Test
public void testKeepAlive() throws Exception {
String url = httpServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/a14";
HttpPut request = new HttpPut(url);
request.setHeader("Connection", "keep-alive");
HttpGet getRequest = new HttpGet(url);
getRequest.setHeader("Connection", "keep-alive");
for (int i = 0; i < 100; i++) {
request.setEntity(new StringEntity("[\""+ i + "\"]", ContentType.APPLICATION_JSON));
try (CloseableHttpResponse response = httpclient.execute(request)) {
assertEquals(200, response.getStatusLine().getStatusCode());
assertEquals("keep-alive", response.getFirstHeader("Connection").getValue());
EntityUtils.consume(response.getEntity());
}
try (CloseableHttpResponse response2 = httpclient.execute(getRequest)) {
assertEquals(200, response2.getStatusLine().getStatusCode());
List<String> values = consumeJsonPinValues(response2);
assertEquals("keep-alive", response2.getFirstHeader("Connection").getValue());
assertEquals(1, values.size());
assertEquals(String.valueOf(i), values.get(0));
}
}
}
@Test(expected = NoHttpResponseException.class)
public void keepAliveIsSupported() throws Exception{
String url = httpServerUrl + "4ae3851817194e2596cf1b7103603ef8/pin/a14";
HttpPut request = new HttpPut(url);
request.setHeader("Connection", "close");
request.setEntity(new StringEntity("[\""+ 0 + "\"]", ContentType.APPLICATION_JSON));
try (CloseableHttpResponse response = httpclient.execute(request)) {
assertEquals(200, response.getStatusLine().getStatusCode());
assertEquals("close", response.getFirstHeader("Connection").getValue());
EntityUtils.consume(response.getEntity());
}
request = new HttpPut(url);
request.setHeader("Connection", "close");
request.setEntity(new StringEntity("[\""+ 0 + "\"]", ContentType.APPLICATION_JSON));
//this should fail as connection is closed and httpClient is reusing connections
try (CloseableHttpResponse response = httpclient.execute(request)) {
assertEquals(200, response.getStatusLine().getStatusCode());
}
}
}