2 Created on Jul 12, 2011
10 from tempfile
import mkdtemp
12 from EnvConfig
import Variable
13 from EnvConfig
import Control
16 saved_processors = Variable.processors
23 Create a directory structure from the content of files.
25 @param files: a dictionary or list of pairs mapping a filename to the content
26 if the content is a dictionary, recurse
27 @param rootdir: base directory
29 if type(files)
is dict:
33 if not os.path.exists(rootdir):
37 for filename, data
in files:
38 filename = os.path.join(rootdir, filename)
39 if type(data)
is dict:
42 d = os.path.dirname(filename)
43 if not os.path.exists(d):
45 f = open(filename,
"w")
52 Class for easy creation, use and removal of temporary directory structures.
61 shutil.rmtree(self.
tmpdir, ignore_errors=
False)
65 Return the absolute path to a file in the temporary directory.
67 return os.path.join(self.
tmpdir, *args)
69 class Test(unittest.TestCase):
80 '''Test of value appending, prepending, setting, unsetting, removing'''
83 self.assertFalse(
'MY_PATH' in control.vars())
84 control.append(
'MY_PATH',
'newValue')
85 self.assertTrue(
'MY_PATH' in control.vars())
86 var = control.var(
'MY_PATH')
88 control.append(
'MY_PATH',
'newValue:secondVal:valval')
89 self.assertTrue(var[len(var)-1] ==
'valval')
91 self.assertTrue(
'newValue' in var)
92 control.remove(
'MY_PATH',
'newValue')
93 self.assertFalse(
'newValue' in var)
95 control.prepend(
'MY_PATH',
'newValue')
96 self.assertTrue(
'newValue' == var[0])
98 control.set(
'MY_PATH',
'hi:hello')
99 self.assertTrue(len(var) == 2)
100 self.assertTrue(
'hi' == var[0])
102 control.unset(
'MY_PATH')
103 self.assertTrue(
'MY_PATH' not in control)
107 """XML file write and load test"""
109 control.unset(
'MY_PATH')
110 control.set(
'MY_PATH',
'set:toDelete')
111 control.append(
'MY_PATH',
'appended:toDelete')
112 control.prepend(
'MY_PATH',
'prepended:toDelete')
113 control.remove(
'MY_PATH',
'toDelete')
114 control.finishXMLinput(
'testOutputFile.xml')
117 self.assertFalse(
'MY_PATH' in control.vars())
118 control.loadXML(
'testOutputFile.xml')
120 self.assertTrue(
'MY_PATH' in control.vars())
121 var = control.var(
'MY_PATH')
122 self.assertTrue(var[0] ==
'prepended')
123 self.assertTrue(var[1] ==
'set')
124 self.assertTrue(var[2] ==
'appended')
125 self.assertFalse(
'toDelete' in var)
127 os.remove(
'testOutputFile.xml')
131 """XML file write and load test"""
133 control.unset(
'MY_PATH')
134 control.set(
'MY_PATH', [
'set',
'toDelete'])
135 control.append(
'MY_PATH', [
'appended',
'toDelete'])
136 control.prepend(
'MY_PATH', [
'prepended',
'toDelete'])
137 control.remove(
'MY_PATH', [
'toDelete'])
138 control.finishXMLinput(
'testOutputFile.xml')
141 self.assertFalse(
'MY_PATH' in control.vars())
142 control.loadXML(
'testOutputFile.xml')
144 self.assertTrue(
'MY_PATH' in control.vars())
145 var = control.var(
'MY_PATH')
146 self.assertTrue(var[0] ==
'prepended')
147 self.assertTrue(var[1] ==
'set')
148 self.assertTrue(var[2] ==
'appended')
149 self.assertFalse(
'toDelete' in var)
151 os.remove(
'testOutputFile.xml')
155 """XML file write and load test"""
158 control.unset(
'MY_PATH')
159 control.set(
'MY_PATH',
'set:toDelete')
160 control.append(
'MY_PATH',
'appended:toDelete')
161 control.prepend(
'MY_PATH',
'prepended:toDelete')
162 control.remove(
'MY_PATH',
'toDelete')
163 control.writeToXMLFile(
'testOutputFile.xml')
166 self.assertFalse(
'MY_PATH' in control.vars())
167 control.loadXML(
'testOutputFile.xml')
169 self.assertTrue(
'MY_PATH' in control.vars())
170 var = control.var(
'MY_PATH')
171 self.assertTrue(var[0] ==
'prepended')
172 self.assertTrue(var[1] ==
'set')
173 self.assertTrue(var[2] ==
'appended')
174 self.assertFalse(
'toDelete' in var)
176 os.remove(
'testOutputFile.xml')
179 '''Test addition of variable to system'''
182 control.append(
'sysVar',
'newValue:lala')
183 control.writeToFile(
'setupFile.txt')
185 with open(
'setupFile.txt',
"r") as f:
190 self.assertEqual(stri, 'export sysVar=newValue:lala\n')
192 os.remove(
'setupFile.txt')
195 '''Testing searching in variables'''
198 control.append(
'MY_PATH',
'newValue:mess:something new:aaaabbcc')
200 def count(val, regExp = False):
201 return len(control.search(
'MY_PATH', val, regExp))
203 self.assertEqual(count(
'new'), 0)
204 self.assertEqual(count(
'newValue'), 1)
206 self.assertEqual(count(
'me',
False), 0)
207 self.assertEqual(count(
'me',
True), 2)
209 self.assertEqual(count(
'cc',
False), 0)
210 self.assertEqual(count(
'cc',
True), 1)
212 self.assertEqual(count(
'a{2}b{2}c{2}',
True), 1)
213 self.assertEqual(count(
'a{2}b{2}',
True), 1)
214 self.assertEqual(count(
'a{1}b{2}c{2}',
True), 1)
215 self.assertEqual(count(
'a{1}b{1}c{2}',
True), 0)
216 self.assertEqual(count(
'a{1,2}b{1,2}c{2}',
True), 1)
217 self.assertEqual(count(
'a{2,3}',
True), 1)
218 self.assertEqual(count(
'a{2,3}?',
True), 1)
221 '''Tests variables creation and redeclaration.'''
224 control.append(
'MY_PATH',
'newValue')
225 self.assertFalse(control.var(
'MY_PATH').local)
226 self.assertTrue(isinstance(control.var(
'MY_PATH'),
Variable.List))
228 control.declare(
'loc',
'list',
True)
229 self.assertTrue(control.var(
'loc').local)
230 self.assertTrue(isinstance(control.var(
'loc'),
Variable.List))
232 control.declare(
'myVar2',
'scalar',
False)
233 self.assertFalse(control.var(
'myVar2').local)
236 control.declare(
'loc2',
'scalar',
True)
237 self.assertTrue(control.var(
'loc2').local)
240 control.declare(
'MY_PATH',
'list',
False)
241 self.failUnlessRaises(
Variable.EnvError, control.declare,
'MY_PATH',
'list',
True)
242 self.failUnlessRaises(
Variable.EnvError, control.declare,
'MY_PATH',
'scalar',
True)
243 self.failUnlessRaises(
Variable.EnvError, control.declare,
'MY_PATH',
'scalar',
True)
245 control.declare(
'loc',
'list',
True)
250 control.declare(
'myVar2',
'scalar',
False)
251 self.failUnlessRaises(
Variable.EnvError, control.declare,
'myVar2',
'list',
False)
253 self.failUnlessRaises(
Variable.EnvError, control.declare,
'myVar2',
'scalar',
True)
255 control.declare(
'loc2',
'scalar',
True)
258 self.failUnlessRaises(
Variable.EnvError, control.declare,
'loc2',
'scalar',
False)
264 control.append(
'MY_PATH',
'myVal:anotherVal:lastVal')
265 control.remove(
'MY_PATH',
'anotherVal')
267 self.assertFalse(
'anotherVal' in control[
'MY_PATH'])
268 self.assertTrue(
'myVal' in control[
'MY_PATH'])
269 self.assertTrue(
'lastVal' in control[
'MY_PATH'])
271 control.set(
'MY_PATH',
'myVal:anotherVal:lastVal:else')
272 control.remove(
'MY_PATH',
'^anotherVal$',
False)
273 self.assertTrue(
'anotherVal' in control[
'MY_PATH'])
274 control.remove(
'MY_PATH',
'^anotherVal$',
True)
275 self.assertFalse(
'anotherVal' in control[
'MY_PATH'])
276 self.assertTrue(
'myVal' in control[
'MY_PATH'])
277 self.assertTrue(
'lastVal' in control[
'MY_PATH'])
278 self.assertTrue(
'lastVal' in control[
'MY_PATH'])
279 control.remove(
'MY_PATH',
'Val',
True)
280 self.assertTrue(
'else' in control[
'MY_PATH'])
281 self.assertTrue(len(control[
'MY_PATH']) == 1)
284 control.declare(
'myLoc',
'scalar',
False)
285 control.append(
'myLoc',
'myVal:anotherVal:lastVal')
286 control.remove(
'myLoc',
'Val:',
True)
287 self.assertTrue(str(control[
'myLoc']) ==
'myanotherlastVal')
293 os.environ[
'MY_PATH'] =
'$myVal'
294 os.environ[
'myScal'] =
'$myVal'
296 control.set(
'ABC',
'anyValue')
297 control.declare(
'MY_PATH',
'list',
False)
298 control.append(
'MY_PATH',
'$ABC')
299 self.assertTrue(control[
'MY_PATH'].value(
True) ==
'$myVal:anyValue')
301 control.declare(
'myScal',
'scalar',
False)
302 control.append(
'myScal',
'$ABC')
303 self.assertTrue(control[
'myScal'].value(
True) ==
'$myValanyValue')
309 control.declare(
'myVar',
'list',
False)
311 control.declare(
'loc',
'list',
True)
312 control.append(
'loc',
'locVal')
313 control.append(
'loc',
'locVal2')
315 control.declare(
'scal',
'scalar',
False)
316 control.append(
'scal',
'scalVal')
317 control.append(
'scal',
'scalVal2')
319 control.declare(
'scal2',
'scalar',
True)
320 control.append(
'scal2',
'locScal')
321 control.append(
'scal2',
'locScal2')
323 control.set(
'myVar',
'newValue:$loc:endValue')
324 self.assertEqual(str(control[
'myVar']),
'newValue:locVal:locVal2:endValue')
326 control.set(
'myVar',
'newValue:$scal:endValue')
327 self.assertEqual(str(control[
'myVar']),
'newValue:scalValscalVal2:endValue')
329 control.set(
'myVar',
'new${scal}Value:endValue')
330 self.assertEqual(str(control[
'myVar']),
'newscalValscalVal2Value:endValue')
332 control.set(
'myVar',
'bla:$myVar:Value')
333 self.assertEqual(str(control[
'myVar']),
'bla:newscalValscalVal2Value:endValue:Value')
335 control.set(
'scal',
'new${scal2}Value')
336 self.assertEqual(str(control[
'scal']),
'newlocScallocScal2Value')
338 control.set(
'scal',
'new${loc}Value')
339 self.assertEqual(str(control[
'scal']),
'newlocVal:locVal2Value')
341 control.set(
'scal2',
'new${scal2}Value')
342 self.assertEqual(str(control[
'scal2']),
'newlocScallocScal2Value')
346 '''<?xml version="1.0" ?>
347 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
348 <env:set variable="main">first</env:set>
349 <env:append variable="test_path">data1</env:append>
350 <env:include>first_inc.xml</env:include>
353 '''<?xml version="1.0" ?>
354 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
355 <env:set variable="main">second</env:set>
356 <env:include>second_inc.xml</env:include>
357 <env:append variable="test_path">data1</env:append>
360 '''<?xml version="1.0" ?>
361 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
362 <env:set variable="main">third</env:set>
363 <env:append variable="test_path">data1</env:append>
364 <env:include>subdir/first_inc.xml</env:include>
367 '''<?xml version="1.0" ?>
368 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
369 <env:set variable="main">fourth</env:set>
370 <env:include hints="subdir2">fourth_inc.xml</env:include>
373 '''<?xml version="1.0" ?>
374 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
375 <env:set variable="main">recursion</env:set>
376 <env:include>recursion.xml</env:include>
379 '''<?xml version="1.0" ?>
380 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
381 <env:append variable="test_path">data2</env:append>
382 <env:append variable="derived">another_${main}</env:append>
384 'subdir': {
'second_inc.xml':
385 '''<?xml version="1.0" ?>
386 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
387 <env:append variable="test_path">data0</env:append>
388 <env:set variable="map">this_is_second_inc</env:set>
391 '''<?xml version="1.0" ?>
392 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
393 <env:append variable="derived">second_${main}</env:append>
396 '''<?xml version="1.0" ?>
397 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
398 <env:append variable="included">from subdir</env:append>
400 'subdir2': {
'fourth_inc.xml':
401 '''<?xml version="1.0" ?>
402 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
403 <env:append variable="included">from subdir2</env:append>
407 if 'ENVXMLPATH' in os.environ:
408 del os.environ[
'ENVXMLPATH']
410 saved_path = list(EnvConfig.path)
411 EnvConfig.path[:] = [
'.']
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')
422 control.loadXML(tmp(
'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')
428 control.loadXML(
'first.xml')
429 self.assertEqual(str(control[
'main']),
'first')
430 self.assertEqual(str(control[
'test_path']),
'data1:data2')
431 self.assertEqual(str(control[
'derived']),
'another_first')
434 self.assertRaises(OSError, control.loadXML, tmp(
'second.xml'))
437 control.loadXML(tmp(
'second.xml'))
438 self.assertEqual(str(control[
'main']),
'second')
439 self.assertEqual(str(control[
'test_path']),
'data0:data1')
440 self.assertEqual(str(control[
'map']),
'this_is_second_inc')
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')
449 control.loadXML(tmp(
'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')
455 control.loadXML(
'first.xml')
456 self.assertEqual(str(control[
'main']),
'first')
457 self.assertEqual(str(control[
'test_path']),
'data1:data2')
458 self.assertEqual(str(control[
'derived']),
'another_first')
461 EnvConfig.path[:] = [
'.', tmp(), tmp(
'subdir')]
463 control.loadXML(tmp(
'second.xml'))
464 self.assertEqual(str(control[
'main']),
'second')
465 self.assertEqual(str(control[
'test_path']),
'data0:data1')
466 self.assertEqual(str(control[
'map']),
'this_is_second_inc')
468 EnvConfig.path[:] = [
'.']
471 control.loadXML(tmp(
'third.xml'))
472 self.assertEqual(str(control[
'main']),
'third')
473 self.assertEqual(str(control[
'test_path']),
'data1')
474 self.assertEqual(str(control[
'derived']),
'second_third')
477 control.loadXML(tmp(
'fourth.xml'))
478 self.assertEqual(str(control[
'main']),
'fourth')
479 self.assertEqual(str(control[
'included']),
'from subdir')
482 control.loadXML(tmp(
'fourth.xml'))
483 self.assertEqual(str(control[
'main']),
'fourth')
484 self.assertEqual(str(control[
'included']),
'from subdir2')
488 control.loadXML(tmp(
'recursion.xml'))
491 EnvConfig.path = saved_path
496 '''<?xml version="1.0" ?>
497 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
498 <env:set variable="mydirs">${.}</env:set>
499 <env:set variable="myparent">${.}/..</env:set>
503 control.loadXML(tmp(
'env.xml'))
504 self.assertEqual(str(control[
'mydirs']), tmp())
505 self.assertEqual(str(control[
'myparent']), os.path.dirname(tmp()))
511 control.loadXML(
'env.xml')
512 self.assertEqual(str(control[
'mydirs']), tmp())
513 self.assertEqual(str(control[
'myparent']), os.path.dirname(tmp()))
519 '''<?xml version="1.0" ?>
520 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
521 <env:default variable="var1">value1</env:default>
522 <env:declare variable="var2" local="true" />
523 <env:default variable="var2">test2</env:default>
526 if 'var1' in os.environ:
527 del os.environ[
'var1']
529 control.loadXML(tmp(
'env.xml'))
530 self.assertEqual(str(control[
'var1']),
"value1")
531 self.assertEqual(str(control[
'var2']),
"test2")
533 os.environ[
'var1'] =
"some_value"
535 control.loadXML(tmp(
'env.xml'))
536 self.assertEqual(str(control[
'var1']),
"some_value")
537 self.assertEqual(str(control[
'var2']),
"test2")
543 l.set(
"/usr/bin:/some//strange/../nice/./location")
544 assert l.value(asString=
True) ==
"/usr/bin:/some/nice/location"
546 l.append(
"/another/path")
547 assert l.value(asString=
True) ==
"/usr/bin:/some/nice/location:/another/path"
551 assert l.value(asString=
True) ==
"/usr/bin:/some/nice/location:/another/path"
552 l.prepend(
"/another/path")
553 assert l.value(asString=
True) ==
"/another/path:/usr/bin:/some/nice/location"
558 assert s.value(asString=
True) ==
"/usr/bin"
560 s.set(
"/some//strange/../nice/./location")
561 assert s.value(asString=
True) ==
"/some/nice/location"
566 s.set(
"http://cern.ch")
567 assert s.value(asString=
True) ==
"http://cern.ch"
569 if __name__ ==
"__main__":