extra-test-suite · v1.2.x
Docs · Servers

Servers overview

Three servers, three ports, three purposes — one fills the NodeManagement gap, one exercises every RSA security policy, one fills the HistoryUpdate gap. All built on open62541.

This suite ships three services, all built on open62541 v1.4.8.

Port Service Purpose
24840 open62541-nm NodeManagement (the gap in UA-.NETStandard)
24841 open62541-all-security Every RSA policy, every mode, Anon + Username/Password
24842 open62541-historizing HistoryRead + HistoryUpdate on a Double (added in v1.2.0)

Why three

You're testing… Use
AddNodes / DeleteNodes / AddReferences / DeleteReferences open62541-nm (24840)
Endpoint negotiation against a second stack open62541-all-security (24841)
Username/password against open62541's PKI open62541-all-security (24841)
HistoryInsert / HistoryReplace / HistoryUpdate / HistoryDeleteRaw open62541-historizing (24842)
Behaviour delta between open62541 and UA-.NETStandard all three, side-by-side

Everything else — the test data, the methods, the dynamic variables, the alarms — is covered by uanetstandard-test-suite. This suite is the extras.

Both servers share

Property Value
Upstream stack open62541 v1.4.8
Build mode Static link, multi-stage Debian slim
Inside the container Listens on port 4840
Outside the container Mapped to 24840 / 24841 / 24842 on the host
Restart policy (dev) unless-stopped
Restart policy (CI) no
Image registry ghcr.io/php-opcua/extra-test-suite/<service>

The internal port is always 4840 — the host-side mapping in docker-compose.yml is what differentiates them.

Address spaces

Service Address space contents
open62541-nm open62541's ci_server example baseline (mostly empty; tests populate it)
open62541-all-security open62541's default (Server + Objects folders, no test data)
open62541-historizing Single historizing Double at ns=2;s=Historizing.Counter, in-memory backend

Neither server ships the curated ~300-node test address space of uanetstandard-test-suite. The point of these servers is the service set and the security stack, not test data.

If you need rich test data, point your client at uanetstandard-test-suite for those operations and at this suite only for NodeManagement / open62541-specific tests.

CMake flags

All three servers share a common CMake baseline:

-DUA_ENABLE_SUBSCRIPTIONS=ON
-DUA_ENABLE_METHODCALLS=ON
-DUA_ENABLE_HISTORIZING=ON
-DUA_NAMESPACE_ZERO=FULL
-DUA_BUILD_EXAMPLES=ON
-DBUILD_SHARED_LIBS=OFF

Plus the per-service additions:

Service Extra CMake flags
open62541-nm -DUA_ENABLE_NODEMANAGEMENT=ON
open62541-all-security -DUA_ENABLE_ENCRYPTION=OPENSSL
open62541-historizing (none — baseline already enables historizing)

UA_NAMESPACE_ZERO=FULL includes the full standard namespace (important for tests that depend on standard types and references).

What runs inside the container

Service Binary How it starts
open62541-nm ci_server (upstream example) sh -c dispatch script — iterates a fallback chain and execs the first binary that exists
open62541-all-security all_security_server (custom — server.c) Via entrypoint.sh that generates a cert
open62541-historizing historizing_server (custom — server.c) Direct CMD ["/usr/local/bin/historizing_server"] — no shell wrapper, no cert generation

For open62541-nm, the entrypoint searches for a recognised example binary in priority order (ci_serverserver_cttaccess_control_server → …). This way, the image keeps working if upstream renames an example.

For open62541-all-security and open62541-historizing, the custom server.c is added to open62541's examples/CMakeLists.txt during the build, so each ships as another example binary.

Image lifecycle

Event What happens
Tag push v* Publish workflow builds + pushes every service to GHCR
Pull :latest Always the most recently-pushed vX.Y.Z
Pull :vX.Y.Z Immutable — exact version

The whole repo versions together. A new service in docker-compose.yml triggers a minor bump; an open62541 version bump is a patch.

Resource budget

Each server is ~50-70 MB RAM at idle. Combined: ~180 MB. Under load they typically stay under 250 MB total — cheap to leave running.