mirror of
https://github.com/espressif/openthread.git
synced 2026-10-06 15:57:39 +00:00
[style] update python style to conform to PEP 8 (#3951)
With the exception of line length set to 119 vs. 79. Add tests/ and tools/ to py-pretty-check.
This commit is contained in:
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -40,7 +39,6 @@ ROUTER = 2
|
||||
|
||||
|
||||
class Cert_5_1_01_RouterAttach(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -60,9 +58,9 @@ class Cert_5_1_01_RouterAttach(unittest.TestCase):
|
||||
self.nodes[ROUTER].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -112,7 +110,9 @@ class Cert_5_1_01_RouterAttach(unittest.TestCase):
|
||||
msg.assertMleMessageContainsTlv(mle.Version)
|
||||
|
||||
# 4 - Router
|
||||
msg = router_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg = router_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[LEADER])
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
@@ -124,7 +124,9 @@ class Cert_5_1_01_RouterAttach(unittest.TestCase):
|
||||
msg.assertMleMessageDoesNotContainTlv(mle.AddressRegistration)
|
||||
|
||||
# 5 - Leader
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[ROUTER])
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
@@ -159,7 +161,9 @@ class Cert_5_1_01_RouterAttach(unittest.TestCase):
|
||||
self.assertIn(mle.TlvType.LINK_MARGIN, tlv_request.tlvs)
|
||||
|
||||
# 9 - Leader
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.LINK_ACCEPT_AND_REQUEST)
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.LINK_ACCEPT_AND_REQUEST
|
||||
)
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
@@ -181,5 +185,6 @@ class Cert_5_1_01_RouterAttach(unittest.TestCase):
|
||||
for addr in self.nodes[LEADER].get_addrs():
|
||||
self.assertTrue(self.nodes[ROUTER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -41,8 +40,8 @@ SED = 4
|
||||
|
||||
MTDS = [ED, SED]
|
||||
|
||||
class Cert_5_1_02_ChildAddressTimeout(unittest.TestCase):
|
||||
|
||||
class Cert_5_1_02_ChildAddressTimeout(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -76,9 +75,9 @@ class Cert_5_1_02_ChildAddressTimeout(unittest.TestCase):
|
||||
self.nodes[SED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -41,7 +40,6 @@ ROUTER2 = 3
|
||||
|
||||
|
||||
class Cert_5_1_03_RouterAddressReallocation(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -70,9 +68,9 @@ class Cert_5_1_03_RouterAddressReallocation(unittest.TestCase):
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -125,7 +123,9 @@ class Cert_5_1_03_RouterAddressReallocation(unittest.TestCase):
|
||||
router2_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
|
||||
# Leader or Router1 can be parent of Router2
|
||||
if leader_messages.contains_mle_message(mle.CommandType.CHILD_ID_RESPONSE):
|
||||
if leader_messages.contains_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
):
|
||||
leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
|
||||
msg = router2_messages.next_coap_message("0.02")
|
||||
@@ -133,8 +133,12 @@ class Cert_5_1_03_RouterAddressReallocation(unittest.TestCase):
|
||||
|
||||
msg = leader_messages.next_coap_message("2.04")
|
||||
|
||||
elif router1_messages.contains_mle_message(mle.CommandType.CHILD_ID_RESPONSE):
|
||||
router1_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
elif router1_messages.contains_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
):
|
||||
router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
|
||||
msg = router2_messages.next_coap_message("0.02")
|
||||
msg.assertCoapMessageRequestUriPath("/a/as")
|
||||
@@ -149,7 +153,9 @@ class Cert_5_1_03_RouterAddressReallocation(unittest.TestCase):
|
||||
# 5 - Router1
|
||||
# Router1 make two attempts to reconnect to its current Partition.
|
||||
for _ in range(4):
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_REQUEST
|
||||
)
|
||||
msg.assertSentWithHopLimit(255)
|
||||
msg.assertSentToDestinationAddress("ff02::2")
|
||||
msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
@@ -175,7 +181,9 @@ class Cert_5_1_03_RouterAddressReallocation(unittest.TestCase):
|
||||
self.assertEqual(0, scan_mask_tlv.end_device)
|
||||
|
||||
# 7 - Router1
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[ROUTER2])
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -41,7 +40,6 @@ ROUTER2 = 3
|
||||
|
||||
|
||||
class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -70,9 +68,9 @@ class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -124,7 +122,9 @@ class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
|
||||
router2_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
|
||||
# Leader or Router1 can be parent of Router2
|
||||
if leader_messages.contains_mle_message(mle.CommandType.CHILD_ID_RESPONSE):
|
||||
if leader_messages.contains_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
):
|
||||
leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
|
||||
msg = router2_messages.next_coap_message("0.02")
|
||||
@@ -132,8 +132,12 @@ class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
|
||||
|
||||
msg = leader_messages.next_coap_message("2.04")
|
||||
|
||||
elif router1_messages.contains_mle_message(mle.CommandType.CHILD_ID_RESPONSE):
|
||||
router1_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
elif router1_messages.contains_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
):
|
||||
router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
|
||||
msg = router2_messages.next_coap_message("0.02")
|
||||
msg.assertCoapMessageRequestUriPath("/a/as")
|
||||
@@ -148,7 +152,9 @@ class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
|
||||
# 5 - Router1
|
||||
# Router1 make two attempts to reconnect to its current Partition.
|
||||
for _ in range(4):
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_REQUEST
|
||||
)
|
||||
msg.assertSentWithHopLimit(255)
|
||||
msg.assertSentToDestinationAddress("ff02::2")
|
||||
msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
@@ -178,7 +184,9 @@ class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
|
||||
router2_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
|
||||
# 9 - Router1
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[ROUTER2])
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
@@ -190,7 +198,9 @@ class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
|
||||
msg.assertMleMessageContainsTlv(mle.Connectivity)
|
||||
msg.assertMleMessageContainsTlv(mle.Version)
|
||||
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[ROUTER2])
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -40,7 +39,6 @@ ROUTER1 = 2
|
||||
|
||||
|
||||
class Cert_5_1_05_RouterAddressTimeout(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -63,9 +61,9 @@ class Cert_5_1_05_RouterAddressTimeout(unittest.TestCase):
|
||||
self.nodes[ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
|
||||
@@ -27,14 +27,12 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import command
|
||||
from command import CheckType
|
||||
import config
|
||||
import mle
|
||||
import network_layer
|
||||
import node
|
||||
|
||||
LEADER = 1
|
||||
@@ -42,7 +40,6 @@ ROUTER1 = 2
|
||||
|
||||
|
||||
class Cert_5_1_06_RemoveRouterId(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -62,9 +59,9 @@ class Cert_5_1_06_RemoveRouterId(unittest.TestCase):
|
||||
self.nodes[ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -107,10 +104,17 @@ class Cert_5_1_06_RemoveRouterId(unittest.TestCase):
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
|
||||
command.check_parent_request(msg, is_first_request=True)
|
||||
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST, sent_to_node=self.nodes[LEADER])
|
||||
command.check_child_id_request(msg, tlv_request=CheckType.CONTAIN,
|
||||
mle_frame_counter=CheckType.OPTIONAL, address_registration=CheckType.NOT_CONTAIN,
|
||||
active_timestamp=CheckType.OPTIONAL, pending_timestamp=CheckType.OPTIONAL)
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST, sent_to_node=self.nodes[LEADER]
|
||||
)
|
||||
command.check_child_id_request(
|
||||
msg,
|
||||
tlv_request=CheckType.CONTAIN,
|
||||
mle_frame_counter=CheckType.OPTIONAL,
|
||||
address_registration=CheckType.NOT_CONTAIN,
|
||||
active_timestamp=CheckType.OPTIONAL,
|
||||
pending_timestamp=CheckType.OPTIONAL,
|
||||
)
|
||||
|
||||
msg = router1_messages.next_coap_message(code="0.02")
|
||||
command.check_address_solicit(msg, was_router=True)
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -37,6 +36,7 @@ LEADER = 1
|
||||
ROUTER = 2
|
||||
SED1 = 7
|
||||
|
||||
|
||||
class Cert_5_1_07_MaxChildCount(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
@@ -69,9 +69,9 @@ class Cert_5_1_07_MaxChildCount(unittest.TestCase):
|
||||
self.nodes[i].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -101,5 +101,6 @@ class Cert_5_1_07_MaxChildCount(unittest.TestCase):
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr, size=106))
|
||||
break
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -42,7 +41,6 @@ ROUTER4 = 5
|
||||
|
||||
|
||||
class Cert_5_1_08_RouterAttachConnectivity(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -87,9 +85,9 @@ class Cert_5_1_08_RouterAttachConnectivity(unittest.TestCase):
|
||||
self.nodes[ROUTER4].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -137,14 +135,20 @@ class Cert_5_1_08_RouterAttachConnectivity(unittest.TestCase):
|
||||
self.assertEqual(0, scan_mask_tlv.end_device)
|
||||
|
||||
# 3 - Router2, Router3
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[ROUTER4])
|
||||
|
||||
msg = router3_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg = router3_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[ROUTER4])
|
||||
|
||||
# 4 - Router4
|
||||
msg = router4_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg = router4_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[ROUTER3])
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -42,7 +41,6 @@ ROUTER2 = 5
|
||||
|
||||
|
||||
class Cert_5_1_09_REEDAttachConnectivity(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -87,9 +85,9 @@ class Cert_5_1_09_REEDAttachConnectivity(unittest.TestCase):
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -156,10 +154,15 @@ class Cert_5_1_09_REEDAttachConnectivity(unittest.TestCase):
|
||||
msg = reed1_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
connectivity_tlv_reed1 = msg.get_mle_message_tlv(mle.Connectivity)
|
||||
|
||||
self.assertGreater(connectivity_tlv_reed1.link_quality_3, connectivity_tlv_reed0.link_quality_3)
|
||||
self.assertGreater(
|
||||
connectivity_tlv_reed1.link_quality_3,
|
||||
connectivity_tlv_reed0.link_quality_3,
|
||||
)
|
||||
|
||||
# 6 - Router2
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[REED1])
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -41,7 +40,6 @@ ROUTER3 = 4
|
||||
|
||||
|
||||
class Cert_5_1_10_RouterAttachLinkQuality(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -65,7 +63,9 @@ class Cert_5_1_10_RouterAttachLinkQuality(unittest.TestCase):
|
||||
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[ROUTER3].get_addr64(), rssi=-85)
|
||||
self.nodes[ROUTER2].add_whitelist(
|
||||
self.nodes[ROUTER3].get_addr64(), rssi=-85
|
||||
)
|
||||
self.nodes[ROUTER2].enable_whitelist()
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
@@ -77,9 +77,9 @@ class Cert_5_1_10_RouterAttachLinkQuality(unittest.TestCase):
|
||||
self.nodes[ROUTER3].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -142,14 +142,20 @@ class Cert_5_1_10_RouterAttachLinkQuality(unittest.TestCase):
|
||||
msg.assertMleMessageContainsTlv(mle.Version)
|
||||
|
||||
# 4 - Router1, Router2
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[ROUTER3])
|
||||
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[ROUTER3])
|
||||
|
||||
# 5 - Router3
|
||||
msg = router3_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg = router3_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[ROUTER1])
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -41,7 +40,6 @@ ROUTER1 = 4
|
||||
|
||||
|
||||
class Cert_5_1_11_REEDAttachLinkQuality(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -65,7 +63,9 @@ class Cert_5_1_11_REEDAttachLinkQuality(unittest.TestCase):
|
||||
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[ROUTER1].get_addr64(), rssi=-85)
|
||||
self.nodes[ROUTER2].add_whitelist(
|
||||
self.nodes[ROUTER1].get_addr64(), rssi=-85
|
||||
)
|
||||
self.nodes[ROUTER2].enable_whitelist()
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
@@ -77,9 +77,9 @@ class Cert_5_1_11_REEDAttachLinkQuality(unittest.TestCase):
|
||||
self.nodes[ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -141,7 +141,9 @@ class Cert_5_1_11_REEDAttachLinkQuality(unittest.TestCase):
|
||||
self.assertEqual(0, scan_mask_tlv.end_device)
|
||||
|
||||
# 4 - Router2
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[ROUTER1])
|
||||
|
||||
# 5 - Router1
|
||||
@@ -158,7 +160,9 @@ class Cert_5_1_11_REEDAttachLinkQuality(unittest.TestCase):
|
||||
self.assertEqual(1, scan_mask_tlv.end_device)
|
||||
|
||||
# 6 - Router1
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST
|
||||
)
|
||||
msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
msg.assertMleMessageContainsTlv(mle.Response)
|
||||
@@ -172,5 +176,6 @@ class Cert_5_1_11_REEDAttachLinkQuality(unittest.TestCase):
|
||||
msg = reed_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ROUTER1])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -40,7 +39,6 @@ ROUTER2 = 3
|
||||
|
||||
|
||||
class Cert_5_1_12_NewRouterSync(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -67,17 +65,26 @@ class Cert_5_1_12_NewRouterSync(unittest.TestCase):
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def verify_step_4(self, router1_messages, router2_messages, req_receiver, accept_receiver):
|
||||
if router2_messages.contains_mle_message(mle.CommandType.LINK_REQUEST) and \
|
||||
(router1_messages.contains_mle_message(mle.CommandType.LINK_ACCEPT) or
|
||||
router1_messages.contains_mle_message(mle.CommandType.LINK_ACCEPT_AND_REQUEST)):
|
||||
def verify_step_4(
|
||||
self, router1_messages, router2_messages, req_receiver, accept_receiver
|
||||
):
|
||||
if router2_messages.contains_mle_message(
|
||||
mle.CommandType.LINK_REQUEST
|
||||
) and (
|
||||
router1_messages.contains_mle_message(mle.CommandType.LINK_ACCEPT)
|
||||
or router1_messages.contains_mle_message(
|
||||
mle.CommandType.LINK_ACCEPT_AND_REQUEST
|
||||
)
|
||||
):
|
||||
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.LINK_REQUEST)
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.LINK_REQUEST
|
||||
)
|
||||
|
||||
msg.assertSentToNode(self.nodes[req_receiver])
|
||||
msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
@@ -86,8 +93,10 @@ class Cert_5_1_12_NewRouterSync(unittest.TestCase):
|
||||
msg.assertMleMessageContainsTlv(mle.Version)
|
||||
msg.assertMleMessageContainsTlv(mle.TlvRequest)
|
||||
|
||||
msg = router1_messages.next_mle_message_of_one_of_command_types(mle.CommandType.LINK_ACCEPT_AND_REQUEST,
|
||||
mle.CommandType.LINK_ACCEPT)
|
||||
msg = router1_messages.next_mle_message_of_one_of_command_types(
|
||||
mle.CommandType.LINK_ACCEPT_AND_REQUEST,
|
||||
mle.CommandType.LINK_ACCEPT,
|
||||
)
|
||||
self.assertIsNotNone(msg)
|
||||
|
||||
msg.assertSentToNode(self.nodes[accept_receiver])
|
||||
@@ -122,7 +131,7 @@ class Cert_5_1_12_NewRouterSync(unittest.TestCase):
|
||||
|
||||
self.simulator.go(10)
|
||||
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
self.simulator.get_messages_sent_by(LEADER)
|
||||
router1_messages = self.simulator.get_messages_sent_by(ROUTER1)
|
||||
router2_messages = self.simulator.get_messages_sent_by(ROUTER2)
|
||||
|
||||
@@ -139,13 +148,20 @@ class Cert_5_1_12_NewRouterSync(unittest.TestCase):
|
||||
|
||||
self.simulator.go(35)
|
||||
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
self.simulator.get_messages_sent_by(LEADER)
|
||||
router1_messages = self.simulator.get_messages_sent_by(ROUTER1)
|
||||
router2_messages = self.simulator.get_messages_sent_by(ROUTER2)
|
||||
|
||||
# 4 - Router1, Router2
|
||||
self.assertTrue(self.verify_step_4(router1_messages, router2_messages, ROUTER1, ROUTER2) or
|
||||
self.verify_step_4(router2_messages, router1_messages, ROUTER2, ROUTER1))
|
||||
self.assertTrue(
|
||||
self.verify_step_4(
|
||||
router1_messages, router2_messages, ROUTER1, ROUTER2
|
||||
)
|
||||
or self.verify_step_4(
|
||||
router2_messages, router1_messages, ROUTER2, ROUTER1
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -39,7 +38,6 @@ ROUTER = 2
|
||||
|
||||
|
||||
class Cert_5_1_13_RouterReset(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
@@ -62,9 +60,9 @@ class Cert_5_1_13_RouterReset(unittest.TestCase):
|
||||
self.nodes[ROUTER].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -105,8 +103,10 @@ class Cert_5_1_13_RouterReset(unittest.TestCase):
|
||||
msg = leader_messages.next_coap_message("2.04")
|
||||
|
||||
router1_messages.next_mle_message(mle.CommandType.LINK_REQUEST)
|
||||
msg = leader_messages.next_mle_message_of_one_of_command_types(mle.CommandType.LINK_ACCEPT_AND_REQUEST,
|
||||
mle.CommandType.LINK_ACCEPT)
|
||||
msg = leader_messages.next_mle_message_of_one_of_command_types(
|
||||
mle.CommandType.LINK_ACCEPT_AND_REQUEST,
|
||||
mle.CommandType.LINK_ACCEPT,
|
||||
)
|
||||
self.assertIsNotNone(msg)
|
||||
|
||||
# 2 - Router1 / Leader
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import node
|
||||
@@ -35,14 +34,13 @@ import mle
|
||||
import config
|
||||
import command
|
||||
|
||||
import shutil
|
||||
import os
|
||||
|
||||
LEADER = 1
|
||||
DUT_ROUTER1 = 2
|
||||
REED1 = 3
|
||||
MED1 = 4
|
||||
|
||||
|
||||
class Cert_5_2_01_REEDAttach(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
@@ -77,9 +75,9 @@ class Cert_5_2_01_REEDAttach(unittest.TestCase):
|
||||
self.nodes[MED1].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -104,12 +102,16 @@ class Cert_5_2_01_REEDAttach(unittest.TestCase):
|
||||
|
||||
# 3 DUT_ROUTER1: Verify MLE Parent Response
|
||||
router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[REED1])
|
||||
command.check_parent_response(msg)
|
||||
|
||||
# 4 DUT_ROUTER1: Verify MLE Child ID Response
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg = router1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[REED1])
|
||||
command.check_child_id_response(msg)
|
||||
|
||||
@@ -123,26 +125,32 @@ class Cert_5_2_01_REEDAttach(unittest.TestCase):
|
||||
# 7 REED1: Verify sending Address Solicit Request to DUT_ROUTER1
|
||||
reed1_messages = self.simulator.get_messages_sent_by(REED1)
|
||||
msg = reed1_messages.next_coap_message('0.02')
|
||||
reed1_ipv6_address = msg.ipv6_packet.ipv6_header.source_address.compressed
|
||||
msg.assertSentToNode(self.nodes[DUT_ROUTER1]);
|
||||
reed1_ipv6_address = (
|
||||
msg.ipv6_packet.ipv6_header.source_address.compressed
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[DUT_ROUTER1])
|
||||
msg.assertCoapMessageRequestUriPath('/a/as')
|
||||
|
||||
# 8 DUT_ROUTER1: Verify forwarding REED1's Address Solicit Request to LEADER
|
||||
# 8 DUT_ROUTER1: Verify forwarding REED1's Address Solicit Request to
|
||||
# LEADER
|
||||
router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
|
||||
msg = router1_messages.next_coap_message('0.02')
|
||||
msg.assertSentToNode(self.nodes[LEADER]);
|
||||
msg.assertSentToNode(self.nodes[LEADER])
|
||||
msg.assertCoapMessageRequestUriPath('/a/as')
|
||||
|
||||
# DUT_ROUTER1: Verify forwarding LEADER's Address Solicit Response to REED1
|
||||
# DUT_ROUTER1: Verify forwarding LEADER's Address Solicit Response to
|
||||
# REED1
|
||||
msg = router1_messages.next_coap_message('2.04')
|
||||
msg.assertSentToDestinationAddress(reed1_ipv6_address)
|
||||
|
||||
self.simulator.go(config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
|
||||
# 9 LEADER: Verify connectivity by sending an ICMPv6 Echo Request to REED1
|
||||
# 9 LEADER: Verify connectivity by sending an ICMPv6 Echo Request to
|
||||
# REED1
|
||||
for addr in self.nodes[REED1].get_addrs():
|
||||
if addr[0:4] != 'fe80':
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import node
|
||||
@@ -40,13 +39,16 @@ ROUTER_1 = 2
|
||||
ROUTER_31 = 32
|
||||
ROUTER_32 = 33
|
||||
|
||||
|
||||
class Cert_5_2_3_LeaderReject2Hops(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
|
||||
self.nodes[DUT_LEADER] = node.Node(DUT_LEADER, simulator=self.simulator)
|
||||
self.nodes[DUT_LEADER] = node.Node(
|
||||
DUT_LEADER, simulator=self.simulator
|
||||
)
|
||||
self.nodes[DUT_LEADER].set_panid(0xface)
|
||||
self.nodes[DUT_LEADER].set_mode('rsdn')
|
||||
self.nodes[DUT_LEADER].enable_whitelist()
|
||||
@@ -75,9 +77,9 @@ class Cert_5_2_3_LeaderReject2Hops(unittest.TestCase):
|
||||
self.nodes[ROUTER_32].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -99,7 +101,8 @@ class Cert_5_2_3_LeaderReject2Hops(unittest.TestCase):
|
||||
self.assertEqual(self.nodes[ROUTER_31].get_state(), 'router')
|
||||
|
||||
# 3 - DUT_LEADER
|
||||
# This method flushes the message queue so calling this method again will return only the newly logged messages.
|
||||
# This method flushes the message queue so calling this method again
|
||||
# will return only the newly logged messages.
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.next_coap_message('2.04')
|
||||
msg.assertCoapMessageContainsTlv(network_layer.Status)
|
||||
@@ -123,7 +126,10 @@ class Cert_5_2_3_LeaderReject2Hops(unittest.TestCase):
|
||||
msg.assertCoapMessageContainsTlv(network_layer.Status)
|
||||
|
||||
status_tlv = msg.get_coap_message_tlv(network_layer.Status)
|
||||
self.assertEqual(network_layer.StatusValues.NO_ADDRESS_AVAILABLE, status_tlv.status)
|
||||
self.assertEqual(
|
||||
network_layer.StatusValues.NO_ADDRESS_AVAILABLE, status_tlv.status
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import node
|
||||
@@ -45,6 +44,7 @@ REED_ADVERTISEMENT_INTERVAL = 570
|
||||
REED_ADVERTISEMENT_MAX_JITTER = 60
|
||||
ROUTER_SELECTION_JITTER = 1
|
||||
|
||||
|
||||
class Cert_5_2_4_REEDUpgrade(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
@@ -79,9 +79,9 @@ class Cert_5_2_4_REEDUpgrade(unittest.TestCase):
|
||||
self.nodes[ED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -115,7 +115,9 @@ class Cert_5_2_4_REEDUpgrade(unittest.TestCase):
|
||||
msg.assertMleMessageDoesNotContainTlv(mle.Route64)
|
||||
|
||||
# 4 Wait for DUT_REED to send the second packet.
|
||||
self.simulator.go(REED_ADVERTISEMENT_INTERVAL + REED_ADVERTISEMENT_MAX_JITTER)
|
||||
self.simulator.go(
|
||||
REED_ADVERTISEMENT_INTERVAL + REED_ADVERTISEMENT_MAX_JITTER
|
||||
)
|
||||
|
||||
# 5 DUT_REED: Verify the second MLE Advertisement.
|
||||
reed_messages = self.simulator.get_messages_sent_by(DUT_REED)
|
||||
@@ -160,14 +162,19 @@ class Cert_5_2_4_REEDUpgrade(unittest.TestCase):
|
||||
msg.assertSentToNode(self.nodes[ED])
|
||||
msg.assertMleMessageContainsTlv(mle.Address16)
|
||||
|
||||
# 11 Verify connectivity by sending an ICMPv6 Echo Request to the Leader.
|
||||
# 11 Verify connectivity by sending an ICMPv6 Echo Request to the
|
||||
# Leader.
|
||||
mleid = None
|
||||
for addr in self.nodes[LEADER].get_addrs():
|
||||
if addr.find(MESH_LOCAL_PREFIX) != -1 and addr.find(ROUTING_LACATOR) == -1:
|
||||
if (
|
||||
addr.find(MESH_LOCAL_PREFIX) != -1
|
||||
and addr.find(ROUTING_LACATOR) == -1
|
||||
):
|
||||
mleid = addr
|
||||
break
|
||||
|
||||
self.assertTrue(self.nodes[ED].ping(mleid))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -40,6 +40,7 @@ ED1 = 17
|
||||
DUT_REED = 18
|
||||
ROUTER_SELECTION_JITTER = 1
|
||||
|
||||
|
||||
class Cert_5_2_5_AddressQuery(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
@@ -74,9 +75,9 @@ class Cert_5_2_5_AddressQuery(unittest.TestCase):
|
||||
self.nodes[DUT_REED].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -123,8 +124,11 @@ class Cert_5_2_5_AddressQuery(unittest.TestCase):
|
||||
self.nodes[DUT_REED].add_whitelist(self.nodes[BR].get_addr64())
|
||||
self.nodes[BR].add_whitelist(self.nodes[DUT_REED].get_addr64())
|
||||
|
||||
# 6. Verify DUT_REED would send Address Notification when ping to its ML-EID.
|
||||
mleid = self.nodes[DUT_REED].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
|
||||
# 6. Verify DUT_REED would send Address Notification when ping to its
|
||||
# ML-EID.
|
||||
mleid = self.nodes[DUT_REED].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID
|
||||
)
|
||||
self.assertTrue(self.nodes[ED1].ping(mleid))
|
||||
|
||||
# Wait for sniffer collecting packets
|
||||
@@ -132,12 +136,17 @@ class Cert_5_2_5_AddressQuery(unittest.TestCase):
|
||||
|
||||
reed_messages = self.simulator.get_messages_sent_by(DUT_REED)
|
||||
msg = reed_messages.next_coap_message('0.02', '/a/an')
|
||||
command.check_address_notification(msg, self.nodes[DUT_REED], self.nodes[LEADER])
|
||||
command.check_address_notification(
|
||||
msg, self.nodes[DUT_REED], self.nodes[LEADER]
|
||||
)
|
||||
|
||||
# 7 & 8. Verify DUT_REED would send Address Notification when ping to its 2001::EID and 2002::EID.
|
||||
# 7 & 8. Verify DUT_REED would send Address Notification when ping to
|
||||
# its 2001::EID and 2002::EID.
|
||||
flag2001 = 0
|
||||
flag2002 = 0
|
||||
for global_address in self.nodes[DUT_REED].get_ip6_address(config.ADDRESS_TYPE.GLOBAL):
|
||||
for global_address in self.nodes[DUT_REED].get_ip6_address(
|
||||
config.ADDRESS_TYPE.GLOBAL
|
||||
):
|
||||
if global_address[0:4] == '2001':
|
||||
flag2001 += 1
|
||||
elif global_address[0:4] == '2002':
|
||||
@@ -151,10 +160,13 @@ class Cert_5_2_5_AddressQuery(unittest.TestCase):
|
||||
|
||||
reed_messages = self.simulator.get_messages_sent_by(DUT_REED)
|
||||
msg = reed_messages.next_coap_message('0.02', '/a/an')
|
||||
command.check_address_notification(msg, self.nodes[DUT_REED], self.nodes[LEADER])
|
||||
command.check_address_notification(
|
||||
msg, self.nodes[DUT_REED], self.nodes[LEADER]
|
||||
)
|
||||
|
||||
assert flag2001 == 1, "Error: Expecting address 2001::EID not appear."
|
||||
assert flag2002 == 1, "Error: Expecting address 2002::EID not appear."
|
||||
|
||||
assert flag2001 == 1 , "Error: Expecting address 2001::EID not appear."
|
||||
assert flag2002 == 1 , "Error: Expecting address 2002::EID not appear."
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import node
|
||||
@@ -40,6 +39,7 @@ DUT_ROUTER1 = 2
|
||||
ROUTER2 = 3
|
||||
ROUTER24 = 24
|
||||
|
||||
|
||||
class Cert_5_2_06_RouterDowngrade(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
@@ -55,9 +55,9 @@ class Cert_5_2_06_RouterDowngrade(unittest.TestCase):
|
||||
self.nodes[i].set_router_downgrade_threshold(32)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -71,12 +71,14 @@ class Cert_5_2_06_RouterDowngrade(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[i].get_state(), 'router')
|
||||
|
||||
# This method flushes the message queue so calling this method again will return only the newly logged messages.
|
||||
# This method flushes the message queue so calling this method again
|
||||
# will return only the newly logged messages.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
|
||||
|
||||
# 2 ROUTER24: Attach to network.
|
||||
# All reference testbed devices have been configured with downgrade threshold as 32 except DUT_ROUTER1,
|
||||
# so we don't need to ensure ROUTER24 has a better link quality on posix.
|
||||
# so we don't need to ensure ROUTER24 has a better link quality on
|
||||
# posix.
|
||||
self.nodes[ROUTER24].start()
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[ROUTER24].get_state(), 'router')
|
||||
@@ -90,13 +92,17 @@ class Cert_5_2_06_RouterDowngrade(unittest.TestCase):
|
||||
dut_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
|
||||
dut_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
|
||||
|
||||
# Verify it sent an Address Release Message to the Leader when it attached as a child.
|
||||
# Verify it sent an Address Release Message to the Leader when it
|
||||
# attached as a child.
|
||||
msg = dut_messages.next_coap_message('0.02')
|
||||
command.check_address_release(msg, self.nodes[LEADER])
|
||||
|
||||
# 4 & 5
|
||||
router1_rloc = self.nodes[DUT_ROUTER1].get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
router1_rloc = self.nodes[DUT_ROUTER1].get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC
|
||||
)
|
||||
self.assertTrue(self.nodes[LEADER].ping(router1_rloc))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
import ipv6
|
||||
|
||||
@@ -42,6 +41,7 @@ DUT_REED = 17
|
||||
|
||||
MLE_MIN_LINKS = 3
|
||||
|
||||
|
||||
class Cert_5_2_7_REEDSynchronization(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
@@ -54,9 +54,9 @@ class Cert_5_2_7_REEDSynchronization(unittest.TestCase):
|
||||
self.nodes[i].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -74,7 +74,9 @@ class Cert_5_2_7_REEDSynchronization(unittest.TestCase):
|
||||
|
||||
# 2. DUT_REED: Attach to network. Verify it didn't send an Address Solicit Request.
|
||||
# Avoid DUT_REED attach to DUT_ROUTER1.
|
||||
self.nodes[DUT_REED].add_whitelist(self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_1'])
|
||||
self.nodes[DUT_REED].add_whitelist(
|
||||
self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_1']
|
||||
)
|
||||
|
||||
self.nodes[DUT_REED].start()
|
||||
self.simulator.go(config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
@@ -83,33 +85,49 @@ class Cert_5_2_7_REEDSynchronization(unittest.TestCase):
|
||||
# The DUT_REED must not send a coap message here.
|
||||
reed_messages = self.simulator.get_messages_sent_by(DUT_REED)
|
||||
msg = reed_messages.does_not_contain_coap_message()
|
||||
assert msg is True, "Error: The DUT_REED sent an Address Solicit Request"
|
||||
assert (
|
||||
msg is True
|
||||
), "Error: The DUT_REED sent an Address Solicit Request"
|
||||
|
||||
# 3. DUT_REED: Verify sent a Link Request to at least 3 neighboring Routers.
|
||||
# 3. DUT_REED: Verify sent a Link Request to at least 3 neighboring
|
||||
# Routers.
|
||||
for i in range(0, MLE_MIN_LINKS):
|
||||
msg = reed_messages.next_mle_message(mle.CommandType.LINK_REQUEST)
|
||||
command.check_link_request(msg, source_address = command.CheckType.CONTAIN, \
|
||||
leader_data = command.CheckType.CONTAIN)
|
||||
command.check_link_request(
|
||||
msg,
|
||||
source_address=command.CheckType.CONTAIN,
|
||||
leader_data=command.CheckType.CONTAIN,
|
||||
)
|
||||
|
||||
# 4. DUT_REED: Verify at least 3 Link Accept messages sent to DUT_REED.
|
||||
self.simulator.go(config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
|
||||
link_accept_count = 0
|
||||
destination_link_local = self.nodes[DUT_REED].get_ip6_address(config.ADDRESS_TYPE.LINK_LOCAL)
|
||||
destination_link_local = self.nodes[DUT_REED].get_ip6_address(
|
||||
config.ADDRESS_TYPE.LINK_LOCAL
|
||||
)
|
||||
|
||||
for i in range(1, DUT_REED):
|
||||
dut_messages = self.simulator.get_messages_sent_by(i)
|
||||
|
||||
while True:
|
||||
msg = dut_messages.next_mle_message(mle.CommandType.LINK_ACCEPT, False)
|
||||
if msg == None:
|
||||
msg = dut_messages.next_mle_message(
|
||||
mle.CommandType.LINK_ACCEPT, False
|
||||
)
|
||||
if msg is None:
|
||||
break
|
||||
if ipv6.ip_address(destination_link_local) == msg.ipv6_packet.ipv6_header.destination_address:
|
||||
if (
|
||||
ipv6.ip_address(destination_link_local)
|
||||
== msg.ipv6_packet.ipv6_header.destination_address
|
||||
):
|
||||
command.check_link_accept(msg, self.nodes[DUT_REED])
|
||||
link_accept_count += 1
|
||||
break
|
||||
|
||||
assert (link_accept_count >= MLE_MIN_LINKS) is True, "Error: too few Link Accept sent to DUT_REED"
|
||||
assert (
|
||||
link_accept_count >= MLE_MIN_LINKS
|
||||
) is True, "Error: too few Link Accept sent to DUT_REED"
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,22 +27,21 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import node
|
||||
import config
|
||||
import command
|
||||
|
||||
LEADER = 1
|
||||
DUT_ROUTER1 = 2
|
||||
|
||||
|
||||
class Cert_5_3_1_LinkLocal(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -53,9 +52,9 @@ class Cert_5_3_1_LinkLocal(unittest.TestCase):
|
||||
self.nodes[DUT_ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -69,7 +68,9 @@ class Cert_5_3_1_LinkLocal(unittest.TestCase):
|
||||
self.assertEqual(self.nodes[DUT_ROUTER1].get_state(), 'router')
|
||||
|
||||
# 2 & 3
|
||||
link_local = self.nodes[DUT_ROUTER1].get_ip6_address(config.ADDRESS_TYPE.LINK_LOCAL)
|
||||
link_local = self.nodes[DUT_ROUTER1].get_ip6_address(
|
||||
config.ADDRESS_TYPE.LINK_LOCAL
|
||||
)
|
||||
self.assertTrue(self.nodes[LEADER].ping(link_local, size=256))
|
||||
self.assertTrue(self.nodes[LEADER].ping(link_local))
|
||||
|
||||
@@ -82,7 +83,12 @@ class Cert_5_3_1_LinkLocal(unittest.TestCase):
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff02::2'))
|
||||
|
||||
# 8
|
||||
self.assertTrue(self.nodes[LEADER].ping(config.LINK_LOCAL_All_THREAD_NODES_MULTICAST_ADDRESS))
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping(
|
||||
config.LINK_LOCAL_All_THREAD_NODES_MULTICAST_ADDRESS
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,24 +27,23 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import node
|
||||
import config
|
||||
import command
|
||||
|
||||
LEADER = 1
|
||||
ROUTER1 = 2
|
||||
DUT_ROUTER2 = 3
|
||||
SED1 = 4
|
||||
|
||||
|
||||
class Cert_5_3_2_RealmLocal(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i == SED1), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -73,9 +72,9 @@ class Cert_5_3_2_RealmLocal(unittest.TestCase):
|
||||
self.nodes[SED1].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -97,12 +96,16 @@ class Cert_5_3_2_RealmLocal(unittest.TestCase):
|
||||
self.assertEqual(self.nodes[SED1].get_state(), 'child')
|
||||
|
||||
# 2 & 3
|
||||
mleid = self.nodes[DUT_ROUTER2].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
|
||||
mleid = self.nodes[DUT_ROUTER2].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID
|
||||
)
|
||||
self.assertTrue(self.nodes[LEADER].ping(mleid, size=256))
|
||||
self.assertTrue(self.nodes[LEADER].ping(mleid))
|
||||
|
||||
# 4 & 5
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff03::1', num_responses=2, size=256))
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping('ff03::1', num_responses=2, size=256)
|
||||
)
|
||||
sed_messages = self.simulator.get_messages_sent_by(SED1)
|
||||
self.assertFalse(sed_messages.contains_icmp_message())
|
||||
|
||||
@@ -111,7 +114,9 @@ class Cert_5_3_2_RealmLocal(unittest.TestCase):
|
||||
self.assertFalse(sed_messages.contains_icmp_message())
|
||||
|
||||
# 6 & 7
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff03::2', num_responses=2, size=256))
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping('ff03::2', num_responses=2, size=256)
|
||||
)
|
||||
sed_messages = self.simulator.get_messages_sent_by(SED1)
|
||||
self.assertFalse(sed_messages.contains_icmp_message())
|
||||
|
||||
@@ -120,15 +125,27 @@ class Cert_5_3_2_RealmLocal(unittest.TestCase):
|
||||
self.assertFalse(sed_messages.contains_icmp_message())
|
||||
|
||||
# 8
|
||||
self.assertTrue(self.nodes[LEADER].ping(config.REALM_LOCAL_All_THREAD_NODES_MULTICAST_ADDRESS, num_responses=3, size=256))
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping(
|
||||
config.REALM_LOCAL_All_THREAD_NODES_MULTICAST_ADDRESS,
|
||||
num_responses=3,
|
||||
size=256,
|
||||
)
|
||||
)
|
||||
self.simulator.go(2)
|
||||
sed_messages = self.simulator.get_messages_sent_by(SED1)
|
||||
self.assertTrue(sed_messages.contains_icmp_message())
|
||||
|
||||
self.assertTrue(self.nodes[LEADER].ping(config.REALM_LOCAL_All_THREAD_NODES_MULTICAST_ADDRESS, num_responses=3))
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping(
|
||||
config.REALM_LOCAL_All_THREAD_NODES_MULTICAST_ADDRESS,
|
||||
num_responses=3,
|
||||
)
|
||||
)
|
||||
self.simulator.go(2)
|
||||
sed_messages = self.simulator.get_messages_sent_by(SED1)
|
||||
self.assertTrue(sed_messages.contains_icmp_message())
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import node
|
||||
@@ -41,12 +40,13 @@ ROUTER3 = 4
|
||||
MED1 = 5
|
||||
MED1_TIMEOUT = 3
|
||||
|
||||
|
||||
class Cert_5_3_3_AddressQuery(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,6):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, (i == MED1), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid()
|
||||
@@ -84,9 +84,9 @@ class Cert_5_3_3_AddressQuery(unittest.TestCase):
|
||||
self.nodes[MED1].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -106,39 +106,54 @@ class Cert_5_3_3_AddressQuery(unittest.TestCase):
|
||||
self.assertEqual(self.nodes[ROUTER3].get_state(), 'router')
|
||||
self.assertEqual(self.nodes[MED1].get_state(), 'child')
|
||||
|
||||
|
||||
# 2
|
||||
# Flush the message queue to avoid possible impact on follow-up verification.
|
||||
# Flush the message queue to avoid possible impact on follow-up
|
||||
# verification.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
|
||||
router3_mleid = self.nodes[ROUTER3].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
|
||||
router3_mleid = self.nodes[ROUTER3].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID
|
||||
)
|
||||
self.assertTrue(self.nodes[MED1].ping(router3_mleid))
|
||||
|
||||
# Verify DUT_ROUTER2 sent an Address Query Request to the Realm local address.
|
||||
# Verify DUT_ROUTER2 sent an Address Query Request to the Realm local
|
||||
# address.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
msg = dut_messages.next_coap_message('0.02', '/a/aq')
|
||||
command.check_address_query(msg, self.nodes[DUT_ROUTER2], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command.check_address_query(
|
||||
msg,
|
||||
self.nodes[DUT_ROUTER2],
|
||||
config.REALM_LOCAL_ALL_ROUTERS_ADDRESS,
|
||||
)
|
||||
|
||||
# 3
|
||||
# Wait the finish of address resolution traffic triggerred by previous ping.
|
||||
# Wait the finish of address resolution traffic triggerred by previous
|
||||
# ping.
|
||||
self.simulator.go(5)
|
||||
|
||||
# Flush the message queue to avoid possible impact on follow-up verification.
|
||||
# Flush the message queue to avoid possible impact on follow-up
|
||||
# verification.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
|
||||
med1_mleid = self.nodes[MED1].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
|
||||
med1_mleid = self.nodes[MED1].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID
|
||||
)
|
||||
self.assertTrue(self.nodes[ROUTER1].ping(med1_mleid))
|
||||
|
||||
# Verify DUT_ROUTER2 responded with an Address Notification.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
msg = dut_messages.next_coap_message('0.02', '/a/an')
|
||||
command.check_address_notification(msg, self.nodes[DUT_ROUTER2], self.nodes[ROUTER1])
|
||||
command.check_address_notification(
|
||||
msg, self.nodes[DUT_ROUTER2], self.nodes[ROUTER1]
|
||||
)
|
||||
|
||||
# 4
|
||||
# Wait the finish of address resolution traffic triggerred by previous ping.
|
||||
# Wait the finish of address resolution traffic triggerred by previous
|
||||
# ping.
|
||||
self.simulator.go(5)
|
||||
|
||||
# Flush the message queue to avoid possible impact on follow-up verification.
|
||||
# Flush the message queue to avoid possible impact on follow-up
|
||||
# verification.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
|
||||
self.assertTrue(self.nodes[MED1].ping(router3_mleid))
|
||||
@@ -152,25 +167,33 @@ class Cert_5_3_3_AddressQuery(unittest.TestCase):
|
||||
# Power off ROUTER3 and wait for leader to expire its Router ID.
|
||||
# In this topology, ROUTER3 has two neighbors (Leader and DUT_ROUTER2),
|
||||
# so the wait time is (MAX_NEIGHBOR_AGE (100s) + worst propagation time (32s * 15) for bad routing +\
|
||||
# INFINITE_COST_TIMEOUT (90s) + transmission time + extra redundancy), totally ~700s.
|
||||
# INFINITE_COST_TIMEOUT (90s) + transmission time + extra redundancy),
|
||||
# totally ~700s.
|
||||
self.nodes[ROUTER3].stop()
|
||||
self.simulator.go(700)
|
||||
|
||||
# Flush the message queue to avoid possible impact on follow-up verification.
|
||||
# Flush the message queue to avoid possible impact on follow-up
|
||||
# verification.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
|
||||
self.assertFalse(self.nodes[MED1].ping(router3_mleid))
|
||||
|
||||
# Verify DUT_ROUTER2 sent an Address Query Request to the Realm local address.
|
||||
# Verify DUT_ROUTER2 sent an Address Query Request to the Realm local
|
||||
# address.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
msg = dut_messages.next_coap_message('0.02', '/a/aq')
|
||||
command.check_address_query(msg, self.nodes[DUT_ROUTER2], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command.check_address_query(
|
||||
msg,
|
||||
self.nodes[DUT_ROUTER2],
|
||||
config.REALM_LOCAL_ALL_ROUTERS_ADDRESS,
|
||||
)
|
||||
|
||||
# 6
|
||||
self.nodes[MED1].stop()
|
||||
self.simulator.go(MED1_TIMEOUT)
|
||||
|
||||
# Flush the message queue to avoid possible impact on follow-up verification.
|
||||
# Flush the message queue to avoid possible impact on follow-up
|
||||
# verification.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
|
||||
self.assertFalse(self.nodes[ROUTER1].ping(med1_mleid))
|
||||
@@ -181,5 +204,6 @@ class Cert_5_3_3_AddressQuery(unittest.TestCase):
|
||||
msg = dut_messages.next_coap_message('0.02', '/a/an', False)
|
||||
assert msg is None, "The Address Notification is not expected."
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import node
|
||||
@@ -44,12 +43,13 @@ ED4 = 7
|
||||
|
||||
MTDS = [SED1, ED1, ED2, ED3, ED4]
|
||||
|
||||
|
||||
class Cert_5_3_4_AddressMapCache(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,8):
|
||||
for i in range(1, 8):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -72,7 +72,8 @@ class Cert_5_3_4_AddressMapCache(unittest.TestCase):
|
||||
self.nodes[SED1].set_mode('s')
|
||||
self.nodes[SED1].add_whitelist(self.nodes[DUT_ROUTER1].get_addr64())
|
||||
|
||||
# Set the SED1's timeout in order to receive the icmp reply when keep alive with DUT_ROUTER.
|
||||
# Set the SED1's timeout in order to receive the icmp reply when keep
|
||||
# alive with DUT_ROUTER.
|
||||
self.nodes[SED1].set_timeout(5)
|
||||
self.nodes[SED1].enable_whitelist()
|
||||
|
||||
@@ -83,9 +84,9 @@ class Cert_5_3_4_AddressMapCache(unittest.TestCase):
|
||||
self.nodes[ED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -104,33 +105,47 @@ class Cert_5_3_4_AddressMapCache(unittest.TestCase):
|
||||
for i in MTDS:
|
||||
self.assertEqual(self.nodes[i].get_state(), 'child')
|
||||
|
||||
# This method flushes the message queue so calling this method again will return only the newly logged messages.
|
||||
# This method flushes the message queue so calling this method again
|
||||
# will return only the newly logged messages.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
|
||||
|
||||
# 2
|
||||
for ED in [ED1, ED2, ED3, ED4]:
|
||||
ed_mleid = self.nodes[ED].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
|
||||
ed_mleid = self.nodes[ED].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID
|
||||
)
|
||||
self.assertTrue(self.nodes[SED1].ping(ed_mleid))
|
||||
self.simulator.go(5)
|
||||
|
||||
# Verify DUT_ROUTER1 generated an Address Query Request to find each node's RLOC.
|
||||
# Verify DUT_ROUTER1 generated an Address Query Request to find
|
||||
# each node's RLOC.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
|
||||
msg = dut_messages.next_coap_message('0.02', '/a/aq')
|
||||
command.check_address_query(msg, self.nodes[DUT_ROUTER1], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command.check_address_query(
|
||||
msg,
|
||||
self.nodes[DUT_ROUTER1],
|
||||
config.REALM_LOCAL_ALL_ROUTERS_ADDRESS,
|
||||
)
|
||||
|
||||
# 3 & 4
|
||||
# This method flushes the message queue so calling this method again will return only the newly logged messages.
|
||||
# This method flushes the message queue so calling this method again
|
||||
# will return only the newly logged messages.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
|
||||
|
||||
for ED in [ED1, ED2, ED3, ED4]:
|
||||
ed_mleid = self.nodes[ED].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
|
||||
ed_mleid = self.nodes[ED].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID
|
||||
)
|
||||
self.assertTrue(self.nodes[SED1].ping(ed_mleid))
|
||||
self.simulator.go(5)
|
||||
|
||||
# Verify DUT_ROUTER1 didn't generate an Address Query Request.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
|
||||
msg = dut_messages.next_coap_message('0.02', '/a/aq', False)
|
||||
assert msg is None, "Error: The DUT sent an unexpected Address Query Request"
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT sent an unexpected Address Query Request"
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import node
|
||||
@@ -39,12 +38,13 @@ DUT_ROUTER1 = 2
|
||||
ROUTER2 = 3
|
||||
ROUTER3 = 4
|
||||
|
||||
|
||||
class Cert_5_3_5_RoutingLinkQuality(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -75,9 +75,9 @@ class Cert_5_3_5_RoutingLinkQuality(unittest.TestCase):
|
||||
self.nodes[ROUTER3].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -94,7 +94,9 @@ class Cert_5_3_5_RoutingLinkQuality(unittest.TestCase):
|
||||
self.assertEqual(self.nodes[router].get_state(), 'router')
|
||||
|
||||
# 2 & 3
|
||||
leader_rloc = self.nodes[LEADER].get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
leader_rloc = self.nodes[LEADER].get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC
|
||||
)
|
||||
|
||||
# Verify the ICMPv6 Echo Request took the least cost path.
|
||||
self.assertTrue(self.nodes[ROUTER3].ping(leader_rloc))
|
||||
@@ -102,35 +104,52 @@ class Cert_5_3_5_RoutingLinkQuality(unittest.TestCase):
|
||||
command.check_icmp_path(self.simulator, path, self.nodes)
|
||||
|
||||
# 4 & 5
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_1'])
|
||||
self.nodes[DUT_ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64(), config.RSSI['LINK_QULITY_1'])
|
||||
self.nodes[LEADER].add_whitelist(
|
||||
self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_1']
|
||||
)
|
||||
self.nodes[DUT_ROUTER1].add_whitelist(
|
||||
self.nodes[LEADER].get_addr64(), config.RSSI['LINK_QULITY_1']
|
||||
)
|
||||
self.simulator.go(3 * config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
|
||||
# Verify the ICMPv6 Echo Request took the longer path because it cost less.
|
||||
# Verify the ICMPv6 Echo Request took the longer path because it cost
|
||||
# less.
|
||||
self.assertTrue(self.nodes[ROUTER3].ping(leader_rloc))
|
||||
path = [ROUTER3, DUT_ROUTER1, ROUTER2, LEADER]
|
||||
command.check_icmp_path(self.simulator, path, self.nodes)
|
||||
|
||||
# 6 & 7
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_2'])
|
||||
self.nodes[DUT_ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64(), config.RSSI['LINK_QULITY_2'])
|
||||
self.nodes[LEADER].add_whitelist(
|
||||
self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_2']
|
||||
)
|
||||
self.nodes[DUT_ROUTER1].add_whitelist(
|
||||
self.nodes[LEADER].get_addr64(), config.RSSI['LINK_QULITY_2']
|
||||
)
|
||||
self.simulator.go(3 * config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
|
||||
# Verify the direct neighbor would be prioritized when there are two paths with the same cost.
|
||||
# Verify the direct neighbor would be prioritized when there are two
|
||||
# paths with the same cost.
|
||||
self.assertTrue(self.nodes[ROUTER3].ping(leader_rloc))
|
||||
path = [ROUTER3, DUT_ROUTER1, LEADER]
|
||||
command.check_icmp_path(self.simulator, path, self.nodes)
|
||||
|
||||
# 8 & 9
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_0'])
|
||||
self.nodes[DUT_ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64(), config.RSSI['LINK_QULITY_0'])
|
||||
self.nodes[LEADER].add_whitelist(
|
||||
self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_0']
|
||||
)
|
||||
self.nodes[DUT_ROUTER1].add_whitelist(
|
||||
self.nodes[LEADER].get_addr64(), config.RSSI['LINK_QULITY_0']
|
||||
)
|
||||
self.simulator.go(3 * config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
|
||||
# Verify the ICMPv6 Echo Request took the longer path.
|
||||
leader_rloc = self.nodes[LEADER].get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
leader_rloc = self.nodes[LEADER].get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC
|
||||
)
|
||||
self.assertTrue(self.nodes[ROUTER3].ping(leader_rloc))
|
||||
path = [ROUTER3, DUT_ROUTER1, ROUTER2, LEADER]
|
||||
command.check_icmp_path(self.simulator, path, self.nodes)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import node
|
||||
@@ -39,12 +38,13 @@ DUT_LEADER = 1
|
||||
ROUTER1 = 2
|
||||
ROUTER2 = 3
|
||||
|
||||
|
||||
class Cert_5_3_6_RouterIdMask(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,4):
|
||||
for i in range(1, 4):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[DUT_LEADER].set_panid(0xface)
|
||||
@@ -69,9 +69,9 @@ class Cert_5_3_6_RouterIdMask(unittest.TestCase):
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -89,7 +89,8 @@ class Cert_5_3_6_RouterIdMask(unittest.TestCase):
|
||||
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
|
||||
router2_id = self.nodes[ROUTER2].get_router_id()
|
||||
|
||||
# Wait DUT_LEADER to establish routing to ROUTER2 via ROUTER1's MLE advertisement.
|
||||
# Wait DUT_LEADER to establish routing to ROUTER2 via ROUTER1's MLE
|
||||
# advertisement.
|
||||
self.simulator.go(config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
|
||||
# 2
|
||||
@@ -97,18 +98,22 @@ class Cert_5_3_6_RouterIdMask(unittest.TestCase):
|
||||
self._setUpRouter2()
|
||||
|
||||
# 3 & 4
|
||||
# Flush the message queue to avoid possible impact on follow-up verification.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
# Flush the message queue to avoid possible impact on follow-up
|
||||
# verification.
|
||||
self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
|
||||
# Verify the cost from DUT_LEADER to ROUTER2 goes to infinity in 12 mins.
|
||||
# Verify the cost from DUT_LEADER to ROUTER2 goes to infinity in 12
|
||||
# mins.
|
||||
routing_cost = 1
|
||||
for i in range(0, 24):
|
||||
self.simulator.go(30)
|
||||
print("%ss" %((i + 1) * 30))
|
||||
print("%ss" % ((i + 1) * 30))
|
||||
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.last_mle_message(mle.CommandType.ADVERTISEMENT, False)
|
||||
if msg == None:
|
||||
msg = leader_messages.last_mle_message(
|
||||
mle.CommandType.ADVERTISEMENT, False
|
||||
)
|
||||
if msg is None:
|
||||
continue
|
||||
|
||||
self.assertTrue(command.check_id_set(msg, router2_id))
|
||||
@@ -118,14 +123,17 @@ class Cert_5_3_6_RouterIdMask(unittest.TestCase):
|
||||
break
|
||||
self.assertTrue(routing_cost == 0)
|
||||
|
||||
self.simulator.go(config.INFINITE_COST_TIMEOUT + config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
self.simulator.go(
|
||||
config.INFINITE_COST_TIMEOUT + config.MAX_ADVERTISEMENT_INTERVAL
|
||||
)
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.last_mle_message(mle.CommandType.ADVERTISEMENT)
|
||||
self.assertFalse(command.check_id_set(msg, router2_id))
|
||||
|
||||
# 5
|
||||
# Flush the message queue to avoid possible impact on follow-up verification.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
# Flush the message queue to avoid possible impact on follow-up
|
||||
# verification.
|
||||
self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
|
||||
self.nodes[ROUTER2].start()
|
||||
self.simulator.go(5)
|
||||
@@ -142,16 +150,21 @@ class Cert_5_3_6_RouterIdMask(unittest.TestCase):
|
||||
router1_id = self.nodes[ROUTER1].get_router_id()
|
||||
router2_id = self.nodes[ROUTER2].get_router_id()
|
||||
|
||||
self.simulator.go(config.MAX_NEIGHBOR_AGE + config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
self.simulator.go(
|
||||
config.MAX_NEIGHBOR_AGE + config.MAX_ADVERTISEMENT_INTERVAL
|
||||
)
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.last_mle_message(mle.CommandType.ADVERTISEMENT)
|
||||
self.assertEqual(command.get_routing_cost(msg, router1_id), 0)
|
||||
|
||||
self.simulator.go(config.INFINITE_COST_TIMEOUT + config.MAX_ADVERTISEMENT_INTERVAL)
|
||||
self.simulator.go(
|
||||
config.INFINITE_COST_TIMEOUT + config.MAX_ADVERTISEMENT_INTERVAL
|
||||
)
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.last_mle_message(mle.CommandType.ADVERTISEMENT)
|
||||
self.assertFalse(command.check_id_set(msg, router1_id))
|
||||
self.assertFalse(command.check_id_set(msg, router2_id))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -37,12 +36,13 @@ LEADER = 1
|
||||
ROUTER1 = 2
|
||||
ROUTER2 = 3
|
||||
|
||||
|
||||
class Cert_5_3_6_RouterIdMask(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,4):
|
||||
for i in range(1, 4):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -64,9 +64,9 @@ class Cert_5_3_6_RouterIdMask(unittest.TestCase):
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -87,5 +87,6 @@ class Cert_5_3_6_RouterIdMask(unittest.TestCase):
|
||||
|
||||
self.simulator.go(300)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import node
|
||||
@@ -44,12 +43,13 @@ MED3 = 6
|
||||
|
||||
MTDS = [MED1, SED1, MED3]
|
||||
|
||||
|
||||
class Cert_5_3_7_DuplicateAddress(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,7):
|
||||
for i in range(1, 7):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[DUT_LEADER].set_panid(0xface)
|
||||
@@ -89,9 +89,9 @@ class Cert_5_3_7_DuplicateAddress(unittest.TestCase):
|
||||
self.nodes[MED3].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -129,22 +129,30 @@ class Cert_5_3_7_DuplicateAddress(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
|
||||
# 4
|
||||
# Flush the message queue to avoid possible impact on follow-up verification.
|
||||
# Flush the message queue to avoid possible impact on follow-up
|
||||
# verification.
|
||||
self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
|
||||
self.nodes[MED3].ping('2001:2:0:1::1234')
|
||||
|
||||
# Verify DUT_LEADER sent an Address Query Request to the Realm local address.
|
||||
# Verify DUT_LEADER sent an Address Query Request to the Realm local
|
||||
# address.
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = dut_messages.next_coap_message('0.02', '/a/aq')
|
||||
command.check_address_query(msg, self.nodes[DUT_LEADER], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command.check_address_query(
|
||||
msg, self.nodes[DUT_LEADER], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS
|
||||
)
|
||||
|
||||
# 5 & 6
|
||||
# Verify DUT_LEADER sent an Address Error Notification to the Realm local address.
|
||||
# Verify DUT_LEADER sent an Address Error Notification to the Realm
|
||||
# local address.
|
||||
self.simulator.go(5)
|
||||
dut_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = dut_messages.next_coap_message('0.02', '/a/ae')
|
||||
command.check_address_error_notification(msg, self.nodes[DUT_LEADER], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command.check_address_error_notification(
|
||||
msg, self.nodes[DUT_LEADER], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -43,6 +42,7 @@ MED2 = 4
|
||||
|
||||
MTDS = [MED1, MED2]
|
||||
|
||||
|
||||
class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
@@ -71,9 +71,9 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
self.nodes[i].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -108,14 +108,18 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
self.assertEqual(self.nodes[i].get_state(), 'child')
|
||||
|
||||
# 4 MED1: MED1 send an ICMPv6 Echo Request to the MED2 ML-EID
|
||||
med2_ml_eid = self.nodes[MED2].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
|
||||
self.assertTrue(med2_ml_eid != None)
|
||||
med2_ml_eid = self.nodes[MED2].get_ip6_address(
|
||||
config.ADDRESS_TYPE.ML_EID
|
||||
)
|
||||
self.assertTrue(med2_ml_eid is not None)
|
||||
self.assertTrue(self.nodes[MED1].ping(med2_ml_eid))
|
||||
|
||||
# Verify DUT_LEADER didn't generate an Address Query Request
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.next_coap_message('0.02', '/a/aq', False)
|
||||
assert msg is None, "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
|
||||
# Wait for sniffer got packets
|
||||
self.simulator.go(1)
|
||||
@@ -123,7 +127,9 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
# Verify MED2 sent an ICMPv6 Echo Reply
|
||||
med2_messages = self.simulator.get_messages_sent_by(MED2)
|
||||
msg = med2_messages.get_icmp_message(ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert msg is not None, "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
|
||||
# 5 MED1: MED1 send an ICMPv6 Echo Request to the MED2 2001::GUA
|
||||
addr = self.nodes[MED2].get_addr("2001::/64")
|
||||
@@ -133,7 +139,9 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
# Verify DUT_LEADER didn't generate an Address Query Request
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.next_coap_message('0.02', '/a/aq', False)
|
||||
assert msg is None, "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
|
||||
# Wait for sniffer got packets
|
||||
self.simulator.go(1)
|
||||
@@ -141,7 +149,9 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
# Verify MED2 sent an ICMPv6 Echo Reply
|
||||
med2_messages = self.simulator.get_messages_sent_by(MED2)
|
||||
msg = med2_messages.get_icmp_message(ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert msg is not None, "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
|
||||
# 6 MED1: MED1 send an ICMPv6 Echo Request to the MED2 2002::GUA
|
||||
addr = self.nodes[MED2].get_addr("2002::/64")
|
||||
@@ -151,7 +161,9 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
# Verify DUT_LEADER didn't generate an Address Query Request
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.next_coap_message('0.02', '/a/aq', False)
|
||||
assert msg is None, "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
|
||||
# Wait for sniffer got packets
|
||||
self.simulator.go(1)
|
||||
@@ -159,7 +171,9 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
# Verify MED2 sent an ICMPv6 Echo Reply
|
||||
med2_messages = self.simulator.get_messages_sent_by(MED2)
|
||||
msg = med2_messages.get_icmp_message(ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert msg is not None, "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
|
||||
# 7 MED1: MED1 send an ICMPv6 Echo Request to the MED2 2003::GUA
|
||||
addr = self.nodes[MED2].get_addr("2003::/64")
|
||||
@@ -169,7 +183,9 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
# Verify DUT_LEADER didn't generate an Address Query Request
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.next_coap_message('0.02', '/a/aq', False)
|
||||
assert msg is None, "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_LEADER sent an unexpected Address Query Request"
|
||||
|
||||
# Wait for sniffer got packets
|
||||
self.simulator.go(1)
|
||||
@@ -177,7 +193,10 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
|
||||
# Verify MED2 sent an ICMPv6 Echo Reply
|
||||
med2_messages = self.simulator.get_messages_sent_by(MED2)
|
||||
msg = med2_messages.get_icmp_message(ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert msg is not None, "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The MED2 didn't send ICMPv6 Echo Reply to MED1"
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -28,9 +28,7 @@
|
||||
#
|
||||
|
||||
import copy
|
||||
import time
|
||||
import unittest
|
||||
import ipaddress
|
||||
|
||||
import command
|
||||
import config
|
||||
@@ -43,12 +41,13 @@ DUT_ROUTER2 = 3
|
||||
ROUTER3 = 4
|
||||
SED1 = 5
|
||||
|
||||
|
||||
class Cert_5_3_09_AddressQuery(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,6):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, (i == SED1), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -84,9 +83,9 @@ class Cert_5_3_09_AddressQuery(unittest.TestCase):
|
||||
self.nodes[SED1].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -95,7 +94,8 @@ class Cert_5_3_09_AddressQuery(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
|
||||
|
||||
# Configure the LEADER to be a DHCPv6 Border Router for prefixes 2001:: & 2002::
|
||||
# Configure the LEADER to be a DHCPv6 Border Router for prefixes 2001::
|
||||
# & 2002::
|
||||
self.nodes[LEADER].add_prefix('2001::/64', 'pdros')
|
||||
self.nodes[LEADER].add_prefix('2002::/64', 'pdro')
|
||||
self.nodes[LEADER].register_netdata()
|
||||
@@ -120,7 +120,8 @@ class Cert_5_3_09_AddressQuery(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[SED1].get_state(), 'child')
|
||||
|
||||
# 3 SED1: The SED1 sends an ICMPv6 Echo Request to ROUTER3 using GUA 2001:: address
|
||||
# 3 SED1: The SED1 sends an ICMPv6 Echo Request to ROUTER3 using GUA
|
||||
# 2001:: address
|
||||
router3_addr = self.nodes[ROUTER3].get_addr("2001::/64")
|
||||
self.assertTrue(router3_addr is not None)
|
||||
self.assertTrue(self.nodes[SED1].ping(router3_addr))
|
||||
@@ -128,15 +129,24 @@ class Cert_5_3_09_AddressQuery(unittest.TestCase):
|
||||
# Verify DUT_ROUTER2 sent an Address Query Request
|
||||
dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
msg = dut_router2_messages.next_coap_message('0.02', '/a/aq')
|
||||
msg.assertSentToDestinationAddress(config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command.check_address_query(msg, self.nodes[DUT_ROUTER2], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
msg.assertSentToDestinationAddress(
|
||||
config.REALM_LOCAL_ALL_ROUTERS_ADDRESS
|
||||
)
|
||||
command.check_address_query(
|
||||
msg,
|
||||
self.nodes[DUT_ROUTER2],
|
||||
config.REALM_LOCAL_ALL_ROUTERS_ADDRESS,
|
||||
)
|
||||
|
||||
# Verify the DUT_ROUTER2 forwarded the ICMPv6 Echo Request to ROUTER3
|
||||
msg = dut_router2_messages.get_icmp_message(ipv6.ICMP_ECHO_REQUEST)
|
||||
assert msg is not None, "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Request to ROUTER3"
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Request to ROUTER3"
|
||||
msg.assertSentToNode(self.nodes[ROUTER3])
|
||||
|
||||
# 4 ROUTER1: ROUTER1 sends an ICMPv6 Echo Request to the SED1 using GUA 2001:: address
|
||||
# 4 ROUTER1: ROUTER1 sends an ICMPv6 Echo Request to the SED1 using GUA
|
||||
# 2001:: address
|
||||
sed1_addr = self.nodes[SED1].get_addr("2001::/64")
|
||||
self.assertTrue(sed1_addr is not None)
|
||||
self.assertTrue(self.nodes[ROUTER1].ping(sed1_addr))
|
||||
@@ -147,9 +157,12 @@ class Cert_5_3_09_AddressQuery(unittest.TestCase):
|
||||
# Verify DUT_ROUTER2 sent an Address Notification message
|
||||
dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
msg = dut_router2_messages.next_coap_message('0.02', '/a/an')
|
||||
command.check_address_notification(msg, self.nodes[DUT_ROUTER2], self.nodes[ROUTER1])
|
||||
command.check_address_notification(
|
||||
msg, self.nodes[DUT_ROUTER2], self.nodes[ROUTER1]
|
||||
)
|
||||
|
||||
# 5 SED1: SED1 sends an ICMPv6 Echo Request to the ROUTER3 using GUA 2001:: address
|
||||
# 5 SED1: SED1 sends an ICMPv6 Echo Request to the ROUTER3 using GUA
|
||||
# 2001:: address
|
||||
self.assertTrue(self.nodes[SED1].ping(router3_addr))
|
||||
|
||||
# Wait for sniffer got the ICMPv6 Echo Reply
|
||||
@@ -159,14 +172,21 @@ class Cert_5_3_09_AddressQuery(unittest.TestCase):
|
||||
dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
dut_router2_messages_temp = copy.deepcopy(dut_router2_messages)
|
||||
msg = dut_router2_messages.next_coap_message('0.02', '/a/aq', False)
|
||||
assert msg is None, "Error: The DUT_ROUTER2 sent an unexpected Address Query Request"
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_ROUTER2 sent an unexpected Address Query Request"
|
||||
|
||||
# Verify DUT_ROUTER2 forwarded the ICMPv6 Echo Reply to SED1
|
||||
msg = dut_router2_messages_temp.get_icmp_message(ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert msg is not None, "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Reply to SED1"
|
||||
msg = dut_router2_messages_temp.get_icmp_message(
|
||||
ipv6.ICMP_ECHO_RESPONSE
|
||||
)
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Reply to SED1"
|
||||
msg.assertSentToNode(self.nodes[SED1])
|
||||
|
||||
# 6 DUT_ROUTER2: Power off ROUTER3 and wait 580s to alow LEADER to expire its Router ID
|
||||
# 6 DUT_ROUTER2: Power off ROUTER3 and wait 580s to alow LEADER to
|
||||
# expire its Router ID
|
||||
self.nodes[ROUTER3].stop()
|
||||
self.simulator.go(580)
|
||||
|
||||
@@ -176,9 +196,12 @@ class Cert_5_3_09_AddressQuery(unittest.TestCase):
|
||||
# Verify DUT_ROUTER2 sent an Address Query Request
|
||||
dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
msg = dut_router2_messages.next_coap_message('0.02', '/a/aq')
|
||||
msg.assertSentToDestinationAddress(config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
msg.assertSentToDestinationAddress(
|
||||
config.REALM_LOCAL_ALL_ROUTERS_ADDRESS
|
||||
)
|
||||
|
||||
# 7 SED1: Power off SED1 and wait to allow DUT_ROUTER2 to timeout the child
|
||||
# 7 SED1: Power off SED1 and wait to allow DUT_ROUTER2 to timeout the
|
||||
# child
|
||||
self.nodes[SED1].stop()
|
||||
self.simulator.go(5)
|
||||
|
||||
@@ -189,7 +212,10 @@ class Cert_5_3_09_AddressQuery(unittest.TestCase):
|
||||
# Verify DUT_ROUTER2 didn't generate an Address Notification message
|
||||
dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
msg = dut_router2_messages.next_coap_message('0.02', '/a/an', False)
|
||||
assert msg is None, "Error: The DUT_ROUTER2 sent an unexpected Address Notification message"
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_ROUTER2 sent an unexpected Address Notification message"
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -28,14 +28,11 @@
|
||||
#
|
||||
|
||||
import copy
|
||||
import ipaddress
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import command
|
||||
import config
|
||||
import ipv6
|
||||
import network_layer
|
||||
import node
|
||||
|
||||
LEADER = 1
|
||||
@@ -44,6 +41,7 @@ ROUTER1 = 3
|
||||
DUT_ROUTER2 = 4
|
||||
MED1 = 5
|
||||
|
||||
|
||||
class Cert_5_3_10_AddressQuery(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
@@ -86,9 +84,9 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
|
||||
self.nodes[MED1].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -123,7 +121,8 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[MED1].get_state(), 'child')
|
||||
|
||||
# 3 MED1: MED1 sends an ICMPv6 Echo Request to Router1 using GUA 2003:: address
|
||||
# 3 MED1: MED1 sends an ICMPv6 Echo Request to Router1 using GUA 2003::
|
||||
# address
|
||||
router1_addr = self.nodes[ROUTER1].get_addr("2003::/64")
|
||||
self.assertTrue(router1_addr is not None)
|
||||
self.assertTrue(self.nodes[MED1].ping(router1_addr))
|
||||
@@ -134,14 +133,21 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
|
||||
# Verify DUT_ROUTER2 sent an Address Query Request
|
||||
dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
msg = dut_router2_messages.next_coap_message('0.02', '/a/aq')
|
||||
command.check_address_query(msg, self.nodes[DUT_ROUTER2], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command.check_address_query(
|
||||
msg,
|
||||
self.nodes[DUT_ROUTER2],
|
||||
config.REALM_LOCAL_ALL_ROUTERS_ADDRESS,
|
||||
)
|
||||
|
||||
# Verify the DUT_ROUTER2 forwarded ICMPv6 Echo Request to ROUTER1
|
||||
msg = dut_router2_messages.get_icmp_message(ipv6.ICMP_ECHO_REQUEST)
|
||||
assert msg is not None, "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Request to ROUTER1"
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Request to ROUTER1"
|
||||
msg.assertSentToNode(self.nodes[ROUTER1])
|
||||
|
||||
# 4 BR: BR sends an ICMPv6 Echo Request to MED1 using GUA 2003:: address
|
||||
# 4 BR: BR sends an ICMPv6 Echo Request to MED1 using GUA 2003::
|
||||
# address
|
||||
med1_addr = self.nodes[MED1].get_addr("2003::/64")
|
||||
self.assertTrue(med1_addr is not None)
|
||||
self.assertTrue(self.nodes[BR].ping(med1_addr))
|
||||
@@ -152,9 +158,12 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
|
||||
# Verify DUT_ROUTER2 sent an Address Notification message
|
||||
dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
msg = dut_router2_messages.next_coap_message('0.02', '/a/an')
|
||||
command.check_address_notification(msg, self.nodes[DUT_ROUTER2], self.nodes[BR])
|
||||
command.check_address_notification(
|
||||
msg, self.nodes[DUT_ROUTER2], self.nodes[BR]
|
||||
)
|
||||
|
||||
# 5 MED1: MED1 sends an ICMPv6 Echo Request to ROUTER1 using GUA 2003:: address
|
||||
# 5 MED1: MED1 sends an ICMPv6 Echo Request to ROUTER1 using GUA 2003::
|
||||
# address
|
||||
addr = self.nodes[ROUTER1].get_addr("2003::/64")
|
||||
self.assertTrue(addr is not None)
|
||||
self.assertTrue(self.nodes[MED1].ping(addr))
|
||||
@@ -166,14 +175,21 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
|
||||
dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
dut_router2_messages_temp = copy.deepcopy(dut_router2_messages)
|
||||
msg = dut_router2_messages.next_coap_message('0.02', '/a/aq', False)
|
||||
assert msg is None, "Error: The DUT_ROUTER2 sent an unexpected Address Query Request"
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_ROUTER2 sent an unexpected Address Query Request"
|
||||
|
||||
# Verify DUT_ROUTER2 forwarded ICMPv6 Echo Reply to MED1
|
||||
msg = dut_router2_messages_temp.get_icmp_message(ipv6.ICMP_ECHO_RESPONSE)
|
||||
assert msg is not None, "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Reply to MED1"
|
||||
msg = dut_router2_messages_temp.get_icmp_message(
|
||||
ipv6.ICMP_ECHO_RESPONSE
|
||||
)
|
||||
assert (
|
||||
msg is not None
|
||||
), "Error: The DUT_ROUTER2 didn't forward ICMPv6 Echo Reply to MED1"
|
||||
msg.assertSentToNode(self.nodes[MED1])
|
||||
|
||||
# 6 DUT_ROUTER2: Power off ROUTER1 and wait 580 seconds to allow the LEADER to expire its Router ID
|
||||
# 6 DUT_ROUTER2: Power off ROUTER1 and wait 580 seconds to allow the
|
||||
# LEADER to expire its Router ID
|
||||
router1_id = self.nodes[ROUTER1].get_router_id()
|
||||
self.nodes[ROUTER1].stop()
|
||||
self.simulator.go(580)
|
||||
@@ -181,15 +197,21 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
|
||||
# Send an ICMPv6 Echo Request from MED1 to ROUTER1 GUA 2003:: address
|
||||
self.assertFalse(self.nodes[MED1].ping(router1_addr))
|
||||
|
||||
# Verify the DUT_ROUTER2 has removed all entries based on ROUTER1's Router ID
|
||||
command.check_router_id_cached(self.nodes[DUT_ROUTER2], router1_id, False)
|
||||
# Verify the DUT_ROUTER2 has removed all entries based on ROUTER1's
|
||||
# Router ID
|
||||
command.check_router_id_cached(
|
||||
self.nodes[DUT_ROUTER2], router1_id, False
|
||||
)
|
||||
|
||||
# Verify DUT_ROUTER2 sent an Address Query Request
|
||||
dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
msg = dut_router2_messages.next_coap_message('0.02', '/a/aq')
|
||||
msg.assertSentToDestinationAddress(config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
msg.assertSentToDestinationAddress(
|
||||
config.REALM_LOCAL_ALL_ROUTERS_ADDRESS
|
||||
)
|
||||
|
||||
# 7 MED1: Power off MED1 and wait to allow DUT_ROUTER2 to timeout the child
|
||||
# 7 MED1: Power off MED1 and wait to allow DUT_ROUTER2 to timeout the
|
||||
# child
|
||||
self.nodes[MED1].stop()
|
||||
self.simulator.go(config.MLE_END_DEVICE_TIMEOUT)
|
||||
|
||||
@@ -200,7 +222,10 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
|
||||
# Verify DUT_ROUTER2 didn't generate an Address Notification message
|
||||
dut_router2_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
|
||||
msg = dut_router2_messages.next_coap_message('0.02', '/a/an/', False)
|
||||
assert msg is None, "Error: The DUT_ROUTER2 sent an unexpected Address Notification message"
|
||||
assert (
|
||||
msg is None
|
||||
), "Error: The DUT_ROUTER2 sent an unexpected Address Notification message"
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import command
|
||||
@@ -38,13 +37,14 @@ LEADER = 1
|
||||
DUT_ROUTER1 = 2
|
||||
MED1 = 3
|
||||
|
||||
|
||||
class Cert_5_3_11_AddressQueryTimeoutIntervals(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1, 4):
|
||||
self.nodes[i] = node.Node(i, (i == MED1), simulator = self.simulator)
|
||||
self.nodes[i] = node.Node(i, (i == MED1), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
@@ -64,9 +64,9 @@ class Cert_5_3_11_AddressQueryTimeoutIntervals(unittest.TestCase):
|
||||
self.nodes[MED1].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -83,7 +83,8 @@ class Cert_5_3_11_AddressQueryTimeoutIntervals(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[MED1].get_state(), 'child')
|
||||
|
||||
# 2 MED1: MED1 sends an ICMPv6 Echo Request to a non-existent mesh-local address X
|
||||
# 2 MED1: MED1 sends an ICMPv6 Echo Request to a non-existent
|
||||
# mesh-local address X
|
||||
X = "fdde:ad00:beef:0000:aa55:aa55:aa55:aa55"
|
||||
self.assertFalse(self.nodes[MED1].ping(X))
|
||||
|
||||
@@ -92,9 +93,14 @@ class Cert_5_3_11_AddressQueryTimeoutIntervals(unittest.TestCase):
|
||||
# Verify DUT_ROUTER1 sent an Address Query Request message
|
||||
dut_router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
|
||||
msg = dut_router1_messages.next_coap_message('0.02', '/a/aq')
|
||||
command.check_address_query(msg, self.nodes[DUT_ROUTER1], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command.check_address_query(
|
||||
msg,
|
||||
self.nodes[DUT_ROUTER1],
|
||||
config.REALM_LOCAL_ALL_ROUTERS_ADDRESS,
|
||||
)
|
||||
|
||||
# Verify DUT_ROUTER1 didn't receive an Address Query Notification message
|
||||
# Verify DUT_ROUTER1 didn't receive an Address Query Notification
|
||||
# message
|
||||
dut_router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
|
||||
msg = dut_router1_messages.next_coap_message('0.02', '/a/an', False)
|
||||
self.assertTrue(msg is None)
|
||||
@@ -117,7 +123,12 @@ class Cert_5_3_11_AddressQueryTimeoutIntervals(unittest.TestCase):
|
||||
# Verify DUT_ROUTER1 sent an Address Query Request message
|
||||
dut_router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
|
||||
msg = dut_router1_messages.next_coap_message('0.02', '/a/aq')
|
||||
command.check_address_query(msg, self.nodes[DUT_ROUTER1], config.REALM_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command.check_address_query(
|
||||
msg,
|
||||
self.nodes[DUT_ROUTER1],
|
||||
config.REALM_LOCAL_ALL_ROUTERS_ADDRESS,
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
#
|
||||
|
||||
import copy
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import command
|
||||
@@ -39,13 +38,14 @@ import node
|
||||
DUT_LEADER = 1
|
||||
DUT_ROUTER1 = 2
|
||||
|
||||
|
||||
class Cert_5_5_1_LeaderReboot(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
self.nodes[i] = node.Node(i, simulator = self.simulator)
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[DUT_LEADER].set_panid(0xface)
|
||||
self.nodes[DUT_LEADER].set_mode('rsdn')
|
||||
@@ -53,18 +53,22 @@ class Cert_5_5_1_LeaderReboot(unittest.TestCase):
|
||||
|
||||
self.nodes[DUT_ROUTER1].set_panid(0xface)
|
||||
self.nodes[DUT_ROUTER1].set_mode('rsdn')
|
||||
self.nodes[DUT_ROUTER1].add_whitelist(self.nodes[DUT_LEADER].get_addr64())
|
||||
self.nodes[DUT_ROUTER1].add_whitelist(
|
||||
self.nodes[DUT_LEADER].get_addr64()
|
||||
)
|
||||
self.nodes[DUT_ROUTER1].enable_whitelist()
|
||||
self.nodes[DUT_ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
def _setUpLeader(self):
|
||||
self.nodes[DUT_LEADER].add_whitelist(self.nodes[DUT_ROUTER1].get_addr64())
|
||||
self.nodes[DUT_LEADER].add_whitelist(
|
||||
self.nodes[DUT_ROUTER1].get_addr64()
|
||||
)
|
||||
self.nodes[DUT_LEADER].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -77,7 +81,8 @@ class Cert_5_5_1_LeaderReboot(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[DUT_ROUTER1].get_state(), 'router')
|
||||
|
||||
# 2 DUT_LEADER, DUT_ROUTER1: Verify both DUT_LEADER and DUT_ROUTER1 send MLE Advertisement message
|
||||
# 2 DUT_LEADER, DUT_ROUTER1: Verify both DUT_LEADER and DUT_ROUTER1
|
||||
# send MLE Advertisement message
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
|
||||
command.check_mle_advertisement(msg)
|
||||
@@ -87,10 +92,14 @@ class Cert_5_5_1_LeaderReboot(unittest.TestCase):
|
||||
command.check_mle_advertisement(msg)
|
||||
|
||||
# Send a harness helper ping to the DUT
|
||||
router1_rloc = self.nodes[DUT_ROUTER1].get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
router1_rloc = self.nodes[DUT_ROUTER1].get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC
|
||||
)
|
||||
self.assertTrue(self.nodes[DUT_LEADER].ping(router1_rloc))
|
||||
|
||||
leader_rloc = self.nodes[DUT_LEADER].get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
leader_rloc = self.nodes[DUT_LEADER].get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC
|
||||
)
|
||||
self.assertTrue(self.nodes[DUT_ROUTER1].ping(leader_rloc))
|
||||
|
||||
# 3 DUT_LEADER: Reset DUT_LEADER
|
||||
@@ -107,7 +116,9 @@ class Cert_5_5_1_LeaderReboot(unittest.TestCase):
|
||||
|
||||
# Verify DUT_LEADER didn't send MLE Advertisement messages
|
||||
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT, False)
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.ADVERTISEMENT, False
|
||||
)
|
||||
self.assertTrue(msg is None)
|
||||
|
||||
self.nodes[DUT_LEADER].start()
|
||||
@@ -122,30 +133,53 @@ class Cert_5_5_1_LeaderReboot(unittest.TestCase):
|
||||
leader_messages_temp = copy.deepcopy(leader_messages)
|
||||
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.LINK_REQUEST)
|
||||
command.check_link_request(msg, tlv_request_address16 = command.CheckType.CONTAIN, \
|
||||
tlv_request_route64 = command.CheckType.CONTAIN)
|
||||
command.check_link_request(
|
||||
msg,
|
||||
tlv_request_address16=command.CheckType.CONTAIN,
|
||||
tlv_request_route64=command.CheckType.CONTAIN,
|
||||
)
|
||||
|
||||
# 5 DUT_ROUTER1: Verify DUT_ROUTER1 replied with Link Accept message
|
||||
router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
|
||||
router1_messages_temp = copy.deepcopy(router1_messages)
|
||||
msg = router1_messages.next_mle_message(mle.CommandType.LINK_ACCEPT)
|
||||
if msg is not None:
|
||||
command.check_link_accept(msg, self.nodes[DUT_LEADER], address16 = command.CheckType.CONTAIN, \
|
||||
leader_data = command.CheckType.CONTAIN, route64 = command.CheckType.CONTAIN)
|
||||
command.check_link_accept(
|
||||
msg,
|
||||
self.nodes[DUT_LEADER],
|
||||
address16=command.CheckType.CONTAIN,
|
||||
leader_data=command.CheckType.CONTAIN,
|
||||
route64=command.CheckType.CONTAIN,
|
||||
)
|
||||
else:
|
||||
msg = router1_messages_temp.next_mle_message(mle.CommandType.LINK_ACCEPT_AND_REQUEST)
|
||||
self.assertTrue(msg is not None)
|
||||
command.check_link_accept(msg, self.nodes[DUT_LEADER], address16 = command.CheckType.CONTAIN, \
|
||||
leader_data = command.CheckType.CONTAIN, route64 = command.CheckType.CONTAIN, \
|
||||
challenge = command.CheckType.CONTAIN)
|
||||
msg = router1_messages_temp.next_mle_message(
|
||||
mle.CommandType.LINK_ACCEPT_AND_REQUEST
|
||||
)
|
||||
self.assertTrue(msg is not None)
|
||||
command.check_link_accept(
|
||||
msg,
|
||||
self.nodes[DUT_LEADER],
|
||||
address16=command.CheckType.CONTAIN,
|
||||
leader_data=command.CheckType.CONTAIN,
|
||||
route64=command.CheckType.CONTAIN,
|
||||
challenge=command.CheckType.CONTAIN,
|
||||
)
|
||||
|
||||
# 6 DUT_LEADER: Verify DUT_LEADER didn't send a Parent Request message
|
||||
msg = leader_messages_temp.next_mle_message(mle.CommandType.PARENT_REQUEST, False)
|
||||
msg = leader_messages_temp.next_mle_message(
|
||||
mle.CommandType.PARENT_REQUEST, False
|
||||
)
|
||||
self.assertTrue(msg is None)
|
||||
|
||||
# 7 ALL: Verify connectivity by sending an ICMPv6 Echo Request from DUT_LEADER to DUT_ROUTER1 link local address
|
||||
router1_link_local_address = self.nodes[DUT_ROUTER1].get_ip6_address(config.ADDRESS_TYPE.LINK_LOCAL)
|
||||
self.assertTrue(self.nodes[DUT_LEADER].ping(router1_link_local_address))
|
||||
# 7 ALL: Verify connectivity by sending an ICMPv6 Echo Request from
|
||||
# DUT_LEADER to DUT_ROUTER1 link local address
|
||||
router1_link_local_address = self.nodes[DUT_ROUTER1].get_ip6_address(
|
||||
config.ADDRESS_TYPE.LINK_LOCAL
|
||||
)
|
||||
self.assertTrue(
|
||||
self.nodes[DUT_LEADER].ping(router1_link_local_address)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -37,12 +36,13 @@ LEADER = 1
|
||||
ROUTER = 2
|
||||
ED = 3
|
||||
|
||||
|
||||
class Cert_5_5_2_LeaderReboot(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,4):
|
||||
for i in range(1, 4):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -64,12 +64,12 @@ class Cert_5_5_2_LeaderReboot(unittest.TestCase):
|
||||
def _setUpLeader(self):
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[ROUTER].get_addr64())
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -98,5 +98,6 @@ class Cert_5_5_2_LeaderReboot(unittest.TestCase):
|
||||
for addr in addrs:
|
||||
self.assertTrue(self.nodes[ROUTER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -42,12 +41,13 @@ ED3 = 6
|
||||
|
||||
MTDS = [ED1, ED2, ED3]
|
||||
|
||||
|
||||
class Cert_5_5_3_SplitMergeChildren(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,7):
|
||||
for i in range(1, 7):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -91,9 +91,9 @@ class Cert_5_5_3_SplitMergeChildren(unittest.TestCase):
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -142,5 +142,6 @@ class Cert_5_5_3_SplitMergeChildren(unittest.TestCase):
|
||||
if addr[0:4] != 'fe80':
|
||||
self.assertTrue(self.nodes[ROUTER2].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -39,12 +38,13 @@ ROUTER2 = 3
|
||||
ROUTER3 = 4
|
||||
ROUTER4 = 5
|
||||
|
||||
|
||||
class Cert_5_5_4_SplitMergeRouters(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,6):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -81,12 +81,12 @@ class Cert_5_5_4_SplitMergeRouters(unittest.TestCase):
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[ROUTER1].get_addr64())
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[ROUTER2].get_addr64())
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -124,5 +124,6 @@ class Cert_5_5_4_SplitMergeRouters(unittest.TestCase):
|
||||
if addr[0:4] != 'fe80':
|
||||
self.assertTrue(self.nodes[ROUTER3].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -40,21 +39,22 @@ ROUTER3 = 4
|
||||
ROUTER15 = 16
|
||||
REED1 = 17
|
||||
|
||||
|
||||
class Cert_5_5_5_SplitMergeREED(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,18):
|
||||
for i in range(1, 18):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
for i in range(ROUTER2, ROUTER15+1):
|
||||
for i in range(ROUTER2, ROUTER15 + 1):
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[i].get_addr64())
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
|
||||
for i in range(ROUTER2, ROUTER15+1):
|
||||
for i in range(ROUTER2, ROUTER15 + 1):
|
||||
self.nodes[i].set_panid(0xface)
|
||||
self.nodes[i].set_mode('rsdn')
|
||||
self.nodes[i].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
@@ -76,9 +76,9 @@ class Cert_5_5_5_SplitMergeREED(unittest.TestCase):
|
||||
self.nodes[REED1].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -86,7 +86,7 @@ class Cert_5_5_5_SplitMergeREED(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
|
||||
|
||||
for i in range(ROUTER2, ROUTER15+1):
|
||||
for i in range(ROUTER2, ROUTER15 + 1):
|
||||
self.nodes[i].start()
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[i].get_state(), 'router')
|
||||
@@ -113,5 +113,6 @@ class Cert_5_5_5_SplitMergeREED(unittest.TestCase):
|
||||
if addr[0:4] != 'fe80':
|
||||
self.assertTrue(self.nodes[ROUTER1].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -38,12 +37,13 @@ ROUTER1 = 2
|
||||
ROUTER2 = 3
|
||||
ROUTER3 = 4
|
||||
|
||||
|
||||
class Cert_5_5_7_SplitMergeThreeWay(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER1].set_panid(0xface)
|
||||
@@ -76,9 +76,9 @@ class Cert_5_5_7_SplitMergeThreeWay(unittest.TestCase):
|
||||
self.nodes[LEADER1].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -120,5 +120,6 @@ class Cert_5_5_7_SplitMergeThreeWay(unittest.TestCase):
|
||||
if addr[0:4] != 'fe80':
|
||||
self.assertTrue(self.nodes[ROUTER1].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -39,12 +38,13 @@ ROUTER2 = 3
|
||||
ROUTER3 = 4
|
||||
ED1 = 5
|
||||
|
||||
|
||||
class Cert_5_5_8_SplitRoutersLostLeader(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,6):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, (i == ED1), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER1].set_panid(0xface)
|
||||
@@ -85,9 +85,9 @@ class Cert_5_5_8_SplitRoutersLostLeader(unittest.TestCase):
|
||||
self.nodes[ROUTER3].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
|
||||
def test(self):
|
||||
self.nodes[LEADER1].start()
|
||||
@@ -119,7 +119,7 @@ class Cert_5_5_8_SplitRoutersLostLeader(unittest.TestCase):
|
||||
self._setUpRouter3()
|
||||
self.simulator.go(140)
|
||||
|
||||
self.nodes[ROUTER3].start()
|
||||
self.nodes[ROUTER3].start()
|
||||
self.simulator.go(60)
|
||||
|
||||
addrs = self.nodes[ED1].get_addrs()
|
||||
@@ -127,5 +127,6 @@ class Cert_5_5_8_SplitRoutersLostLeader(unittest.TestCase):
|
||||
if addr[0:4] != 'fe80':
|
||||
self.assertTrue(self.nodes[LEADER1].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -40,12 +39,13 @@ SED1 = 4
|
||||
|
||||
MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_5_6_1_NetworkDataLeaderAsBr(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -73,9 +73,9 @@ class Cert_5_6_1_NetworkDataLeaderAsBr(unittest.TestCase):
|
||||
self.nodes[SED1].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -119,5 +119,6 @@ class Cert_5_6_1_NetworkDataLeaderAsBr(unittest.TestCase):
|
||||
if addr[0:10] == '2001:2:0:1' or addr[0:10] == '2001:2:0:2':
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -40,12 +39,13 @@ SED1 = 4
|
||||
|
||||
MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_5_6_2_NetworkDataRouterAsBr(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -73,9 +73,9 @@ class Cert_5_6_2_NetworkDataRouterAsBr(unittest.TestCase):
|
||||
self.nodes[SED1].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -117,5 +117,6 @@ class Cert_5_6_2_NetworkDataRouterAsBr(unittest.TestCase):
|
||||
if addr[0:10] == '2001:2:0:1' or addr[0:10] == '2001:2:0:2':
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -40,12 +39,13 @@ SED1 = 4
|
||||
|
||||
MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_5_6_3_NetworkDataRegisterAfterAttachLeader(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -73,9 +73,9 @@ class Cert_5_6_3_NetworkDataRegisterAfterAttachLeader(unittest.TestCase):
|
||||
self.nodes[SED1].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -119,5 +119,6 @@ class Cert_5_6_3_NetworkDataRegisterAfterAttachLeader(unittest.TestCase):
|
||||
if addr[0:10] == '2001:2:0:1' or addr[0:10] == '2001:2:0:2':
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -40,12 +39,13 @@ SED1 = 4
|
||||
|
||||
MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_5_6_4_NetworkDataRegisterAfterAttachRouter(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -73,9 +73,9 @@ class Cert_5_6_4_NetworkDataRegisterAfterAttachRouter(unittest.TestCase):
|
||||
self.nodes[SED1].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -119,5 +119,6 @@ class Cert_5_6_4_NetworkDataRegisterAfterAttachRouter(unittest.TestCase):
|
||||
if addr[0:10] == '2001:2:0:1' or addr[0:10] == '2001:2:0:2':
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -40,12 +39,13 @@ SED1 = 4
|
||||
|
||||
MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_5_6_5_NetworkDataRegisterAfterAttachRouter(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -73,9 +73,9 @@ class Cert_5_6_5_NetworkDataRegisterAfterAttachRouter(unittest.TestCase):
|
||||
self.nodes[SED1].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -143,5 +143,6 @@ class Cert_5_6_5_NetworkDataRegisterAfterAttachRouter(unittest.TestCase):
|
||||
if addr[0:3] == '200':
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -40,12 +39,13 @@ SED1 = 4
|
||||
|
||||
MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_5_6_6_NetworkDataExpiration(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -73,9 +73,9 @@ class Cert_5_6_6_NetworkDataExpiration(unittest.TestCase):
|
||||
self.nodes[SED1].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -165,5 +165,6 @@ class Cert_5_6_6_NetworkDataExpiration(unittest.TestCase):
|
||||
|
||||
self.nodes[ROUTER].stop()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -37,12 +36,13 @@ LEADER = 1
|
||||
ROUTER = 2
|
||||
REED = 3
|
||||
|
||||
|
||||
class Cert_5_6_7_NetworkDataRequestREED(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,4):
|
||||
for i in range(1, 4):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -64,9 +64,9 @@ class Cert_5_6_7_NetworkDataRequestREED(unittest.TestCase):
|
||||
self.nodes[REED].set_router_upgrade_threshold(0)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -104,5 +104,6 @@ class Cert_5_6_7_NetworkDataRequestREED(unittest.TestCase):
|
||||
if addr[0:10] == '2001:2:0:3':
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -37,12 +36,13 @@ LEADER = 1
|
||||
ROUTER = 2
|
||||
ED = 3
|
||||
|
||||
|
||||
class Cert_5_6_8_ContextManagement(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,4):
|
||||
for i in range(1, 4):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -64,9 +64,9 @@ class Cert_5_6_8_ContextManagement(unittest.TestCase):
|
||||
self.nodes[ED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -138,5 +138,6 @@ class Cert_5_6_8_ContextManagement(unittest.TestCase):
|
||||
if addr[0:3] == '200':
|
||||
self.assertTrue(self.nodes[ED].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -41,12 +40,13 @@ SED = 5
|
||||
|
||||
MTDS = [ED, SED]
|
||||
|
||||
|
||||
class Cert_5_6_9_NetworkDataForwarding(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,6):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -81,9 +81,9 @@ class Cert_5_6_9_NetworkDataForwarding(unittest.TestCase):
|
||||
self.nodes[SED].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -139,5 +139,6 @@ class Cert_5_6_9_NetworkDataForwarding(unittest.TestCase):
|
||||
|
||||
self.assertFalse(self.nodes[SED].ping('2007::1'))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -36,12 +35,13 @@ import node
|
||||
LEADER = 1
|
||||
ED = 2
|
||||
|
||||
|
||||
class Cert_5_8_1_KeySynchronization(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -57,9 +57,9 @@ class Cert_5_8_1_KeySynchronization(unittest.TestCase):
|
||||
self.nodes[ED].set_key_switch_guardtime(0)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -84,5 +84,6 @@ class Cert_5_8_1_KeySynchronization(unittest.TestCase):
|
||||
if 'ff:fe00' not in addr:
|
||||
self.assertFalse(self.nodes[ED].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -36,12 +35,13 @@ import node
|
||||
LEADER = 1
|
||||
ROUTER = 2
|
||||
|
||||
|
||||
class Cert_5_8_2_KeyIncrement(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -58,9 +58,9 @@ class Cert_5_8_2_KeyIncrement(unittest.TestCase):
|
||||
self.nodes[ROUTER].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -83,5 +83,6 @@ class Cert_5_8_2_KeyIncrement(unittest.TestCase):
|
||||
for addr in addrs:
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -36,12 +35,13 @@ import node
|
||||
LEADER = 1
|
||||
ROUTER = 2
|
||||
|
||||
|
||||
class Cert_5_8_3_KeyIncrementRollOver(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -59,9 +59,9 @@ class Cert_5_8_3_KeyIncrementRollOver(unittest.TestCase):
|
||||
self.nodes[ROUTER].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -84,5 +84,6 @@ class Cert_5_8_3_KeyIncrementRollOver(unittest.TestCase):
|
||||
for addr in addrs:
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -37,12 +36,13 @@ import node
|
||||
LEADER = 1
|
||||
ED = 2
|
||||
|
||||
|
||||
class Cert_6_1_1_RouterAttach(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -56,9 +56,9 @@ class Cert_6_1_1_RouterAttach(unittest.TestCase):
|
||||
self.nodes[ED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -108,7 +108,9 @@ class Cert_6_1_1_RouterAttach(unittest.TestCase):
|
||||
msg.assertMleMessageContainsOptionalTlv(mle.MleFrameCounter)
|
||||
|
||||
# 5 - leader
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[ED])
|
||||
|
||||
# 6 - leader
|
||||
@@ -117,5 +119,6 @@ class Cert_6_1_1_RouterAttach(unittest.TestCase):
|
||||
if addr[0:4] != 'fe80':
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -41,12 +41,13 @@ LEADER = 1
|
||||
REED = 2
|
||||
MED = 3
|
||||
|
||||
|
||||
class Cert_6_1_2_REEDAttach_MED(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,4):
|
||||
for i in range(1, 4):
|
||||
self.nodes[i] = node.Node(i, (i == MED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -68,9 +69,9 @@ class Cert_6_1_2_REEDAttach_MED(unittest.TestCase):
|
||||
self.nodes[MED].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -98,18 +99,31 @@ class Cert_6_1_2_REEDAttach_MED(unittest.TestCase):
|
||||
check_parent_request(msg, is_first_request=False)
|
||||
|
||||
# Step 6 - DUT sends Child ID Request
|
||||
msg = med_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST, sent_to_node=self.nodes[REED])
|
||||
check_child_id_request(msg, address_registration=CheckType.CONTAIN,
|
||||
tlv_request=CheckType.CONTAIN, mle_frame_counter=CheckType.OPTIONAL,
|
||||
route64=CheckType.OPTIONAL)
|
||||
msg = med_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST, sent_to_node=self.nodes[REED]
|
||||
)
|
||||
check_child_id_request(
|
||||
msg,
|
||||
address_registration=CheckType.CONTAIN,
|
||||
tlv_request=CheckType.CONTAIN,
|
||||
mle_frame_counter=CheckType.OPTIONAL,
|
||||
route64=CheckType.OPTIONAL,
|
||||
)
|
||||
|
||||
# Wait additional DEFAULT_CHILD_TIMEOUT to ensure the keep-alive message (child update request from MED) happens.
|
||||
# Wait additional DEFAULT_CHILD_TIMEOUT to ensure the keep-alive
|
||||
# message (child update request from MED) happens.
|
||||
self.simulator.go(config.DEFAULT_CHILD_TIMEOUT)
|
||||
med_messages = self.simulator.get_messages_sent_by(MED)
|
||||
|
||||
# Step 8 - DUT sends Child Update messages
|
||||
msg = med_messages.next_mle_message(mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(msg, source_address=CheckType.CONTAIN, leader_data=CheckType.CONTAIN)
|
||||
msg = med_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST
|
||||
)
|
||||
check_child_update_request_from_child(
|
||||
msg,
|
||||
source_address=CheckType.CONTAIN,
|
||||
leader_data=CheckType.CONTAIN,
|
||||
)
|
||||
|
||||
# Step 10 - Leader sends ICMPv6 echo request, to DUT link local address
|
||||
med_addrs = self.nodes[MED].get_addrs()
|
||||
@@ -117,5 +131,6 @@ class Cert_6_1_2_REEDAttach_MED(unittest.TestCase):
|
||||
if addr[0:4] == 'fe80':
|
||||
self.assertTrue(self.nodes[REED].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -42,12 +42,13 @@ LEADER = 1
|
||||
REED = 2
|
||||
SED = 3
|
||||
|
||||
|
||||
class Cert_6_1_2_REEDAttach_SED(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,4):
|
||||
for i in range(1, 4):
|
||||
self.nodes[i] = node.Node(i, (i == SED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -69,9 +70,9 @@ class Cert_6_1_2_REEDAttach_SED(unittest.TestCase):
|
||||
self.nodes[SED].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -84,7 +85,7 @@ class Cert_6_1_2_REEDAttach_SED(unittest.TestCase):
|
||||
self.assertEqual(self.nodes[REED].get_state(), 'child')
|
||||
|
||||
self.nodes[SED].start()
|
||||
self.simulator.go(5)
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[SED].get_state(), 'child')
|
||||
self.assertEqual(self.nodes[REED].get_state(), 'router')
|
||||
|
||||
@@ -99,10 +100,16 @@ class Cert_6_1_2_REEDAttach_SED(unittest.TestCase):
|
||||
check_parent_request(msg, is_first_request=False)
|
||||
|
||||
# Step 6 - DUT sends Child ID Request
|
||||
msg = sed_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST, sent_to_node=self.nodes[REED])
|
||||
check_child_id_request(msg, address_registration=CheckType.CONTAIN,
|
||||
tlv_request=CheckType.CONTAIN, mle_frame_counter=CheckType.OPTIONAL,
|
||||
route64=CheckType.OPTIONAL)
|
||||
msg = sed_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_REQUEST, sent_to_node=self.nodes[REED]
|
||||
)
|
||||
check_child_id_request(
|
||||
msg,
|
||||
address_registration=CheckType.CONTAIN,
|
||||
tlv_request=CheckType.CONTAIN,
|
||||
mle_frame_counter=CheckType.OPTIONAL,
|
||||
route64=CheckType.OPTIONAL,
|
||||
)
|
||||
|
||||
# Wait DEFAULT_CHILD_TIMEOUT seconds,
|
||||
# ensure SED has received the CHILD_ID_RESPONSE,
|
||||
@@ -112,9 +119,14 @@ class Cert_6_1_2_REEDAttach_SED(unittest.TestCase):
|
||||
|
||||
# Step 11 - SED sends periodic 802.15.4 Data Request messages
|
||||
msg = sed_messages.next_message()
|
||||
self.assertEqual(False, msg.isMacAddressTypeLong()) # Extra check, keep-alive messages are of short types of mac address
|
||||
self.assertEqual(
|
||||
False, msg.isMacAddressTypeLong()
|
||||
) # Extra check, keep-alive messages are of short types of mac address
|
||||
self.assertEqual(msg.type, message.MessageType.COMMAND)
|
||||
self.assertEqual(msg.mac_header.command_type, mac802154.MacHeader.CommandIdentifier.DATA_REQUEST)
|
||||
self.assertEqual(
|
||||
msg.mac_header.command_type,
|
||||
mac802154.MacHeader.CommandIdentifier.DATA_REQUEST,
|
||||
)
|
||||
|
||||
# Step 12 - REED sends ICMPv6 echo request, to DUT link local address
|
||||
sed_addrs = self.nodes[SED].get_addrs()
|
||||
@@ -122,5 +134,6 @@ class Cert_6_1_2_REEDAttach_SED(unittest.TestCase):
|
||||
if addr[0:4] == 'fe80':
|
||||
self.assertTrue(self.nodes[REED].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -39,12 +38,13 @@ ROUTER2 = 3
|
||||
ROUTER3 = 4
|
||||
ED = 5
|
||||
|
||||
|
||||
class Cert_6_1_3_RouterAttachConnectivity(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,6):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -83,9 +83,9 @@ class Cert_6_1_3_RouterAttachConnectivity(unittest.TestCase):
|
||||
self.nodes[ED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -111,5 +111,6 @@ class Cert_6_1_3_RouterAttachConnectivity(unittest.TestCase):
|
||||
for addr in addrs:
|
||||
self.assertTrue(self.nodes[ROUTER3].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -39,12 +38,13 @@ REED0 = 3
|
||||
REED1 = 4
|
||||
ED = 5
|
||||
|
||||
|
||||
class Cert_6_1_4_REEDAttachConnectivity(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,6):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -83,9 +83,9 @@ class Cert_6_1_4_REEDAttachConnectivity(unittest.TestCase):
|
||||
self.nodes[ED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -112,5 +112,6 @@ class Cert_6_1_4_REEDAttachConnectivity(unittest.TestCase):
|
||||
self.assertEqual(self.nodes[ED].get_state(), 'child')
|
||||
self.assertEqual(self.nodes[REED1].get_state(), 'router')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -38,12 +37,13 @@ ROUTER1 = 2
|
||||
ROUTER2 = 3
|
||||
ED = 4
|
||||
|
||||
|
||||
class Cert_6_1_5_RouterAttachLinkQuality(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -62,7 +62,9 @@ class Cert_6_1_5_RouterAttachLinkQuality(unittest.TestCase):
|
||||
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[ED].get_addr64(), rssi=-85)
|
||||
self.nodes[ROUTER2].add_whitelist(
|
||||
self.nodes[ED].get_addr64(), rssi=-85
|
||||
)
|
||||
self.nodes[ROUTER2].enable_whitelist()
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
@@ -73,9 +75,9 @@ class Cert_6_1_5_RouterAttachLinkQuality(unittest.TestCase):
|
||||
self.nodes[ED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -95,5 +97,6 @@ class Cert_6_1_5_RouterAttachLinkQuality(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[ED].get_state(), 'child')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -39,12 +38,13 @@ REED = 2
|
||||
ROUTER2 = 3
|
||||
ED = 4
|
||||
|
||||
|
||||
class Cert_6_1_6_REEDAttachLinkQuality_ED(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -63,7 +63,9 @@ class Cert_6_1_6_REEDAttachLinkQuality_ED(unittest.TestCase):
|
||||
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[ED].get_addr64(), rssi=-85)
|
||||
self.nodes[ROUTER2].add_whitelist(
|
||||
self.nodes[ED].get_addr64(), rssi=-85
|
||||
)
|
||||
self.nodes[ROUTER2].enable_whitelist()
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
@@ -74,9 +76,9 @@ class Cert_6_1_6_REEDAttachLinkQuality_ED(unittest.TestCase):
|
||||
self.nodes[ED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -138,7 +140,9 @@ class Cert_6_1_6_REEDAttachLinkQuality_ED(unittest.TestCase):
|
||||
self.assertEqual(0, scan_mask_tlv.end_device)
|
||||
|
||||
# 4 - Router2
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[ED])
|
||||
|
||||
# 5 - ED
|
||||
@@ -155,7 +159,9 @@ class Cert_6_1_6_REEDAttachLinkQuality_ED(unittest.TestCase):
|
||||
self.assertEqual(1, scan_mask_tlv.end_device)
|
||||
|
||||
# 6 - REED
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
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)
|
||||
@@ -176,5 +182,6 @@ class Cert_6_1_6_REEDAttachLinkQuality_ED(unittest.TestCase):
|
||||
msg = reed_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[ED])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -39,12 +38,13 @@ 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):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i == SED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -63,7 +63,9 @@ class Cert_6_1_6_REEDAttachLinkQuality_SED(unittest.TestCase):
|
||||
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].add_whitelist(
|
||||
self.nodes[SED].get_addr64(), rssi=-85
|
||||
)
|
||||
self.nodes[ROUTER2].enable_whitelist()
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
@@ -75,9 +77,9 @@ class Cert_6_1_6_REEDAttachLinkQuality_SED(unittest.TestCase):
|
||||
self.nodes[SED].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -139,7 +141,9 @@ class Cert_6_1_6_REEDAttachLinkQuality_SED(unittest.TestCase):
|
||||
self.assertEqual(0, scan_mask_tlv.end_device)
|
||||
|
||||
# 4 - Router2
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
msg = router2_messages.next_mle_message(
|
||||
mle.CommandType.PARENT_RESPONSE
|
||||
)
|
||||
msg.assertSentToNode(self.nodes[SED])
|
||||
|
||||
# 5 - SED
|
||||
@@ -156,7 +160,9 @@ class Cert_6_1_6_REEDAttachLinkQuality_SED(unittest.TestCase):
|
||||
self.assertEqual(1, scan_mask_tlv.end_device)
|
||||
|
||||
# 6 - REED
|
||||
msg = router2_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
|
||||
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)
|
||||
@@ -177,5 +183,6 @@ class Cert_6_1_6_REEDAttachLinkQuality_SED(unittest.TestCase):
|
||||
msg = reed_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
msg.assertSentToNode(self.nodes[SED])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -39,12 +38,13 @@ ED = 3
|
||||
ROUTER2 = 4
|
||||
ROUTER3 = 5
|
||||
|
||||
|
||||
class Cert_6_1_7_EDSynchronization(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,6):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -87,9 +87,9 @@ class Cert_6_1_7_EDSynchronization(unittest.TestCase):
|
||||
self.nodes[ROUTER3].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -113,5 +113,6 @@ class Cert_6_1_7_EDSynchronization(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[ROUTER3].get_state(), 'router')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -37,12 +36,13 @@ LEADER = 1
|
||||
ROUTER1 = 2
|
||||
ED = 3
|
||||
|
||||
|
||||
class Cert_6_2_1_NewPartition(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,4):
|
||||
for i in range(1, 4):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -63,9 +63,9 @@ class Cert_6_2_1_NewPartition(unittest.TestCase):
|
||||
self.nodes[ED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -90,5 +90,6 @@ class Cert_6_2_1_NewPartition(unittest.TestCase):
|
||||
for addr in addrs:
|
||||
self.assertTrue(self.nodes[ROUTER1].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -38,12 +37,13 @@ ROUTER1 = 2
|
||||
ROUTER2 = 3
|
||||
ED = 4
|
||||
|
||||
|
||||
class Cert_6_2_2_NewPartition(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -74,9 +74,9 @@ class Cert_6_2_2_NewPartition(unittest.TestCase):
|
||||
self.nodes[ED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -106,5 +106,6 @@ class Cert_6_2_2_NewPartition(unittest.TestCase):
|
||||
for addr in addrs:
|
||||
self.assertTrue(self.nodes[ROUTER1].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -37,12 +36,13 @@ LEADER = 1
|
||||
ROUTER = 2
|
||||
ED = 3
|
||||
|
||||
|
||||
class Cert_6_3_1_OrphanReattach(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,4):
|
||||
for i in range(1, 4):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -64,9 +64,9 @@ class Cert_6_3_1_OrphanReattach(unittest.TestCase):
|
||||
self.nodes[ED].set_timeout(10)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -93,5 +93,6 @@ class Cert_6_3_1_OrphanReattach(unittest.TestCase):
|
||||
for addr in addrs:
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -36,12 +35,13 @@ import node
|
||||
LEADER = 1
|
||||
ED = 2
|
||||
|
||||
|
||||
class Cert_6_3_2_NetworkDataUpdate(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -56,9 +56,9 @@ class Cert_6_3_2_NetworkDataUpdate(unittest.TestCase):
|
||||
self.nodes[ED].set_timeout(10)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -106,5 +106,6 @@ class Cert_6_3_2_NetworkDataUpdate(unittest.TestCase):
|
||||
if addr[0:10] == '2001:2:0:1' or addr[0:10] == '2001:2:0:2':
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -36,12 +35,13 @@ import node
|
||||
LEADER = 1
|
||||
ED = 2
|
||||
|
||||
|
||||
class Cert_6_4_1_LinkLocal(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -55,9 +55,9 @@ class Cert_6_4_1_LinkLocal(unittest.TestCase):
|
||||
self.nodes[ED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -78,5 +78,6 @@ class Cert_6_4_1_LinkLocal(unittest.TestCase):
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff02::1', size=256))
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff02::1'))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -37,12 +36,13 @@ LEADER = 1
|
||||
ROUTER = 2
|
||||
ED = 3
|
||||
|
||||
|
||||
class Cert_5_3_2_RealmLocal(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -63,9 +63,9 @@ class Cert_5_3_2_RealmLocal(unittest.TestCase):
|
||||
self.nodes[ED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -87,11 +87,22 @@ class Cert_5_3_2_RealmLocal(unittest.TestCase):
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr, size=256))
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff03::1', num_responses=2, size=256))
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping('ff03::1', num_responses=2, size=256)
|
||||
)
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff03::1', num_responses=2))
|
||||
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff33:0040:fdde:ad00:beef:0:0:1', num_responses=2, size=256))
|
||||
self.assertTrue(self.nodes[LEADER].ping('ff33:0040:fdde:ad00:beef:0:0:1', num_responses=2))
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping(
|
||||
'ff33:0040:fdde:ad00:beef:0:0:1', num_responses=2, size=256
|
||||
)
|
||||
)
|
||||
self.assertTrue(
|
||||
self.nodes[LEADER].ping(
|
||||
'ff33:0040:fdde:ad00:beef:0:0:1', num_responses=2
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -36,12 +35,13 @@ import node
|
||||
LEADER = 1
|
||||
ED = 2
|
||||
|
||||
|
||||
class Cert_6_5_1_ChildResetSynchronize(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -59,9 +59,9 @@ class Cert_6_5_1_ChildResetSynchronize(unittest.TestCase):
|
||||
self.nodes[ED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -95,5 +95,6 @@ class Cert_6_5_1_ChildResetSynchronize(unittest.TestCase):
|
||||
if addr[0:4] == 'fe80':
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -36,12 +35,13 @@ import node
|
||||
LEADER = 1
|
||||
ED = 2
|
||||
|
||||
|
||||
class Cert_6_5_2_ChildResetReattach(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -58,9 +58,9 @@ class Cert_6_5_2_ChildResetReattach(unittest.TestCase):
|
||||
self.nodes[ED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -90,5 +90,6 @@ class Cert_6_5_2_ChildResetReattach(unittest.TestCase):
|
||||
if addr[0:4] == 'fe80':
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -36,12 +35,13 @@ import node
|
||||
LEADER = 1
|
||||
ED = 2
|
||||
|
||||
|
||||
class Cert_6_6_1_KeyIncrement(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -57,9 +57,9 @@ class Cert_6_6_1_KeyIncrement(unittest.TestCase):
|
||||
self.nodes[ED].set_key_switch_guardtime(0)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -82,5 +82,6 @@ class Cert_6_6_1_KeyIncrement(unittest.TestCase):
|
||||
for addr in addrs:
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -36,12 +35,13 @@ import node
|
||||
LEADER = 1
|
||||
ED = 2
|
||||
|
||||
|
||||
class Cert_6_6_2_KeyIncrement1(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -58,9 +58,9 @@ class Cert_6_6_2_KeyIncrement1(unittest.TestCase):
|
||||
self.nodes[ED].set_key_switch_guardtime(0)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -83,5 +83,6 @@ class Cert_6_6_2_KeyIncrement1(unittest.TestCase):
|
||||
for addr in addrs:
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,18 +27,19 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import functools
|
||||
import time
|
||||
import unittest
|
||||
|
||||
from command import check_child_id_response, check_child_update_response, check_child_update_request_from_child, check_data_response
|
||||
from command import (
|
||||
check_child_id_response,
|
||||
check_child_update_response,
|
||||
check_child_update_request_from_child,
|
||||
check_data_response,
|
||||
)
|
||||
from command import CheckType
|
||||
from command import CommissioningDataCheck, NetworkDataCheck, PrefixesCheck, SinglePrefixCheck
|
||||
from command import NetworkDataCheckType
|
||||
from command import NetworkDataCheck, PrefixesCheck, SinglePrefixCheck
|
||||
|
||||
import config
|
||||
import mle
|
||||
import network_data
|
||||
import node
|
||||
|
||||
LEADER = 1
|
||||
@@ -48,12 +49,13 @@ MED1 = 4
|
||||
|
||||
MTDS = [SED1, MED1]
|
||||
|
||||
|
||||
class Cert_7_1_1_BorderRouterAsLeader(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -81,9 +83,9 @@ class Cert_7_1_1_BorderRouterAsLeader(unittest.TestCase):
|
||||
self.nodes[MED1].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -134,49 +136,89 @@ class Cert_7_1_1_BorderRouterAsLeader(unittest.TestCase):
|
||||
|
||||
# Step 2 - DUT creates network data
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.DATA_RESPONSE)
|
||||
check_data_response(msg,
|
||||
check_data_response(
|
||||
msg,
|
||||
network_data_check=NetworkDataCheck(
|
||||
prefixes_check=PrefixesCheck(prefix_check_list=[ SinglePrefixCheck(prefix=b'2001000200000001'), SinglePrefixCheck(prefix=b'2001000200000002') ])
|
||||
)
|
||||
prefixes_check=PrefixesCheck(
|
||||
prefix_check_list=[
|
||||
SinglePrefixCheck(prefix=b'2001000200000001'),
|
||||
SinglePrefixCheck(prefix=b'2001000200000002'),
|
||||
]
|
||||
)
|
||||
),
|
||||
)
|
||||
|
||||
# Step 4 - DUT sends a MLE Child ID Response to Router1
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
check_child_id_response(msg,
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
check_child_id_response(
|
||||
msg,
|
||||
network_data_check=NetworkDataCheck(
|
||||
prefixes_check=PrefixesCheck(prefix_cnt=2)
|
||||
)
|
||||
),
|
||||
)
|
||||
|
||||
# Step 6 - DUT sends a MLE Child ID Response to SED1
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
check_child_id_response(msg,
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
check_child_id_response(
|
||||
msg,
|
||||
network_data_check=NetworkDataCheck(
|
||||
prefixes_check=PrefixesCheck(prefix_check_list=[ SinglePrefixCheck(border_router_16=0xFFFE) ])
|
||||
)
|
||||
prefixes_check=PrefixesCheck(
|
||||
prefix_check_list=[
|
||||
SinglePrefixCheck(border_router_16=0xfffe)
|
||||
]
|
||||
)
|
||||
),
|
||||
)
|
||||
|
||||
# For Step 10
|
||||
msg_chd_upd_res_to_sed = leader_messages.next_mle_message(mle.CommandType.CHILD_UPDATE_RESPONSE)
|
||||
msg_chd_upd_res_to_sed = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_RESPONSE
|
||||
)
|
||||
|
||||
# Step 8 - DUT sends a MLE Child ID Response to MED1
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.CHILD_ID_RESPONSE)
|
||||
check_child_id_response(msg,
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_ID_RESPONSE
|
||||
)
|
||||
check_child_id_response(
|
||||
msg,
|
||||
network_data_check=NetworkDataCheck(
|
||||
prefixes_check=PrefixesCheck(prefix_cnt=2)
|
||||
)
|
||||
),
|
||||
)
|
||||
|
||||
# Step 10 - DUT sends Child Update Response
|
||||
msg_chd_upd_res_to_med = leader_messages.next_mle_message(mle.CommandType.CHILD_UPDATE_RESPONSE)
|
||||
msg = med1_messages.next_mle_message(mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1, 2])
|
||||
msg_chd_upd_res_to_med = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_RESPONSE
|
||||
)
|
||||
msg = med1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST
|
||||
)
|
||||
check_child_update_request_from_child(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1, 2]
|
||||
)
|
||||
|
||||
check_child_update_response(msg_chd_upd_res_to_med, address_registration=CheckType.CONTAIN, CIDs=[1, 2])
|
||||
check_child_update_response(
|
||||
msg_chd_upd_res_to_med,
|
||||
address_registration=CheckType.CONTAIN,
|
||||
CIDs=[1, 2],
|
||||
)
|
||||
|
||||
msg = sed1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST
|
||||
)
|
||||
check_child_update_request_from_child(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1]
|
||||
)
|
||||
check_child_update_response(
|
||||
msg_chd_upd_res_to_sed,
|
||||
address_registration=CheckType.CONTAIN,
|
||||
CIDs=[1],
|
||||
)
|
||||
|
||||
msg = sed1_messages.next_mle_message(mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1])
|
||||
check_child_update_response(msg_chd_upd_res_to_sed, address_registration=CheckType.CONTAIN, CIDs=[1])
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -40,12 +39,13 @@ SED2 = 4
|
||||
|
||||
MTDS = [ED2, SED2]
|
||||
|
||||
|
||||
class Cert_7_1_2_BorderRouterAsRouter(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -73,9 +73,9 @@ class Cert_7_1_2_BorderRouterAsRouter(unittest.TestCase):
|
||||
self.nodes[SED2].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -117,5 +117,6 @@ class Cert_7_1_2_BorderRouterAsRouter(unittest.TestCase):
|
||||
if addr[0:10] == '2001:2:0:1' or addr[0:10] == '2001:2:0:2':
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,17 +27,19 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
from command import check_child_update_request_from_child, check_child_update_request_from_parent, check_child_update_response, check_data_response
|
||||
from command import (
|
||||
check_child_update_request_from_child,
|
||||
check_child_update_request_from_parent,
|
||||
check_child_update_response,
|
||||
check_data_response,
|
||||
)
|
||||
from command import CheckType
|
||||
from command import NetworkDataCheck, PrefixesCheck, SinglePrefixCheck
|
||||
from command import NetworkDataCheckType
|
||||
|
||||
import config
|
||||
import mle
|
||||
import network_data
|
||||
import node
|
||||
|
||||
LEADER = 1
|
||||
@@ -47,12 +49,13 @@ MED1 = 4
|
||||
|
||||
MTDS = [SED1, MED1]
|
||||
|
||||
|
||||
class Cert_7_1_3_BorderRouterAsLeader(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -80,9 +83,9 @@ class Cert_7_1_3_BorderRouterAsLeader(unittest.TestCase):
|
||||
self.nodes[MED1].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -138,40 +141,74 @@ class Cert_7_1_3_BorderRouterAsLeader(unittest.TestCase):
|
||||
|
||||
# 3 - Leader
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.DATA_RESPONSE)
|
||||
check_data_response(msg,
|
||||
check_data_response(
|
||||
msg,
|
||||
network_data_check=NetworkDataCheck(
|
||||
prefixes_check=PrefixesCheck(prefix_check_list=[ SinglePrefixCheck(b'2001000200000001'), SinglePrefixCheck(b'2001000200000002')])
|
||||
)
|
||||
prefixes_check=PrefixesCheck(
|
||||
prefix_check_list=[
|
||||
SinglePrefixCheck(b'2001000200000001'),
|
||||
SinglePrefixCheck(b'2001000200000002'),
|
||||
]
|
||||
)
|
||||
),
|
||||
)
|
||||
|
||||
# 4 - N/A
|
||||
# Get addresses registered by MED1
|
||||
msg = med1_messages.next_mle_message(mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1, 2])
|
||||
msg = med1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST
|
||||
)
|
||||
check_child_update_request_from_child(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1, 2]
|
||||
)
|
||||
|
||||
# 5 - Leader
|
||||
# Make a copy of leader's messages to ensure that we don't miss messages to SED1
|
||||
# Make a copy of leader's messages to ensure that we don't miss
|
||||
# messages to SED1
|
||||
leader_messages_copy = leader_messages.clone()
|
||||
msg = leader_messages_copy.next_mle_message(mle.CommandType.CHILD_UPDATE_RESPONSE, sent_to_node=self.nodes[MED1])
|
||||
check_child_update_response(msg, address_registration=CheckType.CONTAIN, CIDs=[1, 2])
|
||||
msg = leader_messages_copy.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_RESPONSE,
|
||||
sent_to_node=self.nodes[MED1],
|
||||
)
|
||||
check_child_update_response(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[1, 2]
|
||||
)
|
||||
|
||||
# 6A & 6B - Leader
|
||||
if config.LEADER_NOTIFY_SED_BY_CHILD_UPDATE_REQUEST:
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.CHILD_UPDATE_REQUEST, sent_to_node=self.nodes[SED1])
|
||||
check_child_update_request_from_parent(msg,
|
||||
leader_data=CheckType.CONTAIN, network_data=CheckType.CONTAIN, active_timestamp=CheckType.CONTAIN)
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST,
|
||||
sent_to_node=self.nodes[SED1],
|
||||
)
|
||||
check_child_update_request_from_parent(
|
||||
msg,
|
||||
leader_data=CheckType.CONTAIN,
|
||||
network_data=CheckType.CONTAIN,
|
||||
active_timestamp=CheckType.CONTAIN,
|
||||
)
|
||||
else:
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.DATA_RESPONSE, sent_to_node=self.nodes[SED1])
|
||||
check_data_response(msg, network_data_check=command.NetworkDataCheck())
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.DATA_RESPONSE, sent_to_node=self.nodes[SED1]
|
||||
)
|
||||
check_data_response(msg, network_data_check=NetworkDataCheck())
|
||||
|
||||
# 7 - N/A
|
||||
# Get addresses registered by SED1
|
||||
msg = sed1_messages.next_mle_message(mle.CommandType.CHILD_UPDATE_REQUEST)
|
||||
check_child_update_request_from_child(msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1])
|
||||
msg = sed1_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_REQUEST
|
||||
)
|
||||
check_child_update_request_from_child(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[0, 1]
|
||||
)
|
||||
|
||||
# 8 - Leader
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.CHILD_UPDATE_RESPONSE, sent_to_node=self.nodes[SED1])
|
||||
check_child_update_response(msg, address_registration=CheckType.CONTAIN, CIDs=[1])
|
||||
msg = leader_messages.next_mle_message(
|
||||
mle.CommandType.CHILD_UPDATE_RESPONSE,
|
||||
sent_to_node=self.nodes[SED1],
|
||||
)
|
||||
check_child_update_response(
|
||||
msg, address_registration=CheckType.CONTAIN, CIDs=[1]
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -40,12 +39,13 @@ SED2 = 4
|
||||
|
||||
MTDS = [SED2, ED2]
|
||||
|
||||
|
||||
class Cert_7_1_4_BorderRouterAsRouter(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -73,9 +73,9 @@ class Cert_7_1_4_BorderRouterAsRouter(unittest.TestCase):
|
||||
self.nodes[SED2].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -118,5 +118,6 @@ class Cert_7_1_4_BorderRouterAsRouter(unittest.TestCase):
|
||||
if addr[0:10] == '2001:2:0:1' or addr[0:10] == '2001:2:0:2':
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -40,12 +39,13 @@ SED2 = 4
|
||||
|
||||
MTDS = [ED2, SED2]
|
||||
|
||||
|
||||
class Cert_7_1_5_BorderRouterAsRouter(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -73,9 +73,9 @@ class Cert_7_1_5_BorderRouterAsRouter(unittest.TestCase):
|
||||
self.nodes[SED2].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -127,7 +127,11 @@ class Cert_7_1_5_BorderRouterAsRouter(unittest.TestCase):
|
||||
self.assertTrue(any('2001:2:0:2' in addr[0:10] for addr in addrs))
|
||||
self.assertTrue(any('2001:2:0:3' in addr[0:10] for addr in addrs))
|
||||
for addr in addrs:
|
||||
if addr[0:10] == '2001:2:0:1' or addr[0:10] == '2001:2:0:2' or addr[0:10] == '2001:2:0:3':
|
||||
if (
|
||||
addr[0:10] == '2001:2:0:1'
|
||||
or addr[0:10] == '2001:2:0:2'
|
||||
or addr[0:10] == '2001:2:0:3'
|
||||
):
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
addrs = self.nodes[SED2].get_addrs()
|
||||
@@ -135,8 +139,13 @@ class Cert_7_1_5_BorderRouterAsRouter(unittest.TestCase):
|
||||
self.assertFalse(any('2001:2:0:2' in addr[0:10] for addr in addrs))
|
||||
self.assertTrue(any('2001:2:0:3' in addr[0:10] for addr in addrs))
|
||||
for addr in addrs:
|
||||
if addr[0:10] == '2001:2:0:1' or addr[0:10] == '2001:2:0:2' or addr[0:10] == '2001:2:0:3':
|
||||
if (
|
||||
addr[0:10] == '2001:2:0:1'
|
||||
or addr[0:10] == '2001:2:0:2'
|
||||
or addr[0:10] == '2001:2:0:3'
|
||||
):
|
||||
self.assertTrue(self.nodes[LEADER].ping(addr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import command
|
||||
@@ -41,26 +40,29 @@ from command import CheckType
|
||||
COMMISSIONER = 1
|
||||
JOINER = 2
|
||||
|
||||
|
||||
class Cert_8_1_01_Commissioning(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_panid(0xface)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].set_masterkey('00112233445566778899aabbccddeeff')
|
||||
self.nodes[COMMISSIONER].set_masterkey(
|
||||
'00112233445566778899aabbccddeeff'
|
||||
)
|
||||
|
||||
self.nodes[JOINER].set_mode('rsdn')
|
||||
self.nodes[JOINER].set_masterkey('deadbeefdeadbeefdeadbeefdeadbeef')
|
||||
self.nodes[JOINER].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -70,67 +72,109 @@ class Cert_8_1_01_Commissioning(unittest.TestCase):
|
||||
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'leader')
|
||||
self.nodes[COMMISSIONER].commissioner_start()
|
||||
self.simulator.go(3)
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(self.nodes[JOINER].get_eui64(), 'OPENTHREAD')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER].get_eui64(), 'OPENTHREAD'
|
||||
)
|
||||
|
||||
self.nodes[JOINER].interface_up()
|
||||
self.nodes[JOINER].joiner_start('OPENTHREAD')
|
||||
self.simulator.go(10)
|
||||
self.simulator.read_cert_messages_in_commissioning_log([COMMISSIONER,JOINER])
|
||||
self.assertEqual(self.nodes[JOINER].get_masterkey(), self.nodes[COMMISSIONER].get_masterkey())
|
||||
self.simulator.read_cert_messages_in_commissioning_log(
|
||||
[COMMISSIONER, JOINER]
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[JOINER].get_masterkey(),
|
||||
self.nodes[COMMISSIONER].get_masterkey(),
|
||||
)
|
||||
|
||||
joiner_messages = self.simulator.get_messages_sent_by(JOINER)
|
||||
commissioner_messages = self.simulator.get_messages_sent_by(COMMISSIONER)
|
||||
commissioner_messages = self.simulator.get_messages_sent_by(
|
||||
COMMISSIONER
|
||||
)
|
||||
|
||||
# 2 - N/A
|
||||
|
||||
# 3 - Joiner_1
|
||||
msg = joiner_messages.next_mle_message(mle.CommandType.DISCOVERY_REQUEST)
|
||||
msg = joiner_messages.next_mle_message(
|
||||
mle.CommandType.DISCOVERY_REQUEST
|
||||
)
|
||||
command.check_discovery_request(msg)
|
||||
request_src_addr = msg.mac_header.src_address
|
||||
|
||||
# 4 - Commissioner
|
||||
msg = commissioner_messages.next_mle_message(mle.CommandType.DISCOVERY_RESPONSE)
|
||||
command.check_discovery_response(msg, request_src_addr, steering_data=CheckType.CONTAIN)
|
||||
udp_port_set_by_commissioner = command.get_joiner_udp_port_in_discovery_response(msg)
|
||||
msg = commissioner_messages.next_mle_message(
|
||||
mle.CommandType.DISCOVERY_RESPONSE
|
||||
)
|
||||
command.check_discovery_response(
|
||||
msg, request_src_addr, steering_data=CheckType.CONTAIN
|
||||
)
|
||||
udp_port_set_by_commissioner = command.get_joiner_udp_port_in_discovery_response(
|
||||
msg)
|
||||
|
||||
# 5.2 - Joiner_1
|
||||
msg = joiner_messages.next_dtls_message(dtls.ContentType.HANDSHAKE, dtls.HandshakeType.CLIENT_HELLO)
|
||||
msg = joiner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.CLIENT_HELLO
|
||||
)
|
||||
self.assertEqual(msg.get_dst_udp_port(), udp_port_set_by_commissioner)
|
||||
|
||||
# 5.3 - Commissioner
|
||||
msg = commissioner_messages.next_dtls_message(dtls.ContentType.HANDSHAKE, dtls.HandshakeType.HELLO_VERIFY_REQUEST)
|
||||
msg = commissioner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.HELLO_VERIFY_REQUEST
|
||||
)
|
||||
commissioner_cookie = msg.dtls.body.cookie
|
||||
|
||||
# 5.4 - Joiner_1
|
||||
msg = joiner_messages.next_dtls_message(dtls.ContentType.HANDSHAKE, dtls.HandshakeType.CLIENT_HELLO)
|
||||
msg = joiner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.CLIENT_HELLO
|
||||
)
|
||||
self.assertEqual(commissioner_cookie, msg.dtls.body.cookie)
|
||||
self.assertEqual(msg.get_dst_udp_port(), udp_port_set_by_commissioner)
|
||||
|
||||
# 5.5 - Commissioner
|
||||
commissioner_messages.next_dtls_message(dtls.ContentType.HANDSHAKE, dtls.HandshakeType.SERVER_HELLO)
|
||||
commissioner_messages.next_dtls_message(dtls.ContentType.HANDSHAKE, dtls.HandshakeType.SERVER_KEY_EXCHANGE)
|
||||
commissioner_messages.next_dtls_message(dtls.ContentType.HANDSHAKE, dtls.HandshakeType.SERVER_HELLO_DONE)
|
||||
commissioner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.SERVER_HELLO
|
||||
)
|
||||
commissioner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.SERVER_KEY_EXCHANGE
|
||||
)
|
||||
commissioner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.SERVER_HELLO_DONE
|
||||
)
|
||||
|
||||
# 5.6 - Joiner_1
|
||||
msg = joiner_messages.next_dtls_message(dtls.ContentType.HANDSHAKE, dtls.HandshakeType.CLIENT_KEY_EXCHANGE)
|
||||
msg = joiner_messages.next_dtls_message(
|
||||
dtls.ContentType.HANDSHAKE, dtls.HandshakeType.CLIENT_KEY_EXCHANGE
|
||||
)
|
||||
self.assertEqual(msg.get_dst_udp_port(), udp_port_set_by_commissioner)
|
||||
msg = joiner_messages.next_dtls_message(dtls.ContentType.CHANGE_CIPHER_SPEC)
|
||||
msg = joiner_messages.next_dtls_message(
|
||||
dtls.ContentType.CHANGE_CIPHER_SPEC
|
||||
)
|
||||
self.assertEqual(msg.get_dst_udp_port(), udp_port_set_by_commissioner)
|
||||
|
||||
# TODO(wgtdkp): It's required to verify DTLS FINISHED message here. Currently not handled as it is encrypted.
|
||||
# TODO(wgtdkp): It's required to verify DTLS FINISHED message here.
|
||||
# Currently not handled as it is encrypted.
|
||||
|
||||
# 5.7 - Commissioner
|
||||
commissioner_messages.next_dtls_message(dtls.ContentType.CHANGE_CIPHER_SPEC)
|
||||
commissioner_messages.next_dtls_message(
|
||||
dtls.ContentType.CHANGE_CIPHER_SPEC
|
||||
)
|
||||
|
||||
# TODO(wgtdkp): It's required to verify DTLS FINISHED message here. Currently not handled as it is encrypted.
|
||||
# TODO(wgtdkp): It's required to verify DTLS FINISHED message here.
|
||||
# Currently not handled as it is encrypted.
|
||||
|
||||
# 5.8,9,10,11
|
||||
# - Joiner_1
|
||||
command.check_joiner_commissioning_messages(joiner_messages.commissioning_messages)
|
||||
command.check_joiner_commissioning_messages(
|
||||
joiner_messages.commissioning_messages
|
||||
)
|
||||
# - Commissioner
|
||||
command.check_commissioner_commissioning_messages(commissioner_messages.commissioning_messages)
|
||||
command.check_commissioner_commissioning_messages(
|
||||
commissioner_messages.commissioning_messages
|
||||
)
|
||||
# As commissioner is also joiner router
|
||||
command.check_joiner_router_commissioning_messages(commissioner_messages.commissioning_messages)
|
||||
command.check_joiner_router_commissioning_messages(
|
||||
commissioner_messages.commissioning_messages
|
||||
)
|
||||
|
||||
self.nodes[JOINER].thread_start()
|
||||
self.simulator.go(5)
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -36,26 +35,29 @@ import node
|
||||
COMMISSIONER = 1
|
||||
JOINER = 2
|
||||
|
||||
|
||||
class Cert_8_1_02_Commissioning(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_panid(0xface)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].set_masterkey('deadbeefdeadbeefdeadbeefdeadbeef')
|
||||
self.nodes[COMMISSIONER].set_masterkey(
|
||||
'deadbeefdeadbeefdeadbeefdeadbeef'
|
||||
)
|
||||
|
||||
self.nodes[JOINER].set_mode('rsdn')
|
||||
self.nodes[JOINER].set_masterkey('00112233445566778899aabbccddeeff')
|
||||
self.nodes[JOINER].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -65,12 +67,18 @@ class Cert_8_1_02_Commissioning(unittest.TestCase):
|
||||
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'leader')
|
||||
self.nodes[COMMISSIONER].commissioner_start()
|
||||
self.simulator.go(3)
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(self.nodes[JOINER].get_eui64(), 'OPENTHREAD')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER].get_eui64(), 'OPENTHREAD'
|
||||
)
|
||||
|
||||
self.nodes[JOINER].interface_up()
|
||||
self.nodes[JOINER].joiner_start('DAERHTNEPO')
|
||||
self.simulator.go(10)
|
||||
self.assertNotEqual(self.nodes[JOINER].get_masterkey(), self.nodes[COMMISSIONER].get_masterkey())
|
||||
self.assertNotEqual(
|
||||
self.nodes[JOINER].get_masterkey(),
|
||||
self.nodes[COMMISSIONER].get_masterkey(),
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -37,22 +36,27 @@ COMMISSIONER = 1
|
||||
JOINER_ROUTER = 2
|
||||
JOINER = 3
|
||||
|
||||
|
||||
class Cert_8_2_01_JoinerRouter(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,4):
|
||||
for i in range(1, 4):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_panid(0xface)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].set_masterkey('deadbeefdeadbeefdeadbeefdeadbeef')
|
||||
self.nodes[COMMISSIONER].set_masterkey(
|
||||
'deadbeefdeadbeefdeadbeefdeadbeef'
|
||||
)
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[JOINER_ROUTER].set_mode('rsdn')
|
||||
self.nodes[JOINER_ROUTER].set_masterkey('00112233445566778899aabbccddeeff')
|
||||
self.nodes[JOINER_ROUTER].set_masterkey(
|
||||
'00112233445566778899aabbccddeeff'
|
||||
)
|
||||
self.nodes[JOINER_ROUTER].enable_whitelist()
|
||||
self.nodes[JOINER_ROUTER].set_router_selection_jitter(1)
|
||||
|
||||
@@ -62,9 +66,9 @@ class Cert_8_2_01_JoinerRouter(unittest.TestCase):
|
||||
self.nodes[JOINER].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -75,37 +79,60 @@ class Cert_8_2_01_JoinerRouter(unittest.TestCase):
|
||||
|
||||
self.nodes[COMMISSIONER].commissioner_start()
|
||||
self.simulator.go(5)
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(self.nodes[JOINER_ROUTER].get_eui64(), 'OPENTHREAD')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(self.nodes[JOINER].get_eui64(), 'OPENTHREAD2')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER_ROUTER].get_eui64(), 'OPENTHREAD'
|
||||
)
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER].get_eui64(), 'OPENTHREAD2'
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[JOINER_ROUTER].get_joiner_id())
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
self.nodes[COMMISSIONER].add_whitelist(
|
||||
self.nodes[JOINER_ROUTER].get_joiner_id()
|
||||
)
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(
|
||||
self.nodes[COMMISSIONER].get_addr64()
|
||||
)
|
||||
|
||||
self.nodes[JOINER_ROUTER].interface_up()
|
||||
self.nodes[JOINER_ROUTER].joiner_start('OPENTHREAD')
|
||||
self.simulator.go(10)
|
||||
self.assertEqual(self.nodes[JOINER_ROUTER].get_masterkey(), self.nodes[COMMISSIONER].get_masterkey())
|
||||
self.assertEqual(
|
||||
self.nodes[JOINER_ROUTER].get_masterkey(),
|
||||
self.nodes[COMMISSIONER].get_masterkey(),
|
||||
)
|
||||
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[JOINER_ROUTER].get_addr64())
|
||||
self.nodes[COMMISSIONER].add_whitelist(
|
||||
self.nodes[JOINER_ROUTER].get_addr64()
|
||||
)
|
||||
|
||||
self.nodes[JOINER_ROUTER].thread_start()
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[JOINER_ROUTER].get_state(), 'router')
|
||||
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(self.nodes[JOINER].get_joiner_id())
|
||||
self.nodes[JOINER].add_whitelist(self.nodes[JOINER_ROUTER].get_addr64())
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(
|
||||
self.nodes[JOINER].get_joiner_id()
|
||||
)
|
||||
self.nodes[JOINER].add_whitelist(
|
||||
self.nodes[JOINER_ROUTER].get_addr64()
|
||||
)
|
||||
|
||||
self.nodes[JOINER].interface_up()
|
||||
self.nodes[JOINER].joiner_start('OPENTHREAD2')
|
||||
self.simulator.go(10)
|
||||
self.assertEqual(self.nodes[JOINER].get_masterkey(), self.nodes[COMMISSIONER].get_masterkey())
|
||||
self.assertEqual(
|
||||
self.nodes[JOINER].get_masterkey(),
|
||||
self.nodes[COMMISSIONER].get_masterkey(),
|
||||
)
|
||||
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(self.nodes[JOINER].get_addr64())
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(
|
||||
self.nodes[JOINER].get_addr64()
|
||||
)
|
||||
|
||||
self.nodes[JOINER].thread_start()
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[JOINER].get_state(), 'router')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -37,22 +36,27 @@ COMMISSIONER = 1
|
||||
JOINER_ROUTER = 2
|
||||
JOINER = 3
|
||||
|
||||
|
||||
class Cert_8_2_02_JoinerRouter(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,4):
|
||||
for i in range(1, 4):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_panid(0xface)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].set_masterkey('deadbeefdeadbeefdeadbeefdeadbeef')
|
||||
self.nodes[COMMISSIONER].set_masterkey(
|
||||
'deadbeefdeadbeefdeadbeefdeadbeef'
|
||||
)
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[JOINER_ROUTER].set_mode('rsdn')
|
||||
self.nodes[JOINER_ROUTER].set_masterkey('00112233445566778899aabbccddeeff')
|
||||
self.nodes[JOINER_ROUTER].set_masterkey(
|
||||
'00112233445566778899aabbccddeeff'
|
||||
)
|
||||
self.nodes[JOINER_ROUTER].enable_whitelist()
|
||||
self.nodes[JOINER_ROUTER].set_router_selection_jitter(1)
|
||||
|
||||
@@ -62,9 +66,9 @@ class Cert_8_2_02_JoinerRouter(unittest.TestCase):
|
||||
self.nodes[JOINER].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -75,31 +79,52 @@ class Cert_8_2_02_JoinerRouter(unittest.TestCase):
|
||||
|
||||
self.nodes[COMMISSIONER].commissioner_start()
|
||||
self.simulator.go(5)
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(self.nodes[JOINER_ROUTER].get_eui64(), 'OPENTHREAD')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(self.nodes[JOINER].get_eui64(), 'OPENTHREAD2')
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER_ROUTER].get_eui64(), 'OPENTHREAD'
|
||||
)
|
||||
self.nodes[COMMISSIONER].commissioner_add_joiner(
|
||||
self.nodes[JOINER].get_eui64(), 'OPENTHREAD2'
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[JOINER_ROUTER].get_joiner_id())
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
self.nodes[COMMISSIONER].add_whitelist(
|
||||
self.nodes[JOINER_ROUTER].get_joiner_id()
|
||||
)
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(
|
||||
self.nodes[COMMISSIONER].get_addr64()
|
||||
)
|
||||
|
||||
self.nodes[JOINER_ROUTER].interface_up()
|
||||
self.nodes[JOINER_ROUTER].joiner_start('OPENTHREAD')
|
||||
self.simulator.go(10)
|
||||
self.assertEqual(self.nodes[JOINER_ROUTER].get_masterkey(), self.nodes[COMMISSIONER].get_masterkey())
|
||||
self.assertEqual(
|
||||
self.nodes[JOINER_ROUTER].get_masterkey(),
|
||||
self.nodes[COMMISSIONER].get_masterkey(),
|
||||
)
|
||||
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[JOINER_ROUTER].get_addr64())
|
||||
self.nodes[COMMISSIONER].add_whitelist(
|
||||
self.nodes[JOINER_ROUTER].get_addr64()
|
||||
)
|
||||
|
||||
self.nodes[JOINER_ROUTER].thread_start()
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[JOINER_ROUTER].get_state(), 'router')
|
||||
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(self.nodes[JOINER].get_joiner_id())
|
||||
self.nodes[JOINER].add_whitelist(self.nodes[JOINER_ROUTER].get_addr64())
|
||||
self.nodes[JOINER_ROUTER].add_whitelist(
|
||||
self.nodes[JOINER].get_joiner_id()
|
||||
)
|
||||
self.nodes[JOINER].add_whitelist(
|
||||
self.nodes[JOINER_ROUTER].get_addr64()
|
||||
)
|
||||
|
||||
self.nodes[JOINER].interface_up()
|
||||
self.nodes[JOINER].joiner_start('2DAERHTNEPO')
|
||||
self.simulator.go(10)
|
||||
self.assertNotEqual(self.nodes[JOINER].get_masterkey(), self.nodes[COMMISSIONER].get_masterkey())
|
||||
self.assertNotEqual(
|
||||
self.nodes[JOINER].get_masterkey(),
|
||||
self.nodes[COMMISSIONER].get_masterkey(),
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -30,8 +30,6 @@
|
||||
from ipaddress import ip_address
|
||||
import unittest
|
||||
|
||||
from mle import NetworkData
|
||||
from network_data import CommissioningData
|
||||
import command
|
||||
import config
|
||||
import mesh_cop
|
||||
@@ -43,12 +41,11 @@ LEADER = 2
|
||||
|
||||
|
||||
class Cert_9_2_02_MGMTCommissionerSet(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_panid(0xface)
|
||||
@@ -64,9 +61,9 @@ class Cert_9_2_02_MGMTCommissionerSet(unittest.TestCase):
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -85,83 +82,142 @@ class Cert_9_2_02_MGMTCommissionerSet(unittest.TestCase):
|
||||
# Commissioner start
|
||||
self.nodes[COMMISSIONER].commissioner_start()
|
||||
self.simulator.go(3)
|
||||
self.simulator.get_messages_sent_by(COMMISSIONER) # Skip LEAD_PET.req
|
||||
self.simulator.get_messages_sent_by(COMMISSIONER) # Skip LEAD_PET.req
|
||||
|
||||
# Get CommissionerSesssionId from LEAD_PET.rsp
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
msg = leader_messages.next_coap_message('2.04', assert_enabled=True)
|
||||
commissioner_session_id_tlv = command.get_sub_tlv(msg.coap.payload, mesh_cop.CommissionerSessionId)
|
||||
commissioner_session_id_tlv = command.get_sub_tlv(
|
||||
msg.coap.payload, mesh_cop.CommissionerSessionId
|
||||
)
|
||||
|
||||
# Step 2 - Harness instructs commissioner to send MGMT_COMMISSIONER_SET.req to Leader
|
||||
steering_data_tlv = mesh_cop.SteeringData(bytes([0xFF]))
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs([steering_data_tlv])
|
||||
# Step 2 - Harness instructs commissioner to send
|
||||
# MGMT_COMMISSIONER_SET.req to Leader
|
||||
steering_data_tlv = mesh_cop.SteeringData(bytes([0xff]))
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs(
|
||||
[steering_data_tlv]
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
# Step 3 - Leader responds to MGMT_COMMISSIONER_SET.req with MGMT_COMMISSIONER_SET.rsp
|
||||
# Step 3 - Leader responds to MGMT_COMMISSIONER_SET.req with
|
||||
# MGMT_COMMISSIONER_SET.rsp
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
msg = leader_messages.next_coap_message('2.04')
|
||||
command.check_coap_message(msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)]) # (mesh_cop.State(mesh_cop.MeshCopState.REJECT),) <- this a tuple, don't delete the comma
|
||||
self.simulator.get_messages_sent_by(COMMISSIONER) # Skip LEAD_PET.req
|
||||
# (mesh_cop.State(mesh_cop.MeshCopState.REJECT),) <- this a tuple, don't delete the comma
|
||||
command.check_coap_message(
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)]
|
||||
)
|
||||
self.simulator.get_messages_sent_by(COMMISSIONER) # Skip LEAD_PET.req
|
||||
|
||||
# Step 4 - Harness instructs commissioner to send MGMT_COMMISSIONER_SET.req to Leader
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs([steering_data_tlv, commissioner_session_id_tlv])
|
||||
# Step 4 - Harness instructs commissioner to send
|
||||
# MGMT_COMMISSIONER_SET.req to Leader
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs(
|
||||
[steering_data_tlv, commissioner_session_id_tlv]
|
||||
)
|
||||
self.simulator.go(5)
|
||||
commissioner_messages = self.simulator.get_messages_sent_by(COMMISSIONER)
|
||||
commissioner_messages = self.simulator.get_messages_sent_by(
|
||||
COMMISSIONER
|
||||
)
|
||||
msg = commissioner_messages.next_coap_message('0.02', uri_path='/c/cs')
|
||||
rloc = ip_address(self.nodes[LEADER].get_addr_rloc())
|
||||
leader_aloc = ip_address(self.nodes[LEADER].get_addr_leader_aloc())
|
||||
command.check_coap_message(msg, [steering_data_tlv, commissioner_session_id_tlv], dest_addrs=[rloc, leader_aloc])
|
||||
command.check_coap_message(
|
||||
msg,
|
||||
[steering_data_tlv, commissioner_session_id_tlv],
|
||||
dest_addrs=[rloc, leader_aloc],
|
||||
)
|
||||
|
||||
# Step 5 - Leader sends MGMT_COMMISSIONER_SET.rsp to commissioner
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
msg = leader_messages.next_coap_message('2.04')
|
||||
command.check_coap_message(msg, [mesh_cop.State(mesh_cop.MeshCopState.ACCEPT)])
|
||||
command.check_coap_message(
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.ACCEPT)]
|
||||
)
|
||||
|
||||
# Step 6 - Leader sends a multicast MLE Data Response
|
||||
msg = leader_messages.next_mle_message(mle.CommandType.DATA_RESPONSE)
|
||||
command.check_data_response(msg, command.NetworkDataCheck(
|
||||
commissioning_data_check=command.CommissioningDataCheck(stable=0, sub_tlv_type_list=[mesh_cop.CommissionerSessionId, mesh_cop.SteeringData, mesh_cop.BorderAgentLocator])))
|
||||
command.check_data_response(
|
||||
msg,
|
||||
command.NetworkDataCheck(
|
||||
commissioning_data_check=command.CommissioningDataCheck(
|
||||
stable=0,
|
||||
sub_tlv_type_list=[
|
||||
mesh_cop.CommissionerSessionId,
|
||||
mesh_cop.SteeringData,
|
||||
mesh_cop.BorderAgentLocator,
|
||||
],
|
||||
)
|
||||
),
|
||||
)
|
||||
|
||||
# Step 7 - Harness instructs commissioner to send MGMT_COMMISSIONER_SET.req to Leader
|
||||
# Step 7 - Harness instructs commissioner to send
|
||||
# MGMT_COMMISSIONER_SET.req to Leader
|
||||
border_agent_locator_tlv = mesh_cop.BorderAgentLocator(0x0400)
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs(
|
||||
[commissioner_session_id_tlv, border_agent_locator_tlv])
|
||||
[commissioner_session_id_tlv, border_agent_locator_tlv]
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
# Step 8 - Leader responds to MGMT_COMMISSIONER_SET.req with MGMT_COMMISSIONER_SET.rsp
|
||||
# Step 8 - Leader responds to MGMT_COMMISSIONER_SET.req with
|
||||
# MGMT_COMMISSIONER_SET.rsp
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
msg = leader_messages.next_coap_message('2.04')
|
||||
command.check_coap_message(msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)])
|
||||
command.check_coap_message(
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)]
|
||||
)
|
||||
|
||||
# Step 9 - Harness instructs commissioner to send MGMT_COMMISSIONER_SET.req to Leader
|
||||
# Step 9 - Harness instructs commissioner to send
|
||||
# MGMT_COMMISSIONER_SET.req to Leader
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs(
|
||||
[steering_data_tlv, commissioner_session_id_tlv, border_agent_locator_tlv])
|
||||
[
|
||||
steering_data_tlv,
|
||||
commissioner_session_id_tlv,
|
||||
border_agent_locator_tlv,
|
||||
]
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
# Step 10 - Leader responds to MGMT_COMMISSIONER_SET.req with MGMT_COMMISSIONER_SET.rsp
|
||||
# Step 10 - Leader responds to MGMT_COMMISSIONER_SET.req with
|
||||
# MGMT_COMMISSIONER_SET.rsp
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
msg = leader_messages.next_coap_message('2.04')
|
||||
command.check_coap_message(msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)])
|
||||
command.check_coap_message(
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)]
|
||||
)
|
||||
|
||||
# Step 11 - Harness instructs commissioner to send MGMT_COMMISSIONER_SET.req to Leader
|
||||
# Step 11 - Harness instructs commissioner to send
|
||||
# MGMT_COMMISSIONER_SET.req to Leader
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs(
|
||||
[mesh_cop.CommissionerSessionId(0xFFFF), steering_data_tlv])
|
||||
[mesh_cop.CommissionerSessionId(0xffff), steering_data_tlv]
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
# Step 12 - Leader responds to MGMT_COMMISSIONER_SET.req with MGMT_COMMISSIONER_SET.rsp
|
||||
# Step 12 - Leader responds to MGMT_COMMISSIONER_SET.req with
|
||||
# MGMT_COMMISSIONER_SET.rsp
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
msg = leader_messages.next_coap_message('2.04')
|
||||
command.check_coap_message(msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)])
|
||||
command.check_coap_message(
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.REJECT)]
|
||||
)
|
||||
|
||||
# Step 13 - Harness instructs commissioner to send MGMT_COMMISSIONER_SET.req to Leader
|
||||
# Step 13 - Harness instructs commissioner to send
|
||||
# MGMT_COMMISSIONER_SET.req to Leader
|
||||
self.nodes[COMMISSIONER].commissioner_mgmtset_with_tlvs(
|
||||
[commissioner_session_id_tlv, steering_data_tlv, mesh_cop.Channel(0x0, 0x0)])
|
||||
[
|
||||
commissioner_session_id_tlv,
|
||||
steering_data_tlv,
|
||||
mesh_cop.Channel(0x0, 0x0),
|
||||
]
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
# Step 14 - Leader responds to MGMT_COMMISSIONER_SET.req with MGMT_COMMISSIONER_SET.rsp
|
||||
# Step 14 - Leader responds to MGMT_COMMISSIONER_SET.req with
|
||||
# MGMT_COMMISSIONER_SET.rsp
|
||||
leader_messages = self.simulator.get_messages_sent_by(LEADER)
|
||||
msg = leader_messages.next_coap_message('2.04')
|
||||
command.check_coap_message(msg, [mesh_cop.State(mesh_cop.MeshCopState.ACCEPT)])
|
||||
command.check_coap_message(
|
||||
msg, [mesh_cop.State(mesh_cop.MeshCopState.ACCEPT)]
|
||||
)
|
||||
|
||||
# Step 15 - Send ICMPv6 Echo Request to Leader
|
||||
leader_rloc = self.nodes[LEADER].get_addr_rloc()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -36,26 +35,31 @@ import node
|
||||
COMMISSIONER = 1
|
||||
LEADER = 2
|
||||
|
||||
|
||||
class Cert_9_2_04_ActiveDataset(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(10, panid=0xface, master_key='000102030405060708090a0b0c0d0e0f')
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
10, panid=0xface, master_key='000102030405060708090a0b0c0d0e0f'
|
||||
)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(10, panid=0xface, master_key='000102030405060708090a0b0c0d0e0f')
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
10, panid=0xface, master_key='000102030405060708090a0b0c0d0e0f'
|
||||
)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -70,92 +74,110 @@ class Cert_9_2_04_ActiveDataset(unittest.TestCase):
|
||||
self.nodes[COMMISSIONER].commissioner_start()
|
||||
self.simulator.go(3)
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(active_timestamp=101,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000000',
|
||||
network_name='GRL')
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(
|
||||
active_timestamp=101,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000000',
|
||||
network_name='GRL',
|
||||
)
|
||||
self.simulator.go(3)
|
||||
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
|
||||
|
||||
# Step 6
|
||||
# Attempt to set Channel TLV
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(active_timestamp=102,
|
||||
channel=18,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000001',
|
||||
network_name='threadcert')
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(
|
||||
active_timestamp=102,
|
||||
channel=18,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000001',
|
||||
network_name='threadcert',
|
||||
)
|
||||
self.simulator.go(3)
|
||||
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
|
||||
|
||||
# Step 8
|
||||
# Attempt to set Mesh Local Prefix TLV
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(active_timestamp=103,
|
||||
channel_mask=0x001ffee0,
|
||||
extended_panid='000db70000000000',
|
||||
mesh_local='fd00:0db7::',
|
||||
network_name='UL')
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(
|
||||
active_timestamp=103,
|
||||
channel_mask=0x001ffee0,
|
||||
extended_panid='000db70000000000',
|
||||
mesh_local='fd00:0db7::',
|
||||
network_name='UL',
|
||||
)
|
||||
self.simulator.go(3)
|
||||
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
|
||||
|
||||
# Step 10
|
||||
# Attempt to set Network Master Key TLV
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(active_timestamp=104,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000000',
|
||||
master_key='00112233445566778899aabbccddeeff',
|
||||
mesh_local='fd00:0db7::',
|
||||
network_name='UL')
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(
|
||||
active_timestamp=104,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000000',
|
||||
master_key='00112233445566778899aabbccddeeff',
|
||||
mesh_local='fd00:0db7::',
|
||||
network_name='UL',
|
||||
)
|
||||
self.simulator.go(3)
|
||||
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
|
||||
|
||||
# Step 12
|
||||
# Attempt to set PAN ID TLV
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(active_timestamp=105,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000000',
|
||||
master_key='00112233445566778899aabbccddeeff',
|
||||
mesh_local='fd00:0db7::',
|
||||
network_name='UL',
|
||||
panid=0xafce)
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(
|
||||
active_timestamp=105,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000000',
|
||||
master_key='00112233445566778899aabbccddeeff',
|
||||
mesh_local='fd00:0db7::',
|
||||
network_name='UL',
|
||||
panid=0xafce,
|
||||
)
|
||||
self.simulator.go(3)
|
||||
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
|
||||
|
||||
# Step 14
|
||||
# Invalid Commissioner Session ID
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(active_timestamp=106,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000000',
|
||||
network_name='UL',
|
||||
binary='0b02abcd')
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(
|
||||
active_timestamp=106,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000000',
|
||||
network_name='UL',
|
||||
binary='0b02abcd',
|
||||
)
|
||||
self.simulator.go(3)
|
||||
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
|
||||
|
||||
# Step 16
|
||||
# Old Active Timestamp
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(active_timestamp=101,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000000',
|
||||
network_name='UL')
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(
|
||||
active_timestamp=101,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000000',
|
||||
network_name='UL',
|
||||
)
|
||||
self.simulator.go(3)
|
||||
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
|
||||
|
||||
# Step 18
|
||||
# Unexpected Steering Data TLV
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(active_timestamp=107,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000000',
|
||||
network_name='UL',
|
||||
binary='0806113320440000')
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(
|
||||
active_timestamp=107,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000000',
|
||||
network_name='UL',
|
||||
binary='0806113320440000',
|
||||
)
|
||||
self.simulator.go(3)
|
||||
self.assertEqual(self.nodes[LEADER].get_network_name(), 'UL')
|
||||
|
||||
# Step 20
|
||||
# Undefined TLV
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(active_timestamp=108,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000000',
|
||||
network_name='GRL',
|
||||
binary='8202aa55')
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(
|
||||
active_timestamp=108,
|
||||
channel_mask=0x001fffe0,
|
||||
extended_panid='000db70000000000',
|
||||
network_name='GRL',
|
||||
binary='8202aa55',
|
||||
)
|
||||
self.simulator.go(3)
|
||||
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
|
||||
|
||||
@@ -163,5 +185,6 @@ class Cert_9_2_04_ActiveDataset(unittest.TestCase):
|
||||
for ipaddr in ipaddrs:
|
||||
self.assertTrue(self.nodes[LEADER].ping(ipaddr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -47,12 +46,13 @@ ROUTER_PENDING_ACTIVE_TIMESTAMP = 25
|
||||
COMMISSIONER_PENDING_CHANNEL = 20
|
||||
COMMISSIONER_PENDING_PANID = 0xafce
|
||||
|
||||
|
||||
class Cert_9_2_7_DelayTimer(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,4):
|
||||
for i in range(1, 4):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(LEADER_ACTIVE_TIMESTAMP)
|
||||
@@ -70,7 +70,9 @@ class Cert_9_2_7_DelayTimer(unittest.TestCase):
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER].set_active_dataset(ROUTER_ACTIVE_TIMESTAMP)
|
||||
self.nodes[ROUTER].set_pending_dataset(ROUTER_PENDING_TIMESTAMP, ROUTER_PENDING_ACTIVE_TIMESTAMP)
|
||||
self.nodes[ROUTER].set_pending_dataset(
|
||||
ROUTER_PENDING_TIMESTAMP, ROUTER_PENDING_ACTIVE_TIMESTAMP
|
||||
)
|
||||
self.nodes[ROUTER].set_mode('rsdn')
|
||||
self.nodes[ROUTER].set_panid(PANID_INIT)
|
||||
self.nodes[ROUTER].set_partition_id(0x1)
|
||||
@@ -78,9 +80,9 @@ class Cert_9_2_7_DelayTimer(unittest.TestCase):
|
||||
self.nodes[ROUTER].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -112,19 +114,34 @@ class Cert_9_2_7_DelayTimer(unittest.TestCase):
|
||||
break
|
||||
self.assertTrue(self.nodes[LEADER].ping(ipaddr))
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(pending_timestamp=40,
|
||||
active_timestamp=80,
|
||||
delay_timer=10000,
|
||||
channel=COMMISSIONER_PENDING_CHANNEL,
|
||||
panid=COMMISSIONER_PENDING_PANID)
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(
|
||||
pending_timestamp=40,
|
||||
active_timestamp=80,
|
||||
delay_timer=10000,
|
||||
channel=COMMISSIONER_PENDING_CHANNEL,
|
||||
panid=COMMISSIONER_PENDING_PANID,
|
||||
)
|
||||
self.simulator.go(40)
|
||||
self.assertEqual(self.nodes[LEADER].get_panid(), COMMISSIONER_PENDING_PANID)
|
||||
self.assertEqual(self.nodes[COMMISSIONER].get_panid(), COMMISSIONER_PENDING_PANID)
|
||||
self.assertEqual(self.nodes[ROUTER].get_panid(), COMMISSIONER_PENDING_PANID)
|
||||
self.assertEqual(
|
||||
self.nodes[LEADER].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[COMMISSIONER].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[ROUTER].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
|
||||
self.assertEqual(self.nodes[LEADER].get_channel(), COMMISSIONER_PENDING_CHANNEL)
|
||||
self.assertEqual(self.nodes[COMMISSIONER].get_channel(), COMMISSIONER_PENDING_CHANNEL)
|
||||
self.assertEqual(self.nodes[ROUTER].get_channel(), COMMISSIONER_PENDING_CHANNEL)
|
||||
self.assertEqual(
|
||||
self.nodes[LEADER].get_channel(), COMMISSIONER_PENDING_CHANNEL
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[COMMISSIONER].get_channel(),
|
||||
COMMISSIONER_PENDING_CHANNEL,
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[ROUTER].get_channel(), COMMISSIONER_PENDING_CHANNEL
|
||||
)
|
||||
|
||||
ipaddrs = self.nodes[ROUTER].get_addrs()
|
||||
for ipaddr in ipaddrs:
|
||||
@@ -132,5 +149,6 @@ class Cert_9_2_7_DelayTimer(unittest.TestCase):
|
||||
break
|
||||
self.assertTrue(self.nodes[LEADER].ping(ipaddr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -48,21 +47,26 @@ COMMISSIONER_PENDING_PANID = 0xafce
|
||||
|
||||
MTDS = [ED, SED]
|
||||
|
||||
|
||||
class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,6):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(LEADER_ACTIVE_TIMESTAMP, panid=PANID_INIT, channel=CHANNEL_INIT)
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
LEADER_ACTIVE_TIMESTAMP, panid=PANID_INIT, channel=CHANNEL_INIT
|
||||
)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(LEADER_ACTIVE_TIMESTAMP, panid=PANID_INIT, channel=CHANNEL_INIT)
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
LEADER_ACTIVE_TIMESTAMP, panid=PANID_INIT, channel=CHANNEL_INIT
|
||||
)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[ROUTER].get_addr64())
|
||||
@@ -70,7 +74,9 @@ class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[SED].get_addr64())
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
|
||||
self.nodes[ROUTER].set_active_dataset(LEADER_ACTIVE_TIMESTAMP, panid=PANID_INIT, channel=CHANNEL_INIT)
|
||||
self.nodes[ROUTER].set_active_dataset(
|
||||
LEADER_ACTIVE_TIMESTAMP, panid=PANID_INIT, channel=CHANNEL_INIT
|
||||
)
|
||||
self.nodes[ROUTER].set_mode('rsdn')
|
||||
self._setUpRouter()
|
||||
|
||||
@@ -100,9 +106,9 @@ class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
|
||||
self.nodes[SED].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
|
||||
def test(self):
|
||||
self.nodes[LEADER].start()
|
||||
@@ -128,11 +134,13 @@ class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
|
||||
self.nodes[COMMISSIONER].commissioner_start()
|
||||
self.simulator.go(3)
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(pending_timestamp=10,
|
||||
active_timestamp=70,
|
||||
delay_timer=60000,
|
||||
channel=COMMISSIONER_PENDING_CHANNEL,
|
||||
panid=COMMISSIONER_PENDING_PANID)
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(
|
||||
pending_timestamp=10,
|
||||
active_timestamp=70,
|
||||
delay_timer=60000,
|
||||
channel=COMMISSIONER_PENDING_CHANNEL,
|
||||
panid=COMMISSIONER_PENDING_PANID,
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[ROUTER].reset()
|
||||
@@ -141,13 +149,23 @@ class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
|
||||
|
||||
self.simulator.go(60)
|
||||
|
||||
self.assertEqual(self.nodes[LEADER].get_panid(), COMMISSIONER_PENDING_PANID)
|
||||
self.assertEqual(self.nodes[COMMISSIONER].get_panid(), COMMISSIONER_PENDING_PANID)
|
||||
self.assertEqual(
|
||||
self.nodes[LEADER].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[COMMISSIONER].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
|
||||
self.assertEqual(self.nodes[LEADER].get_channel(), COMMISSIONER_PENDING_CHANNEL)
|
||||
self.assertEqual(self.nodes[COMMISSIONER].get_channel(), COMMISSIONER_PENDING_CHANNEL)
|
||||
|
||||
# reset the devices here again to simulate the fact that the devices were disabled the entire time
|
||||
self.assertEqual(
|
||||
self.nodes[LEADER].get_channel(), COMMISSIONER_PENDING_CHANNEL
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[COMMISSIONER].get_channel(),
|
||||
COMMISSIONER_PENDING_CHANNEL,
|
||||
)
|
||||
|
||||
# reset the devices here again to simulate the fact that the devices
|
||||
# were disabled the entire time
|
||||
self.nodes[ROUTER].reset()
|
||||
self._setUpRouter()
|
||||
self.nodes[ROUTER].start()
|
||||
@@ -168,13 +186,25 @@ class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
|
||||
|
||||
self.simulator.go(10)
|
||||
|
||||
self.assertEqual(self.nodes[ROUTER].get_panid(), COMMISSIONER_PENDING_PANID)
|
||||
self.assertEqual(self.nodes[ED].get_panid(), COMMISSIONER_PENDING_PANID)
|
||||
self.assertEqual(self.nodes[SED].get_panid(), COMMISSIONER_PENDING_PANID)
|
||||
self.assertEqual(
|
||||
self.nodes[ROUTER].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[ED].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[SED].get_panid(), COMMISSIONER_PENDING_PANID
|
||||
)
|
||||
|
||||
self.assertEqual(self.nodes[ROUTER].get_channel(), COMMISSIONER_PENDING_CHANNEL)
|
||||
self.assertEqual(self.nodes[ED].get_channel(), COMMISSIONER_PENDING_CHANNEL)
|
||||
self.assertEqual(self.nodes[SED].get_channel(), COMMISSIONER_PENDING_CHANNEL)
|
||||
self.assertEqual(
|
||||
self.nodes[ROUTER].get_channel(), COMMISSIONER_PENDING_CHANNEL
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[ED].get_channel(), COMMISSIONER_PENDING_CHANNEL
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[SED].get_channel(), COMMISSIONER_PENDING_CHANNEL
|
||||
)
|
||||
|
||||
self.simulator.go(5)
|
||||
|
||||
@@ -182,7 +212,7 @@ class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
|
||||
for ipaddr in ipaddrs:
|
||||
if ipaddr[0:4] != 'fe80':
|
||||
self.assertTrue(self.nodes[LEADER].ping(ipaddr))
|
||||
|
||||
|
||||
ipaddrs = self.nodes[ED].get_addrs()
|
||||
for ipaddr in ipaddrs:
|
||||
if ipaddr[0:4] != 'fe80':
|
||||
@@ -193,5 +223,6 @@ class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
|
||||
if ipaddr[0:4] != 'fe80':
|
||||
self.assertTrue(self.nodes[LEADER].ping(ipaddr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -44,21 +43,26 @@ LEADER = 2
|
||||
ROUTER1 = 3
|
||||
ROUTER2 = 4
|
||||
|
||||
|
||||
class Cert_9_2_09_PendingPartition(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(10, channel=CHANNEL_INIT, panid=PANID_INIT)
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
10, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(10, channel=CHANNEL_INIT, panid=PANID_INIT)
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
10, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].set_partition_id(0xffffffff)
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
@@ -66,14 +70,18 @@ class Cert_9_2_09_PendingPartition(unittest.TestCase):
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER1].set_active_dataset(10, channel=CHANNEL_INIT, panid=PANID_INIT)
|
||||
self.nodes[ROUTER1].set_active_dataset(
|
||||
10, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[ROUTER1].set_mode('rsdn')
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[ROUTER2].get_addr64())
|
||||
self.nodes[ROUTER1].enable_whitelist()
|
||||
self.nodes[ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER2].set_active_dataset(10, channel=CHANNEL_INIT, panid=PANID_INIT)
|
||||
self.nodes[ROUTER2].set_active_dataset(
|
||||
10, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[ROUTER2].set_mode('rsdn')
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[ROUTER1].get_addr64())
|
||||
self.nodes[ROUTER2].enable_whitelist()
|
||||
@@ -81,9 +89,9 @@ class Cert_9_2_09_PendingPartition(unittest.TestCase):
|
||||
self.nodes[ROUTER2].set_network_id_timeout(100)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -105,11 +113,13 @@ class Cert_9_2_09_PendingPartition(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(pending_timestamp=30,
|
||||
active_timestamp=210,
|
||||
delay_timer=500000,
|
||||
channel=20,
|
||||
panid=0xafce)
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(
|
||||
pending_timestamp=30,
|
||||
active_timestamp=210,
|
||||
delay_timer=500000,
|
||||
channel=20,
|
||||
panid=0xafce,
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[LEADER].remove_whitelist(self.nodes[ROUTER1].get_addr64())
|
||||
@@ -119,11 +129,13 @@ class Cert_9_2_09_PendingPartition(unittest.TestCase):
|
||||
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
|
||||
self.assertEqual(self.nodes[ROUTER2].get_state(), 'leader')
|
||||
|
||||
self.nodes[ROUTER2].send_mgmt_pending_set(pending_timestamp=50,
|
||||
active_timestamp=410,
|
||||
delay_timer=200000,
|
||||
channel=CHANNEL_FINAL,
|
||||
panid=PANID_FINAL)
|
||||
self.nodes[ROUTER2].send_mgmt_pending_set(
|
||||
pending_timestamp=50,
|
||||
active_timestamp=410,
|
||||
delay_timer=200000,
|
||||
channel=CHANNEL_FINAL,
|
||||
panid=PANID_FINAL,
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[ROUTER1].get_addr64())
|
||||
@@ -150,5 +162,6 @@ class Cert_9_2_09_PendingPartition(unittest.TestCase):
|
||||
|
||||
self.assertTrue(self.nodes[LEADER].ping(ipaddr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -47,21 +46,26 @@ SED1 = 5
|
||||
|
||||
MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_9_2_10_PendingPartition(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,6):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(15, channel=CHANNEL_INIT, panid=PANID_INIT)
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
15, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(15, channel=CHANNEL_INIT, panid=PANID_INIT)
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
15, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].set_partition_id(0xffffffff)
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
@@ -69,7 +73,9 @@ class Cert_9_2_10_PendingPartition(unittest.TestCase):
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER1].set_active_dataset(15, channel=CHANNEL_INIT, panid=PANID_INIT)
|
||||
self.nodes[ROUTER1].set_active_dataset(
|
||||
15, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[ROUTER1].set_mode('rsdn')
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[ED1].get_addr64())
|
||||
@@ -91,9 +97,9 @@ class Cert_9_2_10_PendingPartition(unittest.TestCase):
|
||||
self.nodes[SED1].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -119,11 +125,13 @@ class Cert_9_2_10_PendingPartition(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[SED1].get_state(), 'child')
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(pending_timestamp=30,
|
||||
active_timestamp=165,
|
||||
delay_timer=150000,
|
||||
channel=CHANNEL_FINAL,
|
||||
panid=PANID_FINAL)
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(
|
||||
pending_timestamp=30,
|
||||
active_timestamp=165,
|
||||
delay_timer=150000,
|
||||
channel=CHANNEL_FINAL,
|
||||
panid=PANID_FINAL,
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
print(self.nodes[COMMISSIONER].get_channel())
|
||||
@@ -171,5 +179,6 @@ class Cert_9_2_10_PendingPartition(unittest.TestCase):
|
||||
|
||||
self.assertTrue(self.nodes[LEADER].ping(ipaddr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -47,28 +46,35 @@ SED1 = 5
|
||||
|
||||
MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_9_2_11_MasterKey(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,6):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(10, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1)
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
10, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1
|
||||
)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(10, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1)
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
10, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1
|
||||
)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[ROUTER1].get_addr64())
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER1].set_active_dataset(10, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1)
|
||||
self.nodes[ROUTER1].set_active_dataset(
|
||||
10, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1
|
||||
)
|
||||
self.nodes[ROUTER1].set_mode('rsdn')
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[ED1].get_addr64())
|
||||
@@ -92,9 +98,9 @@ class Cert_9_2_11_MasterKey(unittest.TestCase):
|
||||
self.nodes[SED1].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -120,10 +126,12 @@ class Cert_9_2_11_MasterKey(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[SED1].get_state(), 'child')
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(pending_timestamp=10,
|
||||
active_timestamp=70,
|
||||
delay_timer=10000,
|
||||
master_key=KEY2)
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(
|
||||
pending_timestamp=10,
|
||||
active_timestamp=70,
|
||||
delay_timer=10000,
|
||||
master_key=KEY2,
|
||||
)
|
||||
self.simulator.go(310)
|
||||
|
||||
print(self.nodes[COMMISSIONER].get_masterkey())
|
||||
@@ -143,10 +151,12 @@ class Cert_9_2_11_MasterKey(unittest.TestCase):
|
||||
if ipaddr[0:4] != 'fe80':
|
||||
self.assertTrue(self.nodes[LEADER].ping(ipaddr))
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(pending_timestamp=20,
|
||||
active_timestamp=30,
|
||||
delay_timer=10000,
|
||||
master_key=KEY1)
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(
|
||||
pending_timestamp=20,
|
||||
active_timestamp=30,
|
||||
delay_timer=10000,
|
||||
master_key=KEY1,
|
||||
)
|
||||
self.simulator.go(310)
|
||||
|
||||
print(self.nodes[COMMISSIONER].get_masterkey())
|
||||
@@ -166,5 +176,6 @@ class Cert_9_2_11_MasterKey(unittest.TestCase):
|
||||
if ipaddr[0:4] != 'fe80':
|
||||
self.assertTrue(self.nodes[LEADER].ping(ipaddr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -47,34 +46,43 @@ DATASET2_TIMESTAMP = 10
|
||||
DATASET2_CHANNEL = 12
|
||||
DATASET2_PANID = 0xafce
|
||||
|
||||
|
||||
class Cert_9_2_12_Announce(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,6):
|
||||
for i in range(1, 6):
|
||||
self.nodes[i] = node.Node(i, (i == MED), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER1].set_active_dataset(DATASET1_TIMESTAMP, channel=DATASET1_CHANNEL, panid=DATASET1_PANID)
|
||||
self.nodes[LEADER1].set_active_dataset(
|
||||
DATASET1_TIMESTAMP, channel=DATASET1_CHANNEL, panid=DATASET1_PANID
|
||||
)
|
||||
self.nodes[LEADER1].set_mode('rsdn')
|
||||
self.nodes[LEADER1].add_whitelist(self.nodes[ROUTER1].get_addr64())
|
||||
self.nodes[LEADER1].enable_whitelist()
|
||||
|
||||
self.nodes[ROUTER1].set_active_dataset(DATASET1_TIMESTAMP, channel=DATASET1_CHANNEL, panid=DATASET1_PANID)
|
||||
self.nodes[ROUTER1].set_active_dataset(
|
||||
DATASET1_TIMESTAMP, channel=DATASET1_CHANNEL, panid=DATASET1_PANID
|
||||
)
|
||||
self.nodes[ROUTER1].set_mode('rsdn')
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER1].get_addr64())
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER2].get_addr64())
|
||||
self.nodes[ROUTER1].enable_whitelist()
|
||||
self.nodes[ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER2].set_active_dataset(DATASET2_TIMESTAMP, channel=DATASET2_CHANNEL, panid=DATASET2_PANID)
|
||||
self.nodes[LEADER2].set_active_dataset(
|
||||
DATASET2_TIMESTAMP, channel=DATASET2_CHANNEL, panid=DATASET2_PANID
|
||||
)
|
||||
self.nodes[LEADER2].set_mode('rsdn')
|
||||
self.nodes[LEADER2].add_whitelist(self.nodes[ROUTER1].get_addr64())
|
||||
self.nodes[LEADER2].add_whitelist(self.nodes[ROUTER2].get_addr64())
|
||||
self.nodes[LEADER2].enable_whitelist()
|
||||
self.nodes[LEADER2].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER2].set_active_dataset(DATASET2_TIMESTAMP, channel=DATASET2_CHANNEL, panid=DATASET2_PANID)
|
||||
self.nodes[ROUTER2].set_active_dataset(
|
||||
DATASET2_TIMESTAMP, channel=DATASET2_CHANNEL, panid=DATASET2_PANID
|
||||
)
|
||||
self.nodes[ROUTER2].set_mode('rsdn')
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[LEADER2].get_addr64())
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[MED].get_addr64())
|
||||
@@ -88,9 +96,9 @@ class Cert_9_2_12_Announce(unittest.TestCase):
|
||||
self.nodes[MED].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -132,5 +140,6 @@ class Cert_9_2_12_Announce(unittest.TestCase):
|
||||
if ipaddr[0:4] != 'fe80':
|
||||
self.assertTrue(self.nodes[LEADER1].ping(ipaddr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -38,12 +37,13 @@ LEADER = 2
|
||||
ROUTER1 = 3
|
||||
ED1 = 4
|
||||
|
||||
|
||||
class Cert_9_2_13_EnergyScan(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, (i == ED1), simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_panid(0xface)
|
||||
@@ -71,9 +71,9 @@ class Cert_9_2_13_EnergyScan(unittest.TestCase):
|
||||
self.nodes[ED1].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -101,7 +101,9 @@ class Cert_9_2_13_EnergyScan(unittest.TestCase):
|
||||
break
|
||||
|
||||
self.assertTrue(self.nodes[COMMISSIONER].ping(ipaddr))
|
||||
self.nodes[COMMISSIONER].energy_scan(0x50000, 0x02, 0x20, 0x3e8, ipaddr)
|
||||
self.nodes[COMMISSIONER].energy_scan(
|
||||
0x50000, 0x02, 0x20, 0x3E8, ipaddr
|
||||
)
|
||||
|
||||
ipaddrs = self.nodes[ED1].get_addrs()
|
||||
for ipaddr in ipaddrs:
|
||||
@@ -109,11 +111,16 @@ class Cert_9_2_13_EnergyScan(unittest.TestCase):
|
||||
break
|
||||
|
||||
self.assertTrue(self.nodes[COMMISSIONER].ping(ipaddr))
|
||||
self.nodes[COMMISSIONER].energy_scan(0x50000, 0x02, 0x20, 0x3e8, ipaddr)
|
||||
self.nodes[COMMISSIONER].energy_scan(
|
||||
0x50000, 0x02, 0x20, 0x3E8, ipaddr
|
||||
)
|
||||
|
||||
self.nodes[COMMISSIONER].energy_scan(0x50000, 0x02, 0x20, 0x3e8, 'ff33:0040:fdde:ad00:beef:0:0:1')
|
||||
self.nodes[COMMISSIONER].energy_scan(
|
||||
0x50000, 0x02, 0x20, 0x3E8, 'ff33:0040:fdde:ad00:beef:0:0:1'
|
||||
)
|
||||
|
||||
self.assertTrue(self.nodes[COMMISSIONER].ping(ipaddr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -38,23 +37,28 @@ LEADER1 = 2
|
||||
ROUTER1 = 3
|
||||
LEADER2 = 4
|
||||
|
||||
|
||||
class Cert_9_2_14_PanIdQuery(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_panid(0xface)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER1].get_addr64())
|
||||
self.nodes[COMMISSIONER].add_whitelist(
|
||||
self.nodes[LEADER1].get_addr64()
|
||||
)
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER1].set_panid(0xface)
|
||||
self.nodes[LEADER1].set_mode('rsdn')
|
||||
self.nodes[LEADER1].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
self.nodes[LEADER1].add_whitelist(
|
||||
self.nodes[COMMISSIONER].get_addr64()
|
||||
)
|
||||
self.nodes[LEADER1].add_whitelist(self.nodes[ROUTER1].get_addr64())
|
||||
self.nodes[LEADER1].enable_whitelist()
|
||||
|
||||
@@ -71,9 +75,9 @@ class Cert_9_2_14_PanIdQuery(unittest.TestCase):
|
||||
self.nodes[LEADER2].enable_whitelist()
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -102,9 +106,12 @@ class Cert_9_2_14_PanIdQuery(unittest.TestCase):
|
||||
|
||||
self.nodes[COMMISSIONER].panid_query(0xdead, 0xffffffff, ipaddr)
|
||||
|
||||
self.nodes[COMMISSIONER].panid_query(0xdead, 0xffffffff, 'ff33:0040:fdde:ad00:beef:0:0:1')
|
||||
self.nodes[COMMISSIONER].panid_query(
|
||||
0xdead, 0xffffffff, 'ff33:0040:fdde:ad00:beef:0:0:1'
|
||||
)
|
||||
|
||||
self.assertTrue(self.nodes[COMMISSIONER].ping(ipaddr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -43,21 +42,26 @@ LEADER = 2
|
||||
ROUTER1 = 3
|
||||
ROUTER2 = 4
|
||||
|
||||
|
||||
class Cert_9_2_15_PendingPartition(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(15, channel=CHANNEL_INIT, panid=PANID_INIT)
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
15, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(15, channel=CHANNEL_INIT, panid=PANID_INIT)
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
15, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].set_partition_id(0xffffffff)
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
@@ -65,14 +69,18 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER1].set_active_dataset(15, channel=CHANNEL_INIT, panid=PANID_INIT)
|
||||
self.nodes[ROUTER1].set_active_dataset(
|
||||
15, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[ROUTER1].set_mode('rsdn')
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[ROUTER2].get_addr64())
|
||||
self.nodes[ROUTER1].enable_whitelist()
|
||||
self.nodes[ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER2].set_active_dataset(15, channel=CHANNEL_INIT, panid=PANID_INIT)
|
||||
self.nodes[ROUTER2].set_active_dataset(
|
||||
15, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[ROUTER2].set_mode('rsdn')
|
||||
self._setUpRouter2()
|
||||
|
||||
@@ -82,9 +90,9 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -102,10 +110,12 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(pending_timestamp=10,
|
||||
active_timestamp=70,
|
||||
delay_timer=600000,
|
||||
mesh_local='fd00:0db9::')
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(
|
||||
pending_timestamp=10,
|
||||
active_timestamp=70,
|
||||
delay_timer=600000,
|
||||
mesh_local='fd00:0db9::',
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[ROUTER2].start()
|
||||
@@ -115,11 +125,13 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
|
||||
self.nodes[ROUTER2].reset()
|
||||
self._setUpRouter2()
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(pending_timestamp=20,
|
||||
active_timestamp=80,
|
||||
delay_timer=200000,
|
||||
mesh_local='fd00:0db7::',
|
||||
panid=PANID_FINAL)
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(
|
||||
pending_timestamp=20,
|
||||
active_timestamp=80,
|
||||
delay_timer=200000,
|
||||
mesh_local='fd00:0db7::',
|
||||
panid=PANID_FINAL,
|
||||
)
|
||||
self.simulator.go(100)
|
||||
|
||||
self.nodes[ROUTER2].start()
|
||||
@@ -138,5 +150,6 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
|
||||
break
|
||||
self.assertTrue(self.nodes[LEADER].ping(ipaddr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -44,21 +43,26 @@ LEADER = 2
|
||||
ROUTER1 = 3
|
||||
ROUTER2 = 4
|
||||
|
||||
|
||||
class Cert_9_2_16_ActivePendingPartition(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,5):
|
||||
for i in range(1, 5):
|
||||
self.nodes[i] = node.Node(i, simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(1, channel=CHANNEL_INIT, panid=PANID_INIT)
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(1, channel=CHANNEL_INIT, panid=PANID_INIT)
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].set_partition_id(0xffffffff)
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
@@ -66,14 +70,18 @@ class Cert_9_2_16_ActivePendingPartition(unittest.TestCase):
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER1].set_active_dataset(1, channel=CHANNEL_INIT, panid=PANID_INIT)
|
||||
self.nodes[ROUTER1].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[ROUTER1].set_mode('rsdn')
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[ROUTER2].get_addr64())
|
||||
self.nodes[ROUTER1].enable_whitelist()
|
||||
self.nodes[ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER2].set_active_dataset(1, channel=CHANNEL_INIT, panid=PANID_INIT)
|
||||
self.nodes[ROUTER2].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT
|
||||
)
|
||||
self.nodes[ROUTER2].set_mode('rsdn')
|
||||
self._setUpRouter2()
|
||||
|
||||
@@ -83,9 +91,9 @@ class Cert_9_2_16_ActivePendingPartition(unittest.TestCase):
|
||||
self.nodes[ROUTER2].set_router_selection_jitter(1)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -103,10 +111,12 @@ class Cert_9_2_16_ActivePendingPartition(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(pending_timestamp=10,
|
||||
active_timestamp=10,
|
||||
delay_timer=600000,
|
||||
mesh_local='fd00:0db9::')
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(
|
||||
pending_timestamp=10,
|
||||
active_timestamp=10,
|
||||
delay_timer=600000,
|
||||
mesh_local='fd00:0db9::',
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[ROUTER2].start()
|
||||
@@ -116,25 +126,36 @@ class Cert_9_2_16_ActivePendingPartition(unittest.TestCase):
|
||||
self.nodes[ROUTER2].reset()
|
||||
self._setUpRouter2()
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(pending_timestamp=20,
|
||||
active_timestamp=20,
|
||||
delay_timer=200000,
|
||||
mesh_local='fd00:0db7::',
|
||||
panid=PANID_FINAL)
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(
|
||||
pending_timestamp=20,
|
||||
active_timestamp=20,
|
||||
delay_timer=200000,
|
||||
mesh_local='fd00:0db7::',
|
||||
panid=PANID_FINAL,
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(active_timestamp=15,
|
||||
network_name='threadCert')
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(
|
||||
active_timestamp=15, network_name='threadCert'
|
||||
)
|
||||
self.simulator.go(100)
|
||||
|
||||
self.nodes[ROUTER2].start()
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
|
||||
|
||||
self.assertEqual(self.nodes[COMMISSIONER].get_network_name(), NETWORK_NAME_FINAL)
|
||||
self.assertEqual(self.nodes[LEADER].get_network_name(), NETWORK_NAME_FINAL)
|
||||
self.assertEqual(self.nodes[ROUTER1].get_network_name(), NETWORK_NAME_FINAL)
|
||||
self.assertEqual(self.nodes[ROUTER2].get_network_name(), NETWORK_NAME_FINAL)
|
||||
self.assertEqual(
|
||||
self.nodes[COMMISSIONER].get_network_name(), NETWORK_NAME_FINAL
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[LEADER].get_network_name(), NETWORK_NAME_FINAL
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[ROUTER1].get_network_name(), NETWORK_NAME_FINAL
|
||||
)
|
||||
self.assertEqual(
|
||||
self.nodes[ROUTER2].get_network_name(), NETWORK_NAME_FINAL
|
||||
)
|
||||
|
||||
self.simulator.go(100)
|
||||
|
||||
@@ -149,5 +170,6 @@ class Cert_9_2_16_ActivePendingPartition(unittest.TestCase):
|
||||
break
|
||||
self.assertTrue(self.nodes[LEADER].ping(ipaddr))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -42,21 +41,26 @@ LEADER1 = 1
|
||||
LEADER2 = 2
|
||||
ED1 = 3
|
||||
|
||||
|
||||
class Cert_9_2_17_Orphan(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,4):
|
||||
for i in range(1, 4):
|
||||
self.nodes[i] = node.Node(i, (i == ED1), simulator=self.simulator)
|
||||
|
||||
self.nodes[LEADER1].set_active_dataset(10, channel=CHANNEL1, panid=PANID_INIT, channel_mask=CHANNEL_MASK)
|
||||
self.nodes[LEADER1].set_active_dataset(
|
||||
10, channel=CHANNEL1, panid=PANID_INIT, channel_mask=CHANNEL_MASK
|
||||
)
|
||||
self.nodes[LEADER1].set_mode('rsdn')
|
||||
self.nodes[LEADER1].add_whitelist(self.nodes[ED1].get_addr64())
|
||||
self.nodes[LEADER1].enable_whitelist()
|
||||
self.nodes[LEADER1].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER2].set_active_dataset(20, channel=CHANNEL2, panid=PANID_INIT, channel_mask=CHANNEL_MASK)
|
||||
self.nodes[LEADER2].set_active_dataset(
|
||||
20, channel=CHANNEL2, panid=PANID_INIT, channel_mask=CHANNEL_MASK
|
||||
)
|
||||
self.nodes[LEADER2].set_mode('rsdn')
|
||||
self.nodes[LEADER2].enable_whitelist()
|
||||
self.nodes[LEADER2].set_router_selection_jitter(1)
|
||||
@@ -69,9 +73,9 @@ class Cert_9_2_17_Orphan(unittest.TestCase):
|
||||
self.nodes[ED1].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
self.simulator.stop()
|
||||
|
||||
def test(self):
|
||||
@@ -95,5 +99,6 @@ class Cert_9_2_17_Orphan(unittest.TestCase):
|
||||
self.assertEqual(self.nodes[ED1].get_state(), 'child')
|
||||
self.assertEqual(self.nodes[ED1].get_channel(), CHANNEL2)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import config
|
||||
@@ -48,21 +47,26 @@ SED1 = 6
|
||||
|
||||
MTDS = [ED1, SED1]
|
||||
|
||||
|
||||
class Cert_9_2_18_RollBackActiveTimestamp(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.simulator = config.create_default_simulator()
|
||||
|
||||
self.nodes = {}
|
||||
for i in range(1,7):
|
||||
for i in range(1, 7):
|
||||
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
|
||||
|
||||
self.nodes[COMMISSIONER].set_active_dataset(1, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1)
|
||||
self.nodes[COMMISSIONER].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1
|
||||
)
|
||||
self.nodes[COMMISSIONER].set_mode('rsdn')
|
||||
self.nodes[COMMISSIONER].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[COMMISSIONER].enable_whitelist()
|
||||
self.nodes[COMMISSIONER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[LEADER].set_active_dataset(1, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1)
|
||||
self.nodes[LEADER].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1
|
||||
)
|
||||
self.nodes[LEADER].set_mode('rsdn')
|
||||
self.nodes[LEADER].set_partition_id(0xffffffff)
|
||||
self.nodes[LEADER].add_whitelist(self.nodes[COMMISSIONER].get_addr64())
|
||||
@@ -70,7 +74,9 @@ class Cert_9_2_18_RollBackActiveTimestamp(unittest.TestCase):
|
||||
self.nodes[LEADER].enable_whitelist()
|
||||
self.nodes[LEADER].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER1].set_active_dataset(1, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1)
|
||||
self.nodes[ROUTER1].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1
|
||||
)
|
||||
self.nodes[ROUTER1].set_mode('rsdn')
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64())
|
||||
self.nodes[ROUTER1].add_whitelist(self.nodes[ROUTER2].get_addr64())
|
||||
@@ -79,7 +85,9 @@ class Cert_9_2_18_RollBackActiveTimestamp(unittest.TestCase):
|
||||
self.nodes[ROUTER1].enable_whitelist()
|
||||
self.nodes[ROUTER1].set_router_selection_jitter(1)
|
||||
|
||||
self.nodes[ROUTER2].set_active_dataset(1, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1)
|
||||
self.nodes[ROUTER2].set_active_dataset(
|
||||
1, channel=CHANNEL_INIT, panid=PANID_INIT, master_key=KEY1
|
||||
)
|
||||
self.nodes[ROUTER2].set_mode('rsdn')
|
||||
self.nodes[ROUTER2].add_whitelist(self.nodes[ROUTER1].get_addr64())
|
||||
self.nodes[ROUTER2].enable_whitelist()
|
||||
@@ -101,9 +109,9 @@ class Cert_9_2_18_RollBackActiveTimestamp(unittest.TestCase):
|
||||
self.nodes[SED1].set_timeout(config.DEFAULT_CHILD_TIMEOUT)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
|
||||
def test(self):
|
||||
self.nodes[LEADER].start()
|
||||
@@ -128,21 +136,26 @@ class Cert_9_2_18_RollBackActiveTimestamp(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[SED1].get_state(), 'child')
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(active_timestamp=20000,
|
||||
network_name='GRL')
|
||||
self.nodes[COMMISSIONER].send_mgmt_active_set(
|
||||
active_timestamp=20000, network_name='GRL'
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(pending_timestamp=20,
|
||||
active_timestamp=20,
|
||||
delay_timer=20000,
|
||||
network_name='Shouldnotbe')
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(
|
||||
pending_timestamp=20,
|
||||
active_timestamp=20,
|
||||
delay_timer=20000,
|
||||
network_name='Shouldnotbe',
|
||||
)
|
||||
self.simulator.go(5)
|
||||
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(pending_timestamp=20,
|
||||
active_timestamp=20,
|
||||
delay_timer=20000,
|
||||
network_name='MyHouse',
|
||||
master_key=KEY2)
|
||||
self.nodes[COMMISSIONER].send_mgmt_pending_set(
|
||||
pending_timestamp=20,
|
||||
active_timestamp=20,
|
||||
delay_timer=20000,
|
||||
network_name='MyHouse',
|
||||
master_key=KEY2,
|
||||
)
|
||||
self.simulator.go(310)
|
||||
|
||||
self.assertEqual(self.nodes[COMMISSIONER].get_masterkey(), KEY2)
|
||||
@@ -156,5 +169,6 @@ class Cert_9_2_18_RollBackActiveTimestamp(unittest.TestCase):
|
||||
self.simulator.go(5)
|
||||
self.assertEqual(self.nodes[ROUTER2].get_state(), 'leader')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -27,22 +27,22 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import time
|
||||
import unittest
|
||||
|
||||
import node
|
||||
|
||||
LEADER = 1
|
||||
|
||||
|
||||
class Cert_Cli(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.nodes = {}
|
||||
self.nodes[LEADER] = node.Node(LEADER)
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
|
||||
def test(self):
|
||||
commands = self.nodes[LEADER].get_commands()
|
||||
@@ -51,5 +51,6 @@ class Cert_Cli(unittest.TestCase):
|
||||
self.nodes[LEADER].send_command(command + ' -h')
|
||||
self.nodes[LEADER].pexpect.expect('Done')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -35,10 +35,11 @@ import node
|
||||
LEADER = 1
|
||||
ROUTER = 2
|
||||
|
||||
|
||||
class Test_MacScan(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.nodes = {}
|
||||
for i in range(1,3):
|
||||
for i in range(1, 3):
|
||||
self.nodes[i] = node.Node(i)
|
||||
|
||||
self.nodes[LEADER].set_panid(0xface)
|
||||
@@ -56,9 +57,9 @@ class Test_MacScan(unittest.TestCase):
|
||||
self.nodes[ROUTER].set_network_name('OpenThread')
|
||||
|
||||
def tearDown(self):
|
||||
for node in list(self.nodes.values()):
|
||||
node.stop()
|
||||
node.destroy()
|
||||
for n in list(self.nodes.values()):
|
||||
n.stop()
|
||||
n.destroy()
|
||||
|
||||
def test(self):
|
||||
self.nodes[LEADER].start()
|
||||
@@ -72,5 +73,6 @@ class Test_MacScan(unittest.TestCase):
|
||||
results = self.nodes[LEADER].scan()
|
||||
self.assertEqual(len(results), 16)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
@@ -26,4 +26,3 @@
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@ class CoapOptionHeader(object):
|
||||
|
||||
@property
|
||||
def is_payload_marker(self):
|
||||
return self.delta == 0xf and self.length == 0xf
|
||||
return self.delta == 0xF and self.length == 0xF
|
||||
|
||||
@classmethod
|
||||
def _read_extended_value(cls, data, value):
|
||||
@@ -94,8 +94,8 @@ class CoapOptionHeader(object):
|
||||
def from_bytes(cls, data):
|
||||
initial_byte = ord(data.read(1))
|
||||
|
||||
delta = (initial_byte >> 4) & 0xf
|
||||
length = initial_byte & 0xf
|
||||
delta = (initial_byte >> 4) & 0xF
|
||||
length = initial_byte & 0xF
|
||||
|
||||
delta = cls._read_extended_value(data, delta)
|
||||
length = cls._read_extended_value(data, length)
|
||||
@@ -120,7 +120,9 @@ class CoapOption(object):
|
||||
return self._value
|
||||
|
||||
def __repr__(self):
|
||||
return "CoapOption(type={}, value={})".format(self.type, hexlify(self.value))
|
||||
return "CoapOption(type={}, value={})".format(
|
||||
self.type, hexlify(self.value)
|
||||
)
|
||||
|
||||
|
||||
class CoapOptionsFactory(object):
|
||||
@@ -162,11 +164,11 @@ class CoapCode(object):
|
||||
|
||||
@property
|
||||
def detail(self):
|
||||
return self.code & 0x1f
|
||||
return self.code & 0x1F
|
||||
|
||||
@classmethod
|
||||
def from_class_and_detail(cls, _class, detail):
|
||||
return cls(((_class & 0x7) << 5) | (detail & 0x1f))
|
||||
return cls(((_class & 0x7) << 5) | (detail & 0x1F))
|
||||
|
||||
@classmethod
|
||||
def from_dotted(cls, dotted_str):
|
||||
@@ -179,7 +181,9 @@ class CoapCode(object):
|
||||
|
||||
@property
|
||||
def dotted(self):
|
||||
return ".".join(["{:01d}".format(self._class), "{:02d}".format(self.detail)])
|
||||
return ".".join(
|
||||
["{:01d}".format(self._class), "{:02d}".format(self.detail)]
|
||||
)
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, int):
|
||||
@@ -192,7 +196,9 @@ class CoapCode(object):
|
||||
return self.code == other.code
|
||||
|
||||
else:
|
||||
raise TypeError("Could not compare {} and {}".format(type(self), type(other)))
|
||||
raise TypeError(
|
||||
"Could not compare {} and {}".format(type(self), type(other))
|
||||
)
|
||||
|
||||
def __repr__(self):
|
||||
return self.dotted
|
||||
@@ -202,7 +208,17 @@ class CoapMessage(object):
|
||||
|
||||
""" Class representing CoAP message. """
|
||||
|
||||
def __init__(self, version, _type, code, message_id, token, options, payload, uri_path=None):
|
||||
def __init__(
|
||||
self,
|
||||
version,
|
||||
_type,
|
||||
code,
|
||||
message_id,
|
||||
token,
|
||||
options,
|
||||
payload,
|
||||
uri_path=None,
|
||||
):
|
||||
self._version = version
|
||||
self._type = _type
|
||||
self._code = code
|
||||
@@ -250,9 +266,17 @@ class CoapMessage(object):
|
||||
|
||||
def __repr__(self):
|
||||
options_str = ", ".join([repr(opt) for opt in self.options])
|
||||
return "CoapMessage(version={}, type={}, code={}, message_id={}, token={}, options=[{}], payload={}, uri-path='{}')".format(
|
||||
self.version, CoapMessageType.name[self.type], self.code, self.message_id, hexlify(self.token),
|
||||
options_str, self.payload, self.uri_path)
|
||||
return ("CoapMessage(version={}, type={}, code={}, message_id={}, token={}, options=[{}], payload={},",
|
||||
"uri-path='{}')").format(
|
||||
self.version,
|
||||
CoapMessageType.name[self.type],
|
||||
self.code,
|
||||
self.message_id,
|
||||
hexlify(self.token),
|
||||
options_str,
|
||||
self.payload,
|
||||
self.uri_path,
|
||||
)
|
||||
|
||||
|
||||
class CoapMessageProxy(object):
|
||||
@@ -264,11 +288,19 @@ class CoapMessageProxy(object):
|
||||
to get URI path to get proper payload parser.
|
||||
"""
|
||||
|
||||
def __init__(self, coap_message, message_info, mid_to_uri_path_binder, uri_path_based_payload_factories):
|
||||
def __init__(
|
||||
self,
|
||||
coap_message,
|
||||
message_info,
|
||||
mid_to_uri_path_binder,
|
||||
uri_path_based_payload_factories,
|
||||
):
|
||||
self._coap_message = coap_message
|
||||
self._message_info = message_info
|
||||
self._mid_to_uri_path_binder = mid_to_uri_path_binder
|
||||
self._uri_path_based_payload_factories = uri_path_based_payload_factories
|
||||
self._uri_path_based_payload_factories = (
|
||||
uri_path_based_payload_factories
|
||||
)
|
||||
|
||||
@property
|
||||
def version(self):
|
||||
@@ -301,11 +333,15 @@ class CoapMessageProxy(object):
|
||||
@property
|
||||
def payload(self):
|
||||
try:
|
||||
binded_uri_path = self._mid_to_uri_path_binder.get_uri_path_for(self.message_id, self.token)
|
||||
binded_uri_path = self._mid_to_uri_path_binder.get_uri_path_for(
|
||||
self.message_id, self.token
|
||||
)
|
||||
|
||||
factory = self._uri_path_based_payload_factories[binded_uri_path]
|
||||
|
||||
return factory.parse(io.BytesIO(self._coap_message.payload), self._message_info)
|
||||
return factory.parse(
|
||||
io.BytesIO(self._coap_message.payload), self._message_info
|
||||
)
|
||||
|
||||
except RuntimeError:
|
||||
return self._coap_message.payload
|
||||
@@ -316,9 +352,10 @@ class CoapMessageProxy(object):
|
||||
|
||||
def __repr__(self):
|
||||
options_str = ", ".join([repr(opt) for opt in self.options])
|
||||
return "CoapMessageProxy(version={}, type={}, code={}, message_id={}, token={}, options=[{}], payload={}, uri-path='{}')".format(
|
||||
self.version, self.type, self.code, self.message_id, hexlify(self.token),
|
||||
options_str, self.payload, self.uri_path)
|
||||
return ("CoapMessageProxy(version={}, type={}, code={}, message_id={}, token={}, options=[{}], payload={},",
|
||||
"uri-path='{}')").format(
|
||||
self.version, self.type, self.code, self.message_id, hexlify(self.token), options_str, self.payload,
|
||||
self.uri_path, )
|
||||
|
||||
|
||||
class CoapMessageIdToUriPathBinder:
|
||||
@@ -335,17 +372,25 @@ class CoapMessageIdToUriPathBinder:
|
||||
try:
|
||||
return self._uri_path_binds[message_id][hexlify(token)]
|
||||
except KeyError:
|
||||
raise RuntimeError("Could not find URI PATH for message_id: {} and token: {}".format(
|
||||
message_id, hexlify(token)))
|
||||
raise RuntimeError(
|
||||
"Could not find URI PATH for message_id: {} and token: {}".format(
|
||||
message_id, hexlify(token)))
|
||||
|
||||
|
||||
class CoapMessageFactory(object):
|
||||
|
||||
""" Factory that produces CoAP messages. """
|
||||
|
||||
def __init__(self, options_factory, uri_path_based_payload_factories, message_id_to_uri_path_binder):
|
||||
def __init__(
|
||||
self,
|
||||
options_factory,
|
||||
uri_path_based_payload_factories,
|
||||
message_id_to_uri_path_binder,
|
||||
):
|
||||
self._options_factory = options_factory
|
||||
self._uri_path_based_payload_factories = uri_path_based_payload_factories
|
||||
self._uri_path_based_payload_factories = (
|
||||
uri_path_based_payload_factories
|
||||
)
|
||||
self._mid_to_uri_path_binder = message_id_to_uri_path_binder
|
||||
|
||||
def _uri_path_from(self, options):
|
||||
@@ -365,12 +410,14 @@ class CoapMessageFactory(object):
|
||||
|
||||
version = (initial_byte >> 6) & 0x3
|
||||
_type = CoapMessageType((initial_byte >> 4) & 0x3)
|
||||
token_length = initial_byte & 0xf
|
||||
token_length = initial_byte & 0xF
|
||||
|
||||
return version, _type, token_length
|
||||
|
||||
def parse(self, data, message_info):
|
||||
version, _type, token_length = self._parse_initial_byte(data, message_info)
|
||||
version, _type, token_length = self._parse_initial_byte(
|
||||
data, message_info
|
||||
)
|
||||
|
||||
code = CoapCode(ord(data.read(1)))
|
||||
message_id = struct.unpack(">H", data.read(2))[0]
|
||||
@@ -380,8 +427,24 @@ class CoapMessageFactory(object):
|
||||
|
||||
uri_path = self._uri_path_from(options)
|
||||
if uri_path is not None:
|
||||
self._mid_to_uri_path_binder.add_uri_path_for(message_id, token, uri_path)
|
||||
self._mid_to_uri_path_binder.add_uri_path_for(
|
||||
message_id, token, uri_path
|
||||
)
|
||||
|
||||
coap_message = CoapMessage(version, _type, code, message_id, token, options, data.read(), uri_path)
|
||||
coap_message = CoapMessage(
|
||||
version,
|
||||
_type,
|
||||
code,
|
||||
message_id,
|
||||
token,
|
||||
options,
|
||||
data.read(),
|
||||
uri_path,
|
||||
)
|
||||
|
||||
return CoapMessageProxy(coap_message, message_info, self._mid_to_uri_path_binder, self._uri_path_based_payload_factories)
|
||||
return CoapMessageProxy(
|
||||
coap_message,
|
||||
message_info,
|
||||
self._mid_to_uri_path_binder,
|
||||
self._uri_path_based_payload_factories,
|
||||
)
|
||||
|
||||
@@ -38,36 +38,46 @@ import config
|
||||
import mesh_cop
|
||||
import mle
|
||||
|
||||
from collections import Counter
|
||||
from enum import IntEnum
|
||||
from network_data import Prefix, BorderRouter, LowpanId
|
||||
|
||||
|
||||
class CheckType(IntEnum):
|
||||
CONTAIN = 0
|
||||
NOT_CONTAIN = 1
|
||||
OPTIONAL = 2
|
||||
|
||||
|
||||
class NetworkDataCheckType:
|
||||
PREFIX_CNT = 1
|
||||
PREFIX_CONTENT = 2
|
||||
|
||||
|
||||
def check_address_query(command_msg, source_node, destination_address):
|
||||
"""Verify source_node sent a properly formatted Address Query Request message to the destination_address.
|
||||
"""
|
||||
command_msg.assertCoapMessageContainsTlv(network_layer.TargetEid)
|
||||
|
||||
source_rloc = source_node.get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
assert ipv6.ip_address(source_rloc) == command_msg.ipv6_packet.ipv6_header.source_address, \
|
||||
"Error: The IPv6 source address is not the RLOC of the originator. The source node's rloc is: " \
|
||||
+ str(ipv6.ip_address(source_rloc)) + ", but the source_address in command msg is: " \
|
||||
+ str(command_msg.ipv6_packet.ipv6_header.source_address)
|
||||
assert (
|
||||
ipv6.ip_address(source_rloc)
|
||||
== command_msg.ipv6_packet.ipv6_header.source_address
|
||||
), (
|
||||
"Error: The IPv6 source address is not the RLOC of the originator. The source node's rloc is: "
|
||||
+ str(ipv6.ip_address(source_rloc))
|
||||
+ ", but the source_address in command msg is: "
|
||||
+ str(command_msg.ipv6_packet.ipv6_header.source_address)
|
||||
)
|
||||
|
||||
if isinstance(destination_address, bytearray):
|
||||
destination_address = bytes(destination_address)
|
||||
elif isinstance(destination_address, str) and sys.version_info[0] == 2:
|
||||
destination_address = destination_address.decode("utf-8")
|
||||
|
||||
assert ipv6.ip_address(destination_address) == command_msg.ipv6_packet.ipv6_header.destination_address, "Error: The IPv6 destination address is not expected."
|
||||
assert (
|
||||
ipv6.ip_address(destination_address)
|
||||
== command_msg.ipv6_packet.ipv6_header.destination_address
|
||||
), "Error: The IPv6 destination address is not expected."
|
||||
|
||||
|
||||
def check_address_notification(command_msg, source_node, destination_node):
|
||||
"""Verify source_node sent a properly formatted Address Notification command message to destination_node.
|
||||
@@ -78,12 +88,23 @@ def check_address_notification(command_msg, source_node, destination_node):
|
||||
command_msg.assertCoapMessageContainsTlv(network_layer.MlEid)
|
||||
|
||||
source_rloc = source_node.get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
assert ipv6.ip_address(source_rloc) == command_msg.ipv6_packet.ipv6_header.source_address, "Error: The IPv6 source address is not the RLOC of the originator."
|
||||
assert (
|
||||
ipv6.ip_address(source_rloc)
|
||||
== command_msg.ipv6_packet.ipv6_header.source_address
|
||||
), "Error: The IPv6 source address is not the RLOC of the originator."
|
||||
|
||||
destination_rloc = destination_node.get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
assert ipv6.ip_address(destination_rloc) == command_msg.ipv6_packet.ipv6_header.destination_address, "Error: The IPv6 destination address is not the RLOC of the destination."
|
||||
destination_rloc = destination_node.get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC
|
||||
)
|
||||
assert (
|
||||
ipv6.ip_address(destination_rloc)
|
||||
== command_msg.ipv6_packet.ipv6_header.destination_address
|
||||
), "Error: The IPv6 destination address is not the RLOC of the destination."
|
||||
|
||||
def check_address_error_notification(command_msg, source_node, destination_address):
|
||||
|
||||
def check_address_error_notification(
|
||||
command_msg, source_node, destination_address
|
||||
):
|
||||
"""Verify source_node sent a properly formatted Address Error Notification command message to destination_address.
|
||||
"""
|
||||
command_msg.assertCoapMessageRequestUriPath('/a/ae')
|
||||
@@ -91,20 +112,31 @@ def check_address_error_notification(command_msg, source_node, destination_addre
|
||||
command_msg.assertCoapMessageContainsTlv(network_layer.MlEid)
|
||||
|
||||
source_rloc = source_node.get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
assert ipv6.ip_address(source_rloc) == command_msg.ipv6_packet.ipv6_header.source_address, \
|
||||
"Error: The IPv6 source address is not the RLOC of the originator. The source node's rloc is: " \
|
||||
+ str(ipv6.ip_address(source_rloc)) + ", but the source_address in command msg is: " \
|
||||
+ str(command_msg.ipv6_packet.ipv6_header.source_address)
|
||||
assert (
|
||||
ipv6.ip_address(source_rloc)
|
||||
== command_msg.ipv6_packet.ipv6_header.source_address
|
||||
), (
|
||||
"Error: The IPv6 source address is not the RLOC of the originator. The source node's rloc is: "
|
||||
+ str(ipv6.ip_address(source_rloc))
|
||||
+ ", but the source_address in command msg is: "
|
||||
+ str(command_msg.ipv6_packet.ipv6_header.source_address)
|
||||
)
|
||||
|
||||
if isinstance(destination_address, bytearray):
|
||||
destination_address = bytes(destination_address)
|
||||
elif isinstance(destination_address, str) and sys.version_info[0] == 2:
|
||||
destination_address = destination_address.decode("utf-8")
|
||||
|
||||
assert ipv6.ip_address(destination_address) == command_msg.ipv6_packet.ipv6_header.destination_address, \
|
||||
"Error: The IPv6 destination address is not expected. The destination node's rloc is: " \
|
||||
+ str(ipv6.ip_address(destination_address)) + ", but the destination_address in command msg is: " \
|
||||
+ str(command_msg.ipv6_packet.ipv6_header.destination_address)
|
||||
assert (
|
||||
ipv6.ip_address(destination_address)
|
||||
== command_msg.ipv6_packet.ipv6_header.destination_address
|
||||
), (
|
||||
"Error: The IPv6 destination address is not expected. The destination node's rloc is: "
|
||||
+ str(ipv6.ip_address(destination_address))
|
||||
+ ", but the destination_address in command msg is: "
|
||||
+ str(command_msg.ipv6_packet.ipv6_header.destination_address)
|
||||
)
|
||||
|
||||
|
||||
def check_address_solicit(command_msg, was_router):
|
||||
command_msg.assertCoapMessageRequestUriPath('/a/as')
|
||||
@@ -115,6 +147,7 @@ def check_address_solicit(command_msg, was_router):
|
||||
else:
|
||||
command_msg.assertMleMessageDoesNotContainTlv(network_layer.Rloc16)
|
||||
|
||||
|
||||
def check_address_release(command_msg, destination_node):
|
||||
"""Verify the message is a properly formatted address release destined to the given node.
|
||||
"""
|
||||
@@ -122,8 +155,14 @@ def check_address_release(command_msg, destination_node):
|
||||
command_msg.assertCoapMessageContainsTlv(network_layer.Rloc16)
|
||||
command_msg.assertCoapMessageContainsTlv(network_layer.MacExtendedAddress)
|
||||
|
||||
destination_rloc = destination_node.get_ip6_address(config.ADDRESS_TYPE.RLOC)
|
||||
assert ipv6.ip_address(destination_rloc) == command_msg.ipv6_packet.ipv6_header.destination_address, "Error: The destination is not RLOC address"
|
||||
destination_rloc = destination_node.get_ip6_address(
|
||||
config.ADDRESS_TYPE.RLOC
|
||||
)
|
||||
assert (
|
||||
ipv6.ip_address(destination_rloc)
|
||||
== command_msg.ipv6_packet.ipv6_header.destination_address
|
||||
), "Error: The destination is not RLOC address"
|
||||
|
||||
|
||||
def check_tlv_request_tlv(command_msg, check_type, tlv_id):
|
||||
"""Verify if TLV Request TLV contains specified TLV ID
|
||||
@@ -131,29 +170,44 @@ def check_tlv_request_tlv(command_msg, check_type, tlv_id):
|
||||
tlv_request_tlv = command_msg.get_mle_message_tlv(mle.TlvRequest)
|
||||
|
||||
if check_type == CheckType.CONTAIN:
|
||||
assert tlv_request_tlv is not None, "Error: The msg doesn't contain TLV Request TLV"
|
||||
assert any(tlv_id == tlv for tlv in tlv_request_tlv.tlvs), "Error: The msg doesn't contain TLV Request TLV ID: {}".format(tlv_id)
|
||||
assert (
|
||||
tlv_request_tlv is not None
|
||||
), "Error: The msg doesn't contain TLV Request TLV"
|
||||
assert any(
|
||||
tlv_id == tlv for tlv in tlv_request_tlv.tlvs
|
||||
), "Error: The msg doesn't contain TLV Request TLV ID: {}".format(
|
||||
tlv_id
|
||||
)
|
||||
|
||||
elif check_type == CheckType.NOT_CONTAIN:
|
||||
if tlv_request_tlv is not None:
|
||||
assert any(tlv_id == tlv for tlv in tlv_request_tlv.tlvs) is False, "Error: The msg contains TLV Request TLV ID: {}".format(tlv_id)
|
||||
assert (
|
||||
any(tlv_id == tlv for tlv in tlv_request_tlv.tlvs) is False
|
||||
), "Error: The msg contains TLV Request TLV ID: {}".format(tlv_id)
|
||||
|
||||
elif check_type == CheckType.OPTIONAL:
|
||||
if tlv_request_tlv is not None:
|
||||
if any(tlv_id == tlv for tlv in tlv_request_tlv.tlvs):
|
||||
print("TLV Request TLV contains TLV ID: {}".format(tlv_id))
|
||||
else:
|
||||
print("TLV Request TLV doesn't contain TLV ID: {}".format(tlv_id))
|
||||
print(
|
||||
"TLV Request TLV doesn't contain TLV ID: {}".format(tlv_id)
|
||||
)
|
||||
else:
|
||||
print("The msg doesn't contain TLV Request TLV")
|
||||
|
||||
else:
|
||||
raise ValueError("Invalid check type")
|
||||
|
||||
def check_link_request(command_msg, source_address = CheckType.OPTIONAL, leader_data = CheckType.OPTIONAL, \
|
||||
tlv_request_address16 = CheckType.OPTIONAL, tlv_request_route64 = CheckType.OPTIONAL, \
|
||||
tlv_request_link_margin = CheckType.OPTIONAL):
|
||||
|
||||
def check_link_request(
|
||||
command_msg,
|
||||
source_address=CheckType.OPTIONAL,
|
||||
leader_data=CheckType.OPTIONAL,
|
||||
tlv_request_address16=CheckType.OPTIONAL,
|
||||
tlv_request_route64=CheckType.OPTIONAL,
|
||||
tlv_request_link_margin=CheckType.OPTIONAL,
|
||||
):
|
||||
"""Verify a properly formatted Link Request command message.
|
||||
"""
|
||||
command_msg.assertMleMessageContainsTlv(mle.Challenge)
|
||||
@@ -162,14 +216,28 @@ def check_link_request(command_msg, source_address = CheckType.OPTIONAL, leader_
|
||||
check_mle_optional_tlv(command_msg, source_address, mle.SourceAddress)
|
||||
check_mle_optional_tlv(command_msg, leader_data, mle.LeaderData)
|
||||
|
||||
check_tlv_request_tlv(command_msg, tlv_request_address16, mle.TlvType.ADDRESS16)
|
||||
check_tlv_request_tlv(command_msg, tlv_request_route64, mle.TlvType.ROUTE64)
|
||||
check_tlv_request_tlv(command_msg, tlv_request_link_margin, mle.TlvType.LINK_MARGIN)
|
||||
check_tlv_request_tlv(
|
||||
command_msg, tlv_request_address16, mle.TlvType.ADDRESS16
|
||||
)
|
||||
check_tlv_request_tlv(
|
||||
command_msg, tlv_request_route64, mle.TlvType.ROUTE64
|
||||
)
|
||||
check_tlv_request_tlv(
|
||||
command_msg, tlv_request_link_margin, mle.TlvType.LINK_MARGIN
|
||||
)
|
||||
|
||||
def check_link_accept(command_msg, destination_node, \
|
||||
leader_data = CheckType.OPTIONAL, link_margin = CheckType.OPTIONAL, mle_frame_counter = CheckType.OPTIONAL, \
|
||||
challenge = CheckType.OPTIONAL, address16 = CheckType.OPTIONAL, route64 = CheckType.OPTIONAL, \
|
||||
tlv_request_link_margin = CheckType.OPTIONAL):
|
||||
|
||||
def check_link_accept(
|
||||
command_msg,
|
||||
destination_node,
|
||||
leader_data=CheckType.OPTIONAL,
|
||||
link_margin=CheckType.OPTIONAL,
|
||||
mle_frame_counter=CheckType.OPTIONAL,
|
||||
challenge=CheckType.OPTIONAL,
|
||||
address16=CheckType.OPTIONAL,
|
||||
route64=CheckType.OPTIONAL,
|
||||
tlv_request_link_margin=CheckType.OPTIONAL,
|
||||
):
|
||||
"""verify a properly formatted link accept command message.
|
||||
"""
|
||||
command_msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
@@ -184,13 +252,20 @@ def check_link_accept(command_msg, destination_node, \
|
||||
check_mle_optional_tlv(command_msg, address16, mle.Address16)
|
||||
check_mle_optional_tlv(command_msg, route64, mle.Route64)
|
||||
|
||||
check_tlv_request_tlv(command_msg, tlv_request_link_margin, mle.TlvType.LINK_MARGIN)
|
||||
check_tlv_request_tlv(
|
||||
command_msg, tlv_request_link_margin, mle.TlvType.LINK_MARGIN
|
||||
)
|
||||
|
||||
destination_link_local = destination_node.get_ip6_address(config.ADDRESS_TYPE.LINK_LOCAL)
|
||||
assert ipv6.ip_address(destination_link_local) == command_msg.ipv6_packet.ipv6_header.destination_address, \
|
||||
"Error: The destination is unexpected"
|
||||
destination_link_local = destination_node.get_ip6_address(
|
||||
config.ADDRESS_TYPE.LINK_LOCAL
|
||||
)
|
||||
assert (
|
||||
ipv6.ip_address(destination_link_local)
|
||||
== command_msg.ipv6_packet.ipv6_header.destination_address
|
||||
), "Error: The destination is unexpected"
|
||||
|
||||
def check_icmp_path(sniffer, path, nodes, icmp_type = ipv6.ICMP_ECHO_REQUEST):
|
||||
|
||||
def check_icmp_path(sniffer, path, nodes, icmp_type=ipv6.ICMP_ECHO_REQUEST):
|
||||
"""Verify icmp message is forwarded along the path.
|
||||
"""
|
||||
len_path = len(path)
|
||||
@@ -203,17 +278,21 @@ def check_icmp_path(sniffer, path, nodes, icmp_type = ipv6.ICMP_ECHO_REQUEST):
|
||||
if i < len_path - 1:
|
||||
next_node = nodes[path[i + 1]]
|
||||
next_node_rloc16 = next_node.get_addr16()
|
||||
assert next_node_rloc16 == node_icmp_msg.mac_header.dest_address.rloc, "Error: The path is unexpected."
|
||||
assert (
|
||||
next_node_rloc16 == node_icmp_msg.mac_header.dest_address.rloc
|
||||
), "Error: The path is unexpected."
|
||||
else:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
def check_id_set(command_msg, router_id):
|
||||
"""Check the command_msg's Route64 tlv to verify router_id is an active router.
|
||||
"""
|
||||
tlv = command_msg.assertMleMessageContainsTlv(mle.Route64)
|
||||
return ((tlv.router_id_mask >> (63 - router_id)) & 1)
|
||||
return (tlv.router_id_mask >> (63 - router_id)) & 1
|
||||
|
||||
|
||||
def get_routing_cost(command_msg, router_id):
|
||||
"""Check the command_msg's Route64 tlv to get the routing cost to router.
|
||||
@@ -221,8 +300,9 @@ def get_routing_cost(command_msg, router_id):
|
||||
tlv = command_msg.assertMleMessageContainsTlv(mle.Route64)
|
||||
|
||||
# Get router's mask pos
|
||||
# Turn the number into binary string. Need to consider the preceding 0 omitted during conversion.
|
||||
router_id_mask_str = bin(tlv.router_id_mask).replace('0b','')
|
||||
# Turn the number into binary string. Need to consider the preceding 0
|
||||
# omitted during conversion.
|
||||
router_id_mask_str = bin(tlv.router_id_mask).replace('0b', '')
|
||||
prefix_len = 64 - len(router_id_mask_str)
|
||||
routing_entry_pos = 0
|
||||
|
||||
@@ -230,37 +310,47 @@ def get_routing_cost(command_msg, router_id):
|
||||
if router_id_mask_str[i] == '1':
|
||||
routing_entry_pos += 1
|
||||
|
||||
assert router_id_mask_str[router_id - prefix_len] == '1', "Error: The router isn't in the topology. \n" \
|
||||
+ "route64 tlv is: %s. \nrouter_id is: %s. \nrouting_entry_pos is: %s. \nrouter_id_mask_str is: %s." \
|
||||
%(tlv, router_id, routing_entry_pos, router_id_mask_str)
|
||||
assert router_id_mask_str[router_id - prefix_len] == '1', \
|
||||
(("Error: The router isn't in the topology. \n",
|
||||
"route64 tlv is: %s. \nrouter_id is: %s. \nrouting_entry_pos is: %s. \nrouter_id_mask_str is: %s.") %
|
||||
(tlv, router_id, routing_entry_pos, router_id_mask_str))
|
||||
|
||||
return tlv.link_quality_and_route_data[routing_entry_pos].route
|
||||
|
||||
|
||||
def check_mle_optional_tlv(command_msg, type, tlv):
|
||||
if (type == CheckType.CONTAIN):
|
||||
if type == CheckType.CONTAIN:
|
||||
command_msg.assertMleMessageContainsTlv(tlv)
|
||||
elif (type == CheckType.NOT_CONTAIN):
|
||||
elif type == CheckType.NOT_CONTAIN:
|
||||
command_msg.assertMleMessageDoesNotContainTlv(tlv)
|
||||
elif (type == CheckType.OPTIONAL):
|
||||
elif type == CheckType.OPTIONAL:
|
||||
command_msg.assertMleMessageContainsOptionalTlv(tlv)
|
||||
else:
|
||||
raise ValueError("Invalid check type")
|
||||
|
||||
|
||||
def check_mle_advertisement(command_msg):
|
||||
command_msg.assertSentWithHopLimit(255)
|
||||
command_msg.assertSentToDestinationAddress(config.LINK_LOCAL_ALL_NODES_ADDRESS)
|
||||
command_msg.assertSentToDestinationAddress(
|
||||
config.LINK_LOCAL_ALL_NODES_ADDRESS
|
||||
)
|
||||
command_msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
command_msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Route64)
|
||||
|
||||
|
||||
def check_parent_request(command_msg, is_first_request):
|
||||
"""Verify a properly formatted Parent Request command message.
|
||||
"""
|
||||
if command_msg.mle.aux_sec_hdr.key_id_mode != 0x2:
|
||||
raise ValueError("The Key Identifier Mode of the Security Control Field SHALL be set to 0x02")
|
||||
raise ValueError(
|
||||
"The Key Identifier Mode of the Security Control Field SHALL be set to 0x02"
|
||||
)
|
||||
|
||||
command_msg.assertSentWithHopLimit(255)
|
||||
command_msg.assertSentToDestinationAddress(config.LINK_LOCAL_ALL_ROUTERS_ADDRESS)
|
||||
command_msg.assertSentToDestinationAddress(
|
||||
config.LINK_LOCAL_ALL_ROUTERS_ADDRESS
|
||||
)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Challenge)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Version)
|
||||
@@ -273,7 +363,8 @@ def check_parent_request(command_msg, is_first_request):
|
||||
elif not scan_mask.end_device:
|
||||
raise ValueError("Second parent request without E bit set")
|
||||
|
||||
def check_parent_response(command_msg, mle_frame_counter = CheckType.OPTIONAL):
|
||||
|
||||
def check_parent_response(command_msg, mle_frame_counter=CheckType.OPTIONAL):
|
||||
"""Verify a properly formatted Parent Response command message.
|
||||
"""
|
||||
command_msg.assertMleMessageContainsTlv(mle.Challenge)
|
||||
@@ -287,14 +378,22 @@ def check_parent_response(command_msg, mle_frame_counter = CheckType.OPTIONAL):
|
||||
|
||||
check_mle_optional_tlv(command_msg, mle_frame_counter, mle.MleFrameCounter)
|
||||
|
||||
def check_child_id_request(command_msg, tlv_request = CheckType.OPTIONAL, \
|
||||
mle_frame_counter = CheckType.OPTIONAL, address_registration = CheckType.OPTIONAL, \
|
||||
active_timestamp = CheckType.OPTIONAL, pending_timestamp = CheckType.OPTIONAL,
|
||||
route64 = CheckType.OPTIONAL):
|
||||
|
||||
def check_child_id_request(
|
||||
command_msg,
|
||||
tlv_request=CheckType.OPTIONAL,
|
||||
mle_frame_counter=CheckType.OPTIONAL,
|
||||
address_registration=CheckType.OPTIONAL,
|
||||
active_timestamp=CheckType.OPTIONAL,
|
||||
pending_timestamp=CheckType.OPTIONAL,
|
||||
route64=CheckType.OPTIONAL,
|
||||
):
|
||||
"""Verify a properly formatted Child Id Request command message.
|
||||
"""
|
||||
if command_msg.mle.aux_sec_hdr.key_id_mode != 0x2:
|
||||
raise ValueError("The Key Identifier Mode of the Security Control Field SHALL be set to 0x02")
|
||||
raise ValueError(
|
||||
"The Key Identifier Mode of the Security Control Field SHALL be set to 0x02"
|
||||
)
|
||||
|
||||
command_msg.assertMleMessageContainsTlv(mle.LinkLayerFrameCounter)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
@@ -304,19 +403,34 @@ def check_child_id_request(command_msg, tlv_request = CheckType.OPTIONAL, \
|
||||
|
||||
check_mle_optional_tlv(command_msg, tlv_request, mle.TlvRequest)
|
||||
check_mle_optional_tlv(command_msg, mle_frame_counter, mle.MleFrameCounter)
|
||||
check_mle_optional_tlv(command_msg, address_registration, mle.AddressRegistration)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, address_registration, mle.AddressRegistration
|
||||
)
|
||||
check_mle_optional_tlv(command_msg, active_timestamp, mle.ActiveTimestamp)
|
||||
check_mle_optional_tlv(command_msg, pending_timestamp, mle.PendingTimestamp)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, pending_timestamp, mle.PendingTimestamp
|
||||
)
|
||||
check_mle_optional_tlv(command_msg, route64, mle.Route64)
|
||||
|
||||
check_tlv_request_tlv(command_msg, CheckType.CONTAIN, mle.TlvType.ADDRESS16)
|
||||
check_tlv_request_tlv(command_msg, CheckType.CONTAIN, mle.TlvType.NETWORK_DATA)
|
||||
check_tlv_request_tlv(
|
||||
command_msg, CheckType.CONTAIN, mle.TlvType.ADDRESS16
|
||||
)
|
||||
check_tlv_request_tlv(
|
||||
command_msg, CheckType.CONTAIN, mle.TlvType.NETWORK_DATA
|
||||
)
|
||||
|
||||
def check_child_id_response(command_msg, route64 = CheckType.OPTIONAL, network_data = CheckType.OPTIONAL, \
|
||||
address_registration = CheckType.OPTIONAL, active_timestamp = CheckType.OPTIONAL, \
|
||||
pending_timestamp = CheckType.OPTIONAL, active_operational_dataset = CheckType.OPTIONAL, \
|
||||
pending_operational_dataset = CheckType.OPTIONAL,
|
||||
network_data_check = None):
|
||||
|
||||
def check_child_id_response(
|
||||
command_msg,
|
||||
route64=CheckType.OPTIONAL,
|
||||
network_data=CheckType.OPTIONAL,
|
||||
address_registration=CheckType.OPTIONAL,
|
||||
active_timestamp=CheckType.OPTIONAL,
|
||||
pending_timestamp=CheckType.OPTIONAL,
|
||||
active_operational_dataset=CheckType.OPTIONAL,
|
||||
pending_operational_dataset=CheckType.OPTIONAL,
|
||||
network_data_check=None,
|
||||
):
|
||||
"""Verify a properly formatted Child Id Response command message.
|
||||
"""
|
||||
command_msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
@@ -325,67 +439,105 @@ def check_child_id_response(command_msg, route64 = CheckType.OPTIONAL, network_d
|
||||
|
||||
check_mle_optional_tlv(command_msg, route64, mle.Route64)
|
||||
check_mle_optional_tlv(command_msg, network_data, mle.NetworkData)
|
||||
check_mle_optional_tlv(command_msg, address_registration, mle.AddressRegistration)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, address_registration, mle.AddressRegistration
|
||||
)
|
||||
check_mle_optional_tlv(command_msg, active_timestamp, mle.ActiveTimestamp)
|
||||
check_mle_optional_tlv(command_msg, pending_timestamp, mle.PendingTimestamp)
|
||||
check_mle_optional_tlv(command_msg, active_operational_dataset, mle.ActiveOperationalDataset)
|
||||
check_mle_optional_tlv(command_msg, pending_operational_dataset, mle.PendingOperationalDataset)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, pending_timestamp, mle.PendingTimestamp
|
||||
)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, active_operational_dataset, mle.ActiveOperationalDataset
|
||||
)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, pending_operational_dataset, mle.PendingOperationalDataset
|
||||
)
|
||||
|
||||
if network_data_check is not None:
|
||||
network_data_tlv = command_msg.assertMleMessageContainsTlv(mle.NetworkData)
|
||||
network_data_tlv = command_msg.assertMleMessageContainsTlv(
|
||||
mle.NetworkData
|
||||
)
|
||||
network_data_check.check(network_data_tlv)
|
||||
|
||||
|
||||
def check_prefix(prefix):
|
||||
"""Verify if a prefix contains 6loWPAN sub-TLV and border router sub-TLV
|
||||
"""
|
||||
assert contains_tlv(prefix.sub_tlvs, network_data.BorderRouter), 'Prefix doesn\'t contain a border router sub-TLV!'
|
||||
assert contains_tlv(prefix.sub_tlvs, network_data.LowpanId), 'Prefix doesn\'t contain a LowpanId sub-TLV!'
|
||||
assert contains_tlv(
|
||||
prefix.sub_tlvs, network_data.BorderRouter
|
||||
), 'Prefix doesn\'t contain a border router sub-TLV!'
|
||||
assert contains_tlv(
|
||||
prefix.sub_tlvs, network_data.LowpanId
|
||||
), 'Prefix doesn\'t contain a LowpanId sub-TLV!'
|
||||
|
||||
def check_child_update_request_from_child(command_msg, source_address=CheckType.OPTIONAL,
|
||||
leader_data=CheckType.OPTIONAL, challenge=CheckType.OPTIONAL, time_out=CheckType.OPTIONAL,
|
||||
address_registration=CheckType.OPTIONAL, tlv_request_tlv=CheckType.OPTIONAL,
|
||||
active_timestamp=CheckType.OPTIONAL, CIDs=[]):
|
||||
|
||||
def check_child_update_request_from_child(
|
||||
command_msg,
|
||||
source_address=CheckType.OPTIONAL,
|
||||
leader_data=CheckType.OPTIONAL,
|
||||
challenge=CheckType.OPTIONAL,
|
||||
time_out=CheckType.OPTIONAL,
|
||||
address_registration=CheckType.OPTIONAL,
|
||||
tlv_request_tlv=CheckType.OPTIONAL,
|
||||
active_timestamp=CheckType.OPTIONAL,
|
||||
CIDs=[],
|
||||
):
|
||||
|
||||
command_msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
check_mle_optional_tlv(command_msg, source_address, mle.SourceAddress)
|
||||
check_mle_optional_tlv(command_msg, leader_data, mle.LeaderData)
|
||||
check_mle_optional_tlv(command_msg, challenge, mle.Challenge)
|
||||
check_mle_optional_tlv(command_msg, time_out, mle.Timeout)
|
||||
check_mle_optional_tlv(command_msg, address_registration, mle.AddressRegistration)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, address_registration, mle.AddressRegistration
|
||||
)
|
||||
check_mle_optional_tlv(command_msg, tlv_request_tlv, mle.TlvRequest)
|
||||
check_mle_optional_tlv(command_msg, active_timestamp, mle.ActiveTimestamp)
|
||||
|
||||
if (address_registration == CheckType.CONTAIN) and len(CIDs) > 0:
|
||||
_check_address_registration(command_msg, CIDs)
|
||||
|
||||
|
||||
def check_coap_optional_tlv(coap_msg, type, tlv):
|
||||
if (type == CheckType.CONTAIN):
|
||||
if type == CheckType.CONTAIN:
|
||||
coap_msg.assertCoapMessageContainsTlv(tlv)
|
||||
elif (type == CheckType.NOT_CONTAIN):
|
||||
elif type == CheckType.NOT_CONTAIN:
|
||||
coap_msg.assertCoapMessageDoesNotContainTlv(tlv)
|
||||
elif (type == CheckType.OPTIONAL):
|
||||
elif type == CheckType.OPTIONAL:
|
||||
coap_msg.assertCoapMessageContainsOptionalTlv(tlv)
|
||||
else:
|
||||
raise ValueError("Invalid check type")
|
||||
|
||||
def check_router_id_cached(node, router_id, cached = True):
|
||||
|
||||
def check_router_id_cached(node, router_id, cached=True):
|
||||
"""Verify if the node has cached any entries based on the router ID
|
||||
"""
|
||||
eidcaches = node.get_eidcaches()
|
||||
if cached:
|
||||
assert any(router_id == (int(rloc, 16) >> 10) for (_, rloc) in eidcaches)
|
||||
assert any(
|
||||
router_id == (int(rloc, 16) >> 10) for (_, rloc) in eidcaches
|
||||
)
|
||||
else:
|
||||
assert any(router_id == (int(rloc, 16) >> 10) for (_, rloc) in eidcaches) is False
|
||||
assert (
|
||||
any(router_id == (int(rloc, 16) >> 10) for (_, rloc) in eidcaches)
|
||||
is False
|
||||
)
|
||||
|
||||
|
||||
def contains_tlv(sub_tlvs, tlv_type):
|
||||
"""Verify if a specific type of tlv is included in a sub-tlv list.
|
||||
"""
|
||||
return any(isinstance(sub_tlv, tlv_type) for sub_tlv in sub_tlvs)
|
||||
|
||||
|
||||
def contains_tlvs(sub_tlvs, tlv_types):
|
||||
"""Verify if all types of tlv in a list are included in a sub-tlv list.
|
||||
"""
|
||||
return all((any(isinstance(sub_tlv, tlv_type) for sub_tlv in sub_tlvs)) for tlv_type in tlv_types)
|
||||
return all(
|
||||
(any(isinstance(sub_tlv, tlv_type) for sub_tlv in sub_tlvs))
|
||||
for tlv_type in tlv_types
|
||||
)
|
||||
|
||||
|
||||
def check_secure_mle_key_id_mode(command_msg, key_id_mode):
|
||||
"""Verify if the mle command message sets the right key id mode.
|
||||
@@ -393,7 +545,10 @@ def check_secure_mle_key_id_mode(command_msg, key_id_mode):
|
||||
assert isinstance(command_msg.mle, mle.MleMessageSecured)
|
||||
assert command_msg.mle.aux_sec_hdr.key_id_mode == key_id_mode
|
||||
|
||||
def check_data_response(command_msg, network_data_check=None, active_timestamp=CheckType.OPTIONAL):
|
||||
|
||||
def check_data_response(
|
||||
command_msg, network_data_check=None, active_timestamp=CheckType.OPTIONAL
|
||||
):
|
||||
"""Verify a properly formatted Data Response command message.
|
||||
"""
|
||||
check_secure_mle_key_id_mode(command_msg, 0x02)
|
||||
@@ -401,12 +556,20 @@ def check_data_response(command_msg, network_data_check=None, active_timestamp=C
|
||||
command_msg.assertMleMessageContainsTlv(mle.LeaderData)
|
||||
check_mle_optional_tlv(command_msg, active_timestamp, mle.ActiveTimestamp)
|
||||
if network_data_check is not None:
|
||||
network_data_tlv = command_msg.assertMleMessageContainsTlv(mle.NetworkData)
|
||||
network_data_tlv = command_msg.assertMleMessageContainsTlv(
|
||||
mle.NetworkData
|
||||
)
|
||||
network_data_check.check(network_data_tlv)
|
||||
|
||||
def check_child_update_request_from_parent(command_msg, leader_data=CheckType.OPTIONAL,
|
||||
network_data=CheckType.OPTIONAL, challenge=CheckType.OPTIONAL,
|
||||
tlv_request=CheckType.OPTIONAL, active_timestamp=CheckType.OPTIONAL):
|
||||
|
||||
def check_child_update_request_from_parent(
|
||||
command_msg,
|
||||
leader_data=CheckType.OPTIONAL,
|
||||
network_data=CheckType.OPTIONAL,
|
||||
challenge=CheckType.OPTIONAL,
|
||||
tlv_request=CheckType.OPTIONAL,
|
||||
active_timestamp=CheckType.OPTIONAL,
|
||||
):
|
||||
"""Verify a properly formatted Child Update Request(from parent) command message.
|
||||
"""
|
||||
check_secure_mle_key_id_mode(command_msg, 0x02)
|
||||
@@ -418,10 +581,19 @@ def check_child_update_request_from_parent(command_msg, leader_data=CheckType.OP
|
||||
check_mle_optional_tlv(command_msg, tlv_request, mle.TlvRequest)
|
||||
check_mle_optional_tlv(command_msg, active_timestamp, mle.ActiveTimestamp)
|
||||
|
||||
def check_child_update_response(command_msg, timeout=CheckType.OPTIONAL,
|
||||
address_registration=CheckType.OPTIONAL, address16=CheckType.OPTIONAL,
|
||||
leader_data=CheckType.OPTIONAL, network_data=CheckType.OPTIONAL, response=CheckType.OPTIONAL,
|
||||
link_layer_frame_counter=CheckType.OPTIONAL, mle_frame_counter=CheckType.OPTIONAL, CIDs=[]):
|
||||
|
||||
def check_child_update_response(
|
||||
command_msg,
|
||||
timeout=CheckType.OPTIONAL,
|
||||
address_registration=CheckType.OPTIONAL,
|
||||
address16=CheckType.OPTIONAL,
|
||||
leader_data=CheckType.OPTIONAL,
|
||||
network_data=CheckType.OPTIONAL,
|
||||
response=CheckType.OPTIONAL,
|
||||
link_layer_frame_counter=CheckType.OPTIONAL,
|
||||
mle_frame_counter=CheckType.OPTIONAL,
|
||||
CIDs=[],
|
||||
):
|
||||
"""Verify a properly formatted Child Update Response from parent
|
||||
"""
|
||||
check_secure_mle_key_id_mode(command_msg, 0x02)
|
||||
@@ -429,37 +601,51 @@ def check_child_update_response(command_msg, timeout=CheckType.OPTIONAL,
|
||||
command_msg.assertMleMessageContainsTlv(mle.SourceAddress)
|
||||
command_msg.assertMleMessageContainsTlv(mle.Mode)
|
||||
check_mle_optional_tlv(command_msg, timeout, mle.Timeout)
|
||||
check_mle_optional_tlv(command_msg, address_registration, mle.AddressRegistration)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, address_registration, mle.AddressRegistration
|
||||
)
|
||||
check_mle_optional_tlv(command_msg, address16, mle.Address16)
|
||||
check_mle_optional_tlv(command_msg, leader_data, mle.LeaderData)
|
||||
check_mle_optional_tlv(command_msg, network_data, mle.NetworkData)
|
||||
check_mle_optional_tlv(command_msg, response, mle.Response)
|
||||
check_mle_optional_tlv(command_msg, link_layer_frame_counter, mle.LinkLayerFrameCounter)
|
||||
check_mle_optional_tlv(
|
||||
command_msg, link_layer_frame_counter, mle.LinkLayerFrameCounter
|
||||
)
|
||||
check_mle_optional_tlv(command_msg, mle_frame_counter, mle.MleFrameCounter)
|
||||
|
||||
if (address_registration == CheckType.CONTAIN) and len(CIDs) > 0:
|
||||
_check_address_registration(command_msg, CIDs)
|
||||
|
||||
|
||||
def _check_address_registration(command_msg, CIDs=[]):
|
||||
addresses = command_msg.assertMleMessageContainsTlv(mle.AddressRegistration).addresses
|
||||
for cid in CIDs:
|
||||
found = False
|
||||
for address in addresses:
|
||||
if isinstance(address, mle.AddressCompressed):
|
||||
if cid == address.cid:
|
||||
found = True
|
||||
break
|
||||
assert found, "AddressRegistration TLV doesn't have CID {} ".format(cid)
|
||||
addresses = command_msg.assertMleMessageContainsTlv(
|
||||
mle.AddressRegistration
|
||||
).addresses
|
||||
for cid in CIDs:
|
||||
found = False
|
||||
for address in addresses:
|
||||
if isinstance(address, mle.AddressCompressed):
|
||||
if cid == address.cid:
|
||||
found = True
|
||||
break
|
||||
assert found, "AddressRegistration TLV doesn't have CID {} ".format(
|
||||
cid
|
||||
)
|
||||
|
||||
|
||||
def get_sub_tlv(tlvs, tlv_type):
|
||||
for sub_tlv in tlvs:
|
||||
if isinstance(sub_tlv, tlv_type):
|
||||
return sub_tlv
|
||||
|
||||
|
||||
def check_address_registration_tlv(addr_reg_tlv, address_set):
|
||||
"""Verify all addresses contained in address_set are contained in add_reg_tlv
|
||||
"""
|
||||
assert all(addr in addr_reg_tlv.addresses for addr in address_set), 'Some addresses are not included in AddressRegistration TLV'
|
||||
assert all(
|
||||
addr in addr_reg_tlv.addresses for addr in address_set
|
||||
), 'Some addresses are not included in AddressRegistration TLV'
|
||||
|
||||
|
||||
def assert_contains_tlv(tlvs, check_type, tlv_type):
|
||||
"""Assert a tlv list contains specific tlv and return the first qualified.
|
||||
@@ -476,39 +662,55 @@ def assert_contains_tlv(tlvs, check_type, tlv_type):
|
||||
else:
|
||||
raise ValueError("Invalid check type: {}".format(check_type))
|
||||
|
||||
|
||||
def check_discovery_request(command_msg):
|
||||
"""Verify a properly formatted Thread Discovery Request command message.
|
||||
"""
|
||||
assert not isinstance(command_msg.mle, mle.MleMessageSecured)
|
||||
tlvs = command_msg.assertMleMessageContainsTlv(mle.ThreadDiscovery).tlvs
|
||||
request = assert_contains_tlv(tlvs, CheckType.CONTAIN, mesh_cop.DiscoveryRequest)
|
||||
request = assert_contains_tlv(
|
||||
tlvs, CheckType.CONTAIN, mesh_cop.DiscoveryRequest
|
||||
)
|
||||
assert request.version == config.PROTOCOL_VERSION
|
||||
|
||||
def check_discovery_response(command_msg, request_src_addr, steering_data=CheckType.OPTIONAL):
|
||||
|
||||
def check_discovery_response(
|
||||
command_msg, request_src_addr, steering_data=CheckType.OPTIONAL
|
||||
):
|
||||
"""Verify a properly formatted Thread Discovery Response command message.
|
||||
"""
|
||||
assert not isinstance(command_msg.mle, mle.MleMessageSecured)
|
||||
assert command_msg.mac_header.src_address.type == common.MacAddressType.LONG
|
||||
assert (
|
||||
command_msg.mac_header.src_address.type == common.MacAddressType.LONG
|
||||
)
|
||||
assert command_msg.mac_header.dest_address == request_src_addr
|
||||
|
||||
tlvs = command_msg.assertMleMessageContainsTlv(mle.ThreadDiscovery).tlvs
|
||||
response = assert_contains_tlv(tlvs, CheckType.CONTAIN, mesh_cop.DiscoveryResponse)
|
||||
response = assert_contains_tlv(
|
||||
tlvs, CheckType.CONTAIN, mesh_cop.DiscoveryResponse
|
||||
)
|
||||
assert response.version == config.PROTOCOL_VERSION
|
||||
assert_contains_tlv(tlvs, CheckType.CONTAIN, mesh_cop.ExtendedPanid)
|
||||
assert_contains_tlv(tlvs, CheckType.CONTAIN, mesh_cop.NetworkName)
|
||||
assert_contains_tlv(tlvs, steering_data, mesh_cop.SteeringData)
|
||||
assert_contains_tlv(tlvs, steering_data, mesh_cop.JoinerUdpPort)
|
||||
|
||||
check_type = CheckType.CONTAIN if response.native_flag else CheckType.OPTIONAL
|
||||
check_type = (
|
||||
CheckType.CONTAIN if response.native_flag else CheckType.OPTIONAL
|
||||
)
|
||||
assert_contains_tlv(tlvs, check_type, mesh_cop.CommissionerUdpPort)
|
||||
|
||||
|
||||
def get_joiner_udp_port_in_discovery_response(command_msg):
|
||||
"""Get the udp port specified in a DISCOVERY RESPONSE message
|
||||
"""
|
||||
tlvs = command_msg.assertMleMessageContainsTlv(mle.ThreadDiscovery).tlvs
|
||||
udp_port_tlv = assert_contains_tlv(tlvs, CheckType.CONTAIN, mesh_cop.JoinerUdpPort)
|
||||
udp_port_tlv = assert_contains_tlv(
|
||||
tlvs, CheckType.CONTAIN, mesh_cop.JoinerUdpPort
|
||||
)
|
||||
return udp_port_tlv.udp_port
|
||||
|
||||
|
||||
def check_joiner_commissioning_messages(commissioning_messages):
|
||||
"""Verify COAP messages sent by joiner while commissioning process.
|
||||
"""
|
||||
@@ -516,21 +718,32 @@ def check_joiner_commissioning_messages(commissioning_messages):
|
||||
assert len(commissioning_messages) >= 2
|
||||
join_fin_req = commissioning_messages[0]
|
||||
assert join_fin_req.type == mesh_cop.MeshCopMessageType.JOIN_FIN_REQ
|
||||
assert_contains_tlv(join_fin_req.tlvs, CheckType.NOT_CONTAIN, mesh_cop.ProvisioningUrl)
|
||||
assert_contains_tlv(
|
||||
join_fin_req.tlvs, CheckType.NOT_CONTAIN, mesh_cop.ProvisioningUrl
|
||||
)
|
||||
join_ent_rsp = commissioning_messages[1]
|
||||
assert join_ent_rsp.type == mesh_cop.MeshCopMessageType.JOIN_ENT_RSP
|
||||
|
||||
|
||||
def check_commissioner_commissioning_messages(commissioning_messages):
|
||||
"""Verify COAP messages sent by commissioner while commissioning process.
|
||||
"""
|
||||
assert any(msg.type == mesh_cop.MeshCopMessageType.JOIN_FIN_RSP for msg in commissioning_messages)
|
||||
assert any(
|
||||
msg.type == mesh_cop.MeshCopMessageType.JOIN_FIN_RSP
|
||||
for msg in commissioning_messages
|
||||
)
|
||||
|
||||
|
||||
def check_joiner_router_commissioning_messages(commissioning_messages):
|
||||
"""Verify COAP messages sent by joiner router while commissioning process.
|
||||
"""
|
||||
assert any(msg.type == mesh_cop.MeshCopMessageType.JOIN_ENT_NTF for msg in commissioning_messages)
|
||||
assert any(
|
||||
msg.type == mesh_cop.MeshCopMessageType.JOIN_ENT_NTF
|
||||
for msg in commissioning_messages
|
||||
)
|
||||
return None
|
||||
|
||||
|
||||
def check_payload_same(tp1, tp2):
|
||||
"""Verfiy two payloads are totally the same.
|
||||
A payload is a tuple of tlvs.
|
||||
@@ -538,7 +751,10 @@ def check_payload_same(tp1, tp2):
|
||||
assert len(tp1) == len(tp2)
|
||||
for tlv in tp2:
|
||||
peer_tlv = get_sub_tlv(tp1, type(tlv))
|
||||
assert peer_tlv is not None and peer_tlv == tlv, 'peer_tlv:{}, tlv:{} type:{}'.format(peer_tlv, tlv, type(tlv))
|
||||
assert (
|
||||
peer_tlv is not None and peer_tlv == tlv
|
||||
), 'peer_tlv:{}, tlv:{} type:{}'.format(peer_tlv, tlv, type(tlv))
|
||||
|
||||
|
||||
def check_coap_message(msg, payloads, dest_addrs=None):
|
||||
if dest_addrs is not None:
|
||||
@@ -550,25 +766,30 @@ def check_coap_message(msg, payloads, dest_addrs=None):
|
||||
assert found, 'Destination address incorrect'
|
||||
check_payload_same(msg.coap.payload, payloads)
|
||||
|
||||
class SinglePrefixCheck:
|
||||
|
||||
class SinglePrefixCheck:
|
||||
def __init__(self, prefix=None, border_router_16=None):
|
||||
self._prefix = prefix
|
||||
self._border_router_16 = border_router_16
|
||||
|
||||
def check(self, prefix_tlv):
|
||||
border_router_tlv = assert_contains_tlv(prefix_tlv.sub_tlvs, CheckType.CONTAIN, network_data.BorderRouter)
|
||||
lowpan_id_tlv = assert_contains_tlv(prefix_tlv.sub_tlvs, CheckType.CONTAIN, network_data.LowpanId)
|
||||
border_router_tlv = assert_contains_tlv(
|
||||
prefix_tlv.sub_tlvs, CheckType.CONTAIN, network_data.BorderRouter
|
||||
)
|
||||
assert_contains_tlv(
|
||||
prefix_tlv.sub_tlvs, CheckType.CONTAIN, network_data.LowpanId
|
||||
)
|
||||
result = True
|
||||
if self._prefix is not None:
|
||||
result &= (self._prefix == binascii.hexlify(prefix_tlv.prefix))
|
||||
result &= self._prefix == binascii.hexlify(prefix_tlv.prefix)
|
||||
if self._border_router_16 is not None:
|
||||
result &= (self._border_router_16 == border_router_tlv.border_router_16)
|
||||
result &= (
|
||||
self._border_router_16 == border_router_tlv.border_router_16
|
||||
)
|
||||
return result
|
||||
|
||||
|
||||
class PrefixesCheck:
|
||||
|
||||
def __init__(self, prefix_cnt=0, prefix_check_list=[]):
|
||||
self._prefix_cnt = prefix_cnt
|
||||
self._prefix_check_list = prefix_check_list
|
||||
@@ -576,7 +797,9 @@ class PrefixesCheck:
|
||||
def check(self, prefix_tlvs):
|
||||
# if prefix_cnt is given, then check count only
|
||||
if self._prefix_cnt > 0:
|
||||
assert len(prefix_tlvs) >= self._prefix_cnt, 'prefix count is less than expected'
|
||||
assert (
|
||||
len(prefix_tlvs) >= self._prefix_cnt
|
||||
), 'prefix count is less than expected'
|
||||
else:
|
||||
for prefix_check in self._prefix_check_list:
|
||||
found = False
|
||||
@@ -588,28 +811,37 @@ class PrefixesCheck:
|
||||
|
||||
|
||||
class CommissioningDataCheck:
|
||||
|
||||
def __init__(self, stable=None, sub_tlv_type_list=[]):
|
||||
self._stable = stable
|
||||
self._sub_tlv_type_list = sub_tlv_type_list
|
||||
|
||||
def check(self, commissioning_data_tlv):
|
||||
if self._stable is not None:
|
||||
assert self._stable == commissioning_data_tlv.stable, 'Commissioning Data stable flag is not correct'
|
||||
assert contains_tlvs(commissioning_data_tlv.sub_tlvs, self._sub_tlv_type_list), 'Some sub tlvs are missing in Commissioning Data'
|
||||
assert (
|
||||
self._stable == commissioning_data_tlv.stable
|
||||
), 'Commissioning Data stable flag is not correct'
|
||||
assert contains_tlvs(
|
||||
commissioning_data_tlv.sub_tlvs, self._sub_tlv_type_list
|
||||
), 'Some sub tlvs are missing in Commissioning Data'
|
||||
|
||||
|
||||
class NetworkDataCheck:
|
||||
|
||||
def __init__(self, prefixes_check=None, commissioning_data_check=None):
|
||||
self._prefixes_check = prefixes_check
|
||||
self._commissioning_data_check = commissioning_data_check
|
||||
|
||||
def check(self, network_data_tlv):
|
||||
if self._prefixes_check is not None:
|
||||
prefix_tlvs = [tlv for tlv in network_data_tlv.tlvs if isinstance(tlv, network_data.Prefix)]
|
||||
prefix_tlvs = [
|
||||
tlv
|
||||
for tlv in network_data_tlv.tlvs
|
||||
if isinstance(tlv, network_data.Prefix)
|
||||
]
|
||||
self._prefixes_check.check(prefix_tlvs)
|
||||
if self._commissioning_data_check is not None:
|
||||
commissioning_data_tlv = assert_contains_tlv(network_data_tlv.tlvs, CheckType.CONTAIN, network_data.CommissioningData)
|
||||
commissioning_data_tlv = assert_contains_tlv(
|
||||
network_data_tlv.tlvs,
|
||||
CheckType.CONTAIN,
|
||||
network_data.CommissioningData,
|
||||
)
|
||||
self._commissioning_data_check.check(commissioning_data_tlv)
|
||||
|
||||
|
||||
@@ -38,11 +38,14 @@ import ipaddress
|
||||
|
||||
def expect_the_same_class(self, other):
|
||||
if not isinstance(other, self.__class__):
|
||||
raise TypeError("Expected the same class. Got {} and {}".format(type(self), type(other)))
|
||||
raise TypeError(
|
||||
"Expected the same class. Got {} and {}".format(
|
||||
type(self), type(other)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
class MessageInfo(object):
|
||||
|
||||
def __init__(self):
|
||||
self.aux_sec_hdr = None
|
||||
self.aux_sec_hdr_bytes = None
|
||||
@@ -110,7 +113,6 @@ class MacAddressType(IntEnum):
|
||||
|
||||
|
||||
class MacAddress(object):
|
||||
|
||||
def __init__(self, mac_address, _type, big_endian=True):
|
||||
if _type == MacAddressType.SHORT:
|
||||
length = 2
|
||||
@@ -137,16 +139,26 @@ class MacAddress(object):
|
||||
|
||||
def convert_to_iid(self):
|
||||
if self._type == MacAddressType.SHORT:
|
||||
return bytearray([0x00, 0x00, 0x00, 0xff, 0xfe, 0x00]) + self._mac_address[:2]
|
||||
return (
|
||||
bytearray([0x00, 0x00, 0x00, 0xff, 0xfe, 0x00])
|
||||
+ self._mac_address[:2]
|
||||
)
|
||||
elif self._type == MacAddressType.LONG:
|
||||
return bytearray([self._mac_address[0] ^ 0x02]) + self._mac_address[1:]
|
||||
return (
|
||||
bytearray([self._mac_address[0] ^ 0x02])
|
||||
+ self._mac_address[1:]
|
||||
)
|
||||
else:
|
||||
raise RuntimeError("Could not convert to IID. Invalid MAC address type: {}".format(self._type))
|
||||
raise RuntimeError(
|
||||
"Could not convert to IID. Invalid MAC address type: {}".format(
|
||||
self._type))
|
||||
|
||||
@classmethod
|
||||
def from_eui64(cls, eui64, big_endian=True):
|
||||
if not isinstance(eui64, bytearray):
|
||||
raise RuntimeError("Could not create MAC address from EUI64. Invalid data type: {}".format(type(eui64)))
|
||||
raise RuntimeError(
|
||||
"Could not create MAC address from EUI64. Invalid data type: {}".format(
|
||||
type(eui64)))
|
||||
|
||||
return cls(eui64, MacAddressType.LONG)
|
||||
|
||||
@@ -157,12 +169,18 @@ class MacAddress(object):
|
||||
elif isinstance(rloc16, bytearray):
|
||||
mac_address = rloc16[:2]
|
||||
else:
|
||||
raise RuntimeError("Could not create MAC address from RLOC16. Invalid data type: {}".format(type(rloc16)))
|
||||
raise RuntimeError(
|
||||
"Could not create MAC address from RLOC16. Invalid data type: {}".format(
|
||||
type(rloc16)))
|
||||
|
||||
return cls(mac_address, MacAddressType.SHORT)
|
||||
|
||||
def __eq__(self, other):
|
||||
return (self.type == other.type) and (self.mac_address == other.mac_address)
|
||||
return (self.type == other.type) and (
|
||||
self.mac_address == other.mac_address
|
||||
)
|
||||
|
||||
def __repr__(self):
|
||||
return "MacAddress(mac_address=b'{}', type={})".format(hexlify(self.mac_address), MacAddressType(self._type))
|
||||
return "MacAddress(mac_address=b'{}', type={})".format(
|
||||
hexlify(self.mac_address), MacAddressType(self._type)
|
||||
)
|
||||
|
||||
@@ -46,7 +46,7 @@ import sniffer
|
||||
MESH_LOCAL_PREFIX = 'fdde:ad00:beef::/64'
|
||||
MESH_LOCAL_PREFIX_REGEX_PATTERN = '^fdde:ad00:beef:(0){0,4}:'
|
||||
ROUTING_LOCATOR = '64/:0:ff:fe00:/16'
|
||||
ROUTING_LOCATOR_REGEX_PATTERN = '.*:(0)?:0{0,2}ff:fe00:\w{1,4}$'
|
||||
ROUTING_LOCATOR_REGEX_PATTERN = r'.*:(0)?:0{0,2}ff:fe00:\w{1,4}$'
|
||||
LINK_LOCAL = 'fe80:/112'
|
||||
LINK_LOCAL_REGEX_PATTERN = '^fe80:.*'
|
||||
ALOC_FLAG_REGEX_PATTERN = '.*:fc..$'
|
||||
@@ -56,11 +56,36 @@ REALM_LOCAL_ALL_ROUTERS_ADDRESS = 'ff03::2'
|
||||
LINK_LOCAL_ALL_NODES_ADDRESS = 'ff02::1'
|
||||
LINK_LOCAL_ALL_ROUTERS_ADDRESS = 'ff02::2'
|
||||
|
||||
DEFAULT_MASTER_KEY = bytearray([0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
|
||||
0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff])
|
||||
DEFAULT_MASTER_KEY = bytearray(
|
||||
[
|
||||
0x00,
|
||||
0x11,
|
||||
0x22,
|
||||
0x33,
|
||||
0x44,
|
||||
0x55,
|
||||
0x66,
|
||||
0x77,
|
||||
0x88,
|
||||
0x99,
|
||||
0xaa,
|
||||
0xbb,
|
||||
0xcc,
|
||||
0xdd,
|
||||
0xee,
|
||||
0xff,
|
||||
]
|
||||
)
|
||||
|
||||
ADDRESS_TYPE = Enum('ADDRESS_TYPE', ('LINK_LOCAL', 'GLOBAL', 'RLOC', 'ALOC', 'ML_EID'))
|
||||
RSSI = {'LINK_QULITY_0': -100, 'LINK_QULITY_1': -95, 'LINK_QULITY_2': -85, 'LINK_QULITY_3': -65}
|
||||
ADDRESS_TYPE = Enum(
|
||||
'ADDRESS_TYPE', ('LINK_LOCAL', 'GLOBAL', 'RLOC', 'ALOC', 'ML_EID')
|
||||
)
|
||||
RSSI = {
|
||||
'LINK_QULITY_0': -100,
|
||||
'LINK_QULITY_1': -95,
|
||||
'LINK_QULITY_2': -85,
|
||||
'LINK_QULITY_3': -65,
|
||||
}
|
||||
|
||||
SNIFFER_ID = int(os.getenv('SNIFFER_ID', 34))
|
||||
PANID = 0xface
|
||||
@@ -80,14 +105,16 @@ LEADER_NOTIFY_SED_BY_CHILD_UPDATE_REQUEST = True
|
||||
|
||||
PROTOCOL_VERSION = 2
|
||||
|
||||
|
||||
def create_default_network_data_prefix_sub_tlvs_factories():
|
||||
return {
|
||||
network_data.TlvType.HAS_ROUTE: network_data.HasRouteFactory(
|
||||
routes_factory=network_data.RoutesFactory(
|
||||
route_factory=network_data.RouteFactory())
|
||||
route_factory=network_data.RouteFactory()
|
||||
)
|
||||
),
|
||||
network_data.TlvType.BORDER_ROUTER: network_data.BorderRouterFactory(),
|
||||
network_data.TlvType.LOWPAN_ID: network_data.LowpanIdFactory()
|
||||
network_data.TlvType.LOWPAN_ID: network_data.LowpanIdFactory(),
|
||||
}
|
||||
|
||||
|
||||
@@ -97,9 +124,7 @@ def create_default_network_data_prefix_sub_tlvs_factory():
|
||||
|
||||
|
||||
def create_default_network_data_service_sub_tlvs_factories():
|
||||
return {
|
||||
network_data.TlvType.SERVER: network_data.ServerFactory()
|
||||
}
|
||||
return {network_data.TlvType.SERVER: network_data.ServerFactory()}
|
||||
|
||||
|
||||
def create_default_network_data_service_sub_tlvs_factory():
|
||||
@@ -138,7 +163,8 @@ def create_default_network_data_tlvs_factories():
|
||||
|
||||
def create_default_network_data_tlvs_factory():
|
||||
return network_data.NetworkDataTlvsFactory(
|
||||
sub_tlvs_factories=create_default_network_data_tlvs_factories())
|
||||
sub_tlvs_factories=create_default_network_data_tlvs_factories()
|
||||
)
|
||||
|
||||
|
||||
def create_default_mle_tlv_route64_factory():
|
||||
@@ -148,21 +174,27 @@ def create_default_mle_tlv_route64_factory():
|
||||
|
||||
def create_default_mle_tlv_network_data_factory():
|
||||
return mle.NetworkDataFactory(
|
||||
network_data_tlvs_factory=create_default_network_data_tlvs_factory())
|
||||
network_data_tlvs_factory=create_default_network_data_tlvs_factory()
|
||||
)
|
||||
|
||||
|
||||
def create_default_mle_tlv_address_registration_factory():
|
||||
return mle.AddressRegistrationFactory(
|
||||
addr_compressed_factory=mle.AddressCompressedFactory(),
|
||||
addr_full_factory=mle.AddressFullFactory())
|
||||
addr_full_factory=mle.AddressFullFactory(),
|
||||
)
|
||||
|
||||
|
||||
def create_default_mle_tlv_thread_discovery_factory():
|
||||
return mle.ThreadDiscoveryFactory(
|
||||
thread_discovery_tlvs_factory=create_default_thread_discovery_tlvs_factory())
|
||||
|
||||
|
||||
def create_default_thread_discovery_tlvs_factory():
|
||||
return mesh_cop.ThreadDiscoveryTlvsFactory(
|
||||
sub_tlvs_factories=create_default_thread_discovery_sub_tlvs_factories())
|
||||
sub_tlvs_factories=create_default_thread_discovery_sub_tlvs_factories()
|
||||
)
|
||||
|
||||
|
||||
def create_default_thread_discovery_sub_tlvs_factories():
|
||||
return {
|
||||
@@ -172,9 +204,10 @@ def create_default_thread_discovery_sub_tlvs_factories():
|
||||
mesh_cop.TlvType.NETWORK_NAME: mesh_cop.NetworkNameFactory(),
|
||||
mesh_cop.TlvType.STEERING_DATA: mesh_cop.SteeringDataFactory(),
|
||||
mesh_cop.TlvType.JOINER_UDP_PORT: mesh_cop.JoinerUdpPortFactory(),
|
||||
mesh_cop.TlvType.COMMISSIONER_UDP_PORT: mesh_cop.CommissionerUdpPortFactory()
|
||||
mesh_cop.TlvType.COMMISSIONER_UDP_PORT: mesh_cop.CommissionerUdpPortFactory(),
|
||||
}
|
||||
|
||||
|
||||
def create_default_mle_tlvs_factories():
|
||||
return {
|
||||
mle.TlvType.SOURCE_ADDRESS: mle.SourceAddressFactory(),
|
||||
@@ -203,20 +236,24 @@ def create_default_mle_tlvs_factories():
|
||||
mle.TlvType.PENDING_OPERATIONAL_DATASET: mle.PendingOperationalDatasetFactory(),
|
||||
mle.TlvType.TIME_REQUEST: mle.TimeRequestFactory(),
|
||||
mle.TlvType.TIME_PARAMETER: mle.TimeParameterFactory(),
|
||||
mle.TlvType.THREAD_DISCOVERY: create_default_mle_tlv_thread_discovery_factory()
|
||||
mle.TlvType.THREAD_DISCOVERY: create_default_mle_tlv_thread_discovery_factory(),
|
||||
}
|
||||
|
||||
|
||||
def create_default_mle_crypto_engine(master_key):
|
||||
return net_crypto.CryptoEngine(crypto_material_creator=net_crypto.MleCryptoMaterialCreator(master_key))
|
||||
return net_crypto.CryptoEngine(
|
||||
crypto_material_creator=net_crypto.MleCryptoMaterialCreator(master_key)
|
||||
)
|
||||
|
||||
|
||||
def create_default_mle_message_factory(master_key):
|
||||
return mle.MleMessageFactory(
|
||||
aux_sec_hdr_factory=net_crypto.AuxiliarySecurityHeaderFactory(),
|
||||
mle_command_factory=mle.MleCommandFactory(
|
||||
tlvs_factories=create_default_mle_tlvs_factories()),
|
||||
crypto_engine=create_default_mle_crypto_engine(master_key))
|
||||
tlvs_factories=create_default_mle_tlvs_factories()
|
||||
),
|
||||
crypto_engine=create_default_mle_crypto_engine(master_key),
|
||||
)
|
||||
|
||||
|
||||
def create_deafult_network_tlvs_factories():
|
||||
@@ -230,17 +267,21 @@ def create_deafult_network_tlvs_factories():
|
||||
network_layer.TlvType.ROUTER_MASK: network_layer.RouterMaskFactory(),
|
||||
network_layer.TlvType.ND_OPTION: network_layer.NdOptionFactory(),
|
||||
network_layer.TlvType.ND_DATA: network_layer.NdDataFactory(),
|
||||
network_layer.TlvType.THREAD_NETWORK_DATA: network_layer.ThreadNetworkDataFactory(create_default_network_data_tlvs_factory()),
|
||||
network_layer.TlvType.THREAD_NETWORK_DATA: network_layer.ThreadNetworkDataFactory(
|
||||
create_default_network_data_tlvs_factory()
|
||||
),
|
||||
network_layer.TlvType.XTAL_ACCURACY: network_layer.XtalAccuracyFactory(),
|
||||
|
||||
# Routing information are distributed in a Thread network by MLE Routing TLV
|
||||
# which is in fact MLE Route64 TLV. Thread specificaton v1.1. - Chapter 5.20
|
||||
network_layer.TlvType.MLE_ROUTING: create_default_mle_tlv_route64_factory()
|
||||
network_layer.TlvType.MLE_ROUTING: create_default_mle_tlv_route64_factory(),
|
||||
}
|
||||
|
||||
|
||||
def create_default_network_tlvs_factory():
|
||||
return SubTlvsFactory(sub_tlvs_factories=create_deafult_network_tlvs_factories())
|
||||
return SubTlvsFactory(
|
||||
sub_tlvs_factories=create_deafult_network_tlvs_factories()
|
||||
)
|
||||
|
||||
|
||||
def create_default_mesh_cop_tlvs_factories():
|
||||
return {
|
||||
@@ -280,11 +321,15 @@ def create_default_mesh_cop_tlvs_factories():
|
||||
mesh_cop.TlvType.COUNT: mesh_cop.CountFactory(),
|
||||
mesh_cop.TlvType.PERIOD: mesh_cop.PeriodFactory(),
|
||||
mesh_cop.TlvType.SCAN_DURATION: mesh_cop.ScanDurationFactory(),
|
||||
mesh_cop.TlvType.ENERGY_LIST: mesh_cop.EnergyListFactory()
|
||||
mesh_cop.TlvType.ENERGY_LIST: mesh_cop.EnergyListFactory(),
|
||||
}
|
||||
|
||||
|
||||
def create_default_mesh_cop_tlvs_factory():
|
||||
return SubTlvsFactory(sub_tlvs_factories=create_default_mesh_cop_tlvs_factories())
|
||||
return SubTlvsFactory(
|
||||
sub_tlvs_factories=create_default_mesh_cop_tlvs_factories()
|
||||
)
|
||||
|
||||
|
||||
def create_default_uri_path_based_payload_factories():
|
||||
network_layer_tlvs_factory = create_default_network_tlvs_factory()
|
||||
@@ -297,25 +342,26 @@ def create_default_uri_path_based_payload_factories():
|
||||
"/a/an": network_layer_tlvs_factory,
|
||||
"/a/sd": network_layer_tlvs_factory,
|
||||
"/c/lp": mesh_cop_tlvs_factory,
|
||||
"/c/cs": mesh_cop_tlvs_factory
|
||||
"/c/cs": mesh_cop_tlvs_factory,
|
||||
}
|
||||
|
||||
|
||||
def create_default_coap_message_factory():
|
||||
return coap.CoapMessageFactory(options_factory=coap.CoapOptionsFactory(),
|
||||
uri_path_based_payload_factories=create_default_uri_path_based_payload_factories(),
|
||||
message_id_to_uri_path_binder=coap.CoapMessageIdToUriPathBinder())
|
||||
return coap.CoapMessageFactory(
|
||||
options_factory=coap.CoapOptionsFactory(),
|
||||
uri_path_based_payload_factories=create_default_uri_path_based_payload_factories(),
|
||||
message_id_to_uri_path_binder=coap.CoapMessageIdToUriPathBinder(),
|
||||
)
|
||||
|
||||
|
||||
def create_default_ipv6_hop_by_hop_options_factories():
|
||||
return {
|
||||
109: ipv6.MPLOptionFactory()
|
||||
}
|
||||
return {109: ipv6.MPLOptionFactory()}
|
||||
|
||||
|
||||
def create_default_ipv6_hop_by_hop_options_factory():
|
||||
return ipv6.HopByHopOptionsFactory(
|
||||
options_factories=create_default_ipv6_hop_by_hop_options_factories())
|
||||
options_factories=create_default_ipv6_hop_by_hop_options_factories()
|
||||
)
|
||||
|
||||
|
||||
def create_default_based_on_src_dst_ports_udp_payload_factory(master_key):
|
||||
@@ -327,7 +373,7 @@ def create_default_based_on_src_dst_ports_udp_payload_factory(master_key):
|
||||
src_dst_port_based_payload_factories={
|
||||
19788: mle_message_factory,
|
||||
61631: coap_message_factory,
|
||||
1000: dtls_message_factory
|
||||
1000: dtls_message_factory,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -341,7 +387,7 @@ def create_default_ipv6_icmp_body_factories():
|
||||
ipv6.ICMP_DESTINATION_UNREACHABLE: ipv6.ICMPv6DestinationUnreachableFactory(),
|
||||
ipv6.ICMP_ECHO_REQUEST: ipv6.ICMPv6EchoBodyFactory(),
|
||||
ipv6.ICMP_ECHO_RESPONSE: ipv6.ICMPv6EchoBodyFactory(),
|
||||
"default": ipv6.BytesPayloadFactory()
|
||||
"default": ipv6.BytesPayloadFactory(),
|
||||
}
|
||||
|
||||
|
||||
@@ -349,33 +395,30 @@ def create_default_ipv6_upper_layer_factories(master_key):
|
||||
return {
|
||||
ipv6.IPV6_NEXT_HEADER_UDP: ipv6.UDPDatagramFactory(
|
||||
udp_header_factory=ipv6.UDPHeaderFactory(),
|
||||
udp_payload_factory=create_default_based_on_src_dst_ports_udp_payload_factory(master_key)
|
||||
udp_payload_factory=create_default_based_on_src_dst_ports_udp_payload_factory(
|
||||
master_key
|
||||
),
|
||||
),
|
||||
ipv6.IPV6_NEXT_HEADER_ICMP: ipv6.ICMPv6Factory(
|
||||
body_factories=create_default_ipv6_icmp_body_factories()
|
||||
)
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
def create_default_lowpan_extension_headers_factories():
|
||||
return {
|
||||
ipv6.IPV6_NEXT_HEADER_HOP_BY_HOP: lowpan.LowpanHopByHopFactory(
|
||||
hop_by_hop_options_factory=create_default_ipv6_hop_by_hop_options_factory()
|
||||
)
|
||||
}
|
||||
return {ipv6.IPV6_NEXT_HEADER_HOP_BY_HOP: lowpan.LowpanHopByHopFactory(
|
||||
hop_by_hop_options_factory=create_default_ipv6_hop_by_hop_options_factory())}
|
||||
|
||||
|
||||
def create_default_ipv6_extension_headers_factories():
|
||||
return {
|
||||
ipv6.IPV6_NEXT_HEADER_HOP_BY_HOP: ipv6.HopByHopFactory(
|
||||
hop_by_hop_options_factory=create_default_ipv6_hop_by_hop_options_factory())
|
||||
}
|
||||
return {ipv6.IPV6_NEXT_HEADER_HOP_BY_HOP: ipv6.HopByHopFactory(
|
||||
hop_by_hop_options_factory=create_default_ipv6_hop_by_hop_options_factory())}
|
||||
|
||||
|
||||
def create_default_ipv6_packet_factory(master_key):
|
||||
return ipv6.IPv6PacketFactory(
|
||||
ehf=create_default_ipv6_extension_headers_factories(),
|
||||
ulpf=create_default_ipv6_upper_layer_factories(master_key)
|
||||
ulpf=create_default_ipv6_upper_layer_factories(master_key),
|
||||
)
|
||||
|
||||
|
||||
@@ -387,7 +430,7 @@ def create_default_lowpan_decompressor(context_manager):
|
||||
lowpan_extension_headers_factory=lowpan.LowpanExtensionHeadersFactory(
|
||||
ext_headers_factories=create_default_lowpan_extension_headers_factories()
|
||||
),
|
||||
lowpan_udp_header_factory=lowpan.LowpanUdpHeaderFactory()
|
||||
lowpan_udp_header_factory=lowpan.LowpanUdpHeaderFactory(),
|
||||
)
|
||||
|
||||
|
||||
@@ -398,12 +441,14 @@ def create_default_thread_context_manager():
|
||||
return context_manager
|
||||
|
||||
|
||||
def create_default_lowpan_parser(context_manager, master_key=DEFAULT_MASTER_KEY):
|
||||
def create_default_lowpan_parser(
|
||||
context_manager, master_key=DEFAULT_MASTER_KEY
|
||||
):
|
||||
return lowpan.LowpanParser(
|
||||
lowpan_mesh_header_factory=lowpan.LowpanMeshHeaderFactory(),
|
||||
lowpan_decompressor=create_default_lowpan_decompressor(context_manager),
|
||||
lowpan_fragements_buffers_manager=lowpan.LowpanFragmentsBuffersManager(),
|
||||
ipv6_packet_factory=create_default_ipv6_packet_factory(master_key)
|
||||
ipv6_packet_factory=create_default_ipv6_packet_factory(master_key),
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -27,6 +27,10 @@
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
|
||||
from builtins import input
|
||||
|
||||
|
||||
class Inspector:
|
||||
"""This class provides a way to inspect node status of a test case.
|
||||
|
||||
@@ -71,7 +75,7 @@ class Inspector:
|
||||
"""
|
||||
node = self.test_case.nodes[nodeid]
|
||||
while True:
|
||||
line = raw_input('> ')
|
||||
line = input('> ')
|
||||
if not line:
|
||||
continue
|
||||
|
||||
@@ -85,7 +89,7 @@ class Inspector:
|
||||
""" Start inspecting.
|
||||
"""
|
||||
while True:
|
||||
line = raw_input('# ')
|
||||
line = input('# ')
|
||||
if not line:
|
||||
continue
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user