2 Created on Jul 12, 2011
9 from tempfile
import mkdtemp
11 from EnvConfig
import Variable
12 from EnvConfig
import Control
15 saved_processors = Variable.processors
22 Create a directory structure from the content of files.
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
28 if type(files)
is dict:
32 if not os.path.exists(rootdir):
36 for filename, data
in files:
37 filename = os.path.join(rootdir, filename)
38 if type(data)
is dict:
41 d = os.path.dirname(filename)
42 if not os.path.exists(d):
44 f = open(filename,
"w")
51 Class for easy creation, use and removal of temporary directory structures.
60 shutil.rmtree(self.
tmpdir, ignore_errors=
False)
64 Return the absolute path to a file in the temporary directory.
66 return os.path.join(self.
tmpdir, *args)
68 class Test(unittest.TestCase):
79 '''Test of value appending, prepending, setting, unsetting, removing'''
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')
87 control.append(
'MY_PATH',
'newValue:secondVal:valval')
88 self.assertTrue(var[len(var)-1] ==
'valval')
90 self.assertTrue(
'newValue' in var)
91 control.remove(
'MY_PATH',
'newValue')
92 self.assertFalse(
'newValue' in var)
94 control.prepend(
'MY_PATH',
'newValue')
95 self.assertTrue(
'newValue' == var[0])
97 control.set(
'MY_PATH',
'hi:hello')
98 self.assertTrue(len(var) == 2)
99 self.assertTrue(
'hi' == var[0])
101 control.unset(
'MY_PATH')
102 self.assertTrue(
'MY_PATH' not in control)
106 """XML file write and load test"""
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')
116 self.assertFalse(
'MY_PATH' in control.vars())
117 control.loadXML(
'testOutputFile.xml')
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)
126 os.remove(
'testOutputFile.xml')
130 """XML file write and load test"""
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')
140 self.assertFalse(
'MY_PATH' in control.vars())
141 control.loadXML(
'testOutputFile.xml')
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)
150 os.remove(
'testOutputFile.xml')
154 """XML file write and load test"""
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')
165 self.assertFalse(
'MY_PATH' in control.vars())
166 control.loadXML(
'testOutputFile.xml')
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)
175 os.remove(
'testOutputFile.xml')
178 '''Test addition of variable to system'''
181 control.append(
'sysVar',
'newValue:lala')
182 control.writeToFile(
'setupFile.txt')
184 with open(
'setupFile.txt',
"r") as f:
189 self.assertEqual(stri, 'export sysVar=newValue:lala\n')
191 os.remove(
'setupFile.txt')
194 '''Testing searching in variables'''
197 control.append(
'MY_PATH',
'newValue:mess:something new:aaaabbcc')
199 def count(val, regExp = False):
200 return len(control.search(
'MY_PATH', val, regExp))
202 self.assertEqual(count(
'new'), 0)
203 self.assertEqual(count(
'newValue'), 1)
205 self.assertEqual(count(
'me',
False), 0)
206 self.assertEqual(count(
'me',
True), 2)
208 self.assertEqual(count(
'cc',
False), 0)
209 self.assertEqual(count(
'cc',
True), 1)
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)
220 '''Tests variables creation and redeclaration.'''
223 control.append(
'MY_PATH',
'newValue')
224 self.assertFalse(control.var(
'MY_PATH').local)
225 self.assertTrue(isinstance(control.var(
'MY_PATH'),
Variable.List))
227 control.declare(
'loc',
'list',
True)
228 self.assertTrue(control.var(
'loc').local)
229 self.assertTrue(isinstance(control.var(
'loc'),
Variable.List))
231 control.declare(
'myVar2',
'scalar',
False)
232 self.assertFalse(control.var(
'myVar2').local)
235 control.declare(
'loc2',
'scalar',
True)
236 self.assertTrue(control.var(
'loc2').local)
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)
244 control.declare(
'loc',
'list',
True)
249 control.declare(
'myVar2',
'scalar',
False)
250 self.failUnlessRaises(
Variable.EnvError, control.declare,
'myVar2',
'list',
False)
252 self.failUnlessRaises(
Variable.EnvError, control.declare,
'myVar2',
'scalar',
True)
254 control.declare(
'loc2',
'scalar',
True)
257 self.failUnlessRaises(
Variable.EnvError, control.declare,
'loc2',
'scalar',
False)
263 control.append(
'MY_PATH',
'myVal:anotherVal:lastVal')
264 control.remove(
'MY_PATH',
'anotherVal')
266 self.assertFalse(
'anotherVal' in control[
'MY_PATH'])
267 self.assertTrue(
'myVal' in control[
'MY_PATH'])
268 self.assertTrue(
'lastVal' in control[
'MY_PATH'])
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)
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')
292 os.environ[
'MY_PATH'] =
'$myVal'
293 os.environ[
'myScal'] =
'$myVal'
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')
300 control.declare(
'myScal',
'scalar',
False)
301 control.append(
'myScal',
'$ABC')
302 self.assertTrue(control[
'myScal'].value(
True) ==
'$myValanyValue')
308 control.declare(
'myVar',
'list',
False)
310 control.declare(
'loc',
'list',
True)
311 control.append(
'loc',
'locVal')
312 control.append(
'loc',
'locVal2')
314 control.declare(
'scal',
'scalar',
False)
315 control.append(
'scal',
'scalVal')
316 control.append(
'scal',
'scalVal2')
318 control.declare(
'scal2',
'scalar',
True)
319 control.append(
'scal2',
'locScal')
320 control.append(
'scal2',
'locScal2')
322 control.set(
'myVar',
'newValue:$loc:endValue')
323 self.assertEqual(str(control[
'myVar']),
'newValue:locVal:locVal2:endValue')
325 control.set(
'myVar',
'newValue:$scal:endValue')
326 self.assertEqual(str(control[
'myVar']),
'newValue:scalValscalVal2:endValue')
328 control.set(
'myVar',
'new${scal}Value:endValue')
329 self.assertEqual(str(control[
'myVar']),
'newscalValscalVal2Value:endValue')
331 control.set(
'myVar',
'bla:$myVar:Value')
332 self.assertEqual(str(control[
'myVar']),
'bla:newscalValscalVal2Value:endValue:Value')
334 control.set(
'scal',
'new${scal2}Value')
335 self.assertEqual(str(control[
'scal']),
'newlocScallocScal2Value')
337 control.set(
'scal',
'new${loc}Value')
338 self.assertEqual(str(control[
'scal']),
'newlocVal:locVal2Value')
340 control.set(
'scal2',
'new${scal2}Value')
341 self.assertEqual(str(control[
'scal2']),
'newlocScallocScal2Value')
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
405 if 'ENVXMLPATH' in os.environ:
406 del os.environ[
'ENVXMLPATH']
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')
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(
'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 self.assertRaises(OSError, control.loadXML, tmp(
'second.xml'))
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')
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')
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(
'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')
454 os.environ[
'ENVXMLPATH'] = os.pathsep.join([tmp(), tmp(
'subdir')])
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']
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')
469 control.loadXML(tmp(
'fourth.xml'))
470 self.assertEqual(str(control[
'main']),
'fourth')
471 self.assertEqual(str(control[
'included']),
'from subdir')
474 control.loadXML(tmp(
'fourth.xml'))
475 self.assertEqual(str(control[
'main']),
'fourth')
476 self.assertEqual(str(control[
'included']),
'from subdir2')
480 control.loadXML(tmp(
'recursion.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>
492 control.loadXML(tmp(
'env.xml'))
493 self.assertEqual(str(control[
'mydirs']), tmp())
494 self.assertEqual(str(control[
'myparent']), os.path.dirname(tmp()))
500 control.loadXML(
'env.xml')
501 self.assertEqual(str(control[
'mydirs']), tmp())
502 self.assertEqual(str(control[
'myparent']), os.path.dirname(tmp()))
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>
515 if 'var1' in os.environ:
516 del os.environ[
'var1']
518 control.loadXML(tmp(
'env.xml'))
519 self.assertEqual(str(control[
'var1']),
"value1")
520 self.assertEqual(str(control[
'var2']),
"test2")
522 os.environ[
'var1'] =
"some_value"
524 control.loadXML(tmp(
'env.xml'))
525 self.assertEqual(str(control[
'var1']),
"some_value")
526 self.assertEqual(str(control[
'var2']),
"test2")
532 l.set(
"/usr/bin:/some//strange/../nice/./location")
533 assert l.value(asString=
True) ==
"/usr/bin:/some/nice/location"
535 l.append(
"/another/path")
536 assert l.value(asString=
True) ==
"/usr/bin:/some/nice/location:/another/path"
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"
547 assert s.value(asString=
True) ==
"/usr/bin"
549 s.set(
"/some//strange/../nice/./location")
550 assert s.value(asString=
True) ==
"/some/nice/location"
555 s.set(
"http://cern.ch")
556 assert s.value(asString=
True) ==
"http://cern.ch"
558 if __name__ ==
"__main__":