diff options
author | Benoit Foucher <benoit@zeroc.com> | 2016-11-25 13:13:22 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2016-11-25 13:13:22 +0100 |
commit | dcdc32af1fced49d80a8ccd93230e15d91ab45d8 (patch) | |
tree | eb69e2555fbd54496fce8a33f4dd610e1473ff51 /scripts/TestUtil.py | |
parent | C# IceSSL/configuration log expired certificate exceptions. (diff) | |
download | ice-dcdc32af1fced49d80a8ccd93230e15d91ab45d8.tar.bz2 ice-dcdc32af1fced49d80a8ccd93230e15d91ab45d8.tar.xz ice-dcdc32af1fced49d80a8ccd93230e15d91ab45d8.zip |
Refactored test scripts
Diffstat (limited to 'scripts/TestUtil.py')
-rwxr-xr-x | scripts/TestUtil.py | 2669 |
1 files changed, 0 insertions, 2669 deletions
diff --git a/scripts/TestUtil.py b/scripts/TestUtil.py deleted file mode 100755 index 846d9975ce6..00000000000 --- a/scripts/TestUtil.py +++ /dev/null @@ -1,2669 +0,0 @@ -# ********************************************************************** -# -# Copyright (c) 2003-2016 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. -# -# ********************************************************************** - -import sys, os, re, getopt, time, string, threading, atexit, platform, traceback, subprocess - -# Global flags and their default values. -protocol = "" # If unset, default to TCP. Valid values are "tcp", "ssl", "ws", "wss", "bt" or "bts". -compress = False # Set to True to enable bzip2 compression. -serialize = False # Set to True to have tests use connection serialization -host = None # Will default to loopback. -debug = False # Set to True to enable test suite debugging. -mono = False # Set to True when not on Windows -keepGoing = False # Set to True to have the tests continue on failure. -ipv6 = False # Default to use IPv4 only -socksProxy = False # Use SOCKS proxy running on localhost -global x64 -x64 = False # Binary distribution is 64-bit -global x86 -x86 = False # Binary distribution is 32-bit -global armv7l -armv7l = False # Binary distribution is armv7l -cpp11 = False # Binary distribution is c++11 -es5 = False # Use JavaScript ES5 (Babel compiled code) -static = False # Static build -global buildMode -buildMode = None - -extraArgs = [] -clientTraceFilters = [] -serverTraceFilters = [] - -# Default java loader - -javaHome = os.environ.get("JAVA_HOME", "") -javaCmd = '"%s"' % os.path.join(javaHome, "bin", "java") if javaHome else "java" -javaLibraryPath = None # Used for Freeze - -valgrind = False # Set to True to use valgrind for C++ executables. -appverifier = False # Set to True to use appverifier for C++ executables, This is windows only feature -tracefile = None -printenv = False -cross = [] -watchDog = None -clientHome = None -serviceDir = None -compact = False -global winrt -winrt = False -global serverOnly -serverOnly = False -mx = False -controller = None -configName = None - -queuedTests = [] - -global additionalBinDirectories -additionalBinDirectories = [] - -def addAdditionalBinDirectories(directories): - global additionalBinDirectories - additionalBinDirectories += directories - -def resetAdditionalBinDirectories(): - global additionalBinDirectories - additionalBinDirectories = [] - -# -# Linux distribution -# -linuxDistribution = None -for path in ["/etc/redhat-release", "/etc/issue"]: - if not os.path.isfile(path): - continue - - f = open(path, "r") - issue = f.read() - f.close() - - if issue.find("Red Hat") != -1: - linuxDistribution = "RedHat" - elif issue.find("Amazon Linux") != -1: - linuxDistribution = "Amazon" - elif issue.find("CentOS") != -1: - linuxDistribution = "CentOS" - elif issue.find("Ubuntu") != -1: - linuxDistribution = "Ubuntu" - elif issue.find("Debian") != -1: - linuxDistribution = "Debian" - elif issue.find("SUSE Linux") != -1: - linuxDistribution = "SUSE LINUX" - elif issue.find("Yocto") != -1: - linuxDistribution = "Yocto" - -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 and sys.getwindowsversion()[1] == 0 - -def isWin9x(): - if isWin32(): - return not ("OS" in os.environ and os.environ["OS"] == "Windows_NT") - else: - return 0 - -def isSolaris(): - return sys.platform == "sunos5" - -def isSparc(): - p = subprocess.Popen("uname -p", stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) - if not p or not p.stdout: - print("unable to get system information!") - sys.exit(1) - l = p.stdout.readline().decode("utf-8").strip() - if l == "sparc": - return True - else: - return False - -def dpkgHostMultiArch(): - p = subprocess.Popen("dpkg-architecture -qDEB_HOST_MULTIARCH", stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) - if not p or not p.stdout: - print("unable to get system information!") - sys.exit(1) - return p.stdout.readline().decode("utf-8").strip() - -def isI686(): - return x86 or any(platform.machine() == p for p in ["i386", "i686"]) - -def isAIX(): - return sys.platform.startswith("aix") - -def isDarwin(): - return sys.platform == "darwin" - -def isLinux(): - return sys.platform.startswith("linux") or sys.platform.startswith("gnukfreebsd") - -def isUbuntu(): - return isLinux() and linuxDistribution and linuxDistribution == "Ubuntu" - -def isRhel(): - return isLinux() and linuxDistribution in ["RedHat", "Amazon", "CentOS"] - -def isYocto(): - return isLinux() and linuxDistribution and linuxDistribution == "Yocto" - -def isDebian(): - return isLinux() and linuxDistribution and linuxDistribution == "Debian" - -def isSles(): - return isLinux() and linuxDistribution and linuxDistribution == "SUSE LINUX" - -def iceUseOpenSSL(): - return any(sys.platform.startswith(p) for p in ["linux", "freebsd"]) - -def getCppCompiler(): - compiler = "" - if os.environ.get("CPP_COMPILER", "") != "": - compiler = os.environ["CPP_COMPILER"] - elif isMINGW(): - compiler = "MINGW" - else: - p = subprocess.Popen("cl", stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) - if not p or not p.stdout: - print("Cannot detect C++ compiler") - compiler = VC120 - else: - l = p.stdout.readline().decode("utf-8").strip() - if l.find("Version 16.") != -1: - compiler = "VC100" - elif l.find("Version 17.") != -1: - compiler = "VC110" - elif l.find("Version 18.") != -1: - compiler = "VC120" - elif l.find("Version 19.") != -1: - compiler = "VC140" - else: - # - # Cannot detect C++ compiler use default - # - compiler = "VC140" - return compiler - -def isMINGW(): - if not isWin32(): - return False - # Ruby Installer DEVKIT sets the RI_DEVKIT environment variable, - # we check for this variable to detect the Ruby MINGW environment. - return "RI_DEVKIT" in os.environ - -def isVC100(): - if not isWin32(): - return False - return getCppCompiler() == "VC100" - -def isVC110(): - if not isWin32(): - return False - return getCppCompiler() == "VC110" - -def isVC120(): - if not isWin32(): - return False - return getCppCompiler() == "VC120" - -def isVC140(): - if not isWin32(): - return False - return getCppCompiler() == "VC140" - -def getIceSoVersion(): - config = open(os.path.join(toplevel, "cpp", "include", "IceUtil", "Config.h"), "r") - intVersion = int(re.search("ICE_INT_VERSION ([0-9]*)", config.read()).group(1)) - majorVersion = int(intVersion / 10000) - minorVersion = int(intVersion / 100) - 100 * majorVersion - patchVersion = intVersion % 100 - if patchVersion < 50: - return '%d' % (majorVersion * 10 + minorVersion) - elif patchVersion < 60: - return '%da%d' % (majorVersion * 10 + minorVersion, patchVersion - 50) - else: - return '%db%d' % (majorVersion * 10 + minorVersion, patchVersion - 60) - -def getIceJsonVersion(): - r = re.search(r"([0-9]+)\.([0-9]+)(\.[0-9]+|[ab][0-9]+)", iceVersion) - major = int(r.group(1)) - minor = int(r.group(2)) - v = ("%d.%d" % (major, minor)).strip() - if r.group(3).startswith("a"): - return v + ".0-" + r.group(3).replace("a", "alpha").strip() - elif r.group(3).startswith("b"): - return v + ".0-" + r.group(3).replace("b", "beta").strip() - else: - return ("%s%s" % (v, r.group(3))).strip() - -def getJdkVersion(): - process = subprocess.Popen("java -version", stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True) - if not process or not process.stdout: - print("unable to get Java version!") - sys.exit(1) - global jdkVersion - jdkVersion = process.stdout.readline() - if not jdkVersion: - print("unable to get Java version!") - sys.exit(1) - return jdkVersion.decode("utf-8") - -def getWinRegistryKeyValue(key, subKey): - import winreg - try: - key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key, 0, winreg.KEY_READ | winreg.KEY_WOW64_64KEY) - try: - return winreg.QueryValueEx(key, subKey) - finally: - winreg.CloseKey(key) - except: - pass - -def sanitize(cp): - np = "" - for p in cp.split(os.pathsep): - if len(np) > 0: - np = np + os.pathsep - np = np + p - return np - -def quoteArgument(arg): - if arg is None: - return None - return '"%s"' % arg - -def dumpenv(env, lang): - if env is None: - env = os.environ - vars = ["PATH", "LD_LIBRARY_PATH", "DYLD_LIBRARY_PATH", "SHLIB_PATH", "LIBPATH", "LD_LIBRARY_PATH_64"] - if lang is None: - vars.extend(["CLASSPATH", "MONO_PATH", "DEVPATH", "PYTHONPATH", "RUBYLIB"]) - elif lang == "cpp": - pass - elif lang == "java" or lang == "java-compat": - vars.append("CLASSPATH") - elif lang == "csharp": - vars.extend(["MONO_PATH", "DEVPATH"]) - elif lang == "python": - vars.append("PYTHONPATH") - elif lang == "ruby": - vars.append("RUBYLIB") - elif lang == "js": - vars.append("NODE_PATH") - for i in vars: - if i in env: - print("%s=%s" % (i, env[i])) - -def addLdPath(libpath, env = None): - if env is None: - env = os.environ - if isWin32(): - addPathToEnv("PATH", libpath, env) - elif isDarwin(): - addPathToEnv("DYLD_LIBRARY_PATH", libpath, env) - elif isAIX(): - addPathToEnv("LIBPATH", libpath, env) - else: - addPathToEnv("LD_LIBRARY_PATH", libpath, env) - addPathToEnv("LD_LIBRARY_PATH_64", libpath, env) - return env - -def addClasspath(path, env = None): - return addPathToEnv("CLASSPATH", path, env) - -def addPathToEnv(variable, path, env = None): - if env is None: - env = os.environ - if variable not in env: - env[variable] = path - else: - env[variable] = path + os.pathsep + env.get(variable) - return env - -# -# 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 -testErrors = [] -toplevel = None -testToplevel = None - -path = [ ".", "..", "../..", "../../..", "../../../..", "../../../../..", "../../../../../..", - "../../../../../../..", "../../../../../../../..", "../../../../../../../../.." ] -head = os.path.dirname(sys.argv[0]) -if len(head) == 0: - head = "." -# Try to find scripts/TestUtil.py or ice/scripts/TestUtil.py in parent directories -path = [os.path.join(head, p) for p in path] + [os.path.join(head, p, "ice") for p in path] -path = [os.path.abspath(p) for p in path if os.path.exists(os.path.join(p, "scripts", "TestUtil.py")) ] -if len(path) == 0: - raise RuntimeError("can't find toplevel directory!") -toplevel = path[0] -testToplevel = toplevel - -# -# Set the default arch to x64 on x64 machines, this could be overriden -# with the --x86 command line argument. -# -if isWin32(): - if os.environ.get("PLATFORM", "").upper() == "X64": - x64 = True -elif isAIX(): - if os.environ.get("OBJECT_MODE", "") == "64": - x64 = True -else: - p = subprocess.Popen("uname -m", shell = True, stdout = subprocess.PIPE, stderr = subprocess.STDOUT) - if(p.wait() != 0): - print("uname failed:\n" + p.stdout.read().strip()) - sys.exit(1) - line = p.stdout.readline().decode('UTF-8').strip() - if line == "x86_64" and os.environ.get("LP64", "") != "no": - x64 = True - elif line == "armv7l": - armv7l = True - -# -# The PHP interpreter is called "php5" on some platforms (e.g., SLES). -# -phpCmd = "php" -for path in os.environ["PATH"].split(os.pathsep): - # - # Stop if we find "php" in the PATH first. - # - if os.path.exists(os.path.join(path, "php")): - break - elif os.path.exists(os.path.join(path, "php5")): - phpCmd = "php5" - break - -# -# The NodeJS interpreter is called "nodejs" on some platforms -# (e.g., Ubuntu) -# -nodeCmd = "node" -if "NODE" in os.environ: - nodeCmd = os.environ["NODE"] -else: - for path in os.environ["PATH"].split(os.pathsep): - # - # Stop if we find "node" in the PATH first. - # - if os.path.exists(os.path.join(path, "node")): - break - elif os.path.exists(os.path.join(path, "nodejs")): - nodeCmd = "nodejs" - break - -# -# Figure out the Ice version -# -iceVersion = None -try: - if isWin32(): - config = open(os.path.join(toplevel, "config", "icebuilder.props"), "r") - iceVersion = re.search("<IceVersion>[\t\s]*([0-9]+\.[0-9]+(\.[0-9]+|[ab][0-9]*))</IceVersion>", config.read()).group(1) - else: - config = open(os.path.join(toplevel, "config", "Make.rules"), "r") - iceVersion = re.search("version[\t\s]*= ([0-9]+\.[0-9]+(\.[0-9]+|[ab][0-9]*))", config.read()).group(1) - config.close() -except: - print("error: couldn't figure Ice version") - sys.exit(1) - -# -# Figure out Ice installation directory -# -iceHome = None # Binary distribution to use (or None to use binaries from source distribution) -if os.environ.get("USE_BIN_DIST", "no") == "yes": - # Only use binary distribution from ICE_HOME environment variable if USE_BIN_DIST=yes - if os.environ.get("ICE_HOME", "") != "": - iceHome = os.environ["ICE_HOME"] - elif isLinux(): - iceHome = "/usr" - elif isDarwin(): - iceHome = "/usr/local" - elif isWin32(): - path = getWinRegistryKeyValue("SOFTWARE\\ZeroC\\Ice %s" % iceVersion, "InstallDir") - if path and len(path) > 0 and os.path.exists(path[0]): - iceHome = path[0] - -# List of supported cross-language tests. -crossTests = [ #"Ice/adapterDeactivation", - #"Ice/background", - #"Ice/binding", - #"Ice/checksum", - #"Ice/custom", - "Ice/ami", - "Ice/info", - "Ice/exceptions", - "Ice/enums", - "Ice/facets", - #"Ice/hold", - "Ice/inheritance", - "Ice/invoke", - #"Ice/location", - "Ice/objects", - "Ice/operations", - "Ice/proxy", - #"Ice/retry", - "Ice/servantLocator", - #"Ice/timeout", - "Ice/slicing/exceptions", - "Ice/slicing/objects", - "Ice/optional", - ] - -def run(tests, root = False): - def usage(): - print("usage: " + sys.argv[0] + """ - --all Run all sensible permutations of the tests. - --all-cross Run all sensible permutations of cross language tests. - --start=index Start running the tests at the given index. - --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=<prot> Run with the given protocol (tcp|ssl|ws|wss|bt). - --compress Run the tests with protocol compression. - --host=host Set --Ice.Default.Host=<host>. - --valgrind Run the test with valgrind. - --appverifier Run the test with appverifier under Windows. - --serialize Run with connection serialization. - --continue Keep running when a test fails. - --ipv6 Use IPv6 addresses. - --socks Use SOCKS proxy running on localhost. - --no-ipv6 Don't use IPv6 addresses. - --ice-home=<path> Use the binary distribution from the given path. - --mode=debug|release Run the tests with debug or release mode builds (win32 only)." - --x86 Binary distribution is 32-bit. - --x64 Binary distribution is 64-bit. - --c++11 Binary distribution is c++11. - --es5 Use JavaScript ES5 (Babel compiled code) - --static Binary distribution is static. - --cross=lang Run cross language test. - --client-home=<dir> Run cross test clients from the given Ice source distribution. - --script Generate a script to run the tests. - --env Print important environment variables. - --service-dir=<dir> Where to locate services for builds without service support. - --compact Ice for .NET uses the Compact Framework. - --winrt Run server with configuration suited for WinRT client. - --server Run only the server. - --mx Enable IceMX when running the tests. - --controller=<host> Use the test controller on the specified host. - --arg=<property> Append the given argument. - """) - sys.exit(2) - - try: - opts, args = getopt.getopt(sys.argv[1:], "lr:R:", - ["start=", "start-after=", "filter=", "rfilter=", "all", "all-cross", "loop", - "debug", "protocol=", "compress", "valgrind", "host=", "serialize", "continue", - "ipv6", "no-ipv6", "socks", "ice-home=", "mode=", "cross=", "client-home=", "x64", "x86", - "script", "env", "arg=", "service-dir=", "appverifier", "compact", - "winrt", "server", "mx", "c++11", "es5", "static", "controller=", "configName="]) - except getopt.GetoptError: - usage() - - if args: - usage() - - start = 0 - loop = False - all = False - allCross = False - arg = "" - script = False - noipv6 = False - compact = "--compact" in opts - winrt = "--winrt" in opts - serverOnly = "--server" in opts - mx = "--mx" in opts - controller = "--controller" in opts - configName = "--configName" in opts - - filters = [] - for o, a in opts: - if o == "--continue": - global keepGoing - keepGoing = True - elif o in ("-l", "--loop"): - loop = True - elif o in ("-r", "-R", "--filter", '--rfilter'): - testFilter = re.compile(re.escape(os.path.normpath(a))) - if o in ("--rfilter", "-R"): - filters.append((testFilter, True)) - else: - filters.append((testFilter, False)) - elif o == "--cross": - global cross - crossLang = ["cpp", "csharp", "java", "java-compat", "js", "php", "python", "ruby", "objective-c"] - if a not in crossLang: - print("cross must be one of %s" % ', '.join(crossLang)) - sys.exit(1) - cross.append(a) - elif o == "--all" : - all = True - elif o == "--no-ipv6" : - noipv6 = True - elif o == "--all-cross" : - allCross = True - elif o in '--start': - start = int(a) - elif o == "--script": - script = True - elif o == '--arg': - arg += " --arg=" - arg += '"' - arg += a - arg += '"' - elif o == "--protocol": - if a not in ("bt", "bts", "ws", "wss", "ssl", "tcp"): - usage() - if not root and getDefaultMapping() == "csharp" and (a == "ssl" or a == "wss"): - if mono: - print("SSL is not supported with mono") - sys.exit(1) - if compact: - print("SSL is not supported with the Compact Framework") - sys.exit(1) - if a in ["bt", "bts"] and not isLinux(): - print("Bluetooth is only supported on Linux") - sys.exit(1) - elif o == "--c++11": - global cpp11 - cpp11 = True - elif o == "--es5": - global es5 - es5 = True - elif o == "--static": - global static - static = True - elif o == "--x86": - global x86 - x86 = True - elif o == "--x64": - global x64 - x64 = True - if o in ( "--cross", "--protocol", "--host", "--debug", "--compress", "--valgrind", "--serialize", "--ipv6", \ - "--socks", "--ice-home", "--mode", "--x86", "--x64", "--c++11", "--es5", "--static", "--env", \ - "--service-dir", "--appverifier", "--compact", "--winrt", \ - "--server", "--mx", "--client-home", "--controller", "--configName"): - arg += " " + o - if len(a) > 0: - arg += " " + a - - if not root: - tests = [ (os.path.join(getDefaultMapping(), "test", os.path.normpath(x)), y) for x, y in tests ] - - # Expand all the test and argument combinations. - expanded = [] - if all: - expanded.append([(test, arg, config) for test,config in tests if "once" in config ]) - - a = '--protocol=tcp %s' % arg - expanded.append([ (test, a, config) for test,config in tests if "core" in config]) - - a = '--protocol=ssl %s' % arg - expanded.append([ (test, a, config) for test,config in tests if "core" in config]) - - a = '--protocol=ws %s' % arg - expanded.append([ (test, a, config) for test,config in tests if "core" in config]) - - if not noipv6: - a = "--ipv6 --protocol=wss --compress --mx --serialize %s" % arg - expanded.append([ (test, a, config) for test,config in tests if "core" in config]) - - a = "--protocol=tcp %s" % arg - expanded.append([ (test, a, config) for test,config in tests if "service" in config]) - - if not noipv6: - a = "--ipv6 --protocol=ssl --compress --mx --serialize %s" % arg - expanded.append([ (test, a, config) for test,config in tests if "service" in config]) - - elif not allCross: - expanded.append([ (test, arg, config) for test,config in tests]) - - if allCross: - if len(cross) == 0: - cross = ["cpp", "java", "java-compat", "js", "php", "python", "ruby"] - if isWin32(): - cross.append("csharp") - - # PHP/Python only build with VC140 - if getCppCompiler() != "VC140": - cross.remove('php') - cross.remove('python') - - # TODO: We're currently not building Ruby on Windows - cross.remove('ruby') - if isDarwin(): - cross.append("objective-c") - if root: - allLang = ["cpp", "java", "java-compat", "js", "python"] - if isWin32(): - allLang.append("csharp") - if isDarwin(): - allLang.append("objective-c") - else: - allLang = [ getDefaultMapping() ] - for lang in allLang: - # js test user server for other language so we can ignore this - if lang == "js": - continue - - # Run each crossLang through the remove filters. Does not support filter. - # We do this so that we can filter out cross language tests if necessary. - def langFiltered(lang): - for testFilter, removeFilter in filters: - if removeFilter and testFilter.search(lang): - return True - return False - - # This is all other languages than the current mapping. - crossLang = [ l for l in cross if lang != l and langFiltered(l) == False] - - # This is all eligible cross tests for the current mapping. - # Now expand out the tests. We run only tcp for most cross tests. - for c in crossLang: - a = "--cross=%s --protocol=tcp %s" % (c, arg) - for test in crossTests: - name = os.path.join(lang, "test", test) - expanded.append([(name, a, testConfig(name, tests))]) - - # Add ssl & compress for the operations test. - if ((compact or mono) and c == "csharp") or (c == "js"): # Don't add the ssl tests. - continue - a = "--cross=%s --protocol=ssl --compress %s" % (c, arg) - expanded.append([(os.path.join(lang, "test", "Ice", "operations"), a, [])]) - - # Apply filters after expanding. - if len(filters) > 0: - for testFilter, removeFilter in filters: - nexpanded = [] - for tests in expanded: - if removeFilter: - nexpanded.append([ (x, a, y) for x,a,y in tests if not testFilter.search(x) ]) - else: - nexpanded.append([ (x, a, y) for x,a,y in tests if testFilter.search(x) ]) - expanded = nexpanded - - if loop: - num = 1 - while 1: - runTests(start, expanded, num, script = script) - num += 1 - else: - runTests(start, expanded, script = script) - - global testErrors - if len(testErrors) > 0: - print("The following errors occurred:") - for x in testErrors: - print(x) - -if not isWin32(): - mono = True - -def testConfig(name, tests): - for i in tests: - if i[0] == name: - return i[1] - return [] - -def getIceDir(subdir = None, testdir = None): - # - # If client-home is set and if the given test directory is from a - # sub-directory of the client home directory, run the test against - # the client-home source distribution. - # - global clientHome - if testdir and clientHome and os.path.commonprefix([testdir, clientHome]) == clientHome: - return os.path.join(clientHome, subdir) - - # - # If ICE_HOME is set we're running the test against a binary distribution. Otherwise, - # we're running the test against a source distribution. - # - global iceHome - if iceHome: - return iceHome - elif subdir: - return os.path.join(toplevel, subdir) - else: - return toplevel - -def getSliceDir(): - # - # If ICE_HOME is set we're running the test against a binary distribution. Otherwise, - # we're running the test against a source distribution. - # - global iceHome - if iceHome: - if iceHome == "/usr/local" or iceHome == "/usr": - return os.path.join(iceHome, "ice", "slice") - else: - return os.path.join(iceHome, "slice") - else: - return os.path.join(toplevel, "slice") - -def phpCleanup(): - if os.path.exists("ice.profiles"): - os.remove("ice.profiles") - -def phpProfileSetup(clientConfig = False, iceOptions = None, iceProfile = None): - interpreterOptions = [] - - if iceProfile != None: - atexit.register(phpCleanup) - interpreterOptions.append("-d ice.profiles='ice.profiles'") - tmpProfiles = open("ice.profiles", "w") - tmpProfiles.write("[%s]\n" % iceProfile) - if clientConfig: - tmpProfiles.write("ice.config=\"config.client\"\n") - if iceOptions != None: - tmpProfiles.write("ice.options=\"%s\"\n" % iceOptions) - tmpProfiles.close() - else: - if clientConfig: - interpreterOptions.append("-d ice.config='config.client'") - if iceOptions != None: - interpreterOptions.append("-d ice.options='%s'" % iceOptions) - - return ' '.join(interpreterOptions) - -def phpFlags(): - flags = [] - extDir = None - ext = None - incDir = None - - if isWin32(): - ext = "php_ice.dll" - if not iceHome: - extDir = os.path.abspath(os.path.join(getIceDir("php"), "lib", "x64" if x64 else "Win32", - "Debug" if buildMode == "debug" else "Release")) - incDir = os.path.abspath(os.path.join(getIceDir("php"), "lib")) - else: - extDir = os.path.join(iceHome, "php") - incDir = extDir - else: - ext = "IcePHP.so" - if not iceHome: - extDir = os.path.abspath(os.path.join(toplevel, "php", "lib")) - incDir = extDir - else: - # - # If ICE_HOME points to the installation directory of a source build, the - # PHP extension will be located in $ICE_HOME/php. For an RPM installation, - # the extension should already be in PHP's default extension directory so - # we don't need to set extension_dir. - # - # We start PHP with "php -n". The -n option causes PHP to ignore its - # default configuration file(s). We do this to suppress any warnings - # that PHP might generate when it can't find its default extensions after - # we modify extension_dir. Even if we don't define extension_dir, we still - # need to add "extension = IcePHP.<ext>". - # - extDir = os.path.join(iceHome, "php") - incDir = extDir - - if not os.path.exists(os.path.join(extDir, ext)): - if iceHome == "/usr": - extDir = None # Assume the extension is already in PHP's extension_dir. - # - # On SLES11, the PHP run time files are installed in /usr/share/php5, but - # this directory is not in the default include path when you specify an - # alternate configuration file, so we have to configure it explicitly. - # - if os.path.exists("/usr/share/php5/Ice.php"): - incDir = "/usr/share/php5" - else: - incDir = None - elif iceHome == "/usr/local" and isDarwin(): - extDir = "/usr/local/lib/php/extensions" - incDir = "/usr/local/share/php" - else: - print("unable to find IcePHP extension!") - sys.exit(1) - - if extDir: - flags.append("-d extension_dir='%s'" % extDir) - flags.append("-d extension='%s'" % ext) - if incDir: - flags.append("-d include_path='%s'" % incDir) - - return ' '.join(flags) - -def getIceBox(): - global cpp11 - - # - # Get and return the path of the IceBox executable - # - lang = getDefaultMapping() - if lang == "cpp": - iceBox = "icebox" - if isWin32(): - if cpp11: - iceBox += "++11" - iceBox += ".exe" - elif isLinux(): - if isI686(): - iceBox += "32" - if cpp11: - iceBox += "++11" - elif isDarwin and cpp11: - iceBox += "++11" - iceBox = os.path.join(getCppBinDir(lang), iceBox) - elif lang == "java": - iceBox = "com.zeroc.IceBox.Server" - elif lang == "java-compat": - iceBox = "IceBox.Server" - elif lang == "csharp": - iceBox = os.path.join(getIceDir("csharp"), "bin", "iceboxnet") - - return iceBox - -def getIceBoxAdmin(): - if getDefaultMapping() == "java": - return "com.zeroc.IceBox.Admin" - elif getDefaultMapping() == "java-compat": - return "IceBox.Admin" - else: - return getIceExe("iceboxadmin") - -def getIceGridAdmin(): - return getIceExe("icegridadmin") - -def getIceStormAdmin(): - return getIceExe("icestormadmin") - -def getIceGridNode(): - return getIceExe("icegridnode") - -def getIceGridRegistry(): - return getIceExe("icegridregistry") - -def getGlacier2Router(): - return getIceExe("glacier2router") - -def getIceExe(name): - if isMINGW(): - return os.path.join(getServiceDir(), name) - else: - return os.path.join(getCppBinDir(), name) - -def getNodeCommand(): - return nodeCmd - -# -# Create a passwords file that contains the given users/passwords using icehashpassword.py -# -def hashPasswords(filePath, entries): - if os.path.exists(filePath): - os.remove(filePath) - passwords = open(filePath, "a") - - command = "%s %s" % (sys.executable, os.path.abspath(os.path.join(os.path.dirname(__file__), "icehashpassword.py"))) - - # - # For Linux ARM default rounds makes test slower (Usually runs on embbeded boards) - # - if isLinux() and armv7l: - command += " --rounds 100000" - - for user, password in entries.items(): - p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE) - p.stdin.write(password.encode('UTF-8')) - p.stdin.write('\r\n'.encode('UTF-8')) - p.stdin.flush() - if(p.wait() != 0): - print("icehashpassword.py failed:\n" + p.stdout.read().decode('UTF-8').strip()) - passwords.close() - sys.exit(1) - passwords.write("%s %s\n" % (user, p.stdout.readline().decode('UTF-8').strip())) - passwords.close() - -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 --IceSSL.Password=password " + - "--IceSSL.DefaultDir=%(certsdir)s --IceSSL.CAs=cacert.pem --IceSSL.VerifyPeer=%(verifyPeer)s", - "client" : " --IceSSL.CertFile=client.p12", - "server" : " --IceSSL.CertFile=server.p12", - "colloc" : " --IceSSL.CertFile=client.p12" - }, - "java" : { - "plugin" : " --Ice.Plugin.IceSSL=com.zeroc.IceSSL.PluginFactory " + - "--IceSSL.DefaultDir=%(certsdir)s --IceSSL.Password=password --IceSSL.VerifyPeer=%(verifyPeer)s", - "client" : " --IceSSL.Keystore=client.jks", - "server" : " --IceSSL.Keystore=server.jks", - "colloc" : " --IceSSL.Keystore=client.jks" - }, - "java-compat" : { - "plugin" : " --Ice.Plugin.IceSSL=IceSSL.PluginFactory " + - "--IceSSL.DefaultDir=%(certsdir)s --IceSSL.Password=password --IceSSL.VerifyPeer=%(verifyPeer)s", - "client" : " --IceSSL.Keystore=client.jks", - "server" : " --IceSSL.Keystore=server.jks", - "colloc" : " --IceSSL.Keystore=client.jks" - }, - "csharp" : { - "plugin" : " --Ice.Plugin.IceSSL=%(icesslcs)s:IceSSL.PluginFactory --IceSSL.CAs=cacert.pem " + - "--IceSSL.Password=password --IceSSL.DefaultDir=%(certsdir)s --IceSSL.VerifyPeer=%(verifyPeer)s", - "client" : " --IceSSL.CertFile=client.p12 --IceSSL.CheckCertName=0", - "server" : " --IceSSL.CertFile=server.p12", - "colloc" : " --IceSSL.CertFile=client.p12 --IceSSL.CheckCertName=0" - }, - } - -if isDarwin(): - sslConfigTree["cpp"]["client"] += " --IceSSL.Keychain=client.keychain --IceSSL.KeychainPassword=password" - sslConfigTree["cpp"]["server"] += " --IceSSL.Keychain=server.keychain --IceSSL.KeychainPassword=password" - sslConfigTree["cpp"]["colloc"] += " --IceSSL.Keychain=colloc.keychain --IceSSL.KeychainPassword=password" - -if isWin32(): - # - # This cipher suites doesn't work well between Java and SChannel TLS1.2 implementations. - # - for lang in ["java", "java-compat"]: - sslConfigTree[lang]["client"] += " --IceSSL.Ciphers=!TLS_DHE_RSA_WITH_AES_128_GCM_SHA256" - sslConfigTree[lang]["server"] += " --IceSSL.Ciphers=!TLS_DHE_RSA_WITH_AES_128_GCM_SHA256" - -sslConfigTree["python"] = sslConfigTree["cpp"] -sslConfigTree["ruby"] = sslConfigTree["cpp"] -sslConfigTree["php"] = sslConfigTree["cpp"].copy() -sslConfigTree["objective-c"] = sslConfigTree["cpp"] - -def getDefaultMapping(): - """Try to guess the language mapping from the current path""" - # here = os.getcwd().split(os.sep) - # here.reverse() - here = os.path.relpath(os.getcwd(), start=toplevel).split(os.sep) - for i in range(0, len(here)): - if here[i] in ["cpp", "csharp", "java", "java-compat", "js", "php", "python", "ruby", "objective-c", "tmp"]: - return here[i] - raise RuntimeError("cannot determine mapping") - -def getStringIO(): - if sys.version_info[0] == 2: - import StringIO - return StringIO.StringIO() - else: - import io - return io.StringIO() - -class DriverConfig: - lang = None - protocol = None - compress = 0 - serialize = 0 - host = None - mono = False - valgrind = False - appverifier = False - type = None - overrides = None - ipv6 = False - socksProxy = False - x64 = False - x86 = False - cpp11 = False - es5 = False - static = False - serviceDir = None - mx = False - controller = None - extraArgs = [] - - def __init__(self, type = None): - global protocol - global compress - global serialize - global host - global mono - global valgrind - global appverifier - global ipv6 - global socksProxy - global x64 - global x86 - global cpp11 - global es5 - global static - global serviceDir - global compact - global mx - global controller - global extraArgs - self.lang = getDefaultMapping() - self.protocol = protocol - self.compress = compress - self.serialize = serialize - self.host = host - self.mono = mono - self.valgrind = valgrind - self.appverifier = appverifier - self.type = type - self.ipv6 = ipv6 - self.socksProxy = socksProxy - self.x64 = x64 - self.x86 = x86 - self.cpp11 = cpp11 - self.es5 = es5 - self.static = static - self.serviceDir = serviceDir - self.compact = compact - self.mx = mx - self.controller = controller - self.extraArgs = extraArgs - -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 getCommandLineProperties(exe, config, cfgName): - - # - # 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=1", "--Ice.Warn.Connections=1"] - - if config.lang == "cpp": - components.append("--Ice.CollectObjects=1") - - # - # Turn on network tracing. - # - #components.append("--Ice.Trace.Network=3") - #components.append("--Ice.Trace.Protocol=1") - - # - # Now we add additional components depending on the desired configuration. - # - if config.protocol in ["ssl", "wss", "bts"]: - sslenv = {} - sslenv["icesslcs"] = quoteArgument("\\\"" + os.path.join(getIceDir("csharp"), "Assemblies", "IceSSL.dll") + "\\\"") - sslenv["certsdir"] = quoteArgument(os.path.abspath(os.path.join(toplevel, "certs"))) - if winrt or config.protocol == "wss": - sslenv["verifyPeer"] = "0" - else: - sslenv["verifyPeer"] = "2" - components.append(sslConfigTree[config.lang]["plugin"] % sslenv) - components.append(sslConfigTree[config.lang][config.type] % sslenv) - - if config.protocol in ["bt", "bts"]: - components.append("--Ice.Plugin.IceBT=IceBT:createIceBT") - - components.append("--Ice.Default.Protocol=" + config.protocol) - - if config.compress: - components.append("--Ice.Override.Compress=1") - - if config.serialize: - components.append("--Ice.ThreadPool.Server.Serialize=1") - - # - # TODO - # config.lang == "cpp" required with C++11 mapping, we should be able to ged rid - # of this once AsyncResult is optimized to not required a thread pool thread with - # collocated calls and C++11 mapping. We must also check if it still required for - # python. - # - if (config.type == "server" or config.type == "colloc" and - (config.lang == "python" or config.lang == "cpp")): - components.append("--Ice.ThreadPool.Server.Size=1") - components.append("--Ice.ThreadPool.Server.SizeMax=3") - components.append("--Ice.ThreadPool.Server.SizeWarn=0") - - if config.type == "server": - components.append("--Ice.PrintAdapterReady=1") - - if config.mx: - if config.type == "server": - components.append("--Ice.Admin.Endpoints=tcp") - components.append("--Ice.Admin.InstanceName=Server") - else: - components.append("--Ice.Admin.Endpoints=tcp") - components.append("--Ice.Admin.InstanceName=Client") - - components.append("--IceMX.Metrics.Debug.GroupBy=id") - components.append("--IceMX.Metrics.Parent.GroupBy=parent") - components.append("--IceMX.Metrics.All.GroupBy=none") - - if config.controller: - components.append("--ControllerHost=" + config.controller) - - if cfgName: - components.append("--ConfigName=" + cfgName) - - if config.socksProxy: - components.append("--Ice.SOCKSProxyHost=127.0.0.1") - - if config.ipv6: - components.append("--Ice.IPv4=1 --Ice.IPv6=1 --Ice.PreferIPv6Address=1") - if config.host == None: - components.append("--Ice.Default.Host=0:0:0:0:0:0:0:1") - else: - if not config.protocol in ["bt", "bts"]: - components.append("--Ice.IPv4=1 --Ice.IPv6=0") - if config.host == None and not config.protocol in ["bt", "bts"]: - components.append("--Ice.Default.Host=127.0.0.1") - - if config.host != None and len(config.host) != 0: - components.append("--Ice.Default.Host=%s" % config.host) - - for arg in config.extraArgs: - components.append('--' + arg) - - # - # Not very many tests actually require an option override, so not too 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.items(): - if v != None: - components.append("%s=%s" % (k, v)) - else: - components.append("%s" % k) - - output = getStringIO() - for c in components: - output.write(c + " ") - properties = output.getvalue() - output.close() - return properties - -def getCommandLine(exe, config, options = "", interpreterOptions = "", cfgName = None): - output = getStringIO() - - if config.mono and config.lang == "csharp": - output.write("mono --debug '%s.exe' " % exe) - elif config.lang == "ruby" and config.type == "client": - # - # If running with a binary distribution ensure rubygems - # are enabled - # - if iceHome: - output.write("ruby -rubygems") - else: - output.write("ruby") - if interpreterOptions: - output.write(" " + interpreterOptions) - output.write(' "%s" ' % exe) - elif config.lang == "java" or config.lang == "java-compat": - output.write("%s -ea " % javaCmd) - if isSolaris() and config.x64: - output.write("-d64 ") - if not config.ipv6: - output.write("-Djava.net.preferIPv4Stack=true ") - if javaLibraryPath: - output.write("-Djava.library.path=" + javaLibraryPath) - if interpreterOptions: - output.write(" " + interpreterOptions) - output.write(" " + exe + " ") - elif config.lang == "python": - output.write(sys.executable) - if interpreterOptions: - output.write(" " + interpreterOptions) - output.write(' "%s" ' % exe) - elif config.lang == "php" and config.type == "client": - output.write(phpCmd + " -n %s" % phpFlags()) - if interpreterOptions: - output.write(" " + interpreterOptions) - output.write(" -f \""+ exe +"\" -- ") - elif config.lang == "js": - output.write(nodeCmd) - if interpreterOptions: - output.write(" " + interpreterOptions) - output.write(' "%s" ' % exe) - elif config.lang == "cpp" and config.valgrind: - # --child-silent-after-fork=yes is required for the IceGrid/activator test where the node - # forks a process with execv failing (invalid exe name). - output.write("valgrind -q --child-silent-after-fork=yes --leak-check=full ") - output.write('--suppressions="' + os.path.join(toplevel, "config", "valgrind.sup") + '" "' + exe + '" ') - else: - if exe.find(" ") != -1: - output.write('"' + exe + '" ') - else: - output.write(exe + " ") - - if exe.find("IceUtil\\") != -1 or exe.find("IceUtil/") != -1: - output.write(' ' + options) - else: - output.write(getCommandLineProperties(exe, config, cfgName) + ' ' + options) - - commandline = output.getvalue() - output.close() - - return commandline - -def directoryToPackage(): - """Determine the package name from the directory.""" - base = os.getcwd() - after = [] - lang = getDefaultMapping() - - if "java" in lang: - # Remove Java's extra directory structure from the path while we search it - base = base.replace(os.path.join("src", "main", "java", "test"), '') - - before = base - - while len(before) > 0: - current = os.path.basename(before) - before = os.path.dirname(before) - if current == lang: - break - after.insert(0, current) - else: - raise RuntimeError("cannot find language dir") - return ".".join(after) - -def getDefaultServerFile(baseDir = os.getcwd()): - lang = getDefaultMapping() - if lang in ["cpp", "objective-c", "js", "ruby", "php"]: - return getTestExecutable("server", baseDir) - if lang in ["csharp"]: - return "server" - if lang == "python": - return "Server.py" - if lang == "java" or lang == "java-compat": - pkg = directoryToPackage() - if len(pkg) > 0: - pkg = pkg + "." - return pkg + "Server" - raise RuntimeError("unknown language") - -def getDefaultClientFile(lang = None, baseDir = ""): - if lang is None: - lang = getDefaultMapping() - if lang in ["cpp", "objective-c"]: - return getTestExecutable("client", baseDir) - if lang == "ruby": - return "Client.rb" - if lang == "php": - return "Client.php" - if lang in ["csharp"]: - return "client" - if lang == "python": - return "Client.py" - if lang == "java" or lang == "java-compat": - pkg = directoryToPackage() - if len(pkg) > 0: - pkg = pkg + "." - return pkg + "Client" - if lang == "js": - return "run.js" - raise RuntimeError("unknown language") - -def getDefaultCollocatedFile(): - lang = getDefaultMapping() - if lang in ["cpp", "objective-c"]: - return getTestExecutable("collocated") - if lang == "ruby": - return "Collocated.rb" - if lang == "php": - return "Collocated.php" - if lang in ["csharp"]: - return "collocated" - if lang == "python": - return "Collocated.py" - if lang == "java" or lang == "java-compat": - return directoryToPackage() + ".Collocated" - -import Expect - -def _spawn(cmd, env=None, cwd=None, startReader=True, lang=None): - # Start/Reset the watch dog thread - global watchDog - if watchDog is None: - watchDog = WatchDog() - else: - watchDog.reset() - - if debug: - sys.stdout.write("(%s) " % cmd) - sys.stdout.flush() - if printenv: - dumpenv(env, lang) - - try: - process = Expect.Expect(cmd, startReader=startReader, env=env, logfile=tracefile, cwd=cwd) - except: - print("Command failed:\n" + cmd) - traceback.print_exc(file=sys.stderr) - sys.exit(1) - - return process - -def spawn(cmd, cwd=None): - # Spawn given command with test environment. - return _spawn(cmd, getTestEnv(getDefaultMapping(), os.getcwd())) - -def spawnClient(cmd, env=None, cwd=None, echo=True, startReader=True, lang=None): - client = _spawn(cmd, env, cwd, startReader=startReader, lang=lang) - if echo: - client.trace(clientTraceFilters) - return client - -def spawnServer(cmd, env=None, cwd=None, count=1, adapter=None, echo=True, lang=None, mx=False, timeout=60): - server = _spawn(cmd, env, cwd, lang=lang) - - # Count + 1 if IceMX enabled - if mx: - count = count + 1 - - if adapter: - server.expect("%s ready\n" % adapter, timeout = timeout) - else: - while count > 0: - server.expect("[^\n]+ ready\n", timeout = timeout) - count = count - 1 - if echo: - server.trace([re.compile("[^\n]+ ready")] + serverTraceFilters) - return server - -import subprocess -def runCommand(command): - env = getTestEnv(getDefaultMapping(), os.getcwd()) - - # - # popen3 has problems dealing with white spaces in command line. - # - if isWin32(): - CREATE_NEW_PROCESS_GROUP = 512 - # - # We set shell=True to make sure executables are correctly searched - # in directories specified by the PATH environment variable. - # - p = subprocess.Popen(command, shell=True, bufsize=0, stdin=subprocess.PIPE, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, creationflags = 512, env = env) - else: - p = subprocess.Popen(command, shell=True, bufsize=1024, stdin=subprocess.PIPE, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, close_fds=True, env = env) - - return p; - -def matchAppVerifierSuccess(): - return re.escape("\nApplication Verifier ") + ".*\n" + \ - re.escape("Copyright (c) Microsoft Corporation. All rights reserved.") + \ - ".*\n\n$" #After all match to newlines at end. - -def setAppVerifierSettings(targets, cwd=os.getcwd()): - for exe in targets: - if exe.endswith(".exe") == False: - exe += ".exe" - - #First enable all appverifier tests - cmd = "appverif -enable * -for " + exe - verifier = _spawn(cmd, cwd=cwd) - verifier.expect(matchAppVerifierSuccess(), -1) - - #Now disable all tests we are not intested in - cmd = "appverif -disable LuaPriv PrintDriver PrintApi Networking HighVersionLie -for " + exe - verifier = _spawn(cmd, cwd=cwd) - verifier.expectall(["Application Verifier","",""], -1) - -def appVerifierAfterTestEnd(targets, cwd=os.getcwd()): - for exe in targets: - if exe.endswith(".exe") == False: - exe += ".exe" - - # Export appverifier logs to a xml file in cwd - logName = cwd - if logName is None: - logName = os.path.dirname(exe) - logName += "/" + os.path.basename(exe) + "_appverifier_log.xml" - cmd = "appverif -export log -for " + exe + " -with To=" + logName - verifier = _spawn(cmd, cwd=cwd) - verifier.expect(matchAppVerifierSuccess(), -1) - - # Delete appverifier logs from registry - cmd = "appverif -delete logs -for " + exe - verifier = _spawn(cmd, cwd=cwd) - verifier.expect(matchAppVerifierSuccess(), -1) - - # Delete appverifier settings - cmd = "appverif -delete settings -for " + exe - verifier = _spawn(cmd, cwd=cwd) - verifier.expect(matchAppVerifierSuccess(), -1) - -def getMirrorDir(base, mapping): - """Get the mirror directory for the current test in the given mapping.""" - lang = getDefaultMapping() - after = [] - - if lang == "js": - if isWin32(): - base = base.replace("\\es5", "") - else: - base = base.replace("/es5", "") - elif "java" in lang: - # Remove Java's extra directory structure from the path while we search it - base = base.replace(os.path.join("src", "main", "java", "test"), '') - - before = base - while len(before) > 0: - current = os.path.basename(before) - before = os.path.dirname(before) - if current == lang: - break - after.insert(0, current) - else: - raise RuntimeError("cannot find language dir") - - dir = os.path.join(before, mapping) - # Deal with Java's different directory structure - if "java" in mapping: - dir = os.path.join(dir, "test", "src", "main", "java") - return os.path.join(dir, *after) - -def getMappingDir(base, mapping, dirnames): - """Get the directory for the given mapping.""" - lang = getDefaultMapping() - after = [] - before = base - while len(before) > 0: - current = os.path.basename(before) - before = os.path.dirname(before) - if current == lang: - break - after.insert(0, current) - else: - raise RuntimeError("cannot find language dir") - return os.path.join(before, mapping, *dirnames) - -def getClientCrossTestDir(base): - """Get the client directory from client-home for the given test.""" - global clientHome - if not clientHome: - return base - - lang = getDefaultMapping() - after = [] - before = base - while len(before) > 0: - current = os.path.basename(before) - before = os.path.dirname(before) - if current == lang: - break - after.insert(0, current) - else: - raise RuntimeError("cannot find language dir") - return os.path.join(clientHome, lang, *after) - - -def clientServerTest(cfgName = None, additionalServerOptions = "", additionalClientOptions = "", - server = None, client = None, serverenv = None, clientenv = None, - interpreterOptions = ""): - lang = getDefaultMapping() - testdir = os.getcwd() - - # Setup the server. - if lang in ["ruby", "php", "js"]: - serverdir = getMirrorDir(testdir, "cpp") - else: - serverdir = testdir - - if server is None: - server = getDefaultServerFile(serverdir) - elif lang in ["ruby", "php", "js"]: - server = getTestExecutable(server, serverdir) - - if client is None: - client = getDefaultClientFile() - - serverDesc = os.path.basename(server) - clientDesc = os.path.basename(client) - - if lang != "java" and lang != "java-compat": - server = os.path.join(serverdir, server) - - if serverenv is None: - if lang in ["ruby", "php", "js"]: - serverenv = getTestEnv("cpp", serverdir) - else: - serverenv = getTestEnv(lang, serverdir) - - global cross - if len(cross) > 0: - if lang == "js" and cross[0] != lang: - print("** skipping js cross test ") - return - elif len(cross) == 0: - cross.append(lang) - - global controller - global clientHome - for clientLang in cross: - clientCfg = DriverConfig("client") - if clientLang != lang: - if clientDesc != os.path.basename(getDefaultClientFile()): - print("** skipping cross test") - return - - if clientHome: - clientdir = getMirrorDir(getClientCrossTestDir(testdir), clientLang) - else: - clientdir = getMirrorDir(testdir, clientLang) - - client = getDefaultClientFile(clientLang, clientdir) - clientDesc = os.path.basename(client) - clientCfg.lang = clientLang - - if not os.path.exists(clientdir): - print("** no matching test for %s" % clientLang) - return - else: - if clientHome: - clientdir = getClientCrossTestDir(testdir) - else: - clientdir = testdir - if not os.path.exists(clientdir): - print("** no matching test for %s" % clientLang) - return - - if clientLang != "java" and clientLang != "java-compat": - client = os.path.join(clientdir, client) - - if clientenv is None: - clientenv = getTestEnv(clientLang, clientdir) - - clientExe = client - serverExe = server - - if appverifier: - setAppVerifierSettings([clientExe, serverExe]) - if not controller: - sys.stdout.write("starting " + serverDesc + "... ") - sys.stdout.flush() - serverCfg = DriverConfig("server") - if lang in ["ruby", "php", "js"]: - serverCfg.lang = "cpp" - - server = getCommandLine(server, serverCfg, additionalServerOptions, interpreterOptions) - serverProc = spawnServer(server, env = serverenv, lang=serverCfg.lang, mx=serverCfg.mx) - print("ok") - sys.stdout.flush() - - if not serverOnly: - if clientLang == lang: - sys.stdout.write("starting %s... " % clientDesc) - else: - sys.stdout.write("starting %s %s ... " % (clientLang, clientDesc)) - sys.stdout.flush() - if not controller: - cfgName = None - if clientLang == "js" and es5 and client.find("/es5/") == -1: - client = client.replace("test/Ice/", "test/Ice/es5/") - client = client.replace("test/Glacier2/", "test/Glacier2/es5/") - - client = getCommandLine(client, clientCfg, additionalClientOptions, interpreterOptions, cfgName) - clientProc = spawnClient(client, env = clientenv, cwd = clientdir, startReader = False, lang=clientCfg.lang) - print("ok") - - global watchDog - clientProc.startReader(watchDog) - clientProc.waitTestSuccess() - - if not controller: - serverProc.waitTestSuccess() - - if appverifier: - appVerifierAfterTestEnd([clientExe, serverExe]) - -def collocatedTest(additionalOptions = ""): - if controller or serverOnly: - print("** skipping collocated test") - return - lang = getDefaultMapping() - if len(cross) > 0 and cross[0] != lang: - print("** skipping cross test") - return - testdir = os.getcwd() - - collocated = getDefaultCollocatedFile() - if lang != "java" and lang != "java-compat": - collocated = os.path.join(testdir, collocated) - - exe = collocated - if appverifier: - setAppVerifierSettings([exe]) - - env = getTestEnv(lang, testdir) - - sys.stdout.write("starting collocated... ") - sys.stdout.flush() - collocated = getCommandLine(collocated, DriverConfig("colloc"), additionalOptions) - collocatedProc = spawnClient(collocated, env = env, startReader = False, lang=lang) - print("ok") - - global watchDog - collocatedProc.startReader(watchDog) - collocatedProc.waitTestSuccess() - if appverifier: - appVerifierAfterTestEnd([exe]) - -def clientEchoTest(additionalServerOptions = "", additionalClientOptions = "", - server = None, client = None, serverenv = None, clientenv = None): - - lang = getDefaultMapping() - testdir = os.getcwd() - - # Setup the server. - if lang in ["ruby", "php", "js"]: - serverdir = getMappingDir(testdir, "cpp", ["test", "Ice", "echo"]) - else: - serverdir = testdir - - if server is None: - server = getDefaultServerFile(serverdir) - if client is None: - client = getDefaultClientFile() - serverDesc = server - clientDesc = client - - if lang != "java" and lang != "java-compat": - server = os.path.join(serverdir, server) - - if serverenv is None: - if lang in ["ruby", "php", "js"]: - serverenv = getTestEnv("cpp", serverdir) - else: - serverenv = getTestEnv(lang, serverdir) - - global cross - if len(cross) == 0: - cross.append(lang) - - global clientHome - for clientLang in cross: - clientCfg = DriverConfig("client") - if clientLang != lang: - if clientDesc != getDefaultClientFile(): - print("** skipping cross test") - return - - clientCfg.lang = clientLang - client = getDefaultClientFile(clientLang) - if clientHome: - clientdir = getMirrorDir(getClientCrossTestDir(testdir), clientLang) - else: - clientdir = getMirrorDir(testdir, clientLang) - if not os.path.exists(clientdir): - print("** no matching test for %s" % clientLang) - return - else: - if clientHome: - clientdir = getClientCrossTestDir(testdir) - else: - clientdir = testdir - if not os.path.exists(clientdir): - print("** no matching test for %s" % clientLang) - return - - if clientLang != "java" and clientLang != "java-compat": - client = os.path.join(clientdir, client) - - if clientenv is None: - clientenv = getTestEnv(clientLang, clientdir) - - clientExe = client - serverExe = server - - if appverifier: - setAppVerifierSettings([clientExe, serverExe]) - - sys.stdout.write("starting " + serverDesc + "... ") - sys.stdout.flush() - serverCfg = DriverConfig("server") - if lang in ["ruby", "php", "js"]: - serverCfg.lang = "cpp" - server = getCommandLine(server, serverCfg, additionalServerOptions) - serverProc = spawnServer(server, env = serverenv, lang=serverCfg.lang, mx=serverCfg.mx) - print("ok") - sys.stdout.flush() - - if not serverOnly: - if clientLang == lang: - sys.stdout.write("starting %s... " % clientDesc) - else: - sys.stdout.write("starting %s %s ... " % (clientLang, clientDesc)) - sys.stdout.flush() - - if clientLang == "js" and es5 and client.find("/es5/") == -1: - client = client.replace("test/Ice/", "test/Ice/es5/") - - client = getCommandLine(client, clientCfg, additionalClientOptions) - clientProc = spawnClient(client, env = clientenv, startReader = False, lang=clientCfg.lang) - print("ok") - clientProc.startReader() - clientProc.waitTestSuccess() - - serverProc.waitTestSuccess() - - if appverifier: - appVerifierAfterTestEnd([clientExe, serverExe]) - -def cleanDbDir(path): - if os.path.exists(os.path.join(path, "__Freeze", "lock")): - os.remove(os.path.join(path, "__Freeze", "lock")) - if os.path.exists(os.path.join(path, "__Freeze")): - os.rmdir(os.path.join(path, "__Freeze")) - # - # We include __Freeze in this list even though we just removed it - see ICE-5108. - # - ignore = [".gitignore", "DB_CONFIG", "__Freeze"] - for filename in [ os.path.join(path, f) for f in os.listdir(path) if f not in ignore ]: - os.remove(filename) - -def startClient(exe, args = "", config=None, env=None, echo = True, startReader = True, clientConfig = False, iceOptions = None, iceProfile = None): - if config is None: - config = DriverConfig("client") - if env is None: - env = getTestEnv(getDefaultMapping(), os.getcwd()) - interpreterOptions = "" - if config.lang == "php": - interpreterOptions = phpProfileSetup(clientConfig, iceOptions, iceProfile) - - cmd = getCommandLine(exe, config, args, interpreterOptions) - - return spawnClient(cmd, env = env, echo = echo, startReader = startReader, lang=config.lang) - -def startServer(exe, args = "", config = None, env = None, adapter = None, count = 1, echo = True, timeout = 60, - interpreterOptions = ""): - if config is None: - config = DriverConfig("server") - if env is None: - env = getTestEnv(getDefaultMapping(), os.getcwd()) - cmd = getCommandLine(exe, config, args, interpreterOptions) - return spawnServer(cmd, env = env, adapter = adapter, count = count, echo = echo, lang = config.lang, - mx = config.mx, timeout = timeout) - -def startColloc(exe, args, config=None, env=None, interpreterOptions = ""): - exe = quoteArgument(exe) - if config is None: - config = DriverConfig("colloc") - if env is None: - env = getTestEnv(config.lang, testdir) - cmd = getCommandLine(exe, config, args, interpreterOptions) - return spawnClient(cmd, env = env, lang=config.lang) - -def simpleTest(exe = None, options = "", interpreterOptions = ""): - if exe is None: - exe = getDefaultClientFile() - if appverifier: - setAppVerifierSettings([quoteArgument(exe)]) - - testdir = os.getcwd() - - config = DriverConfig("client") - env = getTestEnv(config.lang, testdir) - - sys.stdout.write("starting client... ") - sys.stdout.flush() - command = getCommandLine(exe, config, options, interpreterOptions) - client = spawnClient(command, startReader = False, env = env, lang = config.lang) - print("ok") - client.startReader() - client.waitTestSuccess() - - if appverifier: - appVerifierAfterTestEnd([exe]) - -def createFile(path, lines, enc=None): - if sys.version_info[0] > 2 and enc: - config = open(path, "w", encoding=enc) - else: - config = open(path, "wb") - for l in lines: - config.write("%s\n" % l) - config.close() - -def getCppBinDir(lang = None): - binDir = os.path.join(getIceDir("cpp"), "bin") - - if isWin32(): - binDir = os.path.join(binDir, "x64" if x64 else "Win32", "Debug" if buildMode == "debug" else "Release") - - if isMINGW() and x64: - binDir = os.path.join(binDir, "x64") - if iceHome: - if lang == None: - lang = getDefaultMapping() - if isVC110() and lang != "python": - binDir = os.path.join(binDir, "vc110") - elif isVC140(): - binDir = os.path.join(binDir, "vc140") - if x64: - if isSolaris(): - if isSparc(): - binDir = os.path.join(binDir, "sparcv9") - else: - binDir = os.path.join(binDir, "amd64") - elif isWin32() and lang != "php": - binDir = os.path.join(binDir, "x64") - - return binDir - -def getSliceTranslator(lang = "cpp"): - compiler = "" - if iceHome: - compiler = os.path.join(iceHome, "bin", "slice2%s" % lang) - else: - compiler = os.path.join(getCppBinDir(), ("slice2%s" % lang)) - if isWin32(): - compiler += ".exe" - return compiler - -def getCppLibDir(lang = None): - if isWin32(): - return getCppBinDir(lang) - else: - libDir = os.path.join(getIceDir("cpp"), "lib") - if isUbuntu() or isDebian(): - libDir = os.path.join(libDir, dpkgHostMultiArch()) - elif x64: - if isSolaris(): - if isSparc(): - libDir = os.path.join(libDir, "64") - else: - libDir = os.path.join(libDir, "amd64") - if isLinux(): - libDir = libDir + "64" - return libDir - return None - -def getServiceDir(): - global serviceDir - if serviceDir is None: - if iceHome: - serviceDir = os.path.join(iceHome, "bin") - else: - serviceDir = "C:\\Program Files\ZeroC\Ice-" + iceVersion + "\\bin" - return serviceDir - -def getTestEnv(lang, testdir): - global compact - env = os.environ.copy() - - # - # Jar files from the source of binary distribution - # - iceJARs = ["ice", "glacier2", "freeze", "icebox", "icestorm", "icegrid", "icepatch2", "icediscovery", - "icelocatordiscovery"] - jarSuffix = "-" + ("compat-") if lang == "java-compat" else "" + getIceJsonVersion() + ".jar" - - # First sanitize the environment. - env["CLASSPATH"] = sanitize(os.getenv("CLASSPATH", "")) - - for d in additionalBinDirectories: - addLdPath(d, env) - - # - # Add cpp/test/Common output directory to the env - # - if lang == "cpp": - baseDir = os.path.join(toplevel, "cpp", "test", "Common") - addLdPath(os.path.join(baseDir, getTestDirectory("testcommon", baseDir)), env) - - # Make sure bzip2 can be found by x86 C# builds on x64 platforms - if lang == "csharp" and not x64: - addPathToEnv("PATH", os.path.join(getCppBinDir("csharp"), "x64"), env) - - # Add test directory to env - if lang == "cpp": - addLdPath(os.path.join(testdir), env) - elif lang == "java" or lang == "java-compat": - addClasspath(os.path.join(testToplevel, lang, "lib", "test.jar"), env) - elif lang == "js": - if es5 and testdir.find("/es5/") == -1: - testdir = testdir.replace("test/Ice/", "test/Ice/es5/") - testdir = testdir.replace("test/Glacier2/", "test/Glacier2/es5/") - addPathToEnv("NODE_PATH", os.path.join(testdir), env) - - # NodeJS is always installed locally even when testing against a binary installation - if os.environ.get("USE_BIN_DIST", "no") != "yes": - addPathToEnv("NODE_PATH", os.path.join(getIceDir("js", testdir), "src"), env) - - if isWin32(): - if lang == "java" and javaLibraryPath: - addPathToEnv("PATH", javaLibraryPath, env) - - if lang == "csharp" and not iceHome: - pkgdir = os.path.join(getIceDir("cpp"), "msbuild", "packages") - pkgsubdir = os.path.join("build", "native", "bin", "x64", "Release") - if isVC120(): - addPathToEnv("PATH", os.path.join(pkgdir, "bzip2.v120.1.0.6.4", pkgsubdir), env) - else: - addPathToEnv("PATH", os.path.join(pkgdir, "bzip2.v140.1.0.6.4", pkgsubdir), env) - - # - # If Ice is installed on the system, set the CLASSPATH for Java and - # NODE_PATH for JavaScript - # - if iceHome in ["/usr", "/usr/local"]: - if lang == "java": - javaDir = os.path.join(iceHome, "share", "java") - for jar in iceJARs: - addClasspath(os.path.join(javaDir, jar + jarSuffix), env) - return env # That's it, we're done! - - # - # For Win32 we always need to add the bin dir to the PATH. For - # others we just need to add it for scripting languages that use - # C++ extensions (py, ruby, php) - # - if isWin32(): - if lang == "java": - addLdPath(os.path.join(getIceDir("cpp"), "bin", "x64" if x64 else ""), env) # Add bin for db53_vc100.dll - addLdPath(getCppLibDir(lang), env) - elif isAIX(): - addLdPath(getCppLibDir(lang), env) - elif lang in ["python", "ruby", "php", "js", "objective-c"]: - # C++ binaries use rpath $ORIGIN or similar to find the Ice libraries - addLdPath(getCppLibDir(lang), env) - - if lang == "java": - # The Ice.jar and Freeze.jar comes from the installation - # directory or the toplevel dir. - javaDir = os.path.join(getIceDir("java", testdir), "lib") - for jar in iceJARs: - addClasspath(os.path.join(javaDir, jar + jarSuffix), env) - - # - # On Windows, C# assemblies are found thanks to the .exe.config files. - # - if lang == "csharp": - if compact: - addPathToEnv("DEVPATH", os.path.join(getIceDir("csharp", testdir), "Assemblies", "cf"), env) - elif isWin32(): - addPathToEnv("DEVPATH", os.path.join(getIceDir("csharp", testdir), "Assemblies"), env) - else: - addPathToEnv("MONO_PATH", os.path.join(getIceDir("csharp", testdir), "Assemblies"), env) - - if os.environ.get("USE_BIN_DIST", "no") != "yes": - # - # On Windows x64, set PYTHONPATH to python/x64. - # - if lang == "python": - pythonDir = os.path.join(getIceDir("python", testdir), "python") - if isWin32(): - addPathToEnv("PYTHONPATH", pythonDir, env) - pythonDir = os.path.join(pythonDir, "Win32" if x86 else "x64", "Debug" if buildMode == "debug" else "Release") - addPathToEnv("PYTHONPATH", pythonDir, env) - - # - # If testing with source dist we need to set RUBYLIB - # - if lang == "ruby": - addPathToEnv("RUBYLIB", os.path.join(getIceDir("ruby", testdir), "ruby"), env) - - return env; - -def getTestName(): - lang = getDefaultMapping() - base = os.getcwd() - - if "java" in lang: - # Remove Java's extra directory structure from the path while we search it - base = base.replace(os.path.join("src", "main", "java", "test"), '') - - here = base.split(os.sep) - here.reverse() - for i in range(0, len(here)): - if here[i] == lang: - break - else: - raise RuntimeError("cannot find language dir") - here = here[:i-1] - here.reverse() - # The crossTests list is in UNIX format. - return os.path.join(*here).replace(os.sep, '/') - -def stopWatchDog(): - global watchDog - watchDog.stop() - watchDog.join() - watchDog = None - -def joindog(dog): - dog.stop() - dog.join() - -class WatchDog(threading.Thread): - def __init__(self): - self._resetFlag = False - self._stopFlag = False - self._cv = threading.Condition() - threading.Thread.__init__(self) - - # The thread is marked as a daemon thread. The atexit handler - # joins with the thread on exit. If the thread is not daemon, - # the atexit handler will not be called. - self.setDaemon(True) - self.start() - atexit.register(joindog, self) - - def run(self): - try: - self._cv.acquire() - while True: - self._cv.wait(240) - if self._stopFlag: - break - if self._resetFlag: - self._resetFlag = False - else: - print("\a*** %s Warning: Test has been inactive for 4 minutes and may be hung" % - time.strftime("%x %X")) - self._cv.release() - except: - # - # Exceptions can be raised if the thread is still alive when the interpreter is - # in the process of shutting down. For example, Python resets module objects to None, - # so code such as "time.strftime()" can fail with AttributeError. - # - pass - - def reset(self): - self._cv.acquire() - self._resetFlag = True - self._cv.notify() - self._cv.release() - - def stop(self): - self._cv.acquire() - self._stopFlag = True - self._cv.notify() - self._cv.release() - -def processCmdLine(): - def usage(): - print("usage: " + sys.argv[0] + """ - --debug Display debugging information on each test. - --trace=<file> Display tracing. - --protocol=<prot> Run with the given protocol (tcp|ssl|ws|wss|bt). - --compress Run the tests with protocol compression. - --valgrind Run the tests with valgrind. - --appverifier Run the tests with appverifier. - --host=host Set --Ice.Default.Host=<host>. - --serialize Run with connection serialization. - --ipv6 Use IPv6 addresses. - --socks Use SOCKS proxy running on localhost. - --ice-home=<path> Use the binary distribution from the given path. - --mode=debug|release Run the tests with debug or release mode builds (win32 only)." - --x86 Binary distribution is 32-bit. - --x64 Binary distribution is 64-bit. - --c++11 Binary distribution is c++11. - --es5 Use JavaScript ES5 (Babel compiled code) - --static Binary distribution is static. - --env Print important environment variables. - --cross=lang Run cross language test. - --client-home=<dir> Run cross test clients from the given Ice source distribution. - --service-dir=<dir> Where to locate services for builds without service support. - --compact Ice for .NET uses the Compact Framework. - --winrt Run server with configuration suited for WinRT client. - --server Run only the server. - --mx Enable IceMX when running the tests. - --controller=<host> Use the test controller on the specified host. - --arg=<property> Append the given argument. - """) - sys.exit(2) - - try: - opts, args = getopt.getopt( - sys.argv[1:], "", ["debug", "trace=", "protocol=", "compress", "valgrind", "host=", "serialize", "ipv6", \ - "socks", "ice-home=", "mode=", "x86", "x64", "cross=", "client-home=", "env", \ - "service-dir=", "appverifier", "arg=", \ - "compact", "winrt", "server", "mx", "c++11", "es5", "static", "controller=", "configName="]) - except getopt.GetoptError: - usage() - - if args: - usage() - - global serverOnly - global winrt - global buildMode - for o, a in opts: - if o == "--ice-home": - global iceHome - iceHome = a - elif o == "--mode": - if a not in ( "debug", "release"): - usage() - buildMode = a - elif o == "--cross": - global cross - cross.append(a) - crossLang = ["cpp", "csharp", "java", "java-compat", "js", "php", "python", "ruby", "objective-c"] - if not a in crossLang: - print("cross must be one of %s" % ', '.join(crossLang)) - sys.exit(1) - if getTestName() not in crossTests: - print("*** This test does not support cross language testing") - sys.exit(0) - elif o == "--client-home": - global clientHome - clientHome = a - elif o == "--x64": - global x64 - x64 = True - elif o == "--x86": - global x86 - x86 = True - x64 = False - elif o == "--c++11": - global cpp11 - cpp11 = True - elif o == "--es5": - global es5 - es5 = True - elif o == "--static": - global static - static = True - elif o == "--compress": - global compress - compress = True - elif o == "--serialize": - global serialize - serialize = True - elif o == "--host": - global host - host = a - elif o == "--valgrind": - global valgrind - valgrind = True - elif o == "--appverifier": - if not isWin32() or getDefaultMapping() != "cpp": - print("--appverifier option is only supported for Win32 c++ tests.") - sys.exit(1) - global appverifier - appverifier = True - elif o == "--ipv6": - global ipv6 - ipv6 = True - elif o == "--socks": - global socksProxy - socksProxy = True - if o == "--trace": - global tracefile - if a == "stdout": - tracefile = sys.stdout - else: - tracefile = open(a, "w") - elif o == "--debug": - global debug - debug = True - elif o == "--env": - global printenv - printenv = True - elif o == "--protocol": - if a not in ("bt", "bts", "ws", "wss", "ssl", "tcp"): - usage() - # ssl protocol isn't directly supported with mono. - if mono and getDefaultMapping() == "csharp" and (a == "ssl" or a == "wss"): - print("SSL is not supported with mono") - sys.exit(1) - if a in ["bt", "bts"] and not isLinux(): - print("Bluetooth is only supported on Linux") - sys.exit(1) - global protocol - protocol = a - elif o == "--service-dir": - global serviceDir - serviceDir = a - elif o == "--compact": - global compact - compact = True - elif o == "--winrt": - winrt = True - serverOnly = True - elif o == "--server": - serverOnly = True - elif o == '--arg': - extraArgs.append(a) - elif o == "--mx": - global mx - mx = True - elif o == "--controller": - global controller - controller = a - elif o == "--configName": - global configName - configName = a - if protocol in ["ssl", "wss"] and not serverOnly and getDefaultMapping() == "js": - print("SSL is not supported with Node.js") - sys.exit(1) - - if len(args) > 0: - usage() - - if isWin32() and not buildMode: - print("Error: please define --mode=debug or --mode=release") - sys.exit(1) - - if not os.environ.get("TESTCONTROLLER"): - if iceHome: - sys.stdout.write("*** using Ice installation from " + iceHome + " ") - else: - sys.stdout.write("*** using Ice source dist ") - if armv7l: - sys.stdout.write("(ARMv7)") - elif x64: - sys.stdout.write("(64bit) ") - else: - sys.stdout.write("(32bit) ") - sys.stdout.write("\n") - -def runTests(start, expanded, num = 0, script = False): - total = 0 - for tests in expanded: - for i, args, config in tests: - total = total + 1 - # - # The configs argument is a list containing one or more test configurations. - # - index = 0 - for tests in expanded: - for i, args, config in tests: - index = index + 1 - if index < start: - continue - i = os.path.normpath(i) - - # Deal with Java's different directory structure - if i.find(os.path.join("java","test")) != -1: - dir = os.path.join(testToplevel, "java", "test", "src", "main", i) - elif i.find(os.path.join("java-compat","test")) != -1: - dir = os.path.join(testToplevel, "java-compat", "test", "src", "main", i.replace('-compat','')) - elif es5 and i.find(os.path.join("js","test")) != -1: - dir = os.path.join(testToplevel, i.replace("test/Ice/", "test/Ice/es5/") - .replace("test/Glacier2/", "test/Glacier2/es5/")) - else: - dir = os.path.join(testToplevel, i) - dir = os.path.normpath(dir) - - sys.stdout.write("\n") - if num > 0: - sys.stdout.write("[" + str(num) + "] ") - if script: - prefix = "echo \"" - suffix = "\"" - else: - prefix = "" - suffix = "" - - print("%s*** running tests %d/%d in %s%s" % (prefix, index, total, dir, suffix)) - sys.stdout.write("%s*** configuration: " % prefix) - if len(args.strip()) == 0: - sys.stdout.write("Default ") - else: - sys.stdout.write(args.strip() + " ") - print(suffix) - - if args.find("cross") != -1: - test = os.path.join(*i.split(os.sep)[2:]) - # The crossTests list is in UNIX format. - test = test.replace(os.sep, '/') - if not test in crossTests: - print("%s*** test does not support cross testing%s" % (prefix, suffix)) - continue - - if args.find("es5") != -1 and "noes5" in config: - print("%s*** test not supported with es5%s" % (prefix, suffix)) - continue - - # - # Skip tests not supported with IPv6 if necessary - # - if args.find("ipv6") != -1 and "noipv6" in config: - print("%s*** test not supported with IPv6%s" % (prefix, suffix)) - continue - - if args.find("compress") != -1 and "nocompress" in config: - print("%s*** test not supported with compression%s" % (prefix, suffix)) - continue - - if args.find("socks") != -1 and "nosocks" in config: - print("%s*** test not supported with SOCKS%s" % (prefix, suffix)) - continue - - if args.find("compact") != -1 and \ - ("nocompact" in config or \ - args.find("ssl") != -1 or \ - args.find("compress") != -1): - print("%s*** test not supported with Compact Framework%s" % (prefix, suffix)) - continue - - if args.find("mx") != -1 and "nomx" in config: - print("%s*** test not supported with IceMX enabled%s" % (prefix, suffix)) - continue - - if args.find("compact") == -1 and "compact" in config: - print("%s*** test requires Compact Framework%s" % (prefix, suffix)) - continue - - if isVista() and "novista" in config: - print("%s*** test not supported under Vista%s" % (prefix, suffix)) - continue - - if isDarwin() and "nodarwin" in config: - print("%s*** test not supported under Darwin%s" % (prefix, suffix)) - continue - - if isYocto() and "noyocto" in config: - print("%s*** test not supported under Yocto%s" % (prefix, suffix)) - continue - - if not isWin32() and "win32only" in config: - print("%s*** test only supported under Win32%s" % (prefix, suffix)) - continue - - if isVC100() and "novc100" in config: - print("%s*** test not supported with VC++ 10.0%s" % (prefix, suffix)) - continue - - if cpp11 and "noc++11" in config: - print("%s*** test not supported with C++11%s" % (prefix, suffix)) - continue - - if static and "nostatic" in config: - print("%s*** test not supported with static%s" % (prefix, suffix)) - continue - - if x86 and iceHome and "nomultiarch" in config: - print("%s*** test not supported with x86 in multiarch%s" % (prefix, suffix)) - continue - - if isMINGW() and "nomingw" in config: - print("%s*** test not supported with MINGW%s" % (prefix, suffix)) - continue - - if isWin32() and "nowin32" in config: - print("%s*** test not supported with Win32%s" % (prefix, suffix)) - continue - - # If this is mono and we're running ssl protocol tests - # then skip. This occurs when using --all. - if mono and ("nomono" in config or (i.find(os.path.join("csharp", "test")) != -1 and - (args.find("ssl") != -1 or args.find("wss") != -1))): - print("%s*** test not supported with mono%s" % (prefix, suffix)) - continue - - # - # Skip configurations not supported by node - # - if (i.find(os.path.join("js","test")) != -1 and - ((not serverOnly and (args.find("ssl") != -1 or - args.find("wss") != -1 or - args.find("ws") != -1)) or - args.find("compress") != -1 or - args.find("mx") != -1)): - print("%s*** test not supported with Node.js%s" % (prefix, suffix)) - continue - - if (args.find("ssl") != -1 or args.find("wss") != -1) and ("nossl" in config): - print("%s*** test not supported with IceSSL%s" % (prefix, suffix)) - continue - - if (args.find("bt") != -1 or args.find("bts") != -1) and ("bt" not in config): - print("%s*** test not supported with Bluetooth%s" % (prefix, suffix)) - continue - - if (args.find("ws") != -1 or args.find("wss") != -1) and ("nows" in config): - print("%s*** test not supported with IceWS%s" % (prefix, suffix)) - continue - - # If this is java and we're running ipv6 under windows then skip. - if isWin32() and i.find(os.path.join("java","test")) != -1 and args.find("ipv6") != -1 and \ - getJdkVersion().find("java version \"1.6") != -1: - print("%s*** test not supported under windows%s" % (prefix, suffix)) - continue - - # Skip tests not supported by valgrind - if args.find("valgrind") != -1 and ("novalgrind" in config or args.find("ssl") != -1 or - args.find("wss") != -1): - print("%s*** test not supported with valgrind%s" % (prefix, suffix)) - continue - - # Skip tests not supported by appverifier - if args.find("appverifier") != -1 and ("noappverifier" in config): - print("%s*** test not supported with appverifier%s" % (prefix, suffix)) - continue - - # Skip tests that no not exist for this language mapping - if not os.path.exists(dir): - print("%s*** test does not exist for this language mapping%s" % (prefix, suffix)) - continue - - if script: - print("echo \"*** test started: `date`\"") - print("cd %s" % dir) - else: - print("*** test started: " + time.strftime("%x %X")) - sys.stdout.flush() - os.chdir(dir) - - global keepGoing - if script: - print("if ! %s %s %s; then" % (sys.executable, os.path.join(dir, "run.py"), args)) - print(" echo 'test in %s failed'" % os.path.abspath(dir)) - if not keepGoing: - print(" exit 1") - print("fi") - else: - if isWin32(): - if dir.find(os.path.join("js", "test")) != -1 and es5 and dir.find("\\es5\\") == -1: - dir = dir.replace("test\\Ice\\", "test\\Ice\\es5\\").replace("test\\Glacier2\\", "test\\Glacier2\\es5\\") - else: - if dir.find(os.path.join("js", "test")) != -1 and es5 and dir.find("/es5/") == -1: - dir = dir.replace("test/Ice/", "test/Ice/es5/").replace("test/Glacier2/", "test/Glacier2/es5/") - status = os.system(sys.executable + " " + quoteArgument(os.path.join(dir, "run.py")) + " " + args) - if status: - status = status if isWin32() else (status >> 8) - if(num > 0): - sys.stdout.write("[" + str(num) + "] ") - message = "test in " + os.path.abspath(dir) + " failed with exit status", status, - print(message) - if not keepGoing: - sys.exit(status) - else: - print(" ** Error logged and will be displayed again when suite is completed **") - global testErrors - testErrors.append(message) - -class ClientServerTest: - def __init__(self, cfgName, message, additionalServerOptions, additionalClientOptions, - server, client, serverenv, clientenv, interpreterOptions, localOnly): - if cfgName is None: - cfgName = "default" - self.cfgName = cfgName - self.message = message - self.additionalServerOptions = additionalServerOptions - self.additionalClientOptions = additionalClientOptions - self.server = server - self.client = client - self.serverenv = serverenv - self.clientenv = clientenv - self.interpreterOptions = interpreterOptions - self.localOnly = localOnly - - def getConfigName(self): - return self.cfgName - - def getMessage(self): - return self.message - - def isLocalOnly(self): - return self.localOnly - - def getDefaultMessage(self): - return "Running test with regular server." - - def run(self): - clientServerTest(self.cfgName, self.additionalServerOptions, self.additionalClientOptions, self.server, - self.client, self.serverenv, self.clientenv, self.interpreterOptions) - -def queueClientServerTest(configName = None, message = None, additionalServerOptions = "", - additionalClientOptions = "", server = None, client = None, serverenv = None, - clientenv = None, interpreterOptions = "", localOnly = False): - global queuedTests - queuedTests.append(ClientServerTest(configName, message, additionalServerOptions, additionalClientOptions, server, - client, serverenv, clientenv, interpreterOptions, localOnly)) - -class CollocatedTest: - def __init__(self, message = None, additionalOptions = ""): - self.message = message - self.additionalOptions = additionalOptions - - def getMessage(self): - return self.message - - def isLocalOnly(self): - return True - - def getDefaultMessage(self): - return "Running test with collocated server." - - def run(self): - collocatedTest(self.additionalOptions) - -def queueCollocatedTest(message = None, additionalOptions = ""): - global queuedTests - queuedTests.append(CollocatedTest(message, additionalOptions)) - -def runQueuedTests(): - global queuedTests - global serverOnly - global controller - global configName - - if serverOnly: - name = configName - if not name: - name = "default" - - for t in queuedTests: - if isinstance(t, ClientServerTest) and t.getConfigName() == name: - t.run() - return - - print("no queued test found matching configuration name `" + name + "'") - sys.exit(1) - - tests = [] - for t in queuedTests: - if controller and t.isLocalOnly(): - continue - tests.append(t) - - for t in tests: - msg = t.getMessage() - if msg: - print(msg) - elif len(tests) > 1: - print(t.getDefaultMessage()) - t.run() - -if "ICE_CONFIG" in os.environ: - os.unsetenv("ICE_CONFIG") - -import inspect -frame = inspect.currentframe() -# Move to the top-most frame in the callback. -while frame.f_back is not None: - frame = frame.f_back -if os.path.split(frame.f_code.co_filename)[1] == "run.py": - # If we're not in the test directory, chdir to the correct - # location. - if not os.path.isabs(sys.argv[0]): - d = os.path.join(os.getcwd(), sys.argv[0]) - else: - d = sys.argv[0] - d = os.path.split(d)[0] - if os.path.normpath(d) != os.getcwd(): - os.chdir(d) - processCmdLine() - -def getTestDirectory(name, baseDir = os.getcwd()): - if isWin32(): - buildDir = "msbuild" - platform = "x64" if x64 else "Win32" - if cpp11: - configuration = "Cpp11-Debug" if buildMode == "debug" else "Cpp11-Release" - else: - configuration = "Debug" if buildMode == "debug" else "Release" - else: - buildDir = "build" - if isDarwin(): - platform = "macosx" - elif isUbuntu() or isDebian(): - platform = "x86_64-linux-gnu" if x64 else "i386-linux-gnu" - elif isAIX(): - platform = "ppc64" if x64 else "ppc" - else: - platform = "x64" if x64 else "x86" - configuration = ("cpp11-" if cpp11 else "") + ("static" if static else "shared") - - if os.path.isdir(os.path.join(baseDir, buildDir, name)): - return os.path.join(buildDir, name, platform, configuration) - else: - return os.path.join(buildDir, platform, configuration) - -def getTestExecutable(name, baseDir = os.getcwd()): - return os.path.join(getTestDirectory(name, baseDir), name) - -# -# Used for tests which have Ice as a submodule -# -def setTestToplevel(path): - global testToplevel - testToplevel = path - -# -# Used for Freeze -# -def setJavaLibraryPath(path): - global javaLibraryPath - javaLibraryPath = path |