# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os
import sys
import pytest
import llnl.util.filesystem as fs
import spack.install_test
import spack.spec
pytestmark = pytest.mark.skipif(sys.platform == 'win32',
reason="Tests fail on Windows")
[docs]def test_test_log_pathname(mock_packages, config):
"""Ensure test log path is reasonable."""
spec = spack.spec.Spec('libdwarf').concretized()
test_name = 'test_name'
test_suite = spack.install_test.TestSuite([spec], test_name)
logfile = test_suite.log_file_for_spec(spec)
assert test_suite.stage in logfile
assert test_suite.test_log_name(spec) in logfile
[docs]def test_test_ensure_stage(mock_test_stage):
"""Make sure test stage directory is properly set up."""
spec = spack.spec.Spec('libdwarf').concretized()
test_name = 'test_name'
test_suite = spack.install_test.TestSuite([spec], test_name)
test_suite.ensure_stage()
assert os.path.isdir(test_suite.stage)
assert mock_test_stage in test_suite.stage
[docs]def test_write_test_result(mock_packages, mock_test_stage):
"""Ensure test results written to a results file."""
spec = spack.spec.Spec('libdwarf').concretized()
result = 'TEST'
test_name = 'write-test'
test_suite = spack.install_test.TestSuite([spec], test_name)
test_suite.ensure_stage()
results_file = test_suite.results_file
test_suite.write_test_result(spec, result)
with open(results_file, 'r') as f:
lines = f.readlines()
assert len(lines) == 1
msg = lines[0]
assert result in msg
assert spec.name in msg
[docs]def test_do_test(mock_packages, install_mockery, mock_test_stage):
"""Perform a stand-alone test with files to copy."""
spec = spack.spec.Spec('trivial-smoke-test').concretized()
test_name = 'test_do_test'
test_filename = 'test_file.in'
pkg = spec.package
pkg.create_extra_test_source()
test_suite = spack.install_test.TestSuite([spec], test_name)
test_suite.current_test_spec = spec
test_suite.current_base_spec = spec
test_suite.ensure_stage()
# Save off target paths for current spec since test suite processing
# assumes testing multiple specs.
cached_filename = fs.join_path(test_suite.current_test_cache_dir,
pkg.test_source_filename)
data_filename = fs.join_path(test_suite.current_test_data_dir,
test_filename)
# Run the test, making sure to retain the test stage directory
# so we can ensure the files were copied.
test_suite(remove_directory=False)
assert os.path.exists(cached_filename)
assert os.path.exists(data_filename)
[docs]@pytest.mark.parametrize('arguments,status,msg', [
({}, 'SKIPPED', 'Skipped'),
({'externals': True}, 'NO-TESTS', 'No tests'),
])
def test_test_external(mock_packages, install_mockery, mock_test_stage,
arguments, status, msg):
def ensure_results(filename, expected):
assert os.path.exists(filename)
with open(filename, 'r') as fd:
lines = fd.readlines()
have = False
for line in lines:
if expected in line:
have = True
break
assert have
name = 'trivial-smoke-test'
spec = spack.spec.Spec(name).concretized()
spec.external_path = '/path/to/external/{0}'.format(name)
test_suite = spack.install_test.TestSuite([spec])
test_suite(**arguments)
ensure_results(test_suite.results_file, status)
ensure_results(test_suite.log_file_for_spec(spec), msg)
[docs]def test_test_stage_caches(mock_packages, install_mockery, mock_test_stage):
def ensure_current_cache_fail(test_suite):
with pytest.raises(spack.install_test.TestSuiteSpecError):
_ = test_suite.current_test_cache_dir
with pytest.raises(spack.install_test.TestSuiteSpecError):
_ = test_suite.current_test_data_dir
spec = spack.spec.Spec('libelf').concretized()
test_suite = spack.install_test.TestSuite([spec], 'test-cache')
# Check no current specs yield failure
ensure_current_cache_fail(test_suite)
# Check no current base spec yields failure
test_suite.current_base_spec = None
test_suite.current_test_spec = spec
ensure_current_cache_fail(test_suite)
# Check no current test spec yields failure
test_suite.current_base_spec = spec
test_suite.current_test_spec = None
ensure_current_cache_fail(test_suite)
[docs]def test_test_spec_run_once(mock_packages, install_mockery, mock_test_stage):
spec = spack.spec.Spec('libelf').concretized()
test_suite = spack.install_test.TestSuite([spec], 'test-dups')
(test_suite.specs[0]).package.test_suite = test_suite
with pytest.raises(spack.install_test.TestSuiteFailure):
test_suite()
[docs]def test_test_spec_verbose(mock_packages, install_mockery, mock_test_stage):
spec = spack.spec.Spec('simple-standalone-test').concretized()
test_suite = spack.install_test.TestSuite([spec])
test_suite(verbose=True)
passed, msg = False, False
with open(test_suite.log_file_for_spec(spec), 'r') as fd:
for line in fd:
if 'simple stand-alone test' in line:
msg = True
elif 'PASSED' in line:
passed = True
assert msg
assert passed
[docs]def test_get_test_suite():
assert not spack.install_test.get_test_suite('nothing')
[docs]def test_get_test_suite_no_name(mock_packages, mock_test_stage):
with pytest.raises(spack.install_test.TestSuiteNameError) as exc_info:
spack.install_test.get_test_suite('')
assert 'name is required' in str(exc_info)
[docs]def test_get_test_suite_too_many(mock_packages, mock_test_stage):
test_suites = []
name = 'duplicate-alias'
def add_suite(package):
spec = spack.spec.Spec(package).concretized()
suite = spack.install_test.TestSuite([spec], name)
suite.ensure_stage()
spack.install_test.write_test_suite_file(suite)
test_suites.append(suite)
add_suite('libdwarf')
suite = spack.install_test.get_test_suite(name)
assert suite.alias == name
add_suite('libelf')
with pytest.raises(spack.install_test.TestSuiteNameError) as exc_info:
spack.install_test.get_test_suite(name)
assert 'many suites named' in str(exc_info)