#!/bin/sh
#
# Copyright (c) 2010, 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 6964018
# @summary Unit test for common tools infrastructure.
#
# @build SimpleApplication SleeperApplication ShutdownSimpleApplication
# @run shell CommonTests.sh
. ${TESTSRC}/CommonSetup.sh
. ${TESTSRC}/ApplicationSetup.sh
# hope for the best:
status=0
# Test program path constants from CommonSetup.sh:
#
for name in JAVA JHAT JINFO JMAP JPS JSTACK; do
eval value=$`echo $name`
echo "INFO: $name=$value"
if [ -x "$value" ]; then
echo "INFO: '$value' is executable."
else
echo "ERROR: '$value' is not executable." >&2
status=1
fi
done
# Display flag values from CommonSetup.sh:
#
for name in isCygwin isMKS isLinux isSolaris isUnknownOS isWindows; do
eval value=$`echo $name`
echo "INFO: flag $name=$value"
done
# Test OS constant from CommonSetup.sh:
#
if [ -z "$OS" ]; then
echo "ERROR: OS constant cannot be empty." >&2
status=1
fi
# Display the PATTERN_EOL value:
#
echo "INFO: PATTERN_EOL="`echo "$PATTERN_EOL" | od -c`
# Test PATTERN_EOL with 'grep' for a regular line.
#
TESTOUT="${TESTCLASSES}/testout.grep_reg_line_eol"
set +e
echo 'regular line' | grep "line${PATTERN_EOL}" > "$TESTOUT"
set -e
if [ -s "$TESTOUT" ]; then
echo "INFO: PATTERN_EOL works for regular line with grep."
else
echo "ERROR: PATTERN_EOL does not work for regular line with grep." >&2
status=1
fi
if $isWindows; then
# Test PATTERN_EOL with 'grep' for a CR line.
#
TESTOUT="${TESTCLASSES}/testout.grep_cr_line_eol"
set +e
echo 'CR line
' | grep "line${PATTERN_EOL}" > "$TESTOUT"
set -e
if [ -s "$TESTOUT" ]; then
echo "INFO: PATTERN_EOL works for CR line with grep."
else
echo "ERROR: PATTERN_EOL does not work for CR line with grep." >&2
status=1
fi
fi
# Test PATTERN_EOL with 'sed' for a regular line.
#
TESTOUT="${TESTCLASSES}/testout.sed_reg_line_eol"
echo 'regular line' | sed -n "/line${PATTERN_EOL}/p" > "$TESTOUT"
if [ -s "$TESTOUT" ]; then
echo "INFO: PATTERN_EOL works for regular line with sed."
else
echo "ERROR: PATTERN_EOL does not work for regular line with sed." >&2
status=1
fi
if $isWindows; then
# Test PATTERN_EOL with 'sed' for a CR line.
#
TESTOUT="${TESTCLASSES}/testout.sed_cr_line_eol"
echo 'CR line
' | sed -n "/line${PATTERN_EOL}/p" > "$TESTOUT"
if [ -s "$TESTOUT" ]; then
echo "INFO: PATTERN_EOL works for CR line with sed."
else
echo "ERROR: PATTERN_EOL does not work for CR line with sed." >&2
status=1
fi
fi
# Display the PATTERN_WS value:
#
echo "INFO: PATTERN_WS="`echo "$PATTERN_WS" | od -c`
# Test PATTERN_WS with 'grep' for a blank.
#
TESTOUT="${TESTCLASSES}/testout.grep_blank"
set +e
echo 'blank: ' | grep "$PATTERN_WS" > "$TESTOUT"
set -e
if [ -s "$TESTOUT" ]; then
echo "INFO: PATTERN_WS works for blanks with grep."
else
echo "ERROR: PATTERN_WS does not work for blanks with grep." >&2
status=1
fi
# Test PATTERN_WS with 'grep' for a tab.
#
TESTOUT="${TESTCLASSES}/testout.grep_tab"
set +e
echo 'tab: ' | grep "$PATTERN_WS" > "$TESTOUT"
set -e
if [ -s "$TESTOUT" ]; then
echo "INFO: PATTERN_WS works for tabs with grep."
else
echo "ERROR: PATTERN_WS does not work for tabs with grep." >&2
status=1
fi
# Test PATTERN_WS with 'sed' for a blank.
#
TESTOUT="${TESTCLASSES}/testout.sed_blank"
echo 'blank: ' | sed -n "/$PATTERN_WS/p" > "$TESTOUT"
if [ -s "$TESTOUT" ]; then
echo "INFO: PATTERN_WS works for blanks with sed."
else
echo "ERROR: PATTERN_WS does not work for blanks with sed." >&2
status=1
fi
# Test PATTERN_WS with 'sed' for a tab.
#
TESTOUT="${TESTCLASSES}/testout.sed_tab"
echo 'tab: ' | sed -n "/$PATTERN_WS/p" > "$TESTOUT"
if [ -s "$TESTOUT" ]; then
echo "INFO: PATTERN_WS works for tabs with sed."
else
echo "ERROR: PATTERN_WS does not work for tabs with sed." >&2
status=1
fi
# Test startApplication and use PORTFILE for coordination
# The app sleeps for 30 seconds.
#
PORTFILE="${TESTCLASSES}"/shutdown.port
startApplication SleeperApplication "${PORTFILE}" 30
# Test appJavaPid in "ps" cmd output.
#
TESTOUT="${TESTCLASSES}/testout.ps_app"
set +e
if $isCygwin; then
# On Cygwin, appJavaPid is the Windows pid for the Java process
# and appOtherPid is the Cygwin pid for the Java process.
ps -p "$appOtherPid" \
| grep "${PATTERN_WS}${appJavaPid}${PATTERN_WS}" > "$TESTOUT"
else
# output only pid and comm columns to avoid mismatches
ps -eo pid,comm \
| grep "^${PATTERN_WS}*${appJavaPid}${PATTERN_WS}" > "$TESTOUT"
fi
set -e
if [ -s "$TESTOUT" ]; then
echo "INFO: begin appJavaPid=$appJavaPid in 'ps' cmd output:"
cat "$TESTOUT"
echo "INFO: end appJavaPid=$appJavaPid in 'ps' cmd output."
else
echo "ERROR: 'ps' cmd should show appJavaPid=$appJavaPid." >&2
status=1
fi
if [ -n "$appOtherPid" ]; then
# Test appOtherPid in "ps" cmd output, if we have one.
#
TESTOUT="${TESTCLASSES}/testout.ps_other"
set +e
if $isCygwin; then
ps -p "$appOtherPid" \
| grep "${PATTERN_WS}${appOtherPid}${PATTERN_WS}" > "$TESTOUT"
else
# output only pid and comm columns to avoid mismatches
ps -eo pid,comm \
| grep "^${PATTERN_WS}*${appOtherPid}${PATTERN_WS}" > "$TESTOUT"
fi
set -e
if [ -s "$TESTOUT" ]; then
echo "INFO: begin appOtherPid=$appOtherPid in 'ps' cmd output:"
cat "$TESTOUT"
echo "INFO: end appOtherPid=$appOtherPid in 'ps' cmd output."
else
echo "ERROR: 'ps' cmd should show appOtherPid=$appOtherPid." >&2
status=1
fi
fi
# Test stopApplication and PORTFILE for coordination
#
stopApplication "${PORTFILE}"
# Test application still running after stopApplication.
#
# stopApplication just lets the app know that it can stop, but the
# app might still be doing work. This test just demonstrates that
# fact and doesn't fail if the app is already done.
#
TESTOUT="${TESTCLASSES}/testout.after_stop"
set +e
if $isCygwin; then
# On Cygwin, appJavaPid is the Windows pid for the Java process
# and appOtherPid is the Cygwin pid for the Java process.
ps -p "$appOtherPid" \
| grep "${PATTERN_WS}${appJavaPid}${PATTERN_WS}" > "$TESTOUT"
else
# output only pid and comm columns to avoid mismatches
ps -eo pid,comm \
| grep "^${PATTERN_WS}*${appJavaPid}${PATTERN_WS}" > "$TESTOUT"
fi
set -e
if [ -s "$TESTOUT" ]; then
echo "INFO: it is okay for appJavaPid=$appJavaPid to still be running" \
"after stopApplication() is called."
echo "INFO: begin 'after_stop' output:"
cat "$TESTOUT"
echo "INFO: end 'after_stop' output."
fi
# Test waitForApplication
#
# The app might already be gone so this function shouldn't generate
# a fatal error in either call.
#
waitForApplication
if [ $isWindows = false ]; then
# Windows can recycle pids quickly so we can't use this test there
TESTOUT="${TESTCLASSES}/testout.after_kill"
set +e
# output only pid and comm columns to avoid mismatches
ps -eo pid,comm \
| grep "^${PATTERN_WS}*${appJavaPid}${PATTERN_WS}" > "$TESTOUT"
set -e
if [ -s "$TESTOUT" ]; then
echo "ERROR: 'ps' cmd should not show appJavaPid." >&2
echo "ERROR: begin 'after_kill' output:" >&2
cat "$TESTOUT" >&2
echo "ERROR: end 'after_kill' output." >&2
status=1
else
echo "INFO: 'ps' cmd does not show appJavaPid after" \
"waitForApplication() is called."
fi
fi
# Test killApplication
#
# The app is already be gone so this function shouldn't generate
# a fatal error.
#
killApplication
exit $status