package integration.api.throttling;
import integration.VertxNubesTestBase;
import io.vertx.ext.unit.Async;
import io.vertx.ext.unit.TestContext;
import org.junit.Test;
import static io.vertx.core.http.HttpHeaders.ACCEPT;
public class ThrottlingTest extends VertxNubesTestBase {
@Test
public void singleRequest(TestContext context) {
Async async = context.async();
client().get("/throttling/dog", response -> {
context.assertEquals(200, response.statusCode());
async.complete();
}).putHeader(ACCEPT, "application/json").end();
}
@Test
public void twoRequests(TestContext context) {
Async async = context.async();
client().get("/throttling/dog", firstResponse -> {
context.assertEquals(200, firstResponse.statusCode());
client().get("/throttling/dog", secondResponse -> {
context.assertEquals(200, secondResponse.statusCode());
async.complete();
}).putHeader(ACCEPT, "application/json").end();
}).putHeader(ACCEPT, "application/json").end();
}
@Test
public void threeRequests(TestContext context) {
Async async = context.async();
client().get("/throttling/dog", firstResponse -> {
context.assertEquals(200, firstResponse.statusCode());
client().get("/throttling/dog", secondResponse -> {
context.assertEquals(200, secondResponse.statusCode());
client().get("/throttling/dog", thirdResponse -> {
context.assertEquals(420, thirdResponse.statusCode());
async.complete();
}).putHeader(ACCEPT, "application/json").end();
}).putHeader(ACCEPT, "application/json").end();
}).putHeader(ACCEPT, "application/json").end();
}
/**
* TODO : this must be the perfect example for using a testsuite instead of nested lambdas ??
*/
public void testAndWait(TestContext context) {
Async async = context.async();
client().get("/throttling/dog", firstResponse -> {
context.assertEquals(200, firstResponse.statusCode());
client().get("/throttling/dog", secondResponse -> {
context.assertEquals(200, secondResponse.statusCode());
client().get("/throttling/dog", thirdResponse -> {
context.assertEquals(420, thirdResponse.statusCode());
vertx.executeBlocking(future -> {
try {
Thread.sleep(10000);
future.complete();
} catch (Exception e) {}
}, res -> {
client().get("/throttling/dog", fourthResponse -> {
context.assertEquals(200, fourthResponse.statusCode());
async.complete();
}).putHeader(ACCEPT, "application/json").end();
});
}).putHeader(ACCEPT, "application/json").end();
}).putHeader(ACCEPT, "application/json").end();
}).putHeader(ACCEPT, "application/json").end();
}
@Test
public void publicRequests(TestContext context) {
Async async = context.async();
client().get("/throttling/notThrottled", firstResponse -> {
context.assertEquals(200, firstResponse.statusCode());
client().get("/throttling/notThrottled", secondResponse -> {
context.assertEquals(200, secondResponse.statusCode());
client().get("/throttling/dog", thirdResponse -> {
context.assertEquals(200, thirdResponse.statusCode());
async.complete();
}).putHeader(ACCEPT, "application/json").end();
}).putHeader(ACCEPT, "application/json").end();
}).putHeader(ACCEPT, "application/json").end();
}
/**
* TODO : we MUST check that another client is not blocked by a first client
* TODO : how to forge a fake remoteHost for vertx.createClient() ?
*/
}