From 567d0ee4557cf24440dffb346a10095cfb4e5117 Mon Sep 17 00:00:00 2001 From: Tamara Dahlgren <35777542+tldahlgren@users.noreply.github.com> Date: Mon, 29 May 2023 07:56:17 -0700 Subject: tests/hdf5: convert to new stand-alone test process (#35732) --- var/spack/repos/builtin/packages/hdf5/package.py | 176 ++++++++++------------- 1 file changed, 74 insertions(+), 102 deletions(-) (limited to 'var/spack') diff --git a/var/spack/repos/builtin/packages/hdf5/package.py b/var/spack/repos/builtin/packages/hdf5/package.py index 4efba18d87..4d180c1bc7 100644 --- a/var/spack/repos/builtin/packages/hdf5/package.py +++ b/var/spack/repos/builtin/packages/hdf5/package.py @@ -7,6 +7,7 @@ import os import re import shutil +import llnl.util.lang import llnl.util.tty as tty from spack.package import * @@ -556,6 +557,12 @@ class Hdf5(CMakePackage): def setup_build_environment(self, env): env.set("SZIP_INSTALL", self.spec["szip"].prefix) + def setup_run_environment(self, env): + # According to related github posts and problems running test_install + # as a stand-alone test, it appears the lib path must be added to + # LD_LIBRARY_PATH. + env.append_path("LD_LIBRARY_PATH", self.prefix.lib) + @run_before("cmake") def fortran_check(self): if "+fortran" in self.spec and not self.compiler.fc: @@ -686,67 +693,60 @@ class Hdf5(CMakePackage): if not os.path.exists(tgt_filename): symlink(src_filename, tgt_filename) + @property + @llnl.util.lang.memoized + def _output_version(self): + spec_vers_str = str(self.spec.version.up_to(3)) + if "develop" in spec_vers_str: + # Remove 'develop-' from the version in spack for checking + # version against the version in the HDF5 code. + spec_vers_str = spec_vers_str.partition("-")[2] + return spec_vers_str + @run_after("install") @on_package_attributes(run_tests=True) def check_install(self): - self._check_install() + self.test_check_prog() - def _check_install(self): - # Build and run a small program to test the installed HDF5 library - spec = self.spec + def test_check_prog(self): + """build, run and check output of check.c""" print("Checking HDF5 installation...") + prog = "check.c" + + spec = self.spec checkdir = "spack-check" - with working_dir(checkdir, create=True): - # Because the release number in a develop branch is not fixed, - # only the major and minor version numbers are compared. - # Otherwise all 3 numbers are checked. - if "develop" in str(spec.version.up_to(3)): - source = r""" -#include -#include -#include -int main(int argc, char **argv) { - unsigned majnum, minnum, relnum; - herr_t herr = H5get_libversion(&majnum, &minnum, &relnum); - assert(!herr); - printf("HDF5 version %d.%d %u.%u\n", H5_VERS_MAJOR, H5_VERS_MINOR, - majnum, minnum); - return 0; -} -""" - else: - source = r""" + + # Because the release number in a develop branch is not fixed, + # only the major and minor version numbers are compared. + # Otherwise all 3 numbers are checked. + fmt = "%d.%d %u.%u" + arg_line1 = "H5_VERS_MAJOR, H5_VERS_MINOR" + arg_line2 = "majnum, minnum" + if not spec.version.isdevelop(): + fmt = "%d." + fmt + ".%u" + arg_line2 = "H5_VERS_RELEASE, " + arg_line2 + ", relnum" + + source = r""" #include #include #include -int main(int argc, char **argv) { +int main(int argc, char **argv) {{ unsigned majnum, minnum, relnum; herr_t herr = H5get_libversion(&majnum, &minnum, &relnum); assert(!herr); - printf("HDF5 version %d.%d.%d %u.%u.%u\n", H5_VERS_MAJOR, H5_VERS_MINOR, - H5_VERS_RELEASE, majnum, minnum, relnum); + printf("HDF5 version {}\n", {}, + {}); return 0; -} +}} """ - expected = """\ -HDF5 version {version} {version} -""".format( - version=str(spec.version.up_to(3)) - ) - if "develop" in expected: - # Remove 'develop-' from the version in spack for checking - # version against the version in the HDF5 code. - expected = """\ -HDF5 version {version} {version} -""".format( - version=str(spec.version.up_to(3)).partition("-")[2] - ) - with open("check.c", "w") as f: - f.write(source) - if "+mpi" in spec: - cc = Executable(spec["mpi"].mpicc) - else: - cc = Executable(self.compiler.cc) + + expected = f"HDF5 version {self._output_version} {self._output_version}\n" + + with working_dir(checkdir, create=True): + with open(prog, "w") as f: + f.write(source.format(fmt, arg_line1, arg_line2)) + + cc = Executable(os.environ["CC"]) cc(*(["-c", "check.c"] + spec["hdf5"].headers.cpp_flags.split())) cc(*(["-o", "check", "check.o"] + spec["hdf5"].libs.ld_flags.split())) try: @@ -768,13 +768,9 @@ HDF5 version {version} {version} raise RuntimeError("HDF5 install check failed") shutil.rmtree(checkdir) - def _test_check_versions(self): + def test_version(self): """Perform version checks on selected installed package binaries.""" - spec_vers_str = "Version {0}".format(self.spec.version) - if "develop" in spec_vers_str: - # Remove 'develop-' from the version in spack for checking - # version against the version in the HDF5 code. - spec_vers_str = spec_vers_str.partition("-")[2] + expected = f"Version {self._output_version}" exes = [ "h5copy", @@ -789,55 +785,31 @@ HDF5 version {version} {version} ] use_short_opt = ["h52gif", "h5repart", "h5unjam"] for exe in exes: - reason = "test: ensuring version of {0} is {1}".format(exe, spec_vers_str) + reason = f"ensure version of {exe} is {self._output_version}" option = "-V" if exe in use_short_opt else "--version" - self.run_test( - exe, option, spec_vers_str, installed=True, purpose=reason, skip_missing=True - ) - - def _test_example(self): - """This test performs copy, dump, and diff on an example hdf5 file.""" - test_data_dir = self.test_suite.current_test_data_dir + with test_part(self, f"test_version_{exe}", purpose=reason): + path = join_path(self.prefix.bin, exe) + if not os.path.isfile(path): + raise SkipTest(f"{path} is not installed") - filename = "spack.h5" - h5_file = test_data_dir.join(filename) + prog = which(path) + output = prog(option, output=str.split, error=str.split) + assert expected in output - reason = "test: ensuring h5dump produces expected output" - expected = get_escaped_text_output(test_data_dir.join("dump.out")) - self.run_test( - "h5dump", - filename, - expected, - installed=True, - purpose=reason, - skip_missing=True, - work_dir=test_data_dir, - ) - - reason = "test: ensuring h5copy runs" - options = ["-i", h5_file, "-s", "Spack", "-o", "test.h5", "-d", "Spack"] - self.run_test( - "h5copy", options, [], installed=True, purpose=reason, skip_missing=True, work_dir="." - ) - - reason = "test: ensuring h5diff shows no differences between orig and" " copy" - self.run_test( - "h5diff", - [h5_file, "test.h5"], - [], - installed=True, - purpose=reason, - skip_missing=True, - work_dir=".", - ) - - def test(self): - """Perform smoke tests on the installed package.""" - # Simple version check tests on known binaries - self._test_check_versions() - - # Run sequence of commands on an hdf5 file - self._test_example() - - # Run existing install check - self._check_install() + def test_example(self): + """copy, dump, and diff example hdf5 file""" + test_data_dir = self.test_suite.current_test_data_dir + with working_dir(test_data_dir, create=True): + filename = "spack.h5" + h5dump = which(self.prefix.bin.h5dump) + out = h5dump(filename, output=str.split, error=str.split) + expected = get_escaped_text_output("dump.out") + check_outputs(expected, out) + + h5copy = which(self.prefix.bin.h5copy) + copyname = "test.h5" + options = ["-i", filename, "-s", "Spack", "-o", copyname, "-d", "Spack"] + h5copy(*options) + + h5diff = which(self.prefix.bin.h5diff) + h5diff(filename, copyname) -- cgit v1.2.3-60-g2f50