Testing and live validation
The offline suites, the three live tiers, what the live validation of 2026-11-11 covered, and the quality gates.
Suites#
| Suite | Command | Needs credentials | Size on 2026-11-11 |
|---|---|---|---|
| Unit | mvn test | No | 1571 tests |
| WireMock | mvn test -Pwiremock | No | 1313 tests |
| Live, read-only | mvn test -Pintegration-readonly | Yes | 274 tests |
| Live, dry run | mvn test -Pintegration-dryrun | Yes | Read-only tier plus the dry-run and validate operations |
| Live, full | mvn test -Pintegration-full -Dconfirm.destructive=true | Yes | Create, update and delete lifecycles |
Unit tests cover deserialization, builders, pagination, exception mapping and the design engines. WireMock tests start a local HTTP server and assert the full request and response cycle: URL, verb, headers, body, paging, error mapping and OAuth. The suite holds about 900 request-body assertions.
Live tiers#
Each live tier includes the one before it.
export EQUINIX_ACCESS_KEY=your-client-id
export EQUINIX_SECRET_KEY=your-client-secret
mvn test -Pintegration-readonly| Tier | Sends | Safe on a production account |
|---|---|---|
integration-readonly | GET, POST .../search, and other reads | Yes. No mutation. |
integration-dryrun | Adds dryRun=true creates and updates and the validate operations | Yes. No resource is created. |
integration-full | Real create, update and delete, with cleanup in reverse order | No. Use a test account. It needs -Dconfirm.destructive=true as a second opt-in. |
run-live.sh and run-live.ps1 wrap these commands. The tests read credentials from environment variables. Earlier releases took them as -D system properties, which the Surefire plugin copied into its XML reports.
Catalog sweep#
All 33 OpenAPI specifications in the Equinix API catalog were swept operation by operation. 280 operations were classified as safe to run against a production account, and each has a live test. 198 operations that look like reads and have side effects, such as quote requests and report generation jobs, were excluded from the read-only tier.
Port create, port delete and Internet Access delete are tested with WireMock only, because a defect in a live run would place an order or delete a resource that cannot be restored.
Skip rule#
A live test is skipped when the service answers 401 or 403, which means that the credential lacks the product. A deserialization error, an unmapped enum value or a 5xx fails the test. A passing read-only run therefore shows that the models read the responses of the live service, in addition to matching the specifications. Each run writes a per-call report to target/integration-report.json.
Live validation of 2026-11-11#
The validation used a real account. It sent reads, dryRun=true creates and public PeeringDB queries, and it ran the MCP server over stdio with read-only toolsets. It sent no update, no delete and no create without dryRun.
| Item | Result |
|---|---|
| IAM host | api.equinix.com/v1/roles 404; access.eqix.equinix.com 200, 79 roles |
Customer Portal page envelope | Confirmed on finance accounts, reports, attachments and asset search |
location.metroCode on a service-provider Z-side | Required: HTTP 400 EQ-3142501 without it, dry run 200 with it |
| Precision Time | GET /timeServices 502; unfiltered search 200, 586 services |
| Service-profile ETag | Quoted version, "5" |
Fabric avgLatency | Round-trip: SV to DC measured 65.8 ms |
| Live rate card | Every lookup had failed with 400; fixed; EVPL 1 Gbps in DC is USD 200 per month |
PeeringDB netfac?asn= | Ignored by PeeringDB; the client now queries by net_id |
| MCP stdout and secrets | stdout pure JSON-RPC; secret masked at debug level |
The following table shows the read-only tier before and after the fixes.
| Run | Failures and errors | Skipped |
|---|---|---|
| Before | 51 | 84 |
| After | 35 | 84 |
The remaining 35 failures have three causes, none of which is a response-parsing or request-shape defect in the SDK: IAM project-scoped calls that need an access-policy token, test inputs the services reject (for example a missing IBX account number, or a device type that does not support ping), and server-side 5xx or 404 answers.
Three items were not re-verified live on that date: Peering Intelligence end to end, because PeeringDB throttled anonymous calls for about an hour; the shape of a successful STS token exchange; and the PATCH content types for ports and service tokens. The Beta families under fabric.beta() were not part of the run.
Quality gates#
| Gate | Threshold | Measured on 2026-11-11 |
|---|---|---|
| JaCoCo line and instruction coverage, whole bundle | 75% | 87.2% line, 89.3% instruction, 75.4% branch |
| JaCoCo per package | 30% | Passes |
| IAM and STS client packages | 70% | Passes |
| Javadoc | A broken {@link} or @see reference fails the build | Passes |
PIT mutation testing, design.value | Mutation threshold 50, under the opt-in pit profile; part of the release checklist | Not run in the default build |
Architecture tests fail the build on structural regressions: DependencyHygieneTest (optional dependencies stay optional), ApiParamContractTest (an enum's query form equals its body form), MulticloudPackageContractTest (the multicloud model imports only core, the JDK, Jackson and Lombok).
Samples on this site#
Every Java block on this site is compiled against the SDK classes before publication, which checks names and types. The samples are not run against the service.