cf9ce91e51
The first and only thing in the MTConnect workstream that exercises the driver
against a real Agent; everything else runs on canned XML.
Fixture (Docker/): two services, both stock images with this folder bind-mounted.
- `agent` mtconnect/agent:2.7.0.12 on :5000. NOTE the repo name: the source
project is mtconnect/cppagent but the PUBLISHED image is
mtconnect/agent; mtconnect/cppagent does not exist on Docker Hub.
- `adapter` a stdlib SHDR feeder. Required, not optional: the agent image ships
only the binary + schemas/styles, so a lone Agent answers /probe and
then reports every observation UNAVAILABLE forever, which can prove
nothing about reads or streaming.
Devices.xml seeds one DataItem per inference branch (SAMPLE+units, TIME_SERIES,
PART_COUNT/LINE_NUMBER, controlled vocab, DATA_SET, CONDITION), gives every named
item `name != id` (the inverse of the hand-authored unit fixtures), and leaves one
EVENT permanently unfed so UNAVAILABLE -> BadNoCommunication has a live subject.
Suite (12 tests) asserts STRUCTURALLY against the Agent's own /probe response, never
by literal id, so it survives an edit to Devices.xml and can be pointed at a real
machine tool via MTCONNECT_AGENT_ENDPOINT. It skips cleanly (12/12) when no Agent
answers, and each test carries a hard [Fact(Timeout)] so a half-up fixture cannot
wedge a build.
Three findings from bringing the fixture up, each now pinned in a comment:
- agent.cfg must be pure ASCII; one non-ASCII byte in a COMMENT makes the config
parser reject the whole file with a bare "Failed / Stopped at line: N" and exit.
- `sampleCount` is an attribute of a TIME_SERIES observation, not of a DataItem
declaration. A real Agent meeting one on a declaration DROPS THE ENTIRE DATA ITEM
from the device model, so the inference only ever sees null and a live TIME_SERIES
tag is always variable-length. Asserted, not ignored.
- The Agent's own <Agent> self-model publishes update-rate SAMPLEs that tick whether
or not any adapter is attached. Excluding them is load-bearing: with them included
the "live stream delivered a changed value" test passed with the fixture's data
source deliberately stopped.
MTConnectError-under-HTTP-200 is NOT covered live and cannot be: cppagent 2.7 answers
an unknown device 404 and an out-of-range sequence 400, each with a well-formed error
body. That shape stays canned-only, and the suite says so.
51 lines
2.0 KiB
INI
51 lines
2.0 KiB
INI
# MTConnect C++ Agent configuration for the OtOpcUa integration-test fixture.
|
|
#
|
|
# ASCII ONLY. The Agent's config parser rejects the whole file on a non-ASCII byte --
|
|
# even inside a comment -- with a bare "Failed / Stopped at line: N" and exits. An em
|
|
# dash in a comment is enough to make the fixture never start.
|
|
#
|
|
# The image's CMD is `/usr/bin/mtcagent run /mtconnect/config/agent.cfg`, so this file is
|
|
# bind-mounted at exactly that path (see docker-compose.yml). Paths below are ABSOLUTE on
|
|
# purpose: a relative `Devices` is resolved against the Agent's working directory
|
|
# (/home/agent), not against this file, and would silently start an Agent with no device
|
|
# model.
|
|
|
|
Devices = /mtconnect/config/Devices.xml
|
|
Port = 5000
|
|
ServiceName = OtOpcUaMTConnectFixture
|
|
|
|
# 2^14 = 16384 observations retained. Generous on purpose: the driver's /sample pump
|
|
# re-baselines through /current when its cursor falls out of the Agent's ring buffer, and
|
|
# a small buffer would make the fixture exercise that recovery path on every run instead
|
|
# of the steady-state streaming the suite is here to prove.
|
|
BufferSize = 14
|
|
CheckpointFrequency = 1000
|
|
MaxAssets = 128
|
|
|
|
# MTConnect is a read-only source for this driver; the Agent must not accept writes.
|
|
AllowPut = false
|
|
|
|
SchemaVersion = 2.0
|
|
MonitorConfigFiles = false
|
|
Pretty = true
|
|
|
|
# The block name must equal the Device name attribute in Devices.xml (OtFixtureCnc) --
|
|
# that is how the Agent binds an adapter connection to a device. "adapter" is the compose
|
|
# service name of the SHDR feeder; the Agent dials OUT to it.
|
|
Adapters {
|
|
OtFixtureCnc {
|
|
Host = adapter
|
|
Port = 7878
|
|
ReconnectInterval = 2000
|
|
}
|
|
}
|
|
|
|
# Log to stdout rather than a file: /mtconnect/log is an image-declared VOLUME that is
|
|
# created root-owned while the Agent runs as uid 1000, so file logging fails to open.
|
|
# stdout also puts adapter-connect / device-model errors straight into `docker logs`,
|
|
# which is how you diagnose a fixture that comes up but reports everything UNAVAILABLE.
|
|
logger_config {
|
|
logging_level = info
|
|
output = cout
|
|
}
|