def test_store_different_build_deps(): r"""Ensure that an environment can store two instances of a build-only dependency:: x y /| (l) | (b) (b) | y z2 \| (b) z1 """ default = ('build', 'link') build_only = ('build', ) z = MockPackage('z', [], []) y = MockPackage('y', [z], [build_only]) x = MockPackage('x', [y, z], [default, build_only]) mock_repo = MockPackageMultiRepo([x, y, z]) def noop(*args): pass setattr(mock_repo, 'dump_provenance', noop) with spack.repo.swap(mock_repo): y_spec = Spec('y ^z@3') y_concretized = y_spec.concretized() x_spec = Spec('x ^z@2') x_concretized = x_spec.concretized() # Even though x chose a different 'z', it should choose the same y # according to the DAG hash (since build deps are excluded from # comparison by default). Although the dag hashes are equal, the specs # are not considered equal because they compare build deps. assert x_concretized['y'].dag_hash() == y_concretized.dag_hash() _env_create('test', with_view=False) e = ev.read('test') e.add(y_spec) e.add(x_spec) e.concretize() e.write() e_read = ev.read('test') y_env_hash, x_env_hash = e_read.concretized_order y_read = e_read.specs_by_hash[y_env_hash] x_read = e_read.specs_by_hash[x_env_hash] assert x_read['z'] != y_read['z']
def check_concretize(abstract_spec): abstract = Spec(abstract_spec) concrete = abstract.concretized() assert not abstract.concrete assert concrete.concrete check_spec(abstract, concrete) return concrete
def test_indirect_build_dep(): """Simple case of X->Y->Z where Y is a build/link dep and Z is a build-only dep. Make sure this concrete DAG is preserved when writing the environment out and reading it back. """ default = ('build', 'link') build_only = ('build', ) z = MockPackage('z', [], []) y = MockPackage('y', [z], [build_only]) x = MockPackage('x', [y], [default]) mock_repo = MockPackageMultiRepo([x, y, z]) def noop(*args): pass setattr(mock_repo, 'dump_provenance', noop) with spack.repo.swap(mock_repo): x_spec = Spec('x') x_concretized = x_spec.concretized() _env_create('test', with_view=False) e = ev.read('test') e.add(x_spec) e.concretize() e.write() e_read = ev.read('test') x_env_hash, = e_read.concretized_order x_env_spec = e_read.specs_by_hash[x_env_hash] assert x_env_spec == x_concretized
def check_concretize(self, abstract_spec): abstract = Spec(abstract_spec) concrete = abstract.concretized() self.assertFalse(abstract.concrete) self.assertTrue(concrete.concrete) self.check_spec(abstract, concrete) return concrete