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

LaneExecutablesFeaturesTestsPassedFailedSkippedTime
bdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogng12286720144 min 56 s
bdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogng12286720145 min 1 s
bdd-freertos-lwipraw-mbedtls-fatfs-syslogng12286720144 min 48 s
bdd-freertos-plustcp-mbedtls-plusfat-syslogng12286720144 min 11 s
bdd-linux-openssl-syslogng1228681052 min 3 s
bdd-linux-openssl-syslogng-passthrough122865802846.1 s
bdd-linux-wolfssl-syslogng1228681052 min 3 s
bdd-windows-openssl-otel1228680062 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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Active write block is not disposed when its only records are sent@buffered @store @tcppasspasspasspasspassskippasspass
Older block is disposed once all its records are drained@buffered @store @tcppasspasspasspasspassskippasspass

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Discard-newest keeps the records that fitted and refuses the rest@buffered @host_buffer @tcpskipskipskipskippassskippasspass
Discard-oldest keeps the latest records@buffered @host_buffer @tcpskipskipskipskippassskippasspass
Halt stops the application when the buffer overflows@buffered @host_buffer @tcpskipskipskipskippassskippasspass
Halt prevents further service after the buffer overflows@buffered @host_buffer @tcpskipskipskipskippassskippasspass

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Single buffered message arrives at the oracle@udppasspasspasspasspasspasspasspass
Multiple buffered messages arrive at the oracle@udppasspasspasspasspasspasspasspass

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Threshold callback fires when usage crosses configured threshold@buffered @store @tcppasspasspasspasspassskippasspass
Threshold callback does not fire while usage stays below threshold@buffered @store @tcppasspasspasspasspassskippasspass

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
A custom SD-ELEMENT reaches the oracle@udppasspasspasspasspasspasspasspass

Message ID and message body @udp

The library includes message ID and message body in the RFC 5424 message.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Message ID appears in the message@udppasspasspasspasspasspasspasspass
Message body appears in the message@udppasspasspasspasspasspasspasspass
Complete RFC 5424 message with all fields@udppasspasspasspasspasspasspasspass

Message header fields @udp

The library includes hostname, app-name, and process ID in the
RFC 5424 message header.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Hostname matches the system hostname@udppasspasspasspasspasspasspasspass
App name matches the BDD target@udppasspasspasspasspasspasspasspass
Process ID matches the BDD target PID@udppasspasspasspasspasspasspasspass

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Valid facility and severity produce correct PRIVAL -- @1.1 @udppasspasspasspasspasspasspasspass
Valid facility and severity produce correct PRIVAL -- @1.2 @udppasspasspasspasspasspasspasspass
Valid facility and severity produce correct PRIVAL -- @1.3 @udppasspasspasspasspasspasspasspass
Valid facility and severity produce correct PRIVAL -- @1.4 @udppasspasspasspasspasspasspasspass
Out-of-range facility is reported as internal error@udppasspasspasspasspasspasspasspass
Out-of-range severity is reported as internal error@udppasspasspasspasspasspasspasspass

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).

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Stored messages replayed after power cycle@buffered @store @tcppasspasspasspasspassskippasspass
Stored messages replayed after power cycle with HMAC-SHA256 at rest@buffered @hmac @store @tcppasspasspasspasspassskippasspass
Stored messages replayed after power cycle with AES-256-GCM at rest@aesgcm @buffered @store @tcppasspasspasspasspassskippasspass

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Messages delivered after sender outage@buffered @store @tcppasspasspasspasspassskippasspass
Messages delivered after a stored record is corrupted@buffered @host_store @store @tcpskipskipskipskippassskippasspass
Stored messages wait for an HMAC key that is briefly unavailable@buffered @hmac @store @tcppasspasspasspasspassskippasspass
Stored messages wait for an AES-256-GCM key that is briefly unavailable@aesgcm @buffered @store @tcppasspasspasspasspassskippasspass
Messages delivered after the store freezes@buffered @host_store @store @tcpskipskipskipskippassskippasspass

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Discard-oldest drops oldest messages when store overflows@buffered @store @tcppasspasspasspasspassskippasspass
Discard-newest preserves oldest messages when store overflows@buffered @store @tcppasspasspasspasspassskippasspass
Halt stops the application when store overflows@buffered @store @tcppasspasspasspasspassskippasspass
Halt prevents further service after store overflows@buffered @store @tcppasspasspasspasspassskippasspass

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
First message has sequence ID 1@udppasspasspasspasspasspasspasspass
Sequence ID increments with each message@udppasspasspasspasspasspasspasspass
Message includes sysUpTime and language from example callbacks@udppasspasspasspasspasspasspasspass

Structured data — origin @udp

