diff options
Diffstat (limited to 'regtests/chdman/chdtest.py')
-rw-r--r-- | regtests/chdman/chdtest.py | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/regtests/chdman/chdtest.py b/regtests/chdman/chdtest.py new file mode 100644 index 00000000000..4b13c176cf9 --- /dev/null +++ b/regtests/chdman/chdtest.py @@ -0,0 +1,237 @@ +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") |