mirror of
https://github.com/boostorg/build.git
synced 2026-02-14 00:32:11 +00:00
Related changes: * BoostBuild.Tester & TestCmd.TestCmd interfaces now accept external process parameters as a list of strings, thus avoiding problems with parsing arguments containing spaces. * Avoided a potential process hang in case an external process being run prints out enough output to fill up the OS's pipe buffer (OS would pause the process until someone read the data from the pipe but the testing framework would not do this until the process in question had terminated). [SVN r79448]
342 lines
8.2 KiB
Python
Executable File
342 lines
8.2 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
# Copyright 2012 Jurko Gospodnetic
|
|
# Distributed under the Boost Software License, Version 1.0.
|
|
# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
# Temporarily enabled dummy test that always fails and is used to collect
|
|
# extra debugging information from Boost Build test runner sites.
|
|
|
|
import BoostBuild
|
|
|
|
import os
|
|
import re
|
|
import sys
|
|
|
|
|
|
###############################################################################
|
|
#
|
|
# Public interface.
|
|
#
|
|
###############################################################################
|
|
|
|
def collectDebugInfo():
|
|
t = _init()
|
|
|
|
global tag
|
|
|
|
tag = "Python version"
|
|
try:
|
|
_info(sys.version)
|
|
except:
|
|
_info_exc()
|
|
|
|
tag = "Python platform"
|
|
try:
|
|
_info(sys.platform)
|
|
except:
|
|
_info_exc()
|
|
|
|
tag = "Boost Jam/Build version"
|
|
try:
|
|
_infoX(_getJamVersionInfo(t))
|
|
except:
|
|
_info_exc()
|
|
|
|
#_collectDebugInfo_environ()
|
|
|
|
# Report prepared annotations.
|
|
t.fail_test(1, dump_difference=False, dump_stdio=False, dump_stack=False)
|
|
|
|
|
|
###############################################################################
|
|
#
|
|
# Private interface.
|
|
#
|
|
###############################################################################
|
|
|
|
varSeparator = "###$^%~~~"
|
|
|
|
|
|
def _collect(results, prefix, name, t):
|
|
results.append("%s - %s - os.getenv(): %r" % (prefix, name, os.getenv(
|
|
name)))
|
|
results.append("%s - %s - os.environ.get(): %r" % (prefix, name,
|
|
os.environ.get(name)))
|
|
external_values = _getExternalValues(t, name)
|
|
results.append("%s - %s - external: %r" % (prefix, name,
|
|
external_values[name]))
|
|
|
|
|
|
def _collectDebugInfo_environ(t):
|
|
dummyVars = ["WOOF_WOOFIE_%d" % x for x in xrange(4)]
|
|
global tag
|
|
|
|
tag = "XXX in os.environ"
|
|
try:
|
|
def f(name):
|
|
return "%s: %s" % (name, name in os.environ)
|
|
_infoX(f(x) for x in dummyVars)
|
|
except:
|
|
_info_exc()
|
|
|
|
tag = "os.environ[XXX]"
|
|
try:
|
|
def f(name):
|
|
try:
|
|
result = os.environ[name]
|
|
except:
|
|
result = _str_exc()
|
|
return "%s: %r" % (name, result)
|
|
_infoX(f(x) for x in dummyVars)
|
|
except:
|
|
_info_exc()
|
|
|
|
tag = "os.environ.get(XXX)"
|
|
try:
|
|
def f(name):
|
|
return "%s: %r" % (name, os.environ.get(name))
|
|
_infoX(f(x) for x in dummyVars)
|
|
except:
|
|
_info_exc()
|
|
|
|
tag = "os.getenv(XXX)"
|
|
try:
|
|
def f(name):
|
|
return "%s: %r" % (name, os.getenv(name))
|
|
_infoX(f(x) for x in dummyVars)
|
|
except:
|
|
_info_exc()
|
|
|
|
name = dummyVars[0]
|
|
value = "foo"
|
|
tag = "os.putenv(%s) to %r" % (name, value)
|
|
try:
|
|
results = []
|
|
_collect(results, "before", name, t)
|
|
os.putenv(name, value)
|
|
_collect(results, "after", name, t)
|
|
_infoX(results)
|
|
except:
|
|
_info_exc()
|
|
|
|
name = dummyVars[1]
|
|
value = "bar"
|
|
tag = "os.environ[%s] to %r" % (name, value)
|
|
try:
|
|
results = []
|
|
_collect(results, "before", name, t)
|
|
os.environ[name] = value
|
|
_collect(results, "after", name, t)
|
|
_infoX(results)
|
|
except:
|
|
_info_exc()
|
|
|
|
name = dummyVars[1]
|
|
value = "baz"
|
|
tag = "os.putenv(%s) to %r" % (name, value)
|
|
try:
|
|
results = []
|
|
_collect(results, "before", name, t)
|
|
os.putenv(name, value)
|
|
_collect(results, "after", name, t)
|
|
_infoX(results)
|
|
except:
|
|
_info_exc()
|
|
|
|
name = dummyVars[1]
|
|
value = ""
|
|
tag = "os.putenv(%s) to %r" % (name, value)
|
|
try:
|
|
results = []
|
|
_collect(results, "before", name, t)
|
|
os.putenv(name, value)
|
|
_collect(results, "after", name, t)
|
|
_infoX(results)
|
|
except:
|
|
_info_exc()
|
|
|
|
name = dummyVars[2]
|
|
value = "foo"
|
|
tag = "os.unsetenv(%s) from %r" % (name, value)
|
|
try:
|
|
results = []
|
|
os.environ[name] = value
|
|
_collect(results, "before", name, t)
|
|
os.unsetenv(name)
|
|
_collect(results, "after", name, t)
|
|
_infoX(results)
|
|
except:
|
|
_info_exc()
|
|
|
|
name = dummyVars[2]
|
|
value = "foo"
|
|
tag = "del os.environ[%s] from %r" % (name, value)
|
|
try:
|
|
results = []
|
|
os.environ[name] = value
|
|
_collect(results, "before", name, t)
|
|
del os.environ[name]
|
|
_collect(results, "after", name, t)
|
|
_infoX(results)
|
|
except:
|
|
_info_exc()
|
|
|
|
name = dummyVars[2]
|
|
value = "foo"
|
|
tag = "os.environ.pop(%s) from %r" % (name, value)
|
|
try:
|
|
results = []
|
|
os.environ[name] = value
|
|
_collect(results, "before", name, t)
|
|
os.environ.pop(name)
|
|
_collect(results, "after", name, t)
|
|
_infoX(results)
|
|
except:
|
|
_info_exc()
|
|
|
|
name = dummyVars[2]
|
|
value1 = "foo"
|
|
value2 = ""
|
|
tag = "os.environ[%s] to %r from %r" % (name, value2, value1)
|
|
try:
|
|
results = []
|
|
os.environ[name] = value1
|
|
_collect(results, "before", name, t)
|
|
os.environ[name] = value2
|
|
_collect(results, "after", name, t)
|
|
_infoX(results)
|
|
except:
|
|
_info_exc()
|
|
|
|
name = dummyVars[3]
|
|
value = '""'
|
|
tag = "os.environ[%s] to %r" % (name, value)
|
|
try:
|
|
results = []
|
|
_collect(results, "before", name, t)
|
|
os.environ[name] = value
|
|
_collect(results, "after", name, t)
|
|
_infoX(results)
|
|
except:
|
|
_info_exc()
|
|
|
|
|
|
def _getExternalValues(t, *args):
|
|
t.run_build_system(["---var-name=%s" % x for x in args])
|
|
result = dict()
|
|
for x in args:
|
|
m = re.search(r"^\*\*\*ENV\*\*\* %s: '(.*)' \*\*\*$" % x, t.stdout(),
|
|
re.MULTILINE)
|
|
if m:
|
|
result[x] = m.group(1)
|
|
else:
|
|
result[x] = None
|
|
return result
|
|
|
|
|
|
def _getJamVersionInfo(t):
|
|
result = []
|
|
|
|
# JAM version variables.
|
|
t.run_build_system(["---version"])
|
|
for m in re.finditer(r"^\*\*\*VAR\*\*\* ([^:]*): (.*)\*\*\*$", t.stdout(),
|
|
re.MULTILINE):
|
|
name = m.group(1)
|
|
value = m.group(2)
|
|
if not value:
|
|
value = []
|
|
elif value[-1] == ' ':
|
|
value = value[:-1].split(varSeparator)
|
|
else:
|
|
value = "!!!INVALID!!! - '%s'" % value
|
|
result.append("%s = %s" % (name, value))
|
|
result.append("")
|
|
|
|
# bjam -v output.
|
|
t.run_build_system(["-v"])
|
|
result.append("--- output for 'bjam -v' ---")
|
|
result.append(t.stdout())
|
|
|
|
# bjam --version output.
|
|
t.run_build_system(["--version"], status=1)
|
|
result.append("--- output for 'bjam --version' ---")
|
|
result.append(t.stdout())
|
|
|
|
return result
|
|
|
|
|
|
def _init():
|
|
toolsetName = "__myDummyToolset__"
|
|
|
|
t = BoostBuild.Tester(["toolset=%s" % toolsetName], pass_toolset=False,
|
|
use_test_config=False)
|
|
|
|
# Prepare a dummy toolset so we do not get errors in case the default one
|
|
# is not found.
|
|
t.write(toolsetName + ".jam", """\
|
|
import feature ;
|
|
feature.extend toolset : %s ;
|
|
rule init ( ) { }
|
|
""" % toolsetName )
|
|
|
|
# Python version of the same dummy toolset.
|
|
t.write(toolsetName + ".py", """\
|
|
from b2.build import feature
|
|
feature.extend('toolset', ['%s'])
|
|
def init(): pass
|
|
""" % toolsetName )
|
|
|
|
t.write("jamroot.jam", """\
|
|
import os ;
|
|
.argv = [ modules.peek : ARGV ] ;
|
|
local names = [ MATCH ^---var-name=(.*) : $(.argv) ] ;
|
|
for x in $(names)
|
|
{
|
|
value = [ os.environ $(x) ] ;
|
|
ECHO ***ENV*** $(x): '$(value)' *** ;
|
|
}
|
|
if ---version in $(.argv)
|
|
{
|
|
for x in JAMVERSION JAM_VERSION JAMUNAME
|
|
{
|
|
v = [ modules.peek : $(x) ] ;
|
|
ECHO ***VAR*** $(x): "$(v:J=%s)" *** ;
|
|
}
|
|
}
|
|
""" % varSeparator)
|
|
|
|
return t
|
|
|
|
|
|
def _info(*values):
|
|
values = list(values) + [""]
|
|
BoostBuild.annotation(tag, "\n".join(str(x) for x in values))
|
|
|
|
|
|
def _infoX(values):
|
|
_info(*values)
|
|
|
|
|
|
def _info_exc():
|
|
_info(_str_exc())
|
|
|
|
|
|
def _str_exc():
|
|
exc_type, exc_value = sys.exc_info()[0:2]
|
|
if exc_type is None:
|
|
exc_type_name = "None"
|
|
else:
|
|
exc_type_name = exc_type.__name__
|
|
return "*** EXCEPTION *** %s - %s ***" % (exc_type_name, exc_value)
|
|
|
|
|
|
###############################################################################
|
|
#
|
|
# main()
|
|
# ------
|
|
#
|
|
###############################################################################
|
|
|
|
collectDebugInfo()
|