summaryrefslogtreecommitdiffstatshomepage
path: root/regtests/chdman/chdtest.py
diff options
context:
space:
mode:
Diffstat (limited to 'regtests/chdman/chdtest.py')
-rw-r--r--regtests/chdman/chdtest.py237
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")