mame/regtests/chdman/chdtest.py
2015-11-05 13:41:25 +01:00

237 lines
7.5 KiB
Python

import os
import subprocess
import sys
import hashlib
import shutil
def runProcess(cmd):
#print " ".join(cmd)
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = process.communicate()
if not isinstance(stdout, str): # python 3
stdout = stdout.decode('latin-1')
if not isinstance(stderr, str): # python 3
stderr = stderr.decode('latin-1')
#if stderr:
# print stderr
return process.returncode, stdout, stderr
def compareInfo(info1, info2):
lines1 = info1.splitlines()
lines2 = info2.splitlines()
if not len(lines1) == len(lines2):
return False
mismatch = False
for i in range(len(lines1)):
if lines1[i].startswith("chdman - ") and lines2[i].startswith("chdman - "):
continue
if lines1[i].startswith("Input file:") and lines2[i].startswith("Input file:"):
continue
if not lines1[i] == lines2[i]:
mismatch = True
print(lines1[i] + " - " + lines2[i])
return mismatch == False
def sha1sum(path):
if not os.path.exists(path):
return ""
f = open(path, 'rb')
try:
sha1 = hashlib.sha1()
while True:
data = f.read(8192)
if data:
sha1.update(data)
else:
break
finally:
f.close()
return sha1.hexdigest()
def extractcdAndCompare(type):
global failure
extractFileDir = os.path.join(tempFilePath, type + "_output")
if not os.path.exists(extractFileDir):
os.makedirs(extractFileDir)
extractFileBase = os.path.join(extractFileDir, "extract")
extractFile = extractFileBase + "." + type
extractFileBin = extractFileBase + ".bin"
exitcode, stdout, stderr = runProcess([chdmanBin, "extractcd", "-f", "-i", outFile, "-o", extractFile])
if not exitcode == 0:
print(d + " - extractcd (" + type + ") failed with " + str(exitcode) + " (" + stderr + ")")
failure = True
sha1_extract = sha1sum(extractFile)
sha1_extract_bin = sha1sum(extractFileBin)
extractFileDir = os.path.join(tempFilePath, type + "_temp")
if not os.path.exists(extractFileDir):
os.makedirs(extractFileDir)
extractFileBase = os.path.join(extractFileDir, "extract")
extractFile = extractFileBase + "." + type
extractFileBin = extractFileBase + ".bin"
exitcode, stdout, stderr = runProcess([chdmanBin, "extractcd", "-f", "-i", tempFile, "-o", extractFile])
if not exitcode == 0:
print(d + " - extractcd (" + type + ") failed with " + str(exitcode) + " (" + stderr + ")")
failure = True
sha1_extract_2 = sha1sum(extractFile)
sha1_extract_bin_2 = sha1sum(extractFileBin)
if not sha1_extract == sha1_extract_2:
print("expected: " + sha1_extract + " found: " + sha1_extract_2)
print(d + " - SHA1 mismatch (extractcd - " + type + " - toc)")
failure = True
if not sha1_extract_bin == sha1_extract_bin_2:
print("expected: " + sha1_extract_bin + " found: " + sha1_extract_bin_2)
print(d + " - SHA1 mismatch (extractcd - " + type + " - bin)")
failure = True
def extractAndCompare(command, ext):
global failure
extractFileDir = os.path.join(tempFilePath, ext + "_output")
if not os.path.exists(extractFileDir):
os.makedirs(extractFileDir)
extractFileBase = os.path.join(extractFileDir, "extract")
extractFile = extractFileBase + "." + ext
exitcode, stdout, stderr = runProcess([chdmanBin, command, "-f", "-i", outFile, "-o", extractFile])
if not exitcode == 0:
print(d + " - " + command + " (" + ext + ") failed with " + str(exitcode) + " (" + stderr + ")")
failure = True
sha1_extract = sha1sum(extractFile)
extractFileDir = os.path.join(tempFilePath, ext + "_temp")
if not os.path.exists(extractFileDir):
os.makedirs(extractFileDir)
extractFileBase = os.path.join(extractFileDir, "extract")
extractFile = extractFileBase + "." + ext
exitcode, stdout, stderr = runProcess([chdmanBin, command, "-f", "-i", tempFile, "-o", extractFile])
if not exitcode == 0:
print(d + " - " + command + " (" + ext + ") failed with " + str(exitcode) + " (" + stderr + ")")
failure = True
sha1_extract_2 = sha1sum(extractFile)
if not sha1_extract == sha1_extract_2:
print("expected: " + sha1_extract + " found: " + sha1_extract_2)
print(d + " - SHA1 mismatch (" + command + " - " + ext + ")")
failure = True
currentDirectory = os.path.dirname(os.path.realpath(__file__))
inputPath = os.path.join(currentDirectory, 'input')
outputPath = os.path.join(currentDirectory, "output")
tempPath = os.path.join(currentDirectory, "temp")
if os.name == 'nt':
chdmanBin = os.path.normpath(os.path.join(currentDirectory, "..", "..", "chdman.exe"))
else:
chdmanBin = os.path.normpath(os.path.join(currentDirectory, "..", "..", "chdman"))
if not os.path.exists(chdmanBin):
sys.stderr.write(chdmanBin + " does not exist\n")
sys.exit(1)
if not os.path.exists(inputPath):
sys.stderr.write(inputPath + " does not exist\n")
sys.exit(1)
if not os.path.exists(outputPath):
sys.stderr.write(outputPath + " does not exist\n")
sys.exit(1)
if os.path.exists(tempPath):
shutil.rmtree(tempPath)
failure = False
for root, dirs, files in os.walk(inputPath):
for d in dirs:
if d.startswith("."):
continue
command = ext = d.split("_", 2)[0]
inFile = os.path.join(root, d, "in")
# TODO: make this better
outFile = os.path.join(root, d, "out.chd").replace("input", "output")
tempFilePath = os.path.join(tempPath, d)
tempFile = os.path.join(tempFilePath, "out.chd")
inParams = inFile + ".params"
params = []
if os.path.exists(inParams):
f = open(inParams, 'r')
paramsstr = f.read()
f.close()
params = paramsstr.split(" ")
if not os.path.exists(tempFilePath):
os.makedirs(tempFilePath)
if command == "createcd":
ext = d.split("_", 2)[1]
inFile += "." + ext
elif command == "createhd":
ext = d.split("_", 2)[1]
inFile += "." + ext
elif command == "createld":
ext = d.split("_", 2)[1]
inFile += "." + ext
elif command == "copy":
inFile += ".chd"
else:
print("unsupported mode '%s'" % command)
continue
if os.path.exists(inFile):
cmd = [chdmanBin, command, "-f", "-i", inFile, "-o", tempFile] + params
else:
cmd = [chdmanBin, command, "-f", "-o", tempFile] + params
exitcode, stdout, stderr = runProcess(cmd)
if not exitcode == 0:
print(d + " - command failed with " + str(exitcode) + " (" + stderr + ")")
failure = True
# verify
exitcode, stdout, stderr = runProcess([chdmanBin, "verify", "-i", tempFile])
if not exitcode == 0:
print(d + " - verify failed with " + str(exitcode) + " (" + stderr + ")")
failure = True
# compare info
# TODO: store expected output of reference file as well and compare
exitcode, info1, stderr = runProcess([chdmanBin, "info", "-v", "-i", tempFile])
if not exitcode == 0:
print(d + " - info (temp) failed with " + str(exitcode) + " (" + stderr + ")")
failure = True
exitcode, info2, stderr = runProcess([chdmanBin, "info", "-v", "-i", outFile])
if not exitcode == 0:
print(d + " - info (output) failed with " + str(exitcode) + " (" + stderr + ")")
failure = True
if not compareInfo(info1, info2):
print(d + " - info output differs")
failure = True
# extract and compare
if command == "createcd":
extractcdAndCompare("toc")
extractcdAndCompare("cue")
elif command == "createhd":
extractAndCompare("extracthd", "raw")
elif command == "createld":
extractAndCompare("extractld", "avi")
# TODO: add extraction for "copy" as well
# compare SHA1 of output files
sha1_out = sha1sum(outFile)
sha1_temp = sha1sum(tempFile)
if not sha1_out == sha1_temp:
print("expected: " + sha1_out + " found: " + sha1_temp)
print(d + " - SHA1 mismatch (output file)")
failure = True
if not failure:
print("All tests finished successfully")