Watcher: Fix timeout tests
The current HTTP timeout tests had two problems. * Binding to port 9200-9300 * The first request to hit was having a delay, the other ones had not, so if any other component hit the test inbetween (likely in a CI env), the HTTP request from the test itself will not be delayed. Both cases are fixed in this commit. Original commit: elastic/x-pack-elasticsearch@d696e020cc
This commit is contained in:
parent
c7796d5cb7
commit
2daef601d4
|
@ -9,18 +9,15 @@ import com.squareup.okhttp.mockwebserver.Dispatcher;
|
|||
import com.squareup.okhttp.mockwebserver.MockResponse;
|
||||
import com.squareup.okhttp.mockwebserver.MockWebServer;
|
||||
import com.squareup.okhttp.mockwebserver.RecordedRequest;
|
||||
import org.elasticsearch.ElasticsearchException;
|
||||
import org.elasticsearch.ElasticsearchTimeoutException;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.common.unit.TimeValue;
|
||||
import org.elasticsearch.common.util.concurrent.CountDown;
|
||||
import org.elasticsearch.env.Environment;
|
||||
import org.elasticsearch.test.ESTestCase;
|
||||
import org.elasticsearch.watcher.support.http.auth.HttpAuthRegistry;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
|
||||
import java.net.BindException;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
|
@ -33,20 +30,11 @@ import static org.mockito.Mockito.mock;
|
|||
public class HttpReadTimeoutTests extends ESTestCase {
|
||||
|
||||
private MockWebServer webServer;
|
||||
private int webPort;
|
||||
|
||||
@Before
|
||||
public void init() throws Exception {
|
||||
for (webPort = 9200; webPort < 9300; webPort++) {
|
||||
try {
|
||||
webServer = new MockWebServer();
|
||||
webServer.start(webPort);
|
||||
return;
|
||||
} catch (BindException be) {
|
||||
logger.warn("port [{}] was already in use trying next port", webPort);
|
||||
}
|
||||
}
|
||||
throw new ElasticsearchException("unable to find open port between 9200 and 9300");
|
||||
webServer = new MockWebServer();
|
||||
webServer.start();
|
||||
}
|
||||
|
||||
@After
|
||||
|
@ -61,7 +49,7 @@ public class HttpReadTimeoutTests extends ESTestCase {
|
|||
|
||||
// we're not going to enqueue an response... so the server will just hang
|
||||
|
||||
HttpRequest request = HttpRequest.builder("localhost", webPort)
|
||||
HttpRequest request = HttpRequest.builder("localhost", webServer.getPort())
|
||||
.method(HttpMethod.POST)
|
||||
.path("/" + randomAsciiOfLength(5))
|
||||
.build();
|
||||
|
@ -93,19 +81,13 @@ public class HttpReadTimeoutTests extends ESTestCase {
|
|||
.build()
|
||||
, mock(HttpAuthRegistry.class), environment).start();
|
||||
|
||||
final String path = '/' + randomAsciiOfLength(5);
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
webServer.setDispatcher(new Dispatcher() {
|
||||
@Override
|
||||
public MockResponse dispatch(RecordedRequest request) throws InterruptedException {
|
||||
Thread.sleep(5000);
|
||||
latch.countDown();
|
||||
return new MockResponse().setStatus("200");
|
||||
}
|
||||
});
|
||||
webServer.setDispatcher(new CountDownLatchDispatcher(path, latch));
|
||||
|
||||
HttpRequest request = HttpRequest.builder("localhost", webPort)
|
||||
HttpRequest request = HttpRequest.builder("localhost", webServer.getPort())
|
||||
.method(HttpMethod.POST)
|
||||
.path("/" + randomAsciiOfLength(5))
|
||||
.path(path)
|
||||
.build();
|
||||
|
||||
long start = System.nanoTime();
|
||||
|
@ -137,20 +119,14 @@ public class HttpReadTimeoutTests extends ESTestCase {
|
|||
.build()
|
||||
, mock(HttpAuthRegistry.class), environment).start();
|
||||
|
||||
final String path = '/' + randomAsciiOfLength(5);
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
webServer.setDispatcher(new Dispatcher() {
|
||||
@Override
|
||||
public MockResponse dispatch(RecordedRequest request) throws InterruptedException {
|
||||
Thread.sleep(5000);
|
||||
latch.countDown();
|
||||
return new MockResponse().setStatus("200");
|
||||
}
|
||||
});
|
||||
webServer.setDispatcher(new CountDownLatchDispatcher(path, latch));
|
||||
|
||||
HttpRequest request = HttpRequest.builder("localhost", webPort)
|
||||
HttpRequest request = HttpRequest.builder("localhost", webServer.getPort())
|
||||
.readTimeout(TimeValue.timeValueSeconds(5))
|
||||
.method(HttpMethod.POST)
|
||||
.path("/" + randomAsciiOfLength(5))
|
||||
.path(path)
|
||||
.build();
|
||||
|
||||
long start = System.nanoTime();
|
||||
|
@ -173,4 +149,24 @@ public class HttpReadTimeoutTests extends ESTestCase {
|
|||
fail("waited too long for the response to be returned");
|
||||
}
|
||||
}
|
||||
|
||||
private class CountDownLatchDispatcher extends Dispatcher {
|
||||
|
||||
private final String path;
|
||||
private final CountDownLatch latch;
|
||||
|
||||
public CountDownLatchDispatcher(String path, CountDownLatch latch) {
|
||||
this.path = path;
|
||||
this.latch = latch;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MockResponse dispatch(RecordedRequest request) throws InterruptedException {
|
||||
if (path.equals(request.getPath())) {
|
||||
Thread.sleep(5000);
|
||||
latch.countDown();
|
||||
}
|
||||
return new MockResponse().setStatus("200");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue