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()
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'])
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])
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')
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'])