blob: 948065c7d3852002a78e9c903a32acfa35a9033b [file] [log] [blame]
import os, time, logging
from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error
class netpipe(test.test):
version = 1
NP_FILE = '/tmp/np.out'
# http://www.scl.ameslab.gov/netpipe/code/NetPIPE-3.7.1.tar.gz
def setup(self, tarball='NetPIPE-3.7.1.tar.gz'):
tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir)
utils.extract_tarball_to_dir(tarball, self.srcdir)
os.chdir(self.srcdir)
utils.system('patch -p1 < ../makefile.patch')
utils.make()
def initialize(self):
self.job.require_gcc()
# Add arguments later
self.server_path = '%s %%s' % os.path.join(self.srcdir, 'NPtcp')
# Add server_ip and arguments later
base_path = os.path.join(self.srcdir, 'NPtcp -h')
self.client_path = '%s %%s -o %s %%s' % (base_path, self.NP_FILE)
self.results = []
def cleanup(self):
# Just in case...
utils.system('killall -9 NPtcp', ignore_status=True)
def run_once(self, server_ip, client_ip, role, bidirectional=False,
buffer_size=None, upper_bound=None,
perturbation_size=3):
self.role = role
# Any arguments used must be the same on both the client and the server
args = '-p %d ' % perturbation_size
if bidirectional:
args += '-2 '
if buffer_size:
args += '-b %d ' % buffer_size
if upper_bound:
args += '-u %d ' % upper_bound
server_tag = server_ip + '#netpipe-server'
client_tag = client_ip + '#netpipe-client'
all = [server_tag, client_tag]
if role == 'server':
# Wait up to ten minutes for both to reach this point.
self.job.barrier(server_tag, 'start', 600).rendezvous(*all)
self.server_start(args)
# Both the client and server should be closed so just to make
# sure they are both at the same point wait at most five minutes.
self.job.barrier(server_tag, 'stop', 300).rendezvous(*all)
elif role == 'client':
# Wait up to ten minutes for the server to start
self.job.barrier(client_tag, 'start', 600).rendezvous(*all)
# Sleep 10 seconds to make sure the server is started
time.sleep(10)
self.client(server_ip, args)
# Wait up to five minutes for the server to also reach this point
self.job.barrier(client_tag, 'stop', 300).rendezvous(*all)
else:
raise error.TestError('invalid role specified')
def server_start(self, args):
cmd = self.server_path % args
self.results.append(utils.system_output(cmd, retain_output=True))
def client(self, server_ip, args):
cmd = self.client_path % (server_ip, args)
try:
# We don't care about the actual output since the important stuff
# goes to self.NP_FILE
utils.system(cmd)
except error.CmdError, e:
""" Catch errors due to timeout, but raise others
The actual error string is:
"Command did not complete within %d seconds"
called in function join_bg_job in the file common_lib/utils.py
Looking for 'within' is probably not the best way to do this but
works for now"""
if ('within' in e.additional_text
or 'non-zero' in e.additional_text):
logging.debug(e.additional_text)
else:
raise
def postprocess(self):
if self.role == 'client':
try:
output = open(self.NP_FILE)
for line in output.readlines():
buff, bandwidth, latency = line.split()
attr = {'buffer_size':buff}
keyval = {'bandwidth':bandwidth, 'latency':latency}
self.write_iteration_keyval(attr, keyval)
finally:
output.close()
os.remove(self.NP_FILE)