A Go test framework for EPP (Extensible Provisioning Protocol) client libraries, with first-class support for InternetX, NiCAT, EURid, and DENIC. Covers the full EPP operation surface — domains, contacts, hosts, polling — plus DENIC's proprietary text-based RRI protocol. Tests run locally against in-process mock servers and against OT&E/sandbox environments using the same test code and without any changes to configuration.
Core value: Give EPP client developers fast, reliable, locally-runnable tests that also work against real registrar environments. Write a scenario once; run it offline against a mock server or live against an OT&E endpoint by switching a config file.
No Go needed: run the mock servers from Docker and point your EPP or RRI client (PHP, Python, Java, …) at them.
# EPP over TLS on 127.0.0.1:7700
docker run --rm -p 7700:7700 riftcell/epp-mock:latest
# DENIC RRI over plain TCP on 127.0.0.1:7701
docker run --rm -p 7701:7701 --entrypoint /mock-rri-server riftcell/epp-mock:latest -addr 0.0.0.0:7701
# With a fault flag: repeat -addr, because passing arguments replaces the default CMD
docker run --rm -p 7700:7700 riftcell/epp-mock:latest -addr 0.0.0.0:7700 --login-mode=alwaysNote: any arguments after the image name replace the default
-addr 0.0.0.0:7700, so always include-addr 0.0.0.0:<port>when you pass flags. Without it the server listens only on the container's loopback and the published port can't be reached.
See How-To: Docker Mock for wire framing, TLS settings and what the mock returns. Ready-to-run PHP clients are in docs/examples/php/.
# 1. Clone the repository (or add as a Go module dependency)
git clone https://github.com/riftcell/epp-test && cd epp-test
# 2. Copy the example config (unit tests need no real credentials)
cp configs/epp-test.example.yaml epp-test.yaml
# 3. Run the unit test suite
go test -tags unit ./...| Guide | Description |
|---|---|
| Getting Started | Install, configure, and run your first test in under 10 minutes |
| How-To: Docker Mock | Test a client in any language (e.g. PHP) against the riftcell/epp-mock image |
| How-To: Domains | Domain lifecycle: check, create, info, update, renew, transfer, delete |
| How-To: Contacts | Contact lifecycle: create, info, update, delete, domain association |
| How-To: Hosts | Host lifecycle: create subordinate nameserver, info, update glue, delete |
| How-To: Polling | EPP message queue: trigger, wait, assert content, ack, verify empty |
| How-To: DENIC RRI | DENIC-specific RRI operations: TRANSIT, AUTHINFO1/AUTHINFO2, info, delete |
| Config Reference | Every RegistrarConfig field with env var, type, default, and validation |
| Architecture | 4-layer diagram and how to add a new registrar |
| Conventions | Go coding conventions for this project |
| Security | Security policy and vulnerability reporting |
| How-To: Integration Testing | Three-tier testing strategy: in-process, standalone mock server, and real OT&E |
| License | MIT license terms for this project |
| Contributors | People who have contributed to this project |
| Command | What runs |
|---|---|
go test ./... |
Compile-time assertions only (no network, no mock servers) |
go test -tags unit ./... |
Full unit suite using in-process mock servers (offline, fast) |
make mock-epp-server / make mock-rri-server |
Long-running mock server in a separate process for manual integration testing |
docker run -p 7700:7700 riftcell/epp-mock:latest |
Same mock server from Docker, for clients in any language (see Docker Mock) |
go test -tags integration ./... |
Integration suite against OT&E endpoints (requires credentials) |
See How-To: Integration Testing for a detailed walkthrough of all three tiers, including Docker Compose examples.
Every push and pull request to main runs the CI workflow defined in .github/workflows/ci.yml. Each CI step has a local equivalent so a red build can be reproduced without reading the YAML:
| CI step | Local command |
|---|---|
| Build | make build |
| Vet | make vet |
| Compile check | make test |
| Unit tests | make test-unit |
| Lint | make lint |
| Vulnerability scan | make govulncheck |
CI runs only the offline unit-tagged suite against in-process mock servers. Integration tests (make test-integration, ./run-integration.sh) are not run in CI because they need OT&E credentials and network access to registrar sandboxes; run them locally or in a separate credentialed pipeline.
Unit test reports (junit.xml, report.json, report.txt, report.html) are uploaded as the unit-test-reports artifact on every run, including failures.
github.com/riftcell/epp-test
Requires Go 1.26.9 or later.