1*ffb85d5cSBenjamin Tissoires#!/bin/env python3
2*ffb85d5cSBenjamin Tissoires# SPDX-License-Identifier: GPL-2.0
3*ffb85d5cSBenjamin Tissoires# -*- coding: utf-8 -*-
4*ffb85d5cSBenjamin Tissoires#
5*ffb85d5cSBenjamin Tissoires# Copyright (c) 2017 Benjamin Tissoires <benjamin.tissoires@gmail.com>
6*ffb85d5cSBenjamin Tissoires# Copyright (c) 2017 Red Hat, Inc.
7*ffb85d5cSBenjamin Tissoires#
8*ffb85d5cSBenjamin Tissoires# This program is free software: you can redistribute it and/or modify
9*ffb85d5cSBenjamin Tissoires# it under the terms of the GNU General Public License as published by
10*ffb85d5cSBenjamin Tissoires# the Free Software Foundation; either version 2 of the License, or
11*ffb85d5cSBenjamin Tissoires# (at your option) any later version.
12*ffb85d5cSBenjamin Tissoires#
13*ffb85d5cSBenjamin Tissoires# This program is distributed in the hope that it will be useful,
14*ffb85d5cSBenjamin Tissoires# but WITHOUT ANY WARRANTY; without even the implied warranty of
15*ffb85d5cSBenjamin Tissoires# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*ffb85d5cSBenjamin Tissoires# GNU General Public License for more details.
17*ffb85d5cSBenjamin Tissoires#
18*ffb85d5cSBenjamin Tissoires# You should have received a copy of the GNU General Public License
19*ffb85d5cSBenjamin Tissoires# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20*ffb85d5cSBenjamin Tissoires#
21*ffb85d5cSBenjamin Tissoires
22*ffb85d5cSBenjamin Tissoires# This is for generic devices
23*ffb85d5cSBenjamin Tissoires
24*ffb85d5cSBenjamin Tissoiresfrom . import base
25*ffb85d5cSBenjamin Tissoiresimport logging
26*ffb85d5cSBenjamin Tissoires
27*ffb85d5cSBenjamin Tissoireslogger = logging.getLogger("hidtools.test.hid")
28*ffb85d5cSBenjamin Tissoires
29*ffb85d5cSBenjamin Tissoires
30*ffb85d5cSBenjamin Tissoiresclass TestCollectionOverflow(base.BaseTestCase.TestUhid):
31*ffb85d5cSBenjamin Tissoires    """
32*ffb85d5cSBenjamin Tissoires    Test class to test re-allocation of the HID collection stack in
33*ffb85d5cSBenjamin Tissoires    hid-core.c.
34*ffb85d5cSBenjamin Tissoires    """
35*ffb85d5cSBenjamin Tissoires
36*ffb85d5cSBenjamin Tissoires    def create_device(self):
37*ffb85d5cSBenjamin Tissoires        # fmt: off
38*ffb85d5cSBenjamin Tissoires        report_descriptor = [
39*ffb85d5cSBenjamin Tissoires            0x05, 0x01,         # .Usage Page (Generic Desktop)
40*ffb85d5cSBenjamin Tissoires            0x09, 0x02,         # .Usage (Mouse)
41*ffb85d5cSBenjamin Tissoires            0xa1, 0x01,         # .Collection (Application)
42*ffb85d5cSBenjamin Tissoires            0x09, 0x02,         # ..Usage (Mouse)
43*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ..Collection (Logical)
44*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # ...Usage (Pointer)
45*ffb85d5cSBenjamin Tissoires            0xa1, 0x00,         # ...Collection (Physical)
46*ffb85d5cSBenjamin Tissoires            0x05, 0x09,         # ....Usage Page (Button)
47*ffb85d5cSBenjamin Tissoires            0x19, 0x01,         # ....Usage Minimum (1)
48*ffb85d5cSBenjamin Tissoires            0x29, 0x03,         # ....Usage Maximum (3)
49*ffb85d5cSBenjamin Tissoires            0x15, 0x00,         # ....Logical Minimum (0)
50*ffb85d5cSBenjamin Tissoires            0x25, 0x01,         # ....Logical Maximum (1)
51*ffb85d5cSBenjamin Tissoires            0x75, 0x01,         # ....Report Size (1)
52*ffb85d5cSBenjamin Tissoires            0x95, 0x03,         # ....Report Count (3)
53*ffb85d5cSBenjamin Tissoires            0x81, 0x02,         # ....Input (Data,Var,Abs)
54*ffb85d5cSBenjamin Tissoires            0x75, 0x05,         # ....Report Size (5)
55*ffb85d5cSBenjamin Tissoires            0x95, 0x01,         # ....Report Count (1)
56*ffb85d5cSBenjamin Tissoires            0x81, 0x03,         # ....Input (Cnst,Var,Abs)
57*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
58*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
59*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
60*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
61*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
62*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
63*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
64*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
65*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
66*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
67*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
68*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
69*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
70*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
71*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
72*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
73*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
74*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
75*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
76*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
77*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
78*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
79*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
80*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
81*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
82*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
83*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
84*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
85*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
86*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
87*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
88*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
89*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ....Collection (Logical)
90*ffb85d5cSBenjamin Tissoires            0x09, 0x01,         # .....Usage (Pointer)
91*ffb85d5cSBenjamin Tissoires            0x05, 0x01,         # .....Usage Page (Generic Desktop)
92*ffb85d5cSBenjamin Tissoires            0x09, 0x30,         # .....Usage (X)
93*ffb85d5cSBenjamin Tissoires            0x09, 0x31,         # .....Usage (Y)
94*ffb85d5cSBenjamin Tissoires            0x15, 0x81,         # .....Logical Minimum (-127)
95*ffb85d5cSBenjamin Tissoires            0x25, 0x7f,         # .....Logical Maximum (127)
96*ffb85d5cSBenjamin Tissoires            0x75, 0x08,         # .....Report Size (8)
97*ffb85d5cSBenjamin Tissoires            0x95, 0x02,         # .....Report Count (2)
98*ffb85d5cSBenjamin Tissoires            0x81, 0x06,         # .....Input (Data,Var,Rel)
99*ffb85d5cSBenjamin Tissoires            0xa1, 0x02,         # ...Collection (Logical)
100*ffb85d5cSBenjamin Tissoires            0x85, 0x12,         # ....Report ID (18)
101*ffb85d5cSBenjamin Tissoires            0x09, 0x48,         # ....Usage (Resolution Multiplier)
102*ffb85d5cSBenjamin Tissoires            0x95, 0x01,         # ....Report Count (1)
103*ffb85d5cSBenjamin Tissoires            0x75, 0x02,         # ....Report Size (2)
104*ffb85d5cSBenjamin Tissoires            0x15, 0x00,         # ....Logical Minimum (0)
105*ffb85d5cSBenjamin Tissoires            0x25, 0x01,         # ....Logical Maximum (1)
106*ffb85d5cSBenjamin Tissoires            0x35, 0x01,         # ....Physical Minimum (1)
107*ffb85d5cSBenjamin Tissoires            0x45, 0x0c,         # ....Physical Maximum (12)
108*ffb85d5cSBenjamin Tissoires            0xb1, 0x02,         # ....Feature (Data,Var,Abs)
109*ffb85d5cSBenjamin Tissoires            0x85, 0x1a,         # ....Report ID (26)
110*ffb85d5cSBenjamin Tissoires            0x09, 0x38,         # ....Usage (Wheel)
111*ffb85d5cSBenjamin Tissoires            0x35, 0x00,         # ....Physical Minimum (0)
112*ffb85d5cSBenjamin Tissoires            0x45, 0x00,         # ....Physical Maximum (0)
113*ffb85d5cSBenjamin Tissoires            0x95, 0x01,         # ....Report Count (1)
114*ffb85d5cSBenjamin Tissoires            0x75, 0x10,         # ....Report Size (16)
115*ffb85d5cSBenjamin Tissoires            0x16, 0x01, 0x80,   # ....Logical Minimum (-32767)
116*ffb85d5cSBenjamin Tissoires            0x26, 0xff, 0x7f,   # ....Logical Maximum (32767)
117*ffb85d5cSBenjamin Tissoires            0x81, 0x06,         # ....Input (Data,Var,Rel)
118*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
119*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
120*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
121*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
122*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
123*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
124*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
125*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
126*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
127*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
128*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
129*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
130*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
131*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
132*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
133*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
134*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
135*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
136*ffb85d5cSBenjamin Tissoires            0xc0,               # ...End Collection
137*ffb85d5cSBenjamin Tissoires            0xc0,               # ..End Collection
138*ffb85d5cSBenjamin Tissoires            0xc0,               # .End Collection
139*ffb85d5cSBenjamin Tissoires        ]
140*ffb85d5cSBenjamin Tissoires        # fmt: on
141*ffb85d5cSBenjamin Tissoires        return base.UHIDTestDevice(
142*ffb85d5cSBenjamin Tissoires            name=None, rdesc=report_descriptor, application="Mouse"
143*ffb85d5cSBenjamin Tissoires        )
144*ffb85d5cSBenjamin Tissoires
145*ffb85d5cSBenjamin Tissoires    def test_rdesc(self):
146*ffb85d5cSBenjamin Tissoires        """
147*ffb85d5cSBenjamin Tissoires        This test can only check for negatives. If the kernel crashes, you
148*ffb85d5cSBenjamin Tissoires        know why. If this test passes, either the bug isn't present or just
149*ffb85d5cSBenjamin Tissoires        didn't get triggered. No way to know.
150*ffb85d5cSBenjamin Tissoires
151*ffb85d5cSBenjamin Tissoires        For an explanation, see kernel patch
152*ffb85d5cSBenjamin Tissoires            HID: core: replace the collection tree pointers with indices
153*ffb85d5cSBenjamin Tissoires        """
154*ffb85d5cSBenjamin Tissoires        pass
155