#!/bin/sh

#
# Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# 
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
# 
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
# 
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
# 
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

#  
#  @test
#  @bug 4981536
#  @summary TTY: .jdbrc is read twice if jdb is run in the user's home dir
#  @author jjh
#  @run shell JdbReadTwiceTest.sh

#Set appropriate jdk 
if [ ! -z "$TESTJAVA" ] ; then
     jdk="$TESTJAVA"
else
     echo "--Error: TESTJAVA must be defined as the pathname of a jdk to test."
     exit 1
fi

if [ -z "$TESTCLASSES" ] ; then
     echo "--Error: TESTCLASSES must be defined."
     exit 1
fi

case `uname -s` in
    Linux)
      # Need this to convert to the /.automount/... form which
      # is what jdb will report when it reads an init file.
      echo TESTCLASSES=$TESTCLASSES
      TESTCLASSES=`(cd $TESTCLASSES; /bin/pwd)`
      echo TESTCLASSES=$TESTCLASSES
      ;;
esac

# All output will go under this dir.  We define HOME to
# be under here too, and pass it into jdb, to avoid problems
# with java choosing a value of HOME.
baseDir="$TESTCLASSES/jdbRead$$"
HOME="$baseDir/home"
mkdir -p "$HOME"

tmpResult="$baseDir/result"
fred="$baseDir/fred"
here="$baseDir"
jdbFiles="$HOME/jdb.ini $HOME/.jdbrc $here/jdb.ini $here/.jdbrc $tmpResult $fred"

cd $here
failed=


mkFiles()
{
    touch "$@"
}

doit()
{
    echo quit | $TESTJAVA/bin/jdb -J-Duser.home=$HOME > $tmpResult 2>&1
}

failIfNot()
{
    # $1 is the expected number of occurances of $2 in the jdb output.
    count=$1
    shift
    if [ -r c:/ ] ; then
       sed -e 's@\\@/@g' $tmpResult > $tmpResult.1
       mv $tmpResult.1 $tmpResult
    fi
    xx=`fgrep -i "$*" $tmpResult | wc -l`
    if [ $xx != $count ] ; then
        echo "Failed: Expected $count, got $xx: $*"
        echo "-----"
        cat $tmpResult
        echo "-----"
        failed=1
    else
        echo "Passed: Expected $count, got $xx: $*"
    fi        
}

clean()
{
    rm -f $jdbFiles
}

# Note:  If jdb reads a file, it outputs a message containing
#         from: filename
# If jdb can't read a file, it outputs a message containing
#         open: filename


echo
echo "+++++++++++++++++++++++++++++++++++"
echo "Verify each individual file is read"
mkFiles $HOME/jdb.ini
    doit
    failIfNot 1 "from $HOME/jdb.ini"
    clean

mkFiles $HOME/.jdbrc
    doit
    failIfNot 1 "from $HOME/.jdbrc"
    clean

mkFiles $here/jdb.ini
    doit
    failIfNot 1 "from $here/jdb.ini"
    clean

mkFiles $here/.jdbrc
    doit
    failIfNot 1 "from $here/.jdbrc"
    clean


cd $HOME
echo
echo "+++++++++++++++++++++++++++++++++++"
echo "Verify files are not read twice if cwd is ~"
mkFiles $HOME/jdb.ini
    doit
    failIfNot 1 "from $HOME/jdb.ini"
    clean

mkFiles $HOME/.jdbrc
    doit
    failIfNot 1 "from $HOME/.jdbrc"
    clean
cd $here


echo
echo "+++++++++++++++++++++++++++++++++++"
echo "If jdb.ini and both .jdbrc exist, don't read .jdbrc"
mkFiles $HOME/jdb.ini $HOME/.jdbrc
    doit
    failIfNot 1  "from $HOME/jdb.ini" 
    failIfNot 0  "from $HOME/.jdbrc"
    clean


echo
echo "+++++++++++++++++++++++++++++++++++"
echo "If files exist in both ~ and ., read both"
mkFiles $HOME/jdb.ini $here/.jdbrc
    doit
    failIfNot 1  "from $HOME/jdb.ini" 
    failIfNot 1  "from $here/.jdbrc"
    clean

mkFiles $HOME/.jdbrc $here/jdb.ini
    doit
    failIfNot 1  "from $HOME/.jdbrc"
    failIfNot 1  "from $here/jdb.ini"
    clean


if [ ! -r c:/ ] ; then
    # No symlinks on windows.
    echo
    echo "+++++++++++++++++++++++++++++++++++"
    echo "Don't read a . file that is a symlink to a ~ file"
    mkFiles $HOME/jdb.ini
    ln -s $HOME/jdb.ini $here/.jdbrc
    doit
    failIfNot 1  "from $HOME/jdb.ini"
    failIfNot 0  "from $here/.jdbrc"
    clean
fi


if [ ! -r c:/ ] ; then
    # No symlinks on windows.
    echo
    echo "+++++++++++++++++++++++++++++++++++"
    echo "Don't read a . file that is a target symlink of a ~ file"
    mkFiles $here/jdb.ini
    ln -s $here/jdbini $HOME/.jdbrc
    doit
    failIfNot 1  "from $here/jdb.ini"
    failIfNot 0  "from $HOME/.jdbrc"
    clean
fi


if [ ! -r c:/ ] ; then
    # Can't make a file unreadable under MKS.
    echo
    echo "+++++++++++++++++++++++++++++++++++"
    echo "Read an unreadable file - verify the read fails."
    # If the file exists, we try to read it.  The
    # read will fail.
    mkFiles $HOME/jdb.ini
    id > $HOME/jdb.ini
    chmod a-r $HOME/jdb.ini
    if grep -q "uid=" $HOME/jdb.ini  ; then
      echo "Unable to make file unreadable, so test will fail. chmod: $HOME/jdb.ini"
      if grep -q "uid=0" $HOME/jdb.ini  ; then
        echo "The test is running as root. Fix infrastructure!"
      fi
    fi  
    doit
    failIfNot 1 "open: $HOME/jdb.ini"
    clean
fi


echo
echo "+++++++++++++++++++++++++++++++++++"
echo "Read a directory - verify the read fails"
# If the file (IE. directory) exists, we try to read it.  The
# read will fail.
mkdir $HOME/jdb.ini
    doit
    failIfNot 1 "open: $HOME/jdb.ini"
    rmdir $HOME/jdb.ini
    

echo "read $fred" > $here/jdb.ini
    echo
    echo "+++++++++++++++++++++++++++++++++++"
    echo "Verify the jdb read command still works"
    touch $fred
    doit
    failIfNot 1 "from $fred"

    if [ ! -r c:/ ] ; then
        # Can't make a file unreadable under MKS
        chmod a-r $fred
        doit
        failIfNot 1 "open: $fred"
    fi
    rm -f $fred
    mkdir $fred
    doit
    failIfNot 1 "open: $fred"
    rmdir $fred

clean


if [ "$failed" = 1 ] ; then
    echo "One or more tests failed"
    exit 1
fi

echo "All tests passed"
