diff options
Diffstat (limited to 'config/TestUtil.py')
-rwxr-xr-x | config/TestUtil.py | 933 |
1 files changed, 933 insertions, 0 deletions
diff --git a/config/TestUtil.py b/config/TestUtil.py new file mode 100755 index 00000000000..f44ec614738 --- /dev/null +++ b/config/TestUtil.py @@ -0,0 +1,933 @@ +#!/usr/bin/env python +# ********************************************************************** +# +# Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved. +# +# This copy of Ice is licensed to you under the terms described in the +# ICE_LICENSE file included in this distribution. +# +# ********************************************************************** + +# +# TestUtil global flags section! +# +# You can modify the following variables to control which tests are run +# by default. Command line options provided at runtime will override +# these values. +# +protocol = "" # If unset, default to TCP. Valid values are "tcp" or "ssl". +compress = 0 # Set to 1 to enable bzip2 compression. +threadPerConnection = 0 # Set to 1 to have tests use thread per connection concurrency model. +host = "127.0.0.1" # Default to loopback. +debug = 0 # Set to 1 to enable test suite debugging. +mono = 0 # Set to 1 to use Mono as the default .NET CLR. + +javaCmd = "java" # Default java loader +phpCmd = "php" # Name of default php binary (usually php or php5) + +################################################################################ +# +# End of global flags section. Do not edit beyond this point. +# +################################################################################ + +# +# This is set by the choice of init method. If not set, before it is +# used, it indicates a bug and things should terminate. +# +defaultMapping = None + +import sys, os, re, errno, getopt, time, StringIO +from threading import Thread + +def configurePaths(): + toplevel = findTopLevel() + + if isWin32(): + os.environ["PATH"] = os.path.join(toplevel, "cpp", "bin") + os.pathsep + os.getenv("PATH", "") + elif isHpUx(): + os.environ["SHLIB_PATH"] = os.path.join(toplevel, "cpp", "lib") + os.pathsep + os.getenv("SHLIB_PATH", "") + elif isDarwin(): + os.environ["DYLD_LIBRARY_PATH"] = os.path.join(toplevel, "cpp", "lib") + os.pathsep + os.getenv("DYLD_LIBRARY_PATH", "") + os.environ["DYLD_BIND_AT_LAUNCH"] = "1" + elif isAIX(): + os.environ["LIBPATH"] = os.path.join(toplevel, "cpp", "lib") + os.pathsep + os.getenv("LIBPATH", "") + else: + os.environ["LD_LIBRARY_PATH"] = os.path.join(toplevel, "cpp", "lib") + os.pathsep + os.getenv("LD_LIBRARY_PATH", "") + os.environ["LD_LIBRARY_PATH_64"] = os.path.join(toplevel, "cpp", "lib") + os.pathsep + os.getenv("LD_LIBRARY_PATH_64", "") + + os.environ["CLASSPATH"] = os.path.join(toplevel, "java", "lib", "Ice.jar") + os.pathsep + os.getenv("CLASSPATH", "") + os.environ["CLASSPATH"] = os.path.join(toplevel, "java", "lib") + os.pathsep + os.getenv("CLASSPATH", "") + +def addLdPath(libpath): + if isWin32(): + os.environ["PATH"] = libpath + os.pathsep + os.getenv("PATH", "") + elif isHpUx(): + os.environ["SHLIB_PATH"] = libpath + os.pathsep + os.getenv("SHLIB_PATH", "") + elif isDarwin(): + os.environ["DYLD_LIBRARY_PATH"] = libpath + os.pathsep + os.getenv("DYLD_LIBRARY_PATH", "") + elif isAIX(): + os.environ["LIBPATH"] = libpath + os.pathsep + os.getenv("LIBPATH", "") + else: + os.environ["LD_LIBRARY_PATH"] = libpath + os.pathsep + os.getenv("LD_LIBRARY_PATH", "") + os.environ["LD_LIBRARY_PATH_64"] = libpath + os.pathsep + os.getenv("LD_LIBRARY_PATH_64", "") + +def isCygwin(): + # The substring on sys.platform is required because some cygwin + # versions return variations like "cygwin_nt-4.01". + return sys.platform[:6] == "cygwin" + +def isWin32(): + return sys.platform == "win32" or isCygwin() + +def isVista(): + return isWin32() and sys.getwindowsversion()[0] == 6 + +def isWin9x(): + if isWin32(): + return not (os.environ.has_key("OS") and os.environ["OS"] == "Windows_NT") + else: + return 0 + +def isSolaris(): + return sys.platform == "sunos5" + +def isHpUx(): + return sys.platform == "hp-ux11" + +def isAIX(): + return sys.platform in ['aix4', 'aix5'] + +def isDarwin(): + return sys.platform == "darwin" + +usageMessage = "usage: " + sys.argv[0] + """ + --all Run all permutations of the tests." + --start=<regex> Start running the tests at the given test." + --start-after=<regex> Start running the tests after the given test. + --loop Run the tests in a loop. + --filter=<regex> Run all the tests that match the given regex. + --rfilter=<regex> Run all the tests that do not match the given regex. + --debug Display debugging information on each test. + --protocol=tcp|ssl Run with the given protocol. + --compress Run the tests with protocol compression. + --host=host Set --Ice.Default.Host=<host>. + --threadPerConnection Run with thread-per-connection concurrency model. +""" + +def usage(): + global usageMessage + print usageMessage + sys.exit(2) + + +validShortArgs = "lr:R:" +validLongArgs = ["start=", "start-after=", "filter=", "rfilter=", "all", "loop", "debug", "protocol=", + "compress", "host=", "threadPerConnection"] + +try: + opts, args = getopt.getopt(sys.argv[1:], validShortArgs, validLongArgs) +except getopt.GetoptError: + usage() + +for o, a in opts: + if o == "--debug": + debug = 1 + if o == "--protocol": + if a not in ( "tcp", "ssl"): + usage() + protocol = a + if o in ["-m", "--mono"]: + mono = 1 + if o == "--compress": + compress = 1 + if o == "--threadPerConnection": + threadPerConnection = 1 + if o == "--host": + host = a + +if not isWin32(): + mono = 1 + +toplevel = None + +def findTopLevel(): + global toplevel + + if toplevel != None: + return toplevel + + for toplevel in [".", "..", "../..", "../../..", "../../../..", "../../../../.."]: + toplevel = os.path.abspath(toplevel) + if os.path.exists(os.path.join(toplevel, "config", "TestUtil.py")): + break + else: + toplevel = None + raise "can't find toplevel directory!" + + return toplevel + +findTopLevel() +configurePaths() +serverPids = [] +serverThreads = [] +allServerThreads = [] + +phpExtensionDir = None +phpExtension = None + +if isWin32(): + phpExtensionDir = os.path.abspath(os.path.join(findTopLevel(), "php", "bin")) + phpExtension = "php_ice.dll" + # + # TODO: When we no longer support PHP 5.1.x, we can do the following: + # + #phpCmd = "php -d extension_dir=\"" + os.path.abspath(os.path.join(toplevel, "bin")) + "\" -d extension=php_ice.dll" +else: + if not isDarwin(): + cwd = os.getcwd() + os.chdir(os.environ["HOME"]) + os.chdir(cwd) + p = os.popen("php -v 2>/dev/null") + l = p.readlines() + if p.close() != None: + phpCmd = "php5" + + phpExtensionDir = os.path.abspath(os.path.join(findTopLevel(), "php", "lib")) + phpExtension = "IcePHP.so" + # + # TODO: When we no longer support PHP 5.1.x, we can do the following: + # + #phpCmd = "php -d extension_dir=\"" + os.path.abspath(os.path.join(toplevel, "lib")) + "\" -d extension=IcePHP.so" + +def getIceSoVersion(): + + config = open(os.path.join(findTopLevel(), "cpp", "include", "IceUtil", "Config.h"), "r") + intVersion = int(re.search("ICE_INT_VERSION ([0-9]*)", config.read()).group(1)) + majorVersion = intVersion / 10000 + minorVersion = intVersion / 100 - 100 * majorVersion + patchVersion = intVersion % 100 + if patchVersion > 50: + if patchVersion >= 52: + return '%db%d' % (majorVersion * 10 + minorVersion, patchVersion - 50) + else: + return '%db' % (majorVersion * 10 + minorVersion) + else: + return '%d' % (majorVersion * 10 + minorVersion) + +def getIceSSLVersion(): + javaPipeIn, javaPipeOut = os.popen4("java IceSSL.Util") + if not javaPipeIn or not javaPipeOut: + print "unable to get IceSSL version!" + sys.exit(1) + version = javaPipeOut.readline() + if not version: + print "unable to get IceSSL version!" + sys.exit(1) + javaPipeIn.close() + javaPipeOut.close() + return version.strip() + +def getJdkVersion(): + javaPipeIn, javaPipeOut = os.popen4("java -version") + if not javaPipeIn or not javaPipeOut: + print "unable to get Java version!" + sys.exit(1) + version = javaPipeOut.readline() + if not version: + print "unable to get Java version!" + sys.exit(1) + javaPipeIn.close() + javaPipeOut.close() + return version + +def closePipe(pipe): + try: + status = pipe.close() + except IOError, ex: + # TODO: There's a waitpid problem on CentOS, so we have to ignore ECHILD. + if ex.errno == errno.ECHILD: + status = 0 + # This happens with the test/IceGrid/simple test on AIX, and the + # C# fault tolerance test. + elif ex.errno == 0: + status = 0 + else: + raise + return status + +class ReaderThread(Thread): + def __init__(self, pipe): + self.pipe = pipe + Thread.__init__(self) + + def run(self): + + try: + while 1: + line = self.pipe.readline() + if not line: break + # Suppress "adapter ready" messages. Under windows the eol isn't \n. + if not line.endswith(" ready\n") and not line.endswith(" ready\r\n"): + sys.stdout.flush() + print line, + except IOError: + pass + + self.status = closePipe(self.pipe) + + def getPipe(self): + return self.pipe + + def getStatus(self): + return self.status + +def joinServers(): + global serverThreads + global allServerThreads + for t in serverThreads: + t.join() + allServerThreads.append(t) + serverThreads = [] + +# This joins with all servers and if any of them failed then +# it returns the failure status. +def serverStatus(): + global allServerThreads + joinServers() + for t in allServerThreads: + status = t.getStatus() + if status: + print "server ", str(t), " status: ", str(status) + return status + return 0 + +# This joins with a specific server (the one started with the given pipe) +# returns its exit status. If the server cannot be found an exception +# is raised. +def specificServerStatus(pipe, timeout = None): + global serverThreads + for t in serverThreads: + if t.getPipe() == pipe: + serverThreads.remove(t) + if isWin32() and timeout != None: + # + # BUGFIX: On Windows x64 with python 2.5 join with + # a timeout doesn't work (it hangs for the duration + # of the timeout if the thread is alive at the time + # of the join call). + # + while timeout >= 0 and t.isAlive(): + time.sleep(1) + timeout -= 1 + if not t.isAlive(): + t.join() + else: + t.join(timeout) + if t.isAlive(): + raise "server with pipe " + str(pipe) + " did not exit within the timeout period." + status = t.getStatus() + return status + raise "can't find server with pipe: " + str(pipe) + +def killServers(): + global serverPids + global serverThreads + + for pid in serverPids: + + if isWin32(): + try: + import win32api + handle = win32api.OpenProcess(1, 0, pid) + win32api.TerminateProcess(handle, 0) + except ImportError, ex: + print "Sorry: you must install the win32all package for killServers to work." + return + except: + pass # Ignore errors, such as non-existing processes. + else: + try: + os.kill(pid, 9) + except: + pass # Ignore errors, such as non-existing processes. + + serverPids = [] + + # + # Now join with all the threads + # + joinServers() + +def getServerPid(pipe): + global serverPids + global serverThreads + + output = ignorePid(pipe) + + try: + serverPids.append(int(output)) + except ValueError: + print "Output is not a PID: " + output + raise + +def ignorePid(pipe): + while 1: + output = pipe.readline().strip() + if not output: + print "failed!" + killServers() + sys.exit(1) + if output.startswith("warning: "): + continue + return output + +def getAdapterReady(pipe, createThread = True, count = 1): + global serverThreads + + while count > 0: + output = pipe.readline().strip() + count = count - 1 + + if not output: + print "failed!" + killServers() + sys.exit(1) + + # Start a thread for this server. + if createThread: + serverThread = ReaderThread(pipe) + serverThread.start() + serverThreads.append(serverThread) + +def getIceBox(testdir): + + # + # Get and return the path of the IceBox executable + # + + iceBox = "" + if isWin32(): + # + # Read the build.txt file from the test directory to figure out + # how the IceBox service was built ("debug" vs. "release") and + # decide which icebox executable to use. + # + build = open(os.path.join(testdir, "build.txt"), "r") + type = build.read().strip() + if type == "debug": + iceBox = os.path.join(getBinDir(testdir), "iceboxd.exe") + elif type == "release": + iceBox = os.path.join(getBinDir(testdir), "icebox.exe") + else: + iceBox = os.path.join(getBinDir(testdir), "icebox") + + if iceBox == "" or not os.path.exists(iceBox): + print "couldn't find icebox executable to run the test" + sys.exit(0) + + return iceBox; + +def waitServiceReady(pipe, token, createThread = True): + global serverThreads + + while 1: + output = pipe.readline().strip() + if not output: + print "failed!" + sys.exit(1) + if output == token + " ready": + break + + # Start a thread for this server. + if createThread: + serverThread = ReaderThread(pipe) + serverThread.start() + serverThreads.append(serverThread) + +def printOutputFromPipe(pipe): + while 1: + c = pipe.read(1) + if c == "": + break + os.write(1, c) + +def commonInit(): + configurePaths() + +def javaInit(): + commonInit() + pass + +def cppInit(): + commonInit() + pass + +def pythonInit(): + commonInit() + pass + +def rubyInit(): + commonInit() + pass + +def dotnetInit(): + global usageMessage + usageMessage = usageMessage + " -m|--mono" + + global validShortArgs + validShortArgs = "m" + + global validLongArgs + validLongArgs.append("mono") + + commonInit() + +def phpInit(): + pass + +class InvalidSelectorString(Exception): + def __init__(self, value): + self.value = value + def __str__(self): + return repr(self.value) + +sslConfigTree = { + "cpp" : { + "plugin" : " --Ice.Plugin.IceSSL=IceSSL:createIceSSL --Ice.Default.Protocol=ssl --IceSSL.DefaultDir=%(certsdir)s " + + "--IceSSL.CertAuthFile=cacert.pem", + "client" : " --IceSSL.CertFile=c_rsa1024_pub.pem --IceSSL.KeyFile=c_rsa1024_priv.pem", + "server" : " --IceSSL.CertFile=s_rsa1024_pub.pem --IceSSL.KeyFile=s_rsa1024_priv.pem", + "colloc" : " --IceSSL.CertFile=c_rsa1024_pub.pem --IceSSL.KeyFile=c_rsa1024_priv.pem" + }, + "rb" : { + "plugin" : " --Ice.Plugin.IceSSL=IceSSL:createIceSSL --Ice.Default.Protocol=ssl --IceSSL.DefaultDir=%(certsdir)s " + + "--IceSSL.CertAuthFile=cacert.pem", + "client" : " --IceSSL.CertFile=c_rsa1024_pub.pem --IceSSL.KeyFile=c_rsa1024_priv.pem", + "server" : " --IceSSL.CertFile=s_rsa1024_pub.pem --IceSSL.KeyFile=s_rsa1024_priv.pem", + "colloc" : " --IceSSL.CertFile=c_rsa1024_pub.pem --IceSSL.KeyFile=c_rsa1024_priv.pem" + }, + "java" : { + "plugin" : " --Ice.Plugin.IceSSL=IceSSL.PluginFactory --Ice.Default.Protocol=ssl --IceSSL.DefaultDir=%(certsdir)s " + + " --IceSSL.Truststore=certs.jks --IceSSL.Password=password", + "client" : " --IceSSL.Keystore=client.jks", + "server" : " --IceSSL.Keystore=server.jks", + "colloc" : " --IceSSL.Keystore=client.jks" + }, + "cs" : { + "plugin" : " --Ice.Plugin.IceSSL=%(bindir)s/icesslcs.dll:IceSSL.PluginFactory --Ice.Default.Protocol=ssl" + + " -IceSSL.Password=password", + "client" : " --IceSSL.CertFile=%(certsdir)/c_rsa1024.pfx --IceSSL.CheckCertName=0", + "server" : " --IceSSL.CertFile=%(certsdir)/s_rsa1024.pfx --IceSSL.ImportCert.CurrentUser.Root=%(certsdir)/cacert.pem", + "colloc" : " --IceSSL.CertFile=%(certsdir)/c_rsa1024.pfx --IceSSL.ImportCert.CurrentUser.Root=%(certsdir)/cacert.pem --IceSSL.CheckCertName=0" + }, + } + +def getDefaultMapping(currentDir = ""): + """Try and guess the language mapping out of the current path""" + + if currentDir != "": + # Caller has specified the current path to use as a base. + scriptPath = os.path.abspath(currentDir).split(os.sep) + scriptPath.reverse() + for p in scriptPath: + if p in ["cpp", "cs", "java", "php", "py", "rb", "tmp"]: + return p + + scriptPath = os.path.abspath(sys.argv[0]).split(os.sep) + scriptPath.reverse() + for p in scriptPath: + if p in ["cpp", "cs", "java", "php", "py", "rb", "tmp"]: + return p + + scriptPath = os.path.abspath(os.getcwd()).split(os.sep) + scriptPath.reverse() + for p in scriptPath: + if p in ["cpp", "cs", "java", "php", "py", "rb", "tmp"]: + return p + + print >>sys.stderr, "Unable to determine default mapping" + sys.exit(1) + +def getTestEnv(): + # + # XXX: These values *could* be relative to __file__, e.g. + # os.path.join(__file__, "..", "cpp") + # + return { "bindir" : os.path.join(os.path.abspath(findTopLevel()), "cpp", "bin"), + "certsdir" : os.path.join(os.path.abspath(findTopLevel()), "certs")} + +class DriverConfig: + lang = None + protocol = None + compress = 0 + threadPerConnection = 0 + host = None + mono = False + type = None + overrides = None + + def __init__(self, type = None): + global protocol + global compress + global threadPerConnection + global host + global mono + self.lang = getDefaultMapping() + self.protocol = protocol + self.compress = compress + self.threadPerConnection = threadPerConnection + self.host = host + self.mono = mono + self.type = type + +def argsToDict(argumentString, results): + """Converts an argument string to dictionary""" + args = argumentString.strip() + while len(args) > 0: + end = args.find(" --") + if end == -1: + current = args.strip() + args = "" + else: + current = args[:end].strip() + args = args[end:].strip() + + value = current.find("=") + if value != -1: + results[current[:value]] = current[value+1:] + else: + results[current] = None + return results + +def getCommandLine(exe, config, env = getTestEnv()): + # + # Command lines are built up from the items in the components + # sequence, which is initialized with command line options common to + # all test drivers. + # + components = ["--Ice.NullHandleAbort", "--Ice.Warn.Connections"] + + # + # Now we add additional components dependent on the desired + # configuration. + # + if config.protocol == "ssl": + components.append(sslConfigTree[config.lang]["plugin"] % env) + components.append(sslConfigTree[config.lang][config.type] % env) + if config.compress: + components.append("--Ice.Override.Compress") + + if config.threadPerConnection: + components.append("--Ice.ThreadPerConnection") + elif config.type == "server": + components.append("--Ice.PrintProcessId --Ice.PrintAdapterReady --Ice.ServerIdleTime=10") + components.append("--Ice.ThreadPool.Server.Size=1 --Ice.ThreadPool.Server.SizeMax=3 --Ice.ThreadPool.Server.SizeWarn=0") + + if config.host != None and len(config.host) != 0: + components.append("--Ice.Default.Host=%s" % config.host) + + # + # Not very many tests actually require an option override, so not to worried + # about optimal here. + # + if config.overrides != None and len(config.overrides) > 0: + propTable = {} + for c in components: + argsToDict(c, propTable) + + argsToDict(config.overrides, propTable) + components = [] + for k, v in propTable.iteritems(): + if v != None: + components.append("%s=%s" % (k, v)) + else: + components.append("%s" % k) + + output = StringIO.StringIO() + if config.mono and config.lang == "cs": + print >>output, "mono", "%s.exe" % exe, + elif config.lang == "rb" and config.type == "client": + print >>output, "ruby", exe, + elif config.lang == "java": + print >>output, "%s -ea" % javaCmd, exe, + elif config.lang == "py": + print >>output, "python", exe, + elif config.lang == "php" and config.type == "client": + print >>output, phpCmd, "-c tmp.ini -f", exe, " -- ", + else: + print >>output, exe, + + for c in components: + print >>output, c, + commandline = output.getvalue() + output.close() + + return commandline + +def checkFiles(filelist): + pass +# +# if getDefaultMapping() == "java": +# # We skip checking for the file in Java since the 'file' is actually a class somewhere in the classpath. +# return +# for f in filelist: +# if not (os.path.exists(f) and os.path.isfile(f)): +# print >>sys.stderr, "File %s does not exist or is not executable" % f +# sys.exit(1) + +def getDefaultServerFile(): + lang = getDefaultMapping() + if lang in ["rb", "php", "cpp", "cs"]: + return "server" + if lang == "py": + return "Server.py" + if lang == "java": + return "Server" + +def getDefaultClientFile(): + lang = getDefaultMapping() + if lang == "rb": + return "Client.rb" + if lang == "php": + return "Client.php" + if lang in ["cpp", "cs"]: + return "client" + if lang == "py": + return "Client.py" + if lang == "java": + return "Client" + +def getDefaultCollocatedFile(): + lang = getDefaultMapping() + if lang == "rb": + return "Collocated.rb" + if lang == "php": + return "Collocated.php" + if lang in ["cpp", "cs"]: + return "collocated" + if lang == "py": + return "Collocated.py" + if lang == "java": + return "Collocated" + +def clientServerTestWithOptionsAndNames(name, additionalServerOptions, additionalClientOptions, \ + serverName, clientName): + lang = getDefaultMapping() + testdir = os.path.join(findTopLevel(), lang, "test", name) + + server = serverName + client = clientName + + if lang != "java": + if lang in ["rb", "php"]: + server = os.path.join(findTopLevel(), "cpp", "test", name, serverName) + else: + server = os.path.join(testdir, serverName) + client = os.path.join(testdir, clientName) + + checkFiles([server, client]) + + print "starting " + serverName + "...", + serverCfg = DriverConfig("server") + if lang in ["rb", "php"]: + serverCfg.lang = "cpp" + serverCmd = getCommandLine(server, serverCfg) + additionalServerOptions + if debug: + print "(" + serverCmd + ")", + serverPipe = os.popen(serverCmd + " 2>&1") + if lang != "java": + getServerPid(serverPipe) + getAdapterReady(serverPipe) + print "ok" + + cwd = os.getcwd() + os.chdir(testdir) + + if lang == "php": + ini = open("php.ini", "r").readlines() + for i in range(0, len(ini)): + ini[i] = ini[i].replace("ICE_HOME", os.path.join(findTopLevel())) + tmpini = open("tmp.ini", "w") + tmpini.writelines(ini) + tmpini.write("extension_dir=%s\n" % phpExtensionDir) + tmpini.write("extension=%s\n" % phpExtension) + tmpini.close() + + + print "starting " + clientName + "...", + clientCmd = getCommandLine(client, DriverConfig("client")) + additionalClientOptions + if debug: + print "(" + clientCmd + ")", + clientPipe = os.popen(clientCmd + " 2>&1") + print "ok" + + printOutputFromPipe(clientPipe) + + clientStatus = closePipe(clientPipe) + if clientStatus: + killServers() + + joinServers() + os.chdir(cwd) + + if clientStatus or serverStatus(): + sys.exit(1) + +def clientServerTestWithOptions(name, additionalServerOptions, additionalClientOptions): + + clientServerTestWithOptionsAndNames(name, additionalServerOptions, additionalClientOptions, getDefaultServerFile(), + getDefaultClientFile()) + +def clientServerTest(name): + + clientServerTestWithOptions(name, "", "") + +def clientServerTestWithClasspath(name, serverClasspath, clientClasspath): + + cp = os.getenv("CLASSPATH", "") + scp = serverClasspath + os.pathsep + cp + ccp = clientClasspath + os.pathsep + cp + + print "starting server...", + os.environ["CLASSPATH"] = scp + serverPipe = startServer(getDefaultServerFile(), "") + os.environ["CLASSPATH"] = cp + + getAdapterReady(serverPipe) + print "ok" + + print "starting client...", + os.environ["CLASSPATH"] = ccp + clientPipe = startClient(getDefaultClientFile(), "") + os.environ["CLASSPATH"] = cp + print "ok" + + printOutputFromPipe(clientPipe) + clientStatus = closePipe(clientPipe) + + if clientStatus or serverStatus(): + killServers() + sys.exit(1) + + +def mixedClientServerTestWithOptions(name, additionalServerOptions, additionalClientOptions): + + testdir = os.path.join(findTopLevel(), getDefaultMapping(), "test", name) + lang = getDefaultMapping() + server = getDefaultServerFile() + client = getDefaultClientFile() + if lang != "java": + server = os.path.join(testdir, server) + client = os.path.join(testdir, client) + checkFiles([server, client]) + + print "starting server...", + serverCmd = getCommandLine(server, DriverConfig("server")) + additionalServerOptions + if debug: + print "(" + serverCmd + ")", + serverPipe = os.popen(serverCmd + " 2>&1") + if lang != "java": + getServerPid(serverPipe) + getAdapterReady(serverPipe) + print "ok" + + print "starting client...", + clientCmd = getCommandLine(client, DriverConfig("client")) + additionalClientOptions + if debug: + print "(" + clientCmd + ")", + clientPipe = os.popen(clientCmd + " 2>&1") + ignorePid(clientPipe) + getAdapterReady(clientPipe, False) + print "ok" + + printOutputFromPipe(clientPipe) + + clientStatus = closePipe(clientPipe) + + if clientStatus: + killServers() + + if clientStatus or serverStatus(): + sys.exit(1) + +def mixedClientServerTest(name): + + mixedClientServerTestWithOptions(name, "", "") + +def collocatedTestWithOptions(name, additionalOptions): + + testdir = os.path.join(findTopLevel(), getDefaultMapping(), "test", name) + lang = getDefaultMapping() + collocated = getDefaultCollocatedFile() + if lang != "java": + collocated = os.path.join(testdir, collocated) + checkFiles([collocated]) + + print "starting collocated...", + command = getCommandLine(collocated, DriverConfig("colloc")) + ' ' + additionalOptions + if debug: + print "(" + command + ")", + collocatedPipe = os.popen(command + " 2>&1") + print "ok" + + printOutputFromPipe(collocatedPipe) + + collocatedStatus = closePipe(collocatedPipe) + + if collocatedStatus: + sys.exit(1) + +def collocatedTest(name): + + collocatedTestWithOptions(name, "") + +def cleanDbDir(path): + # + # XXX why isn't this the same as cpp/IceGridAdmin's cleanDbDir? + # + for filename in [ os.path.join(path, f) for f in os.listdir(path) if f != ".gitignore" and f != "DB_CONFIG" ]: + os.remove(filename) + +def startClient(exe, args, config=DriverConfig("client"), env=getTestEnv()): + if debug: + print getCommandLine(exe, config, env) + args + + if config.lang == "php": + os.chdir(os.path.dirname(os.path.abspath(exe))) + ini = open("php.ini", "r").readlines() + for i in range(0, len(ini)): + ini[i] = ini[i].replace("ICE_HOME", os.path.join(findTopLevel())) + tmpini = open("tmp.ini", "w") + tmpini.writelines(ini) + tmpini.write("extension_dir=%s\n" % phpExtensionDir) + tmpini.write("extension=%s\n" % phpExtension) + tmpini.close() + + return os.popen(getCommandLine(exe, config, env) + args) + +def startServer(exe, args, config=DriverConfig("server"), env=getTestEnv()): + if debug: + print getCommandLine(exe, config, env) + args + return os.popen(getCommandLine(exe, config, env) + args) + +def startColloc(exe, args, config=DriverConfig("colloc"), env=getTestEnv()): + if debug: + print getCommandLine(exe, config, env) + args + return os.popen(getCommandLine(exe, config, env) + args) + +def getMappingDir(currentDir): + return os.path.abspath(os.path.join(findTopLevel(), getDefaultMapping(currentDir))) + +def getBinDir(currentDir): +# +# XXX needs to handle directories that the bin dir isn't in the mapping +# dir. e.g. Python. +# + return os.path.abspath(os.path.join(getMappingDir(currentDir), "bin")) + +def getCertsDir(currentDir): +# +# XXX- this will change when I move the certs directory. +# + return os.path.abspath(os.path.join(findTopLevel(), "certs")) |