modules : added a few unit tests
This commit is contained in:
parent
bce276d573
commit
5deaaa278c
3 changed files with 129 additions and 4 deletions
|
@ -132,17 +132,15 @@ def dependencies(spec, request='all'):
|
|||
if request == 'none':
|
||||
return []
|
||||
|
||||
l = [xx for xx in
|
||||
sorted(spec.traverse(order='post', depth=True, cover='nodes', root=False), reverse=True)]
|
||||
|
||||
if request == 'direct':
|
||||
return [xx for ii, xx in l if ii == 1]
|
||||
return [xx for _, xx in spec.dependencies.items()]
|
||||
|
||||
# FIXME : during module file creation nodes seem to be visited multiple times even if cover='nodes'
|
||||
# FIXME : is given. This work around permits to get a unique list of spec anyhow.
|
||||
# FIXME : Possibly we miss a merge step among nodes that refer to the same package.
|
||||
seen = set()
|
||||
seen_add = seen.add
|
||||
l = [xx for xx in sorted(spec.traverse(order='post', depth=True, cover='nodes', root=False), reverse=True)]
|
||||
return [xx for ii, xx in l if not (xx in seen or seen_add(xx))]
|
||||
|
||||
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
'svn_fetch',
|
||||
'hg_fetch',
|
||||
'mirror',
|
||||
'modules',
|
||||
'url_extrapolate',
|
||||
'cc',
|
||||
'link_tree',
|
||||
|
|
126
lib/spack/spack/test/modules.py
Normal file
126
lib/spack/spack/test/modules.py
Normal file
|
@ -0,0 +1,126 @@
|
|||
import collections
|
||||
from contextlib import contextmanager
|
||||
|
||||
import StringIO
|
||||
|
||||
FILE_REGISTRY = collections.defaultdict(StringIO.StringIO)
|
||||
|
||||
# Monkey-patch open to write module files to a StringIO instance
|
||||
@contextmanager
|
||||
def mock_open(filename, mode):
|
||||
if not mode == 'w':
|
||||
raise RuntimeError('test.modules : unexpected opening mode for monkey-patched open')
|
||||
|
||||
FILE_REGISTRY[filename] = StringIO.StringIO()
|
||||
|
||||
try:
|
||||
yield FILE_REGISTRY[filename]
|
||||
finally:
|
||||
handle = FILE_REGISTRY[filename]
|
||||
FILE_REGISTRY[filename] = handle.getvalue()
|
||||
handle.close()
|
||||
|
||||
import spack.modules
|
||||
|
||||
configuration_autoload_direct = {
|
||||
'enable': ['tcl'],
|
||||
'tcl': {
|
||||
'all': {
|
||||
'autoload': 'direct'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
configuration_autoload_all = {
|
||||
'enable': ['tcl'],
|
||||
'tcl': {
|
||||
'all': {
|
||||
'autoload': 'all'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
configuration_alter_environment = {
|
||||
'enable': ['tcl'],
|
||||
'tcl': {
|
||||
'all': {
|
||||
'filter': {'environment_blacklist': ['CMAKE_PREFIX_PATH']}
|
||||
},
|
||||
'=x86-linux': {
|
||||
'environment': {'set': ['FOO,foo'], 'unset': ['BAR']}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
configuration_blacklist = {
|
||||
'enable': ['tcl'],
|
||||
'tcl': {
|
||||
'blacklist': ['callpath'],
|
||||
'all': {
|
||||
'autoload': 'direct'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
from spack.test.mock_packages_test import MockPackagesTest
|
||||
|
||||
|
||||
class TclTests(MockPackagesTest):
|
||||
def setUp(self):
|
||||
super(TclTests, self).setUp()
|
||||
self.configuration_obj = spack.modules.CONFIGURATION
|
||||
spack.modules.open = mock_open
|
||||
spack.modules.CONFIGURATION = None # Make sure that a non-mocked configuration will trigger an error
|
||||
|
||||
def tearDown(self):
|
||||
del spack.modules.open
|
||||
spack.modules.CONFIGURATION = self.configuration_obj
|
||||
super(TclTests, self).tearDown()
|
||||
|
||||
def get_modulefile_content(self, spec):
|
||||
spec.concretize()
|
||||
generator = spack.modules.TclModule(spec)
|
||||
generator.write()
|
||||
content = FILE_REGISTRY[generator.file_name].split('\n')
|
||||
return content
|
||||
|
||||
def test_simple_case(self):
|
||||
spack.modules.CONFIGURATION = configuration_autoload_direct
|
||||
spec = spack.spec.Spec('mpich@3.0.4=x86-linux')
|
||||
content = self.get_modulefile_content(spec)
|
||||
self.assertTrue('module-whatis "mpich @3.0.4"' in content )
|
||||
self.assertEqual(len([x for x in content if x.startswith('prepend-path CMAKE_PREFIX_PATH')]), 1)
|
||||
|
||||
def test_autoload(self):
|
||||
spack.modules.CONFIGURATION = configuration_autoload_direct
|
||||
spec = spack.spec.Spec('mpileaks=x86-linux')
|
||||
content = self.get_modulefile_content(spec)
|
||||
self.assertEqual(len([x for x in content if 'is-loaded' in x]), 2)
|
||||
self.assertEqual(len([x for x in content if 'module load ' in x]), 2)
|
||||
|
||||
spack.modules.CONFIGURATION = configuration_autoload_all
|
||||
spec = spack.spec.Spec('mpileaks=x86-linux')
|
||||
content = self.get_modulefile_content(spec)
|
||||
self.assertEqual(len([x for x in content if 'is-loaded' in x]), 5)
|
||||
self.assertEqual(len([x for x in content if 'module load ' in x]), 5)
|
||||
|
||||
def test_alter_environment(self):
|
||||
spack.modules.CONFIGURATION = configuration_alter_environment
|
||||
spec = spack.spec.Spec('mpileaks=x86-linux')
|
||||
content = self.get_modulefile_content(spec)
|
||||
self.assertEqual(len([x for x in content if x.startswith('prepend-path CMAKE_PREFIX_PATH')]), 0)
|
||||
self.assertEqual(len([x for x in content if 'setenv FOO "foo"' in x]), 1)
|
||||
self.assertEqual(len([x for x in content if 'unsetenv BAR' in x]), 1)
|
||||
|
||||
spec = spack.spec.Spec('libdwarf=x64-linux')
|
||||
content = self.get_modulefile_content(spec)
|
||||
self.assertEqual(len([x for x in content if x.startswith('prepend-path CMAKE_PREFIX_PATH')]), 0)
|
||||
self.assertEqual(len([x for x in content if 'setenv FOO "foo"' in x]), 0)
|
||||
self.assertEqual(len([x for x in content if 'unsetenv BAR' in x]), 0)
|
||||
|
||||
def test_blacklist(self):
|
||||
spack.modules.CONFIGURATION = configuration_blacklist
|
||||
spec = spack.spec.Spec('mpileaks=x86-linux')
|
||||
content = self.get_modulefile_content(spec)
|
||||
self.assertEqual(len([x for x in content if 'is-loaded' in x]), 1)
|
||||
self.assertEqual(len([x for x in content if 'module load ' in x]), 1)
|
Loading…
Reference in a new issue