ppsspp/test.py

373 lines
9.3 KiB
Python
Raw Normal View History

2012-12-15 10:27:40 +00:00
#!/usr/bin/env python
# Automated script to run the pspautotests test suite in PPSSPP.
import sys
import os
import subprocess
2012-11-18 21:35:08 +00:00
import threading
import glob
PPSSPP_EXECUTABLES = [
# Windows
"Windows\\Debug\\PPSSPPHeadless.exe",
"Windows\\Release\\PPSSPPHeadless.exe",
"Windows\\x64\\Debug\\PPSSPPHeadless.exe",
"Windows\\x64\\Release\\PPSSPPHeadless.exe",
# Mac
"build*/Debug/PPSSPPHeadless",
"build*/Release/PPSSPPHeadless",
"build*/RelWithDebInfo/PPSSPPHeadless",
"build*/MinSizeRel/PPSSPPHeadless",
# Linux
"build*/PPSSPPHeadless",
"./PPSSPPHeadless"
]
PPSSPP_EXE = None
TEST_ROOT = "pspautotests/tests/"
teamcity_mode = False
2012-11-18 21:35:08 +00:00
TIMEOUT = 5
class Command(object):
def __init__(self, cmd, data = None):
2012-11-18 21:35:08 +00:00
self.cmd = cmd
self.data = data
2012-11-18 21:35:08 +00:00
self.process = None
self.output = None
self.timeout = False
def run(self, timeout):
def target():
2013-09-18 06:28:48 +00:00
self.process = subprocess.Popen(self.cmd, bufsize=1, stdin=subprocess.PIPE, stdout=sys.stdout, stderr=subprocess.STDOUT)
self.process.stdin.write(self.data)
self.process.stdin.close()
self.process.communicate()
2012-11-18 21:35:08 +00:00
thread = threading.Thread(target=target)
thread.start()
thread.join(timeout)
2013-03-24 05:49:01 +00:00
if thread.isAlive():
2012-11-18 21:35:08 +00:00
self.timeout = True
if sys.version_info < (2, 6):
os.kill(self.process.pid, signal.SIGKILL)
else:
self.process.terminate()
2012-11-18 21:35:08 +00:00
thread.join()
# Test names are the C files without the .c extension.
# These have worked and should keep working always - regression tests.
tests_good = [
"cpu/cpu_alu/cpu_alu",
2013-03-17 18:24:35 +00:00
"cpu/vfpu/vector",
"cpu/vfpu/matrix",
"cpu/vfpu/convert",
2013-03-16 09:39:54 +00:00
"cpu/vfpu/prefixes",
2013-03-17 18:24:35 +00:00
"cpu/vfpu/colors",
"cpu/vfpu/gum",
"cpu/icache/icache",
"cpu/lsu/lsu",
2012-11-09 10:20:39 +00:00
"cpu/fpu/fpu",
2012-11-09 10:33:22 +00:00
2013-08-19 02:04:21 +00:00
"audio/atrac/ids",
"audio/atrac/setdata",
2013-09-02 00:01:48 +00:00
"audio/mp3/mp3test",
"audio/sascore/sascore",
2012-12-03 01:19:57 +00:00
"ctrl/ctrl",
2012-12-23 05:28:01 +00:00
"ctrl/idle/idle",
2012-12-03 01:19:57 +00:00
"ctrl/sampling/sampling",
2012-12-23 05:28:01 +00:00
"ctrl/sampling2/sampling2",
2012-11-09 10:33:22 +00:00
"display/display",
"display/vblankmulti",
2012-11-09 10:33:22 +00:00
"dmac/dmactest",
"gpu/callbacks/ge_callbacks",
2013-09-24 07:58:17 +00:00
"gpu/ge/edram",
"gpu/ge/context",
"gpu/ge/queue",
2013-09-04 05:30:47 +00:00
"hash/hash",
2013-05-11 18:54:43 +00:00
"hle/check_not_used_uids",
2012-11-09 10:33:22 +00:00
"intr/intr",
2013-11-17 18:21:06 +00:00
"intr/suspended",
2012-11-09 10:33:22 +00:00
"intr/vblank/vblank",
2013-05-11 18:54:43 +00:00
"io/cwd/cwd",
"loader/bss/bss",
"malloc/malloc",
2012-11-09 10:33:22 +00:00
"misc/testgp",
2013-01-06 01:24:47 +00:00
"misc/libc",
2013-11-17 18:21:06 +00:00
"misc/deadbeef",
2013-01-06 01:24:47 +00:00
"misc/dcache",
2013-11-17 18:21:06 +00:00
"misc/timeconv",
2013-02-24 03:31:03 +00:00
"mstick/mstick",
"rtc/rtc",
2012-11-09 10:33:22 +00:00
"string/string",
2013-08-19 02:04:21 +00:00
"sysmem/freesize",
"sysmem/sysmem",
2012-12-21 08:23:55 +00:00
"threads/alarm/alarm",
2012-12-21 20:38:12 +00:00
"threads/alarm/cancel/cancel",
"threads/alarm/refer/refer",
"threads/alarm/set/set",
2013-02-24 03:31:03 +00:00
"threads/callbacks/callbacks",
"threads/callbacks/check",
"threads/callbacks/create",
"threads/callbacks/delete",
"threads/callbacks/refer",
"threads/events/events",
"threads/events/cancel/cancel",
"threads/events/clear/clear",
"threads/events/create/create",
"threads/events/delete/delete",
"threads/events/poll/poll",
"threads/events/refer/refer",
"threads/events/set/set",
"threads/events/wait/wait",
2013-08-27 06:20:03 +00:00
"threads/fpl/fpl",
"threads/fpl/allocate",
"threads/fpl/cancel",
"threads/fpl/create",
"threads/fpl/delete",
"threads/fpl/free",
"threads/fpl/priority",
"threads/fpl/tryallocate",
"threads/k0/k0",
2013-02-25 06:51:55 +00:00
"threads/lwmutex/create",
"threads/lwmutex/delete",
"threads/lwmutex/lock",
"threads/lwmutex/priority",
"threads/lwmutex/refer",
"threads/lwmutex/try",
"threads/lwmutex/try600",
"threads/lwmutex/unlock",
"threads/mbx/mbx",
2012-12-17 07:01:43 +00:00
"threads/mbx/cancel/cancel",
"threads/mbx/create/create",
"threads/mbx/delete/delete",
"threads/mbx/poll/poll",
"threads/mbx/priority/priority",
"threads/mbx/receive/receive",
"threads/mbx/refer/refer",
"threads/mbx/send/send",
2013-08-19 02:04:21 +00:00
"threads/msgpipe/msgpipe",
"threads/msgpipe/cancel",
"threads/msgpipe/create",
"threads/msgpipe/data",
"threads/msgpipe/delete",
"threads/msgpipe/receive",
"threads/msgpipe/refer",
"threads/msgpipe/send",
"threads/msgpipe/tryreceive",
"threads/msgpipe/trysend",
2013-08-27 06:20:03 +00:00
"threads/mutex/cancel",
2013-02-25 06:51:55 +00:00
"threads/mutex/create",
"threads/mutex/delete",
"threads/mutex/lock",
"threads/mutex/mutex",
2013-02-25 06:51:55 +00:00
"threads/mutex/priority",
"threads/mutex/refer",
"threads/mutex/try",
"threads/mutex/unlock",
"threads/semaphores/semaphores",
2013-05-19 00:35:36 +00:00
"threads/semaphores/cancel",
"threads/semaphores/create",
"threads/semaphores/delete",
"threads/semaphores/poll",
"threads/semaphores/priority",
"threads/semaphores/refer",
"threads/semaphores/signal",
"threads/semaphores/wait",
"threads/threads/change",
2013-05-19 00:35:36 +00:00
"threads/threads/extend",
"threads/threads/refer",
2013-02-24 03:31:03 +00:00
"threads/threads/release",
"threads/threads/rotate",
"threads/threads/stackfree",
2013-10-25 04:39:52 +00:00
"threads/threads/start",
2013-08-19 02:04:21 +00:00
"threads/threads/suspend",
2013-02-24 03:31:03 +00:00
"threads/threads/threadend",
"threads/threads/threads",
2013-05-11 18:54:43 +00:00
"threads/wakeup/wakeup",
"threads/vpl/allocate",
2013-02-24 03:31:03 +00:00
"threads/vpl/cancel",
2013-02-09 09:19:02 +00:00
"threads/vpl/delete",
"threads/vpl/free",
"threads/vpl/priority",
"threads/vpl/refer",
"threads/vpl/try",
2013-02-24 03:31:03 +00:00
"threads/vpl/vpl",
2013-10-25 04:39:52 +00:00
"threads/vtimers/vtimer",
"threads/vtimers/cancelhandler",
"threads/vtimers/create",
"threads/vtimers/delete",
"threads/vtimers/getbase",
"threads/vtimers/gettime",
"threads/vtimers/interrupt",
"threads/vtimers/refer",
"threads/vtimers/settime",
"threads/vtimers/start",
"threads/vtimers/stop",
2013-10-14 07:48:29 +00:00
"utility/savedata/autosave",
2013-08-19 02:04:21 +00:00
"utility/savedata/filelist",
2013-10-14 07:48:29 +00:00
"utility/savedata/makedata",
2013-04-20 16:39:12 +00:00
"utility/systemparam/systemparam",
2012-11-11 18:30:48 +00:00
"power/power",
2013-08-27 06:20:03 +00:00
"power/volatile/lock",
"power/volatile/trylock",
"power/volatile/unlock",
2012-11-11 21:38:19 +00:00
"umd/callbacks/umd",
"umd/wait/wait",
"io/directory/directory",
2012-11-12 13:35:10 +00:00
]
2012-11-12 13:35:10 +00:00
tests_next = [
2013-02-24 03:31:03 +00:00
# These are the next tests up for fixing. These run by default.
2013-11-17 18:21:06 +00:00
"cpu/cpu_alu/cpu_branch",
"cpu/fpu/fcr",
2013-02-24 03:31:03 +00:00
"audio/atrac/atractest",
"audio/atrac/decode",
2013-09-24 07:58:17 +00:00
"audio/atrac/resetting",
2013-08-27 06:20:03 +00:00
"audio/sceaudio/datalen",
"audio/sceaudio/output",
"audio/sceaudio/reserve",
2013-11-17 18:21:06 +00:00
"ctrl/vblank",
2013-09-04 05:30:47 +00:00
"display/hcount",
2013-11-17 18:21:06 +00:00
"intr/waits",
"threads/callbacks/cancel",
"threads/callbacks/count",
"threads/callbacks/notify",
2013-05-11 18:54:43 +00:00
"threads/scheduling/dispatch",
2012-11-12 13:35:10 +00:00
"threads/scheduling/scheduling",
2013-02-24 03:31:03 +00:00
"threads/threads/create",
2013-08-19 02:04:21 +00:00
"threads/threads/terminate",
2013-10-25 04:39:52 +00:00
"threads/vtimers/sethandler",
2013-02-09 09:19:02 +00:00
"threads/vpl/create",
2013-08-19 02:04:21 +00:00
"utility/savedata/getsize",
"utility/savedata/idlist",
"utility/savedata/sizes",
2013-02-24 03:31:03 +00:00
"gpu/commands/basic",
2013-05-11 18:54:43 +00:00
"gpu/commands/material",
2013-02-24 03:31:03 +00:00
"gpu/complex/complex",
"gpu/displaylist/state",
2013-09-24 07:58:17 +00:00
"gpu/ge/get",
"gpu/ge/break",
2013-02-24 03:31:03 +00:00
"gpu/reflection/reflection",
"gpu/rendertarget/rendertarget",
"gpu/signals/jumps",
"gpu/signals/simple",
"gpu/simple/simple",
"gpu/triangle/triangle",
"font/fonttest",
2013-02-24 03:31:03 +00:00
"io/file/file",
2013-08-19 02:04:21 +00:00
"io/file/rename",
2012-11-09 10:33:22 +00:00
"io/io/io",
"io/iodrv/iodrv",
"modules/loadexec/loader",
"rtc/arithmetic",
"rtc/convert",
"rtc/lookup",
2013-02-28 06:54:41 +00:00
"sysmem/partition",
2012-11-09 10:33:22 +00:00
"umd/io/umd_io",
2012-11-30 20:50:52 +00:00
"umd/raw_access/raw_access",
2013-08-19 02:04:21 +00:00
"video/mpeg/basic",
2012-11-30 20:50:52 +00:00
"video/pmf/pmf",
"video/pmf_simple/pmf_simple",
2013-08-19 02:04:21 +00:00
"video/psmfplayer/basic",
]
2012-11-11 17:44:20 +00:00
# These don't even run (or run correctly) on the real PSP
test_broken = [
]
# These are the tests we ignore (not important, or impossible to run)
tests_ignored = [
2012-11-09 10:33:22 +00:00
"kirk/kirk",
"me/me",
2012-11-09 11:32:35 +00:00
"umd/umd", # mostly fixed but output seems broken? (first retval of unregister...)
]
def init():
global PPSSPP_EXE, TEST_ROOT
if not os.path.exists("pspautotests"):
if os.path.exists(os.path.dirname(__file__) + "/pspautotests"):
TEST_ROOT = os.path.dirname(__file__) + "/pspautotests/tests/";
else:
print("Please run git submodule init; git submodule update;")
sys.exit(1)
if not os.path.exists(TEST_ROOT + "cpu/cpu_alu/cpu_alu.prx"):
2012-12-15 10:27:40 +00:00
print("Please install the pspsdk and run make in common/ and in all the tests")
print("(checked for existence of cpu/cpu_alu/cpu_alu.prx)")
sys.exit(1)
possible_exes = [glob.glob(f) for f in PPSSPP_EXECUTABLES]
possible_exes = [x for sublist in possible_exes for x in sublist]
existing = filter(os.path.exists, possible_exes)
if existing:
PPSSPP_EXE = max((os.path.getmtime(f), f) for f in existing)[1]
else:
PPSSPP_EXE = None
if not PPSSPP_EXE:
2012-12-15 10:27:40 +00:00
print("PPSSPP executable missing, please build one.")
sys.exit(1)
def tcprint(arg):
global teamcity_mode
if teamcity_mode:
2012-12-15 10:27:40 +00:00
print(arg)
def run_tests(test_list, args):
2012-11-18 21:35:08 +00:00
global PPSSPP_EXE, TIMEOUT
2012-11-09 10:03:01 +00:00
tests_passed = []
tests_failed = []
2012-12-15 10:27:40 +00:00
test_filenames = []
for test in test_list:
# Try prx first
elf_filename = TEST_ROOT + test + ".prx"
if not os.path.exists(elf_filename):
2012-12-15 10:27:40 +00:00
print("WARNING: no prx, trying elf")
elf_filename = TEST_ROOT + test + ".elf"
test_filenames.append(elf_filename)
if len(test_filenames):
# TODO: Maybe --compare should detect --graphics?
cmdline = [PPSSPP_EXE, '--compare', '--timeout=' + str(TIMEOUT), '@-']
cmdline.extend([i for i in args if i not in ['-g', '-m']])
2012-11-18 21:35:08 +00:00
c = Command(cmdline, '\n'.join(test_filenames))
c.run(TIMEOUT * len(test_filenames))
print("Ran " + PPSSPP_EXE)
def main():
global teamcity_mode
init()
tests = []
args = []
for arg in sys.argv[1:]:
if arg == '--teamcity':
teamcity_mode = True
args.append(arg)
elif arg[0] == '-':
args.append(arg)
else:
tests.append(arg)
if not tests:
2012-11-12 13:35:10 +00:00
if '-g' in args:
tests = tests_good
else:
tests = tests_next + tests_good
elif '-m' in args:
tests = [i for i in tests_next + tests_good if i.startswith(tests[0])]
run_tests(tests, args)
main()