numam-dpdk/app/test/autotest_test_funcs.py
Phil Yang 32dcb9fd2a test/mcslock: add MCS queued lock unit test
Unit test and perf test for MCS queued lock.

Signed-off-by: Phil Yang <phil.yang@arm.com>
Reviewed-by: Gavin Hu <gavin.hu@arm.com>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
2019-07-08 10:57:14 +02:00

343 lines
9.7 KiB
Python

# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2010-2014 Intel Corporation
# 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):
lines = 0
error = ''
child.sendline(test_name)
while True:
regexp = "IOVA:0x[0-9a-f]*, len:([0-9]*), virt:0x[0-9a-f]*, " \
"socket_id:[0-9]*"
index = child.expect([regexp, "Test OK", "Test Failed",
pexpect.TIMEOUT], timeout=10)
if index == 3:
return -1, "Fail [Timeout]"
elif index == 1:
break
elif index == 2:
return -1, "Fail"
else:
lines = lines + 1
size = int(child.match.groups()[0], 10)
if size <= 0:
error = 'Bad size'
if lines <= 0:
return -1, "Fail [No entries]"
if error != '':
return -1, "Fail [{}]".format(error)
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 ticketlock_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 mcslock_autotest(child, test_name):
i = 0
ir = 0
child.sendline(test_name)
while True:
index = child.expect(["Test OK",
"Test Failed",
"lcore ([0-9]*) state: ([0-1])"
"MCS lock taken on core ([0-9]*)",
"MCS lock released on core ([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 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]"
return 0, "Success"