Files
openthread/tests/toranj/cli/test-011-network-data-timeout.py
Abtin Keshavarzian 58b230fef0 [cli] netdata show to support filtering by RLOC16 (#9969)
This commit updates the CLI `netdata show` command to allow an
optional RLOC16 as input. Providing an RLOC16 filters the output to
display prefix, route, and service entries associated specifically
with the specified RLOC16. This is helpful for checking entries added
by a specific border router.

`test-011-network-data-timeout.py` is updated to validate the new CLI
functionality.
2024-03-27 15:25:02 -07:00

150 lines
5.0 KiB
Python
Executable File

#!/usr/bin/env python3
#
# Copyright (c) 2022, The OpenThread Authors.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. Neither the name of the copyright holder nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
from cli import verify
from cli import verify_within
import cli
import time
# -----------------------------------------------------------------------------------------------------------------------
# Test description: Network Data (on-mesh prefix) timeout and entry removal
#
# Network topology
#
# r1 ----- r2
# |
# |
# c2 (sleepy)
#
#
# Test covers the following steps:
#
# - Every node adds a unique on-mesh prefix.
# - Every node also adds a common on-mesh prefix (with different flags).
# - Verify that all the unique and common prefixes are present on all nodes are associated with correct RLOC16.
# - Remove `r2` from network (which removes `c2` as well) from Thread partition created by `r1`.
# - Verify that all on-mesh prefixes added by `r2` or `c2` (unique and common) are removed on `r1`.
#
test_name = __file__[:-3] if __file__.endswith('.py') else __file__
print('-' * 120)
print('Starting \'{}\''.format(test_name))
# -----------------------------------------------------------------------------------------------------------------------
# Creating `cli.Nodes` instances
speedup = 25
cli.Node.set_time_speedup_factor(speedup)
r1 = cli.Node()
r2 = cli.Node()
c2 = cli.Node()
# -----------------------------------------------------------------------------------------------------------------------
# Form topology
r1.allowlist_node(r2)
r2.allowlist_node(r1)
r2.allowlist_node(c2)
c2.allowlist_node(r2)
r1.form("netdatatmout")
r2.join(r1)
c2.join(r1, cli.JOIN_TYPE_SLEEPY_END_DEVICE)
c2.set_pollperiod(500)
verify(r1.get_state() == 'leader')
verify(r2.get_state() == 'router')
verify(c2.get_state() == 'child')
nodes = [r1, r2, c2]
# -----------------------------------------------------------------------------------------------------------------------
# Test Implementation
# Each node adds its own prefix.
r1.add_prefix('fd00:1::/64', 'paros', 'med')
r2.add_prefix('fd00:2::/64', 'paros', 'med')
c2.add_prefix('fd00:3::/64', 'paros', 'med')
# a common prefix is added by all three nodes (with different preference)
r1.add_prefix('fd00:abba::/64', 'paros', 'high')
r2.add_prefix('fd00:abba::/64', 'paros', 'med')
c2.add_prefix('fd00:abba::/64', 'paros', 'low')
r1.add_route('fd00:cafe::/64', 's', 'med')
r2.add_route('fd00:cafe::/64', 's', 'med')
r1.register_netdata()
r2.register_netdata()
c2.register_netdata()
def check_netdata_on_all_nodes():
for node in nodes:
netdata = node.get_netdata()
verify(len(netdata['prefixes']) == 6)
verify(len(netdata['routes']) == 2)
verify_within(check_netdata_on_all_nodes, 10)
# Check netdata filtering for r1 entries only.
r1_rloc = int(r1.get_rloc16(), 16)
netdata = r1.get_netdata(r1_rloc)
verify(len(netdata['prefixes']) == 2)
verify(len(netdata['routes']) == 1)
# Remove `r2`. This should trigger all the prefixes added by it or its
# child to timeout and be removed.
r2.thread_stop()
r2.interface_down()
def check_netdata_on_r1():
netdata = r1.get_netdata()
verify(len(netdata['prefixes']) == 2)
verify(len(netdata['routes']) == 1)
netdata = r1.get_netdata(r1_rloc)
verify(len(netdata['prefixes']) == 2)
verify(len(netdata['routes']) == 1)
verify_within(check_netdata_on_r1, 120)
# -----------------------------------------------------------------------------------------------------------------------
# Test finished
cli.Node.finalize_all_nodes()
print('\'{}\' passed.'.format(test_name))