class BaseStressTest(object, metaclass=StressTestMetaclass): def __init__(self, name, headers, raw=False): self.name = name self._otns_args = [] if raw: self._otns_args.append('-raw') self.ns = OTNS(otns_args=self._otns_args) self.ns.speed = float('inf') self.ns.web() self.result = StressTestResult(name=name, headers=headers) self.result.start() def run(self): raise NotImplementedError() def reset(self): nodes = self.ns.nodes() if nodes: self.ns.delete(*nodes.keys()) def stop(self): self.result.stop() self.ns.close() def expect_node_state(self, nid: int, state: str, timeout: float, go_step: int = 1) -> None: while timeout > 0: self.ns.go(go_step) timeout -= go_step if self.ns.get_state(nid) == state: return raise UnexpectedNodeState(nid, state, self.ns.get_state(nid)) def report(self): try: STRESS_RESULT_FILE = os.environ['STRESS_RESULT_FILE'] stress_result_fd = open(STRESS_RESULT_FILE, 'wt') except KeyError: stress_result_fd = sys.stdout try: stress_result_fd.write( f"""**[OTNS](https://github.com/openthread/ot-ns) Stress Tests Report Generated at {time.strftime( "%m/%d %H:%M:%S")}**\n""") stress_result_fd.write(self.result.format()) finally: if stress_result_fd is not sys.stdout: stress_result_fd.close() def avg_except_max(self, vals: Collection[float]) -> float: assert len(vals) >= 2 max_val = max(vals) max_idxes = [i for i in range(len(vals)) if vals[i] >= max_val] assert max_idxes rmidx = max_idxes[0] vals[rmidx:rmidx + 1] = [] return self.avg(vals) def avg(self, vals: Collection[float]) -> float: assert len(vals) > 0 return sum(vals) / len(vals) def expect_all_nodes_become_routers(self, timeout: int = 1000) -> None: all_routers = False while timeout > 0 and not all_routers: self.ns.go(10) timeout -= 10 nodes = (self.ns.nodes()) all_routers = True print(nodes) for nid, info in nodes.items(): if info['state'] not in ['leader', 'router']: all_routers = False break if all_routers: break if not all_routers: raise UnexpectedError("not all nodes are Routers: %s" % self.ns.nodes()) def expect_node_addr(self, nodeid: int, addr: str, timeout=100): addr = ipaddress.IPv6Address(addr) found_addr = False while timeout > 0: if addr in map(ipaddress.IPv6Address, self.ns.get_ipaddrs(nodeid)): found_addr = True break self.ns.go(1) if not found_addr: raise UnexpectedNodeAddr( f'Address {addr} not found on node {nodeid}') def expect_node_mleid(self, nodeid: int, timeout: int): while True: mleid = self.ns.get_mleid(nodeid) if mleid: return mleid self.ns.go(1) timeout -= 1 if timeout <= 0: raise UnexpectedNodeAddr(f'MLEID not found on node {nodeid}')
C1 = add_node("router", 950, 300) C2 = add_node("router", 800, 700) C3 = add_node("router", 1100, 700) def ping(src: int, dst: int, duration: float): while duration > 0: ns.ping(src, dst) ns.go(1) duration -= 1 while True: ping(1, 11, 30) c1_rlocs = ns.get_ipaddrs(C1, "rloc") if c1_rlocs: for i in range(4): for id in (6, 7, 8, 9, 16, 17, 18, 19, C2, C3): ns.ping(id, c1_rlocs[0]) ns.delete(C1) ping(1, 11, 30) ns.delete(C2) ns.delete(C3) ns.go(130) add_node("router", 950, 300, id=C1) add_node("router", 800, 700, id=C2) add_node("router", 1100, 700, id=C3) ns.go(10)
def main(): logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s', level=logging.DEBUG) ns = OTNS() ns.set_title("Ping Example") ns.set_network_info(version="Latest", commit="master", real=False) ns.web() ns.speed = 4 def add_node(*args, **kwargs): return ns.add(*args, **kwargs, radio_range=RADIO_RANGE) add_node("fed", 100, 100) add_node("fed", 100, 300) add_node("fed", 100, 500) add_node("fed", 100, 700) add_node("fed", 100, 900) add_node("router", 450, 100) add_node("router", 550, 300) add_node("router", 450, 500) add_node("router", 550, 700) add_node("router", 450, 900) add_node("fed", 1800, 100) add_node("fed", 1800, 300) add_node("fed", 1800, 500) add_node("fed", 1800, 700) add_node("fed", 1800, 900) add_node("router", 1450, 100) add_node("router", 1350, 300) add_node("router", 1450, 500) add_node("router", 1350, 700) add_node("router", 1450, 900) C1 = add_node("router", 950, 300) C2 = add_node("router", 800, 700) C3 = add_node("router", 1100, 700) def ping(src: int, dst: int, duration: float): while duration > 0: ns.ping(src, dst) ns.go(1) duration -= 1 while True: ping(1, 11, 30) c1_rlocs = ns.get_ipaddrs(C1, "rloc") if c1_rlocs: for i in range(4): for id in (6, 7, 8, 9, 16, 17, 18, 19, C2, C3): ns.ping(id, c1_rlocs[0]) ns.delete(C1) ping(1, 11, 30) ns.delete(C2) ns.delete(C3) ns.go(130) add_node("router", 950, 300, id=C1) add_node("router", 800, 700, id=C2) add_node("router", 1100, 700, id=C3) ns.go(10)