32dcb9fd2a
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>
343 lines
9.7 KiB
Python
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"
|