The library includes origin metadata identifying the software component.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Origin software appears in structured data@udppasspasspasspasspasspasspasspass
Origin version appears in structured data@udppasspasspasspasspasspasspasspass
Origin enterpriseId appears in structured data@udppasspasspasspasspasspasspasspass
Origin ip parameter appears in structured data@udppasspasspasspasspasspasspasspass
All standard structured data present@rtc @udpskipskipskipskippasspasspasspass
All standard structured data present (no RTC)@no_rtc @udppasspasspasspassskipskipskipskip

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Time quality appears in structured data@rtc @udpskipskipskipskippasspasspasspass
Time quality and sequence ID coexist@rtc @udpskipskipskipskippasspasspasspass
Time quality reflects no RTC@no_rtc @udppasspasspasspassskipskipskipskip
Time quality and sequence ID coexist (no RTC)@no_rtc @udppasspasspasspassskipskipskipskip

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Switch from UDP to TCP mid-run delivers via both@buffered @tcp @udppasspasspasspasspassskippasspass
Switch from TCP to TLS mid-run delivers via both reliable transports@buffered @tlspasspasspasspasspassskippasspass

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).

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Message delivered over TCP@tcppasspasspasspasspasspasspasspass

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Messages delivered after server recovery@buffered @tcppasspasspasspasspassskippasspass
Records sent during the outage are lost, and the loss is reported once the server is back@passthrough @tcpskipskipskipskipskippassskipskip

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
A peer signed by the trusted anchor and named as expected is authorised@tls @tls_matrixpasspasspasspasspasspasspasspass
A pinned certificate is authorised with no chain at all@pins @tls @tls_matrixpasspasspasspasspasspasspasspass
A peer presented with its issuer satisfies both the anchor and the pin@pins @tls @tls_matrixpasspasspasspasspasspasspasspass
A pin set holding a certificate the collector no longer presents keeps delivering@pins @tls @tls_matrixpasspasspasspasspasspasspasspass
Opting out of the peer name check accepts a name that would not have matched@tls @tls_matrixpasspasspasspasspasspasspasspass
A device that authenticates itself as well delivers over mutual TLS@mtls @tls @tls_matrixpasspasspasspasspasspasspasspass
A device that declares no peer name delivers, and says the peer is unnamed@tls @tls_matrixpasspasspasspasspasspasspasspass
A client credential the library cannot complete does not stop delivery@tls @tls_matrixpasspasspasspasspasspasspasspass
A pin RFC 5425 makes mandatory but no longer trusts is honoured, and objected to@pins @tls @tls_matrixpasspasspasspasspasspasspasspass
A peer that does not chain to the trusted anchor is refused@tls @tls_matrixpasspasspasspasspasspasspasspass
A peer whose certificate names another host is refused@tls @tls_matrixpasspasspasspasspasspasspasspass
A pin matching nothing the collector presents is refused@pins @tls @tls_matrixpasspasspasspasspasspasspasspass
A device given neither anchors nor pins never connects, and says why@tls @tls_matrixpasspasspasspasspasspasspasspass
A cipher policy naming a suite the collector offers connects at the version it offers@cipher @tls @tls_matrixpasspasspasspasspasspasspasspass
A device connects at TLS 1.3 to a collector that refuses anything older@tls @tls13 @tls_matrixpasspasspasspasspasspasspasspass
A cipher policy the collector cannot satisfy is refused rather than quietly widened@cipher @tls @tls_matrixpasspasspasspasspasspasspasspass
A collector whose certificate has expired is refused@tls @tls_matrixpasspasspasspasspasspasspasspass
A collector whose certificate is not valid yet is refused@tls @tls_matrixpasspasspasspasspasspasspasspass
A pin does not extend the validity period of the certificate it names@pins @tls @tls_matrixpasspasspasspasspasspasspasspass
A chain that reaches no anchor is named ahead of the dates the certificate carries@tls @tls_matrixpasspasspasspasspasspasspasspass
The dates a certificate carries are named ahead of a name that does not match@tls @tls_matrixpasspasspasspasspasspasspasspass
A device the collector rejects after the handshake is told, rather than believing it delivered@tls @tls_matrixpasspasspasspasspasspasspasspass
Rotating the trust anchors lets a refused device deliver without a restart@buffered @rotation @tls @tls_matrixpasspasspasspasspassskippasspass
Rotating the trust anchors lets a refused device deliver, and the record it refused is lost@passthrough @rotation @tls @tls_matrixskipskipskipskipskippassskipskip
Rotating the pin set stops a delivering device at its next connection@pins @rotation @tls @tls_matrixpasspasspasspasspasspasspasspass
Rotating the expected peer name stops a delivering device@rotation @tls @tls_matrixpasspasspasspasspasspasspasspass
A redirected device carries the identity it expects with it@rotation @tls @tls_matrixpasspasspasspasspasspasspasspass
Rotating in the client credential lets a refused device deliver@mtls @rotation @tls @tls_matrixpasspasspasspasspasspasspasspass

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Messages delivered over TLS after server recovery@buffered @tlspasspasspasspasspassskippasspass

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Timestamp is received by syslog-ng@rtc @udpskipskipskipskippasspasspasspass

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
Full delivery of a UTF-8 message within the path MTU@requires_message_size_1500 @udpskipskipskipskippasspasspasspass
Oversize UTF-8 message is clipped at a codepoint boundary@requires_message_size_1500 @udp @windows_wipskipskipskipskippasspasspassskip

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.

ScenarioTagsbdd-cmsisrtos-lwipsocket-mbedtls-littlefs-syslogngbdd-cmsisrtos-lwipsocket-wolfssl-littlefs-syslogngbdd-freertos-lwipraw-mbedtls-fatfs-syslogngbdd-freertos-plustcp-mbedtls-plusfat-syslogngbdd-linux-openssl-syslogngbdd-linux-openssl-syslogng-passthroughbdd-linux-wolfssl-syslogngbdd-windows-openssl-otel
SolidSyslog sends a valid RFC 5424 message to syslog-ng@udppasspasspasspasspasspasspasspass