diff --git a/tests/toranj/start.sh b/tests/toranj/start.sh index 311e1f94c..60ea61085 100755 --- a/tests/toranj/start.sh +++ b/tests/toranj/start.sh @@ -137,6 +137,7 @@ run test-031-meshcop-joiner-commissioner.py run test-032-child-attach-with-multiple-ip-addresses.py run test-033-mesh-local-prefix-change.py run test-034-poor-link-parent-child-attach.py +run test-035-child-timeout-large-data-poll.py run test-100-mcu-power-state.py run test-600-channel-manager-properties.py run test-601-channel-manager-channel-change.py diff --git a/tests/toranj/test-035-child-timeout-large-data-poll.py b/tests/toranj/test-035-child-timeout-large-data-poll.py new file mode 100644 index 000000000..d9123aadd --- /dev/null +++ b/tests/toranj/test-035-child-timeout-large-data-poll.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python +# +# Copyright (c) 2019, 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. + +import wpan +import time + +# ----------------------------------------------------------------------------------------------------------------------- +# Test description: +# +# This test covers the situation where the data poll interval is set to a value larger than child's timeout interval. +# The test verifies that the sleepy child would send a data poll within its timeout interval (ensuring hat child stays +# in parent's child table). + +test_name = __file__[:-3] if __file__.endswith('.py') else __file__ +print('-' * 120) +print('Starting \'{}\''.format(test_name)) + +# ----------------------------------------------------------------------------------------------------------------------- +# Creating `wpan.Nodes` instances + +speedup = 4 +wpan.Node.set_time_speedup_factor(speedup) + +parent = wpan.Node() +child = wpan.Node() + +# ----------------------------------------------------------------------------------------------------------------------- +# Init all nodes + +wpan.Node.init_all_nodes() + +# ----------------------------------------------------------------------------------------------------------------------- +# Test implementation + +parent.form("poll-timeout") + +TIMEOUT = 5 # Child timeout in seconds + +child.set(wpan.WPAN_THREAD_CHILD_TIMEOUT, str(TIMEOUT)) + +child.set(wpan.WPAN_POLL_INTERVAL, str(5 * TIMEOUT * 1000)) + +child.join_node(parent, node_type=wpan.JOIN_TYPE_SLEEPY_END_DEVICE) + +poll_count_before = int(child.get(wpan.WPAN_NCP_COUNTER_TX_PKT_DATA_POLL), 0) + +time.sleep(TIMEOUT * 1.1 / speedup) + +poll_count_after = int(child.get(wpan.WPAN_NCP_COUNTER_TX_PKT_DATA_POLL), 0) + +wpan.verify(poll_count_after > poll_count_before) + +# ----------------------------------------------------------------------------------------------------------------------- +# Test finished + +wpan.Node.finalize_all_nodes() + +print('\'{}\' passed.'.format(test_name))