Gaudi Framework, version v23r6

Home   Generated: Wed Jan 30 2013
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
TestEnvOps.py
Go to the documentation of this file.
1 '''
2 Created on Jul 12, 2011
3 
4 @author: mplajner
5 '''
6 import unittest
7 import os
8 import shutil
9 from tempfile import mkdtemp
10 
11 from EnvConfig import Variable
12 from EnvConfig import Control
13 
14 # Keep only some Variable processors.
15 saved_processors = Variable.processors
16 Variable.processors = [Variable.EnvExpander,
19 
20 def buildDir(files, rootdir=os.curdir):
21  '''
22  Create a directory structure from the content of files.
23 
24  @param files: a dictionary or list of pairs mapping a filename to the content
25  if the content is a dictionary, recurse
26  @param rootdir: base directory
27  '''
28  if type(files) is dict:
29  files = files.items()
30 
31  # ensure that the root exists (to allow empty directories)
32  if not os.path.exists(rootdir):
33  os.makedirs(rootdir)
34 
35  # create all the entries
36  for filename, data in files:
37  filename = os.path.join(rootdir, filename)
38  if type(data) is dict:
39  buildDir(data, filename)
40  else:
41  d = os.path.dirname(filename)
42  if not os.path.exists(d):
43  os.makedirs(d)
44  f = open(filename, "w")
45  if data:
46  f.write(data)
47  f.close()
48 
49 class TempDir(object):
50  '''
51  Class for easy creation, use and removal of temporary directory structures.
52  '''
53  def __init__(self, files=None):
54  self.tmpdir = mkdtemp()
55  if files is None:
56  files = {}
57  buildDir(files, self.tmpdir)
58 
59  def __del__(self):
60  shutil.rmtree(self.tmpdir, ignore_errors=False)
61 
62  def __call__(self, *args):
63  '''
64  Return the absolute path to a file in the temporary directory.
65  '''
66  return os.path.join(self.tmpdir, *args)
67 
68 class Test(unittest.TestCase):
69 
70 
71  def setUp(self):
72  pass
73 
74  def tearDown(self):
75  pass
76 
77 
78  def testValues(self):
79  '''Test of value appending, prepending, setting, unsetting, removing'''
80  control = Control.Environment()
81 
82  self.assertFalse('MY_PATH' in control.vars())
83  control.append('MY_PATH', 'newValue')
84  self.assertTrue('MY_PATH' in control.vars())
85  var = control.var('MY_PATH')
86 
87  control.append('MY_PATH', 'newValue:secondVal:valval')
88  self.assertTrue(var[len(var)-1] == 'valval')
89 
90  self.assertTrue('newValue' in var)
91  control.remove('MY_PATH', 'newValue')
92  self.assertFalse('newValue' in var)
93 
94  control.prepend('MY_PATH', 'newValue')
95  self.assertTrue('newValue' == var[0])
96 
97  control.set('MY_PATH', 'hi:hello')
98  self.assertTrue(len(var) == 2)
99  self.assertTrue('hi' == var[0])
100 
101  control.unset('MY_PATH')
102  self.assertTrue('MY_PATH' not in control)
103 
104 
105  def testWrite(self):
106  """XML file write and load test"""
107  control = Control.Environment(useAsWriter = True)
108  control.unset('MY_PATH')
109  control.set('MY_PATH', 'set:toDelete')
110  control.append('MY_PATH', 'appended:toDelete')
111  control.prepend('MY_PATH', 'prepended:toDelete')
112  control.remove('MY_PATH', 'toDelete')
113  control.finishXMLinput('testOutputFile.xml')
114 
115  control = Control.Environment()
116  self.assertFalse('MY_PATH' in control.vars())
117  control.loadXML('testOutputFile.xml')
118 
119  self.assertTrue('MY_PATH' in control.vars())
120  var = control.var('MY_PATH')
121  self.assertTrue(var[0] == 'prepended')
122  self.assertTrue(var[1] == 'set')
123  self.assertTrue(var[2] == 'appended')
124  self.assertFalse('toDelete' in var)
125 
126  os.remove('testOutputFile.xml')
127 
128 
129  def testWriteWithList(self):
130  """XML file write and load test"""
131  control = Control.Environment(useAsWriter = True)
132  control.unset('MY_PATH')
133  control.set('MY_PATH', ['set','toDelete'])
134  control.append('MY_PATH', ['appended','toDelete'])
135  control.prepend('MY_PATH', ['prepended','toDelete'])
136  control.remove('MY_PATH', ['toDelete'])
137  control.finishXMLinput('testOutputFile.xml')
138 
139  control = Control.Environment()
140  self.assertFalse('MY_PATH' in control.vars())
141  control.loadXML('testOutputFile.xml')
142 
143  self.assertTrue('MY_PATH' in control.vars())
144  var = control.var('MY_PATH')
145  self.assertTrue(var[0] == 'prepended')
146  self.assertTrue(var[1] == 'set')
147  self.assertTrue(var[2] == 'appended')
148  self.assertFalse('toDelete' in var)
149 
150  os.remove('testOutputFile.xml')
151 
152 
153  def testSaveToXML(self):
154  """XML file write and load test"""
155  control = Control.Environment()
156 
157  control.unset('MY_PATH')
158  control.set('MY_PATH', 'set:toDelete')
159  control.append('MY_PATH', 'appended:toDelete')
160  control.prepend('MY_PATH', 'prepended:toDelete')
161  control.remove('MY_PATH', 'toDelete')
162  control.writeToXMLFile('testOutputFile.xml')
163 
164  control = Control.Environment()
165  self.assertFalse('MY_PATH' in control.vars())
166  control.loadXML('testOutputFile.xml')
167 
168  self.assertTrue('MY_PATH' in control.vars())
169  var = control.var('MY_PATH')
170  self.assertTrue(var[0] == 'prepended')
171  self.assertTrue(var[1] == 'set')
172  self.assertTrue(var[2] == 'appended')
173  self.assertFalse('toDelete' in var)
174 
175  os.remove('testOutputFile.xml')
176 
177  def testSaveToFile(self):
178  '''Test addition of variable to system'''
179  control = Control.Environment()
180 
181  control.append('sysVar', 'newValue:lala')
182  control.writeToFile('setupFile.txt')
183 
184  with open('setupFile.txt', "r") as f:
185  f.readline()
186  stri = f.readline()
187  f.close()
188 
189  self.assertEqual(stri, 'export sysVar=newValue:lala\n')
190 
191  os.remove('setupFile.txt')
192 
193  def testSearch(self):
194  '''Testing searching in variables'''
195  control = Control.Environment()
196 
197  control.append('MY_PATH', 'newValue:mess:something new:aaaabbcc')
198 
199  def count(val, regExp = False):
200  return len(control.search('MY_PATH', val, regExp))
201 
202  self.assertEqual(count('new'), 0)
203  self.assertEqual(count('newValue'), 1)
204 
205  self.assertEqual(count('me', False), 0)
206  self.assertEqual(count('me', True), 2)
207 
208  self.assertEqual(count('cc', False), 0)
209  self.assertEqual(count('cc', True), 1)
210 
211  self.assertEqual(count('a{2}b{2}c{2}', True), 1)
212  self.assertEqual(count('a{2}b{2}', True), 1)
213  self.assertEqual(count('a{1}b{2}c{2}', True), 1)
214  self.assertEqual(count('a{1}b{1}c{2}', True), 0)
215  self.assertEqual(count('a{1,2}b{1,2}c{2}', True), 1)
216  self.assertEqual(count('a{2,3}', True), 1)
217  self.assertEqual(count('a{2,3}?', True), 1)
218 
219  def testVariables(self):
220  '''Tests variables creation and redeclaration.'''
221  control = Control.Environment()
222 
223  control.append('MY_PATH', 'newValue')
224  self.assertFalse(control.var('MY_PATH').local)
225  self.assertTrue(isinstance(control.var('MY_PATH'),Variable.List))
226 
227  control.declare('loc', 'list', True)
228  self.assertTrue(control.var('loc').local)
229  self.assertTrue(isinstance(control.var('loc'),Variable.List))
230 
231  control.declare('myVar2', 'scalar', False)
232  self.assertFalse(control.var('myVar2').local)
233  self.assertTrue(isinstance(control.var('myVar2'),Variable.Scalar))
234 
235  control.declare('loc2', 'scalar', True)
236  self.assertTrue(control.var('loc2').local)
237  self.assertTrue(isinstance(control.var('loc2'),Variable.Scalar))
238 
239  control.declare('MY_PATH', 'list', False)
240  self.failUnlessRaises(Variable.EnvError, control.declare, 'MY_PATH', 'list', True)
241  self.failUnlessRaises(Variable.EnvError, control.declare, 'MY_PATH', 'scalar', True)
242  self.failUnlessRaises(Variable.EnvError, control.declare, 'MY_PATH', 'scalar', True)
243 
244  control.declare('loc', 'list', True)
245  self.failUnlessRaises(Variable.EnvError, control.declare,'loc', 'list', False)
246  self.failUnlessRaises(Variable.EnvError, control.declare,'loc', 'scalar', True)
247  self.failUnlessRaises(Variable.EnvError, control.declare,'loc', 'scalar', True)
248 
249  control.declare('myVar2', 'scalar', False)
250  self.failUnlessRaises(Variable.EnvError, control.declare,'myVar2', 'list', False)
251  self.failUnlessRaises(Variable.EnvError, control.declare,'myVar2', 'list', True)
252  self.failUnlessRaises(Variable.EnvError, control.declare,'myVar2', 'scalar', True)
253 
254  control.declare('loc2', 'scalar', True)
255  self.failUnlessRaises(Variable.EnvError, control.declare,'loc2', 'list', False)
256  self.failUnlessRaises(Variable.EnvError, control.declare,'loc2', 'list', True)
257  self.failUnlessRaises(Variable.EnvError, control.declare,'loc2', 'scalar', False)
258 
259 
260  def testDelete(self):
261  control = Control.Environment()
262 
263  control.append('MY_PATH','myVal:anotherVal:lastVal')
264  control.remove('MY_PATH','anotherVal')
265 
266  self.assertFalse('anotherVal' in control['MY_PATH'])
267  self.assertTrue('myVal' in control['MY_PATH'])
268  self.assertTrue('lastVal' in control['MY_PATH'])
269 
270  control.set('MY_PATH','myVal:anotherVal:lastVal:else')
271  control.remove('MY_PATH', '^anotherVal$', False)
272  self.assertTrue('anotherVal' in control['MY_PATH'])
273  control.remove('MY_PATH', '^anotherVal$', True)
274  self.assertFalse('anotherVal' in control['MY_PATH'])
275  self.assertTrue('myVal' in control['MY_PATH'])
276  self.assertTrue('lastVal' in control['MY_PATH'])
277  self.assertTrue('lastVal' in control['MY_PATH'])
278  control.remove('MY_PATH', 'Val', True)
279  self.assertTrue('else' in control['MY_PATH'])
280  self.assertTrue(len(control['MY_PATH']) == 1)
281 
282 
283  control.declare('myLoc', 'scalar', False)
284  control.append('myLoc','myVal:anotherVal:lastVal')
285  control.remove('myLoc', 'Val:', True)
286  self.assertTrue(str(control['myLoc']) == 'myanotherlastVal')
287 
288 
290  control = Control.Environment()
291 
292  os.environ['MY_PATH'] = '$myVal'
293  os.environ['myScal'] = '$myVal'
294 
295  control.set('ABC','anyValue')
296  control.declare('MY_PATH', 'list', False)
297  control.append('MY_PATH','$ABC')
298  self.assertTrue(control['MY_PATH'].value(True) == '$myVal:anyValue')
299 
300  control.declare('myScal', 'scalar', False)
301  control.append('myScal', '$ABC')
302  self.assertTrue(control['myScal'].value(True) == '$myValanyValue')
303 
304 
305  def testDependencies(self):
306  control = Control.Environment()
307 
308  control.declare('myVar', 'list', False)
309 
310  control.declare('loc', 'list', True)
311  control.append('loc','locVal')
312  control.append('loc','locVal2')
313 
314  control.declare('scal', 'scalar', False)
315  control.append('scal','scalVal')
316  control.append('scal','scalVal2')
317 
318  control.declare('scal2', 'scalar', True)
319  control.append('scal2','locScal')
320  control.append('scal2','locScal2')
321 
322  control.set('myVar', 'newValue:$loc:endValue')
323  self.assertEqual(str(control['myVar']),'newValue:locVal:locVal2:endValue')
324 
325  control.set('myVar', 'newValue:$scal:endValue')
326  self.assertEqual(str(control['myVar']),'newValue:scalValscalVal2:endValue')
327 
328  control.set('myVar', 'new${scal}Value:endValue')
329  self.assertEqual(str(control['myVar']),'newscalValscalVal2Value:endValue')
330 
331  control.set('myVar', 'bla:$myVar:Value')
332  self.assertEqual(str(control['myVar']),'bla:newscalValscalVal2Value:endValue:Value')
333 
334  control.set('scal', 'new${scal2}Value')
335  self.assertEqual(str(control['scal']),'newlocScallocScal2Value')
336 
337  control.set('scal', 'new${loc}Value')
338  self.assertEqual(str(control['scal']),'newlocVal:locVal2Value')
339 
340  control.set('scal2', 'new${scal2}Value')
341  self.assertEqual(str(control['scal2']),'newlocScallocScal2Value')
342 
343  def testInclude(self):
344  tmp = TempDir({'first.xml':
345 '''<?xml version="1.0" ?>
346 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
347 <env:set variable="main">first</env:set>
348 <env:append variable="test_path">data1</env:append>
349 <env:include>first_inc.xml</env:include>
350 </env:config>''',
351  'second.xml':
352 '''<?xml version="1.0" ?>
353 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
354 <env:set variable="main">second</env:set>
355 <env:include>second_inc.xml</env:include>
356 <env:append variable="test_path">data1</env:append>
357 </env:config>''',
358  'third.xml':
359 '''<?xml version="1.0" ?>
360 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
361 <env:set variable="main">third</env:set>
362 <env:append variable="test_path">data1</env:append>
363 <env:include>subdir/first_inc.xml</env:include>
364 </env:config>''',
365  'fourth.xml':
366 '''<?xml version="1.0" ?>
367 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
368 <env:set variable="main">fourth</env:set>
369 <env:include hints="subdir2">fourth_inc.xml</env:include>
370 </env:config>''',
371  'recursion.xml':
372 '''<?xml version="1.0" ?>
373 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
374 <env:set variable="main">recursion</env:set>
375 <env:include>recursion.xml</env:include>
376 </env:config>''',
377  'first_inc.xml':
378 '''<?xml version="1.0" ?>
379 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
380 <env:append variable="test_path">data2</env:append>
381 <env:append variable="derived">another_${main}</env:append>
382 </env:config>''',
383  'subdir': {'second_inc.xml':
384 '''<?xml version="1.0" ?>
385 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
386 <env:append variable="test_path">data0</env:append>
387 <env:set variable="map">this_is_second_inc</env:set>
388 </env:config>''',
389  'first_inc.xml':
390 '''<?xml version="1.0" ?>
391 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
392 <env:append variable="derived">second_${main}</env:append>
393 </env:config>''',
394  'fourth_inc.xml':
395 '''<?xml version="1.0" ?>
396 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
397 <env:append variable="included">from subdir</env:append>
398 </env:config>''',},
399  'subdir2': {'fourth_inc.xml':
400 '''<?xml version="1.0" ?>
401 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
402 <env:append variable="included">from subdir2</env:append>
403 </env:config>''',}})
404 
405  if 'ENVXMLPATH' in os.environ:
406  del os.environ['ENVXMLPATH']
407  control = Control.Environment(searchPath=[])
408 
409  #self.assertRaises(OSError, control.loadXML, tmp('first.xml'))
410  control.loadXML(tmp('first.xml'))
411  self.assertEqual(str(control['main']), 'first')
412  self.assertEqual(str(control['test_path']), 'data1:data2')
413  self.assertEqual(str(control['derived']), 'another_first')
414 
415  control = Control.Environment(searchPath=[tmp()])
416  control.loadXML(tmp('first.xml'))
417  self.assertEqual(str(control['main']), 'first')
418  self.assertEqual(str(control['test_path']), 'data1:data2')
419  self.assertEqual(str(control['derived']), 'another_first')
420 
421  control = Control.Environment(searchPath=[tmp()])
422  control.loadXML('first.xml')
423  self.assertEqual(str(control['main']), 'first')
424  self.assertEqual(str(control['test_path']), 'data1:data2')
425  self.assertEqual(str(control['derived']), 'another_first')
426 
427  control = Control.Environment(searchPath=[tmp()])
428  self.assertRaises(OSError, control.loadXML, tmp('second.xml'))
429 
430  control = Control.Environment(searchPath=[tmp(), tmp('subdir')])
431  control.loadXML(tmp('second.xml'))
432  self.assertEqual(str(control['main']), 'second')
433  self.assertEqual(str(control['test_path']), 'data0:data1')
434  self.assertEqual(str(control['map']), 'this_is_second_inc')
435 
436  control = Control.Environment(searchPath=[tmp(), tmp('subdir')])
437  control.loadXML(tmp('first.xml'))
438  self.assertEqual(str(control['main']), 'first')
439  self.assertEqual(str(control['test_path']), 'data1:data2')
440  self.assertEqual(str(control['derived']), 'another_first')
441 
442  control = Control.Environment(searchPath=[tmp('subdir'), tmp()])
443  control.loadXML(tmp('first.xml'))
444  self.assertEqual(str(control['main']), 'first')
445  self.assertEqual(str(control['test_path']), 'data1:data2')
446  self.assertEqual(str(control['derived']), 'another_first')
447 
448  control = Control.Environment(searchPath=[tmp('subdir'), tmp()])
449  control.loadXML('first.xml')
450  self.assertEqual(str(control['main']), 'first')
451  self.assertEqual(str(control['test_path']), 'data1:data2')
452  self.assertEqual(str(control['derived']), 'another_first')
453 
454  os.environ['ENVXMLPATH'] = os.pathsep.join([tmp(), tmp('subdir')])
455  control = Control.Environment(searchPath=[])
456  control.loadXML(tmp('second.xml'))
457  self.assertEqual(str(control['main']), 'second')
458  self.assertEqual(str(control['test_path']), 'data0:data1')
459  self.assertEqual(str(control['map']), 'this_is_second_inc')
460  del os.environ['ENVXMLPATH']
461 
462  control = Control.Environment(searchPath=[])
463  control.loadXML(tmp('third.xml'))
464  self.assertEqual(str(control['main']), 'third')
465  self.assertEqual(str(control['test_path']), 'data1')
466  self.assertEqual(str(control['derived']), 'second_third')
467 
468  control = Control.Environment(searchPath=[tmp('subdir')])
469  control.loadXML(tmp('fourth.xml'))
470  self.assertEqual(str(control['main']), 'fourth')
471  self.assertEqual(str(control['included']), 'from subdir')
472 
473  control = Control.Environment(searchPath=[])
474  control.loadXML(tmp('fourth.xml'))
475  self.assertEqual(str(control['main']), 'fourth')
476  self.assertEqual(str(control['included']), 'from subdir2')
477 
478  control = Control.Environment(searchPath=[])
479  #self.assertRaises(OSError, control.loadXML, tmp('first.xml'))
480  control.loadXML(tmp('recursion.xml'))
481 
482 
483  def testFileDir(self):
484  tmp = TempDir({'env.xml':
485 '''<?xml version="1.0" ?>
486 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
487 <env:set variable="mydirs">${.}</env:set>
488 <env:set variable="myparent">${.}/..</env:set>
489 </env:config>'''})
490 
491  control = Control.Environment()
492  control.loadXML(tmp('env.xml'))
493  self.assertEqual(str(control['mydirs']), tmp())
494  self.assertEqual(str(control['myparent']), os.path.dirname(tmp()))
495 
496  olddir = os.getcwd()
497  os.chdir(tmp())
498  try:
499  control = Control.Environment()
500  control.loadXML('env.xml')
501  self.assertEqual(str(control['mydirs']), tmp())
502  self.assertEqual(str(control['myparent']), os.path.dirname(tmp()))
503  finally:
504  os.chdir(olddir)
505 
506  def testDefaults(self):
507  tmp = TempDir({'env.xml':
508 '''<?xml version="1.0" ?>
509 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
510 <env:default variable="var1">value1</env:default>
511 <env:declare variable="var2" local="true" />
512 <env:default variable="var2">test2</env:default>
513 </env:config>'''})
514 
515  if 'var1' in os.environ:
516  del os.environ['var1']
517  control = Control.Environment()
518  control.loadXML(tmp('env.xml'))
519  self.assertEqual(str(control['var1']), "value1")
520  self.assertEqual(str(control['var2']), "test2")
521 
522  os.environ['var1'] = "some_value"
523  control = Control.Environment()
524  control.loadXML(tmp('env.xml'))
525  self.assertEqual(str(control['var1']), "some_value")
526  self.assertEqual(str(control['var2']), "test2")
527 
528 
530  l = Variable.List('PATH')
531 
532  l.set("/usr/bin:/some//strange/../nice/./location")
533  assert l.value(asString=True) == "/usr/bin:/some/nice/location"
534 
535  l.append("/another/path")
536  assert l.value(asString=True) == "/usr/bin:/some/nice/location:/another/path"
537 
538  # duplicates removal
539  l.append("/usr/bin")
540  assert l.value(asString=True) == "/usr/bin:/some/nice/location:/another/path"
541  l.prepend("/another/path")
542  assert l.value(asString=True) == "/another/path:/usr/bin:/some/nice/location"
543 
544  s = Variable.Scalar('VAR')
545 
546  s.set("/usr/bin")
547  assert s.value(asString=True) == "/usr/bin"
548 
549  s.set("/some//strange/../nice/./location")
550  assert s.value(asString=True) == "/some/nice/location"
551 
552  # This is undefined
553  # l.set("http://cern.ch")
554 
555  s.set("http://cern.ch")
556  assert s.value(asString=True) == "http://cern.ch"
557 
558 if __name__ == "__main__":
559  #import sys;sys.argv = ['', 'Test.testName']
560  unittest.main()

Generated at Wed Jan 30 2013 17:13:37 for Gaudi Framework, version v23r6 by Doxygen version 1.8.2 written by Dimitri van Heesch, © 1997-2004