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)
108 control.variables[
'.'].set(
'some/dir')
110 self.assertTrue(
'.' in control.variables)
111 self.assertTrue(
'.' not in control.vars())
112 self.assertTrue(
'.' not in control.vars(strings=
False))
114 control.set(
'MY_DIR',
'${.}')
115 self.assertEqual(control.var(
'MY_DIR').
value(
True),
'some/dir')
116 self.assertEqual(control.vars()[
'MY_DIR'],
'some/dir')
121 """XML file write and load test"""
123 control.unset(
'MY_PATH')
124 control.set(
'MY_PATH',
'set:toDelete')
125 control.append(
'MY_PATH',
'appended:toDelete')
126 control.prepend(
'MY_PATH',
'prepended:toDelete')
127 control.remove(
'MY_PATH',
'toDelete')
128 control.finishXMLinput(
'testOutputFile.xml')
131 self.assertFalse(
'MY_PATH' in control.vars())
132 control.loadXML(
'testOutputFile.xml')
134 self.assertTrue(
'MY_PATH' in control.vars())
135 var = control.var(
'MY_PATH')
136 self.assertTrue(var[0] ==
'prepended')
137 self.assertTrue(var[1] ==
'set')
138 self.assertTrue(var[2] ==
'appended')
139 self.assertFalse(
'toDelete' in var)
141 os.remove(
'testOutputFile.xml')
145 """XML file write and load test"""
147 control.unset(
'MY_PATH')
148 control.set(
'MY_PATH', [
'set',
'toDelete'])
149 control.append(
'MY_PATH', [
'appended',
'toDelete'])
150 control.prepend(
'MY_PATH', [
'prepended',
'toDelete'])
151 control.remove(
'MY_PATH', [
'toDelete'])
152 control.finishXMLinput(
'testOutputFile.xml')
155 self.assertFalse(
'MY_PATH' in control.vars())
156 control.loadXML(
'testOutputFile.xml')
158 self.assertTrue(
'MY_PATH' in control.vars())
159 var = control.var(
'MY_PATH')
160 self.assertTrue(var[0] ==
'prepended')
161 self.assertTrue(var[1] ==
'set')
162 self.assertTrue(var[2] ==
'appended')
163 self.assertFalse(
'toDelete' in var)
165 os.remove(
'testOutputFile.xml')
169 """XML file write and load test"""
172 control.unset(
'MY_PATH')
173 control.set(
'MY_PATH',
'set:toDelete')
174 control.append(
'MY_PATH',
'appended:toDelete')
175 control.prepend(
'MY_PATH',
'prepended:toDelete')
176 control.remove(
'MY_PATH',
'toDelete')
177 control.writeToXMLFile(
'testOutputFile.xml')
180 self.assertFalse(
'MY_PATH' in control.vars())
181 control.loadXML(
'testOutputFile.xml')
183 self.assertTrue(
'MY_PATH' in control.vars())
184 var = control.var(
'MY_PATH')
185 self.assertTrue(var[0] ==
'prepended')
186 self.assertTrue(var[1] ==
'set')
187 self.assertTrue(var[2] ==
'appended')
188 self.assertFalse(
'toDelete' in var)
190 os.remove(
'testOutputFile.xml')
193 '''Test addition of variable to system'''
196 control.append(
'sysVar',
'newValue:lala')
197 control.writeToFile(
'setupFile.txt')
199 with open(
'setupFile.txt',
"r") as f:
204 self.assertEqual(stri, 'export sysVar=newValue:lala\n')
206 os.remove(
'setupFile.txt')
209 '''Testing searching in variables'''
212 control.append(
'MY_PATH',
'newValue:mess:something new:aaaabbcc')
214 def count(val, regExp = False):
215 return len(control.search(
'MY_PATH', val, regExp))
217 self.assertEqual(count(
'new'), 0)
218 self.assertEqual(count(
'newValue'), 1)
220 self.assertEqual(count(
'me',
False), 0)
221 self.assertEqual(count(
'me',
True), 2)
223 self.assertEqual(count(
'cc',
False), 0)
224 self.assertEqual(count(
'cc',
True), 1)
226 self.assertEqual(count(
'a{2}b{2}c{2}',
True), 1)
227 self.assertEqual(count(
'a{2}b{2}',
True), 1)
228 self.assertEqual(count(
'a{1}b{2}c{2}',
True), 1)
229 self.assertEqual(count(
'a{1}b{1}c{2}',
True), 0)
230 self.assertEqual(count(
'a{1,2}b{1,2}c{2}',
True), 1)
231 self.assertEqual(count(
'a{2,3}',
True), 1)
232 self.assertEqual(count(
'a{2,3}?',
True), 1)
235 '''Tests variables creation and redeclaration.'''
238 control.append(
'MY_PATH',
'newValue')
239 self.assertFalse(control.var(
'MY_PATH').local)
240 self.assertTrue(isinstance(control.var(
'MY_PATH'),
Variable.List))
242 control.declare(
'loc',
'list',
True)
243 self.assertTrue(control.var(
'loc').local)
244 self.assertTrue(isinstance(control.var(
'loc'),
Variable.List))
246 control.declare(
'myVar2',
'scalar',
False)
247 self.assertFalse(control.var(
'myVar2').local)
250 control.declare(
'loc2',
'scalar',
True)
251 self.assertTrue(control.var(
'loc2').local)
254 control.declare(
'MY_PATH',
'list',
False)
255 self.failUnlessRaises(
Variable.EnvError, control.declare,
'MY_PATH',
'list',
True)
256 self.failUnlessRaises(
Variable.EnvError, control.declare,
'MY_PATH',
'scalar',
True)
257 self.failUnlessRaises(
Variable.EnvError, control.declare,
'MY_PATH',
'scalar',
True)
259 control.declare(
'loc',
'list',
True)
264 control.declare(
'myVar2',
'scalar',
False)
265 self.failUnlessRaises(
Variable.EnvError, control.declare,
'myVar2',
'list',
False)
267 self.failUnlessRaises(
Variable.EnvError, control.declare,
'myVar2',
'scalar',
True)
269 control.declare(
'loc2',
'scalar',
True)
272 self.failUnlessRaises(
Variable.EnvError, control.declare,
'loc2',
'scalar',
False)
278 control.append(
'MY_PATH',
'myVal:anotherVal:lastVal')
279 control.remove(
'MY_PATH',
'anotherVal')
281 self.assertFalse(
'anotherVal' in control[
'MY_PATH'])
282 self.assertTrue(
'myVal' in control[
'MY_PATH'])
283 self.assertTrue(
'lastVal' in control[
'MY_PATH'])
285 control.set(
'MY_PATH',
'myVal:anotherVal:lastVal:else')
286 control.remove(
'MY_PATH',
'^anotherVal$',
False)
287 self.assertTrue(
'anotherVal' in control[
'MY_PATH'])
288 control.remove(
'MY_PATH',
'^anotherVal$',
True)
289 self.assertFalse(
'anotherVal' in control[
'MY_PATH'])
290 self.assertTrue(
'myVal' in control[
'MY_PATH'])
291 self.assertTrue(
'lastVal' in control[
'MY_PATH'])
292 self.assertTrue(
'lastVal' in control[
'MY_PATH'])
293 control.remove(
'MY_PATH',
'Val',
True)
294 self.assertTrue(
'else' in control[
'MY_PATH'])
295 self.assertTrue(len(control[
'MY_PATH']) == 1)
298 control.declare(
'myLoc',
'scalar',
False)
299 control.append(
'myLoc',
'myVal:anotherVal:lastVal')
300 control.remove(
'myLoc',
'Val:',
True)
301 self.assertTrue(str(control[
'myLoc']) ==
'myanotherlastVal')
307 os.environ[
'MY_PATH'] =
'$myVal'
308 os.environ[
'myScal'] =
'$myVal'
310 control.set(
'ABC',
'anyValue')
311 control.declare(
'MY_PATH',
'list',
False)
312 control.append(
'MY_PATH',
'$ABC')
313 self.assertTrue(control[
'MY_PATH'].
value(
True) ==
'$myVal:anyValue')
315 control.declare(
'myScal',
'scalar',
False)
316 control.append(
'myScal',
'$ABC')
317 self.assertTrue(control[
'myScal'].
value(
True) ==
'$myValanyValue')
323 control.declare(
'myVar',
'list',
False)
325 control.declare(
'loc',
'list',
True)
326 control.append(
'loc',
'locVal')
327 control.append(
'loc',
'locVal2')
329 control.declare(
'scal',
'scalar',
False)
330 control.append(
'scal',
'scalVal')
331 control.append(
'scal',
'scalVal2')
333 control.declare(
'scal2',
'scalar',
True)
334 control.append(
'scal2',
'locScal')
335 control.append(
'scal2',
'locScal2')
337 control.set(
'myVar',
'newValue:$loc:endValue')
338 self.assertEqual(str(control[
'myVar']),
'newValue:locVal:locVal2:endValue')
340 control.set(
'myVar',
'newValue:$scal:endValue')
341 self.assertEqual(str(control[
'myVar']),
'newValue:scalValscalVal2:endValue')
343 control.set(
'myVar',
'new${scal}Value:endValue')
344 self.assertEqual(str(control[
'myVar']),
'newscalValscalVal2Value:endValue')
346 control.set(
'myVar',
'bla:$myVar:Value')
347 self.assertEqual(str(control[
'myVar']),
'bla:newscalValscalVal2Value:endValue:Value')
349 control.set(
'scal',
'new${scal2}Value')
350 self.assertEqual(str(control[
'scal']),
'newlocScallocScal2Value')
352 control.set(
'scal',
'new${loc}Value')
353 self.assertEqual(str(control[
'scal']),
'newlocVal:locVal2Value')
355 control.set(
'scal2',
'new${scal2}Value')
356 self.assertEqual(str(control[
'scal2']),
'newlocScallocScal2Value')
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">first</env:set>
363 <env:append variable="test_path">data1</env:append>
364 <env:include>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">second</env:set>
370 <env:include>second_inc.xml</env:include>
371 <env:append variable="test_path">data1</env:append>
374 '''<?xml version="1.0" ?>
375 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
376 <env:set variable="main">third</env:set>
377 <env:append variable="test_path">data1</env:append>
378 <env:include>subdir/first_inc.xml</env:include>
381 '''<?xml version="1.0" ?>
382 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
383 <env:set variable="main">fourth</env:set>
384 <env:include hints="subdir2">fourth_inc.xml</env:include>
387 '''<?xml version="1.0" ?>
388 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
389 <env:set variable="main">recursion</env:set>
390 <env:include>recursion.xml</env:include>
393 '''<?xml version="1.0" ?>
394 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
395 <env:append variable="test_path">data2</env:append>
396 <env:append variable="derived">another_${main}</env:append>
398 'subdir': {
'second_inc.xml':
399 '''<?xml version="1.0" ?>
400 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
401 <env:append variable="test_path">data0</env:append>
402 <env:set variable="map">this_is_second_inc</env:set>
405 '''<?xml version="1.0" ?>
406 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
407 <env:append variable="derived">second_${main}</env:append>
410 '''<?xml version="1.0" ?>
411 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
412 <env:append variable="included">from subdir</env:append>
414 'subdir2': {
'fourth_inc.xml':
415 '''<?xml version="1.0" ?>
416 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
417 <env:append variable="included">from subdir2</env:append>
421 if 'ENVXMLPATH' in os.environ:
422 del os.environ[
'ENVXMLPATH']
424 saved_path = list(EnvConfig.path)
425 EnvConfig.path[:] = [
'.']
430 control.loadXML(tmp(
'first.xml'))
431 self.assertEqual(str(control[
'main']),
'first')
432 self.assertEqual(str(control[
'test_path']),
'data1:data2')
433 self.assertEqual(str(control[
'derived']),
'another_first')
436 control.loadXML(tmp(
'first.xml'))
437 self.assertEqual(str(control[
'main']),
'first')
438 self.assertEqual(str(control[
'test_path']),
'data1:data2')
439 self.assertEqual(str(control[
'derived']),
'another_first')
442 control.loadXML(
'first.xml')
443 self.assertEqual(str(control[
'main']),
'first')
444 self.assertEqual(str(control[
'test_path']),
'data1:data2')
445 self.assertEqual(str(control[
'derived']),
'another_first')
448 self.assertRaises(OSError, control.loadXML, tmp(
'second.xml'))
451 control.loadXML(tmp(
'second.xml'))
452 self.assertEqual(str(control[
'main']),
'second')
453 self.assertEqual(str(control[
'test_path']),
'data0:data1')
454 self.assertEqual(str(control[
'map']),
'this_is_second_inc')
457 control.loadXML(tmp(
'first.xml'))
458 self.assertEqual(str(control[
'main']),
'first')
459 self.assertEqual(str(control[
'test_path']),
'data1:data2')
460 self.assertEqual(str(control[
'derived']),
'another_first')
463 control.loadXML(tmp(
'first.xml'))
464 self.assertEqual(str(control[
'main']),
'first')
465 self.assertEqual(str(control[
'test_path']),
'data1:data2')
466 self.assertEqual(str(control[
'derived']),
'another_first')
469 control.loadXML(
'first.xml')
470 self.assertEqual(str(control[
'main']),
'first')
471 self.assertEqual(str(control[
'test_path']),
'data1:data2')
472 self.assertEqual(str(control[
'derived']),
'another_first')
475 EnvConfig.path[:] = [
'.', tmp(), tmp(
'subdir')]
477 control.loadXML(tmp(
'second.xml'))
478 self.assertEqual(str(control[
'main']),
'second')
479 self.assertEqual(str(control[
'test_path']),
'data0:data1')
480 self.assertEqual(str(control[
'map']),
'this_is_second_inc')
482 EnvConfig.path[:] = [
'.']
485 control.loadXML(tmp(
'third.xml'))
486 self.assertEqual(str(control[
'main']),
'third')
487 self.assertEqual(str(control[
'test_path']),
'data1')
488 self.assertEqual(str(control[
'derived']),
'second_third')
491 control.loadXML(tmp(
'fourth.xml'))
492 self.assertEqual(str(control[
'main']),
'fourth')
493 self.assertEqual(str(control[
'included']),
'from subdir')
496 control.loadXML(tmp(
'fourth.xml'))
497 self.assertEqual(str(control[
'main']),
'fourth')
498 self.assertEqual(str(control[
'included']),
'from subdir2')
502 control.loadXML(tmp(
'recursion.xml'))
505 EnvConfig.path = saved_path
510 '''<?xml version="1.0" ?>
511 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
512 <env:set variable="mydirs">${.}</env:set>
513 <env:set variable="myparent">${.}/..</env:set>
517 control.loadXML(tmp(
'env.xml'))
518 self.assertEqual(str(control[
'mydirs']), tmp())
519 self.assertEqual(str(control[
'myparent']), os.path.dirname(tmp()))
525 control.loadXML(
'env.xml')
526 self.assertEqual(str(control[
'mydirs']), tmp())
527 self.assertEqual(str(control[
'myparent']), os.path.dirname(tmp()))
533 '''<?xml version="1.0" ?>
534 <env:config xmlns:env="EnvSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EnvSchema ./EnvSchema.xsd ">
535 <env:default variable="var1">value1</env:default>
536 <env:declare variable="var2" local="true" />
537 <env:default variable="var2">test2</env:default>
540 if 'var1' in os.environ:
541 del os.environ[
'var1']
543 control.loadXML(tmp(
'env.xml'))
544 self.assertEqual(str(control[
'var1']),
"value1")
545 self.assertEqual(str(control[
'var2']),
"test2")
547 os.environ[
'var1'] =
"some_value"
549 control.loadXML(tmp(
'env.xml'))
550 self.assertEqual(str(control[
'var1']),
"some_value")
551 self.assertEqual(str(control[
'var2']),
"test2")
557 l.set(
"/usr/bin:/some//strange/../nice/./location")
558 assert l.value(asString=
True) ==
"/usr/bin:/some/nice/location"
560 l.append(
"/another/path")
561 assert l.value(asString=
True) ==
"/usr/bin:/some/nice/location:/another/path"
565 assert l.value(asString=
True) ==
"/usr/bin:/some/nice/location:/another/path"
566 l.prepend(
"/another/path")
567 assert l.value(asString=
True) ==
"/another/path:/usr/bin:/some/nice/location"
572 assert s.value(asString=
True) ==
"/usr/bin"
574 s.set(
"/some//strange/../nice/./location")
575 assert s.value(asString=
True) ==
"/some/nice/location"
580 s.set(
"http://cern.ch")
581 assert s.value(asString=
True) ==
"http://cern.ch"
583 if __name__ ==
"__main__":