15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/bin/sh
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2005, Google Inc.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# All rights reserved.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Redistribution and use in source and binary forms, with or without
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# modification, are permitted provided that the following conditions are
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# met:
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     * Redistributions of source code must retain the above copyright
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# notice, this list of conditions and the following disclaimer.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     * Redistributions in binary form must reproduce the above
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# in the documentation and/or other materials provided with the
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# distribution.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     * Neither the name of Google Inc. nor the names of its
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# contributors may be used to endorse or promote products derived from
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# this software without specific prior written permission.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ---
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Author: Craig Silverstein
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Runs the 4 profiler unittests and makes sure their profiles look
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# appropriate.  We expect two commandline args, as described below.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# We run under the assumption that if $PROFILER1 is run with no
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# arguments, it prints a usage line of the form
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   USAGE: <actual executable being run> [...]
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This is because libtool sometimes turns the 'executable' into a
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# shell script which runs an actual binary somewhere else.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# We expect BINDIR and PPROF_PATH to be set in the environment.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If not, we set them to some reasonable values
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BINDIR="${BINDIR:-.}"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPROF_PATH="${PPROF_PATH:-$BINDIR/src/pprof}"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "x$1" = "x-h" -o "x$1" = "x--help" ]; then
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "USAGE: $0 [unittest dir] [path to pprof]"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "       By default, unittest_dir=$BINDIR, pprof_path=$PPROF_PATH"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exit 1
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TMPDIR=/tmp/profile_info
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UNITTEST_DIR=${1:-$BINDIR}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPROF=${2:-$PPROF_PATH}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# We test the sliding-window functionality of the cpu-profile reader
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# by using a small stride, forcing lots of reads.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPROF_FLAGS="--test_stride=128"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER1="$UNITTEST_DIR/profiler1_unittest"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER2="$UNITTEST_DIR/profiler2_unittest"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER3="$UNITTEST_DIR/profiler3_unittest"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER4="$UNITTEST_DIR/profiler4_unittest"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Unfortunately, for us, libtool can replace executables with a shell
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# script that does some work before calling the 'real' executable
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# under a different name.  We need the 'real' executable name to run
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# pprof on it.  We've constructed all the binaries used in this
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# unittest so when they are called with no arguments, they report
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# their argv[0], which is the real binary name.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Realname() {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "$1" 2>&1 | awk '{print $2; exit;}'
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER1_REALNAME=`Realname "$PROFILER1"`
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER2_REALNAME=`Realname "$PROFILER2"`
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER3_REALNAME=`Realname "$PROFILER3"`
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROFILER4_REALNAME=`Realname "$PROFILER4"`
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# It's meaningful to the profiler, so make sure we know its state
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unset CPUPROFILE
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rm -rf "$TMPDIR"
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)mkdir "$TMPDIR" || exit 2
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)num_failures=0
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RegisterFailure() {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  num_failures=`expr $num_failures + 1`
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Takes two filenames representing profiles, with their executable scripts,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# and a multiplier, and verifies that the 'contentful' functions in
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# each profile take the same time (possibly scaled by the given
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# multiplier).  It used to be "same" meant within 50%, after adding an 
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# noise-reducing X units to each value.  But even that would often
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# spuriously fail, so now it's "both non-zero".  We're pretty forgiving.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar() {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prof1="$TMPDIR/$1"
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exec1="$2"
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prof2="$TMPDIR/$3"
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exec2="$4"
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mult="$5"
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # We are careful not to put exec1 and exec2 in quotes, because if
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # they are the empty string, it means we want to use the 1-arg
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # version of pprof.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mthread1=`"$PPROF" $PPROF_FLAGS $exec1 "$prof1" | grep test_main_thread | awk '{print $1}'`
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mthread2=`"$PPROF" $PPROF_FLAGS $exec2 "$prof2" | grep test_main_thread | awk '{print $1}'`
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mthread1_plus=`expr $mthread1 + 5`
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mthread2_plus=`expr $mthread2 + 5`
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if [ -z "$mthread1" ] || [ -z "$mthread2" ] || \
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     [ "$mthread1" -le 0 -o "$mthread2" -le 0 ]
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    || [ `expr $mthread1_plus \* $mult` -gt `expr $mthread2_plus \* 2` -o \
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#         `expr $mthread1_plus \* $mult \* 2` -lt `expr $mthread2_plus` ]
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  then
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo ">>> profile on $exec1 vs $exec2 with multiplier $mult failed:"
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo "Actual times (in profiling units) were '$mthread1' vs. '$mthread2'"
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegisterFailure
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fi
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Takes two filenames representing profiles, and optionally their
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# executable scripts (these may be empty if the profiles include
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# symbols), and verifies that the two profiles are identical.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifyIdentical() {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prof1="$TMPDIR/$1"
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exec1="$2"
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prof2="$TMPDIR/$3"
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exec2="$4"
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # We are careful not to put exec1 and exec2 in quotes, because if
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # they are the empty string, it means we want to use the 1-arg
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # version of pprof.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "$PPROF" $PPROF_FLAGS $exec1 "$prof1" > "$TMPDIR/out1"
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "$PPROF" $PPROF_FLAGS $exec2 "$prof2" > "$TMPDIR/out2"
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  diff=`diff "$TMPDIR/out1" "$TMPDIR/out2"`
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if [ ! -z "$diff" ]; then
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo ">>> profile doesn't match, args: $exec1 $prof1 vs. $exec2 $prof2"
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo ">>> Diff:"
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo "$diff"
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegisterFailure
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fi
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Takes a filename representing a profile, with its executable,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# and a multiplier, and verifies that the main-thread function takes
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# the same amount of time as the other-threads function (possibly scaled
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# by the given multiplier).  Figuring out the multiplier can be tricky,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# since by design the main thread runs twice as long as each of the
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 'other' threads!  It used to be "same" meant within 50%, after adding an 
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# noise-reducing X units to each value.  But even that would often
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# spuriously fail, so now it's "both non-zero".  We're pretty forgiving.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifyAcrossThreads() {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prof1="$TMPDIR/$1"
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # We need to run the script with no args to get the actual exe name
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exec1="$2"
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mult="$3"
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # We are careful not to put exec1 in quotes, because if it is the
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # empty string, it means we want to use the 1-arg version of pprof.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mthread=`$PPROF $PPROF_FLAGS $exec1 "$prof1" | grep test_main_thread | awk '{print $1}'`
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  othread=`$PPROF $PPROF_FLAGS $exec1 "$prof1" | grep test_other_thread | awk '{print $1}'`
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if [ -z "$mthread" ] || [ -z "$othread" ] || \
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     [ "$mthread" -le 0 -o "$othread" -le 0 ]
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    || [ `expr $mthread \* $mult \* 3` -gt `expr $othread \* 10` -o \
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#         `expr $mthread \* $mult \* 10` -lt `expr $othread \* 3` ]
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  then
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo ">>> profile on $exec1 (main vs thread) with multiplier $mult failed:"
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo "Actual times (in profiling units) were '$mthread' vs. '$othread'"
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegisterFailure
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fi
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo ">>> WARNING <<<"
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "This test looks at timing information to determine correctness."
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "If your system is loaded, the test may spuriously fail."
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "If the test does fail with an 'Actual times' error, try running again."
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# profiler1 is a non-threaded version
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER1" 50 1 "$TMPDIR/p1" || RegisterFailure
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER1" 100 1 "$TMPDIR/p2" || RegisterFailure
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p1 "$PROFILER1_REALNAME" p2 "$PROFILER1_REALNAME" 2
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Verify the same thing works if we statically link
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER2" 50 1 "$TMPDIR/p3" || RegisterFailure
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER2" 100 1 "$TMPDIR/p4" || RegisterFailure
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p3 "$PROFILER2_REALNAME" p4 "$PROFILER2_REALNAME" 2
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Verify the same thing works if we specify via CPUPROFILE
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CPUPROFILE="$TMPDIR/p5" "$PROFILER2" 50 || RegisterFailure
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CPUPROFILE="$TMPDIR/p6" "$PROFILER2" 100 || RegisterFailure
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p5 "$PROFILER2_REALNAME" p6 "$PROFILER2_REALNAME" 2
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CPUPROFILE="$TMPDIR/p5b" "$PROFILER3" 30 || RegisterFailure
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CPUPROFILE="$TMPDIR/p5c" "$PROFILER3" 60 || RegisterFailure
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p5b "$PROFILER3_REALNAME" p5c "$PROFILER3_REALNAME" 2
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Now try what happens when we use threads
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER3" 30 2 "$TMPDIR/p7" || RegisterFailure
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER3" 60 2 "$TMPDIR/p8" || RegisterFailure
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p7 "$PROFILER3_REALNAME" p8 "$PROFILER3_REALNAME" 2
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER4" 30 2 "$TMPDIR/p9" || RegisterFailure
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER4" 60 2 "$TMPDIR/p10" || RegisterFailure
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p9 "$PROFILER4_REALNAME" p10 "$PROFILER4_REALNAME" 2
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# More threads!
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER4" 25 3 "$TMPDIR/p9" || RegisterFailure
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER4" 50 3 "$TMPDIR/p10" || RegisterFailure
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p9 "$PROFILER4_REALNAME" p10 "$PROFILER4_REALNAME" 2
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Compare how much time the main thread takes compared to the other threads
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Recall the main thread runs twice as long as the other threads, by design.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER4" 20 4 "$TMPDIR/p11" || RegisterFailure
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifyAcrossThreads p11 "$PROFILER4_REALNAME" 2
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Test symbol save and restore
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER1" 50 1 "$TMPDIR/p12" || RegisterFailure
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PPROF" $PPROF_FLAGS "$PROFILER1_REALNAME" "$TMPDIR/p12" --raw \
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >"$TMPDIR/p13" 2>/dev/null || RegisterFailure
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifyIdentical p12 "$PROFILER1_REALNAME" p13 "" || RegisterFailure
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PROFILER3" 30 2 "$TMPDIR/p14" || RegisterFailure
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"$PPROF" $PPROF_FLAGS "$PROFILER3_REALNAME" "$TMPDIR/p14" --raw \
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >"$TMPDIR/p15" 2>/dev/null || RegisterFailure
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifyIdentical p14 "$PROFILER3_REALNAME" p15 "" || RegisterFailure
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Test using ITIMER_REAL instead of ITIMER_PROF.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)env CPUPROFILE_REALTIME=1 "$PROFILER3" 30 2 "$TMPDIR/p16" || RegisterFailure
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)env CPUPROFILE_REALTIME=1 "$PROFILER3" 60 2 "$TMPDIR/p17" || RegisterFailure
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VerifySimilar p16 "$PROFILER3_REALNAME" p17 "$PROFILER3_REALNAME" 2
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Make sure that when we have a process with a fork, the profiles don't
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# clobber each other
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CPUPROFILE="$TMPDIR/pfork" "$PROFILER1" 1 -2 || RegisterFailure
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)n=`ls $TMPDIR/pfork* | wc -l`
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ $n != 3 ]; then
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "FORK test FAILED: expected 3 profiles (for main + 2 children), found $n"
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  num_failures=`expr $num_failures + 1`
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rm -rf "$TMPDIR"      # clean up
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "Tests finished with $num_failures failures"
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit $num_failures
262