mirror of
https://github.com/espressif/openthread.git
synced 2026-08-03 01:17:46 +00:00
[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:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user