# BST-TIMEOUT: 900 # NOT MEASURED ON TARGET YET. The shape is two probe execs # # (full, then --pure), each of which compiles a pc105 # # us,de keymap out of xkeyboard-config's 6.8 MB database # # TWICE -- once from the rules and once from its own dumped # # text -- plus xkbcli-compile-keymap doing a third and # # xkbcli-list parsing a 247 KB registry, plus a shell fork # # per scored value. Natively the whole of that is under a # # second; at the 46-68x wall-clock factor this platform # # carries (linux-in-the-browser#117) it is minutes. The # # bound is deliberately a LOAD bound: it must fire when the # # guest is starved, not when the package regressed. . "$BST_LIB" # libxkbcommon 1.6.0 -- the keymap compiler that replaced the X server's own XKB # code. It compiles an RMLVO description, or a keymap file, into a keymap, and # maps a keycode plus a modifier state onto a keysym and onto Unicode. None of # that needs an X server, a Wayland compositor or an input device, which is why # a package whose name starts with `libxkb' is testable end to end on an image # that has no display at all: file in, structure out. # # WHAT THE EVIDENCE IS, AND WHY IT IS A DIFF RATHER THAN A LIST OF LITERALS. # # libxkbcommon_probe.c is built TWICE from one source -- once for wasm32-hwjs # against the static libxkbcommon.a this image installs, and once for the BUILD # HOST against libxkbcommon-native, pointed at xkeyboard-config-native's copy of # the same database. The build-host run's --pure output ships here as # libxkbcommon-probe.ref, and the target's --pure output must match it BYTE FOR # BYTE. Every group inside --pure is a statement about a keysym name table, a # Unicode mapping, or a keymap compiled out of architecture-independent data -- # none of which has any business differing between two architectures. # # THE KEYSYM NAME TABLE IS THE SHARPEST OF THOSE, for the reason libx11's port # records about its own: a table that lost entries still round-trips every name # it kept, so a suite built out of the fifteen names someone thought to type # would go green over the loss. KS-SWEEP visits 472 codepoints and counts how # many carry a REAL name -- one the table holds, not the numeric `0x...' # spelling xkb_keysym_get_name hands back for a keysym it does not know, which # is the trap that makes a naive sweep report 472 of 472 every time. # # THE KEYMAP TEXT IS THE OTHER ONE. KM-TEXT is a length and a digest over the # whole compiled keymap -- 70 KB of it -- so a difference in the compiler, in # the rules resolution, or in one byte of the shipped database moves it. It is # NOT re-derived here from a literal: the reference is the oracle. # # THE GROUPS DELIBERATELY OUTSIDE --pure are the ones where the two machines # must differ and agreement would be the defect: ABI (this arm is ILP32, the # reference host is LP64) and the XKB config root. They are pinned by hand # below instead. # # WHAT THE TOOLS ADD THAT THE PROBE CANNOT. xkbcli reaches the compiler and the # registry through a different code path -- a second binary, its own argument # parsing, and for `list' the whole xkbregistry half with libxml2 behind it. # Its keymap is compared against the probe's OWN dump rather than against a # fixture, so the case is "the tool and the library agree", which no literal # typed into this file could say. # # WHAT IS NOT COVERED, AND IS SAID SO RATHER THAN FAKED. xkbcli-interactive-evdev # opens /dev/input/event*, and there is no input device on this image; it is # asserted present and refusing, not driven. The Compose half # (xkb_compose_table_new_from_locale) is reached only through libx11-locale's # locale tree and is left to 99-libx11-locale.test, which owns that payload. PROBE=${BST_LIBXKBCOMMON_PROBE:-/usr/libexec/libxkbcommon-tests/libxkbcommon-probe} REF=${BST_LIBXKBCOMMON_REF:-/usr/libexec/libxkbcommon-tests/libxkbcommon-probe.ref} ARCHIVE=/usr/lib/libxkbcommon.a REGARCHIVE=/usr/lib/libxkbregistry.a PCFILE=/usr/lib/pkgconfig/xkbcommon.pc REGPC=/usr/lib/pkgconfig/xkbregistry.pc HDR=/usr/include/xkbcommon/xkbcommon.h XKBCLI=/usr/bin/xkbcli LIBEXEC=/usr/libexec/xkbcommon COMPL=/usr/share/bash-completion/completions/xkbcli MAN=/usr/share/man/man1 # The version the recipe pins. Asserted rather than read back, so a recipe # bumped without revisiting this suite is a red here instead of a silent change # of subject -- the reference is the oracle for THIS version only. WANT_VERSION=1.6.0 # The first BST result line of a suite is dropped by the guest console # (brintos/linux#96), consistently and every run. This case asserts something # already true so that what is lost is a line that costs nothing; remove it when # #96 lands. if [ -f "$ARCHIVE" ]; then bst_ok libxkbcommon/suite-canary else bst_notok libxkbcommon/suite-canary "$ARCHIVE is not a file"; fi if [ ! -f "$ARCHIVE" ]; then bst_skip libxkbcommon/present "libxkbcommon not installed on this image" exit 0 fi bst_ok libxkbcommon/present t=${TMPDIR:-/tmp}/bst-xkbcommon.$$ if ! mkdir -p "$t" 2>/dev/null; then bst_notok libxkbcommon/tmpdir "cannot create $t" exit 0 fi _num() { case "$1" in ''|*[!0-9]*) echo 0 ;; *) echo "$1" ;; esac; } # =========================================================================== # 1. the package is whole # =========================================================================== # # THE STATIC ARCHIVE IS THE ARTIFACT, NOT A .so, and that is this port's one # correction to its own ticket. libxkbcommon's meson.build declares the library # with library(), which follows meson's default_library and defaults to SHARED; # the recipe restates the distro's static rule in meson's spelling. The stock # recipe DOES link a libxkbcommon.so here -- so this is not "shared was # impossible", it is "shared has no reachable consumer on an image whose -lfoo # resolves only to libfoo.a". BRINTOS-2015's description, written before # anything was built, promised a probe linked against the .so; the probe links # the archive. check libxkbcommon/staticlib test -s "$ARCHIVE" check libxkbcommon/staticlib-reg test -s "$REGARCHIVE" check libxkbcommon/pkgconfig test -s "$PCFILE" check libxkbcommon/pkgconfig-reg test -s "$REGPC" check libxkbcommon/hdr-main test -s "$HDR" check libxkbcommon/hdr-keysyms test -s /usr/include/xkbcommon/xkbcommon-keysyms.h check libxkbcommon/hdr-names test -s /usr/include/xkbcommon/xkbcommon-names.h check libxkbcommon/hdr-compose test -s /usr/include/xkbcommon/xkbcommon-compose.h check libxkbcommon/hdr-compat test -s /usr/include/xkbcommon/xkbcommon-compat.h check libxkbcommon/hdr-registry test -s /usr/include/xkbcommon/xkbregistry.h # Shape, not absence: this arm converts recipes to shared libraries one at a # time (BRINTOS-1740), so a .so here would be a conversion rather than a policy # breach -- what must never appear is a dangling or empty one. bst_lib_shape libxkbcommon/lib-shape "/usr/lib/libxkbcommon.so*" "/usr/lib/libxkbregistry.so*" pcver=$(sed -n 's/^Version: *//p' "$PCFILE" 2>/dev/null | head -1) check_eq libxkbcommon/pkgconfig-version "$WANT_VERSION" "$pcver" # xkbregistry.pc must still declare libxml2: a consumer linking the registry # half statically gets libxml2 only if pkg-config tells it to. The token is # `libxml-2.0' -- pkg-config's module name, which does not contain `xml2'. if grep -q 'libxml-2\.0' "$REGPC" 2>/dev/null; then bst_ok libxkbcommon/pkgconfig-reg-libxml2 else bst_notok libxkbcommon/pkgconfig-reg-libxml2 "xkbregistry.pc names no libxml2 dependency, so a static consumer of the registry would not be told to link it" fi # The tools, each one its own case: they are separate binaries and a packaging # change that lost one would otherwise show up as a mystery in section 6. check libxkbcommon/tool-xkbcli test -x "$XKBCLI" check libxkbcommon/tool-compile test -x "$LIBEXEC/xkbcli-compile-keymap" check libxkbcommon/tool-list test -x "$LIBEXEC/xkbcli-list" check libxkbcommon/tool-how-to-type test -x "$LIBEXEC/xkbcli-how-to-type" check libxkbcommon/tool-interactive test -x "$LIBEXEC/xkbcli-interactive-evdev" check libxkbcommon/bash-completion test -s "$COMPL" check libxkbcommon/man-xkbcli test -s "$MAN/xkbcli.1" check libxkbcommon/man-compile test -s "$MAN/xkbcli-compile-keymap.1" check libxkbcommon/man-list test -s "$MAN/xkbcli-list.1" # THE TWO OPTIONAL TOOLS ARE BOTH BUILT SINCE BRINTOS-2246, and each is asserted # in the direction the distro picks. poky's PACKAGECONFIG is # `bb.utils.filter(DISTRO_FEATURES, "x11 wayland") + xkbregistry', and # DISTRO_FEATURES now carries both names -- so -Denable-x11=true builds # xkbcli-interactive-x11 (and pulls libxcb + xkeyboard-config into DEPENDS) and # -Denable-wayland=true builds xkbcli-interactive-wayland (wayland + # wayland-protocols). Both are asserted because either one moving means the # filter has stopped tracking the distro flags, which is a change to the image's # dependency set arriving without a recipe edit. # # Neither is DRIVEN, and for the same reason in two different shapes: the x11 # tool wants a running X server and the wayland tool wants a compositor, and this # image carries neither. Presence is what the filter decides and is therefore # what this suite may assert; whether either tool can RUN is a runtime question # these cases deliberately leave alone -- the same rule the evdev tool takes # above. # # The wayland half was `no-wayland-tool', asserting ABSENCE, until BRINTOS-2246 # put wayland on the DISTRO_FEATURES line. An assertion about what the build # configuration decides has to move when that configuration moves, or the suite # reports the deliberate change as a regression (BRINTOS-2373, BRINTOS-2375). check libxkbcommon/tool-interactive-x11 test -x "$LIBEXEC/xkbcli-interactive-x11" check libxkbcommon/tool-interactive-wayland test -x "$LIBEXEC/xkbcli-interactive-wayland" # ---- what the packaging says it needs -------------------------------------- # # ${PN} IS AN EMPTY PACKAGE ON THIS IMAGE and that is the static rule working, # not a packaging fault: poky sets FILES:${PN} = "" and fills it from # populate_packages, which splits ${libdir}/lib*.so.* into per-library packages # -- and a static build produces no .so.* at all. What ${PN} still carries is # the RDEPENDS on libx11-locale, which is what stops # xkb_compose_table_new_from_locale reporting `couldn't find a Compose file for # locale "C"'. poky writes that dependency as a bb.utils.contains on x11, so it # named libx11-compose-data before BRINTOS-2246 and names libx11-locale now. # The dependency is the whole reason the empty package is kept # (ALLOW_EMPTY), so it is asserted rather than assumed. if [ -r /var/lib/dpkg/status ]; then dep=$(awk '/^Package: libxkbcommon$/{f=1} f&&/^Depends: /{sub(/^Depends: /,""); print; exit} f&&/^$/{exit}' /var/lib/dpkg/status 2>/dev/null) check_eq libxkbcommon/depends-locale "libx11-locale" "$dep" for p in libxkbcommon libxkbcommon-tests libxkbcommon-dev libxkbcommon-staticdev xkbcli libxkbcommon-bash-completion; do if grep -qx "Package: $p" /var/lib/dpkg/status 2>/dev/null; then bst_ok "libxkbcommon/pkg-$p" else bst_notok "libxkbcommon/pkg-$p" "$p is not in the package database, so this image did not install it" fi done else bst_skip libxkbcommon/depends-locale "/var/lib/dpkg/status is not readable on this image" fi # =========================================================================== # 2. the probe runs # =========================================================================== check libxkbcommon/probe-installed test -x "$PROBE" check libxkbcommon/ref-installed test -s "$REF" pout=$t/probe.out bst_probe libxkbcommon/probe-runs "$pout" 600 "$PROBE" prc=$? # val -- the rest of the line whose first field is . Matches on # field 1 rather than taking the line by position, because the capture is 2>&1 # and the library writes its own diagnostics to stderr. val() { awk -v k="$1" '$1==k { $1=""; sub(/^ /,""); print; exit }' "$pout"; } # want -- score one probe value against a pinned answer. # A missing value is reported as the probe having stopped early rather than as # a mismatch against '', which is a different fault and localises elsewhere. want() { _got=$(val "$1") if [ -z "$_got" ]; then bst_notok "libxkbcommon/$2" "no value on target (probe stopped before $1); want='$3'" elif [ "$_got" = "$3" ]; then bst_ok "libxkbcommon/$2" else bst_notok "libxkbcommon/$2" "want:'$3' got:'$_got'" fi } if [ "$prc" -ne 0 ]; then bst_notok libxkbcommon/probe-complete "the probe did not finish (rc=$prc), so every CASE below is unscorable" elif grep -qx 'PROBE-END' "$pout" 2>/dev/null; then bst_ok libxkbcommon/probe-complete else bst_notok libxkbcommon/probe-complete "the probe exited 0 without printing PROBE-END, so its output is truncated and every CASE below is unscorable" fi want PV version "$WANT_VERSION" want CTX context-new "ok" # =========================================================================== # 3. the reference diff -- the pure groups # =========================================================================== # # One case per group rather than one per line: the pure output is 150 lines and # a per-line suite would drown the console in cases that all say the same thing. # Each group's case carries the FIRST differing line and the number of # differences, which is what a reader needs to localise it. if [ ! -s "$REF" ]; then bst_notok libxkbcommon/reference-present "$REF is missing or empty, so the target run has nothing to be compared to and every REF- case below is unscorable" else bst_ok libxkbcommon/reference-present ppure=$t/pure.out bst_probe libxkbcommon/probe-pure-runs "$ppure" 600 "$PROBE" --pure # The whole-file verdict first. A green here makes every per-group case below # redundant, which is the point: the groups exist to localise a red. if cmp -s "$ppure" "$REF" 2>/dev/null; then bst_ok libxkbcommon/reference-identical else _first=$(awk 'NR==FNR{r[FNR]=$0;next} {if($0!=r[FNR]){printf "line %d ref=[%s] got=[%s]", FNR, r[FNR], $0; exit}}' \ "$REF" "$ppure" 2>/dev/null) _nref=$(wc -l < "$REF" 2>/dev/null | tr -d ' ') _ngot=$(wc -l < "$ppure" 2>/dev/null | tr -d ' ') bst_notok libxkbcommon/reference-identical "target --pure differs from the build-host reference ($_ngot lines against $_nref): $(_bst_1line "$_first")" fi # grp -- compare just the lines carrying . grp() { _ga=$t/ga; _gb=$t/gb grep "^$2" "$REF" > "$_ga" 2>/dev/null grep "^$2" "$ppure" > "$_gb" 2>/dev/null _na=$(wc -l < "$_ga" | tr -d ' '); _nb=$(wc -l < "$_gb" | tr -d ' ') if [ "$(_num "$_na")" -eq 0 ]; then bst_notok "libxkbcommon/$1" "the reference carries no $2 lines at all, so this group is unmeasured" elif cmp -s "$_ga" "$_gb" 2>/dev/null; then bst_ok "libxkbcommon/$1" else _d=$(awk 'NR==FNR{r[FNR]=$0;next}{if($0!=r[FNR]){c++; if(c==1)f=sprintf("ref=[%s] got=[%s]",r[FNR],$0)}}END{printf "%d differing of %d: %s", c, FNR, f}' "$_ga" "$_gb" 2>/dev/null) bst_notok "libxkbcommon/$1" "$2 group: ref $_na lines, target $_nb -- $(_bst_1line "$_d")" fi rm -f "$_ga" "$_gb" } grp ref-ks-from "KS-FROM '" grp ref-ks-from-ci "KS-FROM-CI " grp ref-ks-name "KS-NAME " grp ref-ks-rt "KS-RT " grp ref-ks-sweep "KS-SWEEP " grp ref-utf32 "U32 " grp ref-utf8 "U8 " grp ref-ks-from-u32 "KS-FROM-U32 " grp ref-utf8-short "U8-SHORT " grp ref-keymap "KM-" grp ref-state "ST " grp ref-failures "FAIL-" # The keysym census, stated outright as well as diffed. A table that lost a # block shows up in the group diff as a wall of lines; this is the one number # that says how many keysyms this build's name table actually carries, and it # is the number to quote when the port is discussed. A FLOOR, not a pin: it # must fail when the table shrinks, and an upstream bump that adds names is # not a regression. _ks=$(sed -n 's/^KS-SWEEP total=[0-9]* named=\([0-9]*\) .*/\1/p' "$REF" | head -1) if [ "$(_num "$_ks")" -ge 330 ]; then bst_ok libxkbcommon/ksweep-census else bst_notok libxkbcommon/ksweep-census "the reference names only ${_ks:-0} keysyms across the swept ranges, which is too few for a complete name table" fi # The compiled keymap, stated as a size beside the digest the diff covers. A # keymap that compiled to a few hundred bytes is a rules resolution that found # almost nothing, and it would be a legitimate-looking KM-TEXT line. _kmlen=$(sed -n 's/^KM-TEXT len=\([0-9]*\) .*/\1/p' "$REF" | head -1) if [ "$(_num "$_kmlen")" -ge 40000 ]; then bst_ok libxkbcommon/keymap-size else bst_notok libxkbcommon/keymap-size "the reference's compiled keymap is only ${_kmlen:-0} bytes; a pc105 us,de keymap is tens of kilobytes, so the rules resolution found almost nothing" fi fi # =========================================================================== # 4. ABI -- ILP32, pinned by hand because the reference host must disagree # =========================================================================== # # xkb_keysym_t and xkb_mod_mask_t are uint32_t in xkbcommon.h, so those two are # 4 on BOTH machines and would be no evidence at all if they were the only ones # here. The pointer and the long are what this group is for. want ABI abi "ptr=4 long=4 keysym=4 modmask=4" # =========================================================================== # 5. the state machine, called out by name # =========================================================================== # # These lines are already inside the reference diff, so a red here is always # accompanied by a red in ref-state. They are named anyway because the diff # reports ONE first-differing line for the whole group and these are the four # mechanisms a consumer of this library actually depends on -- a reader looking # at "ST group: 3 differing of 17" should not have to reconstruct which. if [ -s "$REF" ]; then st() { _sref=$(awk -v k="$1" '$1=="ST" && $2==k { $1="";$2=""; sub(/^ /,""); print; exit }' "$REF") _sgot=$(awk -v k="$1" '$1=="ST" && $2==k { $1="";$2=""; sub(/^ /,""); print; exit }' "$pout") if [ -z "$_sref" ]; then bst_notok "libxkbcommon/$2" "the reference carries no ST $1 line, so this case is unmeasured" else check_eq "libxkbcommon/$2" "$_sref" "$_sgot" fi } # A shift level: the same key, one modifier, a different keysym. st shift-down-a state-shift # A LOCK IS NOT A SHIFT. Caps latches on the RELEASE and survives it, which is # the whole difference between the two and the case a state machine that # merely tracked "is the key down" would get wrong. st caps-locked-a state-caps-locked st caps-unlocked-a state-caps-released # Level three, through the lv3:ralt_switch option this keymap was compiled # with, on the layout that HAS a third level. st de-lv3-q state-level3 # The second layout, selected the way a compositor selects one. st de-z state-layout-switch st back-to-us-z state-layout-back fi # =========================================================================== # 6. the tools -- a second code path to the same compiler # =========================================================================== if [ ! -x "$XKBCLI" ]; then bst_skip libxkbcommon/xkbcli-version "xkbcli is not installed on this image" else check_out libxkbcommon/xkbcli-version "$WANT_VERSION" "$XKBCLI" --version # THE DISPATCHER IS ITS OWN QUESTION. xkbcli is a stub that execs # ${libexecdir}/xkbcommon/xkbcli-; a packaging change that moved the # libexec directory would leave every verb reporting `Command ... is not # available' while all five binaries were still on the image. Measured on the # build host, where /usr/libexec/xkbcommon does not exist: exactly that. check_rc libxkbcommon/xkbcli-dispatch 0 "$XKBCLI" compile-keymap --help fi # The tool's keymap against the PROBE'S OWN, not against a fixture: the case is # that the tool and the library agree, which no literal typed into this file # could say. The probe re-runs with --dump so both come from this boot. if [ -x "$LIBEXEC/xkbcli-compile-keymap" ] && [ -x "$PROBE" ]; then kmtool=$t/km-tool kmprobe=$t/km-probe "$PROBE" --dump "$kmprobe" > /dev/null 2>&1 "$LIBEXEC/xkbcli-compile-keymap" --model pc105 --layout us,de \ --options lv3:ralt_switch > "$kmtool" 2>$t/km-tool.err kmrc=$? if [ "$kmrc" -ne 0 ]; then bst_notok libxkbcommon/keymap-tool-runs "xkbcli-compile-keymap exited $kmrc: $(_bst_1line "$(head -n 1 $t/km-tool.err)")" else bst_ok libxkbcommon/keymap-tool-runs fi ntool=$(_num "$(wc -c < "$kmtool" 2>/dev/null | tr -d ' ')") nprobe=$(_num "$(wc -c < "$kmprobe" 2>/dev/null | tr -d ' ')") if [ "$nprobe" -eq 0 ]; then bst_notok libxkbcommon/keymap-tool-agrees "the probe wrote no keymap to $kmprobe, so there is nothing to compare the tool against" else # The tool appends ONE newline the library's own string does not carry -- # measured, 70349 bytes against 70348. Stated as its own case rather than # tolerated, so a tool that stopped appending it is visible. check_eq libxkbcommon/keymap-tool-len "$((nprobe + 1))" "$ntool" if cmp -s -n "$nprobe" "$kmtool" "$kmprobe" 2>/dev/null; then bst_ok libxkbcommon/keymap-tool-agrees else bst_notok libxkbcommon/keymap-tool-agrees "xkbcli-compile-keymap and the library compiled DIFFERENT keymaps from the same RMLVO names ($ntool bytes against $nprobe)" fi fi # THE FAILURE PATH IS A CASE, NOT AN ABSENCE. An unknown layout must fail with # a status, not abort: a tool that aborted here would leave the suite unable # to tell a refusal from a crash. Measured on the build host: rc=1. check_rc libxkbcommon/keymap-bad-layout 1 \ "$LIBEXEC/xkbcli-compile-keymap" --layout zznosuchlayout else bst_skip libxkbcommon/keymap-tool-agrees "xkbcli-compile-keymap or the probe is not installed" fi # ---- the registry half, which is the only place libxml2 is reached --------- if [ ! -x "$LIBEXEC/xkbcli-list" ]; then bst_skip libxkbcommon/list-runs "xkbcli-list is not installed on this image" else xl=$t/list.out "$LIBEXEC/xkbcli-list" > "$xl" 2>$t/list.err lrc=$? if [ "$lrc" -ne 0 ]; then bst_notok libxkbcommon/list-runs "xkbcli-list exited $lrc: $(_bst_1line "$(head -n 1 $t/list.err)")" else bst_ok libxkbcommon/list-runs fi # The counts are EXACT, not floors: the registry is xkeyboard-config 2.41's # own XML, the same bytes the build host parsed, and 57-xkeyboard-config # already establishes that the cross-built tree is byte-identical to the # native one. A count that moved would mean the parser read it differently, # which is the fault this section exists for. Measured on the build host # 2026-09-02 by RUNNING xkbcli-list from libxkbcommon-native against # xkeyboard-config-native -- not by counting the XML, which is what put 187 # against an unscoped `- name: ' grep in the first place. check libxkbcommon/list-has-models grep -qx "models:" "$xl" check libxkbcommon/list-has-layouts grep -qx "layouts:" "$xl" # Scoped to the models block: `- name: ' is also how xkbcli-list heads each # of the 21 option groups, so an unscoped count reports 208. check_eq libxkbcommon/list-models 187 "$(_num "$(sed -n '/^models:$/,/^layouts:$/p' "$xl" 2>/dev/null | grep -c '^- name: ' | tr -d ' ')")" check_eq libxkbcommon/list-layouts 588 "$(_num "$(grep -c '^- layout: ' "$xl" 2>/dev/null | tr -d ' ')")" check_eq libxkbcommon/list-options 198 "$(_num "$(grep -c "^ - name: '" "$xl" 2>/dev/null | tr -d ' ')")" # The two layouts the probe compiles with, named directly: a registry that # enumerated 588 entries without them would still pass every count above. check_eq libxkbcommon/list-layout-us 29 "$(_num "$(grep -c "^- layout: 'us'\$" "$xl" 2>/dev/null | tr -d ' ')")" check_eq libxkbcommon/list-layout-de 20 "$(_num "$(grep -c "^- layout: 'de'\$" "$xl" 2>/dev/null | tr -d ' ')")" fi # ---- how-to-type: the keymap read backwards -------------------------------- # # The one tool that asks the opposite question -- given a keysym, which key and # which modifiers produce it -- so it exercises the level and modifier tables # rather than the compiler. On `de', U+0040 is AltGr+Q, which is the same fact # the probe's de-lv3-q case measures through the state machine. if [ -x "$LIBEXEC/xkbcli-how-to-type" ]; then check_out libxkbcommon/how-to-type-de "AD01" \ "$LIBEXEC/xkbcli-how-to-type" --layout de 0x40 else bst_skip libxkbcommon/how-to-type-de "xkbcli-how-to-type is not installed on this image" fi # ---- the evdev tool is present and refuses, which is the right answer ------- # # There is no input device on this image, so it is asserted PRESENT and not # driven. Running it against a device that is not there would hang on a read, # which is how a suite wedges a guest and takes its siblings' results with it. check libxkbcommon/evdev-tool-present test -x "$LIBEXEC/xkbcli-interactive-evdev" # ---- the completion script is a script, not a stub ------------------------- if [ -s "$COMPL" ]; then check libxkbcommon/completion-registers grep -q 'complete .*xkbcli' "$COMPL" else bst_notok libxkbcommon/completion-registers "$COMPL is missing or empty" fi rm -rf "$t"