@ParameterizedTest
    @CsvSource({ "H1C", "H2C", "H1", "H2" })
    public void jsp(SessionProtocol sessionProtocol) throws Exception {
        final WebClient client = WebClient.builder(server().uri(sessionProtocol))
                                          .factory(ClientFactory.insecure())
                                          .build();
        try (ClientRequestContextCaptor ctxCaptor = Clients.newContextCaptor()) {
            final AggregatedHttpResponse res = client.get("/jsp/index.jsp").aggregate().join();
            assertThat(res.status()).isSameAs(HttpStatus.OK);
            assertThat(res.contentType()).isEqualTo(MediaType.HTML_UTF_8);

            final String actualContent = CR_OR_LF.matcher(res.contentUtf8()).replaceAll("");

            // Get the session protocol observed from the client side.
            final String expectedProtocol = ctxCaptor.get().log().ensureAvailable(RequestLogProperty.SESSION)
                                                     .sessionProtocol().isMultiplex() ? "HTTP/2.0" : "HTTP/1.1";
            assertThat(actualContent).isEqualTo(
                    "<html><body>" +
                    "<p>Hello, Armerian World!</p>" +
                    "<p>Have you heard about the class 'org.slf4j.Logger'?</p>" +
                    "<p>Host: 127.0.0.1:" + server().port(sessionProtocol) + "</p>" +
                    "<p>Context path: </p>" + // ROOT context path
                    "<p>Request URI: /index.jsp</p>" +
                    "<p>Scheme: " + (sessionProtocol.isTls() ? "https" : "http") + "</p>" +
                    "<p>Protocol: " + expectedProtocol + "</p>" +
                    "</body></html>");
        }
    }
Returns the {@link ServerExtension} that provides the {@link Server} that serves the {@link Service}s
this test runs against.
testing-internal/src/main/java/com/linecorp/armeria/internal/testing/webapp/WebAppContainerTest.java