BDD
Tested from main at 9ba7f64.
Gherkin scenarios driving a real target against the syslog oracle. 688 tests, 588 passed, 100 skipped, 25 min 54 s across 8 lanes.
On this page: Lanes · Features across targets · Block lifecycle · Buffer discard policy · Buffered message delivery · Capacity threshold alert · Custom structured data — caller-supplied SD-ELEMENT · Message ID and message body · Message header fields · PRIVAL encoding · Power cycle replay from block store · Store and forward during sender outage · Store capacity limit and discard policy · Structured data — meta SD-ELEMENT · Structured data — origin · Structured data — time quality · Switch transport at runtime · TCP message delivery · TCP reconnection after server outage · TLS equivalence matrix · TLS reconnection after server outage · Timestamp encoding · UDP datagram path-MTU clipping · Walking skeleton end-to-end
Lanes
| Lane | Executables | Features | Tests | Passed | Failed | Skipped | Time |
|---|---|---|---|---|---|---|---|
| bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | 1 | 22 | 86 | 72 | 0 | 14 | 4 min 56 s |
| bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | 1 | 22 | 86 | 72 | 0 | 14 | 5 min 1 s |
| bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | 1 | 22 | 86 | 72 | 0 | 14 | 4 min 48 s |
| bdd-freertos-plustcp-mbedtls-plusfat-syslogng | 1 | 22 | 86 | 72 | 0 | 14 | 4 min 11 s |
| bdd-linux-openssl-syslogng | 1 | 22 | 86 | 81 | 0 | 5 | 2 min 3 s |
| bdd-linux-openssl-syslogng-passthrough | 1 | 22 | 86 | 58 | 0 | 28 | 46.1 s |
| bdd-linux-wolfssl-syslogng | 1 | 22 | 86 | 81 | 0 | 5 | 2 min 3 s |
| bdd-windows-openssl-otel | 1 | 22 | 86 | 80 | 0 | 6 | 2 min 6 s |
Features across targets
Every feature as its file describes it, and every scenario against every target it was offered to; each cell links to the scenario as it ran there. A skip is the target's tag filter or a @requires_ tag, and the tags column is what decided it.
Block lifecycle @buffered @store @tcp
The block store rotates blocks across files of fixed size. Once every record
in a non-active block is sent and acknowledged, that block is disposed
immediately — flash drivers prefer "erase-then-write" so producers can drain
retired blocks during idle moments rather than clustering erases at capacity
boundaries. The active write block is never disposed by this path.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| Active write block is not disposed when its only records are sent | @buffered @store @tcp | pass | pass | pass | pass | pass | skip | pass | pass |
| Older block is disposed once all its records are drained | @buffered @store @tcp | pass | pass | pass | pass | pass | skip | pass | pass |
Buffer discard policy @buffered @host_buffer @tcp
With a store that keeps nothing, the buffer is the only queue. Service holds
the record whose send failed and reads nothing more until it has gone, so the
records logged during an outage fill the buffer behind it. The discard policy
the logger was given decides what becomes of the records that do not fit, and
of the record Service holds once the buffer has filled behind it. Unless it
halts, the logger reports the loss to the collector as a record of its own.
Each scenario logs one record into the outage first, so Service is holding it
before the burst arrives and the burst meets a buffer nothing is read from.
The message body is padded so a hundred records outgrow the buffer on every
hosted target; the Linux queue holds ten records whatever their size.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| Discard-newest keeps the records that fitted and refuses the rest | @buffered @host_buffer @tcp | skip | skip | skip | skip | pass | skip | pass | pass |
| Discard-oldest keeps the latest records | @buffered @host_buffer @tcp | skip | skip | skip | skip | pass | skip | pass | pass |
| Halt stops the application when the buffer overflows | @buffered @host_buffer @tcp | skip | skip | skip | skip | pass | skip | pass | pass |
| Halt prevents further service after the buffer overflows | @buffered @host_buffer @tcp | skip | skip | skip | skip | pass | skip | pass | pass |
Buffered message delivery @udp
An example wired with a real (non-Null) buffer drives messages
through a service thread that drains the buffer and sends to the
oracle. Linux runner uses the pthread-driven Threaded example with
PosixMessageQueueBuffer; Windows runner uses the Win32-thread-driven
example with the portable CircularBuffer (S13.18); FreeRTOS-on-QEMU
runner uses the SingleTask example, itself buffered with
CircularBuffer + FreeRtosMutex + a FreeRTOS Service task (S08.04).
The same scenario pins all three wirings.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| Single buffered message arrives at the oracle | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| Multiple buffered messages arrive at the oracle | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
Capacity threshold alert @buffered @store @tcp
An early-warning callback fires when the block store crosses a configured
capacity threshold, before the terminal full-store callback engages.
The callback marker is observed via a host file on POSIX/Windows
(OnThresholdCrossed writes /tmp/solidsyslog_threshold_marker.log) and
via a [THRESHOLD-CROSSED] line on UART on FreeRTOS-on-QEMU (which the
behave harness's captured-stdout reader sees) — see
Bdd/features/steps/syslog_steps.py::_threshold_marker_present for the
cross-target assertion.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| Threshold callback fires when usage crosses configured threshold | @buffered @store @tcp | pass | pass | pass | pass | pass | skip | pass | pass |
| Threshold callback does not fire while usage stays below threshold | @buffered @store @tcp | pass | pass | pass | pass | pass | skip | pass | pass |
Custom structured data — caller-supplied SD-ELEMENT @udp
An integrator can attach a custom SD-ELEMENT to a single log call via
SolidSyslog_LogWithSd. The library frames it per RFC 5424 section 6.3 and the
element reaches the receiver alongside the per-instance SDs.
Message ID and message body @udp
The library includes message ID and message body in the RFC 5424 message.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| Message ID appears in the message | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| Message body appears in the message | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| Complete RFC 5424 message with all fields | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
Message header fields @udp
The library includes hostname, app-name, and process ID in the
RFC 5424 message header.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| Hostname matches the system hostname | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| App name matches the BDD target | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| Process ID matches the BDD target PID | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
PRIVAL encoding @udp
The library calculates RFC 5424 PRIVAL from facility and severity.
The BDD target accepts --facility and --severity flags,
defaulting to local0 (16) and info (6) when omitted.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| Valid facility and severity produce correct PRIVAL -- @1.1 | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| Valid facility and severity produce correct PRIVAL -- @1.2 | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| Valid facility and severity produce correct PRIVAL -- @1.3 | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| Valid facility and severity produce correct PRIVAL -- @1.4 | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| Out-of-range facility is reported as internal error | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| Out-of-range severity is reported as internal error | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
Power cycle replay from block store @buffered @store @tcp
After a power cycle, unsent messages persisted in the block store
are replayed before new messages. The collector sees old-session
sequenceIds followed by a jump to 1 (restart signal).
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| Stored messages replayed after power cycle | @buffered @store @tcp | pass | pass | pass | pass | pass | skip | pass | pass |
| Stored messages replayed after power cycle with HMAC-SHA256 at rest | @buffered @hmac @store @tcp | pass | pass | pass | pass | pass | skip | pass | pass |
| Stored messages replayed after power cycle with AES-256-GCM at rest | @aesgcm @buffered @store @tcp | pass | pass | pass | pass | pass | skip | pass | pass |
Store and forward during sender outage @buffered @store @tcp
When the syslog oracle goes down, messages accumulate in the
file-based store. Once the oracle recovers, the service loop
drains the store and delivers the buffered messages.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| Messages delivered after sender outage | @buffered @store @tcp | pass | pass | pass | pass | pass | skip | pass | pass |
| Messages delivered after a stored record is corrupted | @buffered @host_store @store @tcp | skip | skip | skip | skip | pass | skip | pass | pass |
| Stored messages wait for an HMAC key that is briefly unavailable | @buffered @hmac @store @tcp | pass | pass | pass | pass | pass | skip | pass | pass |
| Stored messages wait for an AES-256-GCM key that is briefly unavailable | @aesgcm @buffered @store @tcp | pass | pass | pass | pass | pass | skip | pass | pass |
| Messages delivered after the store freezes | @buffered @host_store @store @tcp | skip | skip | skip | skip | pass | skip | pass | pass |
Store capacity limit and discard policy @buffered @store @tcp
The block store uses rotating files with a configurable capacity.
When the store is full, the discard policy determines whether
the oldest or newest messages are dropped.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| Discard-oldest drops oldest messages when store overflows | @buffered @store @tcp | pass | pass | pass | pass | pass | skip | pass | pass |
| Discard-newest preserves oldest messages when store overflows | @buffered @store @tcp | pass | pass | pass | pass | pass | skip | pass | pass |
| Halt stops the application when store overflows | @buffered @store @tcp | pass | pass | pass | pass | pass | skip | pass | pass |
| Halt prevents further service after store overflows | @buffered @store @tcp | pass | pass | pass | pass | pass | skip | pass | pass |
Structured data — meta SD-ELEMENT @udp
The library populates the IANA-registered "meta" SD-ELEMENT with
sequenceId, sysUpTime, and language per RFC 5424 section 7.3.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| First message has sequence ID 1 | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| Sequence ID increments with each message | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| Message includes sysUpTime and language from example callbacks | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
Structured data — origin @udp
The library includes origin metadata identifying the software component.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| Origin software appears in structured data | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| Origin version appears in structured data | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| Origin enterpriseId appears in structured data | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| Origin ip parameter appears in structured data | @udp | pass | pass | pass | pass | pass | pass | pass | pass |
| All standard structured data present | @rtc @udp | skip | skip | skip | skip | pass | pass | pass | pass |
| All standard structured data present (no RTC) | @no_rtc @udp | pass | pass | pass | pass | skip | skip | skip | skip |
Structured data — time quality @udp
The library includes time quality metadata in structured data. RTC-equipped
targets (Linux, Windows) report tzKnown="1" and isSynced="1"; embedded
targets without an RTC report tzKnown="0" and isSynced="0", per the
no-RTC product stance modelled in the FreeRTOS reference example.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| Time quality appears in structured data | @rtc @udp | skip | skip | skip | skip | pass | pass | pass | pass |
| Time quality and sequence ID coexist | @rtc @udp | skip | skip | skip | skip | pass | pass | pass | pass |
| Time quality reflects no RTC | @no_rtc @udp | pass | pass | pass | pass | skip | skip | skip | skip |
| Time quality and sequence ID coexist (no RTC) | @no_rtc @udp | pass | pass | pass | pass | skip | skip | skip | skip |
Switch transport at runtime @buffered
The BDD target always wraps its UDP and TCP senders in a
SwitchingSender. The --transport CLI flag sets the initial selector
value, and the interactive `switch` command updates it at runtime.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| Switch from UDP to TCP mid-run delivers via both | @buffered @tcp @udp | pass | pass | pass | pass | pass | skip | pass | pass |
| Switch from TCP to TLS mid-run delivers via both reliable transports | @buffered @tls | pass | pass | pass | pass | pass | skip | pass | pass |
TCP message delivery @tcp
An example wired with a real (non-Null) buffer sends messages via
TCP transport with RFC 6587 octet-counting framing. Linux runner
uses the pthread-driven Threaded example; Windows runner uses the
Win32-thread-driven example (S13.18). The same scenario pins both
wirings against their respective oracle (syslog-ng / OTel collector).
TCP reconnection after server outage @tcp
The TCP sender detects connection failure and reconnects when the
server recovers. With no store, what becomes of the records logged
during the outage is the buffer's to decide. A queue keeps them:
Service holds the record whose send failed and reads nothing more
from the buffer until it has gone, so they wait and arrive, in order,
once the server is back. A passthrough buffer has nowhere to keep
them, so they are lost, and the logger reports the loss.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| Messages delivered after server recovery | @buffered @tcp | pass | pass | pass | pass | pass | skip | pass | pass |
| Records sent during the outage are lost, and the loss is reported once the server is back | @passthrough @tcp | skip | skip | skip | skip | skip | pass | skip | skip |
TLS equivalence matrix @tls @tls_matrix
Given equivalent configuration, SolidSyslog reaches the same decision on
every target - the same connect-or-refuse outcome, and the same portable
detail code from enum SolidSyslogTlsStreamErrors. Each cell runs on every
BDD lane, so one that passes has been proved against both TLS libraries,
both collectors and every transport the library ships.
The library that spoke is never asserted. It is the one thing that is
supposed to differ.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| A peer signed by the trusted anchor and named as expected is authorised | @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A pinned certificate is authorised with no chain at all | @pins @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A peer presented with its issuer satisfies both the anchor and the pin | @pins @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A pin set holding a certificate the collector no longer presents keeps delivering | @pins @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| Opting out of the peer name check accepts a name that would not have matched | @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A device that authenticates itself as well delivers over mutual TLS | @mtls @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A device that declares no peer name delivers, and says the peer is unnamed | @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A client credential the library cannot complete does not stop delivery | @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A pin RFC 5425 makes mandatory but no longer trusts is honoured, and objected to | @pins @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A peer that does not chain to the trusted anchor is refused | @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A peer whose certificate names another host is refused | @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A pin matching nothing the collector presents is refused | @pins @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A device given neither anchors nor pins never connects, and says why | @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A cipher policy naming a suite the collector offers connects at the version it offers | @cipher @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A device connects at TLS 1.3 to a collector that refuses anything older | @tls @tls13 @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A cipher policy the collector cannot satisfy is refused rather than quietly widened | @cipher @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A collector whose certificate has expired is refused | @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A collector whose certificate is not valid yet is refused | @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A pin does not extend the validity period of the certificate it names | @pins @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A chain that reaches no anchor is named ahead of the dates the certificate carries | @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| The dates a certificate carries are named ahead of a name that does not match | @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A device the collector rejects after the handshake is told, rather than believing it delivered | @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| Rotating the trust anchors lets a refused device deliver without a restart | @buffered @rotation @tls @tls_matrix | pass | pass | pass | pass | pass | skip | pass | pass |
| Rotating the trust anchors lets a refused device deliver, and the record it refused is lost | @passthrough @rotation @tls @tls_matrix | skip | skip | skip | skip | skip | pass | skip | skip |
| Rotating the pin set stops a delivering device at its next connection | @pins @rotation @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| Rotating the expected peer name stops a delivering device | @rotation @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| A redirected device carries the identity it expects with it | @rotation @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
| Rotating in the client credential lets a refused device deliver | @mtls @rotation @tls @tls_matrix | pass | pass | pass | pass | pass | pass | pass | pass |
TLS reconnection after server outage @buffered @tls
A TLS stream writes through the plain TCP stream it is given, so a peer
that closes its end should be seen the same way over TLS as over TCP.
The risk is a TLS library taking a record into its own buffering without
reaching the transport, and so returning success for a record that the
closed connection will never deliver. If none is lost, the records logged
during the outage wait in the buffer and arrive, in order, once the server
is back.
Timestamp encoding @rtc @udp
The library captures the timestamp at raise-time via an injected clock
and formats it as RFC 5424 FULL-DATE "T" FULL-TIME. The no-RTC product
shape (config.clock = NULL -> NILVALUE TIMESTAMP per RFC 5424 section 6.2.3.1)
is covered by formatter unit tests; syslog-ng silently substitutes
receipt time for ${ISODATE} and ${S_ISODATE} when the wire TIMESTAMP
is NILVALUE, so a BDD assertion against the oracle would re-test what
the unit tests already cover, with no extra coverage.
UDP datagram path-MTU clipping @requires_message_size_1500 @udp
When a UDP message exceeds the path MTU the sender clips it to the
path-MTU's safe payload, walking back over any partial UTF-8
codepoint at the trim point so the receiver always sees valid UTF-8.
The oversize scenario is POSIX-only (tagged windows_wip): the
Windows BDD runner uses the OTel Collector on 127.0.0.1, and
loopback's ~65535-byte MTU never triggers WSAEMSGSIZE for any
message inside SOLIDSYSLOG_MAX_MESSAGE_SIZE, so the EMSGSIZE retry
path can't actually fire. Full delivery runs on both runners.
| Scenario | Tags | bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng | bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng | bdd-freertos-lwipraw-mbedtls-fatfs-syslogng | bdd-freertos-plustcp-mbedtls-plusfat-syslogng | bdd-linux-openssl-syslogng | bdd-linux-openssl-syslogng-passthrough | bdd-linux-wolfssl-syslogng | bdd-windows-openssl-otel |
|---|---|---|---|---|---|---|---|---|---|
| Full delivery of a UTF-8 message within the path MTU | @requires_message_size_1500 @udp | skip | skip | skip | skip | pass | pass | pass | pass |
| Oversize UTF-8 message is clipped at a codepoint boundary | @requires_message_size_1500 @udp @windows_wip | skip | skip | skip | skip | pass | pass | pass | skip |
Walking skeleton end-to-end @udp
The BDD target sends an RFC 5424 message via UDP.
syslog-ng receives it and writes the parsed fields to a log file.