From 8d462f316e53d5255ca643acae384f2448980a3b Mon Sep 17 00:00:00 2001 From: "Duda, Lukasz" Date: Tue, 21 May 2019 22:42:38 +0200 Subject: [PATCH] [cert] add additional validation for Cert_6_1_06 (#3853) Also fix link quality configuration. --- .../Cert_5_1_10_RouterAttachLinkQuality.py | 2 +- .../Cert_6_1_05_RouterAttachLinkQuality.py | 2 +- ...> Cert_6_1_06_REEDAttachLinkQuality_ED.py} | 84 +++++++- .../Cert_6_1_06_REEDAttachLinkQuality_SED.py | 181 ++++++++++++++++++ tests/scripts/thread-cert/Makefile.am | 6 +- 5 files changed, 269 insertions(+), 6 deletions(-) rename tests/scripts/thread-cert/{Cert_6_1_06_REEDAttachLinkQuality.py => Cert_6_1_06_REEDAttachLinkQuality_ED.py} (52%) create mode 100755 tests/scripts/thread-cert/Cert_6_1_06_REEDAttachLinkQuality_SED.py diff --git a/tests/scripts/thread-cert/Cert_5_1_10_RouterAttachLinkQuality.py b/tests/scripts/thread-cert/Cert_5_1_10_RouterAttachLinkQuality.py index b26199a54..ade58f6aa 100755 --- a/tests/scripts/thread-cert/Cert_5_1_10_RouterAttachLinkQuality.py +++ b/tests/scripts/thread-cert/Cert_5_1_10_RouterAttachLinkQuality.py @@ -72,7 +72,7 @@ class Cert_5_1_10_RouterAttachLinkQuality(unittest.TestCase): self.nodes[ROUTER3].set_panid(0xface) self.nodes[ROUTER3].set_mode('rsdn') self.nodes[ROUTER3].add_whitelist(self.nodes[ROUTER1].get_addr64()) - self.nodes[ROUTER3].add_whitelist(self.nodes[ROUTER2].get_addr64(), rssi=-85) + self.nodes[ROUTER3].add_whitelist(self.nodes[ROUTER2].get_addr64()) self.nodes[ROUTER3].enable_whitelist() self.nodes[ROUTER3].set_router_selection_jitter(1) diff --git a/tests/scripts/thread-cert/Cert_6_1_05_RouterAttachLinkQuality.py b/tests/scripts/thread-cert/Cert_6_1_05_RouterAttachLinkQuality.py index 010e60fa9..2dc323ff9 100755 --- a/tests/scripts/thread-cert/Cert_6_1_05_RouterAttachLinkQuality.py +++ b/tests/scripts/thread-cert/Cert_6_1_05_RouterAttachLinkQuality.py @@ -69,7 +69,7 @@ class Cert_6_1_5_RouterAttachLinkQuality(unittest.TestCase): self.nodes[ED].set_panid(0xface) self.nodes[ED].set_mode('rsn') self.nodes[ED].add_whitelist(self.nodes[ROUTER1].get_addr64()) - self.nodes[ED].add_whitelist(self.nodes[ROUTER2].get_addr64(), rssi=-85) + self.nodes[ED].add_whitelist(self.nodes[ROUTER2].get_addr64()) self.nodes[ED].enable_whitelist() def tearDown(self): diff --git a/tests/scripts/thread-cert/Cert_6_1_06_REEDAttachLinkQuality.py b/tests/scripts/thread-cert/Cert_6_1_06_REEDAttachLinkQuality_ED.py similarity index 52% rename from tests/scripts/thread-cert/Cert_6_1_06_REEDAttachLinkQuality.py rename to tests/scripts/thread-cert/Cert_6_1_06_REEDAttachLinkQuality_ED.py index 076bda2b1..b092e389a 100755 --- a/tests/scripts/thread-cert/Cert_6_1_06_REEDAttachLinkQuality.py +++ b/tests/scripts/thread-cert/Cert_6_1_06_REEDAttachLinkQuality_ED.py @@ -31,6 +31,7 @@ import time import unittest import config +import mle import node LEADER = 1 @@ -38,7 +39,7 @@ REED = 2 ROUTER2 = 3 ED = 4 -class Cert_6_1_6_REEDAttachLinkQuality(unittest.TestCase): +class Cert_6_1_6_REEDAttachLinkQuality_ED(unittest.TestCase): def setUp(self): self.simulator = config.create_default_simulator() @@ -69,7 +70,7 @@ class Cert_6_1_6_REEDAttachLinkQuality(unittest.TestCase): self.nodes[ED].set_panid(0xface) self.nodes[ED].set_mode('rsn') self.nodes[ED].add_whitelist(self.nodes[REED].get_addr64()) - self.nodes[ED].add_whitelist(self.nodes[ROUTER2].get_addr64(), rssi=-85) + self.nodes[ED].add_whitelist(self.nodes[ROUTER2].get_addr64()) self.nodes[ED].enable_whitelist() def tearDown(self): @@ -96,5 +97,84 @@ class Cert_6_1_6_REEDAttachLinkQuality(unittest.TestCase): self.assertEqual(self.nodes[ED].get_state(), 'child') self.assertEqual(self.nodes[REED].get_state(), 'router') + leader_messages = self.simulator.get_messages_sent_by(LEADER) + reed_messages = self.simulator.get_messages_sent_by(REED) + ed_messages = self.simulator.get_messages_sent_by(ED) + router2_messages = self.simulator.get_messages_sent_by(ROUTER2) + + # 1 - Leader. REED1, Router2 + leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT) + + reed_messages.next_mle_message(mle.CommandType.PARENT_REQUEST) + leader_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE) + + reed_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST) + leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE) + + router2_messages.next_mle_message(mle.CommandType.PARENT_REQUEST) + leader_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE) + + router2_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST) + leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE) + + msg = router2_messages.next_coap_message("0.02") + msg.assertCoapMessageRequestUriPath("/a/as") + + msg = leader_messages.next_coap_message("2.04") + + router2_messages.next_mle_message(mle.CommandType.ADVERTISEMENT) + + # 3 - ED + msg = ed_messages.next_mle_message(mle.CommandType.PARENT_REQUEST) + msg.assertSentWithHopLimit(255) + msg.assertSentToDestinationAddress("ff02::2") + msg.assertMleMessageContainsTlv(mle.Mode) + msg.assertMleMessageContainsTlv(mle.Challenge) + msg.assertMleMessageContainsTlv(mle.ScanMask) + msg.assertMleMessageContainsTlv(mle.Version) + + scan_mask_tlv = msg.get_mle_message_tlv(mle.ScanMask) + self.assertEqual(1, scan_mask_tlv.router) + self.assertEqual(0, scan_mask_tlv.end_device) + + # 4 - Router2 + msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE) + msg.assertSentToNode(self.nodes[ED]) + + # 5 - ED + msg = ed_messages.next_mle_message(mle.CommandType.PARENT_REQUEST) + msg.assertSentWithHopLimit(255) + msg.assertSentToDestinationAddress("ff02::2") + msg.assertMleMessageContainsTlv(mle.Mode) + msg.assertMleMessageContainsTlv(mle.Challenge) + msg.assertMleMessageContainsTlv(mle.ScanMask) + msg.assertMleMessageContainsTlv(mle.Version) + + scan_mask_tlv = msg.get_mle_message_tlv(mle.ScanMask) + self.assertEqual(1, scan_mask_tlv.router) + self.assertEqual(1, scan_mask_tlv.end_device) + + # 6 - REED + msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE) + msg.assertSentToNode(self.nodes[ED]) + + msg = reed_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE) + msg.assertSentToNode(self.nodes[ED]) + + # 7 - ED + msg = ed_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST) + msg.assertMleMessageContainsTlv(mle.AddressRegistration) + msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter) + msg.assertMleMessageContainsTlv(mle.Mode) + msg.assertMleMessageContainsTlv(mle.Response) + msg.assertMleMessageContainsTlv(mle.Timeout) + msg.assertMleMessageContainsTlv(mle.TlvRequest) + msg.assertMleMessageContainsTlv(mle.Version) + msg.assertMleMessageContainsOptionalTlv(mle.MleFrameCounter) + msg.assertSentToNode(self.nodes[REED]) + + msg = reed_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE) + msg.assertSentToNode(self.nodes[ED]) + if __name__ == '__main__': unittest.main() diff --git a/tests/scripts/thread-cert/Cert_6_1_06_REEDAttachLinkQuality_SED.py b/tests/scripts/thread-cert/Cert_6_1_06_REEDAttachLinkQuality_SED.py new file mode 100755 index 000000000..af442575c --- /dev/null +++ b/tests/scripts/thread-cert/Cert_6_1_06_REEDAttachLinkQuality_SED.py @@ -0,0 +1,181 @@ +#!/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 unittest + +import config +import mle +import node + +LEADER = 1 +REED = 2 +ROUTER2 = 3 +SED = 4 + +class Cert_6_1_6_REEDAttachLinkQuality_SED(unittest.TestCase): + def setUp(self): + self.simulator = config.create_default_simulator() + + self.nodes = {} + for i in range(1,5): + self.nodes[i] = node.Node(i, (i == SED), simulator=self.simulator) + + self.nodes[LEADER].set_panid(0xface) + self.nodes[LEADER].set_mode('rsdn') + self.nodes[LEADER].add_whitelist(self.nodes[REED].get_addr64()) + self.nodes[LEADER].add_whitelist(self.nodes[ROUTER2].get_addr64()) + self.nodes[LEADER].enable_whitelist() + + self.nodes[REED].set_panid(0xface) + self.nodes[REED].set_mode('rsdn') + self.nodes[REED].add_whitelist(self.nodes[LEADER].get_addr64()) + self.nodes[REED].add_whitelist(self.nodes[SED].get_addr64()) + self.nodes[REED].set_router_upgrade_threshold(0) + self.nodes[REED].enable_whitelist() + + self.nodes[ROUTER2].set_panid(0xface) + self.nodes[ROUTER2].set_mode('rsdn') + self.nodes[ROUTER2].add_whitelist(self.nodes[LEADER].get_addr64()) + self.nodes[ROUTER2].add_whitelist(self.nodes[SED].get_addr64(), rssi=-85) + self.nodes[ROUTER2].enable_whitelist() + self.nodes[ROUTER2].set_router_selection_jitter(1) + + self.nodes[SED].set_panid(0xface) + self.nodes[SED].set_mode('s') + self.nodes[SED].add_whitelist(self.nodes[REED].get_addr64()) + self.nodes[SED].add_whitelist(self.nodes[ROUTER2].get_addr64()) + self.nodes[SED].enable_whitelist() + self.nodes[SED].set_timeout(config.DEFAULT_CHILD_TIMEOUT) + + def tearDown(self): + for node in list(self.nodes.values()): + node.stop() + node.destroy() + self.simulator.stop() + + def test(self): + self.nodes[LEADER].start() + self.simulator.go(5) + self.assertEqual(self.nodes[LEADER].get_state(), 'leader') + + self.nodes[REED].start() + self.simulator.go(5) + self.assertEqual(self.nodes[REED].get_state(), 'child') + + self.nodes[ROUTER2].start() + self.simulator.go(5) + self.assertEqual(self.nodes[ROUTER2].get_state(), 'router') + + self.nodes[SED].start() + self.simulator.go(10) + self.assertEqual(self.nodes[SED].get_state(), 'child') + self.assertEqual(self.nodes[REED].get_state(), 'router') + + leader_messages = self.simulator.get_messages_sent_by(LEADER) + reed_messages = self.simulator.get_messages_sent_by(REED) + sed_messages = self.simulator.get_messages_sent_by(SED) + router2_messages = self.simulator.get_messages_sent_by(ROUTER2) + + # 1 - Leader. REED1, Router2 + leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT) + + reed_messages.next_mle_message(mle.CommandType.PARENT_REQUEST) + leader_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE) + + reed_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST) + leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE) + + router2_messages.next_mle_message(mle.CommandType.PARENT_REQUEST) + leader_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE) + + router2_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST) + leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE) + + msg = router2_messages.next_coap_message("0.02") + msg.assertCoapMessageRequestUriPath("/a/as") + + msg = leader_messages.next_coap_message("2.04") + + router2_messages.next_mle_message(mle.CommandType.ADVERTISEMENT) + + # 3 - SED + msg = sed_messages.next_mle_message(mle.CommandType.PARENT_REQUEST) + msg.assertSentWithHopLimit(255) + msg.assertSentToDestinationAddress("ff02::2") + msg.assertMleMessageContainsTlv(mle.Mode) + msg.assertMleMessageContainsTlv(mle.Challenge) + msg.assertMleMessageContainsTlv(mle.ScanMask) + msg.assertMleMessageContainsTlv(mle.Version) + + scan_mask_tlv = msg.get_mle_message_tlv(mle.ScanMask) + self.assertEqual(1, scan_mask_tlv.router) + self.assertEqual(0, scan_mask_tlv.end_device) + + # 4 - Router2 + msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE) + msg.assertSentToNode(self.nodes[SED]) + + # 5 - SED + msg = sed_messages.next_mle_message(mle.CommandType.PARENT_REQUEST) + msg.assertSentWithHopLimit(255) + msg.assertSentToDestinationAddress("ff02::2") + msg.assertMleMessageContainsTlv(mle.Mode) + msg.assertMleMessageContainsTlv(mle.Challenge) + msg.assertMleMessageContainsTlv(mle.ScanMask) + msg.assertMleMessageContainsTlv(mle.Version) + + scan_mask_tlv = msg.get_mle_message_tlv(mle.ScanMask) + self.assertEqual(1, scan_mask_tlv.router) + self.assertEqual(1, scan_mask_tlv.end_device) + + # 6 - REED + msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE) + msg.assertSentToNode(self.nodes[SED]) + + msg = reed_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE) + msg.assertSentToNode(self.nodes[SED]) + + # 7 - SED + msg = sed_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST) + msg.assertMleMessageContainsTlv(mle.AddressRegistration) + msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter) + msg.assertMleMessageContainsTlv(mle.Mode) + msg.assertMleMessageContainsTlv(mle.Response) + msg.assertMleMessageContainsTlv(mle.Timeout) + msg.assertMleMessageContainsTlv(mle.TlvRequest) + msg.assertMleMessageContainsTlv(mle.Version) + msg.assertMleMessageContainsOptionalTlv(mle.MleFrameCounter) + msg.assertSentToNode(self.nodes[REED]) + + msg = reed_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE) + msg.assertSentToNode(self.nodes[SED]) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/scripts/thread-cert/Makefile.am b/tests/scripts/thread-cert/Makefile.am index c5bf54817..fc01e0ab8 100644 --- a/tests/scripts/thread-cert/Makefile.am +++ b/tests/scripts/thread-cert/Makefile.am @@ -87,7 +87,8 @@ EXTRA_DIST = \ Cert_6_1_03_RouterAttachConnectivity.py \ Cert_6_1_04_REEDAttachConnectivity.py \ Cert_6_1_05_RouterAttachLinkQuality.py \ - Cert_6_1_06_REEDAttachLinkQuality.py \ + Cert_6_1_06_REEDAttachLinkQuality_ED.py \ + Cert_6_1_06_REEDAttachLinkQuality_SED.py \ Cert_6_1_07_EDSynchronization.py \ Cert_6_2_01_NewPartition.py \ Cert_6_2_02_NewPartition.py \ @@ -227,7 +228,8 @@ check_SCRIPTS = \ Cert_6_1_03_RouterAttachConnectivity.py \ Cert_6_1_04_REEDAttachConnectivity.py \ Cert_6_1_05_RouterAttachLinkQuality.py \ - Cert_6_1_06_REEDAttachLinkQuality.py \ + Cert_6_1_06_REEDAttachLinkQuality_ED.py \ + Cert_6_1_06_REEDAttachLinkQuality_SED.py \ Cert_6_1_07_EDSynchronization.py \ Cert_6_2_01_NewPartition.py \ Cert_6_2_02_NewPartition.py \