Add a CRAM test covering FEAT-105. The test consists of:
- Enable all vaps
- Enable power save on 2.4.GHz radio
- Check the behavior of radio and vaps
References: FEAT-105,PPM-3928
Signed-off-by: Houssem Dafdouf <houssem.dafdouf_ext@softathome.com>
Restore the unintentionally removed prplmesh resume step that was
pushed during FEAT-389 integration.
References: FEAT-105,PPM-3928
Signed-off-by: Houssem Dafdouf <houssem.dafdouf_ext@softathome.com>
Restore the MLDUnit relative to BH interfaces to ensure the test
environment is properly cleaned up after execution.
Not restoring the BHs MLDUnit may affect the behavior of the following
tests.
References: PPM-3928
Signed-off-by: Houssem Dafdouf <houssem.dafdouf_ext@softathome.com>
Add automated tests for container capabilities behavior
- Verify that in unprivileged mode with EnableHostCapabilities disabled,
containers cannot use assigned capabilities or bind to system ports
as non-root users.
- Verify that in unprivileged mode with EnableHostCapabilities enabled,
containers can use assigned capabilities, bind to system ports,
and run processes as non-root users, with proper filtering of blacklisted capabilities.
References: PCF-2687
Signed-off-by: Jef Steelant <jef.steelant_ext@softathome.com>
The three waits in 018-dhcpv4-client-options.t let dnsmasq record the lease
and dhcpv4-manager propagate the client and its options into
Device.DHCPv4.Server.Pool.Client. before the following ba-cli queries read
them back. On the testbed that propagation completes well within a second,
so three seconds only lengthens the run.
Reduce the three waits to one second, saving six seconds per run.
References: PPW-2188
Signed-off-by: Alexandre Fiset <alexandre.fiset@softathome.com>
Problem: 017-dhcpv4-force-option.t intermittently fails with a bare [2] on
the two probes that follow the Force=0 write, while the Force=1 probe just
before them passes.
Writing a Device.DHCPv4.Server. parameter makes dhcpv4-manager rewrite the
dnsmasq configuration and restart dnsmasq. The test only waited one second
afterwards and dhcpv4_option_probe.py sent its DHCPDISCOVER exactly once,
so a request issued during that restart window was lost and the probe gave
up after the timeout instead of reporting the option state under test.
The reason was invisible: all five probe error paths wrote to stderr, which
the test discards with 2>/dev/null, so every one of them looked identical in
the .t.err artifact.
Solution:
- retransmit an unanswered DHCPDISCOVER/DHCPREQUEST, --retries (default 2)
- print the ERROR line on stdout so it stays visible in the Cram diff
- release the lease on the last probe so no lease is left behind
A passing run is unaffected: retransmission stops as soon as the reply
arrives and nothing is written to stderr on success.
References: PPW-2188
Signed-off-by: Alexandre Fiset <alexandre.fiset@softathome.com>
An automatic CRAM job waits for a manual build only when that build is
non-optional and not allowed to fail. Leaving the manual build default
in place would skip the downstream job initially and could run it after
a failed build.
Override rules on the six builds consumed by automatic CRAM jobs. Make
a build blocking exactly when its board's automatic job is armed, using
the same changes anchors and label policy. Keep variable and skip
stand-down paths manual and non-blocking.
GitLab gives a manual job selected through rules the real default of
allow_failure: false. Scope the explicit non-blocking fallback to merge
request pipelines so non-arming MRs do not block, while push, web, API,
and branch pipelines retain their existing implicit blocking form.
Preserve schedule, designated-branch, and release-tag behavior. Leave
the x86_64 and extender builds unchanged.
Assisted-by: codex:gpt-5.6-sol
References: CI-9
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
Merge request changes currently leave all component CRAM jobs dormant.
Reviewers cannot see the selected coverage without resolving the matrix
themselves, and playing a bucket job cannot combine affected components
into one boot.
Add per-board changes anchors and six automatic component jobs. Resolve
their content from refreshed merge request labels and the diff before
any testbed setup. Exit cleanly without DUT cleanup when selection is
empty.
An automatic selection resolves a union of components that can become a
full run, so give these jobs the full-tier 85-minute budget instead of
the 40-minute component budget they would otherwise inherit.
Add an MR-only report job that prints the complete selection matrix
without a build or hardware dependency. Keep all 24 existing bucket jobs
unchanged.
The automatic template originally extended .cram_component as the later
parent after each board template. GitLab's parent precedence therefore
reapplied generic .testbed variables over board-specific values. This
changed DUT_WAN_INTERFACE on Freedom, Omnia, Haze, Mozart, and Valyrian,
and DUT_ARCH_PACKAGES_PATH on OSPv2, Haze, Mozart, and Valyrian. The
resulting Freedom failures exposed the wrong interface:
```text
014-firewall-levels.t: grep $DUT_WAN_INTERFACE -> [1]
045-qos.t: grep $DUT_WAN_INTERFACE -> [1]
```
Make .cram_component_auto a standalone overlay because the board parent
already supplies the component script and testbed chain. Add a committed
guard that resolves all six extends chains and requires each automatic
job to preserve its full-bucket sibling's variables.
Assisted-by: codex:gpt-5.6-sol
References: CI-9
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The selection matrix must remain synchronized with profile additions and
the rules that phase 2 will wire into automatic jobs. Silent divergence
would either miss required testing or arm a job with no useful work.
Require every tracked or untracked profile to match a selection row.
Lock the derived per-board changes lists with count and digest fixtures.
When automatic jobs exist, compare their rules directly. Until then,
report the missing wiring and keep the CI-7 lint invocation green.
Verify all 29 profiles are categorized. Confirm an uncategorized
synthetic profile and an invalid drift fixture both fail. Then remove
the probe.
Add an offline fixture for every matrix row and a synthetic Git-history
battery for bucketing, unions, collapse, precedence, empty outcomes,
resolution errors, and fork-shaped refs.
Assisted-by: codex:gpt-5.6-sol
References: CI-9
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
Automatic component jobs need one reviewed source for path-to-board and
path-to-component decisions. Keeping that policy beside the existing
test buckets lets shared code classify changed tests consistently.
Add the six-board selection matrix and all board-specific,
cross-cutting, and explicit no-op paths. Validate the matrix while
loading the manifest.
Add a resolver for variable and label precedence, Git diffs, all-match
component unions, full collapse, empty reasons, and report output.
Exercise union routing, test classification, collapse, precedence,
stand-down reasons, defensive label errors, and six-board reporting
in an offline synthetic repository. Component coverage stays green.
Assisted-by: codex:gpt-5.6-sol
References: CI-9
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
Multi-component changes currently require separate CRAM jobs. They
repeat the board boot. The automatic selector needs one resolver
invocation that can cover all affected component buckets.
Accept comma-separated components and build their ordered union from
the legacy full-suite order. Prefix sanity tests once, remove duplicate
tests and retain the existing behavior for every single component and
full.
Compare all five legacy selections on all six boards with the CI-7 base.
All 30 outputs are byte-identical. Verify forward and reverse
two-component unions on all six boards, including stable ordering and
uniqueness.
Assisted-by: codex:gpt-5.6-sol
References: CI-9
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
Keep feed pin changes isolated so diff-based CRAM selection can map each
feed update to the component it affects.
Move the three prpl_core feed entries into dedicated profile files and
include them from prpl_core. Preserve each feed entry byte-for-byte.
Run scripts/gen_config.py for all nine build-test profile argument sets
at the base pin and after the split. The offline harness allowed local
feed setup while suppressing network update/install and make
subprocesses. All 27 generated stdout, .config, and feeds.conf artifacts
were identical.
Assisted-by: codex:gpt-5.6-sol
References: CI-9
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
Component jobs currently inherit the full-tier 85-minute timeout.
Measured runs peak at 35.8 minutes for components and 80.8 minutes for
the full tier.
Set each tier to the smallest five-minute multiple at least four
minutes above its maximum observed duration. This gives component jobs
40 minutes and retains 85 minutes for full jobs.
Keep the full-job limit explicit because those jobs would otherwise
inherit the new component limit. A hung component job now releases its
device roughly 45 minutes sooner.
Assisted-by: claude:opus-5:orchestrator
Assisted-by: codex:gpt-5.6-sol:medium-fast
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
run_check reports a failed command by expanding its complete argument
list. A full Freedom cram run carries about 199 test paths, producing
one roughly 13,000-character log line that obscures the actual failure.
The test arguments form a contiguous .t suffix. Count and replace only
that suffix with `(N tests)` in failure diagnostics, leaving the command
head and non-test invocations unchanged. Keep executing the original
arguments and preserve status and sentinel handling.
Cram's --verbose job output still lists each test path and result. The
component resolver continues to emit the selected path list used by the
job.
Assisted-by: claude:opus-5:orchestrator
Assisted-by: codex:gpt-5.6-sol:medium-fast
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The LCM bridge carrier reflects whether its container-side port is
live. Split execution can inspect it before the LCM suite tears that
state down, so the bridge can appear either live or without carrier.
Carrier state is not the route line's only variable part: ip route
also emits a trailing separator. Account for that separator after the
optional linkdown flag so both carrier states match.
Accept both observed route and link forms in every board's copy of the
affected expectations while keeping every address, interface
attribute, and the carrier-to-state pairing constrained.
Assisted-by: codex:gpt-5
Assisted-by: claude:opus-5:orchestrator
Assisted-by: codex:gpt-5.6-sol:medium-fast
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The split prplos bucket reaches the discovery assertions sooner than the full suite and can observe an empty first root device.
Poll for the first root-device UUID for at most one minute before retaining the existing parameter assertions unchanged.
Assisted-by: codex:gpt-5
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The data-model-mapper sibling test installs its package at runtime and creates Device.X_PRPLWARE-COM_SoftwareModules. The generic inventory must not depend on that sibling side effect.
Filter the mapper-only element following the cellular detachment precedent in e342d300. The mapper test continues to exercise the element in the LCM bucket.
Assisted-by: codex:gpt-5
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
Component jobs start automatically whenever CRAM_COMPONENTS selects
them, and the variable defaults to prplos. Every merge-request pipeline
therefore schedules six hardware jobs whether or not anybody needs
them, and the bucket choice is fixed before the pipeline exists. The
non-DUT manifest lint also starts automatically in non-scheduled
pipelines.
Testbed time is the scarce resource, and the build test jobs feeding
these DUT jobs are already manual in merge-request pipelines. The
natural flow is to pick buckets after a build finishes, not at
pipeline creation. The lint should follow the same opt-in flow.
Drop the CRAM_COMPONENTS default and add trailing manual rules so every
component job and the lint appear as optional play buttons in
non-scheduled pipelines. Manually started jobs never gate the pipeline
result. With no opt-in variable or release-tag override, no cram-related
job at all, lint included, starts automatically.
Setting CRAM_COMPONENTS still starts the listed buckets automatically
with each board's existing blocking behavior. The automatic full run in
prplware release tag pipelines is unchanged.
Assisted-by: claude:fable-5
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The component manifest lint currently runs only during local validation.
Merge requests get no feedback when new tests silently enter the prplos
remainder.
Add a non-DUT manifest coverage job to every pipeline. Fetch an MR base
when needed and pass it to the lint. Newly-in-remainder warnings then
appear in job output.
Give the job explicit rules: a job without rules keeps the legacy
branches-and-tags default and is never created in merge-request
pipelines, the exact place the diff-base comparison exists for. Skip
scheduled pipelines, which carry no cram work.
Use the digest-pinned testbed v1.3.0 image for Python, YAML, and git. The
MR diff-base comparison requires runtime git for cat-file, fetch, and the
lint script's child processes.
The image runs as the testbed user while the runner checkout has a
different owner. Git otherwise rejects the checkout before lint starts:
```text
fatal: detected dubious ownership in repository at
'/builds/prpl-foundation/prplos/prplos'
```
Pass a safe.directory override for CI_PROJECT_DIR through Git's inherited
configuration environment. Print the selected MR diff base so the
comparison path remains visible in job evidence. Add no hardware runner
tags or build dependencies.
Assisted-by: codex:gpt-5
Assisted-by: claude:fable-5
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The hardware cram jobs currently run each board's complete suite. Every
automatic pipeline therefore consumes coverage that can be selected more
cheaply by component.
Add a runtime component template so test collection happens in cram's
checkout and environment. Replace each legacy board job with four static
full, prplmesh, lcm, and prplos jobs selected through the
comma-separated CRAM_COMPONENTS variable.
Name each job `cram <board> [<component>]` and include the selected
component in the expandable test-execution section title.
Move the MXL-specific cram skip from the legacy job-name token. Use the
stable DUT board identifier instead.
Preserve skip behavior under the compact OSPv2 name.
Default automatic pipelines to prplos. Start the full jobs
automatically in prplware release tag pipelines, whose build jobs also
run automatically. Keep cram jobs out of scheduled pipelines entirely,
as with the legacy suite: schedules never create the build jobs these
jobs need, so any selected cram job would fail scheduled pipeline
creation with an unsatisfiable needs reference. Keep the test command,
post suite, timeout, run_check, and JUnit filenames unchanged.
Assisted-by: codex:gpt-5
Assisted-by: claude:fable-5
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The computed prplos remainder keeps existing tests covered, but it can
also hide accidental classification of newly added tests. Stale or
overlapping component globs can likewise make split jobs unreliable.
The sanity set adds another strict boundary: a sanity test must not also
belong to an explicit component bucket.
Add a location-agnostic lint using the shared bucketing implementation.
Validate the schema, glob coverage, and sanity and explicit-component
exclusivity. Check the reserved smoke and hardware-only sets. Include
sanity in the reported bucket counts. Accept either a Git ref or a file
list as the baseline for newly-in-remainder warnings. Report missing
targets for tracked test symlinks without failing the otherwise valid
manifest.
Assisted-by: codex:gpt-5
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The legacy cram suite repeats nested directories to run setup-sensitive
tests early. Component jobs need the same ordered and deduplicated file
list without embedding repository locations in the CI configuration.
Some DUT and environment checks also need to run before every split
component because their failure invalidates the rest of that job.
Add a reserved sanity set and the lcm and prplmesh manifest buckets,
keeping prplos as the computed remainder. Remove sanity matches before
partitioning the other tests, and prepend the ordered sanity block when
resolving any split component. Keep full-suite resolution unchanged and
allow the sanity block to be resolved directly for inspection.
Add a shared collector which preserves cram 0.7 traversal and
first-occurrence deduplication. Retain broken test symlinks so
pre-existing tree defects cannot crash list resolution.
Assisted-by: codex:gpt-5
References: CI-7
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
The packages feed revision bumped by this alignment moves hwdata from
0.387 to 0.407. Its pci.ids now carries a name for 17cb:0308, so lspci
reports "SDX61/SDX62/SDX65 [Snapdragon 5G X6X-series]" where it used to
fall back to "Device 0308".
References: PPW-1773, PPW-2138, PPW-1785
Signed-off-by: Alexandre Fiset <alexandre.fiset@softathome.com>
Some default config options in the curl package changed, so let's align the tests accordingly.
See:
f693e556aca9bd8f6f58b087bf18412dbe2c0008
References: PPW-1773, PPW-2138, PPW-1785
Signed-off-by: Matthias Franck <matthias.franck@softathome.com>
Release binaries must be reproducible from the sources shipped with them.
Generate version and version.date from git when CI_COMMIT_TAG is set,
before the build reads either value.
Compute both values before writing either file, then print them for
traceability. The tag condition is the exact complement of the development
guard, so generation cannot run on development builds.
Assisted-by: codex:gpt-5.6-sol:medium-fast
Assisted-by: claude:opus-5:orchestrator
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
References: PCF-2730
version and version.date override the git-derived metadata used by
development builds. Keeping either file after a release-tag sync freezes
the reported revision or source date.
Add a fail-fast check to the shared build template before the first make
invocation. When CI_COMMIT_TAG is empty, the check reports their presence
and points sync authors to upstream's "revert to branch defaults"
commit.
Assisted-by: codex:gpt-5.6-sol:medium-fast
Assisted-by: claude:opus-5:orchestrator
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
References: PCF-2730
Update the expected prplMesh CLI status output to include the live
controller connectivity state.
The backhaul manager refactoring added the "controller connected" field
to the agent status output. All covered gateway scenarios are operational
and connected to their local controller, so expect the field to be true
across the affected platform CRAM tests.
This is an expected-output update only and does not change test behavior.
References: PPM-4012
Signed-off-by: Dmytro Puz <d.puz@inango-systems.com>
Verify IEEE1905 model population against the number of prplMesh devices
expected in each testbed. Compare AL IDs and DataElements references, and
check that Network.Enable controls materialization.
Run the NMAP checks after the other prplMesh tests to avoid disrupting
the established Controller+Agent state and discovered testbed topology.
Closes: PPM-3970
References: FEAT-319
Signed-off-by: Andrey Erokhin <a.erokhin@inango-systems.com>
Check that prplMesh registers the complete Device.IEEE1905 data model
with obuspa.
Keep this check separate from obuspa.expected and run it before the tests
that restart obuspa. The prplMesh event loop does not currently support
reconnecting after an obuspa restart.
Closes: PPM-3970
References: PPM-4178
References: FEAT-319
Signed-off-by: Andrey Erokhin <a.erokhin@inango-systems.com>
Extend the Cram datamodel expectations with the new Device.IEEE1905 object tree
and the prplMesh HigherLayerRequestIntervalSec configuration parameter.
Closes: PPM-3970
References: FEAT-319
Signed-off-by: Andrey Erokhin <a.erokhin@inango-systems.com>
The WPS button now uses a gpio-keys-polled node, which pulls in
kmod-input-gpio-keys-polled, so it appears in the build .config.
Add it to the expected package list in 005-build-config.t.
Fixed: PCF-2655
Signed-off-by: Tim Hsu <tim.hsu@wnc.com.tw>
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org> [rebased]
WPS button moved from the gpio-keys edge-IRQ node to a separate gpio-keys-polled node to avoid the GPIO12 pad-leakage IRQ storm.
015-platform.t still read soc@0/gpio_keys/button@1, which no longer exists, so the WPS label and linux,code checks failed.
Point both at soc@0/gpio_keys_polled/button@1; reset stays at gpio_keys/button@2 and linux,code is unchanged (0x0211).
Fixed: PCF-2655
Signed-off-by: Tim Hsu <tim.hsu@wnc.com.tw>
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org> [rebased]
ForceSolicitPolicy is now a standard TR-181 parameter with no vendor
prefix. Update the cram test accordingly.
Signed-off-by: Alexandre Fiset <alexandre.fiset@softathome.com>
Testing Various valid combinations on 6GHz PrivateVAP
side-effect: default value of MLDUnitSetting changes behavior of PWHM
i.e. new parameter:
Radio.{i}.IEEE80211be.MLDUnitSetting=Assumed
is expected to invalidate current apmld tests
Reset it to Required, the value that keeps old pwhm behavior
OBUSPA:
Prefix IEEE80211be.MLDUnitSetting with X_PRPLWARE-COM_
and add it to obuspa.expected datamodel dump
testbed.yml : increase timeout by 2min (nominal execution time : 1m50s)
Issue: PPM-3545
Signed-off-by: Iacob Juc <iacob.juc_ext@softathome.com>
Issue:
With the introduction of cache services and a configurable removal timeout (PPW-1676),
services are no longer removed immediately when they are no longer detected.
Instead, a timer is started based on the new RemoveServiceTimeout parameter.
If the service is rediscovered before the timer expires, it remains in the data model.
The default timeout value is set to 300000 ms (5 minutes).
Fix:
The fix involves modifying the cram test to lower the RemoveServiceTimeout to 5000 ms (5 second)
for quicker testing.
Tracked-by: PPW-1676
Signed-off-by: Yousfi Neji <yousfi.neji_ext@softathome.com>
prpl_core.yml now pulls strongswan-default and sixteen strongswan
modules for the IPsec datamodel. They drag in dependencies nothing
selects explicitly -- strongswan-ipsec via mod-stroke, and libgcrypt
plus libgpg-error via mod-gcrypt -- so every board that ships strongswan
sees a wider package set than its expected output records.
Refresh the expectations for the three boards that build strongswan:
- 005-build-config.t on mxl25641-hdk-6, wnc-freedom and urx851-b0-dk.
urx851-b0-dk has no hardware test job, so its copy of the same
expected output would have drifted unnoticed until the board is
exercised again; keep the three in sync.
- 011-tls.t on mxl25641-hdk-6 and wnc-freedom. The grep pattern and the
version-tolerant libopenssl / libustream-openssl regexes are left
untouched; only strongswan-mod-openssl is added. Enumerating the whole
strongswan package set belongs in 005-build-config.t, not in a test
whose subject is the single TLS library.
The same module set also widens what charon advertises through the IPsec
root object. Rather than track those capability strings, 133-tr181-ipsec.t
now asserts only that the datamodel starts with no entries, so the
expectation no longer moves with the strongswan module selection.
Also drop CONFIG_VERSION_CODE_FILENAMES from the wnc-freedom expected
build config. The symbol is no longer emitted, which is OpenWrt base
drift rather than a VPN change, but the expectation cannot pass while it
is listed.
References: FEAT-150, PCF-2467
Signed-off-by: Alexandre Fiset <alexandre.fiset@softathome.com>
The .swu firmware image (~80MB) and temporary PEM keys generated during
the wrong-key test were never removed from DUT /tmp, leaving the
partition nearly full for the tests that run afterwards.
Delete the .swu image and the generated PEM files at the end of the
test.
References: PCF-2469, PPW-2134
Signed-off-by: Alexandre Fiset <alexandre.fiset@softathome.com>
Add initial cram tests for tr181-ipsec, including an end-to-end test with
IKEv2 certificate authentication: a dedicated strongSwan charon instance
runs inside a network namespace (with a private /var/run tmpfs to isolate
it from the CPE charon) behind a veth pair emulating the WAN link, so the
test is self-contained and is not tied to a specific board. Certificates
are generated on the DUT: a self-signed one for the CPE, and for the peer
an end entity certificate issued by a dedicated CA, since
IKEv2RemoteAuthenticationMethod designates the authority the peer is
validated against rather than the peer certificate itself. They are
imported through /etc/config/autocert into Security.Certificate, and
referenced from an IPsec.Profile/Filter pair. The end-to-end test verifies
the IKEv2 SA and Child SA come up and that protected traffic flows.
References: PCF-2469, FEAT-150
Signed-off-by: Alin Nastac <alin.nastac@softathome.com>
Signed-off-by: Alexandre Fiset <alexandre.fiset@softathome.com>
Add initial cram tests for tr181-wireguard, including an end-to-end tunnel
test: the remote peer lives in a network namespace behind a veth pair
emulating the WAN link and is configured with wireguard-tools, so the
test is self-contained and is not tied to a specific board. The
end-to-end test drives the CPE side through the data
model (WireGuard.Tunnel/Peer + IP.Interface + Firewall.Service), verifies
the handshake on the peer, ping in both directions, a short iperf3 session
and the NetModel flags.
Implements: PCF-2023
References: FEAT-150
Signed-off-by: Patrick Havelange <patrick.havelange_ext@softathome.com>
Signed-off-by: Alexandre Fiset <alexandre.fiset@softathome.com>
Add CRAM tests for tr181-gre, including an end-to-end tunnel test: the
remote peer lives in a network namespace behind a veth pair emulating
the WAN link, so the test is self-contained and is not tied to a
specific board. The end-to-end test drives the tunnel
through the data model (GRE.Tunnel + Interface + IP.Interface), verifies
the kernel route, reply behaviour with and without a peer return route,
the UseSequenceNumber/UseChecksum toggles and runs a short iperf3 session
through the tunnel.
References: PCF-2294, FEAT-150
Signed-off-by: Khaled Hasni <khaled.hasni_ext@softathome.com>
Signed-off-by: Alexandre Fiset <alexandre.fiset@softathome.com>
Cram supplies each generated test script to the shell through standard
input. The shared SSH command inherits that input and consumes the
remaining script, leaving the shell at EOF inside a quoted command.
Commit 5fd42aa540 ("ci: cram: use legacy SCP protocol for remote
copies") rewrote CRAM_REMOTE_COMMAND while adding legacy SCP support and
dropped the -n option added for PCF-2222. Job 15640024463 then failed
130-periodicfileupload.t with:
/bin/sh: 152: Syntax error: Unterminated quoted string (no-eol)
Job 15640024462 leaked this salt marker in the same test:
CRAM1 (no-eol)
Restore -n so SSH reads from /dev/null instead of the generated test
script.
Assisted-by: codex:gpt-5.6-sol
Assisted-by: claude:opus-5:1m-context
Signed-off-by: Petr Štetiar <petr.stetiar@prplfoundation.org>
Fixes: 5fd42aa540 ("ci: cram: use legacy SCP protocol for remote copies")
References: PCF-2222