54ca545dce
Make all the DPDK Python apps work with Python 2 or 3 to allow them to work with whatever is the system default. Signed-off-by: John McNamara <john.mcnamara@intel.com>
303 lines
9.3 KiB
Python
303 lines
9.3 KiB
Python
# BSD LICENSE
|
|
#
|
|
# Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
|
|
# All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
#
|
|
# * Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# * Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in
|
|
# the documentation and/or other materials provided with the
|
|
# distribution.
|
|
# * Neither the name of Intel Corporation nor the names of its
|
|
# contributors may be used to endorse or promote products derived
|
|
# from this software without specific prior written permission.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
# Test functions
|
|
|
|
import pexpect
|
|
|
|
# default autotest, used to run most tests
|
|
# waits for "Test OK"
|
|
|
|
|
|
def default_autotest(child, test_name):
|
|
child.sendline(test_name)
|
|
result = child.expect(["Test OK", "Test Failed",
|
|
"Command not found", pexpect.TIMEOUT], timeout=900)
|
|
if result == 1:
|
|
return -1, "Fail"
|
|
elif result == 2:
|
|
return -1, "Fail [Not found]"
|
|
elif result == 3:
|
|
return -1, "Fail [Timeout]"
|
|
return 0, "Success"
|
|
|
|
# autotest used to run dump commands
|
|
# just fires the command
|
|
|
|
|
|
def dump_autotest(child, test_name):
|
|
child.sendline(test_name)
|
|
return 0, "Success"
|
|
|
|
# memory autotest
|
|
# reads output and waits for Test OK
|
|
|
|
|
|
def memory_autotest(child, test_name):
|
|
child.sendline(test_name)
|
|
regexp = "phys:0x[0-9a-f]*, len:([0-9]*), virt:0x[0-9a-f]*, " \
|
|
"socket_id:[0-9]*"
|
|
index = child.expect([regexp, pexpect.TIMEOUT], timeout=180)
|
|
if index != 0:
|
|
return -1, "Fail [Timeout]"
|
|
size = int(child.match.groups()[0], 16)
|
|
if size <= 0:
|
|
return -1, "Fail [Bad size]"
|
|
index = child.expect(["Test OK", "Test Failed",
|
|
pexpect.TIMEOUT], timeout=10)
|
|
if index == 1:
|
|
return -1, "Fail"
|
|
elif index == 2:
|
|
return -1, "Fail [Timeout]"
|
|
return 0, "Success"
|
|
|
|
|
|
def spinlock_autotest(child, test_name):
|
|
i = 0
|
|
ir = 0
|
|
child.sendline(test_name)
|
|
while True:
|
|
index = child.expect(["Test OK",
|
|
"Test Failed",
|
|
"Hello from core ([0-9]*) !",
|
|
"Hello from within recursive locks "
|
|
"from ([0-9]*) !",
|
|
pexpect.TIMEOUT], timeout=5)
|
|
# ok
|
|
if index == 0:
|
|
break
|
|
|
|
# message, check ordering
|
|
elif index == 2:
|
|
if int(child.match.groups()[0]) < i:
|
|
return -1, "Fail [Bad order]"
|
|
i = int(child.match.groups()[0])
|
|
elif index == 3:
|
|
if int(child.match.groups()[0]) < ir:
|
|
return -1, "Fail [Bad order]"
|
|
ir = int(child.match.groups()[0])
|
|
|
|
# fail
|
|
elif index == 4:
|
|
return -1, "Fail [Timeout]"
|
|
elif index == 1:
|
|
return -1, "Fail"
|
|
|
|
return 0, "Success"
|
|
|
|
|
|
def rwlock_autotest(child, test_name):
|
|
i = 0
|
|
child.sendline(test_name)
|
|
while True:
|
|
index = child.expect(["Test OK",
|
|
"Test Failed",
|
|
"Hello from core ([0-9]*) !",
|
|
"Global write lock taken on master "
|
|
"core ([0-9]*)",
|
|
pexpect.TIMEOUT], timeout=10)
|
|
# ok
|
|
if index == 0:
|
|
if i != 0xffff:
|
|
return -1, "Fail [Message is missing]"
|
|
break
|
|
|
|
# message, check ordering
|
|
elif index == 2:
|
|
if int(child.match.groups()[0]) < i:
|
|
return -1, "Fail [Bad order]"
|
|
i = int(child.match.groups()[0])
|
|
|
|
# must be the last message, check ordering
|
|
elif index == 3:
|
|
i = 0xffff
|
|
|
|
elif index == 4:
|
|
return -1, "Fail [Timeout]"
|
|
|
|
# fail
|
|
else:
|
|
return -1, "Fail"
|
|
|
|
return 0, "Success"
|
|
|
|
|
|
def logs_autotest(child, test_name):
|
|
child.sendline(test_name)
|
|
|
|
log_list = [
|
|
"TESTAPP1: error message",
|
|
"TESTAPP1: critical message",
|
|
"TESTAPP2: critical message",
|
|
"TESTAPP1: error message",
|
|
]
|
|
|
|
for log_msg in log_list:
|
|
index = child.expect([log_msg,
|
|
"Test OK",
|
|
"Test Failed",
|
|
pexpect.TIMEOUT], timeout=10)
|
|
|
|
if index == 3:
|
|
return -1, "Fail [Timeout]"
|
|
# not ok
|
|
elif index != 0:
|
|
return -1, "Fail"
|
|
|
|
index = child.expect(["Test OK",
|
|
"Test Failed",
|
|
pexpect.TIMEOUT], timeout=10)
|
|
|
|
return 0, "Success"
|
|
|
|
|
|
def timer_autotest(child, test_name):
|
|
child.sendline(test_name)
|
|
|
|
index = child.expect(["Start timer stress tests",
|
|
"Test Failed",
|
|
pexpect.TIMEOUT], timeout=5)
|
|
|
|
if index == 1:
|
|
return -1, "Fail"
|
|
elif index == 2:
|
|
return -1, "Fail [Timeout]"
|
|
|
|
index = child.expect(["Start timer stress tests 2",
|
|
"Test Failed",
|
|
pexpect.TIMEOUT], timeout=5)
|
|
|
|
if index == 1:
|
|
return -1, "Fail"
|
|
elif index == 2:
|
|
return -1, "Fail [Timeout]"
|
|
|
|
index = child.expect(["Start timer basic tests",
|
|
"Test Failed",
|
|
pexpect.TIMEOUT], timeout=5)
|
|
|
|
if index == 1:
|
|
return -1, "Fail"
|
|
elif index == 2:
|
|
return -1, "Fail [Timeout]"
|
|
|
|
lcore_tim0 = -1
|
|
lcore_tim1 = -1
|
|
lcore_tim2 = -1
|
|
lcore_tim3 = -1
|
|
|
|
while True:
|
|
index = child.expect(["TESTTIMER: ([0-9]*): callback id=([0-9]*) "
|
|
"count=([0-9]*) on core ([0-9]*)",
|
|
"Test OK",
|
|
"Test Failed",
|
|
pexpect.TIMEOUT], timeout=10)
|
|
|
|
if index == 1:
|
|
break
|
|
|
|
if index == 2:
|
|
return -1, "Fail"
|
|
elif index == 3:
|
|
return -1, "Fail [Timeout]"
|
|
|
|
try:
|
|
id = int(child.match.groups()[1])
|
|
cnt = int(child.match.groups()[2])
|
|
lcore = int(child.match.groups()[3])
|
|
except:
|
|
return -1, "Fail [Cannot parse]"
|
|
|
|
# timer0 always expires on the same core when cnt < 20
|
|
if id == 0:
|
|
if lcore_tim0 == -1:
|
|
lcore_tim0 = lcore
|
|
elif lcore != lcore_tim0 and cnt < 20:
|
|
return -1, "Fail [lcore != lcore_tim0 (%d, %d)]" \
|
|
% (lcore, lcore_tim0)
|
|
if cnt > 21:
|
|
return -1, "Fail [tim0 cnt > 21]"
|
|
|
|
# timer1 each time expires on a different core
|
|
if id == 1:
|
|
if lcore == lcore_tim1:
|
|
return -1, "Fail [lcore == lcore_tim1 (%d, %d)]" \
|
|
% (lcore, lcore_tim1)
|
|
lcore_tim1 = lcore
|
|
if cnt > 10:
|
|
return -1, "Fail [tim1 cnt > 30]"
|
|
|
|
# timer0 always expires on the same core
|
|
if id == 2:
|
|
if lcore_tim2 == -1:
|
|
lcore_tim2 = lcore
|
|
elif lcore != lcore_tim2:
|
|
return -1, "Fail [lcore != lcore_tim2 (%d, %d)]" \
|
|
% (lcore, lcore_tim2)
|
|
if cnt > 30:
|
|
return -1, "Fail [tim2 cnt > 30]"
|
|
|
|
# timer0 always expires on the same core
|
|
if id == 3:
|
|
if lcore_tim3 == -1:
|
|
lcore_tim3 = lcore
|
|
elif lcore != lcore_tim3:
|
|
return -1, "Fail [lcore_tim3 changed (%d -> %d)]" \
|
|
% (lcore, lcore_tim3)
|
|
if cnt > 30:
|
|
return -1, "Fail [tim3 cnt > 30]"
|
|
|
|
# must be 2 different cores
|
|
if lcore_tim0 == lcore_tim3:
|
|
return -1, "Fail [lcore_tim0 (%d) == lcore_tim3 (%d)]" \
|
|
% (lcore_tim0, lcore_tim3)
|
|
|
|
return 0, "Success"
|
|
|
|
|
|
def ring_autotest(child, test_name):
|
|
child.sendline(test_name)
|
|
index = child.expect(["Test OK", "Test Failed",
|
|
pexpect.TIMEOUT], timeout=2)
|
|
if index == 1:
|
|
return -1, "Fail"
|
|
elif index == 2:
|
|
return -1, "Fail [Timeout]"
|
|
|
|
child.sendline("set_watermark test 100")
|
|
child.sendline("dump_ring test")
|
|
index = child.expect([" watermark=100",
|
|
pexpect.TIMEOUT], timeout=1)
|
|
if index != 0:
|
|
return -1, "Fail [Bad watermark]"
|
|
|
|
return 0, "Success"
|