• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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