[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
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))