diff --git a/.travis.yml b/.travis.yml index a6c04d28c..100b3be42 100644 --- a/.travis.yml +++ b/.travis.yml @@ -74,6 +74,6 @@ jobs: --with-ucd-dir='/usr/share/unicode' --enable-install-tests " - DISABLE_GUI_TESTS="ibus-compose ibus-keypress test-stress" + DISABLE_GUI_TESTS="ibus-compose ibus-keypress test-stress xkb-latin-layouts" VERBOSE=1 DESTDIR="$HOME/build/$USER/dest" diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am index f932f18f9..ca5285bd4 100644 --- a/src/tests/Makefile.am +++ b/src/tests/Makefile.am @@ -41,8 +41,9 @@ prog_ldadd =\ $(top_builddir)/src/libibus-@IBUS_API_VERSION@.la \ $(NULL) -noinst_PROGRAMS = $(TESTS) -TESTS = \ +noinst_PROGRAMS = $(TESTS_C) +noinst_SCRIPTS = $(TESTS_SCRIPT) +TESTS_C = \ ibus-bus \ ibus-config \ ibus-configservice \ @@ -56,16 +57,25 @@ TESTS = \ ibus-util \ $(NULL) +TESTS_SCRIPT = \ + xkb-latin-layouts \ + $(NULL) + +TESTS = \ + $(TESTS_C) \ + $(TESTS_SCRIPT) \ + $(NULL) + CLEANFILES = if ENABLE_ENGINE -TESTS += ibus-engine-switch +TESTS_C += ibus-engine-switch endif if ENABLE_GTK3 -TESTS += ibus-compose +TESTS_C += ibus-compose if ENABLE_XTEST -TESTS += ibus-keypress +TESTS_C += ibus-keypress endif endif @@ -99,9 +109,10 @@ CLEANFILES += \ org.freedesktop.IBus.Desktop.Testing.desktop \ $(NULL) -test_execs_PROGRAMS = $(TESTS) +test_execs_PROGRAMS = $(TESTS_C) +test_execs_SCRIPTS = $(TESTS_SCRIPT) if ENABLE_GTK3 -test_execs_SCRIPTS = ibus-compose-locales +test_execs_SCRIPTS += ibus-compose-locales CLEANFILES += \ ibus-compose-locales \ $(NULL) @@ -138,6 +149,7 @@ ibus-desktop-testing-runner: ibus-desktop-testing-runner.in EXTRA_DIST = \ $(test_metas_in) \ + $(TESTS_SCRIPT) \ runtest \ ibus-compose.emoji \ ibus-compose.env \ diff --git a/src/tests/runtest b/src/tests/runtest index a6e4194bf..a229140ae 100755 --- a/src/tests/runtest +++ b/src/tests/runtest @@ -35,6 +35,7 @@ ibus-engine-switch ibus-compose ibus-keypress test-stress +xkb-latin-layouts " IBUS_SCHEMA_FILE='org.freedesktop.ibus.gschema.xml' GTK_QUERY_MODULE=gtk-query-immodules-3.0-32 diff --git a/src/tests/xkb-latin-layouts b/src/tests/xkb-latin-layouts new file mode 100755 index 000000000..f8dced6b0 --- /dev/null +++ b/src/tests/xkb-latin-layouts @@ -0,0 +1,130 @@ +#!/bin/bash + +PROGNAME=`basename $0` +VERSION=0.1 +# POSIX sh has no 'echo -e' +: ${ECHO:='/usr/bin/echo'} +TMPDIR= +INSTALLED_SCHEMAS_DIR= + + +usage() +{ + $ECHO -e \ +"This test runs setxkbmap command for gsettings xkb-latin-layouts value\n" \ +"$PROGNAME [OPTIONS…]\n" \ +"\n" \ +"OPTIONS:\n" \ +"-h, --help This help\n" \ +"-v, --version Show version\n" \ +"-D, --schemasdir=DIR Load the latest schema file in DIR\n" \ +"" +} + + +parse_args() +{ + # This is GNU getopt. "sudo port getopt" in BSD? + ARGS=`getopt -o hD:Tv --long \ + help,schemasdir:,tap,version\ + -- "$@"`; + eval set -- "$ARGS" + while [ 1 ] ; do + case "$1" in + -h | --help ) usage; exit 0;; + -D | --schemasdir ) INSTALLED_SCHEMAS_DIR="$2"; shift 2;; + -T | --tap ) shift;; # ignore the option + -v | --version ) $ECHO -e "$VERSION"; exit 0;; + -- ) shift; break;; + * ) shift;; + esac + done +} + + +init() +{ + set -e + + # gnome-continuous doesn't have a machine-id set, which + # breaks dbus-launch. There's dbus-run-session which is + # better, but not everyone has it yet. + export DBUS_FATAL_WARNINGS=0 + export TMPDIR=$(mktemp -d --tmpdir="$PWD") + export XDG_CONFIG_HOME="$TMPDIR/config" + export XDG_CACHE_HOME="$TMPDIR/cache" + export GSETTINGS_SCHEMA_DIR="$TMPDIR/schemas" + mkdir -p $XDG_CONFIG_HOME $XDG_CACHE_HOME $GSETTINGS_SCHEMA_DIR + + eval `dbus-launch --sh-syntax` + + trap 'rm -rf $TMPDIR; kill $DBUS_SESSION_BUS_PID; setxkbmap -layout us' ERR + + # in case that schema is not installed on the system + glib-compile-schemas --targetdir "$GSETTINGS_SCHEMA_DIR" "$INSTALLED_SCHEMAS_DIR" +} + + +finit() +{ + # dbus-launch and gsettings run /usr/lib*/gvfsd-fuse $TMPDIR/cache/gvfs -f + # via systemd since gvfs 1.45.90 in Fedora 33 + # and rm $TMPDIR could be failed until umount would be called. + if [ -d $TMPDIR/cache/gvfs ] ; then + umount $TMPDIR/cache/gvfs + fi + rm -rf $TMPDIR + + kill $DBUS_SESSION_BUS_PID + exit 0 +} + + +test_xkb_keymaps() +{ + # Loop over top level schemas since "gsettings list-recursively" only + # looks for direct children. + xkb_latin_layouts=`gsettings get org.freedesktop.ibus.general xkb-latin-layouts` + while read keymap ; do + eval keymap="$keymap" + HAS_VARIANT=$($ECHO "$keymap" | grep '(' 2> /dev/null) ||: + if [ "x$HAS_VARIANT" != "x" ] ; then + layout=$($ECHO "$keymap" | sed -e 's/\([^(]*\)([^)]*)/\1/') + variant=$($ECHO "$keymap" | sed -e 's/[^(]*(\([^)]*\))/\1/') + $ECHO setxkbmap -layout $layout -variant $variant + setxkbmap -layout $layout -variant $variant + else + layout="$keymap" + $ECHO setxkbmap -layout $layout + setxkbmap -layout $layout + fi + if [ $? -ne 0 ] ; then + $ECHO "Error in layout $layout variant $variant" + setxkbmap -layout us + exit 1 + fi + done << EOF_READ_XKB + `$ECHO $xkb_latin_layouts | sed -e 's/^\[//' -e 's/\]$//' | tr "," "\n"` +EOF_READ_XKB + + setxkbmap -layout us +} + + +main() +{ + parse_args "$@" + + if [ x"$INSTALLED_SCHEMAS_DIR" != x ] ; then + init + fi + + test_xkb_keymaps + + if [ x"$INSTALLED_SCHEMAS_DIR" != x ] ; then + finit + fi +} + + +main "$@"