Skip to content

Run the 3.1r1 conformance tests - #481

Merged
jadamcrain merged 16 commits into
mainfrom
dnp3c-3.1r1
Oct 16, 2026
Merged

jadamcrain merged 16 commits into
mainfrom
dnp3c-3.1r1

Conversation

@jadamcrain

@jadamcrain jadamcrain commented Oct 14, 2026 •

Copy link
Copy Markdown
Member

Runs the conformance tests under revision 3.1r1 of the DNP3 IED Certification Procedure, at subset level 3, in place of 2.7.

Changes

  • Revision and configuration. The tests run -rev 3.1r1 at subset level 3. device.ini sets 3.1r1's options, and lists the outstation gaps that some tests fail on, with their issues.
  • Plugin. The plugin follows dnp3c's current IntegrationPlugin: one uninstall, generatePattern, checkOperate and checkNotOperate that each take a kind, and PointKind in place of InputKind. The configuration uses dnp3c's renamed keys.
  • dnp3c from source. dnp3c with 3.1r1 isn't on Maven Central yet, so the conformance job checks out stepfunc/dnp3c at a pinned commit and installs it. Once a release has 3.1r1, the job goes back to the Maven Central version.
  • Capture check. It looks in results/3.1r1/L3, where dnp3c now keeps that revision's results.

Expect the conformance job to fail

A run stops at its first failure. The first known gap is #478: a read of a point type whose points are all uninstalled gets a null response, without IIN2.1 or IIN2.2. So the run stops at 8.13.2-4. The results, with the report, are uploaded either way.

Local results

  • dnp3c's previous commit, which already had the plugin changes:
    • every section from 8.14 on, run separately, passes, apart from the gap tests device.ini lists
    • those gap tests uninstall the right points, then fail only on the known gap
  • The pinned commit, which only renames option keys: the configuration loads, and 8.2, 8.4 and 8.22 pass.
  • Off by configuration: sections 9 (network) and 10 (output events).

Runs dnp3c's revision 3.1r1 at subset level 3, against the dnp3c built
locally (0.1.0-SNAPSHOT) until it's released.

The plugin implements the actions 3.1r1 adds: cold restart support,
setting an analog input, frozen counter and small analog input events,
uninstalling frozen counters and analog inputs, normal and abnormal
flags, an event on one point, and checking frozen counter events.

Fixes to the test outstation that dnp3c's stricter checks need, which
2.7 passes with too:
- a binary output in local mode clears ONLINE and keeps its other flags,
  rather than setting LOCAL_FORCED, and a command to it gets LOCAL (7),
  as TB2017-001's 8.6.4 tests and 3.1r1's check
- an analog output among 10 to 19 accepts 70000, the 32-bit value
  3.1r1's 8.4.1.2.13 commands

device.ini gives the 3.1r1 values the outstation's setup implies, and
lists the tests that fail on gaps in the dnp3 outstation.
The plugin implements IntegrationPlugin's kind-based methods: uninstall,
generatePattern, checkOperate and checkNotOperate, in place of the
per-type ones, with PointKind in place of InputKind. The configuration
uses dnp3c's renamed keys (binaryOutput.* for control.*, one pattern for
the input groups' event options, supports.doubleBitInput* and
supports.analogInput*), and drops supports.noClassAssignment, an option
dnp3c removed.
dnp3c with revision 3.1r1 isn't on Maven Central yet, so the
conformance job checks it out at a pinned commit and installs the
version conformance/pom.xml names. The packet capture check looks in
the folder dnp3c now keeps 3.1r1's level 3 results in.
dnp3c now names the tests 3.1r1 doesn't number with their section's
number and a letter, e.g. 8.13.2d and 8.21d, so the list of known gaps
in device.ini uses those, and the conformance job builds the dnp3c
commit that introduced them.
Uninstalling binary or analog output status only disabled their controls,
and the points stayed in the database, so a read of them still returned
data. Leave them out of the database too, as for the input types.
It answers a read of a point type the outstation doesn't have the same
way for every type (dnp3c #70).
The conformance job becomes a matrix of two runs: revision 2.7 at subset
level 2 and 3.1r1 at subset level 3, each with its own results artifact.
A job keeps the name conformance, which branch protection requires, and
passes only if both runs pass. Releases publish both reports, with an
index linking them, and package both in conformance-results.zip.
Link the 3.1 rev 1 and 2.7 reports, and replace the text saying level 3
procedures are still being written.
dnp3c now excludes procedures through the configuration, each for one
revision, and reports them as not run. Exclude 3.1r1's 8.26.2 (#480), so
the run carries on to the procedures after it, and build with the dnp3c
commit that qualifies exclusions by revision.
@jadamcrain
jadamcrain marked this pull request as ready for review October 15, 2026 20:28
dnp3c's tolerance on the times it measures is now an option,
test.timingToleranceMs (dnp3c #93); the default stays 500 ms for timed
intervals and is 500 ms, up from 200 ms, past each timeout.
The conformance tests run with device.ini, which the pom passes to
dnp3c. device.properties no longer passes dnp3c's validation either.
dnp3c 0.2.0, with revision 3.1r1 and the timing tolerance option, is on
Maven Central, so CI no longer builds dnp3c from source at a pinned
commit.
@jadamcrain
jadamcrain merged commit 23f80c0 into main Oct 16, 2026
37 checks passed
@jadamcrain
jadamcrain deleted the dnp3c-3.1r1 branch October 16, 2026 04:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant