io.gatling.http.client.BasicHttpTest.java Source code

Java tutorial

Introduction

Here is the source code for io.gatling.http.client.BasicHttpTest.java

Source

/*
 * Copyright 2011-2018 GatlingCorp (https://gatling.io)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package io.gatling.http.client;

import io.gatling.http.client.body.*;
import io.gatling.http.client.body.bytearray.ByteArrayRequestBodyBuilder;
import io.gatling.http.client.body.bytearrays.ByteArraysRequestBodyBuilder;
import io.gatling.http.client.body.file.FileRequestBodyBuilder;
import io.gatling.http.client.body.form.FormUrlEncodedRequestBodyBuilder;
import io.gatling.http.client.body.is.InputStreamRequestBodyBuilder;
import io.gatling.http.client.body.multipart.*;
import io.gatling.http.client.body.string.StringRequestBodyBuilder;
import io.gatling.http.client.test.TestServer;
import io.gatling.http.client.test.HttpTest;
import io.gatling.http.client.test.listener.TestListener;
import io.gatling.http.client.ahc.uri.Uri;
import io.netty.handler.codec.http.DefaultHttpHeaders;
import io.netty.handler.codec.http.HttpHeaderValues;
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpMethod;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutionException;

import static io.gatling.http.client.test.TestUtils.*;
import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_LENGTH;
import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_TYPE;
import static io.netty.handler.codec.http.HttpHeaderNames.TRANSFER_ENCODING;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.Collections.singletonList;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.junit.jupiter.api.Assertions.*;

class BasicHttpTest extends HttpTest {

    private static TestServer server;

    @BeforeAll
    static void start() throws Throwable {
        server = new TestServer();
        server.start();
    }

    @AfterAll
    static void stop() throws Throwable {
        server.close();
    }

    private static String getTargetUrl() {
        return server.getHttpUrl() + "/foo/bar";
    }

    private File getTestFile() throws Throwable {
        return new File(Objects.requireNonNull(BasicHttpTest.class.getResource("/test.txt")).toURI());
    }

    @Test
    void testGetResponseBody() throws Throwable {
        withClient().run(client -> withServer(server).run(server -> {
            final String sentBody = "Hello World";

            server.enqueueResponse(response -> {
                response.setStatus(200);
                response.setContentType(TEXT_HTML_CONTENT_TYPE_WITH_UTF_8_CHARSET);
                writeResponseBody(response, sentBody);
            });

            Request request = new RequestBuilder(HttpMethod.GET, Uri.create(getTargetUrl())).build();
            client.test(request, 0, new TestListener() {
                @Override
                public void onComplete0() {
                    assertEquals(200, status.code());
                    String contentLengthHeader = headers.get(CONTENT_LENGTH);
                    assertNotNull(contentLengthHeader);
                    assertEquals(sentBody.length(), Integer.parseInt(contentLengthHeader));
                    assertContentTypesEquals(headers.get(CONTENT_TYPE), TEXT_HTML_CONTENT_TYPE_WITH_UTF_8_CHARSET);
                    assertEquals(sentBody, responseBody());
                }
            }).get(TIMEOUT_SECONDS, SECONDS);
        }));
    }

    @Test
    void testGetWithHeaders() throws Throwable {
        withClient().run(client -> withServer(server).run(server -> {

            server.enqueueEcho();
            HttpHeaders h = new DefaultHttpHeaders();

            for (int i = 1; i < 5; i++) {
                h.add("Test" + i, "Test" + i);
            }

            Request request = new RequestBuilder(HttpMethod.GET, Uri.create(getTargetUrl())).setHeaders(h).build();

            client.test(request, 0, new TestListener() {
                @Override
                public void onComplete0() {
                    for (int i = 1; i < 5; i++) {
                        assertEquals("Test" + i, headers.get("X-Test" + i));
                    }
                }
            }).get(TIMEOUT_SECONDS, SECONDS);
        }));
    }

    @Test
    void testPostWithHeadersAndFormParams() throws Throwable {
        withClient().run(client -> withServer(server).run(server -> {
            HttpHeaders h = new DefaultHttpHeaders();
            h.add(CONTENT_TYPE, HttpHeaderValues.APPLICATION_X_WWW_FORM_URLENCODED);

            List<Param> formParams = new ArrayList<>();
            for (int i = 0; i < 5; i++) {
                formParams.add(new Param("param_" + i, "value_" + i));
            }

            Request request = new RequestBuilder(HttpMethod.POST, Uri.create(getTargetUrl())).setHeaders(h)
                    .setBodyBuilder(new FormUrlEncodedRequestBodyBuilder(formParams)).build();

            server.enqueueEcho();

            client.test(request, 0, new TestListener() {

                @Override
                public void onComplete0() {
                    assertEquals(200, status.code());
                    for (int i = 1; i < 5; i++) {
                        assertEquals(headers.get("X-param_" + i), "value_" + i);
                    }
                }
            }).get(TIMEOUT_SECONDS, SECONDS);
        }));
    }

    @Test
    void testHeadHasEmptyBody() throws Throwable {
        withClient().run(client -> withServer(server).run(server -> {
            server.enqueueOk();
            Request request = new RequestBuilder(HttpMethod.HEAD, Uri.create(getTargetUrl())).build();
            client.test(request, 0, new TestListener() {
                @Override
                public void onComplete0() {
                    assertEquals(200, status.code());
                    assertNull(chunks);
                }
            }).get(TIMEOUT_SECONDS, SECONDS);
        }));
    }

    @Test
    void testJettyRespondsWithChunkedTransferEncoding() throws Throwable {
        withClient().run(client -> withServer(server).run(server -> {
            server.enqueueEcho();
            Request request = new RequestBuilder(HttpMethod.GET, Uri.create(getTargetUrl())).build();
            client.test(request, 0, new TestListener() {
                @Override
                public void onComplete0() {
                    assertEquals(200, status.code());
                    assertEquals(HttpHeaderValues.CHUNKED.toString(), headers.get(TRANSFER_ENCODING));
                }
            }).get(TIMEOUT_SECONDS, SECONDS);
        }));
    }

    @Test
    void testSendRequestWithByteArrayBody() throws Throwable {
        withClient().run(client -> withServer(server).run(server -> {
            server.enqueueEcho();
            RequestBodyBuilder byteArrayBody = new ByteArrayRequestBodyBuilder("foo".getBytes(UTF_8));
            Request request = new RequestBuilder(HttpMethod.GET, Uri.create(getTargetUrl()))
                    .setFixUrlEncoding(false).setBodyBuilder(byteArrayBody).build();
            client.test(request, 0, new TestListener() {
                @Override
                public void onComplete0() {
                    assertEquals(200, status.code());
                    assertEquals("foo", responseBody());
                }
            }).get(TIMEOUT_SECONDS, SECONDS);
        }));
    }

    @Test
    void testSendRequestWithByteArraysBody() throws Throwable {
        withClient().run(client -> withServer(server).run(server -> {
            server.enqueueEcho();
            RequestBodyBuilder byteArraysBody = new ByteArraysRequestBodyBuilder(
                    new byte[][] { "foo".getBytes(UTF_8) });
            Request request = new RequestBuilder(HttpMethod.GET, Uri.create(getTargetUrl()))
                    .setBodyBuilder(byteArraysBody).build();
            client.test(request, 0, new TestListener() {
                @Override
                public void onComplete0() {
                    assertEquals(200, status.code());
                    assertEquals("foo", responseBody());
                }
            }).get(TIMEOUT_SECONDS, SECONDS);
        }));
    }

    @Test
    void testSendRequestWithFileBody() throws Throwable {
        withClient().run(client -> withServer(server).run(server -> {
            server.enqueueEcho();
            RequestBodyBuilder fileBody = new FileRequestBodyBuilder(getTestFile());
            Request request = new RequestBuilder(HttpMethod.GET, Uri.create(getTargetUrl()))
                    .setBodyBuilder(fileBody).build();
            client.test(request, 0, new TestListener() {
                @Override
                public void onComplete0() {
                    assertEquals(200, status.code());
                    assertEquals("foobar", responseBody());
                }
            }).get(TIMEOUT_SECONDS, SECONDS);
        }));
    }

    @Test
    void testSendRequestWithFormUrlBody() throws Throwable {
        withClient().run(client -> withServer(server).run(server -> {
            server.enqueueEcho();
            List<Param> formParams = new ArrayList<>();
            formParams.add(new Param("foo", "bar"));
            RequestBodyBuilder formUrlEncodedBody = new FormUrlEncodedRequestBodyBuilder(formParams);
            Request request = new RequestBuilder(HttpMethod.GET, Uri.create(getTargetUrl()))
                    .setBodyBuilder(formUrlEncodedBody).build();
            client.test(request, 0, new TestListener() {
                @Override
                public void onComplete0() {
                    assertEquals(200, status.code());
                    assertEquals("foo=bar", responseBody());
                }
            }).get(TIMEOUT_SECONDS, SECONDS);
        }));
    }

    @Test
    void testSendRequestWithInputStreamBody() throws Throwable {
        withClient().run(client -> withServer(server).run(server -> {
            server.enqueueEcho();
            RequestBodyBuilder inputStreamBody = new InputStreamRequestBodyBuilder(
                    new ByteArrayInputStream("foo".getBytes(UTF_8)));
            Request request = new RequestBuilder(HttpMethod.GET, Uri.create(getTargetUrl()))
                    .setBodyBuilder(inputStreamBody).build();
            client.test(request, 0, new TestListener() {
                @Override
                public void onComplete0() {
                    assertEquals(200, status.code());
                    assertEquals("foo", responseBody());
                }
            }).get(TIMEOUT_SECONDS, SECONDS);
        }));
    }

    @Test
    void testSendRequestWithStringBody() throws Throwable {
        withClient().run(client -> withServer(server).run(server -> {
            server.enqueueEcho();
            RequestBodyBuilder stringBody = new StringRequestBodyBuilder("foo");
            Request request = new RequestBuilder(HttpMethod.GET, Uri.create(getTargetUrl()))
                    .setBodyBuilder(stringBody).build();
            client.test(request, 0, new TestListener() {
                @Override
                public void onComplete0() {
                    assertEquals(200, status.code());
                    assertEquals("foo", responseBody());
                }
            }).get(TIMEOUT_SECONDS, SECONDS);
        }));
    }

    @Test
    void testSendRequestWithMultipartFormDataBody() throws Throwable {
        withClient().run(client -> withServer(server).run(server -> {
            server.enqueueEcho();
            List<Part<?>> multiparts = new ArrayList<>();
            multiparts.add(new StringPart("part1", "foo", UTF_8, null, null, null, null));
            multiparts.add(new FilePart("part2", getTestFile(), UTF_8, null, null, null, null, null, null));
            multiparts.add(new ByteArrayPart("part3", "foo".getBytes(), UTF_8, null, null, null, null, null, null));
            RequestBodyBuilder multipartFormDataBody = new MultipartFormDataRequestBodyBuilder(multiparts);
            Request request = new RequestBuilder(HttpMethod.GET, Uri.create(getTargetUrl()))
                    .setBodyBuilder(multipartFormDataBody).build();

            long minimalLength = getTestFile().length() + 2 * "foo".length() + 3 * 30; // file + 2 * foo + 3 * multipart boundary

            client.test(request, 0, new TestListener() {
                @Override
                public void onComplete0() {
                    assertEquals(200, status.code());
                    assertTrue(responseBody().length() > minimalLength);
                }
            }).get(TIMEOUT_SECONDS, SECONDS);
        }));
    }

    @Test()
    void listenererIsNotifiedOfRequestBuildExceptions() throws Throwable {
        withClient().run(client -> withServer(server).run(server -> {
            server.enqueueEcho();
            // Charset is mandatory and will trigger a NPE
            StringPart part = new StringPart("part1", "foo", null, null, null, null, null);
            RequestBodyBuilder multipartFormDataBody = new MultipartFormDataRequestBodyBuilder(singletonList(part));
            Request request = new RequestBuilder(HttpMethod.GET, Uri.create(getTargetUrl()))
                    .setBodyBuilder(multipartFormDataBody).build();

            assertThrows(NullPointerException.class, () -> {
                try {
                    client.test(request, 0, new TestListener() {
                        @Override
                        public void onComplete0() {
                            fail("Request should have failed");
                        }
                    }).get(TIMEOUT_SECONDS, SECONDS);
                } catch (ExecutionException e) {
                    throw e.getCause();
                }
            });
        }));
    }
}