Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test Statistics Handler #12565

Open
wants to merge 2 commits into
base: jetty-12.1.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,37 +13,23 @@

package org.eclipse.jetty.tests.distribution;

import java.io.ByteArrayInputStream;
import java.net.URI;
import java.nio.file.Path;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.eclipse.jetty.client.ContentResponse;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.tests.testers.JettyHomeTester;
import org.eclipse.jetty.tests.testers.Tester;
import org.eclipse.jetty.toolchain.test.FS;
import org.eclipse.jetty.util.ajax.JSON;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.w3c.dom.Document;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.instanceOf;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class StatsTests extends AbstractJettyHomeTest
{
@Disabled //TODO stats.mod broken
@ParameterizedTest
@ValueSource(strings = {"ee9", "ee10", "ee11"})
public void testStatsServlet(String env) throws Exception
Expand All @@ -56,19 +42,19 @@ public void testStatsServlet(String env) throws Exception
String[] args1 = {
"--create-startd",
"--approve-all-licenses",
"--add-modules=resources,server,http,stats," + toEnvironment("webapp", env) + "," + toEnvironment("deploy", env)
"--add-modules=resources,server,http,statistics," + toEnvironment("webapp", env) + "," + toEnvironment("deploy", env)
};
try (JettyHomeTester.Run run1 = distribution.start(args1))
{
assertTrue(run1.awaitFor(START_TIMEOUT, TimeUnit.SECONDS));
run1.getLogs().forEach(System.err::println);
gregw marked this conversation as resolved.
Show resolved Hide resolved
assertEquals(0, run1.getExitValue());

// Make a context
Path webappsDir = distribution.getJettyBase().resolve("webapps");
FS.ensureDirExists(webappsDir.resolve("demo"));
FS.ensureDirExists(webappsDir.resolve("demo/WEB-INF"));

distribution.installBaseResource("stats-webapp-" + env + "/index.html", "webapps/demo/index.html");
distribution.installBaseResource("stats-webapp-" + env + "/WEB-INF/web.xml", "webapps/demo/WEB-INF/web.xml");
// TODO add some actual content to it
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this TODO can go away, the StatisticsHandler is installed as the root of the handler tree and there already is a deployed webapp that can be queried to check the stats.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Currently it is just an empty directory, there is not webapp deployed.


int port = Tester.freePort();
String[] args2 = {
Expand All @@ -83,87 +69,10 @@ public void testStatsServlet(String env) throws Exception
ContentResponse response;
URI serverBaseURI = URI.create("http://localhost:" + port);

response = client.GET(serverBaseURI.resolve("/demo/index.html"));
response = client.GET(serverBaseURI.resolve("/demo/"));
assertEquals(HttpStatus.OK_200, response.getStatus());
assertThat(response.getContentAsString(), containsString("<h1>Stats Demo</h1>"));

// ---------------
// Test XML accept
response = client.newRequest(serverBaseURI.resolve("/demo/stats"))
.method(HttpMethod.GET)
.headers((headers) -> headers.add(HttpHeader.ACCEPT, "text/xml"))
.send();
assertEquals(HttpStatus.OK_200, response.getStatus());

assertThat("Response.contentType", response.getHeaders().get(HttpHeader.CONTENT_TYPE), containsString("text/xml"));

// Parse it, make sure it's well formed.
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
docBuilderFactory.setValidating(false);
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
try (ByteArrayInputStream input = new ByteArrayInputStream(response.getContent()))
{
Document doc = docBuilder.parse(input);
assertNotNull(doc);
assertEquals("statistics", doc.getDocumentElement().getNodeName());
}

// ---------------
// Test JSON accept
response = client.newRequest(serverBaseURI.resolve("/demo/stats"))
.method(HttpMethod.GET)
.headers((headers) -> headers.add(HttpHeader.ACCEPT, "application/json"))
.send();
assertEquals(HttpStatus.OK_200, response.getStatus());

assertThat("Response.contentType", response.getHeaders().get(HttpHeader.CONTENT_TYPE), containsString("application/json"));

Object doc = new JSON().parse(new JSON.StringSource(response.getContentAsString()));
assertNotNull(doc);
assertThat(doc, instanceOf(Map.class));
Map<?, ?> docMap = (Map<?, ?>)doc;
assertEquals(4, docMap.size());
assertNotNull(docMap.get("requests"));
assertNotNull(docMap.get("responses"));
assertNotNull(docMap.get("connections"));
assertNotNull(docMap.get("memory"));

// ---------------
// Test TEXT accept
response = client.newRequest(serverBaseURI.resolve("/demo/stats"))
.method(HttpMethod.GET)
.headers((headers) -> headers.add(HttpHeader.ACCEPT, "text/plain"))
.send();
assertEquals(HttpStatus.OK_200, response.getStatus());

assertThat("Response.contentType", response.getHeaders().get(HttpHeader.CONTENT_TYPE), containsString("text/plain"));

String textContent = response.getContentAsString();
assertThat(textContent, containsString("requests: "));
assertThat(textContent, containsString("responses: "));
assertThat(textContent, containsString("connections: "));
assertThat(textContent, containsString("memory: "));

// ---------------
// Test HTML accept
response = client.newRequest(serverBaseURI.resolve("/demo/stats"))
.method(HttpMethod.GET)
.headers((headers) -> headers.add(HttpHeader.ACCEPT, "text/html"))
.send();
assertEquals(HttpStatus.OK_200, response.getStatus());

assertThat("Response.contentType", response.getHeaders().get(HttpHeader.CONTENT_TYPE), containsString("text/html"));

String htmlContent = response.getContentAsString();
// Look for things that indicate it's a well formed HTML output
assertThat(htmlContent, containsString("<html>"));
assertThat(htmlContent, containsString("<body>"));
assertThat(htmlContent, containsString("<em>requests</em>: "));
assertThat(htmlContent, containsString("<em>responses</em>: "));
assertThat(htmlContent, containsString("<em>connections</em>: "));
assertThat(htmlContent, containsString("<em>memory</em>: "));
assertThat(htmlContent, containsString("</body>"));
assertThat(htmlContent, containsString("</html>"));
// TODO test the StatisticsHandler somehow
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could make a couple requests, there already is the one above that returns a 200, and add another one that returns a 404, set dumpBeforeStop to true, then stop the server and check that the 2xxResponses and 4xxResponses counters are part of the dump and have the expected values?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, but would be good to see requests in progress.

}
}
}
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Loading