We expect the server to exit when its communication pipes are closed. Close them and wait for the server to exit. If supported by the current version of python, kill the server if it does not exit after a few seconds.
120 lines
4.2 KiB
Python
120 lines
4.2 KiB
Python
import sys, cmakelib, json, os, shutil
|
|
|
|
debug = True
|
|
|
|
cmakeCommand = sys.argv[1]
|
|
testFile = sys.argv[2]
|
|
sourceDir = sys.argv[3]
|
|
buildDir = sys.argv[4] + "/" + os.path.splitext(os.path.basename(testFile))[0]
|
|
cmakeGenerator = sys.argv[5]
|
|
|
|
print("Test:", testFile,
|
|
"\n-- SourceDir:", sourceDir,
|
|
"\n-- BuildDir:", buildDir,
|
|
"\n-- Generator:", cmakeGenerator)
|
|
|
|
if os.path.exists(buildDir):
|
|
shutil.rmtree(buildDir)
|
|
|
|
proc = cmakelib.initProc(cmakeCommand)
|
|
|
|
with open(testFile) as f:
|
|
testData = json.loads(f.read())
|
|
|
|
for obj in testData:
|
|
if 'sendRaw' in obj:
|
|
data = obj['sendRaw']
|
|
if debug: print("Sending raw:", data)
|
|
cmakelib.writeRawData(proc, data)
|
|
elif 'send' in obj:
|
|
data = obj['send']
|
|
if debug: print("Sending:", json.dumps(data))
|
|
cmakelib.writePayload(proc, data)
|
|
elif 'recv' in obj:
|
|
data = obj['recv']
|
|
if debug: print("Waiting for:", json.dumps(data))
|
|
cmakelib.waitForMessage(proc, data)
|
|
elif 'reply' in obj:
|
|
data = obj['reply']
|
|
if debug: print("Waiting for reply:", json.dumps(data))
|
|
originalType = ""
|
|
cookie = ""
|
|
skipProgress = False;
|
|
if 'cookie' in data: cookie = data['cookie']
|
|
if 'type' in data: originalType = data['type']
|
|
if 'skipProgress' in data: skipProgress = data['skipProgress']
|
|
cmakelib.waitForReply(proc, originalType, cookie, skipProgress)
|
|
elif 'error' in obj:
|
|
data = obj['error']
|
|
if debug: print("Waiting for error:", json.dumps(data))
|
|
originalType = ""
|
|
cookie = ""
|
|
message = ""
|
|
if 'cookie' in data: cookie = data['cookie']
|
|
if 'type' in data: originalType = data['type']
|
|
if 'message' in data: message = data['message']
|
|
cmakelib.waitForError(proc, originalType, cookie, message)
|
|
elif 'progress' in obj:
|
|
data = obj['progress']
|
|
if debug: print("Waiting for progress:", json.dumps(data))
|
|
originalType = ''
|
|
cookie = ""
|
|
current = 0
|
|
message = ""
|
|
if 'cookie' in data: cookie = data['cookie']
|
|
if 'type' in data: originalType = data['type']
|
|
if 'current' in data: current = data['current']
|
|
if 'message' in data: message = data['message']
|
|
cmakelib.waitForProgress(proc, originalType, cookie, current, message)
|
|
elif 'handshake' in obj:
|
|
data = obj['handshake']
|
|
if debug: print("Doing handshake:", json.dumps(data))
|
|
major = -1
|
|
minor = -1
|
|
generator = cmakeGenerator
|
|
extraGenerator = ''
|
|
sourceDirectory = sourceDir
|
|
buildDirectory = buildDir
|
|
if 'major' in data: major = data['major']
|
|
if 'minor' in data: minor = data['minor']
|
|
if 'buildDirectory' in data: buildDirectory = data['buildDirectory']
|
|
if 'sourceDirectory' in data: sourceDirectory = data['sourceDirectory']
|
|
if 'generator' in data: generator = data['generator']
|
|
if 'extraGenerator' in data: extraGenerator = data['extraGenerator']
|
|
if not os.path.isabs(buildDirectory):
|
|
buildDirectory = buildDir + "/" + buildDirectory
|
|
if not os.path.isabs(sourceDirectory):
|
|
sourceDirectory = sourceDir + "/" + sourceDirectory
|
|
cmakelib.handshake(proc, major, minor, sourceDirectory, buildDirectory,
|
|
generator, extraGenerator)
|
|
elif 'validateGlobalSettings' in obj:
|
|
data = obj['validateGlobalSettings']
|
|
if not 'buildDirectory' in data: data['buildDirectory'] = buildDir
|
|
if not 'sourceDirectory' in data: data['sourceDirectory'] = sourceDir
|
|
if not 'generator' in data: data['generator'] = cmakeGenerator
|
|
if not 'extraGenerator' in data: data['extraGenerator'] = ''
|
|
cmakelib.validateGlobalSettings(proc, cmakeCommand, data)
|
|
elif 'message' in obj:
|
|
print("MESSAGE:", obj["message"])
|
|
else:
|
|
print("Unknown command:", json.dumps(obj))
|
|
sys.exit(2)
|
|
|
|
print("Completed")
|
|
|
|
# Tell the server to exit.
|
|
proc.stdin.close()
|
|
proc.stdout.close()
|
|
|
|
# Wait for the server to exit.
|
|
# If this version of python supports it, terminate the server after a timeout.
|
|
try:
|
|
proc.wait(timeout=5)
|
|
except TypeError:
|
|
proc.wait()
|
|
except:
|
|
proc.terminate()
|
|
raise
|
|
|
|
sys.exit(0)
|