1*cfb92d14SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*cfb92d14SAndroid Build Coastguard Worker# 3*cfb92d14SAndroid Build Coastguard Worker# Copyright (c) 2023, 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: Network Data Context ID assignment and reuse delay. 36*cfb92d14SAndroid Build Coastguard Worker# 37*cfb92d14SAndroid Build Coastguard Worker# Network topology 38*cfb92d14SAndroid Build Coastguard Worker# 39*cfb92d14SAndroid Build Coastguard Worker# r1 ---- r2 ---- r3 40*cfb92d14SAndroid Build Coastguard Worker# 41*cfb92d14SAndroid Build Coastguard Worker 42*cfb92d14SAndroid Build Coastguard Workertest_name = __file__[:-3] if __file__.endswith('.py') else __file__ 43*cfb92d14SAndroid Build Coastguard Workerprint('-' * 120) 44*cfb92d14SAndroid Build Coastguard Workerprint('Starting \'{}\''.format(test_name)) 45*cfb92d14SAndroid Build Coastguard Worker 46*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 47*cfb92d14SAndroid Build Coastguard Worker# Creating `cli.Node` instances 48*cfb92d14SAndroid Build Coastguard Worker 49*cfb92d14SAndroid Build Coastguard Workerspeedup = 40 50*cfb92d14SAndroid Build Coastguard Workercli.Node.set_time_speedup_factor(speedup) 51*cfb92d14SAndroid Build Coastguard Worker 52*cfb92d14SAndroid Build Coastguard Workerr1 = cli.Node() 53*cfb92d14SAndroid Build Coastguard Workerr2 = cli.Node() 54*cfb92d14SAndroid Build Coastguard Workerr3 = cli.Node() 55*cfb92d14SAndroid Build Coastguard Worker 56*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 57*cfb92d14SAndroid Build Coastguard Worker# Form topology 58*cfb92d14SAndroid Build Coastguard Worker 59*cfb92d14SAndroid Build Coastguard Workerr1.allowlist_node(r2) 60*cfb92d14SAndroid Build Coastguard Worker 61*cfb92d14SAndroid Build Coastguard Workerr2.allowlist_node(r1) 62*cfb92d14SAndroid Build Coastguard Workerr2.allowlist_node(r3) 63*cfb92d14SAndroid Build Coastguard Worker 64*cfb92d14SAndroid Build Coastguard Workerr3.allowlist_node(r2) 65*cfb92d14SAndroid Build Coastguard Worker 66*cfb92d14SAndroid Build Coastguard Workerr1.form('netdata') 67*cfb92d14SAndroid Build Coastguard Workerr2.join(r1) 68*cfb92d14SAndroid Build Coastguard Workerr3.join(r1) 69*cfb92d14SAndroid Build Coastguard Worker 70*cfb92d14SAndroid Build Coastguard Workerverify(r1.get_state() == 'leader') 71*cfb92d14SAndroid Build Coastguard Workerverify(r2.get_state() == 'router') 72*cfb92d14SAndroid Build Coastguard Workerverify(r3.get_state() == 'router') 73*cfb92d14SAndroid Build Coastguard Worker 74*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 75*cfb92d14SAndroid Build Coastguard Worker# Test Implementation 76*cfb92d14SAndroid Build Coastguard Worker 77*cfb92d14SAndroid Build Coastguard Worker# Check the default reuse delay on `r1` to be 5 minutes. 78*cfb92d14SAndroid Build Coastguard Worker 79*cfb92d14SAndroid Build Coastguard Workerverify(int(r1.get_context_reuse_delay()) == 5 * 60) 80*cfb92d14SAndroid Build Coastguard Worker 81*cfb92d14SAndroid Build Coastguard Worker# Change the reuse delay on `r1` (leader) to 5 seconds. 82*cfb92d14SAndroid Build Coastguard Worker 83*cfb92d14SAndroid Build Coastguard Workerr1.set_context_reuse_delay(5) 84*cfb92d14SAndroid Build Coastguard Workerverify(int(r1.get_context_reuse_delay()) == 5) 85*cfb92d14SAndroid Build Coastguard Worker 86*cfb92d14SAndroid Build Coastguard Worker# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 87*cfb92d14SAndroid Build Coastguard Worker# Add an on-mesh prefix from each router `r1`, r2`, and `r3`. 88*cfb92d14SAndroid Build Coastguard Worker# Validate that netdata is updated and Context IDs are assigned. 89*cfb92d14SAndroid Build Coastguard Worker 90*cfb92d14SAndroid Build Coastguard Workerr1.add_prefix('fd00:1::/64', 'poas') 91*cfb92d14SAndroid Build Coastguard Workerr1.register_netdata() 92*cfb92d14SAndroid Build Coastguard Worker 93*cfb92d14SAndroid Build Coastguard Workerr2.add_prefix('fd00:2::/64', 'poas') 94*cfb92d14SAndroid Build Coastguard Workerr2.register_netdata() 95*cfb92d14SAndroid Build Coastguard Worker 96*cfb92d14SAndroid Build Coastguard Workerr3.add_prefix('fd00:3::/64', 'poas') 97*cfb92d14SAndroid Build Coastguard Workerr3.add_route('fd00:beef::/64', 's') 98*cfb92d14SAndroid Build Coastguard Workerr3.register_netdata() 99*cfb92d14SAndroid Build Coastguard Worker 100*cfb92d14SAndroid Build Coastguard Worker 101*cfb92d14SAndroid Build Coastguard Workerdef check_netdata_1(): 102*cfb92d14SAndroid Build Coastguard Worker global netdata 103*cfb92d14SAndroid Build Coastguard Worker netdata = r1.get_netdata() 104*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['prefixes']) == 3) 105*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['routes']) == 1) 106*cfb92d14SAndroid Build Coastguard Worker 107*cfb92d14SAndroid Build Coastguard Worker 108*cfb92d14SAndroid Build Coastguard Workerverify_within(check_netdata_1, 5) 109*cfb92d14SAndroid Build Coastguard Worker 110*cfb92d14SAndroid Build Coastguard Workercontexts = netdata['contexts'] 111*cfb92d14SAndroid Build Coastguard Workerverify(len(contexts) == 3) 112*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:1:0:0::/64') for context in contexts])) 113*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:2:0:0::/64') for context in contexts])) 114*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:3:0:0::/64') for context in contexts])) 115*cfb92d14SAndroid Build Coastguard Workerfor context in contexts: 116*cfb92d14SAndroid Build Coastguard Worker verify(context.endswith('c')) 117*cfb92d14SAndroid Build Coastguard Worker 118*cfb92d14SAndroid Build Coastguard Worker# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 119*cfb92d14SAndroid Build Coastguard Worker# Remove prefix on `r3`. Validate that Context compress flag 120*cfb92d14SAndroid Build Coastguard Worker# is cleared for the removed prefix. 121*cfb92d14SAndroid Build Coastguard Worker 122*cfb92d14SAndroid Build Coastguard Workerr3.remove_prefix('fd00:3::/64') 123*cfb92d14SAndroid Build Coastguard Workerr3.register_netdata() 124*cfb92d14SAndroid Build Coastguard Worker 125*cfb92d14SAndroid Build Coastguard Worker 126*cfb92d14SAndroid Build Coastguard Workerdef check_netdata_2(): 127*cfb92d14SAndroid Build Coastguard Worker global netdata, versions 128*cfb92d14SAndroid Build Coastguard Worker versions = r1.get_netdata_versions() 129*cfb92d14SAndroid Build Coastguard Worker netdata = r1.get_netdata() 130*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['prefixes']) == 2) 131*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['routes']) == 1) 132*cfb92d14SAndroid Build Coastguard Worker 133*cfb92d14SAndroid Build Coastguard Worker 134*cfb92d14SAndroid Build Coastguard Workerverify_within(check_netdata_2, 5) 135*cfb92d14SAndroid Build Coastguard Worker 136*cfb92d14SAndroid Build Coastguard Workercontexts = netdata['contexts'] 137*cfb92d14SAndroid Build Coastguard Workerverify(len(contexts) == 3) 138*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:1:0:0::/64') for context in contexts])) 139*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:2:0:0::/64') for context in contexts])) 140*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:3:0:0::/64') for context in contexts])) 141*cfb92d14SAndroid Build Coastguard Workerfor context in contexts: 142*cfb92d14SAndroid Build Coastguard Worker if context.startswith('fd00:1:0:0::/64') or context.startswith('fd00:2:0:0::/64'): 143*cfb92d14SAndroid Build Coastguard Worker verify(context.endswith('c')) 144*cfb92d14SAndroid Build Coastguard Worker else: 145*cfb92d14SAndroid Build Coastguard Worker verify(context.endswith('-')) 146*cfb92d14SAndroid Build Coastguard Worker 147*cfb92d14SAndroid Build Coastguard Worker# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 148*cfb92d14SAndroid Build Coastguard Worker# Validate that the prefix context is removed within reuse delay 149*cfb92d14SAndroid Build Coastguard Worker# time (which is set to 5 seconds on leader). 150*cfb92d14SAndroid Build Coastguard Worker 151*cfb92d14SAndroid Build Coastguard Worker 152*cfb92d14SAndroid Build Coastguard Workerdef check_netdata_3(): 153*cfb92d14SAndroid Build Coastguard Worker global netdata 154*cfb92d14SAndroid Build Coastguard Worker netdata = r1.get_netdata() 155*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['prefixes']) == 2) 156*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['routes']) == 1) 157*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['contexts']) == 2) 158*cfb92d14SAndroid Build Coastguard Worker 159*cfb92d14SAndroid Build Coastguard Worker 160*cfb92d14SAndroid Build Coastguard Workerverify_within(check_netdata_3, 5) 161*cfb92d14SAndroid Build Coastguard Workerold_versions = versions 162*cfb92d14SAndroid Build Coastguard Workerversions = r1.get_netdata_versions() 163*cfb92d14SAndroid Build Coastguard Workerverify(versions != old_versions) 164*cfb92d14SAndroid Build Coastguard Worker 165*cfb92d14SAndroid Build Coastguard Worker# Make sure netdata does not change afterwards 166*cfb92d14SAndroid Build Coastguard Worker 167*cfb92d14SAndroid Build Coastguard Workertime.sleep(5 * 3 / speedup) 168*cfb92d14SAndroid Build Coastguard Worker 169*cfb92d14SAndroid Build Coastguard Workerverify(versions == r1.get_netdata_versions()) 170*cfb92d14SAndroid Build Coastguard Workernetdata = r1.get_netdata() 171*cfb92d14SAndroid Build Coastguard Workerverify(len(netdata['prefixes']) == 2) 172*cfb92d14SAndroid Build Coastguard Workerverify(len(netdata['routes']) == 1) 173*cfb92d14SAndroid Build Coastguard Workerverify(len(netdata['contexts']) == 2) 174*cfb92d14SAndroid Build Coastguard Worker 175*cfb92d14SAndroid Build Coastguard Worker# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 176*cfb92d14SAndroid Build Coastguard Worker# Add two new on-mesh prefixes from `r3`. Validate that they get 177*cfb92d14SAndroid Build Coastguard Worker# assigned Context IDs. 178*cfb92d14SAndroid Build Coastguard Worker 179*cfb92d14SAndroid Build Coastguard Workerr3.add_prefix('fd00:4::/64', 'poas') 180*cfb92d14SAndroid Build Coastguard Workerr3.register_netdata() 181*cfb92d14SAndroid Build Coastguard Worker 182*cfb92d14SAndroid Build Coastguard Workerr3.add_prefix('fd00:3::/64', 'poas') 183*cfb92d14SAndroid Build Coastguard Workerr3.register_netdata() 184*cfb92d14SAndroid Build Coastguard Worker 185*cfb92d14SAndroid Build Coastguard Worker 186*cfb92d14SAndroid Build Coastguard Workerdef check_netdata_4(): 187*cfb92d14SAndroid Build Coastguard Worker global netdata 188*cfb92d14SAndroid Build Coastguard Worker netdata = r1.get_netdata() 189*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['prefixes']) == 4) 190*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['routes']) == 1) 191*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['contexts']) == 4) 192*cfb92d14SAndroid Build Coastguard Worker 193*cfb92d14SAndroid Build Coastguard Worker 194*cfb92d14SAndroid Build Coastguard Workerverify_within(check_netdata_4, 5) 195*cfb92d14SAndroid Build Coastguard Worker 196*cfb92d14SAndroid Build Coastguard Workercontexts = netdata['contexts'] 197*cfb92d14SAndroid Build Coastguard Workerverify(len(contexts) == 4) 198*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:1:0:0::/64') for context in contexts])) 199*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:2:0:0::/64') for context in contexts])) 200*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:3:0:0::/64') for context in contexts])) 201*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:4:0:0::/64') for context in contexts])) 202*cfb92d14SAndroid Build Coastguard Workerfor context in contexts: 203*cfb92d14SAndroid Build Coastguard Worker verify(context.endswith('c')) 204*cfb92d14SAndroid Build Coastguard Worker 205*cfb92d14SAndroid Build Coastguard Worker# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 206*cfb92d14SAndroid Build Coastguard Worker# Remove prefixes on `r1` and `r2` and re-add them back quickly both 207*cfb92d14SAndroid Build Coastguard Worker# from `r2`. Validate that they get the same context IDs as before. 208*cfb92d14SAndroid Build Coastguard Worker 209*cfb92d14SAndroid Build Coastguard Workerfor context in contexts: 210*cfb92d14SAndroid Build Coastguard Worker if context.startswith('fd00:1:0:0::/64'): 211*cfb92d14SAndroid Build Coastguard Worker cid1 = int(context.split()[1]) 212*cfb92d14SAndroid Build Coastguard Worker elif context.startswith('fd00:2:0:0::/64'): 213*cfb92d14SAndroid Build Coastguard Worker cid2 = int(context.split()[1]) 214*cfb92d14SAndroid Build Coastguard Worker 215*cfb92d14SAndroid Build Coastguard Workerr1.remove_prefix('fd00:1:0:0::/64') 216*cfb92d14SAndroid Build Coastguard Workerr1.register_netdata() 217*cfb92d14SAndroid Build Coastguard Worker 218*cfb92d14SAndroid Build Coastguard Workerr2.remove_prefix('fd00:2:0:0::/64') 219*cfb92d14SAndroid Build Coastguard Workerr2.register_netdata() 220*cfb92d14SAndroid Build Coastguard Worker 221*cfb92d14SAndroid Build Coastguard Worker 222*cfb92d14SAndroid Build Coastguard Workerdef check_netdata_5(): 223*cfb92d14SAndroid Build Coastguard Worker global netdata 224*cfb92d14SAndroid Build Coastguard Worker netdata = r1.get_netdata() 225*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['prefixes']) == 2) 226*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['routes']) == 1) 227*cfb92d14SAndroid Build Coastguard Worker 228*cfb92d14SAndroid Build Coastguard Worker 229*cfb92d14SAndroid Build Coastguard Workerverify_within(check_netdata_5, 5) 230*cfb92d14SAndroid Build Coastguard Worker 231*cfb92d14SAndroid Build Coastguard Workercontexts = netdata['contexts'] 232*cfb92d14SAndroid Build Coastguard Workerverify(len(contexts) == 4) 233*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:1:0:0::/64') for context in contexts])) 234*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:2:0:0::/64') for context in contexts])) 235*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:3:0:0::/64') for context in contexts])) 236*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:4:0:0::/64') for context in contexts])) 237*cfb92d14SAndroid Build Coastguard Workerfor context in contexts: 238*cfb92d14SAndroid Build Coastguard Worker if context.startswith('fd00:1:0:0::/64') or context.startswith('fd00:2:0:0::/64'): 239*cfb92d14SAndroid Build Coastguard Worker verify(context.endswith('-')) 240*cfb92d14SAndroid Build Coastguard Worker else: 241*cfb92d14SAndroid Build Coastguard Worker verify(context.endswith('c')) 242*cfb92d14SAndroid Build Coastguard Worker 243*cfb92d14SAndroid Build Coastguard Worker# Re-add both prefixes (now from `r2`) before CID remove delay time 244*cfb92d14SAndroid Build Coastguard Worker# is expired. 245*cfb92d14SAndroid Build Coastguard Worker 246*cfb92d14SAndroid Build Coastguard Workerr2.add_prefix('fd00:1::/64', 'poas') 247*cfb92d14SAndroid Build Coastguard Workerr2.add_prefix('fd00:2::/64', 'poas') 248*cfb92d14SAndroid Build Coastguard Workerr2.register_netdata() 249*cfb92d14SAndroid Build Coastguard Worker 250*cfb92d14SAndroid Build Coastguard Worker 251*cfb92d14SAndroid Build Coastguard Workerdef check_netdata_6(): 252*cfb92d14SAndroid Build Coastguard Worker global netdata 253*cfb92d14SAndroid Build Coastguard Worker netdata = r1.get_netdata() 254*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['prefixes']) == 4) 255*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['routes']) == 1) 256*cfb92d14SAndroid Build Coastguard Worker 257*cfb92d14SAndroid Build Coastguard Worker 258*cfb92d14SAndroid Build Coastguard Workerverify_within(check_netdata_6, 5) 259*cfb92d14SAndroid Build Coastguard Worker 260*cfb92d14SAndroid Build Coastguard Workercontexts = netdata['contexts'] 261*cfb92d14SAndroid Build Coastguard Workerverify(len(contexts) == 4) 262*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:1:0:0::/64') for context in contexts])) 263*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:2:0:0::/64') for context in contexts])) 264*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:3:0:0::/64') for context in contexts])) 265*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:4:0:0::/64') for context in contexts])) 266*cfb92d14SAndroid Build Coastguard Workerfor context in contexts: 267*cfb92d14SAndroid Build Coastguard Worker verify(context.endswith('c')) 268*cfb92d14SAndroid Build Coastguard Worker if context.startswith('fd00:1:0:0::/64'): 269*cfb92d14SAndroid Build Coastguard Worker verify(int(context.split()[1]) == cid1) 270*cfb92d14SAndroid Build Coastguard Worker elif context.startswith('fd00:2:0:0::/64'): 271*cfb92d14SAndroid Build Coastguard Worker verify(int(context.split()[1]) == cid2) 272*cfb92d14SAndroid Build Coastguard Worker 273*cfb92d14SAndroid Build Coastguard Worker# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 274*cfb92d14SAndroid Build Coastguard Worker# Remove two prefixes on `r3`. Add one back as an external route from 275*cfb92d14SAndroid Build Coastguard Worker# `r1`. Also add a new prefix from `r1`. Validate that the context IDs 276*cfb92d14SAndroid Build Coastguard Worker# for the removed on-mesh prefixes are removed after reuse delay time 277*cfb92d14SAndroid Build Coastguard Worker# and that the new prefix gets a different Context ID. 278*cfb92d14SAndroid Build Coastguard Worker 279*cfb92d14SAndroid Build Coastguard Worker# Remember the CID used. 280*cfb92d14SAndroid Build Coastguard Workerfor context in contexts: 281*cfb92d14SAndroid Build Coastguard Worker if context.startswith('fd00:3:0:0::/64'): 282*cfb92d14SAndroid Build Coastguard Worker cid3 = int(context.split()[1]) 283*cfb92d14SAndroid Build Coastguard Worker elif context.startswith('fd00:4:0:0::/64'): 284*cfb92d14SAndroid Build Coastguard Worker cid4 = int(context.split()[1]) 285*cfb92d14SAndroid Build Coastguard Worker 286*cfb92d14SAndroid Build Coastguard Workerr3.remove_prefix('fd00:3:0:0::/64') 287*cfb92d14SAndroid Build Coastguard Workerr3.remove_prefix('fd00:4:0:0::/64') 288*cfb92d14SAndroid Build Coastguard Workerr3.register_netdata() 289*cfb92d14SAndroid Build Coastguard Worker 290*cfb92d14SAndroid Build Coastguard Worker 291*cfb92d14SAndroid Build Coastguard Workerdef check_netdata_7(): 292*cfb92d14SAndroid Build Coastguard Worker global netdata 293*cfb92d14SAndroid Build Coastguard Worker netdata = r1.get_netdata() 294*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['prefixes']) == 2) 295*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['routes']) == 1) 296*cfb92d14SAndroid Build Coastguard Worker 297*cfb92d14SAndroid Build Coastguard Worker 298*cfb92d14SAndroid Build Coastguard Workerverify_within(check_netdata_7, 5) 299*cfb92d14SAndroid Build Coastguard Worker 300*cfb92d14SAndroid Build Coastguard Workercontexts = netdata['contexts'] 301*cfb92d14SAndroid Build Coastguard Workerverify(len(contexts) == 4) 302*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:1:0:0::/64') for context in contexts])) 303*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:2:0:0::/64') for context in contexts])) 304*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:3:0:0::/64') for context in contexts])) 305*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:4:0:0::/64') for context in contexts])) 306*cfb92d14SAndroid Build Coastguard Workerfor context in contexts: 307*cfb92d14SAndroid Build Coastguard Worker if context.startswith('fd00:3:0:0::/64') or context.startswith('fd00:4:0:0::/64'): 308*cfb92d14SAndroid Build Coastguard Worker verify(context.endswith('-')) 309*cfb92d14SAndroid Build Coastguard Worker else: 310*cfb92d14SAndroid Build Coastguard Worker verify(context.endswith('c')) 311*cfb92d14SAndroid Build Coastguard Worker 312*cfb92d14SAndroid Build Coastguard Worker# Add first one removed as route and add a new prefix. 313*cfb92d14SAndroid Build Coastguard Worker 314*cfb92d14SAndroid Build Coastguard Workerr1.add_route('fd00:3:0:0::/64', 's') 315*cfb92d14SAndroid Build Coastguard Workerr1.add_prefix('fd00:5:0:0::/64', 'poas') 316*cfb92d14SAndroid Build Coastguard Workerr1.register_netdata() 317*cfb92d14SAndroid Build Coastguard Worker 318*cfb92d14SAndroid Build Coastguard Worker 319*cfb92d14SAndroid Build Coastguard Workerdef check_netdata_8(): 320*cfb92d14SAndroid Build Coastguard Worker global netdata 321*cfb92d14SAndroid Build Coastguard Worker netdata = r1.get_netdata() 322*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['prefixes']) == 3) 323*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['routes']) == 2) 324*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['contexts']) == 3) 325*cfb92d14SAndroid Build Coastguard Worker 326*cfb92d14SAndroid Build Coastguard Worker 327*cfb92d14SAndroid Build Coastguard Workerverify_within(check_netdata_8, 5) 328*cfb92d14SAndroid Build Coastguard Worker 329*cfb92d14SAndroid Build Coastguard Workercontexts = netdata['contexts'] 330*cfb92d14SAndroid Build Coastguard Workerverify(len(contexts) == 3) 331*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:1:0:0::/64') for context in contexts])) 332*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:2:0:0::/64') for context in contexts])) 333*cfb92d14SAndroid Build Coastguard Workerverify(any([context.startswith('fd00:5:0:0::/64') for context in contexts])) 334*cfb92d14SAndroid Build Coastguard Worker 335*cfb92d14SAndroid Build Coastguard Workerfor context in contexts: 336*cfb92d14SAndroid Build Coastguard Worker verify(context.endswith('c')) 337*cfb92d14SAndroid Build Coastguard Worker if context.startswith('fd00:5:0:0::/64'): 338*cfb92d14SAndroid Build Coastguard Worker verify(not int(context.split()[1]) in [cid3, cid4]) 339*cfb92d14SAndroid Build Coastguard Worker 340*cfb92d14SAndroid Build Coastguard Worker# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 341*cfb92d14SAndroid Build Coastguard Worker# Remove a prefix on `r2`, wait one second and remove a second 342*cfb92d14SAndroid Build Coastguard Worker# prefix. Validate the Context IDs for both are removed. 343*cfb92d14SAndroid Build Coastguard Worker 344*cfb92d14SAndroid Build Coastguard Workerr2.remove_prefix('fd00:1::/64') 345*cfb92d14SAndroid Build Coastguard Workerr2.register_netdata() 346*cfb92d14SAndroid Build Coastguard Worker 347*cfb92d14SAndroid Build Coastguard Workertime.sleep(1 / speedup) 348*cfb92d14SAndroid Build Coastguard Worker 349*cfb92d14SAndroid Build Coastguard Workerr2.remove_prefix('fd00:2::/64') 350*cfb92d14SAndroid Build Coastguard Workerr2.register_netdata() 351*cfb92d14SAndroid Build Coastguard Worker 352*cfb92d14SAndroid Build Coastguard Worker 353*cfb92d14SAndroid Build Coastguard Workerdef check_netdata_9(): 354*cfb92d14SAndroid Build Coastguard Worker global netdata 355*cfb92d14SAndroid Build Coastguard Worker netdata = r1.get_netdata() 356*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['prefixes']) == 1) 357*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['routes']) == 2) 358*cfb92d14SAndroid Build Coastguard Worker verify(len(netdata['contexts']) == 1) 359*cfb92d14SAndroid Build Coastguard Worker 360*cfb92d14SAndroid Build Coastguard Worker 361*cfb92d14SAndroid Build Coastguard Workerverify_within(check_netdata_9, 5) 362*cfb92d14SAndroid Build Coastguard Worker 363*cfb92d14SAndroid Build Coastguard Workercontexts = netdata['contexts'] 364*cfb92d14SAndroid Build Coastguard Workerverify(len(contexts) == 1) 365*cfb92d14SAndroid Build Coastguard Workerverify(contexts[0].startswith('fd00:5:0:0::/64')) 366*cfb92d14SAndroid Build Coastguard Workerverify(contexts[0].endswith('c')) 367*cfb92d14SAndroid Build Coastguard Worker 368*cfb92d14SAndroid Build Coastguard Worker# ----------------------------------------------------------------------------------------------------------------------- 369*cfb92d14SAndroid Build Coastguard Worker# Test finished 370*cfb92d14SAndroid Build Coastguard Worker 371*cfb92d14SAndroid Build Coastguard Workercli.Node.finalize_all_nodes() 372*cfb92d14SAndroid Build Coastguard Worker 373*cfb92d14SAndroid Build Coastguard Workerprint('\'{}\' passed.'.format(test_name)) 374