import os import subprocess import sys import hashlib import shutil def runProcess(cmd): process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (stdout, stderr) = process.communicate() 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 "" sha1 = hashlib.sha1() f = open(path, 'r') sha1.update(f.read()) 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): print chdmanBin + " does not exist" sys.exit(1) if not os.path.exists(inputPath): print inputPath + " does not exist" sys.exit(1) if not os.path.exists(outputPath): print outputPath + " does not exist" 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"