diff --git a/tests/toranj/build.sh b/tests/toranj/build.sh index 30fe7e594..b3a54ff8c 100755 --- a/tests/toranj/build.sh +++ b/tests/toranj/build.sh @@ -86,6 +86,7 @@ configure_options=" \ --enable-diag \ --enable-ftd \ --enable-jam-detection \ + --enable-joiner \ --enable-legacy \ --enable-mac-filter \ --enable-ncp \ diff --git a/tests/toranj/start.sh b/tests/toranj/start.sh index 530fcd5ff..122d39612 100755 --- a/tests/toranj/start.sh +++ b/tests/toranj/start.sh @@ -133,6 +133,7 @@ run test-027-child-mode-change.py run test-028-router-leader-reset-recovery.py run test-029-data-poll-interval.py run test-030-slaac-address-ncp.py +run test-031-meshcop-joiner-commissioner.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-031-meshcop-joiner-commissioner.py b/tests/toranj/test-031-meshcop-joiner-commissioner.py new file mode 100644 index 000000000..fc11dbc78 --- /dev/null +++ b/tests/toranj/test-031-meshcop-joiner-commissioner.py @@ -0,0 +1,93 @@ +#!/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 time +import wpan +from wpan import verify + +#----------------------------------------------------------------------------------------------------------------------- +# Test description: Test MeshCop Joiner and Commissioner behavior +# +# This test covers Thread commissioning with a single commissioner and joiner device. + +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) + +c = wpan.Node() +j = wpan.Node() + +#----------------------------------------------------------------------------------------------------------------------- +# Init all nodes + +wpan.Node.init_all_nodes() + +#----------------------------------------------------------------------------------------------------------------------- +# Build network topology + +c.form('meshcop') + +#----------------------------------------------------------------------------------------------------------------------- +# Test implementation + +WAIT_TIME = 2 # seconds + +PSKd = '123456' + +joiner_hw_addr = j.get(wpan.WPAN_HW_ADDRESS)[1:-1] # Remove the `[]` + +# Start the commissioner and add joiner hw address along with PSKd +c.commissioner_start() +c.commissioner_add_joiner(joiner_hw_addr, PSKd) + +# Start Joiner +j.joiner_join(PSKd) + +# Verify that Joiner succeeded +verify(j.get(wpan.WPAN_STATE) == wpan.STATE_COMMISSIONED) + +j.joiner_attach() + +def joiner_is_asscoated(): + verify(j.is_associated()) + +wpan.verify_within(joiner_is_asscoated, WAIT_TIME) + +#----------------------------------------------------------------------------------------------------------------------- +# Test finished + +wpan.Node.finalize_all_nodes() + +print '\'{}\' passed.'.format(test_name) diff --git a/tests/toranj/wpan.py b/tests/toranj/wpan.py index 90e1cb2cf..9c38c8879 100644 --- a/tests/toranj/wpan.py +++ b/tests/toranj/wpan.py @@ -496,6 +496,18 @@ class Node(object): (' -l {}'.format(prefix_len) if prefix_len is not None else '') + (' -p {}'.format(priority) if priority is not None else '')) + def commissioner_start(self): + return self.wpanctl('commissioner start') + + def commissioner_add_joiner(self, eui64, pskd, timeout = '100'): + return self.wpanctl('commissioner joiner-add {} {} {}'.format(eui64, timeout, pskd)) + + def joiner_join(self, pskd): + return self.wpanctl('joiner --join {}'.format(pskd)) + + def joiner_attach(self): + return self.wpanctl('joiner --attach') + #------------------------------------------------------------------------------------------------------------------ # Helper methods