hdf5/tools/h5repack/h5repack.sh.in
Neil Fortner 6d13b7a243 [svn-r16800] Purpose: Fix bug 1516
Description:
h5repack previously would not take named datatypes into consideration when copying
datasets and attributes.  This would cause extra anonymous datatypes in the target file
at best, and cause errors halfway through the repacking at worst.  h5repack should now
always handle named datatypes correctly.  Named datatypes are also now converted to the
native type when -n is given.

Tested: jam, linew, smirom (h5committest)
2009-04-20 11:37:47 -05:00

523 lines
12 KiB
Bash
Executable File

#! /bin/sh
#
# Copyright by The HDF Group.
# Copyright by the Board of Trustees of the University of Illinois.
# All rights reserved.
#
# This file is part of HDF5. The full HDF5 copyright notice, including
# terms governing use, modification, and redistribution, is contained in
# the files COPYING and Copyright.html. COPYING can be found at the root
# of the source code distribution tree; Copyright.html can be found at the
# root level of an installed copy of the electronic HDF5 document set and
# is linked from the top-level documents page. It can also be found at
# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have
# access to either file, you may request a copy from help@hdfgroup.org.
#
# Tests for the h5repack tool
#
# Modification:
# Pedro Vicente Nunes, 11/15/2006
# Added $FILEN variables for file names
#
USE_FILTER_SZIP="@USE_FILTER_SZIP@"
USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
USE_FILTER_SHUFFLE="@USE_FILTER_SHUFFLE@"
USE_FILTER_FLETCHER32="@USE_FILTER_FLETCHER32@"
USE_FILTER_NBIT="@USE_FILTER_NBIT@"
USE_FILTER_SCALEOFFSET="@USE_FILTER_SCALEOFFSET@"
H5REPACK=h5repack # The tool name
H5REPACK_BIN=`pwd`/$H5REPACK # The path of the tool binary
H5DIFF=../h5diff/h5diff # The h5diff tool name
H5DIFF_BIN=`pwd`/$H5DIFF # The path of the h5diff tool binary
H5DETECTSZIP=testh5repack_detect_szip
H5DETECTSZIP_BIN=`pwd`/$H5DETECTSZIP
INFO_FILE=testfiles/h5repack.info
FILE0=h5repack_fill.h5
FILE1=h5repack_objs.h5
FILE2=h5repack_attr.h5
FILE3=h5repack_hlink.h5
FILE4=h5repack_layout.h5
FILE5=h5repack_early.h5
FILE7=h5repack_szip.h5
FILE8=h5repack_deflate.h5
FILE9=h5repack_shuffle.h5
FILE10=h5repack_fletcher.h5
FILE11=h5repack_filters.h5
FILE12=h5repack_nbit.h5
FILE13=h5repack_soffset.h5
FILE14=h5repack_layouto.h5 # A file with an older version of the layout message
# (copy of test/tlayouto.h5)
FILE15=h5repack_named_dtypes.h5
nerrors=0
verbose=yes
# The build (current) directory might be different than the source directory.
#
if test -z "$srcdir"; then
srcdir=.
fi
# Print a line-line message left justified in a field of 70 characters
# beginning with the word "Testing".
#
TESTING() {
SPACES=" "
echo "Testing $* $SPACES" | cut -c1-70 | tr -d '\012'
}
# Print a line-line message left justified in a field of 70 characters
# beginning with the word "Verifying".
#
VERIFY() {
SPACES=" "
echo "Verifying h5diff output $* $SPACES" | cut -c1-70 | tr -d '\012'
}
# Print a message that a test has been skipped (because a required filter
# was unavailable)
SKIP() {
TESTING $H5REPACK $@
echo " -SKIP-"
}
# Call the h5diff tool
#
DIFFTEST()
{
VERIFY $@
if [ "`uname -s`" = "TFLOPS O/S" ]; then
$RUNSERIAL $H5DIFF_BIN -q $@
else
$RUNSERIAL $H5DIFF_BIN -q "$@"
fi
RET=$?
if [ $RET != 0 ] ; then
echo "*FAILED*"
nerrors="`expr $nerrors + 1`"
else
echo " PASSED"
fi
}
# Call h5repack
#
TOOLTEST()
{
# Run test.
# Tflops interprets "$@" as "" when no parameter is given (e.g., the
# case of missing file name). Changed it to use $@ till Tflops fixes it.
TESTING $H5REPACK $@
infile=$srcdir/testfiles/$1
path=`pwd`
outfile=$path/out.$1
shift
if [ "`uname -s`" = "TFLOPS O/S" ]; then
$RUNSERIAL $H5REPACK_BIN $@ $infile $outfile
else
$RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
fi
RET=$?
if [ $RET != 0 ] ; then
echo "*FAILED*"
nerrors="`expr $nerrors + 1`"
else
echo " PASSED"
DIFFTEST $infile $outfile
fi
rm -f $outfile
}
TOOLTEST0()
{
# Run test.
# Tflops interprets "$@" as "" when no parameter is given (e.g., the
# case of missing file name). Changed it to use $@ till Tflops fixes it.
TESTING $H5REPACK $@
infile=$srcdir/testfiles/$1
path=`pwd`
outfile=$path/out.$1
shift
if [ "`uname -s`" = "TFLOPS O/S" ]; then
$RUNSERIAL $H5REPACK_BIN -i $infile -o $outfile $@
else
$RUNSERIAL $H5REPACK_BIN -i $infile -o $outfile "$@"
fi
RET=$?
if [ $RET != 0 ] ; then
echo "*FAILED*"
nerrors="`expr $nerrors + 1`"
else
echo " PASSED"
DIFFTEST $infile $outfile
fi
rm -f $outfile
}
#
# The tests
# We use the files generated by h5repacktst
# Each run generates "<file>.out.h5" and the tool h5diff is used to
# compare the input and output files
#
# the tests are the same as the program h5repacktst, but run from the CLI
#
# See which filters are usable (and skip tests for filters we
# don't have). Do this by searching H5pubconf.h to see which
# filters are defined.
# detect whether the encoder is present.
USE_FILTER_SZIP_ENCODER="no";
if test $USE_FILTER_SZIP = "yes"; then
USE_FILTER_SZIP_ENCODER=`$RUNSERIAL $H5DETECTSZIP_BIN`
fi
# copy files (these files have no filters)
TOOLTEST $FILE0
TOOLTEST $FILE1
TOOLTEST $FILE2
TOOLTEST $FILE3
TOOLTEST $FILE4
TOOLTEST $FILE5
# use $FILE4 to write some filters (this file has no filters)
# gzip with individual object
arg="$FILE4 -f dset1:GZIP=1 -l dset1:CHUNK=20x10"
if test $USE_FILTER_DEFLATE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# gzip for all
arg="$FILE4 -f GZIP=1"
if test $USE_FILTER_DEFLATE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# szip with individual object
arg="$FILE4 -f dset2:SZIP=8,EC -l dset2:CHUNK=20x10"
if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# szip for all
arg="$FILE4 -f SZIP=8,NN"
if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# shuffle with individual object
arg="$FILE4 -f dset2:SHUF -l dset2:CHUNK=20x10"
if test $USE_FILTER_SHUFFLE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# shuffle for all
arg="$FILE4 -f SHUF"
if test $USE_FILTER_SHUFFLE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# fletcher32 with individual object
arg="$FILE4 -f dset2:FLET -l dset2:CHUNK=20x10"
if test $USE_FILTER_FLETCHER32 != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# fletcher32 for all
arg="$FILE4 -f FLET"
if test $USE_FILTER_FLETCHER32 != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# all filters
arg="$FILE4 -f dset2:SHUF -f dset2:FLET -f dset2:SZIP=8,NN -f dset2:GZIP=1 -l dset2:CHUNK=20x10"
if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" -o $USE_FILTER_SHUFFLE != "yes" -o $USE_FILTER_FLETCHER32 != "yes" -o $USE_FILTER_DEFLATE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
###########################################################
# the following tests assume the input files have filters
###########################################################
# szip copy
arg="$FILE7"
if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# szip remove
arg="$FILE7 --filter=dset_szip:NONE"
if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# deflate copy
arg="$FILE8"
if test $USE_FILTER_DEFLATE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# deflate remove
arg="$FILE8 -f dset_deflate:NONE"
if test $USE_FILTER_DEFLATE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# shuffle copy
arg="$FILE9"
if test $USE_FILTER_SHUFFLE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# shuffle remove
arg="$FILE9 -f dset_shuffle:NONE"
if test $USE_FILTER_SHUFFLE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# fletcher32 copy
arg="$FILE10"
if test $USE_FILTER_FLETCHER32 != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# fletcher32 remove
arg="$FILE10 -f dset_fletcher32:NONE"
if test $USE_FILTER_FLETCHER32 != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# nbit copy
arg="$FILE12"
if test $USE_FILTER_NBIT != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# nbit remove
arg="$FILE12 -f dset_nbit:NONE"
if test $USE_FILTER_NBIT != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# nbit add
arg="$FILE12 -f dset_int31:NBIT"
if test $USE_FILTER_NBIT != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# scaleoffset copy
arg="$FILE13"
if test $USE_FILTER_SCALEOFFSET != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# scaleoffset add
arg="$FILE13 -f dset_none:SOFF=31,IN"
if test $USE_FILTER_SCALEOFFSET != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# scaleoffset remove
arg="$FILE13 -f dset_scaleoffset:NONE"
if test $USE_FILTER_SCALEOFFSET != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# remove all filters
arg="$FILE11 -f NONE"
if test $USE_FILTER_FLETCHER32 != "yes" -o $USE_FILTER_DEFLATE != "yes" -o $USE_FILTER_SZIP != "yes" -o $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SHUFFLE != "yes" -o $USE_FILTER_NBIT != "yes" -o $USE_FILTER_SCALEOFFSET != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
#filter conversions
arg="$FILE8 -f dset_deflate:SZIP=8,NN"
if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" -o $USE_FILTER_DEFLATE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
arg="$FILE7 -f dset_szip:GZIP=1"
if test $USE_FILTER_SZIP != "yes" -o $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_DEFLATE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
#limit
arg="$FILE4 -f GZIP=1 -m 1024"
if test $USE_FILTER_DEFLATE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
#file
arg="$FILE4 -e $INFO_FILE"
if test $USE_FILTER_DEFLATE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
#########################################################
# layout options (these files have no filters)
#########################################################
TOOLTEST $FILE4 --layout=dset2:CHUNK=20x10
TOOLTEST $FILE4 -l CHUNK=20x10
TOOLTEST $FILE4 -l dset2:CONTI
TOOLTEST $FILE4 -l CONTI
TOOLTEST $FILE4 -l dset2:COMPA
TOOLTEST $FILE4 -l COMPA
################################################################
# layout conversions (file has no filters)
###############################################################
TOOLTEST $FILE4 -l dset_compact:CONTI
TOOLTEST $FILE4 -l dset_compact:CHUNK=2x5
TOOLTEST $FILE4 -l dset_compact:COMPA
TOOLTEST $FILE4 -l dset_contiguous:COMPA
TOOLTEST $FILE4 -l dset_contiguous:CHUNK=3x6
TOOLTEST $FILE4 -l dset_contiguous:CONTI
TOOLTEST $FILE4 -l dset_chunk:COMPA
TOOLTEST $FILE4 -l dset_chunk:CONTI
TOOLTEST $FILE4 -l dset_chunk:CHUNK=18x13
# Native option
# Do not use FILE1, as the named dtype will be converted to native, and h5diff will
# report a difference.
TOOLTEST $FILE0 -n
TOOLTEST $FILE2 -n
# latest file format with long switches. use FILE4=h5repack_layout.h5 (no filters)
arg="$FILE4 --layout CHUNK=20x10 --filter GZIP=1 --minimum=10 --native --latest --compact=8 --indexed=6 --ssize=8[:dtype]"
if test $USE_FILTER_DEFLATE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# latest file format with short switches. use FILE4=h5repack_layout.h5 (no filters)
arg="$FILE4 -l CHUNK=20x10 -f GZIP=1 -m 10 -n -L -c 8 -d 6 -s 8[:dtype]"
if test $USE_FILTER_DEFLATE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# several global filters
arg="$FILE4 --filter GZIP=1 --filter SHUF"
if test $USE_FILTER_DEFLATE != "yes" -o $USE_FILTER_SHUFFLE != "yes" ; then
SKIP $arg
else
TOOLTEST $arg
fi
# syntax of -i infile -o outfile
# latest file format with short switches. use FILE4=h5repack_layout.h5 (no filters)
arg="$FILE4 -l CHUNK=20x10 -f GZIP=1 -m 10 -n -L -c 8 -d 6 -s 8[:dtype]"
if test $USE_FILTER_DEFLATE != "yes" ; then
SKIP $arg
else
TOOLTEST0 $arg
fi
# add a userblock to file
arg="$FILE1 -u ublock.bin -b 2048"
TOOLTEST $arg
# add alignment
arg="$FILE1 -t 1 -a 1 "
TOOLTEST $arg
# Check repacking file with old version of layout message (should get upgraded
# to new version and be readable, etc.)
TOOLTEST $FILE14
# test for datum size > H5TOOLS_MALLOCSIZE
TOOLTEST $FILE1 -f GZIP=1
# Check repacking file with committed datatypes in odd configurations
TOOLTEST $FILE15
if test $nerrors -eq 0 ; then
echo "All $H5REPACK tests passed."
fi
exit $nerrors