1 #!/usr/bin/python 2 3 # Copyright 2012 Jurko Gospodnetic 4 # Distributed under the Boost Software License, Version 1.0. 5 # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) 6 7 # Temporarily enabled dummy test that always fails and is used to collect 8 # extra debugging information from Boost Build test runner sites. 9 10 import BoostBuild 11 12 import os 13 import re 14 import sys 15 16 17 ############################################################################### 18 # 19 # Public interface. 20 # 21 ############################################################################### 22 23 def collectDebugInfo(): 24 t = _init() 25 26 global tag 27 28 tag = "Python version" 29 try: 30 _info(sys.version) 31 except: 32 _info_exc() 33 34 tag = "Python platform" 35 try: 36 _info(sys.platform) 37 except: 38 _info_exc() 39 40 tag = "Boost Jam/Build version" 41 try: 42 _infoX(_getJamVersionInfo(t)) 43 except: 44 _info_exc() 45 46 #_collectDebugInfo_environ() 47 48 # Report prepared annotations. 49 t.fail_test(1, dump_difference=False, dump_stdio=False, dump_stack=False) 50 51 52 ############################################################################### 53 # 54 # Private interface. 55 # 56 ############################################################################### 57 58 varSeparator = "###$^%~~~" 59 60 61 def _collect(results, prefix, name, t): 62 results.append("%s - %s - os.getenv(): %r" % (prefix, name, os.getenv( 63 name))) 64 results.append("%s - %s - os.environ.get(): %r" % (prefix, name, 65 os.environ.get(name))) 66 external_values = _getExternalValues(t, name) 67 results.append("%s - %s - external: %r" % (prefix, name, 68 external_values[name])) 69 70 71 def _collectDebugInfo_environ(t): 72 dummyVars = ["WOOF_WOOFIE_%d" % x for x in range(4)] 73 global tag 74 75 tag = "XXX in os.environ" 76 try: 77 def f(name): 78 return "%s: %s" % (name, name in os.environ) 79 _infoX(f(x) for x in dummyVars) 80 except: 81 _info_exc() 82 83 tag = "os.environ[XXX]" 84 try: 85 def f(name): 86 try: 87 result = os.environ[name] 88 except: 89 result = _str_exc() 90 return "%s: %r" % (name, result) 91 _infoX(f(x) for x in dummyVars) 92 except: 93 _info_exc() 94 95 tag = "os.environ.get(XXX)" 96 try: 97 def f(name): 98 return "%s: %r" % (name, os.environ.get(name)) 99 _infoX(f(x) for x in dummyVars) 100 except: 101 _info_exc() 102 103 tag = "os.getenv(XXX)" 104 try: 105 def f(name): 106 return "%s: %r" % (name, os.getenv(name)) 107 _infoX(f(x) for x in dummyVars) 108 except: 109 _info_exc() 110 111 name = dummyVars[0] 112 value = "foo" 113 tag = "os.putenv(%s) to %r" % (name, value) 114 try: 115 results = [] 116 _collect(results, "before", name, t) 117 os.putenv(name, value) 118 _collect(results, "after", name, t) 119 _infoX(results) 120 except: 121 _info_exc() 122 123 name = dummyVars[1] 124 value = "bar" 125 tag = "os.environ[%s] to %r" % (name, value) 126 try: 127 results = [] 128 _collect(results, "before", name, t) 129 os.environ[name] = value 130 _collect(results, "after", name, t) 131 _infoX(results) 132 except: 133 _info_exc() 134 135 name = dummyVars[1] 136 value = "baz" 137 tag = "os.putenv(%s) to %r" % (name, value) 138 try: 139 results = [] 140 _collect(results, "before", name, t) 141 os.putenv(name, value) 142 _collect(results, "after", name, t) 143 _infoX(results) 144 except: 145 _info_exc() 146 147 name = dummyVars[1] 148 value = "" 149 tag = "os.putenv(%s) to %r" % (name, value) 150 try: 151 results = [] 152 _collect(results, "before", name, t) 153 os.putenv(name, value) 154 _collect(results, "after", name, t) 155 _infoX(results) 156 except: 157 _info_exc() 158 159 name = dummyVars[2] 160 value = "foo" 161 tag = "os.unsetenv(%s) from %r" % (name, value) 162 try: 163 results = [] 164 os.environ[name] = value 165 _collect(results, "before", name, t) 166 os.unsetenv(name) 167 _collect(results, "after", name, t) 168 _infoX(results) 169 except: 170 _info_exc() 171 172 name = dummyVars[2] 173 value = "foo" 174 tag = "del os.environ[%s] from %r" % (name, value) 175 try: 176 results = [] 177 os.environ[name] = value 178 _collect(results, "before", name, t) 179 del os.environ[name] 180 _collect(results, "after", name, t) 181 _infoX(results) 182 except: 183 _info_exc() 184 185 name = dummyVars[2] 186 value = "foo" 187 tag = "os.environ.pop(%s) from %r" % (name, value) 188 try: 189 results = [] 190 os.environ[name] = value 191 _collect(results, "before", name, t) 192 os.environ.pop(name) 193 _collect(results, "after", name, t) 194 _infoX(results) 195 except: 196 _info_exc() 197 198 name = dummyVars[2] 199 value1 = "foo" 200 value2 = "" 201 tag = "os.environ[%s] to %r from %r" % (name, value2, value1) 202 try: 203 results = [] 204 os.environ[name] = value1 205 _collect(results, "before", name, t) 206 os.environ[name] = value2 207 _collect(results, "after", name, t) 208 _infoX(results) 209 except: 210 _info_exc() 211 212 name = dummyVars[3] 213 value = '""' 214 tag = "os.environ[%s] to %r" % (name, value) 215 try: 216 results = [] 217 _collect(results, "before", name, t) 218 os.environ[name] = value 219 _collect(results, "after", name, t) 220 _infoX(results) 221 except: 222 _info_exc() 223 224 225 def _getExternalValues(t, *args): 226 t.run_build_system(["---var-name=%s" % x for x in args]) 227 result = dict() 228 for x in args: 229 m = re.search(r"^\*\*\*ENV\*\*\* %s: '(.*)' \*\*\*$" % x, t.stdout(), 230 re.MULTILINE) 231 if m: 232 result[x] = m.group(1) 233 else: 234 result[x] = None 235 return result 236 237 238 def _getJamVersionInfo(t): 239 result = [] 240 241 # JAM version variables. 242 t.run_build_system(["---version"]) 243 for m in re.finditer(r"^\*\*\*VAR\*\*\* ([^:]*): (.*)\*\*\*$", t.stdout(), 244 re.MULTILINE): 245 name = m.group(1) 246 value = m.group(2) 247 if not value: 248 value = [] 249 elif value[-1] == ' ': 250 value = value[:-1].split(varSeparator) 251 else: 252 value = "!!!INVALID!!! - '%s'" % value 253 result.append("%s = %s" % (name, value)) 254 result.append("") 255 256 # bjam -v output. 257 t.run_build_system(["-v"]) 258 result.append("--- output for 'bjam -v' ---") 259 result.append(t.stdout()) 260 261 # bjam --version output. 262 t.run_build_system(["--version"], status=1) 263 result.append("--- output for 'bjam --version' ---") 264 result.append(t.stdout()) 265 266 return result 267 268 269 def _init(): 270 toolsetName = "__myDummyToolset__" 271 272 t = BoostBuild.Tester(["toolset=%s" % toolsetName], pass_toolset=False, 273 use_test_config=False) 274 275 # Prepare a dummy toolset so we do not get errors in case the default one 276 # is not found. 277 t.write(toolsetName + ".jam", """\ 278 import feature ; 279 feature.extend toolset : %s ; 280 rule init ( ) { } 281 """ % toolsetName ) 282 283 # Python version of the same dummy toolset. 284 t.write(toolsetName + ".py", """\ 285 from b2.build import feature 286 feature.extend('toolset', ['%s']) 287 def init(): pass 288 """ % toolsetName ) 289 290 t.write("jamroot.jam", """\ 291 import os ; 292 .argv = [ modules.peek : ARGV ] ; 293 local names = [ MATCH ^---var-name=(.*) : $(.argv) ] ; 294 for x in $(names) 295 { 296 value = [ os.environ $(x) ] ; 297 ECHO ***ENV*** $(x): '$(value)' *** ; 298 } 299 if ---version in $(.argv) 300 { 301 for x in JAMVERSION JAM_VERSION JAMUNAME JAM_TIMESTAMP_RESOLUTION OS 302 { 303 v = [ modules.peek : $(x) ] ; 304 ECHO ***VAR*** $(x): "$(v:J=%s)" *** ; 305 } 306 } 307 """ % varSeparator) 308 309 return t 310 311 312 def _info(*values): 313 values = list(values) + [""] 314 BoostBuild.annotation(tag, "\n".join(str(x) for x in values)) 315 316 317 def _infoX(values): 318 _info(*values) 319 320 321 def _info_exc(): 322 _info(_str_exc()) 323 324 325 def _str_exc(): 326 exc_type, exc_value = sys.exc_info()[0:2] 327 if exc_type is None: 328 exc_type_name = "None" 329 else: 330 exc_type_name = exc_type.__name__ 331 return "*** EXCEPTION *** %s - %s ***" % (exc_type_name, exc_value) 332 333 334 ############################################################################### 335 # 336 # main() 337 # ------ 338 # 339 ############################################################################### 340 341 collectDebugInfo() 342