test: add a keysym tester

A simple script that creates a new layout with the given keysym replacing TLDE.
Then we compile a keymap and search for the keysym being assigned to TLDE and
bail if that fails.

The list of keysyms is manually maintained but we only need to add one or two to
spot-check whenever the xorgproto is updated.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
master
Peter Hutterer 2021-02-22 12:54:15 +10:00 committed by Ran Benita
parent b4802b0642
commit 0abd430e85
2 changed files with 92 additions and 5 deletions

View File

@ -389,11 +389,11 @@ if build_tools
dependencies: tools_dep, install: true)
install_man('tools/xkbcli.1')
executable('xkbcli-compile-keymap',
'tools/compile-keymap.c',
dependencies: tools_dep,
install: true,
install_dir: dir_libexec)
xkbcli_compile_keymap = executable('xkbcli-compile-keymap',
'tools/compile-keymap.c',
dependencies: tools_dep,
install: true,
install_dir: dir_libexec)
install_man('tools/xkbcli-compile-keymap.1')
# The same tool again, but with access to some private APIs.
executable('compile-keymap',
@ -657,6 +657,22 @@ if build_tools
find_program('test/tool-option-parsing.py'),
env: test_env,
suite: ['python-tests'])
# A set of keysyms to test for. Add one or two symbols to this array
# whenever the xorgproto gets updated to make sure we resolve them.
keysyms_to_test = [
'XF86Macro23',
]
env = environment()
env.set('XKB_CONFIG_ROOT', meson.source_root()/'test'/'data')
foreach keysym: keysyms_to_test
test('keysym-test-@0@'.format(keysym),
find_program('test/test-keysym.py'),
env: env,
args: [keysym, '--tool', xkbcli_compile_keymap],
suite: ['python-tests'])
endforeach
endif
valgrind = find_program('valgrind', required: false)

71
test/test-keysym.py Executable file
View File

@ -0,0 +1,71 @@
#!/usr/bin/env python3
#
# This script creates a custom layout, overriding the TDLE key with the first
# argument given.
import argparse
import tempfile
from pathlib import Path
import subprocess
import os
import re
import sys
# Template to force our key to TLDE
template = """
default
xkb_symbols "basic" {{
include "us(basic)"
replace key <TLDE> {{ [ {} ] }};
}};
"""
parser = argparse.ArgumentParser(
description='Tool to verify whether a keysym is resolved'
)
parser.add_argument('keysym', type=str, help='XKB keysym')
parser.add_argument('--tool', type=str, nargs=1,
default=['xkbcli', 'compile-keymap'],
help='Full path to the xkbcli-compile-keymap tool')
args = parser.parse_args()
with tempfile.TemporaryDirectory() as tmpdir:
symfile = Path(tmpdir) / "symbols" / "keytest"
symfile.parent.mkdir()
with symfile.open(mode='w') as f:
f.write(template.format(args.keysym))
try:
cmd = [
*args.tool,
'--layout', 'keytest',
]
env = os.environ.copy()
env['XKB_CONFIG_EXTRA_PATH'] = tmpdir
result = subprocess.run(cmd, env=env, capture_output=True,
universal_newlines=True)
if result.returncode != 0:
print('ERROR: Failed to compile:')
print(result.stderr)
sys.exit(1)
# grep for TLDE actually being remapped
for l in result.stdout.split('\n'):
match = re.match(r'\s+key \<TLDE\>\s+{\s+\[\s+(?P<keysym>\w+)\s+\]\s+}', l)
if match:
if args.keysym == match.group('keysym'):
sys.exit(0)
elif match.group('keysym') == 'NoSymbol':
print('ERROR: key {} not resolved:'.format(args.keysym), l)
else:
print('ERROR: key {} mapped to wrong key:'.format(args.keysym), l)
sys.exit(1)
print(result.stdout)
print('ERROR: above keymap is missing key mapping for {}'.format(args.keysym))
sys.exit(1)
except FileNotFoundError as err:
print('ERROR: invalid or missing tool: {}'.format(err))
sys.exit(1)