blob: 09a50ecf75963c780ba9654871f1f2e1b8769aee [file] [log] [blame]
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
from __future__ import unicode_literals
from __future__ import division
from __future__ import absolute_import
from __future__ import print_function
import os
import sys
import time
import traceback
from threading import Event
from threading import Timer
from system_test import TestCase, Qdrouterd, main_module, TIMEOUT
from system_test import Timestamp
from system_test import QdManager
from system_test import unittest
from system_test import DIR
from system_test import SkipIfNeeded
from system_test import Process
from qpid_dispatch.management.client import Node
from subprocess import PIPE, STDOUT
# Tests in this file are organized by classes that inherit TestCase.
# The first instance is TcpAdaptor(TestCase).
# The tests emit files that are named starting with 'TcpAdaptor'. This includes
# logs and shell scripts.
# Subsequent TestCase subclasses must follow this pattern and emit files named
# with the test class name at the beginning of the emitted files.
try:
from TCP_echo_client import TcpEchoClient
from TCP_echo_server import TcpEchoServer
except ImportError:
class TCP_echo_client(object):
pass
class TCP_echo_server(object):
pass
DISABLE_SELECTOR_TESTS = False
DISABLE_SELECTOR_REASON = ''
try:
import selectors
except ImportError:
DISABLE_SELECTOR_TESTS = True
DISABLE_SELECTOR_REASON = "Python selectors module is not available on this platform."
class Logger():
"""
Record event logs as existing Logger. Also add:
* ofile - optional file opened in 'append' mode to which each log line is written
TODO: Replace system_test Logger with this after merging dev-protocol-adaptors branch
"""
def __init__(self,
title="Logger",
print_to_console=False,
save_for_dump=True,
ofilename=None):
self.title = title
self.print_to_console = print_to_console
self.save_for_dump = save_for_dump
self.logs = []
self.ofilename = ofilename
def log(self, msg):
ts = Timestamp()
if self.save_for_dump:
self.logs.append((ts, msg))
if self.print_to_console:
print("%s %s" % (ts, msg))
sys.stdout.flush()
if self.ofilename is not None:
with open(self.ofilename, 'a') as f_out:
f_out.write("%s %s\n" % (ts, msg))
f_out.flush()
def dump(self):
print(self)
sys.stdout.flush()
def __str__(self):
lines = []
lines.append(self.title)
for ts, msg in self.logs:
lines.append("%s %s" % (ts, msg))
res = str('\n'.join(lines))
return res
class TcpAdaptor(TestCase):
"""
6 edge routers connected via 3 interior routers.
9 echo servers are connected via tcpConnector, one to each router.
Each router has 10 listeners, one for each server and
another for which there is no server.
"""
# +-------+ +---------+ +---------+ +---------+ +-------+
# | EA1 |<-->| INTA |<==>| INTB |<==>| INTC |<-->| EC1 |
# +-------+ | | | | | | +-------+
# +-------+ | | | | | | +-------+
# | EA2 |<-->| | | | | |<-->| EC2 |
# +-------+ +---------+ +---------+ +---------+ +-------+
# ^ ^
# | |
# +-------+ +-------+
# | EB1 | | EB2 |
# +-------+ +-------+
#
# Each router tcp-connects to a like-named echo server.
# Each router has tcp-listeners for every echo server
#
# +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+
# +--|tcp |-|tcp |-|tcp |-|tcp |-|tcp |-|tcp |-|tcp |-|tcp |-|tcp |--+
# | |lsnr| |lsnr| |lsnr| |lsnr| |lsnr| |lsnr| |lsnr| |lsnr| |lsnr| |
# | |EA1 | |EA2 | |INTA| |EB1 | |EB2 | |INTB| |EC1 | |EC2 | |INTC| |
# | +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ |
# | +---------+ +------+
# | Router | tcp | | echo |
# | EA1 |connector|->|server|
# | +---------+ | EA1 |
# | | +------+
# +------------------------------------------------------------------+
#
# Allocate routers in this order
router_order = ['INTA', 'INTB', 'INTC', 'EA1', 'EA2', 'EB1', 'EB2', 'EC1', 'EC2']
# List indexed in router_order
# First listener in each router is normal AMQP for test setup and mgmt.
amqp_listener_ports = {}
# Each router listens for TCP where the tcp-address is the router name.
# Each router has N listeners, one for the echo server connected to each router.
tcp_client_listener_ports = {}
# Each router connects to an echo server
tcp_server_listener_ports = {}
# Each router has a TCP listener that has no associated server
nodest_listener_ports = {}
# Each router has a console listener
#http_listener_ports = {}
# local timeout in seconds to wait for one echo client to finish
echo_timeout = 30
# TCP siteId for listeners and connectors
site = "mySite"
# Each router has an echo server to which it connects
echo_servers = {}
@classmethod
def setUpClass(cls):
"""Start a router"""
super(TcpAdaptor, cls).setUpClass()
if DISABLE_SELECTOR_TESTS:
return
def router(name, mode, connection, extra=None):
"""
Launch a router through the system_test framework.
For each router:
* normal listener first
#* http listener for console connections
* tcp listener for 'nodest', which will never exist
* tcp connector to echo server whose address is the same as this router's name
* six tcp listeners, one for each server on each router on the network
:param name: router name
:param mode: router mode: interior or edge
:param connection: list of router-level connection/listener tuples
:param extra: yet more configuation tuples. unused for now
:return:
"""
config = [
('router', {'mode': mode, 'id': name}),
('listener', {'port': cls.amqp_listener_ports[name]}),
#('listener', {'port': cls.http_listener_ports[name], 'http': 'yes'}),
('tcpListener', {'host': "0.0.0.0",
'port': cls.nodest_listener_ports[name],
'address': 'nodest',
'siteId': cls.site}),
('tcpConnector', {'host': "127.0.0.1",
'port': cls.tcp_server_listener_ports[name],
'address': 'ES_' + name,
'siteId': cls.site})
]
if connection:
config.extend(connection)
listeners = []
for rtr in cls.router_order:
listener = {'host': "0.0.0.0",
'port': cls.tcp_client_listener_ports[name][rtr],
'address': 'ES_' + rtr,
'siteId': cls.site}
tup = [(('tcpListener', listener))]
listeners.extend(tup)
config.extend(listeners)
if extra:
config.extend(extra)
config = Qdrouterd.Config(config)
cls.routers.append(cls.tester.qdrouterd(name, config, wait=True))
cls.routers = []
# Allocate a sea of ports
for rtr in cls.router_order:
cls.amqp_listener_ports[rtr] = cls.tester.get_port()
cls.tcp_server_listener_ports[rtr] = cls.tester.get_port()
tl_ports = {}
for tcp_listener in cls.router_order:
tl_ports[tcp_listener] = cls.tester.get_port()
cls.tcp_client_listener_ports[rtr] = tl_ports
cls.nodest_listener_ports[rtr] = cls.tester.get_port()
#cls.http_listener_ports[rtr] = cls.tester.get_port()
inter_router_port_AB = cls.tester.get_port()
inter_router_port_BC = cls.tester.get_port()
cls.INTA_edge_port = cls.tester.get_port()
cls.INTB_edge_port = cls.tester.get_port()
cls.INTC_edge_port = cls.tester.get_port()
cls.logger = Logger(title="TcpAdaptor-testClass",
print_to_console=True,
save_for_dump=False,
ofilename='../setUpClass/TcpAdaptor.log')
# Write a dummy log line for scraper.
cls.logger.log("SERVER (info) Container Name: TCP_TEST")
# Create a scoreboard for the ports
p_out = []
for rtr in cls.router_order:
p_out.append("%s_amqp=%d" %
(rtr, cls.amqp_listener_ports[rtr]))
p_out.append("%s_echo_server=%d" %
(rtr, cls.tcp_server_listener_ports[rtr]))
for tcp_listener in cls.router_order:
p_out.append("%s_echo_listener_for_%s=%d" %
(rtr, tcp_listener, cls.tcp_client_listener_ports[rtr][tcp_listener]))
p_out.append("%s_nodest_listener=%d" %
(rtr, cls.nodest_listener_ports[rtr]))
# p_out.append("%s_http_listener=%d" %
# (rtr, cls.http_listener_ports[rtr]))
p_out.append("inter_router_port_AB=%d" % inter_router_port_AB)
p_out.append("inter_router_port_BC=%d" % inter_router_port_BC)
p_out.append("INTA_edge_port=%d" % cls.INTA_edge_port)
p_out.append("INTB_edge_port=%d" % cls.INTB_edge_port)
p_out.append("INTC_edge_port=%d" % cls.INTC_edge_port)
# write to log
for line in p_out:
cls.logger.log("TCP_TEST %s" % line)
# write to shell script
with open("../setUpClass/TcpAdaptor-ports.sh", 'w') as o_file:
for line in p_out:
o_file.write("set %s\n" % line)
# Write a script to run scraper on this test's log files
scraper_abspath = os.path.join(os.environ.get('BUILD_DIR'), 'tests', 'scraper', 'scraper.py')
logs_dir = os.path.abspath("../setUpClass")
main_log = "TcpAdaptor.log"
echo_logs = "TcpAdaptor_echo*"
big_test_log = "TcpAdaptor_all.log"
int_logs = "I*.log"
edge_logs = "E*.log"
log_modules_spec = "--log-modules TCP_ADAPTOR,TCP_TEST,ECHO_SERVER,ECHO_CLIENT"
html_output = "TcpAdaptor.html"
with open("../setUpClass/TcpAdaptor-run-scraper.sh", 'w') as o_file:
o_file.write("#!/bin/bash\n\n")
o_file.write("# Script to run scraper on test class TcpAdaptor test result\n")
o_file.write("# cd into logs directory\n")
o_file.write("cd %s\n\n" % logs_dir)
o_file.write("# Concatenate test class logs into single file\n")
o_file.write("cat %s %s > %s\n\n" % (main_log, echo_logs, big_test_log))
o_file.write("# run scraper\n")
o_file.write("python %s %s -f %s %s %s > %s\n\n" %
(scraper_abspath, log_modules_spec, int_logs, edge_logs, big_test_log, html_output))
o_file.write("echo View the results by opening the html file\n")
o_file.write("echo firefox %s" % (os.path.join(logs_dir, html_output)))
# Launch the routers
router('INTA', 'interior',
[('listener', {'role': 'inter-router', 'port': inter_router_port_AB}),
('listener', {'name': 'uplink', 'role': 'edge', 'port': cls.INTA_edge_port})])
router('INTB', 'interior',
[('connector', {'role': 'inter-router', 'port': inter_router_port_AB}),
('listener', {'role': 'inter-router', 'port': inter_router_port_BC}),
('listener', {'name': 'uplink', 'role': 'edge', 'port': cls.INTB_edge_port})])
router('INTC', 'interior',
[('connector', {'role': 'inter-router', 'port': inter_router_port_BC}),
('listener', {'name': 'uplink', 'role': 'edge', 'port': cls.INTC_edge_port})])
router('EA1', 'edge',
[('connector', {'name': 'uplink', 'role': 'edge', 'port': cls.INTA_edge_port})])
router('EA2', 'edge',
[('connector', {'name': 'uplink', 'role': 'edge', 'port': cls.INTA_edge_port})])
router('EB1', 'edge',
[('connector', {'name': 'uplink', 'role': 'edge', 'port': cls.INTB_edge_port})])
router('EB2', 'edge',
[('connector', {'name': 'uplink', 'role': 'edge', 'port': cls.INTB_edge_port})])
router('EC1', 'edge',
[('connector', {'name': 'uplink', 'role': 'edge', 'port': cls.INTC_edge_port})])
router('EC2', 'edge',
[('connector', {'name': 'uplink', 'role': 'edge', 'port': cls.INTC_edge_port})])
cls.INTA = cls.routers[0]
cls.INTB = cls.routers[1]
cls.INTC = cls.routers[2]
cls.EA1 = cls.routers[3]
cls.EA2 = cls.routers[4]
cls.EB1 = cls.routers[5]
cls.EB2 = cls.routers[6]
cls.EC1 = cls.routers[7]
cls.EC2 = cls.routers[8]
cls.router_dict = {}
cls.router_dict['INTA'] = cls.INTA
cls.router_dict['INTB'] = cls.INTB
cls.router_dict['INTC'] = cls.INTC
cls.router_dict['EA1'] = cls.EA1
cls.router_dict['EA2'] = cls.EA2
cls.router_dict['EB1'] = cls.EB1
cls.router_dict['EB2'] = cls.EB2
cls.router_dict['EC1'] = cls.EC1
cls.router_dict['EC2'] = cls.EC2
cls.logger.log("TCP_TEST INTA waiting for connection to INTB")
cls.INTA.wait_router_connected('INTB')
cls.logger.log("TCP_TEST INTB waiting for connection to INTA")
cls.INTB.wait_router_connected('INTA')
cls.logger.log("TCP_TEST INTB waiting for connection to INTC")
cls.INTB.wait_router_connected('INTC')
cls.logger.log("TCP_TEST INTC waiting for connection to INTB")
cls.INTC.wait_router_connected('INTB')
# define logging levels
cls.print_logs_server = False
cls.print_logs_client = True
# start echo servers
for rtr in cls.router_order:
test_name = "TcpAdaptor"
server_prefix = "ECHO_SERVER %s ES_%s" % (test_name, rtr)
server_logger = Logger(title=test_name,
print_to_console=cls.print_logs_server,
save_for_dump=False,
ofilename="../setUpClass/TcpAdaptor_echo_server_%s.log" % rtr)
cls.logger.log("TCP_TEST Launching echo server '%s'" % server_prefix)
server = TcpEchoServer(prefix=server_prefix,
port=cls.tcp_server_listener_ports[rtr],
logger=server_logger)
assert server.is_running
cls.echo_servers[rtr] = server
# wait for server addresses (mobile ES_<rtr>) to propagate to all interior routers
interior_rtrs = [rtr for rtr in cls.router_order if rtr.startswith('I')]
found_all = False
while not found_all:
found_all = True
cls.logger.log("TCP_TEST Poll wait for echo server addresses to propagate")
for rtr in interior_rtrs:
# query each interior for addresses
p = Process(
['qdstat', '-b', str(cls.router_dict[rtr].addresses[0]), '-a'],
name='qdstat-snap1', stdout=PIPE, expect=None,
universal_newlines=True)
out = p.communicate()[0]
# examine what this router can see; signal poll loop to continue or not
lines = out.split("\n")
server_lines = [line for line in lines if "mobile" in line and "ES_" in line]
if not len(server_lines) == len(cls.router_order):
found_all = False
seen = []
for line in server_lines:
flds = line.split()
seen.extend([fld for fld in flds if fld.startswith("ES_")])
unseen = [srv for srv in cls.router_order if "ES_" + srv not in seen]
cls.logger.log("TCP_TEST Router %s sees only %d of %d addresses. Waiting for %s" %
(rtr, len(server_lines), len(cls.router_order), unseen))
cls.logger.log("TCP_TEST Done poll wait")
@classmethod
def tearDownClass(cls):
# stop echo servers
for rtr in cls.router_order:
server = cls.echo_servers.get(rtr)
if server is not None:
cls.logger.log("TCP_TEST Stopping echo server %s" % rtr)
server.wait()
super(TcpAdaptor, cls).tearDownClass()
#
# Test concurrent clients
#
class EchoClientRunner():
"""
Launch an echo client upon construction.
Provide poll interface for checking done/error.
Provide wait/join to shut down.
"""
def __init__(self, test_name, client_n, logger, client, server, size, count, print_client_logs):
"""
Launch an echo client upon construction.
:param test_name: Unique name for log file prefix
:param client_n: Client number for differentiating otherwise identical clients
:param logger: parent logger for logging test activity vs. client activity
:param client: router name to which the client connects
:param server: name whose address the client is targeting
:param size: length of messages in bytes
:param count: number of messages to be sent/verified
:param print_client_logs: verbosity switch
:return Null if success else string describing error
"""
self.test_name = test_name
self.client_n = str(client_n)
self.logger = logger
self.client = client
self.server = server
self.size = size
self.count = count
self.print_client_logs = print_client_logs
self.client_final = False
# Each router has a listener for the echo server attached to every router
self.listener_port = TcpAdaptor.tcp_client_listener_ports[self.client][self.server]
self.name = "%s_%s_%s_%s" % (self.test_name, self.client_n, self.size, self.count)
self.client_prefix = "ECHO_CLIENT %s" % self.name
self.client_logger = Logger(title=self.client_prefix,
print_to_console=self.print_client_logs,
save_for_dump=False,
ofilename="../setUpClass/TcpAdaptor_echo_client_%s.log" % self.name)
try:
self.e_client = TcpEchoClient(prefix=self.client_prefix,
host='localhost',
port=self.listener_port,
size=self.size,
count=self.count,
timeout=TIMEOUT,
logger=self.client_logger)
except Exception as exc:
self.e_client.error = "TCP_TEST TcpAdaptor_runner_%s failed. Exception: %s" % \
(self.name, traceback.format_exc())
self.logger.log(self.e_client.error)
raise Exception(self.e_client.error)
def client_error(self):
return self.e_client.error
def client_exit_status(self):
return self.e_client.exit_status
def client_running(self):
return self.e_client.is_running
def wait(self):
# wait for client to exit
# Return None if successful wait/join/exit/close else error message
result = None
try:
self.e_client.wait()
except Exception as exc:
self.e_client.error = "TCP_TEST EchoClient %s failed. Exception: %s" % \
(self.name, traceback.format_exc())
self.logger.log(self.e_client.error)
result = self.e_client.error
return result
class EchoPair():
"""
For the concurrent tcp tests this class describes one of the client-
server echo pairs and the traffic pattern between them.
"""
def __init__(self, client_rtr, server_rtr, sizes=None, counts=None):
self.client_rtr = client_rtr
self.server_rtr = server_rtr
self.sizes = [1] if sizes is None else sizes
self.counts = [1] if counts is None else counts
def do_tcp_echo_n_routers(self, test_name, echo_pair_list):
"""
Launch all the echo pairs defined in the list
Wait for completion.
:param test_name test name
:param echo_pair_list list of EchoPair objects describing the test
:return: None if success else error message for ctest
"""
self.logger.log("TCP_TEST %s Start do_tcp_echo_n_routers" % (test_name))
result = None
runners = []
client_num = 0
start_time = time.time()
try:
# Launch the runners
for echo_pair in echo_pair_list:
client = echo_pair.client_rtr.name
server = echo_pair.server_rtr.name
for size in echo_pair.sizes:
for count in echo_pair.counts:
log_msg = "TCP_TEST %s Running pair %d %s->%s size=%d count=%d" % \
(test_name, client_num, client, server, size, count)
self.logger.log(log_msg)
runner = self.EchoClientRunner(test_name, client_num, self.logger,
client, server, size, count,
self.print_logs_client)
runners.append(runner)
client_num += 1
# Loop until timeout, error, or completion
while result is None:
# Check for timeout
time.sleep(0.1)
elapsed = time.time() - start_time
if elapsed > self.echo_timeout:
result = "TCP_TEST TIMEOUT - local wait time exceeded"
break
# Make sure servers are still up
for rtr in TcpAdaptor.router_order:
es = TcpAdaptor.echo_servers[rtr]
if es.error is not None:
self.logger.log("TCP_TEST %s Server %s stopped with error: %s" %
(test_name, es.prefix, es.error))
result = es.error
break
if es.exit_status is not None:
self.logger.log("TCP_TEST %s Server %s stopped with status: %s" %
(test_name, es.prefix, es.exit_status))
result = es.exit_status
break
if result is not None:
break
# Check for completion or runner error
complete = True
for runner in runners:
if not runner.client_final:
error = runner.client_error()
if error is not None:
self.logger.log("TCP_TEST %s Client %s stopped with error: %s" %
(test_name, runner.name, error))
result = error
runner.client_final = True
break
status = runner.client_exit_status()
if status is not None:
self.logger.log("TCP_TEST %s Client %s stopped with status: %s" %
(test_name, runner.name, status))
result = status
runner.client_final = True
break
running = runner.client_running()
if running:
complete = False
else:
self.logger.log("TCP_TEST %s Client %s exited normally" %
(test_name, runner.name))
runner.client_final = True
if complete and result is None:
self.logger.log("TCP_TEST %s SUCCESS" %
test_name)
break
# Wait/join all the runners
for runner in runners:
runner.wait()
if result is not None:
self.logger.log("TCP_TEST %s failed: %s" % (test_name, result))
except Exception as exc:
result = "TCP_TEST %s failed. Exception: %s" % \
(test_name, traceback.format_exc())
return result
#
# A series of 1-byte messsages, one at a time, to prove general connectivity
#
@SkipIfNeeded(DISABLE_SELECTOR_TESTS, DISABLE_SELECTOR_REASON)
def test_01_tcp_basic_connectivity(self):
"""
Echo a series of 1-byte messages, one at a time, to prove general connectivity.
Every listener is tried. Proves every router can forward to servers on
every other router.
"""
for l_rtr in self.router_order:
for s_rtr in self.router_order:
name = "test_01_tcp_%s_%s" % (l_rtr, s_rtr)
self.logger.log("TCP_TEST test_01_tcp_basic_connectivity Start %s" % name)
pairs = [self.EchoPair(self.router_dict[l_rtr], self.router_dict[s_rtr])]
result = self.do_tcp_echo_n_routers(name, pairs)
if result is not None:
print(result)
sys.stdout.flush()
assert result is None, "TCP_TEST test_01_tcp_basic_connectivity Stop %s FAIL: %s" % (name, result)
self.logger.log("TCP_TEST test_01_tcp_basic_connectivity Stop %s SUCCESS" % name)
# larger messages
@SkipIfNeeded(DISABLE_SELECTOR_TESTS, DISABLE_SELECTOR_REASON)
def test_10_tcp_INTA_INTA_100(self):
name = "test_10_tcp_INTA_INTA_100"
self.logger.log("TCP_TEST Start %s" % name)
pairs = [self.EchoPair(self.INTA, self.INTA, sizes=[100])]
result = self.do_tcp_echo_n_routers(name, pairs)
if result is not None:
print(result)
sys.stdout.flush()
assert result is None, "TCP_TEST Stop %s FAIL: %s" % (name, result)
self.logger.log("TCP_TEST Stop %s SUCCESS" % name)
@SkipIfNeeded(DISABLE_SELECTOR_TESTS, DISABLE_SELECTOR_REASON)
def test_11_tcp_INTA_INTA_1000(self):
name = "test_11_tcp_INTA_INTA_1000"
self.logger.log("TCP_TEST Start %s" % name)
pairs = [self.EchoPair(self.INTA, self.INTA, sizes=[1000])]
result = self.do_tcp_echo_n_routers(name, pairs)
if result is not None:
print(result)
sys.stdout.flush()
assert result is None, "TCP_TEST Stop %s FAIL: %s" % (name, result)
self.logger.log("TCP_TEST Stop %s SUCCESS" % name)
@SkipIfNeeded(DISABLE_SELECTOR_TESTS, DISABLE_SELECTOR_REASON)
def test_12_tcp_INTA_INTA_500000(self):
name = "test_12_tcp_INTA_INTA_500000"
self.logger.log("TCP_TEST Start %s" % name)
pairs = [self.EchoPair(self.INTA, self.INTA, sizes=[500000])]
result = self.do_tcp_echo_n_routers(name, pairs)
if result is not None:
print(result)
sys.stdout.flush()
assert result is None, "TCP_TEST Stop %s FAIL: %s" % (name, result)
self.logger.log("TCP_TEST Stop %s SUCCESS" % name)
@SkipIfNeeded(DISABLE_SELECTOR_TESTS, DISABLE_SELECTOR_REASON)
def test_13_tcp_EA1_EC2_500000(self):
name = "test_12_tcp_EA1_EC2_500000"
self.logger.log("TCP_TEST Start %s" % name)
pairs = [self.EchoPair(self.INTA, self.INTA, sizes=[500000])]
result = self.do_tcp_echo_n_routers(name, pairs)
if result is not None:
print(result)
sys.stdout.flush()
assert result is None, "TCP_TEST Stop %s FAIL: %s" % (name, result)
self.logger.log("TCP_TEST Stop %s SUCCESS" % name)
@SkipIfNeeded(DISABLE_SELECTOR_TESTS, DISABLE_SELECTOR_REASON)
def test_20_tcp_connect_disconnect(self):
name = "test_20_tcp_connect_disconnect"
self.logger.log("TCP_TEST Start %s" % name)
pairs = [self.EchoPair(self.INTA, self.INTA, sizes=[0])]
result = self.do_tcp_echo_n_routers(name, pairs)
if result is not None:
print(result)
sys.stdout.flush()
assert result is None, "TCP_TEST Stop %s FAIL: %s" % (name, result)
# TODO: This test passes but in passing router INTA crashes undetected.
self.logger.log("TCP_TEST Stop %s SUCCESS" % name)
# concurrent messages
@SkipIfNeeded(DISABLE_SELECTOR_TESTS, DISABLE_SELECTOR_REASON)
def test_50_concurrent(self):
name = "test_50_concurrent_AtoA_BtoB"
self.logger.log("TCP_TEST Start %s" % name)
pairs = [self.EchoPair(self.INTA, self.INTA),
self.EchoPair(self.INTB, self.INTB)]
result = self.do_tcp_echo_n_routers(name, pairs)
if result is not None:
print(result)
sys.stdout.flush()
assert result is None, "TCP_TEST Stop %s FAIL: %s" % (name, result)
self.logger.log("TCP_TEST Stop %s SUCCESS" % name)
if __name__ == '__main__':
unittest.main(main_module())