[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
@@ -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: