set test "xulrunner"

# Test sdt support in xulrunner.

global env

if {! [info exists env(SYSTEMTAP_TESTAPPS)] || (
    ! [string match "xulrunner" $env(SYSTEMTAP_TESTAPPS)] &&
    ! [string match "all" $env(SYSTEMTAP_TESTAPPS)])} {
    untested "$test sdt app"
    return
}

########## Create /tmp/stap-xul.stp ########## 
set xulrelease "41.0.1"
set xuldir "[pwd]/xul/"
set testsuite "[pwd]"

set fp [open "$testsuite/stap-xul.stp" "w"]
puts $fp "
global funcinfo
global objinfo

probe process(@1).mark(\"function__info\")
{
  file = user_string (\$arg1)
  func = user_string (\$arg3)
  funcinfo\[file,func\] <<< 1
}

probe process(@1).mark(\"object__create\")
{
  file = user_string (\$arg1)
  class = user_string (\$arg2)
  objinfo\[file,class\] <<< 1
}

probe end
{
  foreach (\[i,j\] in funcinfo+)
  {
     printf (\"probes: %-20s %-25s %d\\n\", substr(i,strlen(i)-20,strlen(i)), j, @count(funcinfo\[i,j\]))
  }
  foreach (\[i,j\] in objinfo+)
  {
     printf (\"probes: %-20s %-25s %d\\n\", substr(i,strlen(i)-20,strlen(i)), j, @count(funcinfo\[i,j\]))
  }
}
"
close $fp

########## Begin /tmp/stap-xul.sh ########## 
set fp [open "$testsuite/stap-xul.sh" "w"]
puts $fp "
##### begin run_tests #####
function run_tests \{
cd $testsuite/xul/bld/js/src
pwd
for i in \$(find $xuldir/src/js/src/tests -mindepth 2 -name 'regress*' -prune \
	   -o -name 'shell.js' -prune -o \\( -name '*js' -print \\)) ; do
   $env(SYSTEMTAP_PATH)/stap -c \"./js -f $xuldir/src/js/src/tests/shell.js -f \$i\" \
   $testsuite/stap-xul.stp ./js
done | tee $testsuite/stap-xul-markers.log

PROBES=\$(grep 'probes: ' $testsuite/stap-xul-markers.log | wc -l)
TESTS=\$(grep '-FAIL' $testsuite/stap-xul-markers.log)
echo PROBES=\$PROBES TESTS=\$TESTS

if \[ \$PROBES -gt 400 \] ; then
   echo PASS: xulrunner javascript markers \$1
else
   echo FAIL: xulrunner javascript markers \$1
fi

if \[ -z \$TESTS \] ; then
   echo PASS: xulrunner javascript testsuite \$1
else
   echo FAIL: xulrunner javascript testsuite \$1
fi

\}
##### end run_tests #####

if \[ ! -r xulrunner-$xulrelease.source.tar.xz \] ; then
wget -q http://ftp.mozilla.org/pub/xulrunner/releases/$xulrelease/source/xulrunner-$xulrelease.source.tar.xz
# wget -q http://ftp.mozilla.org/pub/mozilla.org/xulrunner/releases/latest/source/xulrunner-$xulrelease.source.tar.xz
fi
if \[ ! -r xulrunner-$xulrelease.source.tar.xz \] ; then
   echo UNTESTED: wget xulrunner-$xulrelease.source.tar.xz
   exit
fi

if \[ ! -d xul/src \] ; then
unxz xulrunner-$xulrelease.source.tar.xz
tar -x -f xulrunner-$xulrelease.source.tar
mkdir xul
mv mozilla-* xul/src
fi

if \[ ! -f xul/bld/js/src/js \] ; then
mkdir xul/bld
cd xul/bld
JAVA=`yum info available 'java*openjdk' |& awk '/Name/ {print \$3}'`
for P in glib-devel gtk+ ORBit-devel \$JAVA ; do 
    if rpm -q \$P ; then :
    else echo UNTESTED: Need to: dnf install \$P
         exit
    fi
done
JAVA_HOME=/usr/lib/jvm/\$JAVA.`uname -i` \
CXXFLAGS='-g -I$env(SYSTEMTAP_INCLUDES)' \
CFLAGS='-g -I$env(SYSTEMTAP_INCLUDES)' \
PATH=$env(SYSTEMTAP_PATH)/:\$PATH \
../src/configure --prefix=$xuldir --enable-dtrace \
--enable-application=xulrunner --disable-necko-wifi --disable-gconf \
--disable-dbus --disable-alsa --disable-pulseaudio --disable-webm --without-intl-api

if \[ \$\? -eq 0 \] ; then true ; else
   # configure failure possibly due to gtk+-2.0 requirement
   echo UNTESTED: xulrunner configure failed
   exit
fi
sed -i '/include.*rules.mk/a\\
ifdef HAVE_DTRACE\\
PROGOBJS += ../mozjs-dtrace.\$(OBJ_SUFFIX)\\
endif\\
' js/src/shell/Makefile
sed -i '/include.*rules.mk/a\\
ifdef HAVE_DTRACE\\
PROGOBJS += ../mozjs-dtrace.\$(OBJ_SUFFIX)\\
endif\\
' js/src/jsapi-tests/Makefile
J=\$(getconf _NPROCESSORS_CONF)
make
if \[ \$\? -eq 0 \] ; then true ; else
   echo UNTESTED: xulrunner build failed
   exit
fi
fi

run_tests uprobe
"
########## End /tmp/stap-xul.sh ########## 
close $fp

########## /tmp/stap-xul.sh does most of the work ########## 
verbose -log Running xul testsuite
spawn sh stap-xul.sh 2>&1
expect {
    -timeout 10000
    -re {UNTESTED: [a-z_ ]+} { regexp " .*$" $expect_out(0,string) s; 
	untested "$s"; exp_continue }
    -re {FAIL: [a-z_ ]+} { regexp " .*$" $expect_out(0,string) s; 
	fail "$s"; exp_continue }
    -re {PASS: [a-z_ ]+} { regexp " .*$" $expect_out(0,string) s; 
	pass "$s"; exp_continue }
    -re {UNSUPPORTED: [a-zA-Z_/: ]+} { regexp " .*$" $expect_out(0,string) s; 
	verbose -log "$s"
	unsupported "$s"; exp_continue }
    timeout { fail "$test (timeout)" }
    eof { }
}
catch {close}; catch {wait}

if { $verbose == 0 } {
catch {exec rm -rf $testsuite/stap-xul.stp xulrunner-$xulrelease-source.tar \
	   $testsuite/stap-xul-markers.log $testsuite/stap-xul.sh }
catch {exec rm -rf xul}
}
