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 test_included_config_precedence(): test_config = """\ env: include: - ./high-config.yaml # this one should take precedence - ./low-config.yaml specs: - mpileaks """ _env_create('test', StringIO(test_config)) e = ev.read('test') with open(os.path.join(e.path, 'high-config.yaml'), 'w') as f: f.write("""\ packages: libelf: version: [0.8.10] # this should override libelf version below """) with open(os.path.join(e.path, 'low-config.yaml'), 'w') as f: f.write("""\ packages: mpileaks: version: [2.2] libelf: version: [0.8.12] """) with e: e.concretize() assert any(x.satisfies('[email protected]') for x in e._get_environment_specs()) assert any( [x.satisfies('[email protected]') for x in e._get_environment_specs()])
def test_read_old_lock_and_write_new(tmpdir): build_only = ('build', ) y = MockPackage('y', [], []) x = MockPackage('x', [y], [build_only]) mock_repo = MockPackageMultiRepo([x, y]) with spack.repo.swap(mock_repo): x = Spec('x') x.concretize() y = x['y'] test_lockfile_dict = create_v1_lockfile_dict([x], [x, y]) test_lockfile_path = str(tmpdir.join('test.lock')) with open(test_lockfile_path, 'w') as f: sjson.dump(test_lockfile_dict, stream=f) _env_create('test', test_lockfile_path, with_view=False) e = ev.read('test') hashes = set(e._to_lockfile_dict()['concrete_specs']) # When the lockfile is rewritten, it should adopt the new hash scheme # which accounts for all dependencies, including build dependencies assert hashes == set([x.build_hash(), y.build_hash()])
def test_env_with_included_config_scope(): config_scope_path = os.path.join(ev.root('test'), 'config') test_config = """\ env: include: - %s specs: - mpileaks """ % config_scope_path _env_create('test', StringIO(test_config)) e = ev.read('test') fs.mkdirp(config_scope_path) with open(os.path.join(config_scope_path, 'packages.yaml'), 'w') as f: f.write("""\ packages: mpileaks: version: [2.2] """) with e: e.concretize() assert any(x.satisfies('[email protected]') for x in e._get_environment_specs())
def test_env_config_precedence(): test_config = """\ env: packages: libelf: version: [0.8.12] include: - ./included-config.yaml specs: - mpileaks """ _env_create('test', StringIO(test_config)) e = ev.read('test') with open(os.path.join(e.path, 'included-config.yaml'), 'w') as f: f.write("""\ packages: mpileaks: version: [2.2] libelf: version: [0.8.11] """) with e: e.concretize() # ensure included scope took effect assert any(x.satisfies('[email protected]') for x in e._get_environment_specs()) # ensure env file takes precedence assert any( x.satisfies('[email protected]') for x in e._get_environment_specs())
def test_env_with_included_config_scope(): config_scope_path = os.path.join(ev.root('test'), 'config') test_config = """\ env: include: - %s specs: - mpileaks """ % config_scope_path spack.package_prefs.PackagePrefs.clear_caches() _env_create('test', StringIO(test_config)) e = ev.read('test') fs.mkdirp(config_scope_path) with open(os.path.join(config_scope_path, 'packages.yaml'), 'w') as f: f.write("""\ packages: mpileaks: version: [2.2] """) ev.prepare_config_scope(e) e.concretize() assert any(x.satisfies('[email protected]') for x in e._get_environment_specs())
def test_env_with_included_config_file(): test_config = """\ env: include: - ./included-config.yaml specs: - mpileaks """ spack.package_prefs.PackagePrefs.clear_caches() _env_create('test', StringIO(test_config)) e = ev.read('test') with open(os.path.join(e.path, 'included-config.yaml'), 'w') as f: f.write("""\ packages: mpileaks: version: [2.2] """) ev.prepare_config_scope(e) e.concretize() assert any(x.satisfies('[email protected]') for x in e._get_environment_specs())
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 test_env_with_config(): test_config = """\ env: specs: - mpileaks packages: mpileaks: version: [2.2] """ _env_create('test', StringIO(test_config)) e = ev.read('test') with e: e.concretize() assert any(x.satisfies('[email protected]') for x in e._get_environment_specs())
def test_env_config_view_default(tmpdir, mock_stage, mock_fetch, install_mockery): # This config doesn't mention whether a view is enabled test_config = """\ env: specs: - mpileaks """ _env_create('test', StringIO(test_config)) with ev.read('test'): install('--fake') e = ev.read('test') # Try retrieving the view object view = e.default_view.view() assert view.get_spec('mpileaks')
def test_env_with_config(): test_config = """\ env: specs: - mpileaks packages: mpileaks: version: [2.2] """ spack.package_prefs.PackagePrefs.clear_caches() _env_create('test', StringIO(test_config)) e = ev.read('test') ev.prepare_config_scope(e) e.concretize() assert any(x.satisfies('[email protected]') for x in e._get_environment_specs())
def test_included_config_precedence(): test_config = """\ env: include: - ./high-config.yaml # this one should take precedence - ./low-config.yaml specs: - mpileaks """ spack.package_prefs.PackagePrefs.clear_caches() _env_create('test', StringIO(test_config)) e = ev.read('test') with open(os.path.join(e.path, 'high-config.yaml'), 'w') as f: f.write("""\ packages: libelf: version: [0.8.10] # this should override libelf version below """) with open(os.path.join(e.path, 'low-config.yaml'), 'w') as f: f.write("""\ packages: mpileaks: version: [2.2] libelf: version: [0.8.12] """) ev.prepare_config_scope(e) e.concretize() assert any( x.satisfies('[email protected]') for x in e._get_environment_specs()) assert any( [x.satisfies('[email protected]') for x in e._get_environment_specs()])
def test_env_config_precedence(): test_config = """\ env: packages: libelf: version: [0.8.12] include: - ./included-config.yaml specs: - mpileaks """ spack.package_prefs.PackagePrefs.clear_caches() _env_create('test', StringIO(test_config)) e = ev.read('test') with open(os.path.join(e.path, 'included-config.yaml'), 'w') as f: f.write("""\ packages: mpileaks: version: [2.2] libelf: version: [0.8.11] """) ev.prepare_config_scope(e) e.concretize() # ensure included scope took effect assert any( x.satisfies('[email protected]') for x in e._get_environment_specs()) # ensure env file takes precedence assert any( x.satisfies('[email protected]') for x in e._get_environment_specs())