SLING-9512 - add integration tests
10 files changed
tree: d9ccdf4959d65b08857a45974c676f5a45421339
  1. .asf.yaml
  2. .gitignore
  5. Jenkinsfile
  8. pom.xml
  9. src/

Build Status Test Status Maven Central JavaDocs License

Apache Sling Servlet Helpers

This module is part of the Apache Sling project.

It provides helper mock implementations of the SlingHttpServletRequest, SlingHttpServletRepsonse and related classes, along with helpers for internal Sling requests described below.

These helpers can be used for testing, like the Sling Mocks do.

They are also useful for executing internal requests, like in the GraphQL Core module which uses that technique to retrieve GraphQL schemas using the powerful Sling request processing mechanisms.

InternalRequest helpers

The internal request helpers use either a SlingRequestProcessor to execute internal requests using the full Sling request processing pipeline, or a ServletResolver to resolve and call a Servlet or Script directly.

The direct mode is more efficient but less faithful to the way HTTP requests are processed, as it bypasses all Servlet Filters, in particular.

In both cases, the standard Sling Servlet/Script resolution mechanism is used, which can be useful to execute scripts that are resolved based on the current resource type, for non-HTTP operations. Inventing HTTP method names for this is fine and allows for reusing this powerful resolution mechanism in other contexts.

Here's an example using the SlingInternalRequest helper - see the test code for more.

OutputStream os = new SlingInternalRequest(resourceResolver, slingRequestProcessor, path)
  .withSelectors("print", "a4")

Troubleshooting internal requests

To help map log messages to internal requests, as several of those might be used to handle a single HTTP request, the InternalRequest class sets a log4j Mapped Diagnostic Context (MDC) value with the sling.InternalRequestkey.

The value of that key provides the essential attributes of the current request, so that using a log formatting pattern that displays it, like:

%-5level [%-50logger{50}] %message ## %mdc{sling.InternalRequest} %n

Causes the internal request information to be logged, like in this example (lines folded for readability):

DEBUG [o.a.s.s.internalrequests.SlingInternalRequest     ]
   Executing request using the SlingRequestProcessor
   ## GET P=/content/tags/monitor+array S=null EXT=json RT=samples/tag(null)
WARN  [  ]
  SlingRequestProgressTracker not found in request attributes
  ## GET P=/content/tags/monitor+array S=null EXT=json RT=samples/tag(null)
DEBUG [o.a.s.s.resolver.internal.SlingServletResolver    ]
  Using cached servlet /apps/samples/tag/json.gql
  ## GET P=/content/tags/monitor+array S=null EXT=json RT=samples/tag(null)

In these log messages, GET P=/content/tags/monitor+array S=null EXT=json RT=samples/tag(null) points to the current internal request, showing its method, path, selectors, extension, resource type and resource supertype.