Files
netbird/client/vnc/server/input_uinput_keymap_linux_test.go
T

63 lines
2.1 KiB
Go

//go:build linux
package server
import (
"testing"
"github.com/stretchr/testify/assert"
)
// KDGKBENT values come in two encodings: a type byte with a Latin-1 character
// below it, or a Unicode code point XOR 0xf000. Anything that is not a
// character (function keys, modifiers, holes) must not map to one.
func TestConsoleKeymapRune(t *testing.T) {
tests := []struct {
name string
value uint16
want rune
wantOK bool
}{
{"latin a", 0x0061, 'a', true},
{"letter a (caps-lock aware)", 0x0b61, 'a', true},
{"unicode e-acute", 0x00e9 ^ 0xf000, 'é', true},
{"unicode euro", 0x20ac ^ 0xf000, '€', true},
{"unicode y-umlaut", 0x00ff ^ 0xf000, 'ÿ', true},
{"function key", 0x0100, 0, false},
{"braille type is not unicode", 0x0e01, 0, false},
{"hole", 0x0200, 0, false},
{"control char", 0x0009, 0, false},
{"delete", 0x007f, 0, false},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
got, ok := consoleKeymapRune(tc.value)
assert.Equal(t, tc.wantOK, ok, "decodes to a character")
if tc.wantOK {
assert.Equal(t, tc.want, got, "decoded character")
}
})
}
}
// On a German console 'y' and 'z' swap places. The keysym table has to follow
// the console, or every z typed remotely comes out as a y.
func TestOverlayConsoleKeymap_FollowsLayout(t *testing.T) {
const keyY, keyZ = 21, 44
table := map[uint32]uint16{'y': keyY, 'z': keyZ, 0xff0d: keyEnter}
german := map[rune]consoleKey{'z': {code: keyY}, 'y': {code: keyZ}, 'Z': {code: keyY, shift: true}}
got := overlayConsoleKeymap(table, german)
assert.Equal(t, uint16(keyY), got['z'], "z is on the US y key on a German layout")
assert.Equal(t, uint16(keyZ), got['y'], "y is on the US z key on a German layout")
assert.Equal(t, uint16(keyY), got['Z'], "uppercase follows its key; the client sends Shift itself")
assert.Equal(t, uint16(keyEnter), got[0xff0d], "non-character keysyms are left alone")
}
// Without a console keymap the US table stands.
func TestOverlayConsoleKeymap_NilKeepsTable(t *testing.T) {
table := map[uint32]uint16{'y': 21}
assert.Equal(t, uint16(21), overlayConsoleKeymap(table, nil)['y'])
}