test_activations: test Python's extension logic
This commit is contained in:
parent
dde93c01cf
commit
3a2a0c9ad4
168
lib/spack/spack/test/test_activations.py
Normal file
168
lib/spack/spack/test/test_activations.py
Normal file
@ -0,0 +1,168 @@
|
||||
##############################################################################
|
||||
# Copyright (c) 2013-2017, Lawrence Livermore National Security, LLC.
|
||||
# Produced at the Lawrence Livermore National Laboratory.
|
||||
#
|
||||
# This file is part of Spack.
|
||||
# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
|
||||
# LLNL-CODE-647188
|
||||
#
|
||||
# For details, see https://github.com/llnl/spack
|
||||
# Please also see the NOTICE and LICENSE files for our notice and the LGPL.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License (as
|
||||
# published by the Free Software Foundation) version 2.1, February 1999.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
|
||||
# conditions of the GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
##############################################################################
|
||||
|
||||
import spack
|
||||
from llnl.util.filesystem import join_path
|
||||
from spack.directory_layout import YamlDirectoryLayout
|
||||
from spack.filesystem_view import YamlFilesystemView
|
||||
|
||||
import os
|
||||
import pytest
|
||||
|
||||
|
||||
class FakeExtensionPackage(object):
|
||||
def __init__(self, name, prefix):
|
||||
self.name = name
|
||||
self.prefix = prefix
|
||||
self.spec = FakeSpec(self)
|
||||
|
||||
|
||||
class FakeSpec(object):
|
||||
def __init__(self, package):
|
||||
self.name = package.name
|
||||
self.prefix = package.prefix
|
||||
self.hash = self.name
|
||||
|
||||
def dag_hash(self):
|
||||
return self.hash
|
||||
|
||||
|
||||
def create_dir_structure(tmpdir, dir_structure):
|
||||
for fname, children in dir_structure.items():
|
||||
tmpdir.ensure(fname, dir=fname.endswith('/'))
|
||||
if children:
|
||||
create_dir_structure(tmpdir.join(fname), children)
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def python_and_extension_dirs(tmpdir):
|
||||
python_dirs = {
|
||||
'bin/': {
|
||||
'python': None
|
||||
},
|
||||
'lib/': {
|
||||
'python2.7/': {
|
||||
'site-packages/': None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
python_name = 'python'
|
||||
python_prefix = tmpdir.join(python_name)
|
||||
create_dir_structure(python_prefix, python_dirs)
|
||||
|
||||
python_spec = spack.spec.Spec('python@2.7.12')
|
||||
python_spec._concrete = True
|
||||
python_spec.package.spec._set_test_prefix(str(python_prefix))
|
||||
|
||||
ext_dirs = {
|
||||
'bin/': {
|
||||
'py-ext-tool': None
|
||||
},
|
||||
'lib/': {
|
||||
'python2.7/': {
|
||||
'site-packages/': {
|
||||
'py-extension/': {
|
||||
'sample.py': None
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ext_name = 'py-extension'
|
||||
ext_prefix = tmpdir.join(ext_name)
|
||||
create_dir_structure(ext_prefix, ext_dirs)
|
||||
|
||||
easy_install_location = 'lib/python2.7/site-packages/easy-install.pth'
|
||||
with open(join_path(ext_prefix, easy_install_location), 'w') as F:
|
||||
F.write("""path/to/ext1.egg
|
||||
path/to/setuptools.egg""")
|
||||
|
||||
return str(python_prefix), str(ext_prefix)
|
||||
|
||||
|
||||
def test_python_activation(tmpdir):
|
||||
# Note the lib directory is based partly on the python version
|
||||
python_spec = spack.spec.Spec('python@2.7.12')
|
||||
python_spec._concrete = True
|
||||
|
||||
python_name = 'python'
|
||||
tmpdir.ensure(python_name, dir=True)
|
||||
|
||||
python_prefix = str(tmpdir.join(python_name))
|
||||
# Set the prefix on the package's spec reference because that is a copy of
|
||||
# the original spec
|
||||
python_spec.package.spec._set_test_prefix(python_prefix)
|
||||
|
||||
ext_name = 'py-extension'
|
||||
tmpdir.ensure(ext_name, dir=True)
|
||||
ext_pkg = FakeExtensionPackage(ext_name, str(tmpdir.join(ext_name)))
|
||||
|
||||
python_pkg = python_spec.package
|
||||
python_pkg.activate(ext_pkg)
|
||||
|
||||
|
||||
def test_python_activation_with_files(tmpdir, python_and_extension_dirs):
|
||||
python_prefix, ext_prefix = python_and_extension_dirs
|
||||
|
||||
python_spec = spack.spec.Spec('python@2.7.12')
|
||||
python_spec._concrete = True
|
||||
python_spec.package.spec._set_test_prefix(python_prefix)
|
||||
|
||||
ext_pkg = FakeExtensionPackage('py-extension', ext_prefix)
|
||||
|
||||
python_pkg = python_spec.package
|
||||
python_pkg.activate(ext_pkg)
|
||||
|
||||
assert os.path.exists(join_path(python_prefix, 'bin/py-ext-tool'))
|
||||
|
||||
easy_install_location = 'lib/python2.7/site-packages/easy-install.pth'
|
||||
with open(join_path(python_prefix, easy_install_location), 'r') as F:
|
||||
easy_install_contents = F.read()
|
||||
|
||||
assert 'ext1.egg' in easy_install_contents
|
||||
assert 'setuptools.egg' not in easy_install_contents
|
||||
|
||||
|
||||
def test_python_activation_view(tmpdir, python_and_extension_dirs):
|
||||
python_prefix, ext_prefix = python_and_extension_dirs
|
||||
|
||||
python_spec = spack.spec.Spec('python@2.7.12')
|
||||
python_spec._concrete = True
|
||||
python_spec.package.spec._set_test_prefix(python_prefix)
|
||||
|
||||
ext_pkg = FakeExtensionPackage('py-extension', ext_prefix)
|
||||
|
||||
view_dir = str(tmpdir.join('view'))
|
||||
layout = YamlDirectoryLayout(view_dir)
|
||||
view = YamlFilesystemView(view_dir, layout)
|
||||
|
||||
python_pkg = python_spec.package
|
||||
python_pkg.activate(ext_pkg, extensions_layout=view.extensions_layout)
|
||||
|
||||
assert not os.path.exists(join_path(python_prefix, 'bin/py-ext-tool'))
|
||||
|
||||
assert os.path.exists(join_path(view_dir, 'bin/py-ext-tool'))
|
Loading…
Reference in New Issue
Block a user