def check_tcp_connectivity(client: IPNode, server: IPNode, v6=False, server_port=80, server_itf=None, timeout=300) \ -> Tuple[int, bytes, bytes]: require_cmd("nc", help_str="nc is required to run tests") if server_itf is None: server_itf = server.defaultIntf() server_ip = server_itf.ip6 if v6 else server_itf.ip server_cmd = "nc %s -l %d" % ("-6" if v6 else "-4", server_port) server_p = server.popen(server_cmd.split(" ")) t = 0 client_cmd = "nc -z -w 1 -v %s %d" % (server_ip, server_port) client_p = client.popen(client_cmd.split(" ")) while t != timeout * 2 and client_p.wait() != 0: t += 1 if server_p.poll() is not None: out, err = server_p.communicate() assert False, \ "The netcat server used to check TCP connectivity failed" \ " with the output:\n[stdout]\n%s\n[stderr]\n%s" % (out, err) time.sleep(.5) client_p = client.popen(client_cmd.split(" ")) out, err = client_p.communicate() code = client_p.poll() server_p.send_signal(signal.SIGINT) server_p.wait() return code, out, err
def assert_bw(src: IPNode, dst: IPNode, bw_target: float, tolerance=1, v6=False): require_cmd("iperf3", help_str="iperf3 is required to run tests") iperf = dst.popen("iperf3 -s -J --one-off", universal_newlines=True) time.sleep(1) dst_ip = dst.intf().ip6 if v6 else dst.intf().ip src.popen("iperf3 -c {}".format(dst_ip), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) out, err = iperf.communicate() assert iperf.poll() == 0, "Cannot use iperf3 between {src} and {dst}: " \ "{err}".format(src=src, dst=dst, err=err) bws = [] data = json.loads(out) for sample in data["intervals"]: bw = int(sample["sum"]["bits_per_second"]) / 10**6 if bw_target - tolerance <= bw <= bw_target + tolerance: bws.append(bw) assert len(bws) >= 5, \ "Less than half of the pings between {src} and {dst}" \ " had the desired latency".format(src=src, dst=dst)