#!/bin/sh # -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- # vim:set noet ts=4: # # ibus - The Input Bus # # Copyright (c) 2018-2020 Takao Fujiwara # Copyright (c) 2018 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program 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 for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # This test runs /usr/bin/ibus-daemon after install ibus # # # init 3 # Login as root # # /root/ibus/tests/test-console.sh --tests ibus-compose \ # --builddir /root/ibus/src/tests --srcdir /root/ibus/src/tests # POSIX sh has no 'echo -e' : ${ECHO:='/usr/bin/echo'} # POSIX sh has $UID # DASH saves the graves in '``' as characters not to be extracted : ${UID:=`id -u`} PROGNAME=`basename $0` VERSION=0.1 DISPLAY=:99.0 BUILDDIR="." SRCDIR="." TEST_LOG="test-suite.log" TEST_LOG_STDOUT=0 RESULT_LOG="" HAVE_GRAPHICS=1 DESKTOP_COMMAND="dbus-launch --exit-with-session gnome-session" PID_XORG=0 PID_GNOME_SESSION=0 TESTING_RUNNER="default" TESTS="" TIMEOUT=300 GREEN='\033[0;32m' RED='\033[0;31m' NC='\033[0m' print_log() { if [ x"$RESULT_LOG" != x ] ; then # avoid 'echo -e' before call 'sed'. if [ x"$1" = x'-e' ] ; then shift fi NO_ESCAPE=`echo "$@" | sed -e 's/\\\033\\[0;3.m//g' -e 's/\\\033\\[0m//g'` $ECHO $NO_ESCAPE >> $RESULT_LOG else $ECHO "$@" fi } usage() { $ECHO -e \ "This test runs /usr/bin/ibus-daemon after install ibus\n" \ "$PROGNAME [OPTIONS…]\n" \ "\n" \ "OPTIONS:\n" \ "-h, --help This help\n" \ "-v, --version Show version\n" \ "-b, --builddir=BUILDDIR Set the BUILDDIR\n" \ "-s, --srcdir=SOURCEDIR Set the SOURCEDIR\n" \ "-c, --no-graphics Use Xvfb instead of Xorg\n" \ "-d, --desktop=DESKTOP Run DESTKTOP. The default is gnome-session\n" \ "-t, --tests=\"TESTS...\" Run TESTS programs which is separated by space\n" \ "-r, --runner=RUNNER Run TESTS programs with a test RUNNER.\n" \ " RUNNDER = gnome or default.\n" \ " default is an embedded runner.\n" \ "-T, --timeout=TIMEOUT Set timeout (default TIMEOUT is 300 sec).\n" \ "-o, --output=OUTPUT_FILE OUtput the log to OUTPUT_FILE\n" \ "-O, --result=RESULT_FILE OUtput the result to RESULT_FILE\n" \ "" } parse_args() { # This is GNU getopt. "sudo port getopt" in BSD? ARGS=`getopt -o hvb:s:cd:t:r:T:o:O: --long \ help,version,builddir:,srcdir:,no-graphics,desktop:,tests:,runner:,timeout:,output:,result:\ -- "$@"`; eval set -- "$ARGS" while [ 1 ] ; do case "$1" in -h | --help ) usage; exit 0;; -v | --version ) $ECHO -e "$VERSION"; exit 0;; -b | --builddir ) BUILDDIR="$2"; shift 2;; -s | --srcdir ) SRCDIR="$2"; shift 2;; -c | --no-graphics ) HAVE_GRAPHICS=0; shift;; -d | --desktop ) DESKTOP_COMMAND="$2"; shift 2;; -t | --tests ) TESTS="$2"; shift 2;; -r | --runner ) TESTING_RUNNER="$2"; shift 2;; -T | --timeout ) TIMEOUT="$2"; shift 2;; -o | --output ) TEST_LOG="$2"; shift 2;; -O | --result ) RESULT_LOG="$2"; shift 2;; -- ) shift; break;; * ) usage; exit 1;; esac done } init_desktop() { if [ "$RESULT_LOG" != "" ] ; then if [ -f $RESULT_LOG ] ; then rm $RESULT_LOG fi fi HAS_STDOUT=`echo "$TEST_LOG" | grep ':stdout'` if [ x"$HAS_STDOUT" != x ] ; then TEST_LOG=`echo "$TEST_LOG" | sed -e 's|:stdout||'` TEST_LOG_STDOUT=1 fi if [ "$TEST_LOG" = "" ] ; then print_log -e "${RED}FAIL${NC}: ${RED}ERROR${NC}: a log file is required to get return value with 'read' command" exit 255 elif [ -f $TEST_LOG ] ; then rm $TEST_LOG fi if [ x$FORCE_TEST != x ] ; then RUN_ARGS="$RUN_ARGS --force" fi if [ ! -f $HOME/.config/gnome-initial-setup-done ] ; then IS_SYSTEM_ACCOUNT=false if [ "$USER" = "root" ] ; then IS_SYSTEM_ACCOUNT=true fi if test ! -f /var/lib/AccountsService/users/$USER ; then mkdir -p /var/lib/AccountsService/users cat >> /var/lib/AccountsService/users/$USER << _EOF [User] Language=ja_JP.UTF-8 XSession=gnome SystemAccount=$IS_SYSTEM_ACCOUNT _EOF fi mkdir -p $HOME/.config touch $HOME/.config/gnome-initial-setup-done fi # Prevent from launching a XDG dialog XDG_LOCALE_FILE="$HOME/.config/user-dirs.locale" if [ -f $XDG_LOCALE_FILE ] ; then XDG_LANG_ORIG=`cat $XDG_LOCALE_FILE` XDG_LANG_NEW=`echo $LANG | sed -e 's/\(.*\)\..*/\1/'` if [ "$XDG_LANG_ORIG" != "$XDG_LANG_NEW" ] ; then echo "# Overriding XDG locale $XDG_LANG_ORIG with $XDG_LANG_NEW" echo "$XDG_LANG_NEW" > $XDG_LOCALE_FILE fi fi # `su` command does not run loginctl export XDG_SESSION_TYPE='x11' export XDG_SESSION_CLASS=user # `su` command does not get focus in events without this variable. # Need to restart sshd after set "PermitRootLogin yes" in sshd_config if [ "x$XDG_RUNTIME_DIR" = x ] ; then export XDG_RUNTIME_DIR="/run/user/$UID" is_root_login=`grep "^PermitRootLogin" /etc/ssh/sshd_config | grep yes` if [ "x$ANSIBLE" != x ] && [ "x$is_root_login" = x ] ; then print_log -e "${RED}FAIL${NC}: No permission to get focus-in events in GtkWindow with ansible" echo "su command does not configure necessary login info " \ "with systemd and GtkWindow cannot receive focus-events " \ "when ibus-desktop-testing-runner is executed by " \ "ansible-playbook." >> $TEST_LOG echo "Enabling root login via sshd, restarting sshd, set " \ "XDG_RUNTIME_DIR can resolve the problem under " \ "ansible-playbook." >> $TEST_LOG exit 255 fi fi # Do we need XDG_SESSION_ID and XDG_SEAT? #export XDG_CONFIG_DIRS=/etc/xdg #export XDG_SESSION_ID=10 #export XDG_SESSION_DESKTOP=gnome #export XDG_SEAT=seat0 } run_dbus_daemon() { # Use dbus-launch --exit-with-session later instead of --sh-syntax # GNOME uses a unix:abstract address and it effects gsettings set values # in each test case. # TODO: Should we comment out this line? export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$UID/bus" } run_desktop() { if test $HAVE_GRAPHICS -eq 1 ; then /usr/libexec/Xorg.wrap -noreset +extension GLX +extension RANDR +extension RENDER -logfile ./xorg.log -config ./xorg.conf -configdir . $DISPLAY & else /usr/bin/Xvfb $DISPLAY -noreset +extension GLX +extension RANDR +extension RENDER -screen 0 1280x1024x24 & fi PID_XORG=$! sleep 1 export DISPLAY=$DISPLAY echo "Running $DESKTOP_COMMAND with $USER in `tty`" $DESKTOP_COMMAND & PID_GNOME_SESSION=$! sleep 30 HAS_GNOME=`echo $DESKTOP_COMMAND | grep gnome-session` if [ x"$HAS_GNOME" = x ] ; then ibus-daemon --daemonize --verbose sleep 3 fi } count_case_result() { retval=$1 pass=$2 fail=$3 if test $retval -eq 0 ; then pass=`expr $pass + 1` else fail=`expr $fail + 1` fi echo $pass $fail } echo_case_result() { retval=$1 tst=$2 subtst=${3:-''} if test $retval -eq 0 ; then echo "PASS: $tst $subtst" >>$TEST_LOG else echo "FAIL: $tst $subtst" >>$TEST_LOG fi } run_direct_test_cases() { pass=0 fail=0 for tst in $TESTS; do ENVS= if test -f $SRCDIR/${tst}.env ; then ENVS="`cat $SRCDIR/${tst}.env`" fi if test x"$ENVS" = x ; then $BUILDDIR/$tst $SRCDIR 2>>$TEST_LOG 1>>$TEST_LOG retval=$? read pass fail << EOF_COUNT `count_case_result $retval $pass $fail` EOF_COUNT echo_case_result $retval $tst CACHE_FILES=`ls *.cache` if [ x"$CACHE_FILES" != x ] ; then echo "# Clean $CACHE_FILES" >>$TEST_LOG rm $CACHE_FILES fi else i=1 # Deleted for var in "$ENVS" because IFS=$'\n' is not supported # in POSIX sh while read e ; do first=`echo "$e" | grep '^#'` if test x"$first" = x"#" ; then continue fi echo "# Starting $e $BUILDDIR/$tst $SRCDIR" >>$TEST_LOG env $e $BUILDDIR/$tst $SRCDIR 2>>$TEST_LOG 1>>$TEST_LOG retval=$? echo "# Finished $e $BUILDDIR/$tst $SRCDIR with $retval" >>$TEST_LOG read pass fail << EOF_COUNT `count_case_result $retval $pass $fail` EOF_COUNT echo_case_result $retval $tst $e CACHE_FILES=`ls *.cache` if [ x"$CACHE_FILES" != x ] ; then echo "# Clean $CACHE_FILES" >>$TEST_LOG rm $CACHE_FILES fi i=`expr $i + 1` done << EOF_ENVS `echo "$ENVS"` EOF_ENVS fi done echo $pass $fail } run_gnome_desktop_testing_runner() { pass=0 fail=0 if [ x"$TESTS" = x ] ; then TESTS='ibus' fi for tst in $TESTS; do tst_dir="@INSTALLEDDIR@/$tst" if [ ! -d "$tst_dir" ] ; then print_log -e "${RED}FAIL${NC}: Not found %tst_dir" fail=1 continue fi gnome-desktop-testing-runner --timeout=$TIMEOUT $tst \ 2>>$TEST_LOG 1>>$TEST_LOG retval=$? read pass fail << EOF `count_case_result $retval $pass $fail` EOF done child_pass=`grep '^PASS:' $TEST_LOG | wc -l` child_fail=`grep '^FAIL:' $TEST_LOG | wc -l` if [ $child_pass -ne 0 ] || [ $child_fail -ne 0 ] ; then pass=$child_pass if [ $child_fail -ne 0 ] ; then fail=`expr $child_fail / 2` else fail=0 fi fi echo $pass $fail } run_test_suite() { pass=0 fail=0 export GTK_IM_MODULE=ibus export IBUS_COMPOSE_CACHE_DIR=$PWD if [ x"$TESTING_RUNNER" = x ] ; then TESTING_RUNNER="default" fi case $TESTING_RUNNER in default) # Get only the last value with do-while. read pass fail << EOF_RUNNER `run_direct_test_cases` EOF_RUNNER ;; gnome) read pass fail << EOF_RUNNER `run_gnome_desktop_testing_runner` EOF_RUNNER ;; esac echo "" print_log -e "${GREEN}PASS${NC}: $pass" print_log -e "${RED}FAIL${NC}: $fail" echo "" if [ $TEST_LOG_STDOUT -eq 1 ] ; then cat $TEST_LOG else echo "# See $TEST_LOG" fi } finit() { echo "# Killing left gnome-session and Xorg" kill $PID_GNOME_SESSION $PID_XORG ibus exit SUSER=`echo "$USER" | cut -c 1-7` LEFT_CALENDAR=`ps -ef | grep gnome-shell-calendar-server | grep $SUSER | grep -v grep` if [ x"$LEFT_CALENDAR" != x ] ; then echo "# Killing left gnome-shell-calendar-server" echo "$LEFT_CALENDAR" echo "$LEFT_CALENDAR" | awk '{print $2}' | xargs kill fi echo "# Finished $PROGNAME testing" } main() { parse_args "$@" init_desktop run_dbus_daemon 2>>$TEST_LOG 1>>$TEST_LOG run_desktop 2>>$TEST_LOG 1>>$TEST_LOG run_test_suite finit } # Need to enclose $@ with double quotes not to split the array. main "$@"