Exemple #1
0
def test_installed_upstream(upstream_and_downstream_db):
    upstream_write_db, upstream_db, upstream_layout,\
        downstream_db, downstream_layout = (upstream_and_downstream_db)

    default = ('build', 'link')
    mock_repo = MockPackageMultiRepo()
    x = mock_repo.add_package('x', [], [])
    z = mock_repo.add_package('z', [], [])
    y = mock_repo.add_package('y', [z], [default])
    mock_repo.add_package('w', [x, y], [default, default])

    with spack.repo.use_repositories(mock_repo):
        spec = spack.spec.Spec('w')
        spec.concretize()

        for dep in spec.traverse(root=False):
            upstream_write_db.add(dep, upstream_layout)
        upstream_db._read()

        for dep in spec.traverse(root=False):
            record = downstream_db.get_by_hash(dep.dag_hash())
            assert record is not None
            with pytest.raises(spack.database.ForbiddenLockError):
                record = upstream_db.get_by_hash(dep.dag_hash())

        new_spec = spack.spec.Spec('w')
        new_spec.concretize()
        downstream_db.add(new_spec, downstream_layout)
        for dep in new_spec.traverse(root=False):
            upstream, record = downstream_db.query_by_spec_hash(dep.dag_hash())
            assert upstream
            assert record.path == upstream_layout.path_for_spec(dep)
        upstream, record = downstream_db.query_by_spec_hash(
            new_spec.dag_hash())
        assert not upstream
        assert record.installed

        upstream_db._check_ref_counts()
        downstream_db._check_ref_counts()
Exemple #2
0
def test_specify_preinstalled_dep():
    """Specify the use of a preinstalled package during concretization with a
    transitive dependency that is only supplied by the preinstalled package.
    """
    default = ('build', 'link')

    mock_repo = MockPackageMultiRepo()
    c = mock_repo.add_package('c', [], [])
    b = mock_repo.add_package('b', [c], [default])
    mock_repo.add_package('a', [b], [default])

    with spack.repo.swap(mock_repo):
        b_spec = Spec('b')
        b_spec.concretize()
        for spec in b_spec.traverse():
            setattr(spec.package, 'installed', True)

        a_spec = Spec('a')
        a_spec._add_dependency(b_spec, default)
        a_spec.concretize()

        assert set(x.name for x in a_spec.traverse()) == set(['a', 'b', 'c'])
Exemple #3
0
def test_cannot_write_upstream(tmpdir_factory, gen_mock_layout):
    roots = [str(tmpdir_factory.mktemp(x)) for x in ['a', 'b']]
    layouts = [gen_mock_layout(x) for x in ['/ra/', '/rb/']]

    mock_repo = MockPackageMultiRepo()
    mock_repo.add_package('x', [], [])

    # Instantiate the database that will be used as the upstream DB and make
    # sure it has an index file
    upstream_db_independent = spack.database.Database(roots[1])
    with upstream_db_independent.write_transaction():
        pass

    upstream_dbs = spack.store._construct_upstream_dbs_from_install_roots(
        [roots[1]], _test=True)

    with spack.repo.use_repositories(mock_repo):
        spec = spack.spec.Spec('x')
        spec.concretize()

        with pytest.raises(spack.database.ForbiddenLockError):
            upstream_dbs[0].add(spec, layouts[1])
Exemple #4
0
def test_installed_deps():
    """Preinstall a package P with a constrained build dependency D, then
    concretize a dependent package which also depends on P and D, specifying
    that the installed instance of P should be used. In this case, D should
    not be constrained by P since P is already built.
    """
    # FIXME: this requires to concretize build deps separately if we are
    # FIXME: using the clingo based concretizer
    if spack.config.get('config:concretizer') == 'clingo':
        pytest.xfail('requires separate concretization of build dependencies')

    default = ('build', 'link')
    build_only = ('build', )

    mock_repo = MockPackageMultiRepo()
    e = mock_repo.add_package('e', [], [])
    d = mock_repo.add_package('d', [], [])
    c_conditions = {d.name: {'c': 'd@2'}, e.name: {'c': 'e@2'}}
    c = mock_repo.add_package('c', [d, e], [build_only, default],
                              conditions=c_conditions)
    b = mock_repo.add_package('b', [d, e], [default, default])
    mock_repo.add_package('a', [b, c], [default, default])

    with spack.repo.use_repositories(mock_repo):
        c_spec = Spec('c')
        c_spec.concretize()
        assert c_spec['d'].version == spack.version.Version('2')

        c_installed = spack.spec.Spec.from_dict(c_spec.to_dict())
        for spec in c_installed.traverse():
            setattr(spec.package, 'installed', True)

        a_spec = Spec('a')
        a_spec._add_dependency(c_installed, default)
        a_spec.concretize()

        assert a_spec['d'].version == spack.version.Version('3')
        assert a_spec['e'].version == spack.version.Version('2')
Exemple #5
0
def test_mock_package_possible_dependencies():
    mock_repo = MockPackageMultiRepo()
    e = mock_repo.add_package('e')
    d = mock_repo.add_package('d', [e])
    c = mock_repo.add_package('c', [d])
    b = mock_repo.add_package('b', [d])
    a = mock_repo.add_package('a', [b, c])

    with spack.repo.use_repositories(mock_repo):
        assert set(a.possible_dependencies()) == set(['a', 'b', 'c', 'd', 'e'])
        assert set(b.possible_dependencies()) == set(['b', 'd', 'e'])
        assert set(c.possible_dependencies()) == set(['c', 'd', 'e'])
        assert set(d.possible_dependencies()) == set(['d', 'e'])
        assert set(e.possible_dependencies()) == set(['e'])

        assert set(a.possible_dependencies(transitive=False)) == set(
            ['a', 'b', 'c'])
        assert set(b.possible_dependencies(transitive=False)) == set(
            ['b', 'd'])
        assert set(c.possible_dependencies(transitive=False)) == set(
            ['c', 'd'])
        assert set(d.possible_dependencies(transitive=False)) == set(
            ['d', 'e'])
        assert set(e.possible_dependencies(transitive=False)) == set(['e'])