Commit Graph

9703 Commits

Author SHA1 Message Date
Jonathan Hui e2e5cba98c [nexus] migrate test_dnssd.py to nexus (#12975)
This commit migrates the DNS-SD test from the thread-cert Python
framework to the Nexus C++ framework.

The new Nexus test 'test_dnssd.cpp' replicates the original test
scenario and functionality:
- Formation of a Thread network with multiple SRP clients and a
  server.
- Service registration with subtypes via SRP.
- DNS browsing for full service types and specific subtypes.
- DNS address (AAAA) and service (SRV/TXT/AAAA) resolution.
- Specific DNS record queries for SRV and KEY record types.
- Verification of DNS behavior for non-existent records.

The original Python script 'tests/scripts/thread-cert/test_dnssd.py'
is removed as its functionality is now fully covered by Nexus.

Nexus tests provide faster and more scalable network simulations
within a single process, improving CI efficiency and reliability.
2026-04-27 18:57:22 -07:00
Jonathan Hui fc4ebb1aaa [nexus] migrate test_service.py to nexus (#12974)
This commit migrates the test_service.py script from thread-cert to the
Nexus test framework.

The new test_service.cpp implements the same test logic:
- Forms a network with a Leader and two Routers.
- Adds and removes services on different nodes.
- Verifies that Service Anycast Locators (ALOCs) are correctly
  added to and removed from the nodes' unicast addresses.
- Confirms reachability of the ALOCs using ICMPv6 Echo Requests
  from all nodes in the network.
- Ensures ALOCs become unreachable after the service is removed
  from the network data.

Changes:
- Added tests/nexus/test_service.cpp
- Updated tests/nexus/CMakeLists.txt to include the new test.
- Removed tests/scripts/thread-cert/test_service.py.
2026-04-27 18:57:07 -07:00
Abtin Keshavarzian 1413778a09 [mle] restrict SetPreferredRouterId() API to REF_DEVICE (#12973)
This commit restricts the API to set a preferred router ID under
`OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE`. This feature is intended
for testing and therefore be excluded from standard builds to ensure
compliance with the Thread Specification.
2026-04-27 17:04:20 -07:00
Jonathan Hui 71d43b5cca [nexus] clear last parent ID on router/leader role change (#12986)
In `Nexus::Core::HandleStateChanged`, the `lastParentId` was not
cleared when a device transitioned to the Router or Leader role. This
could cause stale parent associations to persist, leading to incorrect
link state reporting in the visualizer during subsequent role
transitions (e.g., when a former Leader merges into a partition and
becomes a Child/REED).

This fix clears `lastParentId` (sets it to `0xffff`) when the device
becomes a Router or Leader, ensuring a fresh state for parent
tracking.
2026-04-27 17:21:17 -05:00
Jonathan Hui 0f66392f9c [nexus] migrate on-mesh prefix test to nexus (#12963)
This commit migrates 'test_on_mesh_prefix.py' from the thread-cert
functional tests to the Nexus simulation framework.

The new Nexus test 'test_on_mesh_prefix.cpp' covers:
- Propagation of stable and non-stable on-mesh prefixes.
- Different Network Data request behavior for MEDs and SEDs.
- MEDs receiving both stable and non-stable prefixes.
- SEDs receiving only stable prefixes.
- IPv6 address configuration (SLAAC) for all prefixes.
- Reachability verification via ICMPv6 Echo Request/Response.

Migrating to Nexus provides faster execution and improves the
reliability of the functional test suite.
2026-04-27 16:34:37 -05:00
Jonathan Hui bbb8e7ad15 [nexus] migrate router multicast link request test to nexus (#12966)
This commit migrates the router multicast link request test from the
thread-cert functional tests to the Nexus simulation framework.

The new Nexus test 'test_router_multicast_link_request.cpp' covers:
- Verification of a REED node becoming a router.
- Multicast Link Request transmission to neighboring routers.
- Quick link establishment with multiple neighbors after role upgrade.

The original Python test 'test_router_multicast_link_request.py' is
removed as its functionality is now fully covered by the Nexus test.
2026-04-27 13:02:40 -07:00
Jonathan Hui 8f5a9ff4b8 [nexus] migrate srp server anycast test to nexus (#12951)
This commit migrates the SRP server anycast mode test from the
thread-cert Python script to the Nexus test framework.

The new Nexus test `test_srp_server_anycast_mode.cpp` covers:
- SRP Server configuration in both Anycast and Unicast modes.
- Proper publication of SRP Server information in Network Data.
- SRP Client auto-start and server selection logic.
- Service registration and verification in both address modes.
- DNS browsing for registered SRP services.

Nexus tests allow for faster and more scalable network simulations
within a single process, improving CI efficiency.

Removed:
- tests/scripts/thread-cert/test_srp_server_anycast_mode.py
2026-04-27 13:02:17 -07:00
Jonathan Hui 419decf91e [nexus] migrate test_reset to Nexus (#12971)
Migrate legacy Python test `test_reset.py` to Nexus C++ test
`test_reset.cpp`.

The test verifies that OpenThread correctly recovers network state,
specifically frame counters and datasets, after sequential resets of
nodes in a multi-hop topology (Leader <-> Router <-> ED).

The test sequence:
- Establish multi-hop topology: Leader <-> Router <-> ED.
- Send 1010 pings from ED to Leader to advance the frame counter
  beyond the default storage threshold (1000).
- Reset Leader, Router, and ED sequentially.
- Verify end-to-end connectivity after resets, confirming that frame
  counters were correctly recovered from non-volatile storage.

Legacy `tests/scripts/thread-cert/test_reset.py` is removed as its
functionality is now fully covered by the Nexus test.
2026-04-27 13:00:34 -05:00
Jonathan Hui e74aebb2bd [nexus] migrate router and leader reboot tests to Nexus (#12970)
This commit migrates the following tests from thread-cert to Nexus:
- test_router_reboot_multiple_link_request.py
- test_leader_reboot_multiple_link_request.py

New Nexus tests cover:
- Router rebooting and sending multiple Link Requests when isolated.
- Leader rebooting and sending multiple Link Requests when isolated.

The original Python cert tests are removed as they are now fully
covered by the Nexus framework.
2026-04-27 13:00:17 -05:00
dependabot[bot] b72272fcb1 github-actions: bump actions/upload-artifact from 7.0.0 to 7.0.1 (#12984)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 7.0.0 to 7.0.1.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f...043fb46d1a93c77aae656e7c1c64a875d1fc6a0a)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-27 07:17:57 -07:00
Jonathan Hui d1da39b8b9 [nexus] fix occasional failure in anycast test (#12982) 2026-04-25 18:50:07 -07:00
Abtin Keshavarzian f4f13b6d5b [nexus] add test for OT_MLE_LONG_ROUTES feature (#12956)
This commit adds a new Nexus test to verify the functionality of the
MLE long routes experimental feature, which allows path costs to
exceed the standard limit of 15.

The new test `TestLongRoutes` in `test_long_routes.cpp` forms a
topology consisting of a leader and a chain of 25 routers. It then
validates that the path cost from the last router in the chain to the
leader is correctly reported as 25 using `GetPathCostToLeader()`.

Supporting changes include:
- Updating `build.sh` to support a `long_routes` build target that
  enables `OT_MLE_LONG_ROUTES`.
- Adding the `long_routes` test to `CMakeLists.txt` with the
  appropriate labels.
- Introducing a new GitHub workflow job `nexus-long-routes-tests` in
  `nexus.yml` to automate the execution of this test.
2026-04-25 10:22:06 -07:00
Jonathan Hui 5340cfabc3 [nexus] migrate test_router_reattach.py to nexus (#12967)
This commit migrates the router reattach test from the thread-cert
Python framework to the Nexus C++ framework.

The new Nexus test 'test_router_reattach.cpp' replicates the
original test scenario:
- A full 32-node router network is formed.
- Router upgrade/downgrade thresholds are set to 32.
- A router is reset and verified to re-attach and reclaim its
  router role.
- The test ensures the router does not downgrade after the router
  selection jitter interval.

The original Python script 'tests/scripts/thread-cert/
test_router_reattach.py' is removed as its functionality is now
fully covered by Nexus.

Nexus tests provide faster and more scalable network simulations
within a single process, improving CI efficiency.
2026-04-23 02:47:41 -05:00
Jonathan Hui 33e47882d8 [nexus] migrate anycast test to nexus (#12964)
This commit migrates the anycast routing test from the thread-cert
functional tests to the Nexus simulation framework.

The new Nexus test 'test_anycast.cpp' replicates the linear topology
(R1-R2-R3-R4-R5) and verifies:
- Anycast routing for DHCPv6 Agent (ds/cs) ALOCs.
- Dynamic routing updates when multiple anycast servers are present.
- Traffic routing to the nearest anycast destination.

The original Python test 'test_anycast.py' is removed as its
functionality is now fully covered by the Nexus test.
2026-04-23 02:36:39 -05:00
Jonathan Hui 297fb501a0 [nexus] migrate anycast locator test to Nexus (#12962)
This commit migrates the anycast locator test from the thread-cert
functional tests to the Nexus simulation framework.

The new Nexus test 'test_anycast_locator.cpp' covers:
- Anycast Locator (ALOC) resolution for the Leader from all nodes.
- Custom service ALOC resolution when only one node provides it.
- Closest-node ALOC resolution when multiple nodes provide the same
  service in a line topology (LEADER-R1-R2-R3-R4).
- Verification that nodes resolve to the nearest service instance.

The original Python test 'test_anycast_locator.py' is removed as its
functionality is now fully covered by the Nexus test.
2026-04-23 01:02:33 -05:00
Abtin Keshavarzian db7fd231f0 [thread-tlv] simplify Ip6AddressesTlv implementation (#12965)
This commit simplifies the `Ip6AddressesTlv` by removing the dedicated
class definition and instead defining it as a `TlvInfo` for the
`ThreadTlv::kIp6Addresses` type.

The usage of `Ip6AddressesTlv` is updated in `BbrManager`,
`MlrManager`, and related tests to use `Tlv::StartTlv()` and
`Tlv::EndTlv()` when appending the TLV to messages.
2026-04-23 01:02:05 -05:00
Abtin Keshavarzian b7df29080d [mle] use entry count instead of byte length in RouteTlv (#12957)
This commit renames `GetRouteDataLength()` and `SetRouteDataLength()`
to `GetRouteDataEntryCount()` and `SetRouteDataEntryCount()` in the
`RouteTlv` class.

When `OPENTHREAD_CONFIG_MLE_LONG_ROUTES_ENABLE` is enabled, the
route data entries use a packed format (12 bits or 1.5 bytes per
entry). Consequently, the byte length of the route data field in
the TLV is no longer equal to the number of route entries.

This change ensures that `GetRouteDataEntryCount()` correctly
calculates the number of entries from the TLV length and
`SetRouteDataEntryCount()` sets the TLV length correctly based on
the entry count.
2026-04-23 01:01:44 -05:00
Jonathan Hui 8fbe09e2b5 [nexus] migrate test_srp_ttl.py to nexus (#12960)
This commit migrates the SRP TTL test from the thread-cert Python
framework to the Nexus C++ framework.

The new Nexus test `test_srp_ttl.cpp` covers all four TTL clamping
cases originally implemented in `test_srp_ttl.py`:
1. CLIENT_TTL < TTL_MIN < LEASE_MAX => Clamped to TTL_MIN.
2. TTL_MIN < CLIENT_TTL < TTL_MAX < LEASE_MAX => Used CLIENT_TTL.
3. TTL_MAX < LEASE_MAX < CLIENT_TTL => Clamped to TTL_MAX.
4. LEASE_MAX < TTL_MAX < CLIENT_TTL => Clamped to LEASE_MAX.

Nexus tests provide faster and more scalable network simulations
within a single process, improving CI efficiency.

The original Python script `tests/scripts/thread-cert/test_srp_ttl.py`
is removed as its functionality is now fully covered by Nexus.
2026-04-22 04:18:34 -05:00
Jonathan Hui 706e93f017 [nexus] fix flaky nexus test router_downgrade_on_sec_policy_change (#12959)
The test was failing occasionally due to the unpredictable timing of
tick-aligned timers and dataset propagation in simulations.

Specifically:
1) The router's jittered timeout (minimum 1 second) could expire
   in as little as 1ms if an MLE TimeTick occurred immediately
   after the security policy update.
2) Dataset propagation via MLE Advertisements could take up to
   32 seconds, making immediate checks on the router's role
   unreliable.

This commit fixes the flakiness by:
- Replacing flaky router role checks with `IsRouterRoleAllowed()`
  assertions. This verifies that the security policy has been
  successfully propagated and applied, regardless of whether the
  actual role transition has completed.
- Increasing the propagation wait time to 5 seconds. This provides
  a safe margin for simulated radio propagation while remaining
  well within the leader's 10-second downgrade delay.
- Ensuring both the leader and router are verified for policy
  application in both phases of the test.
- Maintaining the final checks to ensure both nodes eventually
  become detached after the full downgrade delay (150 seconds).

The fix was verified with 1000 consecutive successful iterations.
2026-04-22 02:56:07 -05:00
Jonathan Hui 0a97d566de [nexus] migrate srp server reboot port test to nexus (#12952)
This commit migrates the SRP server reboot port test from the
thread-cert functional tests to the Nexus simulation framework.

The new Nexus test 'test_srp_server_reboot_port.cpp' covers:
- SRP server address mode configuration (Unicast).
- SRP client auto-start discovery of the server.
- SRP server reboot (disable/enable) without node reboot.
- Verification that the server selects a new port after each reboot.
- Robustness of service re-registration over 25 reboot iterations.

The original Python test 'test_srp_server_reboot_port.py' is removed
as its functionality is now fully covered by the Nexus test.
2026-04-22 02:27:17 -05:00
Jonathan Hui 0cf450af44 [nexus] migrate SRP diff lease test to Nexus (#12950)
This commit migrates the SRP register services with different
lease test from the thread-cert Python framework to the Nexus
test framework.

The new Nexus test (test_srp_register_services_diff_lease.cpp)
reproduces the functionality of the original Python test:
- Registration of multiple services with different lease/key-lease
  intervals.
- Verification of per-service lease values on the SRP server.
- Ensuring key-lease is always at least as long as the lease.
- Validating lease renewal and expiry behaviors.
- Testing dynamic changes to default client lease and TTL.

Migrating to Nexus allows for faster and more scalable network
simulations within a single process.
2026-04-21 09:31:49 -05:00
Jonathan Hui 33e163424e [nexus] migrate srp_client_save_server_info to nexus (#12947)
This commit migrates the srp_client_save_server_info test from the
thread-cert Python-based test framework to the Nexus C++ simulation
framework.

The new Nexus test (test_srp_client_save_server_info.cpp) verifies:
- SRP client selects an SRP server when auto-start is enabled.
- SRP client sticks to the current server even if other SRP servers
  become available.
- SRP client saves and reuses the selected server info across SRP
  client stops and restarts.
- SRP client selects a new server if the current one becomes
  unavailable.
- SRP client sticks to the new server even if the old one returns.

The original Python test script is removed as its functionality is
now fully covered by the new Nexus test.
2026-04-21 08:59:07 -05:00
Jonathan Hui a51677de94 [nexus] migrate srp scale test to nexus (#12949)
This commit migrates the test_srp_register_500_services.py test from
the thread-cert test suite to the Nexus platform.

The new C++ test (tests/nexus/test_srp_scale.cpp) implements the same
functionality: it verifies that 25 SRP clients (13 routers and 12
FEDs) can successfully register a total of 500 services (20 services
per client) with a single SRP server (the leader).

The commit includes:
- Removal of the original Python test file.
- Addition of the new Nexus C++ test file.
- Integration of the new test into CMakeLists.txt and
  run_nexus_tests.sh.
2026-04-21 07:42:46 -05:00
Jonathan Hui acef2288ca [nexus] migrate test_srp_client_remove_host to Nexus (#12946)
This commit migrates the SRP client host removal test from the
thread-cert Python-based framework to the Nexus framework.

The new C++ implementation in tests/nexus/test_srp_client_remove_host.cpp
covers the same scenarios as the original Python script:
- Successful registration of SRP host and services.
- Verification that ClearHostAndServices() does not immediately remove
  server-side state.
- Verification that RemoveHostAndServices(removeKey=False,
  sendUnregToServer=True) marks the host and services as deleted on the
  SRP server.
- Verification that RemoveHostAndServices(removeKey=True,
  sendUnregToServer=True) fully removes the host and service entries
  from the SRP server.

The original Python script test_srp_client_remove_host.py is removed
as its functionality is now fully covered by the Nexus test.
2026-04-21 06:33:39 -05:00
Jonathan Hui 828ffefb21 [nexus] migrate SRP many services MTU test to Nexus (#12948)
This commit migrates the test_srp_many_services_mtu_check.py from
tests/scripts/thread-cert to the Nexus test framework.

The new test, tests/nexus/test_srp_many_services_mtu_check.cpp,
verifies that the SRP client correctly handles and splits SRP Update
messages when registering a large number of services that exceed
the IPv6 MTU size (1280 bytes).

Changes:
- Added tests/nexus/test_srp_many_services_mtu_check.cpp.
- Updated tests/nexus/CMakeLists.txt to include the new test.
- Removed tests/scripts/thread-cert/test_srp_many_services_mtu_check.py.
2026-04-21 05:20:38 -05:00
Jonathan Hui 2f7ccf5d3e [nexus] stabilize reed_address_solicit_rejected test (#12955)
This commit stabilizes the Nexus reed_address_solicit_rejected test by
increasing the wait time for network data synchronization from 5 seconds
to 15 seconds.

The test was occasionally failing because the 5-second wait was
sometimes insufficient for the REED's service registration to reach the
leader and for the updated network data to be broadcast back to the
REED. Increasing the delay to 15 seconds provides more robust buffer for
these network events.

Verified by running the test 50 times in a loop without failures.
2026-04-21 05:04:00 -05:00
Jonathan Hui a5908e5858 [nexus] migrate mle_msg_key_seq_jump test to nexus (#12933)
This commit migrates the `test_mle_msg_key_seq_jump.py` cert test to the
Nexus simulation framework.

The new Nexus test `test_mle_msg_key_seq_jump.cpp` verifies that nodes
can correctly handle jumps in the MLE key sequence and stay attached to
the network. It covers scenarios like child triggering key sequence
updates via Child Update Request and routers propagating key sequence
updates.

The original Python test script is removed as its functionality is now
fully covered by the new Nexus test.
2026-04-21 04:43:19 -05:00
Jonathan Hui 005297b301 [nexus] migrate srp client lease change test to nexus (#12945)
This commit migrates the 'test_srp_client_change_lease.py' cert test
to the Nexus simulation framework.

The new Nexus test ('test_srp_client_change_lease.cpp') verifies:
- SRP registration with default lease and TTL.
- Updating the lease interval and ensuring it is reflected in SRP
  Update messages.
- Updating the TTL and ensuring it is reflected in SRP Update
  messages.
- Setting the TTL to 0 and ensuring the lease interval is used as
  the TTL in SRP Update messages.

The original Python test script is removed as its functionality is
now fully covered by the new Nexus test.
2026-04-21 04:34:43 -05:00
Jonathan Hui 4b4caf3485 [nexus] stabilize srp_auto_start test (#12954)
This commit stabilizes the Nexus SRP auto-start test by increasing
the synchronization wait time from 20 seconds to 30 seconds.

The test was occasionally failing in the Nexus environment because
the 20-second wait was sometimes insufficient for the SRP server
registration to fully propagate through the network data and for
the SRP client to process the update and complete its server
selection. Increasing the wait time to 30 seconds provides a more
robust buffer for these network synchronization events.

Verified by running the test 100 times in a loop without failures.
2026-04-21 02:39:10 -05:00
Jonathan Hui 39b982c8d6 [nexus] migrate ipv6 fragmentation test (#12932)
This commit migrates the `test_ipv6_fragmentation.py` cert test to the
Nexus simulation framework.

To support this migration, the Nexus core configuration was updated to
enable IPv6 fragmentation (`OPENTHREAD_CONFIG_IP6_FRAGMENTATION_ENABLE`).

The new Nexus test `test_ipv6_fragmentation.cpp` covers the validation
of IPv6 fragmentation and reassembly. It sends large ICMPv6 Echo
Requests exceeding the 1280-byte MTU between a Leader and a Router:
- 1952 bytes payload from Leader to Router
- 1831 bytes payload from Router to Leader

The original Python test script is removed as its functionality is now
fully covered by the new Nexus test.
2026-04-20 23:26:02 -05:00
Abtin Keshavarzian cd8e6776e8 [mle] encapsulate router ID sequence and mask in RouterIdMask (#12922)
This commit updates the `RouterIdSet` class, renaming it to
`RouterIdMask` and expanding it to encapsulate both the router ID
sequence number and the bitmask. This allows simplifying the
definition of `ThreadRouterMaskTlv` and `RouteTlv`.
2026-04-20 23:25:30 -05:00
dependabot[bot] b03df41b62 github-actions: bump github/codeql-action from 4.31.10 to 4.35.2 (#12943)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.10 to 4.35.2.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/cdefb33c0f6224e58673d9004f47f7cb3e328b89...95e58e9a2cdfd71adc6e0353d5c52f41a045d225)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.35.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-20 16:50:27 -05:00
Abtin Keshavarzian 1d6aa9c6d7 [mle] simplify TimeParameterTlv (#12923)
This commit simplifies the `TimeParameterTlv` implementation by
defining a `TimeParameterTlvValue` and using the `SimpleTlvInfo`
template to define `TimeParameterTlv`.
2026-04-20 16:50:01 -05:00
Jonathan Hui e88998abc3 [nexus] migrate test_srp_auto_start_mode to Nexus (#12944)
This commit migrates the SRP auto-start test from the Python-based
thread-cert test suite to the Nexus C++ test framework.

The new Nexus test replicates the logic of the original Python test:
- Forms a network with four router nodes.
- Verifies SRP client auto-start upon server discovery in netdata.
- Tests selection priority between multiple unicast and anycast
  SRP servers.
- Verifies selection based on anycast sequence numbers.
- Tests selection of specific unicast addresses published in
  Service Data.
- Confirms automatic failover and client stop/restart.

The original Python test file is removed as it is now covered by
the Nexus test suite.
2026-04-20 16:47:24 -05:00
Jonathan Hui 41979b593d [nexus] migrate test_netdata_publisher to Nexus (#12931)
This commit migrates the functionality of
tests/scripts/thread-cert/test_netdata_publisher.py to a new Nexus
test tests/nexus/test_netdata_publisher.cpp.

The new Nexus test covers:
- DNS/SRP Anycast entries (equal and different version numbers).
- DNS/SRP Unicast entries (service data and server data).
- Displacement of server data unicast by anycast entries.
- Publisher preference logic for DNS/SRP services.
- On-mesh prefix publisher preference and replacement.
- External route publisher preference and replacement.

Other changes:
- Add netdata_publisher to tests/nexus/CMakeLists.txt.
- Add netdata_publisher to default tests in tests/nexus/run_nexus_tests.sh.
- Remove the old tests/scripts/thread-cert/test_netdata_publisher.py.
2026-04-20 16:47:09 -05:00
Jonathan Hui 516472c1b5 [nexus] migrate key rotation and guard time test to nexus (#12937)
This commit migrates the cert test script to the Nexus simulation
framework.

The new Nexus test  covers:
- Initial key sequence counter and default key switch guard time.
- Dynamic updates of the key rotation time via Operational Dataset
  and verification of the 93% guard time calculation rule.
- Automatic key rotation after the rotation time interval expires.
- Verification that the key switch guard time correctly prevents
  nodes from updating their key sequence counter prematurely when
  receiving MLE messages with a higher sequence.
- Continued communication (ICMP Echo) between nodes even when key
  sequences are temporarily mismatched due to the guard timer.

The original Python test script is removed as its functionality is
now fully covered by the new Nexus test.
2026-04-20 09:26:18 -05:00
Jonathan Hui 2ed544115b [nexus] fix intermittent failure in dns_client_config_auto_start test (#12940)
This commit fixes an intermittent failure in the Nexus test
'dns_client_config_auto_start'. The test was occasionally failing
because the REED node was not upgrading to the Router role within
the previous 15-second stabilization period.

The Router role transition can take up to 120 seconds due to the
default 'ROUTER_SELECTION_JITTER' parameter. This commit increases
'kStabilizationTime' to 200 seconds to ensure the node has ample
time to become a router before the test proceeds to verify its
DNS configuration.
2026-04-20 08:59:21 -05:00
Suvesh Pratapa 9bff14609d [cli] make otPlatLogOutput weak to allow application override (#12888)
Make `otPlatLogOutput()` `OT_TOOL_WEAK` in `cli_logging.cpp` so that
applications can provide their own strong definition to customize
instance-aware log output behaviour.
2026-04-20 08:34:32 -05:00
Jonathan Hui 4e216d0d88 [nexus] migrate MAC scan test to nexus (#12938)
This commit migrates the 'test_mac_scan.py' cert test to the Nexus
simulation framework.

The new Nexus test 'test_mac_scan.cpp' verifies the IEEE 802.15.4
Active Scan (MAC scan) functionality. It forms a simple network
consisting of a Leader and a Router and performs an active scan
from the Leader to ensure it correctly discovers the Router's
beacon.

The original Python test script is removed as its functionality is
now fully covered by the new Nexus test.
2026-04-20 02:09:53 -05:00
Jonathan Hui 524240fdb0 [nexus] migrate dns_client_config_auto_start to nexus (#12936)
This commit migrates the dns_client_config_auto_start test from the
thread-cert Python-based test framework to the Nexus C++ simulation
framework.

The new Nexus test (test_dns_client_config_auto_start.cpp) verifies:
- DNS client uses the SRP server address automatically when no
  explicit config is set.
- Explicitly set DNS config takes precedence over auto-discovered
  SRP server address.
- Clearing an explicit DNS config allows the client to fall back to
  the auto-discovered SRP server address.
- DNS client updates its default config when the SRP server changes.

Changes:
- Added tests/nexus/test_dns_client_config_auto_start.cpp
- Updated tests/nexus/CMakeLists.txt to build the new test
- Updated tests/nexus/run_nexus_tests.sh to include it in default
- Removed tests/scripts/thread-cert/test_dns_client_config_auto_start.py
2026-04-20 02:09:35 -05:00
Jonathan Hui a07c892270 [nexus] migrate child supervision test to nexus (#12935)
This commit migrates the functional test for child supervision from
the thread-cert Python-based framework to the Nexus framework.

The original test in 'tests/scripts/thread-cert/test_child_supervision.py'
has been removed and replaced with a C++ implementation in
'tests/nexus/test_child_supervision.cpp'.

The new Nexus test covers:
- Verification of initial child supervision interval on parent and child.
- Dynamically updating the supervision interval and check timeout.
- Behavior when supervision messages are blocked (child detaching).
- Verification of connectivity when child supervision is disabled.
- Handling of zero supervision interval.

'tests/nexus/CMakeLists.txt' is updated to include the new test.
2026-04-20 02:09:19 -05:00
Jonathan Hui 2145cda437 [nexus] migrate REED address solicit rejected test to nexus (#12934)
This commit migrates the 'test_reed_address_solicit_rejected.py' test
from the thread-cert suite to the Nexus test framework.

The new Nexus test 'test_reed_address_solicit_rejected.cpp' covers:
- Verification that a REED node can successfully register a service and
  receive the corresponding Service ALOC (0xfc10).
- Verification that when a REED node's attempt to upgrade to a router
  is rejected by the Leader, it correctly remains a child while
  maintaining its Service ALOC.

The original Python script is removed as its functionality is now
fully covered by the Nexus implementation.
2026-04-20 02:09:01 -05:00
Jonathan Hui a5a5bc622a [nexus] migrate test_br_upgrade_router_role to nexus (#12921)
This commit migrates the functionality of the Python-based certification
test 'test_br_upgrade_router_role.py' to a new Nexus-based C++ test
'test_br_upgrade_router_role.cpp'.

The test verifies that Border Routers (BRs) providing IP connectivity
are eligible to request a router role upgrade even when the active
router count already meets the 'router_upgrade_threshold'.

Key test steps:
- Set router upgrade threshold to 2.
- Ensure three BRs remain in child role when 2 routers already exist.
- Verify BRs upgrade to router role when they provide external routes
  or prefixes, up to the limit of 2 BR routers.
- Verify that a third BR providing external routes remains a child.
- Verify that removing a route from one BR router triggers the child BR
  to upgrade to a router.

The Python test is removed as it is now covered by the Nexus test.
2026-04-20 02:08:28 -05:00
Jonathan Hui d8da3c3ae9 [nexus] set RSSI in simulated ACK frames (#12929)
Set the RSSI field in simulated MAC ACK frames in nexus_core.cpp.

Previously, the simulator did not populate the mRssi field in the
mInfo.mRxInfo structure of simulated ACK frames passed to
otPlatRadioTxDone. This caused OpenThread to ignore the RSSI of ACKs,
preventing the parentRss average from updating on successful data polls
from Sleepy End Devices (SEDs).

Now, the RSSI from the parent to the child is calculated using the radio
model and clamped to int8_t before being assigned to the ACK frame.
2026-04-19 16:43:34 -05:00
Jonathan Hui fba018f36e [nexus] migrate zero_len_external_route to nexus (#12930)
This commit migrates the test for zero-length external routes from a
Python script to the Nexus test framework. The original test was
test_zero_len_external_route.py in tests/scripts/thread-cert.

The new Nexus test test_zero_len_external_route.cpp replicates the
original test scenario:
- Forms a network with a Leader and two Routers.
- Verifies that adding a zero-length external route "::/0" on a Router
  allows routing to a manually added IPv6 address on that Router.
- Verifies that explicit external routes are preferred over on-mesh
  prefixes that have the default route flag set.
- Verifies that removing the external route causes traffic to be
  re-routed (and in this case, fail as intended when the destination
  is moved).
- Verifies that moving the address to another Router with a default
  route flag allows successful routing.

This commit also fixes a bug in Core::SendAndVerifyEchoRequest in
nexus_core.cpp where the ICMP handler was not always unregistered,
especially when failures occurred. This fix ensures that subsequent
handler registrations in the same process do not fail with
kErrorAlready.

Migrating to Nexus provides faster execution and better integration with
the core OpenThread codebase.
2026-04-19 16:40:44 -05:00
Jonathan Hui cea7e325b0 [nexus] migrate ipv6 source selection test to nexus (#12924)
This commit migrates the `test_ipv6_source_selection.py` cert test to
the Nexus simulation framework.

To support this migration, the Nexus framework was extended to allow
verifying the local (source) address on which an ICMP Echo Reply is
received. This is achieved by adding an overload to
`SendAndVerifyEchoRequest` that accepts an expected source address.

The new Nexus test `test_ipv6_source_selection.cpp` covers the
following scenarios:
- RLOC source for RLOC destination
- ML-EID source for ALOC destination
- ML-EID source for ML-EID destination
- Link-local source for Link-local destination
- ML-EID source for Realm-local multicast destination (ff03::1)
- GUA source for GUA destination
- GUA source for external address (via default route)

The original Python test script is removed as its functionality is now
fully covered by the new Nexus test.
2026-04-18 23:37:35 -05:00
Jonathan Hui 5b301fcb72 [nexus] refine CHILD_REMOVED event suppression (#12928)
Refine the event suppression logic in nexus_core.cpp when handling
NeighborTable::kChildRemoved events.

Previously, any valid neighbor found would suppress the event. Now, it
only suppresses the event if the node is found in the Router table.
This ensures that removal events for Sleepy End Devices (SEDs) are not
suppressed, allowing the link to disappear in the visualizer as
expected.
2026-04-18 21:59:02 -05:00
Jonathan Hui 87e9a39eb3 [nexus] fix unused variable warning in otPlatRadioTransmit (#12927)
This commit fixes a compiler warning in nexus_radio.cpp where the
aFrame parameter in otPlatRadioTransmit was considered unused in
non-debug builds. The variable is only used within an OT_ASSERT.

Using OT_UNUSED_VARIABLE is the standard OpenThread pattern to
address unused parameters and ensure clean builds across different
compilers and build configurations.
2026-04-18 21:55:25 -05:00
Jonathan Hui 932e00e12d [nexus] migrate router_downgrade_on_sec_policy_change to nexus (#12926)
This commit migrates the certification test for router downgrade on
security policy change from a Python script to the Nexus test framework.
The original test was test_router_downgrade_on_sec_policy_change.py in
tests/scripts/thread-cert.

The new Nexus test test_router_downgrade_on_sec_policy_change.cpp
replicates the original test scenario:
- Forms a network with a Leader and a Router.
- Verifies that both nodes are in the expected router/leader roles.
- Changes the security policy to disable 'R' bit (routers) and sets the
  version threshold to 7.
- Verifies that the Leader and Router do not immediately downgrade,
  respecting the mandatory 10-second delay.
- Verifies that restoring the original security policy before the
  timeout cancels the pending downgrade.
- Verifies that re-applying the security policy change leads to both
  nodes eventually downgrading to the detached state once the version
  threshold and router disable flags are propagated and the timer
  expires.

Migrating to Nexus provides faster execution using virtual time and a
more integrated environment for debugging core Thread logic.
2026-04-18 21:55:13 -05:00
Jonathan Hui d92a77c1b9 [nexus] fix intermittent failures in 1.4 DNS and PIC tests (#12925)
This commit addresses intermittent failures in Nexus tests 1_4_DNS_TC_1,
1_4_DNS_TC_5, 1_4_PIC_TC_1, 1_4_PIC_TC_3, and 1_4_PIC_TC_4.

The issue was caused by the 'ed1' node occasionally upgrading its role
from an End Device to a Router. When 'ed1' became a router, it would
sometimes use its Routing Locator (RLOC) as the source address for DNS
queries, whereas the verification scripts expected its Mesh Local
Endpoint Identifier (MLEID), leading to packet verification failures.

To resolve this, 'ed1' is now explicitly joined as a Full End Device
(FED) using 'Node::kAsFed' instead of the default Full Thread Device
(FTD) mode. This prevents 'ed1' from becoming a router and ensures it
maintains its End Device role throughout the test, providing stable
addressing for verification.
2026-04-18 21:54:43 -05:00