[posix] implement virtual time and update tests to utilize virtual time (#2508)

This commit adds the following features:

- Example posix drivers to support virtual time simulation, allowing tests
  to run faster than real time.

- A python-based simulation driver that coordinates the virtual time
  simulations.  Each alarm event and message transmission across all nodes
  are scheduled in a single discrete time event queue.  As a result, only
  a single node is making forward progress at a time.

- Updated tests to utilize new virtual-time simulator, allowing them to run
  faster than real time.

- To enable virtual time feature, define VIRTUAL_TIME=1 env var and set
  CPPFLAGS=-DOPENTHREAD_POSIX_VIRTUAL_TIME=1.
This commit is contained in:
Jonathan Hui
2018-01-29 19:30:46 +00:00
committed by GitHub
parent 0403a1baf5
commit d426d7cfbd
107 changed files with 2600 additions and 882 deletions
@@ -37,15 +37,16 @@ import node
LEADER = 1
ROUTER = 2
SNIFFER = 3
class Cert_5_1_01_RouterAttach(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)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -58,29 +59,23 @@ class Cert_5_1_01_RouterAttach(unittest.TestCase):
self.nodes[ROUTER].enable_whitelist()
self.nodes[ROUTER].set_router_selection_jitter(1)
self.sniffer = config.create_default_thread_sniffer(SNIFFER)
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
time.sleep(4)
self.nodes[ROUTER].start()
time.sleep(7)
self.simulator.go(7)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
leader_messages = self.sniffer.get_messages_sent_by(LEADER)
router_messages = self.sniffer.get_messages_sent_by(ROUTER)
leader_messages = self.simulator.get_messages_sent_by(LEADER)
router_messages = self.simulator.get_messages_sent_by(ROUTER)
# 1 - Leader
msg = leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
@@ -186,6 +181,5 @@ 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()
@@ -38,16 +38,17 @@ LEADER = 1
ROUTER = 2
ED = 3
SED = 4
SNIFFER = 5
MTDS = [ED, SED]
class Cert_5_1_02_ChildAddressTimeout(unittest.TestCase):
def setUp(self):
self.simulator = config.create_default_simulator()
self.nodes = {}
for i in range(1, 5):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -74,54 +75,48 @@ class Cert_5_1_02_ChildAddressTimeout(unittest.TestCase):
self.nodes[SED].add_whitelist(self.nodes[ROUTER].get_addr64())
self.nodes[SED].enable_whitelist()
self.sniffer = config.create_default_thread_sniffer(SNIFFER)
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
time.sleep(4)
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[SED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED].get_state(), 'child')
ed_addrs = self.nodes[ED].get_addrs()
sed_addrs = self.nodes[SED].get_addrs()
self.nodes[ED].stop()
time.sleep(5)
self.simulator.go(5)
for addr in ed_addrs:
if addr[0:4] != 'fe80':
self.assertFalse(self.nodes[LEADER].ping(addr))
self.nodes[SED].stop()
time.sleep(5)
self.simulator.go(5)
for addr in sed_addrs:
if addr[0:4] != 'fe80':
self.assertFalse(self.nodes[LEADER].ping(addr))
leader_messages = self.sniffer.get_messages_sent_by(LEADER)
router1_messages = self.sniffer.get_messages_sent_by(ROUTER)
ed_messages = self.sniffer.get_messages_sent_by(ED)
sed_messages = self.sniffer.get_messages_sent_by(SED)
leader_messages = self.simulator.get_messages_sent_by(LEADER)
router1_messages = self.simulator.get_messages_sent_by(ROUTER)
ed_messages = self.simulator.get_messages_sent_by(ED)
sed_messages = self.simulator.get_messages_sent_by(SED)
# 1 - All
leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
@@ -38,15 +38,16 @@ import node
LEADER = 1
ROUTER1 = 2
ROUTER2 = 3
SNIFFER = 4
class Cert_5_1_03_RouterAddressReallocation(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)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -68,44 +69,38 @@ class Cert_5_1_03_RouterAddressReallocation(unittest.TestCase):
self.nodes[ROUTER2].enable_whitelist()
self.nodes[ROUTER2].set_router_selection_jitter(1)
self.sniffer = config.create_default_thread_sniffer(SNIFFER)
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
time.sleep(4)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
rloc16 = self.nodes[ROUTER1].get_addr16()
self.nodes[ROUTER2].set_network_id_timeout(110)
self.nodes[LEADER].stop()
time.sleep(140)
self.simulator.go(140)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'leader')
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.assertEqual(self.nodes[ROUTER1].get_addr16(), rloc16)
leader_messages = self.sniffer.get_messages_sent_by(LEADER)
router1_messages = self.sniffer.get_messages_sent_by(ROUTER1)
router2_messages = self.sniffer.get_messages_sent_by(ROUTER2)
leader_messages = 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)
# 2 - All
leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
@@ -38,15 +38,16 @@ import node
LEADER = 1
ROUTER1 = 2
ROUTER2 = 3
SNIFFER = 4
class Cert_5_1_04_RouterAddressReallocation(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)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -68,43 +69,37 @@ class Cert_5_1_04_RouterAddressReallocation(unittest.TestCase):
self.nodes[ROUTER2].enable_whitelist()
self.nodes[ROUTER2].set_router_selection_jitter(1)
self.sniffer = config.create_default_thread_sniffer(SNIFFER)
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
time.sleep(4)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
rloc16 = self.nodes[ROUTER1].get_addr16()
self.nodes[ROUTER2].set_network_id_timeout(200)
self.nodes[LEADER].stop()
time.sleep(220)
self.simulator.go(220)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'leader')
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.assertEqual(self.nodes[ROUTER1].get_addr16(), rloc16)
leader_messages = self.sniffer.get_messages_sent_by(LEADER)
router1_messages = self.sniffer.get_messages_sent_by(ROUTER1)
router2_messages = self.sniffer.get_messages_sent_by(ROUTER2)
leader_messages = 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)
# 2 - All
leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
@@ -37,15 +37,16 @@ import node
LEADER = 1
ROUTER1 = 2
SNIFFER = 3
class Cert_5_1_05_RouterAddressTimeout(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)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -56,53 +57,47 @@ class Cert_5_1_05_RouterAddressTimeout(unittest.TestCase):
self.nodes[ROUTER1].set_mode('rsdn')
self._setUpRouter1()
self.sniffer = config.create_default_thread_sniffer(SNIFFER)
self.sniffer.start()
def _setUpRouter1(self):
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64())
self.nodes[ROUTER1].enable_whitelist()
self.nodes[ROUTER1].set_router_selection_jitter(1)
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
time.sleep(4)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
rloc16 = self.nodes[ROUTER1].get_addr16()
self.nodes[ROUTER1].reset()
self._setUpRouter1()
time.sleep(200)
self.simulator.go(200)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.assertNotEqual(self.nodes[ROUTER1].get_addr16(), rloc16)
rloc16 = self.nodes[ROUTER1].get_addr16()
self.nodes[ROUTER1].reset()
self._setUpRouter1()
time.sleep(300)
self.simulator.go(300)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.assertEqual(self.nodes[ROUTER1].get_addr16(), rloc16)
leader_messages = self.sniffer.get_messages_sent_by(LEADER)
router1_messages = self.sniffer.get_messages_sent_by(ROUTER1)
leader_messages = self.simulator.get_messages_sent_by(LEADER)
router1_messages = self.simulator.get_messages_sent_by(ROUTER1)
# 2 - All
leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
@@ -37,15 +37,16 @@ import node
LEADER = 1
ROUTER1 = 2
SNIFFER = 3
class Cert_5_1_06_RemoveRouterId(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)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -58,25 +59,19 @@ class Cert_5_1_06_RemoveRouterId(unittest.TestCase):
self.nodes[ROUTER1].enable_whitelist()
self.nodes[ROUTER1].set_router_selection_jitter(1)
self.sniffer = config.create_default_thread_sniffer(SNIFFER)
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
time.sleep(4)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
rloc16 = self.nodes[ROUTER1].get_addr16()
@@ -84,14 +79,14 @@ class Cert_5_1_06_RemoveRouterId(unittest.TestCase):
self.assertTrue(self.nodes[LEADER].ping(addr))
self.nodes[LEADER].release_router_id(rloc16 >> 10)
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
for addr in self.nodes[ROUTER1].get_addrs():
self.assertTrue(self.nodes[LEADER].ping(addr))
leader_messages = self.sniffer.get_messages_sent_by(LEADER)
router1_messages = self.sniffer.get_messages_sent_by(ROUTER1)
leader_messages = self.simulator.get_messages_sent_by(LEADER)
router1_messages = self.simulator.get_messages_sent_by(ROUTER1)
# 1 - All
leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -38,9 +39,11 @@ SED1 = 7
class Cert_5_1_07_MaxChildCount(unittest.TestCase):
def setUp(self):
self.simulator = config.create_default_simulator()
self.nodes = {}
for i in range(1, 13):
self.nodes[i] = node.Node(i, (i >= 3))
self.nodes[i] = node.Node(i, (i >= 3), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -69,20 +72,20 @@ class Cert_5_1_07_MaxChildCount(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
time.sleep(4)
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
for i in range(3, 13):
self.nodes[i].start()
time.sleep(7)
self.simulator.go(7)
self.assertEqual(self.nodes[i].get_state(), 'child')
ipaddrs = self.nodes[SED1].get_addrs()
@@ -39,15 +39,16 @@ ROUTER1 = 2
ROUTER2 = 3
ROUTER3 = 4
ROUTER4 = 5
SNIFFER = 6
class Cert_5_1_08_RouterAttachConnectivity(unittest.TestCase):
def setUp(self):
self.simulator = config.create_default_simulator()
self.nodes = {}
for i in range(1, 6):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -85,33 +86,27 @@ class Cert_5_1_08_RouterAttachConnectivity(unittest.TestCase):
self.nodes[ROUTER4].enable_whitelist()
self.nodes[ROUTER4].set_router_selection_jitter(1)
self.sniffer = config.create_default_thread_sniffer(SNIFFER)
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
time.sleep(4)
for i in range(2, 6):
self.nodes[i].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[i].get_state(), 'router')
leader_messages = self.sniffer.get_messages_sent_by(LEADER)
router1_messages = self.sniffer.get_messages_sent_by(ROUTER1)
router2_messages = self.sniffer.get_messages_sent_by(ROUTER2)
router3_messages = self.sniffer.get_messages_sent_by(ROUTER3)
router4_messages = self.sniffer.get_messages_sent_by(ROUTER4)
leader_messages = 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)
router3_messages = self.simulator.get_messages_sent_by(ROUTER3)
router4_messages = self.simulator.get_messages_sent_by(ROUTER4)
# 1 - Leader, Router1, Router2, Router3
leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
@@ -39,15 +39,16 @@ ROUTER1 = 2
REED0 = 3
REED1 = 4
ROUTER2 = 5
SNIFFER = 6
class Cert_5_1_09_REEDAttachConnectivity(unittest.TestCase):
def setUp(self):
self.simulator = config.create_default_simulator()
self.nodes = {}
for i in range(1, 6):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -85,47 +86,41 @@ class Cert_5_1_09_REEDAttachConnectivity(unittest.TestCase):
self.nodes[ROUTER2].enable_whitelist()
self.nodes[ROUTER2].set_router_selection_jitter(1)
self.sniffer = config.create_default_thread_sniffer(SNIFFER)
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
time.sleep(4)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[REED0].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[REED0].get_state(), 'child')
self.nodes[REED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[REED1].get_state(), 'child')
time.sleep(10)
self.simulator.go(10)
self.nodes[ROUTER2].start()
time.sleep(10)
self.simulator.go(10)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.assertEqual(self.nodes[REED1].get_state(), 'router')
leader_messages = self.sniffer.get_messages_sent_by(LEADER)
router1_messages = self.sniffer.get_messages_sent_by(ROUTER1)
reed0_messages = self.sniffer.get_messages_sent_by(REED0)
reed1_messages = self.sniffer.get_messages_sent_by(REED1)
router2_messages = self.sniffer.get_messages_sent_by(ROUTER2)
leader_messages = self.simulator.get_messages_sent_by(LEADER)
router1_messages = self.simulator.get_messages_sent_by(ROUTER1)
reed0_messages = self.simulator.get_messages_sent_by(REED0)
reed1_messages = self.simulator.get_messages_sent_by(REED1)
router2_messages = self.simulator.get_messages_sent_by(ROUTER2)
# 1 - Leader, Router1, REED1, REED2
leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
@@ -38,15 +38,16 @@ LEADER = 1
ROUTER1 = 2
ROUTER2 = 3
ROUTER3 = 4
SNIFFER = 5
class Cert_5_1_10_RouterAttachLinkQuality(unittest.TestCase):
def setUp(self):
self.simulator = config.create_default_simulator()
self.nodes = {}
for i in range(1, 5):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -75,39 +76,33 @@ class Cert_5_1_10_RouterAttachLinkQuality(unittest.TestCase):
self.nodes[ROUTER3].enable_whitelist()
self.nodes[ROUTER3].set_router_selection_jitter(1)
self.sniffer = config.create_default_thread_sniffer(SNIFFER)
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
time.sleep(4)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[ROUTER3].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER3].get_state(), 'router')
leader_messages = self.sniffer.get_messages_sent_by(LEADER)
router1_messages = self.sniffer.get_messages_sent_by(ROUTER1)
router2_messages = self.sniffer.get_messages_sent_by(ROUTER2)
router3_messages = self.sniffer.get_messages_sent_by(ROUTER3)
leader_messages = 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)
router3_messages = self.simulator.get_messages_sent_by(ROUTER3)
# 1 - Leader, Router1, Router2
leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
@@ -38,15 +38,16 @@ LEADER = 1
REED = 2
ROUTER2 = 3
ROUTER1 = 4
SNIFFER = 5
class Cert_5_1_11_REEDAttachLinkQuality(unittest.TestCase):
def setUp(self):
self.simulator = config.create_default_simulator()
self.nodes = {}
for i in range(1, 5):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -75,40 +76,34 @@ class Cert_5_1_11_REEDAttachLinkQuality(unittest.TestCase):
self.nodes[ROUTER1].enable_whitelist()
self.nodes[ROUTER1].set_router_selection_jitter(1)
self.sniffer = config.create_default_thread_sniffer(SNIFFER)
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
time.sleep(4)
self.nodes[REED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[REED].get_state(), 'child')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[ROUTER1].start()
time.sleep(10)
self.simulator.go(10)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.assertEqual(self.nodes[REED].get_state(), 'router')
leader_messages = self.sniffer.get_messages_sent_by(LEADER)
reed_messages = self.sniffer.get_messages_sent_by(REED)
router1_messages = self.sniffer.get_messages_sent_by(ROUTER1)
router2_messages = self.sniffer.get_messages_sent_by(ROUTER2)
leader_messages = self.simulator.get_messages_sent_by(LEADER)
reed_messages = self.simulator.get_messages_sent_by(REED)
router1_messages = self.simulator.get_messages_sent_by(ROUTER1)
router2_messages = self.simulator.get_messages_sent_by(ROUTER2)
# 1 - Leader. REED1, Router2
leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
@@ -37,15 +37,16 @@ import node
LEADER = 1
ROUTER1 = 2
ROUTER2 = 3
SNIFFER = 4
class Cert_5_1_12_NewRouterSync(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)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -65,16 +66,11 @@ class Cert_5_1_12_NewRouterSync(unittest.TestCase):
self.nodes[ROUTER2].enable_whitelist()
self.nodes[ROUTER2].set_router_selection_jitter(1)
self.sniffer = config.create_default_thread_sniffer(SNIFFER)
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def verify_step_4(self, router1_messages, router2_messages, req_receiver, accept_receiver):
if router2_messages.contains_mle_message(mle.CommandType.LINK_REQUEST) and \
@@ -113,23 +109,22 @@ class Cert_5_1_12_NewRouterSync(unittest.TestCase):
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
time.sleep(4)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
time.sleep(10)
self.simulator.go(10)
leader_messages = self.sniffer.get_messages_sent_by(LEADER)
router1_messages = self.sniffer.get_messages_sent_by(ROUTER1)
router2_messages = self.sniffer.get_messages_sent_by(ROUTER2)
leader_messages = 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)
# 2 - Router1
msg = router1_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
@@ -142,11 +137,11 @@ class Cert_5_1_12_NewRouterSync(unittest.TestCase):
self.nodes[ROUTER1].add_whitelist(self.nodes[ROUTER2].get_addr64())
self.nodes[ROUTER2].add_whitelist(self.nodes[ROUTER1].get_addr64())
time.sleep(35)
self.simulator.go(35)
leader_messages = self.sniffer.get_messages_sent_by(LEADER)
router1_messages = self.sniffer.get_messages_sent_by(ROUTER1)
router2_messages = self.sniffer.get_messages_sent_by(ROUTER2)
leader_messages = 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
@@ -36,15 +36,16 @@ import node
LEADER = 1
ROUTER = 2
SNIFFER = 3
class Cert_5_1_13_RouterReset(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)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -55,45 +56,39 @@ class Cert_5_1_13_RouterReset(unittest.TestCase):
self.nodes[ROUTER].set_mode('rsdn')
self._setUpRouter()
self.sniffer = config.create_default_thread_sniffer(SNIFFER)
self.sniffer.start()
def _setUpRouter(self):
self.nodes[ROUTER].add_whitelist(self.nodes[LEADER].get_addr64())
self.nodes[ROUTER].enable_whitelist()
self.nodes[ROUTER].set_router_selection_jitter(1)
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
time.sleep(4)
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
rloc16 = self.nodes[ROUTER].get_addr16()
self.nodes[ROUTER].reset()
self._setUpRouter()
time.sleep(5)
self.simulator.go(5)
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.assertEqual(self.nodes[ROUTER].get_addr16(), rloc16)
leader_messages = self.sniffer.get_messages_sent_by(LEADER)
router1_messages = self.sniffer.get_messages_sent_by(ROUTER)
leader_messages = self.simulator.get_messages_sent_by(LEADER)
router1_messages = self.simulator.get_messages_sent_by(ROUTER)
# 1 - All
leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
@@ -45,9 +45,11 @@ MED1 = 4
class Cert_5_2_01_REEDAttach(unittest.TestCase):
def setUp(self):
self.simulator = config.create_default_simulator()
self.nodes = {}
for i in range(1, 5):
self.nodes[i] = node.Node(i, i == MED1)
self.nodes[i] = node.Node(i, i == MED1, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -74,39 +76,34 @@ class Cert_5_2_01_REEDAttach(unittest.TestCase):
self.nodes[MED1].add_whitelist(self.nodes[REED1].get_addr64())
self.nodes[MED1].enable_whitelist()
self.sniffer = config.create_default_thread_sniffer()
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
# 1 DUT_ROUTER1: Attach to LEADER
self.nodes[DUT_ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[DUT_ROUTER1].get_state(), 'router')
# DUT_ROUTER1: Verify MLE advertisements
router1_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER1)
router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
msg = router1_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
command.check_mle_advertisement(msg)
# 2 REED1: Attach to DUT_ROUTER1
self.nodes[REED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[REED1].get_state(), 'child')
# 3 DUT_ROUTER1: Verify MLE Parent Response
router1_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER1)
router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
msg = router1_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
msg.assertSentToNode(self.nodes[REED1])
command.check_parent_response(msg)
@@ -120,18 +117,18 @@ class Cert_5_2_01_REEDAttach(unittest.TestCase):
# 6 MED1: Attach to REED1
self.nodes[MED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[MED1].get_state(), 'child')
# 7 REED1: Verify sending Address Solicit Request to DUT_ROUTER1
reed1_messages = self.sniffer.get_messages_sent_by(REED1)
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]);
msg.assertCoapMessageRequestUriPath('/a/as')
# 8 DUT_ROUTER1: Verify forwarding REED1's Address Solicit Request to LEADER
router1_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER1)
router1_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
msg = router1_messages.next_coap_message('0.02')
msg.assertSentToNode(self.nodes[LEADER]);
msg.assertCoapMessageRequestUriPath('/a/as')
@@ -39,13 +39,14 @@ DUT_LEADER = 1
ROUTER_1 = 2
ROUTER_31 = 32
ROUTER_32 = 33
SNIFFER = 34
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)
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()
@@ -53,7 +54,7 @@ class Cert_5_2_3_LeaderReject2Hops(unittest.TestCase):
self.nodes[DUT_LEADER].set_router_downgrade_threshold(33)
for i in range(2, 33):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[i].set_panid(0xface)
self.nodes[i].set_mode('rsdn')
self.nodes[i].add_whitelist(self.nodes[DUT_LEADER].get_addr64())
@@ -63,7 +64,7 @@ class Cert_5_2_3_LeaderReject2Hops(unittest.TestCase):
self.nodes[i].set_router_downgrade_threshold(33)
self.nodes[i].set_router_selection_jitter(1)
self.nodes[ROUTER_32] = node.Node(ROUTER_32)
self.nodes[ROUTER_32] = node.Node(ROUTER_32, simulator=self.simulator)
self.nodes[ROUTER_32].set_panid(0xface)
self.nodes[ROUTER_32].set_mode('rsdn')
self.nodes[ROUTER_32].add_whitelist(self.nodes[ROUTER_1].get_addr64())
@@ -73,38 +74,33 @@ class Cert_5_2_3_LeaderReject2Hops(unittest.TestCase):
self.nodes[ROUTER_32].set_router_downgrade_threshold(33)
self.nodes[ROUTER_32].set_router_selection_jitter(1)
self.sniffer = config.create_default_thread_sniffer(SNIFFER)
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
# 1
self.nodes[DUT_LEADER].start()
self.nodes[DUT_LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[DUT_LEADER].get_state(), 'leader')
for i in range(2, 32):
self.nodes[i].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[i].get_state(), 'router')
leader_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
# 2
self.nodes[ROUTER_31].start()
time.sleep(5)
self.simulator.go(5)
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.
leader_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
msg = leader_messages.next_coap_message('2.04')
msg.assertCoapMessageContainsTlv(network_layer.Status)
msg.assertCoapMessageContainsTlv(network_layer.RouterMask)
@@ -119,10 +115,10 @@ class Cert_5_2_3_LeaderReject2Hops(unittest.TestCase):
# 5 - Router_32
self.nodes[ROUTER_32].start()
time.sleep(5)
self.simulator.go(5)
# 6 - DUT_LEADER
leader_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
msg = leader_messages.next_coap_message('2.04')
msg.assertCoapMessageContainsTlv(network_layer.Status)
@@ -39,7 +39,6 @@ LEADER = 1
ROUTER = 16
DUT_REED = 17
ED = 18
SNIFFER = 19
MESH_LOCAL_PREFIX = 'fdde:ad00:beef:0:'
ROUTING_LACATOR = ':0:ff:fe00'
REED_ADVERTISEMENT_INTERVAL = 570
@@ -48,9 +47,11 @@ ROUTER_SELECTION_JITTER = 1
class Cert_5_2_4_REEDUpgrade(unittest.TestCase):
def setUp(self):
self.simulator = config.create_default_simulator()
self.nodes = {}
for i in range(1, 19):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -77,34 +78,29 @@ class Cert_5_2_4_REEDUpgrade(unittest.TestCase):
self.nodes[ED].add_whitelist(self.nodes[DUT_REED].get_addr64())
self.nodes[ED].enable_whitelist()
self.sniffer = config.create_default_thread_sniffer(SNIFFER)
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
# 1 Ensure topology is formed correctly without the DUT_REED.
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
for i in range(2, 17):
self.nodes[i].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[i].get_state(), 'router')
# 2 DUT_REED: Attach to ROUTER, 2-hops from the Leader.
self.nodes[DUT_REED].start()
time.sleep(5)
time.sleep(ROUTER_SELECTION_JITTER)
self.simulator.go(5)
self.simulator.go(ROUTER_SELECTION_JITTER)
reed_messages = self.sniffer.get_messages_sent_by(DUT_REED)
reed_messages = self.simulator.get_messages_sent_by(DUT_REED)
# The DUT_REED must not send a coap message here.
msg = reed_messages.does_not_contain_coap_message()
@@ -119,18 +115,18 @@ class Cert_5_2_4_REEDUpgrade(unittest.TestCase):
msg.assertMleMessageDoesNotContainTlv(mle.Route64)
# 4 Wait for DUT_REED to send the second packet.
time.sleep(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.sniffer.get_messages_sent_by(DUT_REED)
reed_messages = self.simulator.get_messages_sent_by(DUT_REED)
msg = reed_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
# 6 ED
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
# 7 DUT_REED: Verify MLE Parent Response.
reed_messages = self.sniffer.get_messages_sent_by(DUT_REED)
reed_messages = self.simulator.get_messages_sent_by(DUT_REED)
msg = reed_messages.next_mle_message(mle.CommandType.PARENT_RESPONSE)
msg.assertSentToNode(self.nodes[ED])
msg.assertMleMessageContainsTlv(mle.SourceAddress)
@@ -43,9 +43,11 @@ ROUTER_SELECTION_JITTER = 1
class Cert_5_2_5_AddressQuery(unittest.TestCase):
def setUp(self):
self.simulator = config.create_default_simulator()
self.nodes = {}
for i in range(1, 19):
self.nodes[i] = node.Node(i, (i == ED1))
self.nodes[i] = node.Node(i, (i == ED1), simulator=self.simulator)
self.nodes[LEADER].set_panid()
self.nodes[LEADER].set_mode('rsdn')
@@ -72,28 +74,23 @@ class Cert_5_2_5_AddressQuery(unittest.TestCase):
self.nodes[DUT_REED].enable_whitelist()
self.nodes[DUT_REED].set_router_selection_jitter(1)
self.sniffer = config.create_default_thread_sniffer()
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
# 1. LEADER: DHCPv6 Server for prefix 2001::/64.
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[LEADER].add_prefix('2001::/64', 'pdros')
self.nodes[LEADER].register_netdata()
# 2. BR: SLAAC Server for prefix 2002::/64.
self.nodes[BR].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[BR].get_state(), 'router')
self.nodes[BR].add_prefix('2002::/64', 'paros')
self.nodes[BR].register_netdata()
@@ -103,19 +100,19 @@ class Cert_5_2_5_AddressQuery(unittest.TestCase):
if i == BR:
continue
self.nodes[i].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[i].get_state(), 'router')
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
# 4. Bring up DUT_REED.
self.nodes[DUT_REED].start()
time.sleep(5)
time.sleep(ROUTER_SELECTION_JITTER)
self.simulator.go(5)
self.simulator.go(ROUTER_SELECTION_JITTER)
reed_messages = self.sniffer.get_messages_sent_by(DUT_REED)
reed_messages = self.simulator.get_messages_sent_by(DUT_REED)
# Verify DUT_REED doesn't try to become router.
msg = reed_messages.does_not_contain_coap_message()
@@ -129,7 +126,7 @@ class Cert_5_2_5_AddressQuery(unittest.TestCase):
mleid = self.nodes[DUT_REED].get_ip6_address(config.ADDRESS_TYPE.ML_EID)
self.assertTrue(self.nodes[ED1].ping(mleid))
reed_messages = self.sniffer.get_messages_sent_by(DUT_REED)
reed_messages = self.simulator.get_messages_sent_by(DUT_REED)
msg = reed_messages.next_coap_message('0.02')
command.check_address_notification(msg, self.nodes[DUT_REED], self.nodes[LEADER])
@@ -145,7 +142,7 @@ class Cert_5_2_5_AddressQuery(unittest.TestCase):
raise "Error: Address is unexpected."
self.assertTrue(self.nodes[ED1].ping(global_address))
reed_messages = self.sniffer.get_messages_sent_by(DUT_REED)
reed_messages = self.simulator.get_messages_sent_by(DUT_REED)
msg = reed_messages.next_coap_message('0.02')
command.check_address_notification(msg, self.nodes[DUT_REED], self.nodes[LEADER])
@@ -42,9 +42,11 @@ ROUTER24 = 24
class Cert_5_2_06_RouterDowngrade(unittest.TestCase):
def setUp(self):
self.simulator = config.create_default_simulator()
self.nodes = {}
for i in range(1, 25):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[i].set_panid()
self.nodes[i].set_mode('rsdn')
self.nodes[i].set_router_selection_jitter(1)
@@ -52,44 +54,39 @@ class Cert_5_2_06_RouterDowngrade(unittest.TestCase):
self.nodes[i].set_router_upgrade_threshold(32)
self.nodes[i].set_router_downgrade_threshold(32)
self.sniffer = config.create_default_thread_sniffer()
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
# 1 Ensure topology is formed correctly without ROUTER24.
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
for i in range(2, 24):
self.nodes[i].start()
time.sleep(5)
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.
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER1)
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.
self.nodes[ROUTER24].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER24].get_state(), 'router')
# 3 DUT_ROUTER1:
time.sleep(10)
self.simulator.go(10)
self.assertEqual(self.nodes[DUT_ROUTER1].get_state(), 'child')
# Verify it sent a Parent Request and Child ID Request.
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER1)
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
dut_messages.next_mle_message(mle.CommandType.PARENT_REQUEST)
dut_messages.next_mle_message(mle.CommandType.CHILD_ID_REQUEST)
@@ -42,33 +42,30 @@ DUT_REED = 17
class Cert_5_2_7_REEDSynchronization(unittest.TestCase):
def setUp(self):
self.simulator = config.create_default_simulator()
self.nodes = {}
for i in range(1, 18):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[i].set_panid(0xface)
self.nodes[i].set_mode('rsdn')
self.nodes[i].set_router_selection_jitter(1)
self.sniffer = config.create_default_thread_sniffer()
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
# 1. Ensure topology is formed correctly without DUT_ROUTER1.
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
for i in range(2, 17):
self.nodes[i].start()
time.sleep(5)
self.simulator.go(5)
for i in range(2, 17):
self.assertEqual(self.nodes[i].get_state(), 'router')
@@ -78,11 +75,11 @@ class Cert_5_2_7_REEDSynchronization(unittest.TestCase):
self.nodes[DUT_REED].add_whitelist(self.nodes[DUT_ROUTER1].get_addr64(), config.RSSI['LINK_QULITY_1'])
self.nodes[DUT_REED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[DUT_REED].get_state(), 'child')
# The DUT_REED must not send a coap message here.
reed_messages = self.sniffer.get_messages_sent_by(DUT_REED)
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"
@@ -92,8 +89,8 @@ class Cert_5_2_7_REEDSynchronization(unittest.TestCase):
command.check_link_request(msg)
# 4. DUT_ROUTER1: Verify sent a Link Accept to DUT_REED.
time.sleep(30)
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER1)
self.simulator.go(30)
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER1)
flag_link_accept = False
while True:
msg = dut_messages.next_mle_message(mle.CommandType.LINK_ACCEPT, False)
@@ -39,9 +39,11 @@ 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):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -54,15 +56,16 @@ class Cert_5_3_1_LinkLocal(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
# 1
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[DUT_ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[DUT_ROUTER1].get_state(), 'router')
# 2 & 3
@@ -41,9 +41,11 @@ 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):
self.nodes[i] = node.Node(i, (i == SED1))
self.nodes[i] = node.Node(i, (i == SED1), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -70,33 +72,28 @@ class Cert_5_3_2_RealmLocal(unittest.TestCase):
self.nodes[SED1].enable_whitelist()
self.nodes[SED1].set_timeout(3)
self.sniffer = config.create_default_thread_sniffer()
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
# 1
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[DUT_ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[DUT_ROUTER2].get_state(), 'router')
self.nodes[SED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED1].get_state(), 'child')
# 2 & 3
@@ -106,31 +103,31 @@ class Cert_5_3_2_RealmLocal(unittest.TestCase):
# 4 & 5
self.assertTrue(self.nodes[LEADER].ping('ff03::1', num_responses=2, size=256))
sed_messages = self.sniffer.get_messages_sent_by(SED1)
sed_messages = self.simulator.get_messages_sent_by(SED1)
self.assertFalse(sed_messages.contains_icmp_message())
self.assertTrue(self.nodes[LEADER].ping('ff03::1', num_responses=2))
sed_messages = self.sniffer.get_messages_sent_by(SED1)
sed_messages = self.simulator.get_messages_sent_by(SED1)
self.assertFalse(sed_messages.contains_icmp_message())
# 6 & 7
self.assertTrue(self.nodes[LEADER].ping('ff03::2', num_responses=2, size=256))
sed_messages = self.sniffer.get_messages_sent_by(SED1)
sed_messages = self.simulator.get_messages_sent_by(SED1)
self.assertFalse(sed_messages.contains_icmp_message())
self.assertTrue(self.nodes[LEADER].ping('ff03::2', num_responses=2))
sed_messages = self.sniffer.get_messages_sent_by(SED1)
sed_messages = self.simulator.get_messages_sent_by(SED1)
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))
time.sleep(2)
sed_messages = self.sniffer.get_messages_sent_by(SED1)
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))
time.sleep(2)
sed_messages = self.sniffer.get_messages_sent_by(SED1)
self.simulator.go(2)
sed_messages = self.simulator.get_messages_sent_by(SED1)
self.assertTrue(sed_messages.contains_icmp_message())
if __name__ == '__main__':
@@ -43,9 +43,11 @@ 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):
self.nodes[i] = node.Node(i, (i == MED1))
self.nodes[i] = node.Node(i, (i == MED1), simulator=self.simulator)
self.nodes[LEADER].set_panid()
self.nodes[LEADER].set_mode('rsdn')
@@ -81,28 +83,23 @@ class Cert_5_3_3_AddressQuery(unittest.TestCase):
self.nodes[MED1].set_timeout(MED1_TIMEOUT)
self.nodes[MED1].enable_whitelist()
self.sniffer = config.create_default_thread_sniffer()
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
# 1
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER1].start()
self.nodes[DUT_ROUTER2].start()
self.nodes[ROUTER3].start()
self.nodes[MED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.assertEqual(self.nodes[DUT_ROUTER2].get_state(), 'router')
@@ -112,42 +109,42 @@ class Cert_5_3_3_AddressQuery(unittest.TestCase):
# 2
# Flush the message queue to avoid possible impact on follow-up verification.
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
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.
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
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)
# 3
# Wait the finish of address resolution traffic triggerred by previous ping.
time.sleep(5)
self.simulator.go(5)
# Flush the message queue to avoid possible impact on follow-up verification.
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
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.sniffer.get_messages_sent_by(DUT_ROUTER2)
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])
# 4
# Wait the finish of address resolution traffic triggerred by previous ping.
time.sleep(5)
self.simulator.go(5)
# Flush the message queue to avoid possible impact on follow-up verification.
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
self.assertTrue(self.nodes[MED1].ping(router3_mleid))
# Verify DUT_ROUTER2 didn't send an Address Query Request.
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
msg = dut_messages.next_coap_message('0.02', '/a/aq', False)
assert msg is None, "The Address Query Request is not expected."
@@ -156,30 +153,30 @@ class Cert_5_3_3_AddressQuery(unittest.TestCase):
# Wait for the Leader to expire its Router ID.
# MAX_NEIGHBOR_AGE + INFINITE_COST_TIMEOUT + ID_REUSE_DELAY + propagation time + transmission time ~ 580s.
time.sleep(580)
self.simulator.go(580)
# Flush the message queue to avoid possible impact on follow-up verification.
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
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.
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
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)
# 6
self.nodes[MED1].stop()
time.sleep(MED1_TIMEOUT)
self.simulator.go(MED1_TIMEOUT)
# Flush the message queue to avoid possible impact on follow-up verification.
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
self.assertFalse(self.nodes[ROUTER1].ping(med1_mleid))
self.assertFalse(self.nodes[ROUTER1].ping(med1_mleid))
# Verify DUT_ROUTER2 didn't respond with an Address Notification.
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
dut_messages = self.simulator.get_messages_sent_by(DUT_ROUTER2)
msg = dut_messages.next_coap_message('0.02', '/a/an', False)
assert msg is None, "The Address Notification is not expected."
@@ -46,9 +46,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -80,27 +82,22 @@ class Cert_5_3_4_AddressMapCache(unittest.TestCase):
self.nodes[ED].add_whitelist(self.nodes[LEADER].get_addr64())
self.nodes[ED].enable_whitelist()
self.sniffer = config.create_default_thread_sniffer()
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
# 1
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[DUT_ROUTER1].start()
for i in MTDS:
self.nodes[i].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[DUT_ROUTER1].get_state(), 'router')
@@ -108,30 +105,30 @@ class Cert_5_3_4_AddressMapCache(unittest.TestCase):
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.
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER1)
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)
self.assertTrue(self.nodes[SED1].ping(ed_mleid))
time.sleep(5)
self.simulator.go(5)
# Verify DUT_ROUTER1 generated an Address Query Request to find each node's RLOC.
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER1)
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)
# 3 & 4
# This method flushes the message queue so calling this method again will return only the newly logged messages.
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER1)
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)
self.assertTrue(self.nodes[SED1].ping(ed_mleid))
time.sleep(5)
self.simulator.go(5)
# Verify DUT_ROUTER1 didn't generate an Address Query Request.
dut_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER1)
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"
@@ -41,9 +41,11 @@ 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):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -72,26 +74,21 @@ class Cert_5_3_5_RoutingLinkQuality(unittest.TestCase):
self.nodes[ROUTER3].enable_whitelist()
self.nodes[ROUTER3].set_router_selection_jitter(1)
self.sniffer = config.create_default_thread_sniffer()
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
# 1
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
for router in range(DUT_ROUTER1, ROUTER3 + 1):
self.nodes[router].start()
time.sleep(10)
self.simulator.go(10)
for router in range(DUT_ROUTER1, ROUTER3 + 1):
self.assertEqual(self.nodes[router].get_state(), 'router')
@@ -102,38 +99,38 @@ class Cert_5_3_5_RoutingLinkQuality(unittest.TestCase):
# Verify the ICMPv6 Echo Request took the least cost path.
self.assertTrue(self.nodes[ROUTER3].ping(leader_rloc))
path = [ROUTER3, DUT_ROUTER1, LEADER]
command.check_icmp_path(self.sniffer, path, self.nodes)
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'])
time.sleep(70)
self.simulator.go(70)
# 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.sniffer, path, self.nodes)
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'])
time.sleep(70)
self.simulator.go(70)
# 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.sniffer, path, self.nodes)
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'])
time.sleep(70)
self.simulator.go(70)
# Verify the ICMPv6 Echo Request took the longer path.
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.sniffer, path, self.nodes)
command.check_icmp_path(self.simulator, path, self.nodes)
if __name__ == '__main__':
unittest.main()
@@ -41,9 +41,11 @@ 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):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[DUT_LEADER].set_panid(0xface)
self.nodes[DUT_LEADER].set_mode('rsdn')
@@ -61,39 +63,34 @@ class Cert_5_3_6_RouterIdMask(unittest.TestCase):
self.nodes[ROUTER2].set_mode('rsdn')
self._setUpRouter2()
self.sniffer = config.create_default_thread_sniffer()
self.sniffer.start()
def _setUpRouter2(self):
self.nodes[ROUTER2].add_whitelist(self.nodes[ROUTER1].get_addr64())
self.nodes[ROUTER2].enable_whitelist()
self.nodes[ROUTER2].set_router_selection_jitter(1)
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
# 1
self.nodes[DUT_LEADER].start()
self.nodes[DUT_LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[DUT_LEADER].get_state(), 'leader')
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
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.
time.sleep(config.MAX_ADVERTISEMENT_INTERVAL)
self.simulator.go(config.MAX_ADVERTISEMENT_INTERVAL)
# 2
self.nodes[ROUTER2].reset()
@@ -101,15 +98,15 @@ class Cert_5_3_6_RouterIdMask(unittest.TestCase):
# 3 & 4
# Flush the message queue to avoid possible impact on follow-up verification.
dut_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
dut_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
# Verify the cost from DUT_LEADER to ROUTER2 goes to infinity in 12 mins.
routing_cost = 1
for i in range(0, 24):
time.sleep(30)
self.simulator.go(30)
print("%ss" %((i + 1) * 30))
leader_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
msg = leader_messages.last_mle_message(mle.CommandType.ADVERTISEMENT, False)
if msg == None:
continue
@@ -121,37 +118,37 @@ class Cert_5_3_6_RouterIdMask(unittest.TestCase):
break
self.assertTrue(routing_cost == 0)
time.sleep(config.INFINITE_COST_TIMEOUT + config.MAX_ADVERTISEMENT_INTERVAL)
leader_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
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.sniffer.get_messages_sent_by(DUT_LEADER)
dut_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
time.sleep(config.MAX_ADVERTISEMENT_INTERVAL)
leader_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
self.simulator.go(config.MAX_ADVERTISEMENT_INTERVAL)
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
leader_messages.last_mle_message(mle.CommandType.ADVERTISEMENT)
# 6
self.nodes[ROUTER1].stop()
self.nodes[ROUTER2].stop()
self.nodes[ROUTER1].reset()
self.nodes[ROUTER2].reset()
router1_id = self.nodes[ROUTER1].get_router_id()
router2_id = self.nodes[ROUTER2].get_router_id()
time.sleep(config.MAX_NEIGHBOR_AGE + config.MAX_ADVERTISEMENT_INTERVAL)
leader_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
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)
time.sleep(config.INFINITE_COST_TIMEOUT + config.MAX_ADVERTISEMENT_INTERVAL)
leader_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
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))
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -38,9 +39,11 @@ 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):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -64,24 +67,25 @@ class Cert_5_3_6_RouterIdMask(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[ROUTER1].stop()
self.nodes[ROUTER2].stop()
time.sleep(300)
self.simulator.go(300)
if __name__ == '__main__':
unittest.main()
@@ -46,9 +46,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[DUT_LEADER].set_panid(0xface)
self.nodes[DUT_LEADER].set_mode('rsdn')
@@ -86,27 +88,22 @@ class Cert_5_3_7_DuplicateAddress(unittest.TestCase):
self.nodes[MED3].add_whitelist(self.nodes[DUT_LEADER].get_addr64())
self.nodes[MED3].enable_whitelist()
self.sniffer = config.create_default_thread_sniffer()
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
# 1
self.nodes[DUT_LEADER].start()
self.nodes[DUT_LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[DUT_LEADER].get_state(), 'leader')
for i in range(ROUTER1, MED3 + 1):
self.nodes[i].start()
time.sleep(5)
self.simulator.go(5)
for i in [ROUTER1, ROUTER2]:
self.assertEqual(self.nodes[i].get_state(), 'router')
@@ -115,7 +112,7 @@ class Cert_5_3_7_DuplicateAddress(unittest.TestCase):
self.assertEqual(self.nodes[i].get_state(), 'child')
# 2
leader_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
msg = leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
command.check_mle_advertisement(msg)
@@ -126,23 +123,23 @@ class Cert_5_3_7_DuplicateAddress(unittest.TestCase):
self.nodes[MED1].add_ipaddr('2001:2:0:1::1234')
self.nodes[SED1].add_ipaddr('2001:2:0:1::1234')
time.sleep(5)
self.simulator.go(5)
# 4
# Flush the message queue to avoid possible impact on follow-up verification.
self.sniffer.get_messages_sent_by(DUT_LEADER)
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.
dut_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
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)
# 5 & 6
# Verify DUT_LEADER sent an Address Error Notification to the Realm local address.
time.sleep(5)
dut_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
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)
@@ -45,10 +45,11 @@ MTDS = [MED1, MED2]
class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
def setUp(self):
self.simulator = config.create_default_simulator()
self.nodes = {}
for i in range(1, 5):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[DUT_LEADER].set_panid(0xface)
self.nodes[DUT_LEADER].set_mode('rsdn')
@@ -69,24 +70,19 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
self.nodes[i].add_whitelist(self.nodes[DUT_LEADER].get_addr64())
self.nodes[i].enable_whitelist()
self.sniffer = config.create_default_thread_sniffer()
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[DUT_LEADER].start()
self.nodes[DUT_LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[DUT_LEADER].get_state(), 'leader')
self.nodes[BR].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[BR].get_state(), 'router')
# 1 BR: Configure BR to be a DHCPv6 server
@@ -96,19 +92,19 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
self.nodes[BR].register_netdata()
# Set lowpan context of sniffer
self.sniffer.set_lowpan_context(1, '2001::/64')
self.sniffer.set_lowpan_context(2, '2002::/64')
self.sniffer.set_lowpan_context(3, '2003::/64')
self.simulator.set_lowpan_context(1, '2001::/64')
self.simulator.set_lowpan_context(2, '2002::/64')
self.simulator.set_lowpan_context(3, '2003::/64')
# 2 DUT_LEADER: Verify LEADER sent an Advertisement
leader_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
leader_messages = self.simulator.get_messages_sent_by(DUT_LEADER)
msg = leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
command.check_mle_advertisement(msg)
# 3 MED1, MED2: MED1 and MED2 attach to DUT_LEADER
for i in MTDS:
self.nodes[i].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[i].get_state(), 'child')
# 4 MED1: MED1 send an ICMPv6 Echo Request to the MED2 ML-EID
@@ -117,15 +113,15 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
self.assertTrue(self.nodes[MED1].ping(med2_ml_eid))
# Verify DUT_LEADER didn't generate an Address Query Request
leader_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
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"
# Wait for sniffer got packets
time.sleep(1)
self.simulator.go(1)
# Verify MED2 sent an ICMPv6 Echo Reply
med2_messages = self.sniffer.get_messages_sent_by(MED2)
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"
@@ -135,15 +131,15 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
self.assertTrue(self.nodes[MED1].ping(addr))
# Verify DUT_LEADER didn't generate an Address Query Request
leader_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
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"
# Wait for sniffer got packets
time.sleep(1)
self.simulator.go(1)
# Verify MED2 sent an ICMPv6 Echo Reply
med2_messages = self.sniffer.get_messages_sent_by(MED2)
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"
@@ -153,15 +149,15 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
self.assertTrue(self.nodes[MED1].ping(addr))
# Verify DUT_LEADER didn't generate an Address Query Request
leader_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
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"
# Wait for sniffer got packets
time.sleep(1)
self.simulator.go(1)
# Verify MED2 sent an ICMPv6 Echo Reply
med2_messages = self.sniffer.get_messages_sent_by(MED2)
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"
@@ -171,15 +167,15 @@ class Cert_5_3_8_ChildAddressSet(unittest.TestCase):
self.assertTrue(self.nodes[MED1].ping(addr))
# Verify DUT_LEADER didn't generate an Address Query Request
leader_messages = self.sniffer.get_messages_sent_by(DUT_LEADER)
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"
# Wait for sniffer got packets
time.sleep(1)
self.simulator.go(1)
# Verify MED2 sent an ICMPv6 Echo Reply
med2_messages = self.sniffer.get_messages_sent_by(MED2)
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"
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -40,9 +41,11 @@ 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):
self.nodes[i] = node.Node(i, (i == SED1))
self.nodes[i] = node.Node(i, (i == SED1), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -81,34 +84,36 @@ class Cert_5_3_09_AddressQuery(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[LEADER].add_prefix('2001:2:0:1::/64', 'pdros')
self.nodes[LEADER].add_prefix('2001:2:0:2::/64', 'pdro')
self.nodes[LEADER].register_netdata()
self.simulator.go(5)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[ROUTER3].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER3].get_state(), 'router')
self.nodes[SED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED1].get_state(), 'child')
# wait for sed got replied
time.sleep(10)
self.simulator.go(10)
addrs = self.nodes[ROUTER3].get_addrs()
self.assertTrue(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -130,7 +135,7 @@ class Cert_5_3_09_AddressQuery(unittest.TestCase):
self.assertTrue(self.nodes[SED1].ping(addr))
self.nodes[ROUTER3].stop()
time.sleep(300)
self.simulator.go(300)
addrs = self.nodes[ROUTER3].get_addrs()
for addr in addrs:
@@ -138,7 +143,7 @@ class Cert_5_3_09_AddressQuery(unittest.TestCase):
self.assertFalse(self.nodes[SED1].ping(addr))
self.nodes[SED1].stop()
time.sleep(10)
self.simulator.go(10)
addrs = self.nodes[SED1].get_addrs()
for addr in addrs:
@@ -46,9 +46,11 @@ MED1 = 5
class Cert_5_3_10_AddressQuery(unittest.TestCase):
def setUp(self):
self.simulator = config.create_default_simulator()
self.nodes = {}
for i in range(1, 6):
self.nodes[i] = node.Node(i, (i == MED1))
self.nodes[i] = node.Node(i, (i == MED1), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -83,26 +85,21 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
self.nodes[MED1].add_whitelist(self.nodes[DUT_ROUTER2].get_addr64())
self.nodes[MED1].enable_whitelist()
self.sniffer = config.create_default_thread_sniffer()
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
# 1 & 2
# Build and verify the topology
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[BR].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[BR].get_state(), 'router')
# Configure two On-Mesh Prefixes on the BR
@@ -111,19 +108,19 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
self.nodes[BR].register_netdata()
# Set lowpan context of sniffer
self.sniffer.set_lowpan_context(1, '2003::/64')
self.sniffer.set_lowpan_context(2, '2004::/64')
self.simulator.set_lowpan_context(1, '2003::/64')
self.simulator.set_lowpan_context(2, '2004::/64')
self.nodes[DUT_ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[DUT_ROUTER2].get_state(), 'router')
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[MED1].start()
time.sleep(5)
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
@@ -132,10 +129,10 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
self.assertTrue(self.nodes[MED1].ping(router1_addr))
# Wait for sniffer got Address Notification messages
time.sleep(1)
self.simulator.go(1)
# Verify DUT_ROUTER2 sent an Address Query Request
dut_router2_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
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)
@@ -150,10 +147,10 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
self.assertTrue(self.nodes[BR].ping(med1_addr))
# Wait for sniffer got Address Notification messages
time.sleep(1)
self.simulator.go(1)
# Verify DUT_ROUTER2 sent an Address Notification message
dut_router2_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
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])
@@ -163,10 +160,10 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
self.assertTrue(self.nodes[MED1].ping(addr))
# Wait for sniffer got ICMPv6 Echo Reply
time.sleep(1)
self.simulator.go(1)
# Verify DUT_ROUTER2 didn't generate an Address Query Request
dut_router2_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
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"
@@ -179,7 +176,7 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
# 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()
time.sleep(580)
self.simulator.go(580)
# Send an ICMPv6 Echo Request from MED1 to ROUTER1 GUA 2003:: address
self.assertFalse(self.nodes[MED1].ping(router1_addr))
@@ -188,20 +185,20 @@ class Cert_5_3_10_AddressQuery(unittest.TestCase):
command.check_router_id_cached(self.nodes[DUT_ROUTER2], router1_id, False)
# Verify DUT_ROUTER2 sent an Address Query Request
dut_router2_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
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)
# 7 MED1: Power off MED1 and wait to allow DUT_ROUTER2 to timeout the child
self.nodes[MED1].stop()
time.sleep(config.MLE_END_DEVICE_TIMEOUT)
self.simulator.go(config.MLE_END_DEVICE_TIMEOUT)
# BR sends two ICMPv6 Echo Requests to MED1 GUA 2003:: address
self.assertFalse(self.nodes[BR].ping(med1_addr))
self.assertFalse(self.nodes[BR].ping(med1_addr))
# Verify DUT_ROUTER2 didn't generate an Address Notification message
dut_router2_messages = self.sniffer.get_messages_sent_by(DUT_ROUTER2)
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"
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -37,9 +38,11 @@ ROUTER = 2
class Cert_5_5_1_LeaderReset(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)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -59,24 +62,25 @@ class Cert_5_5_1_LeaderReset(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
rloc16 = self.nodes[LEADER].get_addr16()
self.nodes[LEADER].reset();
self._setUpLeader()
time.sleep(5)
self.simulator.go(5)
self.nodes[LEADER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.assertEqual(self.nodes[LEADER].get_addr16(), rloc16)
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -38,9 +39,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -67,27 +70,28 @@ class Cert_5_5_2_LeaderReboot(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[LEADER].reset()
self._setUpLeader()
time.sleep(140)
self.simulator.go(140)
self.assertEqual(self.nodes[ROUTER].get_state(), 'leader')
self.nodes[LEADER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'router')
addrs = self.nodes[ED].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -43,9 +44,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -91,30 +94,31 @@ class Cert_5_5_3_SplitMergeChildren(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
self.nodes[ED2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED2].get_state(), 'child')
self.nodes[ED3].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED3].get_state(), 'child')
self.nodes[LEADER].reset()
@@ -123,15 +127,15 @@ class Cert_5_5_3_SplitMergeChildren(unittest.TestCase):
self.nodes[ED1].add_whitelist(self.nodes[ROUTER1].get_addr64())
self.nodes[ROUTER1].add_whitelist(self.nodes[ED1].get_addr64())
time.sleep(140)
self.simulator.go(140)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'leader')
self.assertEqual(self.nodes[ROUTER2].get_state(), 'leader')
self.nodes[LEADER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'router')
time.sleep(30)
self.simulator.go(30)
addrs = self.nodes[ED1].get_addrs()
for addr in addrs:
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -40,9 +41,11 @@ 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):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -84,34 +87,35 @@ class Cert_5_5_4_SplitMergeRouters(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[ROUTER3].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER3].get_state(), 'router')
self.nodes[ROUTER4].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER4].get_state(), 'router')
self.nodes[LEADER].reset()
self._setUpLeader()
time.sleep(150)
self.simulator.go(150)
self.nodes[LEADER].start()
time.sleep(50)
self.simulator.go(50)
self.assertEqual(self.nodes[LEADER].get_state(), 'router')
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -41,9 +42,11 @@ 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):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -76,30 +79,31 @@ class Cert_5_5_5_SplitMergeREED(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
for i in range(ROUTER2, ROUTER15+1):
self.nodes[i].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[i].get_state(), 'router')
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[REED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[REED1].get_state(), 'child')
self.nodes[ROUTER1].add_whitelist(self.nodes[REED1].get_addr64())
self.nodes[REED1].add_whitelist(self.nodes[ROUTER1].get_addr64())
self.nodes[ROUTER3].stop()
time.sleep(140)
self.simulator.go(140)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'child')
self.assertEqual(self.nodes[REED1].get_state(), 'router')
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER1 = 1
@@ -39,9 +40,11 @@ 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):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER1].set_panid(0xface)
self.nodes[LEADER1].set_mode('rsdn')
@@ -76,30 +79,31 @@ class Cert_5_5_7_SplitMergeThreeWay(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER1].start()
self.nodes[LEADER1].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER1].get_state(), 'leader')
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[ROUTER3].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER3].get_state(), 'router')
self.nodes[LEADER1].reset()
self._setUpLeader1()
time.sleep(140)
self.simulator.go(140)
self.nodes[LEADER1].start()
time.sleep(30)
self.simulator.go(30)
addrs = self.nodes[LEADER1].get_addrs()
for addr in addrs:
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER1 = 1
@@ -40,9 +41,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED1))
self.nodes[i] = node.Node(i, (i == ED1), simulator=self.simulator)
self.nodes[LEADER1].set_panid(0xface)
self.nodes[LEADER1].set_mode('rsdn')
@@ -88,23 +91,23 @@ class Cert_5_5_8_SplitRoutersLostLeader(unittest.TestCase):
def test(self):
self.nodes[LEADER1].start()
self.nodes[LEADER1].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER1].get_state(), 'leader')
self.nodes[ROUTER3].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER3].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
addrs = self.nodes[ED1].get_addrs()
@@ -114,10 +117,10 @@ class Cert_5_5_8_SplitRoutersLostLeader(unittest.TestCase):
self.nodes[ROUTER3].reset()
self._setUpRouter3()
time.sleep(140)
self.simulator.go(140)
self.nodes[ROUTER3].start()
time.sleep(60)
self.simulator.go(60)
addrs = self.nodes[ED1].get_addrs()
for addr in addrs:
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -41,9 +42,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -73,10 +76,11 @@ class Cert_5_6_1_NetworkDataLeaderAsBr(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(4)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[LEADER].add_prefix('2001:2:0:1::/64', 'paros')
@@ -84,15 +88,15 @@ class Cert_5_6_1_NetworkDataLeaderAsBr(unittest.TestCase):
self.nodes[LEADER].register_netdata()
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
self.nodes[SED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED1].get_state(), 'child')
addrs = self.nodes[ED1].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -41,9 +42,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -73,14 +76,15 @@ class Cert_5_6_2_NetworkDataRouterAsBr(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(4)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ROUTER].add_prefix('2001:2:0:1::/64', 'paros')
@@ -88,11 +92,11 @@ class Cert_5_6_2_NetworkDataRouterAsBr(unittest.TestCase):
self.nodes[ROUTER].register_netdata()
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
self.nodes[SED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED1].get_state(), 'child')
addrs = self.nodes[ED1].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -41,9 +42,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -73,29 +76,30 @@ class Cert_5_6_3_NetworkDataRegisterAfterAttachLeader(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(4)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
self.nodes[SED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED1].get_state(), 'child')
self.nodes[LEADER].add_prefix('2001:2:0:1::/64', 'paros')
self.nodes[LEADER].add_prefix('2001:2:0:2::/64', 'paro')
self.nodes[LEADER].register_netdata()
time.sleep(10)
self.simulator.go(10)
addrs = self.nodes[ED1].get_addrs()
self.assertTrue(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -41,9 +42,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -73,29 +76,30 @@ class Cert_5_6_4_NetworkDataRegisterAfterAttachRouter(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(4)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
self.nodes[SED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED1].get_state(), 'child')
self.nodes[ROUTER].add_prefix('2001:2:0:1::/64', 'paros')
self.nodes[ROUTER].add_prefix('2001:2:0:2::/64', 'paro')
self.nodes[ROUTER].register_netdata()
time.sleep(10)
self.simulator.go(10)
addrs = self.nodes[ED1].get_addrs()
self.assertTrue(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -41,9 +42,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -73,29 +76,30 @@ class Cert_5_6_5_NetworkDataRegisterAfterAttachRouter(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(4)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
self.nodes[SED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED1].get_state(), 'child')
self.nodes[ROUTER].add_prefix('2001:2:0:1::/64', 'paros')
self.nodes[ROUTER].add_prefix('2001:2:0:2::/64', 'paro')
self.nodes[ROUTER].register_netdata()
time.sleep(10)
self.simulator.go(10)
addrs = self.nodes[ED1].get_addrs()
self.assertTrue(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -114,7 +118,7 @@ class Cert_5_6_5_NetworkDataRegisterAfterAttachRouter(unittest.TestCase):
self.nodes[ROUTER].add_prefix('2001:2:0:3::/64', 'pacs')
self.nodes[ROUTER].register_netdata()
time.sleep(10)
self.simulator.go(10)
addrs = self.nodes[ED1].get_addrs()
self.assertTrue(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -41,9 +42,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -73,29 +76,30 @@ class Cert_5_6_6_NetworkDataExpiration(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(4)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
self.nodes[SED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED1].get_state(), 'child')
self.nodes[ROUTER].add_prefix('2001:2:0:1::/64', 'paros')
self.nodes[ROUTER].add_prefix('2001:2:0:2::/64', 'paro')
self.nodes[ROUTER].register_netdata()
time.sleep(10)
self.simulator.go(10)
addrs = self.nodes[ED1].get_addrs()
self.assertTrue(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -114,7 +118,7 @@ class Cert_5_6_6_NetworkDataExpiration(unittest.TestCase):
self.nodes[ROUTER].add_prefix('2001:2:0:3::/64', 'pacs')
self.nodes[ROUTER].register_netdata()
time.sleep(10)
self.simulator.go(10)
addrs = self.nodes[ED1].get_addrs()
self.assertTrue(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -134,7 +138,7 @@ class Cert_5_6_6_NetworkDataExpiration(unittest.TestCase):
self.nodes[ROUTER].remove_prefix('2001:2:0:3::/64')
self.nodes[ROUTER].register_netdata()
time.sleep(10)
self.simulator.go(10)
addrs = self.nodes[ED1].get_addrs()
self.assertTrue(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -38,9 +39,11 @@ 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):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -64,18 +67,19 @@ class Cert_5_6_7_NetworkDataRequestREED(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(4)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[REED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[REED].get_state(), 'child')
self.nodes[LEADER].remove_whitelist(self.nodes[REED].get_addr64())
@@ -84,12 +88,12 @@ class Cert_5_6_7_NetworkDataRequestREED(unittest.TestCase):
self.nodes[ROUTER].add_prefix('2001:2:0:3::/64', 'paros')
self.nodes[ROUTER].register_netdata()
time.sleep(2)
self.simulator.go(2)
self.nodes[LEADER].add_whitelist(self.nodes[REED].get_addr64())
self.nodes[REED].add_whitelist(self.nodes[LEADER].get_addr64())
time.sleep(35)
self.simulator.go(35)
addrs = self.nodes[REED].get_addrs()
self.assertTrue(any('2001:2:0:3' in addr[0:10] for addr in addrs))
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -38,9 +39,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -64,23 +67,24 @@ class Cert_5_6_8_ContextManagement(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(4)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[ROUTER].add_prefix('2001:2:0:1::/64', 'paros')
self.nodes[ROUTER].register_netdata()
time.sleep(2)
self.simulator.go(2)
addrs = self.nodes[LEADER].get_addrs()
self.assertTrue(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -90,7 +94,7 @@ class Cert_5_6_8_ContextManagement(unittest.TestCase):
self.nodes[ROUTER].remove_prefix('2001:2:0:1::/64')
self.nodes[ROUTER].register_netdata()
time.sleep(5)
self.simulator.go(5)
addrs = self.nodes[LEADER].get_addrs()
self.assertFalse(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -100,7 +104,7 @@ class Cert_5_6_8_ContextManagement(unittest.TestCase):
self.nodes[ROUTER].add_prefix('2001:2:0:2::/64', 'paros')
self.nodes[ROUTER].register_netdata()
time.sleep(5)
self.simulator.go(5)
addrs = self.nodes[LEADER].get_addrs()
self.assertFalse(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -109,10 +113,10 @@ class Cert_5_6_8_ContextManagement(unittest.TestCase):
if addr[0:3] == '200':
self.assertTrue(self.nodes[ED].ping(addr))
time.sleep(5)
self.simulator.go(5)
self.nodes[ROUTER].add_prefix('2001:2:0:3::/64', 'paros')
self.nodes[ROUTER].register_netdata()
time.sleep(5)
self.simulator.go(5)
addrs = self.nodes[LEADER].get_addrs()
self.assertFalse(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -42,9 +43,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -81,37 +84,38 @@ class Cert_5_6_9_NetworkDataForwarding(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(4)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[SED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED].get_state(), 'child')
self.nodes[LEADER].add_prefix('2001:2:0:1::/64', 'paros', 'med')
self.nodes[LEADER].add_route('2001:2:0:2::/64', 'med')
self.nodes[LEADER].register_netdata()
time.sleep(10)
self.simulator.go(10)
self.nodes[ROUTER2].add_prefix('2001:2:0:1::/64', 'paros', 'low')
self.nodes[ROUTER2].add_route('2001:2:0:2::/64', 'high')
self.nodes[ROUTER2].register_netdata()
time.sleep(10)
self.simulator.go(10)
self.assertFalse(self.nodes[SED].ping('2001:2:0:2::1'))
@@ -120,14 +124,14 @@ class Cert_5_6_9_NetworkDataForwarding(unittest.TestCase):
self.nodes[ROUTER2].remove_prefix('2001:2:0:1::/64')
self.nodes[ROUTER2].add_prefix('2001:2:0:1::/64', 'paros', 'high')
self.nodes[ROUTER2].register_netdata()
time.sleep(10)
self.simulator.go(10)
self.assertFalse(self.nodes[SED].ping('2007::1'))
self.nodes[ROUTER2].remove_prefix('2001:2:0:1::/64')
self.nodes[ROUTER2].add_prefix('2001:2:0:1::/64', 'paros', 'med')
self.nodes[ROUTER2].register_netdata()
time.sleep(10)
self.simulator.go(10)
self.assertFalse(self.nodes[SED].ping('2007::1'))
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -37,9 +38,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -57,14 +60,15 @@ class Cert_5_8_1_KeySynchronization(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(4)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
addrs = self.nodes[LEADER].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -37,9 +38,11 @@ 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):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -58,13 +61,15 @@ class Cert_5_8_2_KeyIncrement(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(4)
self.assertEqual(self.nodes[LEADER].get_state(), "leader")
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), "router")
addrs = self.nodes[ROUTER].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -37,9 +38,11 @@ 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):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -59,14 +62,15 @@ class Cert_5_8_3_KeyIncrementRollOver(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(4)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
addrs = self.nodes[ROUTER].get_addrs()
@@ -36,13 +36,14 @@ import node
LEADER = 1
ED = 2
SNIFFER = 3
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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -54,28 +55,23 @@ class Cert_6_1_1_RouterAttach(unittest.TestCase):
self.nodes[ED].add_whitelist(self.nodes[LEADER].get_addr64())
self.nodes[ED].enable_whitelist()
self.sniffer = config.create_default_thread_sniffer(SNIFFER)
self.sniffer.start()
def tearDown(self):
self.sniffer.stop()
del self.sniffer
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
leader_messages = self.sniffer.get_messages_sent_by(LEADER)
ed_messages = self.sniffer.get_messages_sent_by(ED)
leader_messages = self.simulator.get_messages_sent_by(LEADER)
ed_messages = self.simulator.get_messages_sent_by(ED)
# 1 - leader
msg = leader_messages.next_mle_message(mle.CommandType.ADVERTISEMENT)
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -38,9 +39,11 @@ ED = 3
class Cert_6_1_2_REEDAttach(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 == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -63,18 +66,19 @@ class Cert_6_1_2_REEDAttach(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[REED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[REED].get_state(), 'child')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.assertEqual(self.nodes[REED].get_state(), 'router')
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -40,9 +41,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -83,19 +86,20 @@ class Cert_6_1_3_RouterAttachConnectivity(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
for i in range(2, 5):
self.nodes[i].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[i].get_state(), 'router')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
addrs = self.nodes[ED].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -40,9 +41,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -83,28 +86,29 @@ class Cert_6_1_4_REEDAttachConnectivity(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[REED0].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[REED0].get_state(), 'child')
self.nodes[REED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[REED1].get_state(), 'child')
time.sleep(10)
self.simulator.go(10)
self.nodes[ED].start()
time.sleep(10)
self.simulator.go(10)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.assertEqual(self.nodes[REED1].get_state(), 'router')
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -39,9 +40,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -73,22 +76,23 @@ class Cert_6_1_5_RouterAttachLinkQuality(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
if __name__ == '__main__':
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -39,9 +40,11 @@ ED = 4
class Cert_6_1_6_REEDAttachLinkQuality(unittest.TestCase):
def setUp(self):
self.simulator = config.create_default_simulator()
self.nodes = {}
for i in range(1,5):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -73,22 +76,23 @@ class Cert_6_1_6_REEDAttachLinkQuality(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[REED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[REED].get_state(), 'child')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[ED].start()
time.sleep(10)
self.simulator.go(10)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.assertEqual(self.nodes[REED].get_state(), 'router')
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -40,9 +41,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -87,26 +90,27 @@ class Cert_6_1_7_EDSynchronization(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[ROUTER3].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER3].get_state(), 'router')
if __name__ == '__main__':
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -38,9 +39,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -63,22 +66,23 @@ class Cert_6_2_1_NewPartition(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[LEADER].stop()
time.sleep(140)
self.simulator.go(140)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'leader')
self.assertEqual(self.nodes[ED].get_state(), 'child')
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -39,9 +40,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -74,26 +77,27 @@ class Cert_6_2_2_NewPartition(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[LEADER].stop()
time.sleep(140)
self.simulator.go(140)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'leader')
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.assertEqual(self.nodes[ED].get_state(), 'child')
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -38,9 +39,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -64,24 +67,25 @@ class Cert_6_3_1_OrphanReattach(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[ROUTER].stop()
self.nodes[LEADER].add_whitelist(self.nodes[ED].get_addr64())
self.nodes[ED].add_whitelist(self.nodes[LEADER].get_addr64())
time.sleep(20)
self.simulator.go(20)
self.assertEqual(self.nodes[ED].get_state(), 'child')
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -37,9 +38,11 @@ ED = 2
class Cert_5_6_2_NetworkDataUpdate(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, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -56,19 +59,20 @@ class Cert_5_6_2_NetworkDataUpdate(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[LEADER].add_prefix('2001:2:0:1::/64', 'paros')
self.nodes[LEADER].register_netdata()
time.sleep(5)
self.simulator.go(5)
addrs = self.nodes[ED].get_addrs()
self.assertTrue(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -81,11 +85,11 @@ class Cert_5_6_2_NetworkDataUpdate(unittest.TestCase):
self.nodes[LEADER].add_prefix('2001:2:0:2::/64', 'paros')
self.nodes[LEADER].register_netdata()
time.sleep(5)
self.simulator.go(5)
self.nodes[LEADER].add_whitelist(self.nodes[ED].get_addr64())
self.nodes[ED].add_whitelist(self.nodes[LEADER].get_addr64())
time.sleep(10)
self.simulator.go(10)
addrs = self.nodes[ED].get_addrs()
self.assertTrue(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -37,9 +38,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -55,14 +58,15 @@ class Cert_6_4_1_LinkLocal(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
addrs = self.nodes[ED].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -38,9 +39,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -63,18 +66,19 @@ class Cert_5_3_2_RealmLocal(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
addrs = self.nodes[ED].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -37,9 +38,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -59,31 +62,32 @@ class Cert_6_5_1_ChildResetSynchronize(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[ED].reset()
self._setUpEd()
time.sleep(5)
self.simulator.go(5)
self.nodes[ED].set_timeout(100)
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[ED].reset()
self._setUpEd()
time.sleep(5)
self.simulator.go(5)
self.nodes[ED].set_timeout(100)
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
addrs = self.nodes[ED].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -37,9 +38,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -58,14 +61,15 @@ class Cert_6_5_2_ChildResetReattach(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[LEADER].remove_whitelist(self.nodes[ED].get_addr64())
@@ -73,12 +77,12 @@ class Cert_6_5_2_ChildResetReattach(unittest.TestCase):
self.nodes[ED].reset()
self._setUpEd()
time.sleep(5)
self.simulator.go(5)
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.nodes[LEADER].add_whitelist(self.nodes[ED].get_addr64())
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
addrs = self.nodes[ED].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -37,9 +38,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -57,13 +60,15 @@ class Cert_6_6_1_KeyIncrement(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), "leader")
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), "child")
addrs = self.nodes[ED].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -37,9 +38,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED))
self.nodes[i] = node.Node(i, (i == ED), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -58,14 +61,15 @@ class Cert_6_6_2_KeyIncrement1(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
addrs = self.nodes[ED].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -41,9 +42,11 @@ MTDS = [SED1, ED1]
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):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -73,10 +76,11 @@ class Cert_7_1_1_BorderRouterAsLeader(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[LEADER].add_prefix('2001:2:0:1::/64', 'paros')
@@ -84,15 +88,15 @@ class Cert_7_1_1_BorderRouterAsLeader(unittest.TestCase):
self.nodes[LEADER].register_netdata()
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[SED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED1].get_state(), 'child')
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
addrs = self.nodes[SED1].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -41,9 +42,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -73,14 +76,15 @@ class Cert_7_1_2_BorderRouterAsRouter(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ROUTER].add_prefix('2001:2:0:1::/64', 'paros')
@@ -88,11 +92,11 @@ class Cert_7_1_2_BorderRouterAsRouter(unittest.TestCase):
self.nodes[ROUTER].register_netdata()
self.nodes[ED2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED2].get_state(), 'child')
self.nodes[SED2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED2].get_state(), 'child')
addrs = self.nodes[ED2].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -41,9 +42,11 @@ MTDS = [SED1, ED1]
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):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -73,28 +76,29 @@ class Cert_7_1_3_BorderRouterAsLeader(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[SED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED1].get_state(), 'child')
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
self.nodes[LEADER].add_prefix('2001:2:0:1::/64', 'paros')
self.nodes[LEADER].add_prefix('2001:2:0:2::/64', 'paro')
self.nodes[LEADER].register_netdata()
time.sleep(5)
self.simulator.go(5)
addrs = self.nodes[SED1].get_addrs()
self.assertTrue(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -41,9 +42,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -73,28 +76,29 @@ class Cert_7_1_4_BorderRouterAsRouter(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ED2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED2].get_state(), 'child')
self.nodes[SED2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED2].get_state(), 'child')
self.nodes[ROUTER].add_prefix('2001:2:0:1::/64', 'paros')
self.nodes[ROUTER].add_prefix('2001:2:0:2::/64', 'paro')
self.nodes[ROUTER].register_netdata()
time.sleep(5)
self.simulator.go(5)
addrs = self.nodes[ED2].get_addrs()
self.assertTrue(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER = 1
@@ -41,9 +42,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
self.nodes[i] = node.Node(i, (i in MTDS), simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -73,28 +76,29 @@ class Cert_7_1_5_BorderRouterAsRouter(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ED2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED2].get_state(), 'child')
self.nodes[SED2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED2].get_state(), 'child')
self.nodes[ROUTER].add_prefix('2001:2:0:1::/64', 'paros')
self.nodes[ROUTER].add_prefix('2001:2:0:2::/64', 'paro')
self.nodes[ROUTER].register_netdata()
time.sleep(5)
self.simulator.go(5)
addrs = self.nodes[ED2].get_addrs()
self.assertTrue(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -112,7 +116,7 @@ class Cert_7_1_5_BorderRouterAsRouter(unittest.TestCase):
self.nodes[ROUTER].add_prefix('2001:2:0:3::/64', 'paros')
self.nodes[ROUTER].register_netdata()
time.sleep(5)
self.simulator.go(5)
addrs = self.nodes[ED2].get_addrs()
self.assertTrue(any('2001:2:0:1' in addr[0:10] for addr in addrs))
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
COMMISSIONER = 1
@@ -37,9 +38,11 @@ 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):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[COMMISSIONER].set_panid(0xface)
self.nodes[COMMISSIONER].set_mode('rsdn')
@@ -53,23 +56,24 @@ class Cert_8_1_01_Commissioning(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[COMMISSIONER].interface_up()
self.nodes[COMMISSIONER].thread_start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'leader')
self.nodes[COMMISSIONER].commissioner_start()
time.sleep(3)
self.simulator.go(3)
self.nodes[COMMISSIONER].commissioner_add_joiner(self.nodes[JOINER].get_eui64(), 'OPENTHREAD')
self.nodes[JOINER].interface_up()
self.nodes[JOINER].joiner_start('OPENTHREAD')
time.sleep(10)
self.simulator.go(10)
self.assertEqual(self.nodes[JOINER].get_masterkey(), self.nodes[COMMISSIONER].get_masterkey())
self.nodes[JOINER].thread_start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[JOINER].get_state(), 'router')
if __name__ == '__main__':
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
COMMISSIONER = 1
@@ -37,6 +38,8 @@ 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):
self.nodes[i] = node.Node(i)
@@ -53,19 +56,20 @@ class Cert_8_1_02_Commissioning(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[COMMISSIONER].interface_up()
self.nodes[COMMISSIONER].thread_start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'leader')
self.nodes[COMMISSIONER].commissioner_start()
time.sleep(3)
self.simulator.go(3)
self.nodes[COMMISSIONER].commissioner_add_joiner(self.nodes[JOINER].get_eui64(), 'OPENTHREAD')
self.nodes[JOINER].interface_up()
self.nodes[JOINER].joiner_start('DAERHTNEPO')
time.sleep(10)
self.simulator.go(10)
self.assertNotEqual(self.nodes[JOINER].get_masterkey(), self.nodes[COMMISSIONER].get_masterkey())
if __name__ == '__main__':
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
COMMISSIONER = 1
@@ -38,6 +39,8 @@ 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):
self.nodes[i] = node.Node(i)
@@ -62,31 +65,32 @@ class Cert_8_2_01_JoinerRouter(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[COMMISSIONER].interface_up()
self.nodes[COMMISSIONER].thread_start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'leader')
self.nodes[COMMISSIONER].commissioner_start()
time.sleep(5)
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')
time.sleep(5)
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[JOINER_ROUTER].interface_up()
self.nodes[JOINER_ROUTER].joiner_start('OPENTHREAD')
time.sleep(10)
self.simulator.go(10)
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[JOINER_ROUTER].thread_start()
time.sleep(5)
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())
@@ -94,13 +98,13 @@ class Cert_8_2_01_JoinerRouter(unittest.TestCase):
self.nodes[JOINER].interface_up()
self.nodes[JOINER].joiner_start('OPENTHREAD2')
time.sleep(10)
self.simulator.go(10)
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].thread_start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[JOINER].get_state(), 'router')
if __name__ == '__main__':
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
COMMISSIONER = 1
@@ -38,9 +39,11 @@ 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):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[COMMISSIONER].set_panid(0xface)
self.nodes[COMMISSIONER].set_mode('rsdn')
@@ -62,31 +65,32 @@ class Cert_8_2_02_JoinerRouter(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[COMMISSIONER].interface_up()
self.nodes[COMMISSIONER].thread_start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'leader')
self.nodes[COMMISSIONER].commissioner_start()
time.sleep(5)
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')
time.sleep(5)
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[JOINER_ROUTER].interface_up()
self.nodes[JOINER_ROUTER].joiner_start('OPENTHREAD')
time.sleep(10)
self.simulator.go(10)
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[JOINER_ROUTER].thread_start()
time.sleep(5)
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())
@@ -94,7 +98,7 @@ class Cert_8_2_02_JoinerRouter(unittest.TestCase):
self.nodes[JOINER].interface_up()
self.nodes[JOINER].joiner_start('2DAERHTNEPO')
time.sleep(10)
self.simulator.go(10)
self.assertNotEqual(self.nodes[JOINER].get_masterkey(), self.nodes[COMMISSIONER].get_masterkey())
if __name__ == '__main__':
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
COMMISSIONER = 1
@@ -37,9 +38,11 @@ LEADER = 2
class Cert_9_2_15_PendingPartition(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)
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_mode('rsdn')
@@ -53,24 +56,25 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[COMMISSIONER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'router')
self.nodes[COMMISSIONER].commissioner_start()
time.sleep(3)
self.simulator.go(3)
self.nodes[COMMISSIONER].send_mgmt_active_set(active_timestamp=101,
channel_mask=0x001fffe0,
extended_panid='000db70000000000',
network_name='GRL')
time.sleep(3)
self.simulator.go(3)
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
# Step 6
@@ -80,7 +84,7 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
channel_mask=0x001fffe0,
extended_panid='000db70000000001',
network_name='threadcert')
time.sleep(3)
self.simulator.go(3)
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
# Step 8
@@ -90,7 +94,7 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
extended_panid='000db70000000000',
mesh_local='fd00:0db7::',
network_name='UL')
time.sleep(3)
self.simulator.go(3)
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
# Step 10
@@ -101,7 +105,7 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
master_key='00112233445566778899aabbccddeeff',
mesh_local='fd00:0db7::',
network_name='UL')
time.sleep(3)
self.simulator.go(3)
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
# Step 12
@@ -113,7 +117,7 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
mesh_local='fd00:0db7::',
network_name='UL',
panid=0xafce)
time.sleep(3)
self.simulator.go(3)
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
# Step 14
@@ -123,7 +127,7 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
extended_panid='000db70000000000',
network_name='UL',
binary='0b02abcd')
time.sleep(3)
self.simulator.go(3)
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
# Step 16
@@ -132,7 +136,7 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
channel_mask=0x001fffe0,
extended_panid='000db70000000000',
network_name='UL')
time.sleep(3)
self.simulator.go(3)
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
# Step 18
@@ -142,7 +146,7 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
extended_panid='000db70000000000',
network_name='UL',
binary='0806113320440000')
time.sleep(3)
self.simulator.go(3)
self.assertEqual(self.nodes[LEADER].get_network_name(), 'UL')
# Step 20
@@ -152,7 +156,7 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
extended_panid='000db70000000000',
network_name='GRL',
binary='8202aa55')
time.sleep(3)
self.simulator.go(3)
self.assertEqual(self.nodes[LEADER].get_network_name(), 'GRL')
ipaddrs = self.nodes[COMMISSIONER].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
PANID_INIT = 0xface
@@ -48,9 +49,11 @@ 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):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[COMMISSIONER].set_active_dataset(LEADER_ACTIVE_TIMESTAMP)
self.nodes[COMMISSIONER].set_mode('rsdn')
@@ -78,26 +81,27 @@ class Cert_9_2_7_DelayTimer(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[COMMISSIONER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'router')
self.nodes[COMMISSIONER].commissioner_start()
time.sleep(3)
self.simulator.go(3)
self.nodes[ROUTER].start()
time.sleep(10)
self.simulator.go(10)
self.assertEqual(self.nodes[ROUTER].get_state(), 'leader')
self.nodes[LEADER].add_whitelist(self.nodes[ROUTER].get_addr64())
self.nodes[ROUTER].add_whitelist(self.nodes[LEADER].get_addr64())
time.sleep(30)
self.simulator.go(30)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'router')
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
@@ -113,7 +117,7 @@ class Cert_9_2_7_DelayTimer(unittest.TestCase):
delay_timer=10000,
channel=COMMISSIONER_PENDING_CHANNEL,
panid=COMMISSIONER_PENDING_PANID)
time.sleep(40)
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)
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
COMMISSIONER = 1
@@ -49,9 +50,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
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_mode('rsdn')
@@ -103,40 +106,40 @@ class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[COMMISSIONER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'router')
self.nodes[ROUTER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[SED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED].get_state(), 'child')
self.nodes[COMMISSIONER].commissioner_start()
time.sleep(3)
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)
time.sleep(5)
self.simulator.go(5)
self.nodes[ROUTER].reset()
self.nodes[ED].reset()
self.nodes[SED].reset()
time.sleep(60)
self.simulator.go(60)
self.assertEqual(self.nodes[LEADER].get_panid(), COMMISSIONER_PENDING_PANID)
self.assertEqual(self.nodes[COMMISSIONER].get_panid(), COMMISSIONER_PENDING_PANID)
@@ -163,7 +166,7 @@ class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
self.assertEqual(self.nodes[ED].get_channel(), CHANNEL_INIT)
self.assertEqual(self.nodes[SED].get_channel(), CHANNEL_INIT)
time.sleep(10)
self.simulator.go(10)
self.assertEqual(self.nodes[ROUTER].get_panid(), COMMISSIONER_PENDING_PANID)
self.assertEqual(self.nodes[ED].get_panid(), COMMISSIONER_PENDING_PANID)
@@ -173,7 +176,7 @@ class Cert_9_2_8_PersistentDatasets(unittest.TestCase):
self.assertEqual(self.nodes[ED].get_channel(), COMMISSIONER_PENDING_CHANNEL)
self.assertEqual(self.nodes[SED].get_channel(), COMMISSIONER_PENDING_CHANNEL)
time.sleep(5)
self.simulator.go(5)
ipaddrs = self.nodes[ROUTER].get_addrs()
for ipaddr in ipaddrs:
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
CHANNEL_INIT = 19
@@ -45,9 +46,11 @@ 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):
self.nodes[i] = node.Node(i)
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_mode('rsdn')
@@ -81,24 +84,25 @@ class Cert_9_2_09_PendingPartition(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[COMMISSIONER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'router')
self.nodes[COMMISSIONER].commissioner_start()
time.sleep(3)
self.simulator.go(3)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[COMMISSIONER].send_mgmt_pending_set(pending_timestamp=30,
@@ -106,11 +110,11 @@ class Cert_9_2_09_PendingPartition(unittest.TestCase):
delay_timer=500000,
channel=20,
panid=0xafce)
time.sleep(5)
self.simulator.go(5)
self.nodes[LEADER].remove_whitelist(self.nodes[ROUTER1].get_addr64())
self.nodes[ROUTER1].remove_whitelist(self.nodes[LEADER].get_addr64())
time.sleep(140)
self.simulator.go(140)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.assertEqual(self.nodes[ROUTER2].get_state(), 'leader')
@@ -120,11 +124,11 @@ class Cert_9_2_09_PendingPartition(unittest.TestCase):
delay_timer=200000,
channel=CHANNEL_FINAL,
panid=PANID_FINAL)
time.sleep(5)
self.simulator.go(5)
self.nodes[LEADER].add_whitelist(self.nodes[ROUTER1].get_addr64())
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64())
time.sleep(200)
self.simulator.go(200)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
CHANNEL_INIT = 19
@@ -48,9 +49,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
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_mode('rsdn')
@@ -91,28 +94,29 @@ class Cert_9_2_10_PendingPartition(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[COMMISSIONER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'router')
self.nodes[COMMISSIONER].commissioner_start()
time.sleep(3)
self.simulator.go(3)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
self.nodes[SED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[SED1].get_state(), 'child')
self.nodes[COMMISSIONER].send_mgmt_pending_set(pending_timestamp=30,
@@ -120,7 +124,7 @@ class Cert_9_2_10_PendingPartition(unittest.TestCase):
delay_timer=150000,
channel=CHANNEL_FINAL,
panid=PANID_FINAL)
time.sleep(5)
self.simulator.go(5)
print(self.nodes[COMMISSIONER].get_channel())
print(self.nodes[LEADER].get_channel())
@@ -130,7 +134,7 @@ class Cert_9_2_10_PendingPartition(unittest.TestCase):
self.nodes[LEADER].remove_whitelist(self.nodes[ROUTER1].get_addr64())
self.nodes[ROUTER1].remove_whitelist(self.nodes[LEADER].get_addr64())
time.sleep(160)
self.simulator.go(160)
print(self.nodes[COMMISSIONER].get_channel())
print(self.nodes[LEADER].get_channel())
@@ -152,7 +156,7 @@ class Cert_9_2_10_PendingPartition(unittest.TestCase):
self.nodes[LEADER].add_whitelist(self.nodes[ROUTER1].get_addr64())
self.nodes[ROUTER1].add_whitelist(self.nodes[LEADER].get_addr64())
time.sleep(60)
self.simulator.go(60)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'router')
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
KEY1 = '000102030405060708090a0b0c0d0e0f'
@@ -48,9 +49,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
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_mode('rsdn')
@@ -92,35 +95,36 @@ class Cert_9_2_11_MasterKey(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[COMMISSIONER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'router')
self.nodes[COMMISSIONER].commissioner_start()
time.sleep(3)
self.simulator.go(3)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
self.nodes[SED1].start()
time.sleep(5)
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)
time.sleep(310)
self.simulator.go(310)
print(self.nodes[COMMISSIONER].get_masterkey())
print(self.nodes[LEADER].get_masterkey())
@@ -143,7 +147,7 @@ class Cert_9_2_11_MasterKey(unittest.TestCase):
active_timestamp=30,
delay_timer=10000,
master_key=KEY1)
time.sleep(310)
self.simulator.go(310)
print(self.nodes[COMMISSIONER].get_masterkey())
print(self.nodes[LEADER].get_masterkey())
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
LEADER1 = 1
@@ -48,9 +49,11 @@ 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):
self.nodes[i] = node.Node(i, (i == MED))
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_mode('rsdn')
@@ -88,16 +91,17 @@ class Cert_9_2_12_Announce(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER1].start()
self.nodes[LEADER1].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER1].get_state(), 'leader')
self.nodes[LEADER1].commissioner_start()
time.sleep(3)
self.simulator.go(3)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[LEADER2].start()
@@ -105,11 +109,11 @@ class Cert_9_2_12_Announce(unittest.TestCase):
self.assertEqual(self.nodes[LEADER2].get_state(), 'leader')
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[MED].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[MED].get_state(), 'child')
ipaddrs = self.nodes[ROUTER1].get_addrs()
@@ -118,7 +122,7 @@ class Cert_9_2_12_Announce(unittest.TestCase):
break
self.nodes[LEADER1].announce_begin(0x1000, 1, 1000, ipaddr)
time.sleep(30)
self.simulator.go(30)
self.assertEqual(self.nodes[LEADER2].get_state(), 'router')
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.assertEqual(self.nodes[MED].get_state(), 'child')
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
COMMISSIONER = 1
@@ -39,9 +40,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED1))
self.nodes[i] = node.Node(i, (i == ED1), simulator=self.simulator)
self.nodes[COMMISSIONER].set_panid(0xface)
self.nodes[COMMISSIONER].set_mode('rsdn')
@@ -71,24 +74,25 @@ class Cert_9_2_13_EnergyScan(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[COMMISSIONER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'router')
self.nodes[COMMISSIONER].commissioner_start()
time.sleep(3)
self.simulator.go(3)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
ipaddrs = self.nodes[ROUTER1].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
COMMISSIONER = 1
@@ -39,9 +40,11 @@ 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):
self.nodes[i] = node.Node(i)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[COMMISSIONER].set_panid(0xface)
self.nodes[COMMISSIONER].set_mode('rsdn')
@@ -71,24 +74,25 @@ class Cert_9_2_14_PanIdQuery(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER1].start()
self.nodes[LEADER1].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER1].get_state(), 'leader')
self.nodes[COMMISSIONER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'router')
self.nodes[COMMISSIONER].commissioner_start()
time.sleep(3)
self.simulator.go(3)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[LEADER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER2].get_state(), 'leader')
ipaddrs = self.nodes[ROUTER1].get_addrs()
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
CHANNEL_INIT = 19
@@ -44,9 +45,11 @@ 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):
self.nodes[i] = node.Node(i)
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_mode('rsdn')
@@ -82,30 +85,31 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[COMMISSIONER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'router')
self.nodes[COMMISSIONER].commissioner_start()
time.sleep(3)
self.simulator.go(3)
self.nodes[ROUTER1].start()
time.sleep(5)
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::')
time.sleep(5)
self.simulator.go(5)
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[ROUTER2].reset()
@@ -116,12 +120,12 @@ class Cert_9_2_15_PendingPartition(unittest.TestCase):
delay_timer=200000,
mesh_local='fd00:0db7::',
panid=PANID_FINAL)
time.sleep(100)
self.simulator.go(100)
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
time.sleep(100)
self.simulator.go(100)
self.assertEqual(self.nodes[COMMISSIONER].get_panid(), PANID_FINAL)
self.assertEqual(self.nodes[LEADER].get_panid(), PANID_FINAL)
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
CHANNEL_INIT = 19
@@ -45,9 +46,11 @@ 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):
self.nodes[i] = node.Node(i)
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_mode('rsdn')
@@ -83,30 +86,31 @@ class Cert_9_2_16_ActivePendingPartition(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[COMMISSIONER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'router')
self.nodes[COMMISSIONER].commissioner_start()
time.sleep(3)
self.simulator.go(3)
self.nodes[ROUTER1].start()
time.sleep(5)
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::')
time.sleep(5)
self.simulator.go(5)
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.nodes[ROUTER2].reset()
@@ -117,14 +121,14 @@ class Cert_9_2_16_ActivePendingPartition(unittest.TestCase):
delay_timer=200000,
mesh_local='fd00:0db7::',
panid=PANID_FINAL)
time.sleep(5)
self.simulator.go(5)
self.nodes[COMMISSIONER].send_mgmt_active_set(active_timestamp=15,
network_name='threadCert')
time.sleep(100)
self.simulator.go(100)
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
self.assertEqual(self.nodes[COMMISSIONER].get_network_name(), NETWORK_NAME_FINAL)
@@ -132,7 +136,7 @@ class Cert_9_2_16_ActivePendingPartition(unittest.TestCase):
self.assertEqual(self.nodes[ROUTER1].get_network_name(), NETWORK_NAME_FINAL)
self.assertEqual(self.nodes[ROUTER2].get_network_name(), NETWORK_NAME_FINAL)
time.sleep(100)
self.simulator.go(100)
self.assertEqual(self.nodes[COMMISSIONER].get_panid(), PANID_FINAL)
self.assertEqual(self.nodes[LEADER].get_panid(), PANID_FINAL)
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
CHANNEL1 = 11
@@ -43,9 +44,11 @@ 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):
self.nodes[i] = node.Node(i, (i == ED1))
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_mode('rsdn')
@@ -69,10 +72,11 @@ class Cert_9_2_17_Orphan(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def test(self):
self.nodes[LEADER1].start()
self.nodes[LEADER1].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER1].get_state(), 'leader')
self.nodes[LEADER2].start()
@@ -80,13 +84,13 @@ class Cert_9_2_17_Orphan(unittest.TestCase):
self.assertEqual(self.nodes[LEADER2].get_state(), 'leader')
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
self.nodes[LEADER1].stop()
self.nodes[LEADER2].add_whitelist(self.nodes[ED1].get_addr64())
self.nodes[ED1].add_whitelist(self.nodes[LEADER2].get_addr64())
time.sleep(20)
self.simulator.go(20)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
self.assertEqual(self.nodes[ED1].get_channel(), CHANNEL2)
@@ -30,6 +30,7 @@
import time
import unittest
import config
import node
KEY1 = '00112233445566778899aabbccddeeff'
@@ -49,9 +50,11 @@ 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):
self.nodes[i] = node.Node(i, (i in MTDS))
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_mode('rsdn')
@@ -104,43 +107,43 @@ class Cert_9_2_18_RollBackActiveTimestamp(unittest.TestCase):
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[COMMISSIONER].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[COMMISSIONER].get_state(), 'router')
self.nodes[COMMISSIONER].commissioner_start()
time.sleep(3)
self.simulator.go(3)
self.nodes[ROUTER1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.nodes[ED1].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
self.nodes[SED1].start()
time.sleep(5)
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')
time.sleep(5)
self.simulator.go(5)
self.nodes[COMMISSIONER].send_mgmt_pending_set(pending_timestamp=20,
active_timestamp=20,
delay_timer=20000,
network_name='Shouldnotbe')
time.sleep(5)
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)
time.sleep(310)
self.simulator.go(310)
self.assertEqual(self.nodes[COMMISSIONER].get_masterkey(), KEY2)
self.assertEqual(self.nodes[LEADER].get_masterkey(), KEY2)
@@ -150,7 +153,7 @@ class Cert_9_2_18_RollBackActiveTimestamp(unittest.TestCase):
self.assertEqual(self.nodes[ROUTER2].get_masterkey(), KEY1)
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER2].get_state(), 'leader')
if __name__ == '__main__':
+1
View File
@@ -133,6 +133,7 @@ EXTRA_DIST = \
network_layer.py \
node.py \
node_cli.py \
simulator.py \
sniffer.py \
sniffer_transport.py \
test_coap.py \
+9
View File
@@ -37,6 +37,7 @@ import mle
import net_crypto
import network_data
import network_layer
import simulator
import sniffer
MESH_LOCAL_PREFIX = 'fdde:ad00:beef::/64'
@@ -67,6 +68,8 @@ INFINITE_COST_TIMEOUT = 90
MAX_ADVERTISEMENT_INTERVAL = 32
MLE_END_DEVICE_TIMEOUT = 100
VIRTUAL_TIME = bool(os.getenv('VIRTUAL_TIME', False))
def create_default_network_data_prefix_sub_tlvs_factories():
return {
network_data.TlvType.HAS_ROUTE: network_data.HasRouteFactory(
@@ -331,3 +334,9 @@ def create_default_thread_message_factory(master_key=DEFAULT_MASTER_KEY):
def create_default_thread_sniffer(nodeid=SNIFFER_ID):
return sniffer.Sniffer(nodeid, create_default_thread_message_factory())
def create_default_simulator():
if VIRTUAL_TIME:
return simulator.VirtualTime()
return simulator.RealTime()
+5 -3
View File
@@ -38,9 +38,11 @@ import unittest
import config
class Node:
def __init__(self, nodeid, is_mtd=False):
def __init__(self, nodeid, is_mtd=False, simulator=None):
self.simulator = simulator
if sys.platform != 'win32':
self.interface = node_cli.otCli(nodeid, is_mtd)
self.interface = node_cli.otCli(nodeid, is_mtd, simulator=simulator)
else:
self.interface = node_api.otApi(nodeid)
@@ -239,7 +241,7 @@ class Node:
def scan(self):
return self.interface.scan()
def ping(self, ipaddr, num_responses=1, size=None, timeout=5000):
def ping(self, ipaddr, num_responses=1, size=None, timeout=5):
return self.interface.ping(ipaddr, num_responses, size, timeout)
def reset(self):
+36 -5
View File
@@ -35,12 +35,14 @@ import re
import ipaddress
import config
import simulator
class otCli:
def __init__(self, nodeid, is_mtd):
def __init__(self, nodeid, is_mtd, simulator=None):
self.nodeid = nodeid
self.verbose = int(float(os.getenv('VERBOSE', 0)))
self.node_type = os.getenv('NODE_TYPE', 'sim')
self.simulator = simulator
mode = os.environ.get('USE_MTD') is '1' and is_mtd and 'mtd' or 'ftd'
@@ -103,7 +105,10 @@ class otCli:
def send_command(self, cmd):
print("%d: %s" % (self.nodeid, cmd))
self.pexpect.sendline(cmd)
self.pexpect.send(cmd + '\n')
if isinstance(self.simulator, simulator.VirtualTime):
self.simulator.receive_events()
def get_commands(self):
self.send_command('?')
@@ -532,12 +537,26 @@ class otCli:
def energy_scan(self, mask, count, period, scan_duration, ipaddr):
cmd = 'commissioner energy ' + str(mask) + ' ' + str(count) + ' ' + str(period) + ' ' + str(scan_duration) + ' ' + ipaddr
self.send_command(cmd)
self.pexpect.expect('Energy:', timeout=8)
if isinstance(self.simulator, simulator.VirtualTime):
self.simulator.go(8)
timeout = 1
else:
timeout = 8
self.pexpect.expect('Energy:', timeout=timeout)
def panid_query(self, panid, mask, ipaddr):
cmd = 'commissioner panid ' + str(panid) + ' ' + str(mask) + ' ' + ipaddr
self.send_command(cmd)
self.pexpect.expect('Conflict:', timeout=8)
if isinstance(self.simulator, simulator.VirtualTime):
self.simulator.go(8)
timeout = 1
else:
timeout = 8
self.pexpect.expect('Conflict:', timeout=timeout)
def scan(self):
self.send_command('scan')
@@ -553,13 +572,21 @@ class otCli:
return results
def ping(self, ipaddr, num_responses=1, size=None, timeout=5000):
def ping(self, ipaddr, num_responses=1, size=None, timeout=5):
cmd = 'ping ' + ipaddr
if size != None:
cmd += ' ' + str(size)
self.send_command(cmd)
try:
self.pexpect.expect('Done', timeout=0.01)
except pexpect.TIMEOUT:
pass
if isinstance(self.simulator, simulator.VirtualTime):
self.simulator.go(timeout)
result = True
try:
responders = {}
@@ -575,6 +602,10 @@ class otCli:
def reset(self):
self.send_command('reset')
try:
self.pexpect.expect('Done', timeout=0.01)
except pexpect.TIMEOUT:
pass
def set_router_selection_jitter(self, jitter):
cmd = 'routerselectionjitter %d' % jitter
+240
View File
@@ -0,0 +1,240 @@
#!/usr/bin/env python
#
# Copyright (c) 2018, The OpenThread Authors.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. Neither the name of the copyright holder nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
import bisect
import cmd
import os
import socket
import struct
import time
import sys
import io
import config
import message
class RealTime:
def __init__(self):
self._sniffer = config.create_default_thread_sniffer()
self._sniffer.start()
def set_lowpan_context(self, cid, prefix):
self._sniffer.set_lowpan_context(cid, prefix)
def get_messages_sent_by(self, nodeid):
return self._sniffer.get_messages_sent_by(nodeid)
def go(self, duration):
time.sleep(duration)
class VirtualTime:
BASE_PORT = 9000
MAX_NODES = 34
PORT_OFFSET = int(os.getenv('PORT_OFFSET', "0"))
def __init__(self):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ip = '127.0.0.1'
self.port = self.BASE_PORT + (self.PORT_OFFSET * self.MAX_NODES)
self.sock.bind((ip, self.port))
self.devices = {}
self.event_queue = []
self.event_count = 0
self.current_time = 0
self.current_event = None;
self._message_factory = config.create_default_thread_message_factory()
def __del__(self):
self.sock.close()
def _add_message(self, nodeid, message):
addr = ('127.0.0.1', self.port + nodeid)
# Ignore any exceptions
try:
msg = self._message_factory.create(io.BytesIO(message))
if msg is not None:
self.devices[addr]['msgs'].append(msg)
except Exception as e:
# Just print the exception to the console
print("EXCEPTION: %s" % e)
pass
def set_lowpan_context(self, cid, prefix):
self._message_factory.set_lowpan_context(cid, prefix)
def get_messages_sent_by(self, nodeid):
""" Get sniffed messages.
Note! This method flushes the message queue so calling this method again will return only the newly logged messages.
Args:
nodeid (int): node id
Returns:
MessagesSet: a set with received messages.
"""
addr = ('127.0.0.1', self.port + nodeid)
messages = self.devices[addr]['msgs']
self.devices[addr]['msgs'] = []
return message.MessagesSet(messages)
def receive_events(self):
if self.current_event is None:
self.sock.setblocking(0)
else:
self.sock.setblocking(1)
while True:
try:
msg, addr = self.sock.recvfrom(1024)
except socket.error:
break
if addr not in self.devices:
self.devices[addr] = {}
self.devices[addr]['alarm'] = None
self.devices[addr]['msgs'] = []
self.devices[addr]['time'] = self.current_time
#print "New device:", addr, self.devices
delay, type, datalen = struct.unpack('=QBH', msg[:11])
data = msg[11:]
event_time = self.current_time + delay
if type == 0:
# remove any existing alarm event for device
try:
self.event_queue.remove(self.devices[addr]['alarm'])
#print "-- Remove\t", self.devices[addr]['alarm']
self.devices[addr]['alarm'] = None
except ValueError:
pass
# add alarm event to event queue
event = (event_time, addr, type, datalen)
#print "-- Enqueue\t", event, delay, self.current_time
bisect.insort(self.event_queue, event)
self.devices[addr]['alarm'] = event
if self.current_event is not None and self.current_event[1] == addr:
#print "Done\t", self.current_event
self.current_event = None
return
elif type == 1:
# add radio receive events event queue
for device in self.devices:
if device != addr:
event = (event_time, device, type, datalen, data)
#print "-- Enqueue\t", event
bisect.insort(self.event_queue, event)
self._add_message(addr[1] - self.port, data)
# add radio transmit done events to event queue
event = (event_time, addr, type, datalen, data)
bisect.insort(self.event_queue, event)
def process_next_event(self):
if self.current_event != None:
return
#print "Events", len(self.event_queue)
count = 0
for event in self.event_queue:
#print count, event
count += 1
# process next event
try:
event = self.event_queue.pop(0)
except IndexError:
return
#print "Pop\t", event
if len(event) == 4:
event_time, addr, type, datalen = event
else:
event_time, addr, type, datalen, data = event
self.event_count += 1
self.current_event = event
assert(event_time >= self.current_time)
self.current_time = event_time
elapsed = event_time - self.devices[addr]['time']
self.devices[addr]['time'] = event_time
message = struct.pack('=QBH', elapsed, type, datalen)
if type == 0:
self.devices[addr]['alarm'] = None
self.sock.sendto(message, addr)
elif type == 1:
message += data
self.sock.sendto(message, addr)
def sync_devices(self):
for addr in self.devices:
elapsed = self.current_time - self.devices[addr]['time']
self.devices[addr]['time'] = self.current_time
message = struct.pack('=QBH', elapsed, 0, 0)
self.sock.sendto(message, addr)
def go(self, duration):
duration = int(duration) * 1000000
start_time = self.current_time
self.current_event = None
print "running for %d us" % duration
self.receive_events()
while (self.current_time - start_time) < duration:
self.process_next_event()
self.receive_events()
self.sync_devices()
+13 -10
View File
@@ -50,9 +50,11 @@ SRV_1_SERVER_DATA = 'qux'
class Test_Service(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)
self.nodes[i] = node.Node(i, simulator=self.simulator)
self.nodes[LEADER].set_panid(0xface)
self.nodes[LEADER].set_mode('rsdn')
@@ -84,6 +86,7 @@ class Test_Service(unittest.TestCase):
for node in list(self.nodes.values()):
node.stop()
del self.nodes
del self.simulator
def hasAloc(self, node_id, service_id):
for addr in self.nodes[node_id].get_ip6_address(config.ADDRESS_TYPE.ALOC):
@@ -100,16 +103,16 @@ class Test_Service(unittest.TestCase):
def failToPingFromAll(self, addr):
for node in list(self.nodes.values()):
self.assertFalse(node.ping(addr, timeout=3000))
self.assertFalse(node.ping(addr, timeout=3))
def test(self):
self.nodes[LEADER].start()
self.nodes[LEADER].set_state('leader')
self.simulator.go(5)
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[ROUTER1].start()
self.nodes[ROUTER2].start()
time.sleep(5)
self.simulator.go(5)
self.assertEqual(self.nodes[ROUTER1].get_state(), 'router')
self.assertEqual(self.nodes[ROUTER2].get_state(), 'router')
@@ -122,7 +125,7 @@ class Test_Service(unittest.TestCase):
self.nodes[ROUTER1].add_service(SRV_0_ENT_NUMBER, SRV_0_SERVICE_DATA, SRV_0_SERVER_DATA)
self.nodes[ROUTER1].register_netdata()
time.sleep(2)
self.simulator.go(2)
self.assertEqual(self.hasAloc(LEADER, SRV_0_ID), False)
self.assertEqual(self.hasAloc(LEADER, SRV_1_ID), False)
@@ -136,7 +139,7 @@ class Test_Service(unittest.TestCase):
self.nodes[LEADER].add_service(SRV_0_ENT_NUMBER, SRV_0_SERVICE_DATA, SRV_0_SERVER_DATA)
self.nodes[LEADER].register_netdata()
time.sleep(2)
self.simulator.go(2)
self.assertEqual(self.hasAloc(LEADER, SRV_0_ID), True)
self.assertEqual(self.hasAloc(LEADER, SRV_1_ID), False)
@@ -149,7 +152,7 @@ class Test_Service(unittest.TestCase):
self.nodes[ROUTER2].add_service(SRV_1_ENT_NUMBER, SRV_1_SERVICE_DATA, SRV_1_SERVER_DATA)
self.nodes[ROUTER2].register_netdata()
time.sleep(2)
self.simulator.go(2)
self.assertEqual(self.hasAloc(LEADER, SRV_0_ID), True)
self.assertEqual(self.hasAloc(LEADER, SRV_1_ID), False)
@@ -164,7 +167,7 @@ class Test_Service(unittest.TestCase):
self.nodes[ROUTER1].remove_service(SRV_0_ENT_NUMBER, SRV_0_SERVICE_DATA)
self.nodes[ROUTER1].register_netdata()
time.sleep(2)
self.simulator.go(2)
self.assertEqual(self.hasAloc(LEADER, SRV_0_ID), True)
self.assertEqual(self.hasAloc(LEADER, SRV_1_ID), False)
@@ -178,7 +181,7 @@ class Test_Service(unittest.TestCase):
self.nodes[LEADER].remove_service(SRV_0_ENT_NUMBER, SRV_0_SERVICE_DATA)
self.nodes[LEADER].register_netdata()
time.sleep(2)
self.simulator.go(2)
self.assertEqual(self.hasAloc(LEADER, SRV_0_ID), False)
self.assertEqual(self.hasAloc(LEADER, SRV_1_ID), False)
@@ -192,7 +195,7 @@ class Test_Service(unittest.TestCase):
self.nodes[ROUTER2].remove_service(SRV_1_ENT_NUMBER, SRV_1_SERVICE_DATA)
self.nodes[ROUTER2].register_netdata()
time.sleep(2)
self.simulator.go(2)
self.assertEqual(self.hasAloc(LEADER, SRV_0_ID), False)
self.assertEqual(self.hasAloc(LEADER, SRV_1_ID), False)