mockserver-core
Used in:
components
- OverviewOverview
- VersionsVersions
- DependentsDependents
- DependenciesDependencies
<dependency>
<groupId>org.mock-server</groupId>
<artifactId>mockserver-core</artifactId>
<version>7.4.0</version>
</dependency><?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.mock-server</groupId>
<artifactId>mockserver</artifactId>
<version>7.4.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mockserver-core</artifactId>
<name>MockServer Core</name>
<description>Functionality used by all MockServer modules for matching and expectations</description>
<url>https://www.mock-server.com</url>
<properties>
<module.name>org.mockserver.core</module.name>
</properties>
<dependencies>
<!-- mockserver -->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mockserver-testing</artifactId>
<scope>test</scope>
</dependency>
<!-- disruptor -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
</dependency>
<!-- http -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
</dependency>
<!-- Netty -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-buffer</artifactId>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-codec</artifactId>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-codec-http</artifactId>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-codec-http2</artifactId>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-codec-socks</artifactId>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-handler</artifactId>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-handler-proxy</artifactId>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-transport</artifactId>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-tcnative-boringssl-static</artifactId>
</dependency>
<!-- Epoll API classes (pure Java, no native classifier) — needed at compile
time for NettyTransport to reference EpollEventLoopGroup, EpollSocketChannel,
EpollServerSocketChannel, and Epoll.isAvailable(). The native .so is only
required at runtime on Linux (bundled in mockserver-netty). -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-transport-classes-epoll</artifactId>
</dependency>
<!-- protobuf (gRPC support) -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<exclusions>
<!-- protobuf-java-util references an older error_prone_annotations than guava brings;
guava's path supplies the (compile-time-only) annotations at the version the build
resolves to. Prune the older edge for downstream convergence (#1970). -->
<exclusion>
<groupId>com.google.errorprone</groupId>
<artifactId>error_prone_annotations</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- gzip HTTP deflater & inflater -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jzlib</artifactId>
</dependency>
<!-- non-blocking UUID -->
<dependency>
<groupId>com.fasterxml.uuid</groupId>
<artifactId>java-uuid-generator</artifactId>
<exclusions>
<!-- prune the stale slf4j-api 1.7.x this drags in; this module declares slf4j-api directly
(the version the build already resolves to) so downstream dependencyConvergence passes -->
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- SSL X509 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk18on</artifactId>
</dependency>
<!-- JWT -->
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
</dependency>
<!-- templating -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-scripting</artifactId>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
<!-- velocity-engine-core references slf4j-api 1.7.36; this module declares slf4j-api
directly at ${slf4j.version}. Prune for downstream convergence (#1970). -->
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.velocity.tools</groupId>
<artifactId>velocity-tools-generic</artifactId>
<version>3.1</version>
<exclusions>
<!-- velocity-tools-generic 3.1 pulls velocity-engine-core 2.3 transitively, but this module
declares (and is built and tested against) velocity-engine-core ${velocity.version} directly
above. Pruning the stale 2.3 edge keeps the published tree on a single Velocity version so
downstream consumers' dependencyConvergence checks pass. -->
<exclusion>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
</exclusion>
<!-- velocity-tools-generic 3.1 drags commons-beanutils 1.9.4 directly and 1.8.3 via
commons-digester3 — both vulnerable to GHSA-wxr5-93ph-8wr9 (CVE-2025-48734). This
module's dependencyManagement pins 1.11.0 for its own build, but dependencyManagement
is NOT transitive, so downstream consumers resolved the vulnerable versions from the
published POM. Excluding commons-beanutils prunes the whole vulnerable subtree, and the
fixed 1.11.0 is supplied as a direct dependency below so it propagates to consumers. -->
<exclusion>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
</exclusion>
<!-- velocity-tools-generic (and its commons-digester3 edge) reference stale commons-lang3
3.10, slf4j-api 1.7.30 and commons-logging 1.1.1; all three are supplied at the
resolved versions elsewhere (direct commons-lang3 / slf4j-api, and commons-logging via
the commons-beanutils path). Prune for downstream convergence (#1970). -->
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Fixed commons-beanutils for velocity-tools-generic / commons-digester3 (see exclusion above).
Declared directly so the published POM exposes 1.11.0 to downstream consumers. Version managed
in the parent pom's dependencyManagement. -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
</dependency>
<dependency>
<groupId>com.samskivert</groupId>
<artifactId>jmustache</artifactId>
</dependency>
<dependency>
<groupId>net.datafaker</groupId>
<artifactId>datafaker</artifactId>
</dependency>
<!-- WASM (chicory pure-Java interpreter) -->
<dependency>
<groupId>com.dylibso.chicory</groupId>
<artifactId>runtime</artifactId>
<optional>true</optional>
</dependency>
<!-- HdrHistogram (authoritative per-run load-scenario latency percentiles) -->
<dependency>
<groupId>org.hdrhistogram</groupId>
<artifactId>HdrHistogram</artifactId>
</dependency>
<!-- javascript (GraalVM polyglot) -->
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>polyglot</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>js</artifactId>
<type>pom</type>
<optional>true</optional>
</dependency>
<!-- json (object serialisation) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<!-- ObjectMapperFactory registers JavaTimeModule directly, so declare this explicitly rather
than relying on it arriving transitively (it previously came only via swagger-parser, which
the Java client now excludes). -->
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
<!-- Declared directly because swagger-parser (which previously supplied jackson-dataformat-yaml
for parsing YAML OpenAPI specs) now excludes it to keep downstream convergence clean (#1970).
Version managed in the parent pom's dependencyManagement at ${jackson.version}. -->
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<exclusions>
<!-- jackson-dataformat-yaml references snakeyaml 2.5; datafaker supplies the pinned 2.6.
Prune so a single snakeyaml version reaches consumers (#1970). -->
<exclusion>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.javacrumbs.json-unit</groupId>
<artifactId>json-unit-core</artifactId>
</dependency>
<dependency>
<!-- json-unit's Configuration.withMatcher exposes org.hamcrest.Matcher; json-unit
declares only the hamcrest-core stub which has no classes since 3.0, so the
hamcrest classes must be pulled in explicitly for compile-time visibility. -->
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
</dependency>
<!-- json validation -->
<dependency>
<groupId>com.networknt</groupId>
<artifactId>json-schema-validator</artifactId>
<exclusions>
<!-- prune the older slf4j-api and the jackson-annotations 2.21 (pulled via its Jackson 3
transitive); this module declares both directly at the versions the build resolves to -->
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<exclusions>
<!-- prune the older slf4j-api; declared directly by this module -->
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<!-- RFC 6902 JSON Patch / RFC 7386 JSON Merge Patch applied to forwarded response
bodies; declared directly rather than relying on the json-schema-validator
transitive so the API stays available if that transitive changes. -->
<groupId>com.github.java-json-tools</groupId>
<artifactId>json-patch</artifactId>
<exclusions>
<!-- json-patch's msg-simple/btf/jackson-coreutils chain references stale jackson-databind
2.11.0 and jsr305 2.0.1; both are supplied at the pinned versions elsewhere (direct
jackson-databind, protobuf's jsr305 3.0.2). Prune for downstream convergence (#1970). -->
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- open api -->
<dependency>
<groupId>io.swagger.parser.v3</groupId>
<artifactId>swagger-parser</artifactId>
<exclusions>
<!-- swagger-parser drags a large legacy subtree (swagger-parser-v2-converter ->
swagger-core 1.6.x / swagger-compat-spec-parser -> com.github.java-json-tools:
json-schema-validator 2.2.14) that references many stale versions of libraries
this module already pins. MockServer's own build converges these via the parent
dependencyManagement, but dependencyManagement is NOT transitive, so a downstream
consumer running maven-enforcer's dependencyConvergence saw conflicts for guava,
jsr305, rhino, libphonenumber, snakeyaml, commons-*, slf4j, jackson-* and
jakarta.xml.bind-api (GitHub issue #1970). The pinned/newer versions already win
nearest-wins, so pruning the stale references here leaves the resolved classpath
unchanged while letting consumers' convergence checks pass. Every artifact below
is supplied at a single version by a direct dependency of this module (or by
datafaker/protobuf at the version that already wins). -->
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
</exclusion>
<exclusion>
<groupId>org.mozilla</groupId>
<artifactId>rhino</artifactId>
</exclusion>
<exclusion>
<groupId>com.googlecode.libphonenumber</groupId>
<artifactId>libphonenumber</artifactId>
</exclusion>
<exclusion>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
<exclusion>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</exclusion>
<exclusion>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</exclusion>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
<!-- jackson-dataformat-yaml was supplied ONLY by swagger; declared directly below so
YAML OpenAPI specs still parse after this edge is pruned. -->
<exclusion>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</exclusion>
<exclusion>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<!-- upgrade swagger-parser dependency fixing
https://security.snyk.io/vuln/SNYK-JAVA-ORGMOZILLA-1314295 -->
<groupId>org.mozilla</groupId>
<artifactId>rhino</artifactId>
</dependency>
<!-- graphql -->
<dependency>
<groupId>com.graphql-java</groupId>
<artifactId>graphql-java</artifactId>
</dependency>
<!-- xml -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.xmlunit</groupId>
<artifactId>xmlunit-core</artifactId>
<exclusions>
<!-- prune the stale jakarta.xml.bind-api 2.3.3; this module declares 4.0.x directly (above) -->
<exclusion>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.xmlunit</groupId>
<artifactId>xmlunit-placeholders</artifactId>
</dependency>
<!-- commons & guava -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<!-- javax.annotation.Nullable (JSR-305) is referenced directly in this module's source
(e.g. HttpForwardAction); declare it directly rather than relying on it arriving
transitively via swagger/json-patch/protobuf, whose stale 2.0.1 edges are now pruned
for downstream convergence (#1970). Version managed in the parent pom at 3.0.2. -->
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
</dependency>
<!-- classpath scanning -->
<dependency>
<groupId>io.github.classgraph</groupId>
<artifactId>classgraph</artifactId>
</dependency>
<!-- logging -->
<dependency> <!-- will map to any underlying logging framework -->
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<optional>true</optional> <!-- do not impose on project importing mock-server -->
</dependency>
<!-- prometheus -->
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>prometheus-metrics-core</artifactId>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>prometheus-metrics-exposition-formats</artifactId>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>prometheus-metrics-model</artifactId>
</dependency>
<!-- snappy (raw block format) for the Prometheus Remote-Write v1 push exporter.
Compile scope so it is bundled into the shaded netty jar. NOT relocated by the
shade plugin — snappy self-extracts its native lib from org/xerial/snappy and a
relocation rule would break native loading. -->
<dependency>
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
</dependency>
<!-- opentelemetry (optional metrics export; off by default).
OTLP HTTP/protobuf via the JDK HttpClient sender — okhttp sender excluded
to avoid pulling okhttp + kotlin-stdlib into the shaded jar. -->
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-common</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-metrics</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-trace</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-otlp</artifactId>
<exclusions>
<exclusion>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-sender-okhttp</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-sender-jdk</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-testing</artifactId>
<scope>test</scope>
</dependency>
<!-- test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.skyscreamer</groupId>
<artifactId>jsonassert</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!--
Capture the abbreviated git commit hash at build time and expose it as the
${git.commit.id.abbrev} Maven property, which the templating-maven-plugin (inherited
from the parent pom) substitutes into the generated Version class so it can be surfaced
on the /mockserver/status endpoint and the Prometheus build_info metric. Runs in the
initialize phase, before generate-sources where the Version class is filtered.
failOnNoGitDirectory / failOnUnableToExtractRepoInfo are false so builds without git
metadata (e.g. a source tarball) degrade to an empty hash instead of failing.
-->
<plugin>
<groupId>io.github.git-commit-id</groupId>
<artifactId>git-commit-id-maven-plugin</artifactId>
<version>9.0.1</version>
<executions>
<execution>
<id>resolve-git-commit-hash</id>
<goals>
<goal>revision</goal>
</goals>
<phase>initialize</phase>
</execution>
</executions>
<configuration>
<failOnNoGitDirectory>false</failOnNoGitDirectory>
<failOnUnableToExtractRepoInfo>false</failOnUnableToExtractRepoInfo>
<generateGitPropertiesFile>false</generateGitPropertiesFile>
<abbrevLength>8</abbrevLength>
<includeOnlyProperties>
<includeOnlyProperty>^git\.commit\.id\.abbrev$</includeOnlyProperty>
</includeOnlyProperties>
<!--
NOTE: inside a linked git worktree the resolved hash is that of the shared
repository HEAD, not the worktree's own HEAD. Single-working-tree clones
(Buildkite CI and the release pipeline, which is what ships) resolve correctly.
-->
</configuration>
</plugin>
<!--
Two-phase unit-test execution (see docs/operations/performance-tuning.md):
1. default-test - parallel=classes (threadCount 4) for the bulk of the suite.
2. sequential-tests - parallel=none, ONLY the classes listed below, which mutate
JVM-global state that cannot be thread-isolated and so must not run concurrently:
- ConfigurationProperties system-property config (ConfigurationTest,
ProxyConfigurationTest, ExceptionHandlingTest, CustomJsonUnitMatcherLoaderTest)
- static Prometheus Metrics gauges (MockServerMatcherNotificationAndMetricsTest)
- globally-fixed time for assertions on timestamps produced on the event-log
disruptor thread (HttpStateTest, MockServerEventLogTest)
The ConfigurationProperties/MockServerLogger <clinit> deadlock that previously made
parallel=classes hang is fixed (ClassInitializationDeadlockTest); UUIDService/
EpochService/TimeService global booleans are now thread-scoped so their former victims
run safely in the parallel phase. ParallelStaticStateGuardTest fails the build if a
class is excluded from the parallel phase without being added to the sequential phase.
-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<parallel>classes</parallel>
<threadCount>4</threadCount>
<excludes>
<exclude>**/*IntegrationTest.java</exclude>
<!-- Mutate the JVM-global LRUCache flags (allCachesEnabled / maxSizeOverride) or
assert cache identity, so they must run single-threaded: otherwise one class
flips the global cache-enabled flag mid-run of a cache-dependent class. -->
<exclude>**/LRUCacheTest.java</exclude>
<exclude>**/JsonSchemaValidatorCacheTest.java</exclude>
<exclude>**/ConfigurationTest.java</exclude>
<exclude>**/ProxyConfigurationTest.java</exclude>
<exclude>**/ExceptionHandlingTest.java</exclude>
<exclude>**/CustomJsonUnitMatcherLoaderTest.java</exclude>
<exclude>**/MockServerMatcherNotificationAndMetricsTest.java</exclude>
<exclude>**/MockServerEventLogTest.java</exclude>
<exclude>**/MockServerEventLogEventualVerificationTest.java</exclude>
<exclude>**/MockServerEventLogVerifyByDispositionTest.java</exclude>
<exclude>**/HttpStateTest.java</exclude>
<exclude>**/HttpStateAuditTest.java</exclude>
<exclude>**/HttpStateAuthorizationTest.java</exclude>
<exclude>**/HttpStateAuditEndpointTest.java</exclude>
<exclude>**/OtelMetricsExporterTest.java</exclude>
<exclude>**/TimeServiceTest.java</exclude>
<exclude>**/TimeToLiveTest.java</exclude>
<exclude>**/ExpectationTest.java</exclude>
<exclude>**/HttpActionHandlerChaosTest.java</exclude>
<exclude>**/HttpActionHandlerRateLimitTest.java</exclude>
<exclude>**/RateLimitRegistryTest.java</exclude>
<exclude>**/HttpActionHandlerForwardChaosTest.java</exclude>
<exclude>**/HttpActionHandlerRecoverAfterTest.java</exclude>
<exclude>**/RecoveryAttemptRegistryTest.java</exclude>
<exclude>**/ServiceChaosRegistryTest.java</exclude>
<exclude>**/TcpChaosRegistryTest.java</exclude>
<exclude>**/MetricsTest.java</exclude>
<exclude>**/MetricsHandlerTest.java</exclude>
<exclude>**/HttpRequestsPropertiesMatcherTest.java</exclude>
<exclude>**/HttpRequestPropertiesMatcherLogTest.java</exclude>
<!-- Run sequentially: these render templates that evaluate several XPath
expressions, each bounded by xpathMatchingTimeoutMillis via the shared
MatchingTimeoutExecutor. Under heavy parallel CPU contention an eval can
miss its wall-clock timeout and fall back to "" (flaky). Running them
single-threaded removes the contention without weakening the prod timeout. -->
<exclude>**/MustacheTemplateEngineTest.java</exclude>
<exclude>**/VelocityTemplateEngineTest.java</exclude>
<!-- first JS render pays the GraalJS/Truffle context cold-start; under parallel CPU
contention it can exceed the 5s javascriptTemplateExecutionTimeout (CI-red since
5b23d6d17, builds 1354+) -->
<exclude>**/StreamTemplateRendererTest.java</exclude>
<!-- mutates JVM-global system properties (templateFakerSeed, forwardProxyClientCertificatesByHost) -->
<exclude>**/CoreMiscConfigurationTest.java</exclude>
<!-- WS2.1 scenario-state template tests mutate the CrossProtocolEventBus singleton (live ScenarioManager) -->
<exclude>**/VelocityScenarioStateTemplateTest.java</exclude>
<exclude>**/JavaScriptScenarioStateTemplateTest.java</exclude>
<exclude>**/MustacheScenarioStateTemplateTest.java</exclude>
<!-- WS2.6 gRPC bidi scenario-state template test mutates the CrossProtocolEventBus singleton (live ScenarioManager) -->
<exclude>**/GrpcStreamMessageScenarioTemplateTest.java</exclude>
<!-- WS2.2 capture-rule test mutates the CrossProtocolEventBus singleton (live ScenarioManager) -->
<exclude>**/CaptureProcessorTest.java</exclude>
<!-- WS7.1 OIDC authorization-code test mutates the OidcAuthorizationStore singleton -->
<exclude>**/OidcProviderGeneratorTest.java</exclude>
<!-- OidcTokenCallback test registers providers into the OidcAuthorizationStore singleton -->
<exclude>**/OidcTokenCallbackTest.java</exclude>
<!-- WS7.7 SAML SSO test mutates the SamlAssertionStore singleton -->
<exclude>**/SamlProviderGeneratorTest.java</exclude>
<!-- Wave4 SCIM tests mutate the ScimResourceStore singleton -->
<exclude>**/ScimProviderGeneratorTest.java</exclude>
<exclude>**/ScimResourceStoreTest.java</exclude>
<exclude>**/ScimConcurrentUpdateTest.java</exclude>
<!-- Mutates global ConfigurationProperties.generateRealisticExampleValues -->
<exclude>**/ExampleBuilderRealisticValuesTest.java</exclude>
<!-- Mutate shared static PrometheusRegistry / Metrics / ConfigurationProperties -->
<exclude>**/HttpActionHandlerGraphQLChaosTest.java</exclude>
<exclude>**/ChaosAutoHaltMonitorTest.java</exclude>
<!-- Mutates global ConfigurationProperties.preemptionSimulationMaxDrainMillis + PreemptionSimulator singleton -->
<exclude>**/PreemptionSimulatorTest.java</exclude>
<exclude>**/LlmCostBudgetMonitorTest.java</exclude>
<exclude>**/LlmMetricsTest.java</exclude>
<!-- WS7.6: mutates the mockserver.perExpectationMetrics system property + static Metrics / default PrometheusRegistry -->
<exclude>**/PerExpectationMetricsTest.java</exclude>
<!-- T10: mutates the global mockserver.redactSecretsInLog system property -->
<exclude>**/LogEntryRedactionTest.java</exclude>
<!-- Mutates the global mockserver.redactSecretsInLog system property to assert the NDJSON archive honours redaction -->
<exclude>**/RecordedRequestsFileSystemPersistenceTest.java</exclude>
<!-- Mutate global ConfigurationProperties.llmProvider/llmApiKey/llmModel/llmBaseUrl/llmBackendsConfig -->
<exclude>**/LlmBackendResolverTest.java</exclude>
<exclude>**/LlmProviderSnifferTest.java</exclude>
<exclude>**/ForwardPathGenAiSpansTest.java</exclude>
<!-- Installs/removes the process-wide tracer in GenAiSpans/RequestSpans + mutates otelTracesEnabled -->
<exclude>**/GenAiSpanExporterTest.java</exclude>
<exclude>**/BreakpointConfigurationTest.java</exclude>
<!-- Mutate shared static singleton registries (StreamFrameBreakpointRegistry, BreakpointMatcherRegistry, BreakpointCallbackDispatcher) -->
<exclude>**/HttpActionHandlerBreakpointTest.java</exclude>
<exclude>**/BreakpointMatcherRegistryTest.java</exclude>
<exclude>**/BreakpointMatcherEndpointTest.java</exclude>
<exclude>**/BreakpointCallbackDispatcherTest.java</exclude>
<exclude>**/StreamFrameCallbackDispatcherTest.java</exclude>
<exclude>**/StreamFrameBreakpointRegistryTest.java</exclude>
<exclude>**/InboundBreakpointTest.java</exclude>
<exclude>**/MockStreamBreakpointTest.java</exclude>
<!-- Mutates ServiceChaosRegistry + ChaosAutoHaltMonitor singletons, Metrics, ConfigurationProperties -->
<exclude>**/ChaosExperimentOrchestratorTest.java</exclude>
<!-- Resets the ChaosExperimentOrchestrator singleton in @After -->
<exclude>**/HttpStateChaosProfileEndpointTest.java</exclude>
<!-- Mutate global sloTrackingEnabled / sloWindow* ConfigurationProperties, the SloSampleStore singleton and the controllable clock -->
<exclude>**/SloSampleStoreTest.java</exclude>
<exclude>**/SloEvaluatorTest.java</exclude>
<exclude>**/HttpStateVerifySloEndpointTest.java</exclude>
<!-- Mutate the LoadScenarioOrchestrator singleton, Metrics, the SloSampleStore singleton and global loadGeneration* ConfigurationProperties -->
<exclude>**/LoadScenarioOrchestratorTest.java</exclude>
<exclude>**/LoadMetricsTest.java</exclude>
<exclude>**/HttpStateLoadScenarioEndpointTest.java</exclude>
<!-- Mutates the DriftAlertNotifier singleton (configure/setSender/reset/setClock) -->
<exclude>**/DriftAlertNotifierTest.java</exclude>
<!-- Mutate global ConfigurationProperties / singleton registries / Metrics (detected by GlobalStateMutationGuardTest) -->
<exclude>**/MaxLlmConversationBodySizeTest.java</exclude>
<exclude>**/SlowRequestConfigurationTest.java</exclude>
<exclude>**/HttpActionHandlerLlmCostBudgetTest.java</exclude>
<exclude>**/GrpcChaosRegistryTest.java</exclude>
<exclude>**/ValidationProxyTest.java</exclude>
<exclude>**/HttpLlmResponseActionHandlerTest.java</exclude>
<exclude>**/HttpLlmResponseActionHandlerChaosTest.java</exclude>
<exclude>**/HttpActionHandlerLlmEnforcementTest.java</exclude>
<exclude>**/DnsIntentRegistryTest.java</exclude>
<exclude>**/WasmRuntimeTest.java</exclude>
<exclude>**/WasmRuntimeRealModuleTest.java</exclude>
<!-- Mutates the shared static WasmRuntime.MODULE_CACHE and WasmStore singleton; asserts exact cache sizes -->
<exclude>**/WasmRuntimeModuleCacheTest.java</exclude>
<!-- Response-shaping (ABI v3) tests: populate the shared WasmRuntime.MODULE_CACHE and (for the
action-handler test) mutate ConfigurationProperties.wasmEnabled + WasmStore singleton -->
<exclude>**/WasmRuntimeShapeAbiTest.java</exclude>
<exclude>**/WasmResponseShaperTest.java</exclude>
<exclude>**/HttpResponseActionHandlerWasmShapeTest.java</exclude>
<exclude>**/XPathEvaluatorTest.java</exclude>
<exclude>**/WasmBodyMatcherTest.java</exclude>
<exclude>**/GraphQLMatcherTest.java</exclude>
<exclude>**/JsonRpcMatcherTest.java</exclude>
<exclude>**/LlmConversationMatcherTest.java</exclude>
<exclude>**/JsonStringMatcherTest.java</exclude>
<exclude>**/RegexStringMatcherTest.java</exclude>
<exclude>**/InetAddressValidatorTest.java</exclude>
<exclude>**/JsonSchemaValidatorRemoteRefTest.java</exclude>
<!-- Constructs a real HttpState (mutates ServiceChaosRegistry / Metrics / CrossProtocolEventBus singletons) -->
<exclude>**/HttpStateReadinessTest.java</exclude>
<!-- Sets/clears mockserver.* JVM system properties to exercise the print-config effective-config diagnostic -->
<exclude>**/ConfigurationPropertiesEffectiveConfigGlobalStateTest.java</exclude>
<!-- Mutates mockserver.llmOptimisationMaxCalls / fixtureBodyRedactFields global config -->
<exclude>**/LlmOptimisationReportServiceTest.java</exclude>
<!-- Resets the ForwardCircuitBreaker singleton (shared with the upstream_circuit_open gauge) -->
<exclude>**/HttpForwardActionResilienceTest.java</exclude>
<!-- Sets/clears the mockserver.otelEndpoint JVM system property and property cache -->
<exclude>**/OtelEndpointConfigurationTest.java</exclude>
<!-- Mutates mockserver.prometheusRemoteWrite* global ConfigurationProperties -->
<exclude>**/PrometheusRemoteWriteExporterTest.java</exclude>
<!-- Sets/clears the mockserver.prometheusRemoteWriteProtocolVersion JVM system property and property cache -->
<exclude>**/PrometheusRemoteWriteProtocolVersionConfigurationTest.java</exclude>
<!-- Mutates mockserver.driftDetectionEnabled/driftSampleRate global ConfigurationProperties -->
<exclude>**/DriftDetectionConfigTest.java</exclude>
<!-- Mutates the JVM-global java.security.Security provider list (removes/re-adds the BC provider)
and the BCKeyAndCertificateFactory static registration guard to test lazy provider registration -->
<exclude>**/BCKeyAndCertificateFactoryLazyProviderTest.java</exclude>
<!-- Resets the OpenAiResponsesState JVM-wide singleton via getInstance().reset() -->
<exclude>**/OpenAiResponsesStateTest.java</exclude>
<!-- Mutates the global mockserver.fixtureBodyRedactFields ConfigurationProperties -->
<exclude>**/LlmDatasetExporterTest.java</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>sequential-tests</id>
<goals>
<goal>test</goal>
</goals>
<phase>test</phase>
<configuration>
<parallel>none</parallel>
<forkCount>1</forkCount>
<reuseForks>true</reuseForks>
<excludes combine.self="override">
<exclude>**/*IntegrationTest.java</exclude>
</excludes>
<includes combine.self="override">
<include>**/LRUCacheTest.java</include>
<include>**/JsonSchemaValidatorCacheTest.java</include>
<include>**/ConfigurationTest.java</include>
<include>**/ProxyConfigurationTest.java</include>
<include>**/ExceptionHandlingTest.java</include>
<include>**/CustomJsonUnitMatcherLoaderTest.java</include>
<include>**/MockServerMatcherNotificationAndMetricsTest.java</include>
<include>**/MockServerEventLogTest.java</include>
<include>**/MockServerEventLogEventualVerificationTest.java</include>
<include>**/MockServerEventLogVerifyByDispositionTest.java</include>
<include>**/HttpStateTest.java</include>
<include>**/HttpStateAuditTest.java</include>
<include>**/HttpStateAuthorizationTest.java</include>
<include>**/HttpStateAuditEndpointTest.java</include>
<include>**/OtelMetricsExporterTest.java</include>
<include>**/TimeServiceTest.java</include>
<include>**/TimeToLiveTest.java</include>
<include>**/ExpectationTest.java</include>
<include>**/HttpActionHandlerChaosTest.java</include>
<include>**/HttpActionHandlerRateLimitTest.java</include>
<include>**/RateLimitRegistryTest.java</include>
<include>**/HttpActionHandlerForwardChaosTest.java</include>
<include>**/HttpActionHandlerRecoverAfterTest.java</include>
<include>**/RecoveryAttemptRegistryTest.java</include>
<include>**/ServiceChaosRegistryTest.java</include>
<include>**/TcpChaosRegistryTest.java</include>
<include>**/MetricsTest.java</include>
<include>**/MetricsHandlerTest.java</include>
<include>**/HttpRequestsPropertiesMatcherTest.java</include>
<include>**/HttpRequestPropertiesMatcherLogTest.java</include>
<!-- XPath-in-template tests: sequential to avoid flaky timeout under contention -->
<include>**/MustacheTemplateEngineTest.java</include>
<include>**/VelocityTemplateEngineTest.java</include>
<include>**/StreamTemplateRendererTest.java</include>
<include>**/CoreMiscConfigurationTest.java</include>
<include>**/VelocityScenarioStateTemplateTest.java</include>
<include>**/JavaScriptScenarioStateTemplateTest.java</include>
<include>**/MustacheScenarioStateTemplateTest.java</include>
<include>**/GrpcStreamMessageScenarioTemplateTest.java</include>
<include>**/CaptureProcessorTest.java</include>
<include>**/OidcProviderGeneratorTest.java</include>
<include>**/OidcTokenCallbackTest.java</include>
<include>**/SamlProviderGeneratorTest.java</include>
<include>**/ScimProviderGeneratorTest.java</include>
<include>**/ScimResourceStoreTest.java</include>
<include>**/ScimConcurrentUpdateTest.java</include>
<include>**/ExampleBuilderRealisticValuesTest.java</include>
<include>**/HttpActionHandlerGraphQLChaosTest.java</include>
<include>**/ChaosAutoHaltMonitorTest.java</include>
<include>**/PreemptionSimulatorTest.java</include>
<include>**/LlmCostBudgetMonitorTest.java</include>
<include>**/LlmMetricsTest.java</include>
<include>**/PerExpectationMetricsTest.java</include>
<include>**/LogEntryRedactionTest.java</include>
<include>**/RecordedRequestsFileSystemPersistenceTest.java</include>
<include>**/LlmBackendResolverTest.java</include>
<include>**/LlmProviderSnifferTest.java</include>
<include>**/ForwardPathGenAiSpansTest.java</include>
<include>**/GenAiSpanExporterTest.java</include>
<include>**/BreakpointConfigurationTest.java</include>
<include>**/HttpActionHandlerBreakpointTest.java</include>
<include>**/BreakpointMatcherRegistryTest.java</include>
<include>**/BreakpointMatcherEndpointTest.java</include>
<include>**/BreakpointCallbackDispatcherTest.java</include>
<include>**/StreamFrameCallbackDispatcherTest.java</include>
<include>**/StreamFrameBreakpointRegistryTest.java</include>
<include>**/InboundBreakpointTest.java</include>
<include>**/MockStreamBreakpointTest.java</include>
<include>**/ChaosExperimentOrchestratorTest.java</include>
<include>**/HttpStateChaosProfileEndpointTest.java</include>
<include>**/SloSampleStoreTest.java</include>
<include>**/SloEvaluatorTest.java</include>
<include>**/HttpStateVerifySloEndpointTest.java</include>
<include>**/LoadScenarioOrchestratorTest.java</include>
<include>**/LoadMetricsTest.java</include>
<include>**/HttpStateLoadScenarioEndpointTest.java</include>
<include>**/DriftAlertNotifierTest.java</include>
<include>**/MaxLlmConversationBodySizeTest.java</include>
<include>**/SlowRequestConfigurationTest.java</include>
<include>**/HttpActionHandlerLlmCostBudgetTest.java</include>
<include>**/GrpcChaosRegistryTest.java</include>
<include>**/ValidationProxyTest.java</include>
<include>**/HttpLlmResponseActionHandlerTest.java</include>
<include>**/HttpLlmResponseActionHandlerChaosTest.java</include>
<include>**/HttpActionHandlerLlmEnforcementTest.java</include>
<include>**/DnsIntentRegistryTest.java</include>
<include>**/WasmRuntimeTest.java</include>
<include>**/WasmRuntimeRealModuleTest.java</include>
<include>**/WasmRuntimeModuleCacheTest.java</include>
<include>**/WasmRuntimeShapeAbiTest.java</include>
<include>**/WasmResponseShaperTest.java</include>
<include>**/HttpResponseActionHandlerWasmShapeTest.java</include>
<include>**/XPathEvaluatorTest.java</include>
<include>**/WasmBodyMatcherTest.java</include>
<include>**/GraphQLMatcherTest.java</include>
<include>**/JsonRpcMatcherTest.java</include>
<include>**/LlmConversationMatcherTest.java</include>
<include>**/JsonStringMatcherTest.java</include>
<include>**/RegexStringMatcherTest.java</include>
<include>**/InetAddressValidatorTest.java</include>
<include>**/JsonSchemaValidatorRemoteRefTest.java</include>
<include>**/HttpStateReadinessTest.java</include>
<include>**/ConfigurationPropertiesEffectiveConfigGlobalStateTest.java</include>
<include>**/LlmOptimisationReportServiceTest.java</include>
<include>**/HttpForwardActionResilienceTest.java</include>
<include>**/OtelEndpointConfigurationTest.java</include>
<include>**/PrometheusRemoteWriteExporterTest.java</include>
<include>**/PrometheusRemoteWriteProtocolVersionConfigurationTest.java</include>
<include>**/DriftDetectionConfigTest.java</include>
<include>**/BCKeyAndCertificateFactoryLazyProviderTest.java</include>
<include>**/OpenAiResponsesStateTest.java</include>
<include>**/LlmDatasetExporterTest.java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
<!-- jacoco:check minimum set ~3 points below the measured unit-test floor of 0.6858 (M6 ratchet, 2026-05-28). Tighter threshold catches genuine coverage regressions without flaking on small natural variation.
BRANCH bundle minimum (0.40) ensures branch coverage doesn't regress. -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>check</id>
<phase>verify</phase>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>BUNDLE</element>
<limits>
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>0.65</minimum>
</limit>
<limit>
<counter>BRANCH</counter>
<value>COVEREDRATIO</value>
<minimum>0.40</minimum>
</limit>
</limits>
</rule>
<!-- NOTE: a per-CLASS LINE floor was tried but is not enforceable on this
codebase — ~80 existing classes have <30% unit-line coverage (many 0%).
Enforcing "new/changed code must be covered" needs a diff-coverage gate,
not a JaCoCo per-class rule; tracked as a follow-up. BUNDLE LINE+BRANCH kept. -->
</rules>
</configuration>
</execution>
</executions>
</plugin>
<!-- produce a test-jar so sibling modules (e.g. mockserver-blob-s3/gcs/azure)
can reuse the shared BlobStoreContract without duplicating it -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
<configuration>
<includes>
<include>**/state/contract/**</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>