---
 tools/libinput-record-json-verify.py | 88 ++++++++++++++++++++++++++++++++++++
 1 file changed, 88 insertions(+)
 create mode 100755 tools/libinput-record-json-verify.py

diff --git a/tools/libinput-record-json-verify.py 
b/tools/libinput-record-json-verify.py
new file mode 100755
index 00000000..0ecba215
--- /dev/null
+++ b/tools/libinput-record-json-verify.py
@@ -0,0 +1,88 @@
+#!/usr/bin/env python3
+
+import json
+import sys
+
+def verify_json_format_1(json):
+       assert json['version'] == 1
+       assert json['ndevices'] >= 1
+       assert 'system' in json
+
+       system = json['system']
+       assert system['libinput']
+       assert system['kernel']
+       assert system['dmi']
+
+       assert 'devices' in json 
+       devices = json['devices']
+
+       assert len(devices) == json['ndevices']
+       for d in json['devices']:
+               assert 'evdev' in d
+               evdev = d['evdev']
+
+               assert evdev['name']
+               assert len(evdev['id']) == 4
+               for i in evdev['id']:
+                       assert i >= 0
+
+               # bus, vid, pid should not be 0 on recorded devices
+               assert evdev['id'][0] != 0 # bus type
+               assert evdev['id'][1] != 0 # vendor id
+               assert evdev['id'][2] != 0 # product id
+
+               # All EV_SYN bits are always set
+               assert evdev['syn'] == list(range(0, 16))
+
+               if 'key' in evdev:
+                       assert len(evdev['key']) > 0
+
+               if 'rel' in evdev:
+                       assert len(evdev['rel']) > 0
+
+               if 'abs' in evdev:
+                       assert len(evdev['abs']) > 0
+                       assert 'absinfo' in evdev
+
+                       for ai in evdev['absinfo']:
+                               # any abs entry must be in absinfo, and vice 
versa
+                               assert ai[0] in evdev['abs']
+                               # min < max
+                               assert ai[1] <= ai[2]
+                               assert len(ai) == 6
+
+                       # any abs entry must be in absinfo, and vice versa
+                       ai_codes = [ai[0] for ai in evdev['absinfo']]
+                       for code in evdev['abs']:
+                               assert code in ai_codes
+
+               assert 'key' in evdev or 'rel' in evdev or 'abs' in evdev
+
+               assert len(evdev['properties']) >= 0
+               for p in evdev['properties']:
+                       assert p >= 0 and p <= 6 # current max
+
+               assert 'events' in d
+               for frame in d['events']:
+                       assert 'evdev' in frame
+                       first_event = frame['evdev'][0]
+                       last_event = frame['evdev'][-1]
+                       for event in frame['evdev']:
+                               data = event['data']
+                               assert len(data) == 5
+                               # All timestamps within a frame are the same
+                               assert data[0:1] == first_event['data'][0:1]
+
+                       # SYN_REPORT
+                       assert last_event['data'][2] == 0
+                       assert last_event['data'][3] == 0
+                       assert last_event['data'][4] == 0
+
+
+def main(argv):
+       with open(argv[1]) as f:
+               verify_json_format_1(json.load(f))
+
+
+if __name__ == "__main__":
+       main(sys.argv)
-- 
2.14.3

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to