+#!/bin/bash
+# vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
+#
+# This file contains the global variables and common functions
+# used in the posix test scripts.
+set -e
+LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
+. $LUSTRE/tests/test-framework.sh
+#************************ Initialize Global Variables *************************#
+export POSIX_SRC=${POSIX_SRC:-"/usr/src/posix"}
+export POSIX_RUN=${POSIX_RUN:-"$POSIX_SRC/run_posix_suite.pl"}
+export TEST_BIN="$POSIX_SRC/TESTROOT-gcc$(gcc -v 2>&1 | tail -1 | cut -d' ' -f3)-$(uname -m).tgz"
+
+# Root directory of the POSIX test suite installation.
+export INSTALL_DIR=${INSTALL_DIR:-"$POSIX_SRC/tet"}
+
+# Root directory from which the testsets will be executed.
+export TESTEXEC_DIR=${TESTEXEC_DIR:-"$POSIX_SRC/TESTROOT"}
+
+# Test results directory.
+export RESULT_DIR=${RESULT_DIR:-"$INSTALL_DIR/test_sets/results"}
+
+# Test groups for POSIX compliance test suite.
+USER_GROUPS="vsxg0,vsxg1,vsxg2"
+SUPP_GROUPS="supp1,supp2,supp3,supp4,supp5,supp6,supp7,supp8,supp9,supp10,supp11,supp12,supp13,supp14,supp15,supp16,supp17,supp18,supp19,supp20,supp21,supp22,supp23,supp24,supp25,supp26,supp27,supp28,supp29,supp30,supp31"
+
+export GROUP_ID=${GROUP_ID:-"1000"}
+export USER_ID=${USER_ID:-"1000"}
+
+#***************************** Common Functions *******************************#
+# Check and add a test group.
+add_group() {
+ local node=${1:-$(hostname)}
+ local group_id=$2
+ local group_name=$3
+ local rc=0
+
+ if ! (do_nodes $node "
+ error() { set +x; echo Error: \\\$2: \\\$1; echo XXRETCODE:\\\$1; exit \\\$1; }
+ gid=\\\$(getent group $group_name | cut -d: -f3);
+ if [ \"x\\\$gid\" != \"x\" ]; then
+ [ \\\$gid -eq $group_id ] || \\
+ error 1 \\\"inconsistent group ID: new: $group_id, old: \\\$gid\\\";
+ else
+ groupadd -g $group_id $group_name
+ fi;" 2>&1 | dshbak -c
+ exit ${PIPESTATUS[0]})
+ then
+ rc=${PIPESTATUS[0]}
+ fi
+
+ return $rc
+}
+
+# Check and add a test user.
+add_user() {
+ local node=${1:-$(hostname)}
+ local user_id=$2
+ local user_name=$3
+ local group_name=$4
+ local home_dir
+ local rc=0
+
+ if [[ "$user_name" = "vsx0" ]]; then
+ home_dir=$INSTALL_DIR/test_sets
+ else
+ home_dir=$INSTALL_DIR
+ fi
+
+ if ! (do_nodes $node "
+ error() { set +x; echo Error: \\\$2: \\\$1; echo XXRETCODE:\\\$1; exit \\\$1; }
+ SUPP_GROUPS=$SUPP_GROUPS;
+ uid=\\\$(getent passwd $user_name | cut -d: -f3);
+ if [ \"x\\\$uid\" != \"x\" ]; then
+ if [ \\\$uid -eq $user_id ]; then
+ dir=\\\$(getent passwd $user_name | cut -d: -f6)
+ if [ \"x\\\$dir\" != \"x$home_dir\" ]; then
+ mkdir -p $home_dir
+ usermod -d $home_dir $user_name
+ fi
+ else
+ error 1 \\\"inconsistent user ID: new: $user_id, old: \\\$uid\\\"
+ fi
+ else
+ mkdir -p $home_dir
+ if [ \"x$user_name\" = \"xvsx0\" ]; then
+ useradd -M -u $user_id -d $home_dir -g $group_name -G $SUPP_GROUPS $user_name
+ else
+ useradd -M -u $user_id -d $home_dir -g $group_name $user_name
+ fi
+ fi" 2>&1 | dshbak -c
+ exit ${PIPESTATUS[0]})
+ then
+ rc=${PIPESTATUS[0]}
+ fi
+
+ return $rc
+}
+
+# Remove users and groups for running the POSIX test suite.
+delete_posix_users() {
+ local node=${1:-$(hostname)}
+
+ do_nodes $node "
+ for i in 0 1 2; do
+ userdel vsx\\\$i;
+ done;
+ for group in ${SUPP_GROUPS//,/ } ${USER_GROUPS//,/ }; do
+ groupdel \\\$group;
+ done" 2>&1 | dshbak -c
+ return ${PIPESTATUS[0]}
+}
+
+# Setup users and groups for running the POSIX test suite.
+setup_posix_users() {
+ local node=${1:-$(hostname)}
+ local gid=$((GROUP_ID + 1))
+ local uid=$USER_ID
+ local user group
+ local i
+
+ for group in ${USER_GROUPS//,/ } ${SUPP_GROUPS//,/ }; do
+ if ! add_group $node $gid $group; then
+ delete_posix_users $node
+ setup_posix_users $node
+ fi
+ gid=$(( gid + 1 ))
+ done
+
+ for i in 0 1 2; do
+ user=vsx$i
+ group=vsxg$i
+ if ! add_user $node $uid $user $group; then
+ delete_posix_users $node
+ setup_posix_users $node
+ fi
+ uid=$(( uid + 1 ))
+ done
+}
+
+prep() {
+ if [[ ! -d $POSIX_SRC ]]; then
+ echo "Missing POSIX testsuite source"
+ return 1
+ fi
+ [[ -f $TEST_BIN ]] && rm -f $TEST_BIN
+ [[ -d $INSTALL_DIR ]] && rm -rf $INSTALL_DIR
+
+ rpm -q byacc > /dev/null || yum -y install byacc
+ if grep -q " 6." /etc/issue; then
+ rpm -q compat-glibc-headers > /dev/null || \
+ yum install -y compat-glibc-headers
+
+ [[ -d /usr/include/bits ]] || mkdir -p /usr/include/bits
+ [[ -d /usr/include/sys ]] || mkdir -p /usr/include/sys
+ [[ -s /usr/include/stropts.h ]] || \
+ ln -s /usr/lib/x86_64-redhat-linux5E/include/stropts.h \
+ /usr/include/stropts.h
+ [[ -s /usr/include/bits/stropts.h ]] || \
+ ln -s /usr/lib/x86_64-redhat-linux5E/include/bits/stropts.h \
+ /usr/include/bits/stropts.h
+ [[ -s /usr/include/bits/xtitypes.h ]] || \
+ ln -s /usr/lib/x86_64-redhat-linux5E/include/bits/xtitypes.h \
+ /usr/include/bits/xtitypes.h
+ [[ -s /usr/include/sys/stropts.h ]] || \
+ ln -s /usr/lib/x86_64-redhat-linux5E/include/sys/stropts.h \
+ /usr/include/sys/stropts.h
+ fi
+
+ pushd $POSIX_SRC > /dev/null
+
+ if [[ -f install.sh ]]; then
+ [[ ! -x install.sh ]] && chmod +x install.sh
+ else
+ popd > /dev/null
+ echo "install.sh does not exist in $POSIX_SRC."
+ return 1
+ fi
+
+ popd > /dev/null
+}
+
+install() {
+ pushd $POSIX_SRC > /dev/null
+
+ log "Installing POSIX test suite"
+ # Install the POSIX test suite source files
+ expect -f install-posix.exp $INSTALL_DIR $TESTEXEC_DIR
+
+ popd > /dev/null
+}
+
+build() {
+ pushd $POSIX_SRC > /dev/null
+
+ log "Building POSIX test suite"
+ # Build testsets
+ expect -f build-posix.exp $INSTALL_DIR $TESTEXEC_DIR $POSIX_SRC
+
+ popd > /dev/null
+}
+
+cleanup() {
+ if [[ -f $TEST_BIN ]]; then
+ rm -fr $TESTEXEC_DIR
+ echo "Install and build POSIX test suite successfully!"
+ return 0
+ else
+ echo "failed to build POSIX test suite."
+ return 1
+ fi
+}
+
+run_posix() {
+ local MNTPNT=$1
+ local COMPARE=${2}
+ local compare=""
+ local rc=0
+ local cmd
+
+ [[ "x$COMPARE" != "x" ]] && compare="--compare-result"
+ # command to run posix test suite
+ cmd="TMP=/tmp/vsx0 TMPDIR=/tmp/vsx0 $POSIX_RUN --mountpt=$MNTPNT \
+ --posix-src=$POSIX_SRC --install-dir=$INSTALL_DIR \
+ --results-dir=$RESULT_DIR $compare 2>&1"
+
+ # run posix test suite
+ echo $cmd
+ if ! eval $cmd; then
+ rc=${PIPESTATUS[0]}
+ fi
+
+ return $rc
+}
+
+setup_posix() {
+ log "Setting up POSIX test suite from $POSIX_SRC"
+ prep || return $?
+ install
+ build
+ cleanup
+}