1*cfb92d14SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*cfb92d14SAndroid Build Coastguard Worker# 3*cfb92d14SAndroid Build Coastguard Worker# Copyright (c) 2022, The OpenThread Authors. 4*cfb92d14SAndroid Build Coastguard Worker# All rights reserved. 5*cfb92d14SAndroid Build Coastguard Worker# 6*cfb92d14SAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without 7*cfb92d14SAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions are met: 8*cfb92d14SAndroid Build Coastguard Worker# 1. Redistributions of source code must retain the above copyright 9*cfb92d14SAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer. 10*cfb92d14SAndroid Build Coastguard Worker# 2. Redistributions in binary form must reproduce the above copyright 11*cfb92d14SAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer in the 12*cfb92d14SAndroid Build Coastguard Worker# documentation and/or other materials provided with the distribution. 13*cfb92d14SAndroid Build Coastguard Worker# 3. Neither the name of the copyright holder nor the 14*cfb92d14SAndroid Build Coastguard Worker# names of its contributors may be used to endorse or promote products 15*cfb92d14SAndroid Build Coastguard Worker# derived from this software without specific prior written permission. 16*cfb92d14SAndroid Build Coastguard Worker# 17*cfb92d14SAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18*cfb92d14SAndroid Build Coastguard Worker# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*cfb92d14SAndroid Build Coastguard Worker# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*cfb92d14SAndroid Build Coastguard Worker# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21*cfb92d14SAndroid Build Coastguard Worker# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22*cfb92d14SAndroid Build Coastguard Worker# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23*cfb92d14SAndroid Build Coastguard Worker# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*cfb92d14SAndroid Build Coastguard Worker# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25*cfb92d14SAndroid Build Coastguard Worker# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26*cfb92d14SAndroid Build Coastguard Worker# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27*cfb92d14SAndroid Build Coastguard Worker# POSSIBILITY OF SUCH DAMAGE. 28*cfb92d14SAndroid Build Coastguard Worker 29*cfb92d14SAndroid Build Coastguard Workerfrom cli import verify 30*cfb92d14SAndroid Build Coastguard Workerfrom cli import verify_within 31*cfb92d14SAndroid Build Coastguard Workerimport cli 32*cfb92d14SAndroid Build Coastguard Workerimport time 33*cfb92d14SAndroid Build Coastguard Worker 34*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 35*cfb92d14SAndroid Build Coastguard Worker# Test description: 36*cfb92d14SAndroid Build Coastguard Worker# This test covers reset of parent, router, leader and restoring children after reset 37*cfb92d14SAndroid Build Coastguard Worker# 38*cfb92d14SAndroid Build Coastguard Worker 39*cfb92d14SAndroid Build Coastguard Workertest_name = __file__[:-3] if __file__.endswith('.py') else __file__ 40*cfb92d14SAndroid Build Coastguard Workerprint('-' * 120) 41*cfb92d14SAndroid Build Coastguard Workerprint('Starting \'{}\''.format(test_name)) 42*cfb92d14SAndroid Build Coastguard Worker 43*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 44*cfb92d14SAndroid Build Coastguard Worker# Creating `cli.Nodes` instances 45*cfb92d14SAndroid Build Coastguard Worker 46*cfb92d14SAndroid Build Coastguard Workerspeedup = 25 47*cfb92d14SAndroid Build Coastguard Workercli.Node.set_time_speedup_factor(speedup) 48*cfb92d14SAndroid Build Coastguard Worker 49*cfb92d14SAndroid Build Coastguard Workerleader = cli.Node() 50*cfb92d14SAndroid Build Coastguard Workerrouter = cli.Node() 51*cfb92d14SAndroid Build Coastguard Workerchild1 = cli.Node() 52*cfb92d14SAndroid Build Coastguard Workerchild2 = cli.Node() 53*cfb92d14SAndroid Build Coastguard Worker 54*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 55*cfb92d14SAndroid Build Coastguard Worker# Form topology 56*cfb92d14SAndroid Build Coastguard Worker 57*cfb92d14SAndroid Build Coastguard Workerleader.form('reset') 58*cfb92d14SAndroid Build Coastguard Workerchild1.join(leader, cli.JOIN_TYPE_REED) 59*cfb92d14SAndroid Build Coastguard Workerchild2.join(leader, cli.JOIN_TYPE_END_DEVICE) 60*cfb92d14SAndroid Build Coastguard Worker 61*cfb92d14SAndroid Build Coastguard Workerverify(leader.get_state() == 'leader') 62*cfb92d14SAndroid Build Coastguard Workerverify(child1.get_state() == 'child') 63*cfb92d14SAndroid Build Coastguard Workerverify(child2.get_state() == 'child') 64*cfb92d14SAndroid Build Coastguard Worker 65*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 66*cfb92d14SAndroid Build Coastguard Worker# Test Implementation 67*cfb92d14SAndroid Build Coastguard Worker 68*cfb92d14SAndroid Build Coastguard Worker# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 69*cfb92d14SAndroid Build Coastguard Worker# Reset the parent and verify that both children are restored on 70*cfb92d14SAndroid Build Coastguard Worker# parent through "Child Update" exchange process and none of them got 71*cfb92d14SAndroid Build Coastguard Worker# detached and needed to attach back. 72*cfb92d14SAndroid Build Coastguard Worker 73*cfb92d14SAndroid Build Coastguard Workerdel leader 74*cfb92d14SAndroid Build Coastguard Workerleader = cli.Node(index=1) 75*cfb92d14SAndroid Build Coastguard Workerleader.interface_up() 76*cfb92d14SAndroid Build Coastguard Workerleader.thread_start() 77*cfb92d14SAndroid Build Coastguard Worker 78*cfb92d14SAndroid Build Coastguard Worker 79*cfb92d14SAndroid Build Coastguard Workerdef check_leader_state(): 80*cfb92d14SAndroid Build Coastguard Worker verify(leader.get_state() == 'leader') 81*cfb92d14SAndroid Build Coastguard Worker 82*cfb92d14SAndroid Build Coastguard Worker 83*cfb92d14SAndroid Build Coastguard Workerverify_within(check_leader_state, 10) 84*cfb92d14SAndroid Build Coastguard Worker 85*cfb92d14SAndroid Build Coastguard Worker# Check that `child1` and `child2` did not detach 86*cfb92d14SAndroid Build Coastguard Worker 87*cfb92d14SAndroid Build Coastguard Workerverify(child1.get_state() == 'child') 88*cfb92d14SAndroid Build Coastguard Workerverify(child2.get_state() == 'child') 89*cfb92d14SAndroid Build Coastguard Worker 90*cfb92d14SAndroid Build Coastguard Workerverify(int(cli.Node.parse_list(child1.get_mle_counter())['Role Detached']) == 1) 91*cfb92d14SAndroid Build Coastguard Workerverify(int(cli.Node.parse_list(child2.get_mle_counter())['Role Detached']) == 1) 92*cfb92d14SAndroid Build Coastguard Worker 93*cfb92d14SAndroid Build Coastguard Worker# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 94*cfb92d14SAndroid Build Coastguard Worker# Reset `router` and make sure it recovers as router with same router ID. 95*cfb92d14SAndroid Build Coastguard Worker 96*cfb92d14SAndroid Build Coastguard Workerrouter.join(leader) 97*cfb92d14SAndroid Build Coastguard Worker 98*cfb92d14SAndroid Build Coastguard Workerverify(router.get_state() == 'router') 99*cfb92d14SAndroid Build Coastguard Workerrouter_rloc16 = int(router.get_rloc16(), 16) 100*cfb92d14SAndroid Build Coastguard Worker 101*cfb92d14SAndroid Build Coastguard Workertime.sleep(0.75) 102*cfb92d14SAndroid Build Coastguard Worker 103*cfb92d14SAndroid Build Coastguard Workerdel router 104*cfb92d14SAndroid Build Coastguard Workerrouter = cli.Node(index=2) 105*cfb92d14SAndroid Build Coastguard Workerrouter.interface_up() 106*cfb92d14SAndroid Build Coastguard Workerrouter.thread_start() 107*cfb92d14SAndroid Build Coastguard Worker 108*cfb92d14SAndroid Build Coastguard Worker 109*cfb92d14SAndroid Build Coastguard Workerdef check_router_state(): 110*cfb92d14SAndroid Build Coastguard Worker verify(router.get_state() == 'router') 111*cfb92d14SAndroid Build Coastguard Worker 112*cfb92d14SAndroid Build Coastguard Worker 113*cfb92d14SAndroid Build Coastguard Workerverify_within(check_router_state, 10) 114*cfb92d14SAndroid Build Coastguard Workerverify(router_rloc16 == int(router.get_rloc16(), 16)) 115*cfb92d14SAndroid Build Coastguard Worker 116*cfb92d14SAndroid Build Coastguard Worker# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 117*cfb92d14SAndroid Build Coastguard Worker# Reset `leader` and make sure `router` is its neighbor again 118*cfb92d14SAndroid Build Coastguard Worker 119*cfb92d14SAndroid Build Coastguard Workerdel leader 120*cfb92d14SAndroid Build Coastguard Workerleader = cli.Node(index=1) 121*cfb92d14SAndroid Build Coastguard Workerleader.interface_up() 122*cfb92d14SAndroid Build Coastguard Workerleader.thread_start() 123*cfb92d14SAndroid Build Coastguard Worker 124*cfb92d14SAndroid Build Coastguard Worker 125*cfb92d14SAndroid Build Coastguard Workerdef check_leader_state(): 126*cfb92d14SAndroid Build Coastguard Worker verify(leader.get_state() == 'leader') 127*cfb92d14SAndroid Build Coastguard Worker 128*cfb92d14SAndroid Build Coastguard Worker 129*cfb92d14SAndroid Build Coastguard Workerverify_within(check_leader_state, 10) 130*cfb92d14SAndroid Build Coastguard Worker 131*cfb92d14SAndroid Build Coastguard Worker 132*cfb92d14SAndroid Build Coastguard Workerdef check_leader_neighbor_table(): 133*cfb92d14SAndroid Build Coastguard Worker verify(len(leader.get_neighbor_table()) == 3) 134*cfb92d14SAndroid Build Coastguard Worker 135*cfb92d14SAndroid Build Coastguard Worker 136*cfb92d14SAndroid Build Coastguard Workerverify_within(check_leader_neighbor_table, 10) 137*cfb92d14SAndroid Build Coastguard Worker 138*cfb92d14SAndroid Build Coastguard Worker# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 139*cfb92d14SAndroid Build Coastguard Worker# Reset `child` and make sure it re-attaches successfully. 140*cfb92d14SAndroid Build Coastguard Worker 141*cfb92d14SAndroid Build Coastguard Workerdel child1 142*cfb92d14SAndroid Build Coastguard Workerchild1 = cli.Node(index=3) 143*cfb92d14SAndroid Build Coastguard Workerchild1.set_router_eligible('disable') 144*cfb92d14SAndroid Build Coastguard Workerchild1.interface_up() 145*cfb92d14SAndroid Build Coastguard Workerchild1.thread_start() 146*cfb92d14SAndroid Build Coastguard Worker 147*cfb92d14SAndroid Build Coastguard Worker 148*cfb92d14SAndroid Build Coastguard Workerdef check_child1_state(): 149*cfb92d14SAndroid Build Coastguard Worker verify(child1.get_state() == 'child') 150*cfb92d14SAndroid Build Coastguard Worker table = child1.get_router_table() 151*cfb92d14SAndroid Build Coastguard Worker verify(len(table) == 2) 152*cfb92d14SAndroid Build Coastguard Worker 153*cfb92d14SAndroid Build Coastguard Worker 154*cfb92d14SAndroid Build Coastguard Workerverify_within(check_child1_state, 10) 155*cfb92d14SAndroid Build Coastguard Worker 156*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 157*cfb92d14SAndroid Build Coastguard Worker# Test finished 158*cfb92d14SAndroid Build Coastguard Worker 159*cfb92d14SAndroid Build Coastguard Workercli.Node.finalize_all_nodes() 160*cfb92d14SAndroid Build Coastguard Worker 161*cfb92d14SAndroid Build Coastguard Workerprint('\'{}\' passed.'.format(test_name)) 162